pax_global_header00006660000000000000000000000064151142314450014512gustar00rootroot0000000000000052 comment=5fef6fa0624f1e20ccf55510e32f1190c13904cd python-asciimatics-1.15.0/000077500000000000000000000000001511423144500154065ustar00rootroot00000000000000python-asciimatics-1.15.0/.coveragerc000066400000000000000000000000341511423144500175240ustar00rootroot00000000000000[run] relative_files = True python-asciimatics-1.15.0/.github/000077500000000000000000000000001511423144500167465ustar00rootroot00000000000000python-asciimatics-1.15.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001511423144500211315ustar00rootroot00000000000000python-asciimatics-1.15.0/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000015361511423144500236300ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior. This could be some simple steps in the provided samples, or a minimum, complete verifiable example of your own. See https://stackoverflow.com/help/mcve for details. **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots or cut and paste the erroneous text to help explain your problem. **System details (please complete the following information):** - OS and version: [e.g. Windows 10] - Python version: [e.g. 3.9.6] - Python distribution: [e.g. CPython, pypy, anaconda, etc.] - Asciimatics version [e.g. 1.9.0] **Additional context** Add any other context about the problem here. python-asciimatics-1.15.0/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000010731511423144500246570ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. For example: "I'm always frustrated when [...]" **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. python-asciimatics-1.15.0/.github/stale.yml000066400000000000000000000012661511423144500206060ustar00rootroot00000000000000# Number of days of inactivity before an issue becomes stale daysUntilStale: 60 # Number of days of inactivity before a stale issue is closed daysUntilClose: 7 # Issues with these labels will never be considered stale exemptLabels: - enhancement - Documentation # Label to use when marking an issue as stale staleLabel: wontfix # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. # Comment to post when closing a stale issue. Set to `false` to disable closeComment: false python-asciimatics-1.15.0/.github/workflows/000077500000000000000000000000001511423144500210035ustar00rootroot00000000000000python-asciimatics-1.15.0/.github/workflows/test.yml000066400000000000000000000113161511423144500225070ustar00rootroot00000000000000name: test on: - push - pull_request jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: [3.10.11, 3.11.3, pypy3.9] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements/dev.txt - name: Test env: FORCE_TTY: Y TERM: xterm-256color run: | coverage run --source=asciimatics -m unittest - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} testwindows: runs-on: windows-latest strategy: matrix: python-version: [3.8] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements/dev.txt pip install pywin32 - name: Test shell: cmd run: | coverage run --source=asciimatics -m unittest - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v3 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} builddist: name: Build distribution 📦 runs-on: ubuntu-latest needs: [test, testwindows] if: github.event_name != 'pull_request' steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.x" - name: Get history and tags for SCM versioning to work run: | git fetch --prune --unshallow git fetch --depth=1 origin +refs/tags/*:refs/tags/* - name: Install pypa/build run: >- python3 -m pip install build --user - name: Build a binary wheel and a source tarball run: python3 -m build - name: Store the distribution packages uses: actions/upload-artifact@v3 with: name: python-package-distributions path: dist/ publish-test: runs-on: ubuntu-latest needs: builddist if: github.event_name != 'pull_request' environment: name: testpypi url: https://test.pypi.org/p/asciimatics permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download all the dists uses: actions/download-artifact@v3 with: name: python-package-distributions path: dist/ - name: Publish distribution 📦 to TestPyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/ publish-to-pypi: name: >- Publish Python 🐍 distribution 📦 to PyPI if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') needs: - builddist runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/asciimatics permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download all the dists uses: actions/download-artifact@v3 with: name: python-package-distributions path: dist/ - name: Publish distribution 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 github-release: name: >- Sign the Python 🐍 distribution 📦 with Sigstore and upload them to GitHub Release needs: - publish-to-pypi runs-on: ubuntu-latest permissions: contents: write # IMPORTANT: mandatory for making GitHub Releases id-token: write # IMPORTANT: mandatory for sigstore steps: - name: Download all the dists uses: actions/download-artifact@v3 with: name: python-package-distributions path: dist/ - name: Sign the dists with Sigstore uses: sigstore/gh-action-sigstore-python@v1.2.3 with: inputs: >- ./dist/*.tar.gz ./dist/*.whl - name: Create GitHub Release run: >- gh release create '${{ github.ref_name }}' --title "${{ github.ref_name }}" --notes "" - name: Upload artifact signatures to GitHub Release env: GITHUB_TOKEN: ${{ github.token }} # Upload to GitHub Release using the `gh` CLI. # `dist/` contains the built packages, and the # sigstore-produced signatures and certificates. run: >- gh release upload '${{ github.ref_name }}' dist/** --repo '${{ github.repository }}' python-asciimatics-1.15.0/.gitignore000066400000000000000000000010501511423144500173720ustar00rootroot00000000000000# Backup files *.~ *.swp # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging bin/ build/ develop-eggs/ dist/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg MANIFEST venv/ # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo # Sphinx documentation docs/_build/ # IDE .idea/ # setuptools_scm-generated file asciimatics/version.py # Log files *.log python-asciimatics-1.15.0/.landscape.yml000066400000000000000000000017641511423144500201510ustar00rootroot00000000000000doc-warnings: yes test-warnings: no strictness: high max-line-length: 110 autodetect: yes ignore-paths: # Ignore code that's not in the delivered - doc - tests - samples # Ignore build files - coverage_fix.py - version.py python-targets: - 3 pylint: options: max-bool-expr: 6 max-nested-blocks: 6 disable: # Need many attributes on widgets - too-many-arguments - too-many-locals - too-many-instance-attributes - invalid-name # Need conditional imports for Windows/Linux - wrong-import-order - import-error # Use pep257 to handle docstring issues - missing-docstring # Complexity isn't as bad as the metrics think - but stuff for v2.0 - too-many-lines - too-many-branches - too-many-statements # Don't agree with these styles - no-else-return - len-as-condition mccabe: run: false pep257: disable: - D102 - D200 - D203 - D205 - D212 - D400 - D401 - D404 - D415 python-asciimatics-1.15.0/.pylintrc000066400000000000000000000520321511423144500172550ustar00rootroot00000000000000[MAIN] # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no # Clear in-memory caches upon conclusion of linting. Useful if running pylint # in a server-like mode. clear-cache-post-run=no # Load and enable all available extensions. Use --list-extensions to see a list # all available extensions. #enable-all-extensions= # In error mode, messages with a category besides ERROR or FATAL are # suppressed, and no reports are done by default. Error mode is compatible with # disabling specific errors. #errors-only= # Always return a 0 (non-error) status code, even if lint errors are found. # This is primarily useful in continuous integration scripts. #exit-zero= # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. extension-pkg-allow-list= # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. (This is an alternative name to extension-pkg-allow-list # for backward compatibility.) extension-pkg-whitelist= # Return non-zero exit code if any of these messages/categories are detected, # even if score is above --fail-under value. Syntax same as enable. Messages # specified are enabled, while categories only check already-enabled messages. fail-on= # Specify a score threshold under which the program will exit with error. fail-under=10 # Interpret the stdin as a python script, whose filename needs to be passed as # the module_or_package argument. #from-stdin= # Files or directories to be skipped. They should be base names, not paths. ignore=CVS # Add files or directories matching the regular expressions patterns to the # ignore-list. The regex matches against paths and can be in Posix or Windows # format. Because '\\' represents the directory delimiter on Windows systems, # it can't be used as an escape character. ignore-paths= # Files or directories matching the regular expression patterns are skipped. # The regex matches against base names, not paths. The default value ignores # Emacs file locks ignore-patterns=^\.# # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis). It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the # number of processors available to use, and will cap the count on Windows to # avoid hangs. jobs=1 # Control the amount of potential inferred values when inferring a single # object. This can help the performance when dealing with large functions or # complex, nested conditions. limit-inference-results=100 # List of plugins (as comma separated values of python module names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes # Minimum Python version to use for version dependent checks. Will default to # the version used to run pylint. py-version=3.11 # Discover python modules and packages in the file system subtree. recursive=no # Add paths to the list of the source roots. Supports globbing patterns. The # source root is an absolute path or a path relative to the current working # directory used to determine a package namespace for modules located under the # source root. source-roots= # When enabled, pylint would attempt to guess common misconfiguration and emit # user-friendly hints instead of false-positive error messages. suggestion-mode=yes # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no # In verbose mode, extra non-checker-related info will be displayed. #verbose= [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- # naming-style. If left empty, argument names will be checked with the set # naming style. #argument-rgx= # Naming style matching correct attribute names. attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- # style. If left empty, attribute names will be checked with the set naming # style. #attr-rgx= # Bad variable names which should always be refused, separated by a comma. bad-names=foo, bar, baz, toto, tutu, tata # Bad variable names regexes, separated by a comma. If names match any regex, # they will always be refused bad-names-rgxs= # Naming style matching correct class attribute names. class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- # attribute-naming-style. If left empty, class attribute names will be checked # with the set naming style. #class-attribute-rgx= # Naming style matching correct class constant names. class-const-naming-style=UPPER_CASE # Regular expression matching correct class constant names. Overrides class- # const-naming-style. If left empty, class constant names will be checked with # the set naming style. #class-const-rgx= # Naming style matching correct class names. class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-naming- # style. If left empty, class names will be checked with the set naming style. #class-rgx= # Naming style matching correct constant names. const-naming-style=UPPER_CASE # Regular expression matching correct constant names. Overrides const-naming- # style. If left empty, constant names will be checked with the set naming # style. #const-rgx= # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 # Naming style matching correct function names. function-naming-style=snake_case # Regular expression matching correct function names. Overrides function- # naming-style. If left empty, function names will be checked with the set # naming style. #function-rgx= # Good variable names which should always be accepted, separated by a comma. good-names=i, j, k, ex, Run, _ # Good variable names regexes, separated by a comma. If names match any regex, # they will always be accepted good-names-rgxs= # Include a hint for the correct naming format with invalid-name. include-naming-hint=no # Naming style matching correct inline iteration names. inlinevar-naming-style=any # Regular expression matching correct inline iteration names. Overrides # inlinevar-naming-style. If left empty, inline iteration names will be checked # with the set naming style. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-naming- # style. If left empty, method names will be checked with the set naming style. #method-rgx= # Naming style matching correct module names. module-naming-style=snake_case # Regular expression matching correct module names. Overrides module-naming- # style. If left empty, module names will be checked with the set naming style. #module-rgx= # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. # These decorators are taken in consideration only for invalid-name. property-classes=abc.abstractproperty # Regular expression matching correct type alias names. If left empty, type # alias names will be checked with the set naming style. #typealias-rgx= # Regular expression matching correct type variable names. If left empty, type # variable names will be checked with the set naming style. #typevar-rgx= # Naming style matching correct variable names. variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- # naming-style. If left empty, variable names will be checked with the set # naming style. #variable-rgx= [CLASSES] # Warn about protected attribute access inside special methods check-protected-access-in-special-methods=no # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__, __new__, setUp, asyncSetUp, __post_init__ # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make,os._exit # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs [DESIGN] # List of regular expressions of class ancestor names to ignore when counting # public methods (see R0903) exclude-too-few-public-methods= # List of qualified class names to ignore when counting class parents (see # R0901) ignored-parents= # Maximum number of arguments for function / method. max-args=5 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Maximum number of boolean expressions in an if statement (see R0916). max-bool-expr=6 # Maximum number of branch for function / method body. max-branches=12 # Maximum number of locals for function / method body. max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of public methods for a class (see R0904). max-public-methods=30 # Maximum number of return / yield for function / method body. max-returns=6 # Maximum number of statements in function / method body. max-statements=50 # Minimum number of public methods for a class (see R0903). min-public-methods=2 [EXCEPTIONS] # Exceptions that will emit a warning when caught. overgeneral-exceptions=builtins.BaseException,builtins.Exception [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Maximum number of characters on a single line. max-line-length=110 # Maximum number of lines in a module. max-module-lines=1000 # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no [IMPORTS] # List of modules that can be imported at any level, not just the top level # one. allow-any-import-level= # Allow explicit reexports by alias from a package __init__. allow-reexport-from-package=no # Allow wildcard imports from modules that define __all__. allow-wildcard-with-all=no # Deprecated modules which should not be used, separated by a comma. deprecated-modules= # Output a graph (.gv or any supported image format) of external dependencies # to the given file (report RP0402 must not be disabled). ext-import-graph= # Output a graph (.gv or any supported image format) of all (i.e. internal and # external) dependencies to the given file (report RP0402 must not be # disabled). import-graph= # Output a graph (.gv or any supported image format) of internal dependencies # to the given file (report RP0402 must not be disabled). int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant # Couples of modules and preferred modules, separated by a comma. preferred-modules= [LOGGING] # The type of string formatting that logging methods do. `old` means using % # formatting, `new` is for `{}` formatting. logging-format-style=old # Logging modules to check that the string format arguments are in logging # function parameter format. logging-modules=logging [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, # UNDEFINED. confidence=HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once). You can also use "--disable=all" to # disable everything first and then re-enable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". disable=raw-checker-failed, bad-inline-option, locally-disabled, file-ignored, suppressed-message, useless-suppression, deprecated-pragma, use-symbolic-message-instead, invalid-name, too-many-arguments, too-many-locals, too-many-instance-attributes, too-many-lines, too-many-branches, too-many-statements, no-else-return, len-as-condition, missing-docstring, too-few-public-methods, import-error, fixme # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. enable=c-extension-no-member [METHOD_ARGS] # List of qualified names (i.e., library.method) which require a timeout # parameter e.g. 'requests.api.get,requests.api.post' timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME, XXX, TODO # Regular expression of note tags to take in consideration. notes-rgx= [REFACTORING] # Maximum number of nested blocks for function / method body max-nested-blocks=6 # Complete name of functions that never returns. When checking for # inconsistent-return-statements if a never returning function is called then # it will be considered as an explicit return statement and no message will be # printed. never-returning-functions=sys.exit,argparse.parse_error [REPORTS] # Python expression which should return a score less than or equal to 10. You # have access to the variables 'fatal', 'error', 'warning', 'refactor', # 'convention', and 'info' which contain the number of messages in each # category, as well as 'statement' which is the total number of statements # analyzed. This score is used by the global evaluation report (RP0004). evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details. msg-template= # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio). You can also give a reporter class, e.g. # mypackage.mymodule.MyReporterClass. #output-format= # Tells whether to display a full report or only the messages. reports=no # Activate the evaluation score. score=yes [SIMILARITIES] # Comments are removed from the similarity computation ignore-comments=yes # Docstrings are removed from the similarity computation ignore-docstrings=yes # Imports are removed from the similarity computation ignore-imports=yes # Signatures are removed from the similarity computation ignore-signatures=yes # Minimum lines number of a similarity. min-similarity-lines=4 [SPELLING] # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 # Spelling dictionary name. No available dictionaries : You need to install # both the python package and the system dependency for enchant to work.. spelling-dict= # List of comma separated words that should be considered directives if they # appear at the beginning of a comment and should not be checked. spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains the private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to the private dictionary (see the # --spelling-private-dict-file option) instead of raising a message. spelling-store-unknown-words=no [STRING] # This flag controls whether inconsistent-quotes generates a warning when the # character used as a quote delimiter is used inconsistently within a module. check-quote-consistency=no # This flag controls whether the implicit-str-concat should generate a warning # on implicit string concatenation in sequences defined over several lines. check-str-concat-over-line-jumps=no [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # Tells whether to warn about missing members when the owner of the attribute # is inferred to be None. ignore-none=yes # This flag controls whether pylint should warn about no-member and similar # checks whenever an opaque object is returned when inferring. The inference # can return multiple potential results while evaluating a Python object, but # some branches might not be evaluated, which results in partial inference. In # that case, it might be useful to still emit no-member and other checks for # the rest of the inferred objects. ignore-on-opaque-inference=yes # List of symbolic message names to ignore for Mixin members. ignored-checks-for-mixins=no-member, not-async-context-manager, not-context-manager, attribute-defined-outside-init # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. missing-member-hint=yes # The minimum edit distance a name should have in order to be considered a # similar match for a missing member name. missing-member-hint-distance=1 # The total number of similar names that should be taken in consideration when # showing a hint for a missing member. missing-member-max-choices=1 # Regex pattern to define which classes are considered mixins. mixin-class-rgx=.*[Mm]ixin # List of decorators that change the signature of a decorated function. signature-mutators= [VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid defining new builtins when possible. additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes # List of names allowed to shadow builtins allowed-redefined-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_, _cb # A regular expression matching the name of dummy variables (i.e. expected to # not be used). dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ # Argument names that match this expression will be ignored. ignored-argument-names=_.*|^ignored_|^unused_ # Tells whether we should check for unused import in __init__ files. init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io python-asciimatics-1.15.0/.readthedocs.yaml000066400000000000000000000013211511423144500206320ustar00rootroot00000000000000# .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" jobs: pre_install: - git update-index --assume-unchanged doc/source/conf.py pre_build: - cd doc && bash ./build.sh # Build documentation in the docs/ directory with Sphinx sphinx: configuration: doc/source/conf.py # We recommend specifying your dependencies to enable reproducible builds: # https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - requirements: requirements.txt - path: . python-asciimatics-1.15.0/.stickler.yml000066400000000000000000000000721511423144500200260ustar00rootroot00000000000000linters: flake8: fixer: true fixers: enable: true python-asciimatics-1.15.0/CHANGES.rst000066400000000000000000000270621511423144500172170ustar00rootroot00000000000000CHANGE HISTORY ============== LATEST ------ 1.15.0 ------ - Dropped support for Python 2, Python 3.9 or above is now required. - Added support for ColouredText titles in MultiColumnLIstBox. - Added gutter option to Layout. - Added speed option to Sprite. - Fixed bug where moving focus between Frames resulted in no current focus. - Fixed internal state of RadioButton values to be consistent with selection. - Fixed handling of zero width modifiers. - Fixed image conversion to use modern PIL API and sort off-by-one height error. - Fixed parser bug returning list instead of colour tuple. 1.14.0 ------ - Added AnsiArtPlayer and AsciinemaPlayer - Added dynamically sized, animated sprites to ray caster demo. - Added fit parameter to DropdownList. - Added support for default colours to AnsiTerminalParser - Added VBarChart renderer. - BREAKING VISUAL CHANGE: Frame now supports scroll bars without borders, to have no border and no scroll bar you now need Frame(has_border=False, can_scroll=False) - Added TextBox.hide_cursor and TextBox.auto_scroll properties - Added optional diameter parameter to ShootScreen. - Improved DropEmitter effect - will now typically take a little longer to clear the screen. - Fixed bug in widget focus - eliminated duplicate events and some cases that failed to move focus - Fixed bug in clear_widgets() - also reset any focus in the layout. - Fixed bug: layout could still be a tab stop with no active widgets. 1.13.0 ------ - Added ability to change a `Button`'s text through a `.text` attribute. - Added ability to accept a name attribute in the `Button` and `Label` constructors. - Added ability to detect job pause/resume and force full screen refresh. - Added ability to request terminal default colours using `Screen.COLOUR_DEFAULT`. - Converted widgets to a sub-package. - Fixed issue with labels in a layout column preventing buttons from being pressed. - Fixed issue with visual overrun on Listboxes when there is a label offset. - Fixed issue with TextBox hitting IndexError in double buffers due to lack of clipping. - Fixed issue with Text/TextBox start columns on reset. - Added troubleshooting on terminal colour handling. 1.12.0 ------ - Added ColouredText objects to handle embedded colour codes in text for some widgets. - Added parsers to handle Asciimatics and Ansi Terminal escape sequences. - Added ControlCodeParser to create human readable text from raw text with control codes in it. - Added readonly logic for Text and TextBox. - Added ability to enable/disable widgets by column in layouts. - Added left/right/up/down navigation to nearest widget. - Added ability to scroll screen/canvas by variable number of lines. - Created terminal demo - Fixed exception on reinstating NoneType signal handler. - Fixed float/int issue with recent builds of pywin32. - Fixed issue where setting options changed the selected value (even if it was still present). - Fixed erroneous trigger of on_load for all Frames at start of day. - Fixed bug where Frames passed on events that they already handled. - Fixed bug: Restore current theme on screen resize. - Fixed bug in scrolling the screen up. 1.11.0 ------ - Added `allow_int` parameter to `Screen.play()`. - Added `max_length` parameter to `Text`. - Added support for page up/down in `TextBox`. - Added optional scroll bars to `MultiColumnListBox`. - Added `file_filter` parameter to `FileBrowser`. - Added `wait_for_input` method to `Screen`. - Added optional `theme` parameter to `PopupDialog`. - Added optional `jitter` parameter to `Noise`. - Added `ManagedScreen` decorator. - Improved performance of double-buffering. - NOTE: Drawing off-screen with a large scrolling buffer is no longer supported (as it wasn't needed). - Added optional `pattern` parameter to `Stars`. - Improved handling of permission errors in `FileBrowser`. - Added formal support for defining your own colour theme. - Added `clear_widgets` to `Layout` objects. - Fixed height of PopUpDialog when no buttons are specified. - Fixed bug where asciimatics Scenes would hang when the clock is moved back in time. - Fixed off-by-one error in BarChart labels. - Fixed bug where Labels ignored the custom_colour property. - Added default date and time to DatePicker and TimePicker when no value specified. 1.10.0 ------ - Added 'Frame.focussed_widget' to access current focussed widget of the frame. - Added `PopupMenu` for dynamic contextual menus. - Added `DropdownList` widget. - Added `VerticalDivider` widget. - Added optional scroll bar to Listboxes. - Added `line_wrap` option to TextBoxes. - Added `line_char` option to Dividers. - Added `align` option to Labels. - Added `width` property to widgets. - Added `set_theme` to Frames and provided some new colour schemes. - Fixed `Screen.wrapper()` to return result from wrapped function. - Fixed list box truncation when lines are too long. - Fixed issue with background colour when scrolling GNOME terminal. - Fixed Text validator to support instance methods. - Fixed exception raised by getdefaultlocale on some curses systems. - Performance tweaks for non-unicode widgets. - Relaxed restriction on static function callbacks for pop-up dialogs. - Fixed bug where `Listbox.reset()` overrode current selected value. - Fixed handling of decomposed unicode file names in `FileBrowser` for MacOS - Fixed CJK issues with `Screen.paint()` and `SpeechBubble`. - Fixed issue with dynamically added Frames so that they are reset before displayed for the first time. 1.9.0 ----- - Added FileBrowser, DatePicker and TimePicker widgets. - Made `screen` a mandatory positional parameter to all Effects in the process. - NOTE: Any custom Effects you have created will now need to pass the screen down to the parent class. - Added `fill_polygon()` to Screen and Canvas. - Added the Kaleidoscope and RotatedDuplicate renderers. - Created Maps demo - which renders vector tiles and satellite images from Mapbox. - Added optional `is_modal` parameter to Frame constructor. - Added `on_blur` and `on_focus` parameters to all interactive Widgets. - Added `colour` property to Cogs Effect. - Added `title` property to Frame. - Added `text` property to Label. - Added `hide_char` parameter to Text constructor to hide any entered text - e.g. for passwords. - Added optional `height` parameter to Label constructor. - Allowed programs to set "default" values for Widgets - which means you need to reset each field in a Frame explicitly rather than relying on reset to blank out uninitialized fields. - Fixed up signal handling to re-instate old handlers on Screen.close(). - Fixed missing on_select handler for ListBox. 1.8.0 ----- - Added MultiColumnListBox for displaying tabular data in widgets. - Improved efficiency of screen refresh on curses systems. - Improved start-up time by avoiding use of deepcopy() - Added unicode characters to ColourFileImage to increase rendering resolution. - Added support for validated free-form text to Text widgets. - Added force_update() to allow background refresh of the Screen. - Added custom_colour property to widgets. - Added support for DELETE key to text widgets. - Fixed ZeroDivisionError in Frames. - Fixed issues with double-width glyphs as used by CJK languages. - Tweaked widget navigation using cursor keys to be more like web forms. 1.7.0 ----- - Added unicode support for input and output. - Reworked Screen construction. - Added open() and close() methods to Screen. - Retired from_windows(), from_curses() and from_blessed() methods. - Retired Blessed support. - Added set_scenes() and draw_next_frame() to allow asynchronous frameworks to use Screen. - Added Plasma renderer and sample code to use it. - Added background colour support to ColourImageFile. - Added support for multi-colour rendering using ${c,a,b} syntax. - Added highlight() method to Screen and Canvas. - Added UT framework for testing and CI configurations to run the tests. - Added shadows to Frames. - Fixed bug in restoring console colours on Exit for Windows. - Fixed up logic for handling Ctrl keys and documented OS restrictions. - Fixed refresh timer in play() when handling intensive computational load. - Added repeat flag to play() to allow termination of the animation instead of infinite looping. - Improved CPU usage for Widgets-based UIs. - General docs and test tidy up. 1.6.0 ----- - Added `widgets` sub-package, providing a Frame effect for encapsulating a User Interface, a Layout to organise the content and the following widgets: - Button - CheckBox - Divider - Label - ListBox - RadioButtons - Text - TextBox - Added PopUpDialog for simple alerting in a UI. - Added `attr` option to Print Effect. - Added `keys` option to BarChart Renderer. 1.5.0 ----- - Created the ParticleEffect and associated classes. - Implemented the StarFirework, RingFirework, SerpentFirework, PalmFirework, Explosion, DropScreen, ShootScreen and Rain effects. - Added background colour options to BarChart renderer. - Added set_title() method to set title for window that owns the Screen. 1.4.2 ----- - Fix for Python 3 support on Linux variants. 1.4.1 ----- - Minor fixes to setup.py to correct packaging meta-data. 1.4.0 ----- - Added Fire renderer and demo. - Added Mouse support. This had 2 major impacts: 1. It meant that blessed support is now completely deprecated as it doesn't support mouse input. 2. All references to processing keys is now deprecated. You must now use the `get_event()` equivalent API instead. - Added support for dynamic addition/removal of Effects from a Scene, using `add_effect()` and `remove_effect()`. - Converted all effects to use `**kwargs` to pass through to base Effect class so that future common frame related features were instantly available. These parameters must now always be specified as keyword arguments as a result. - Added support for background colours. - Renamed `getch()` and `putch()` to `get_from()` and `print_at()`. Old functions are still present, but deprecated. - Fixed up `get_from()` so that it is consistent across all platforms and includes all character attributes. 1.3.0 ----- - Added BarChart renderer and demo. - Added support for extended key codes on Windows and Linux. - Added support for dynamic paths using keyboard input. Created interactive demo sample to show how this works. - Split Renderer into StaticRenderer and DynamicRenderer. Code that used Renderer should now use StaticRenderer. - Added speed option to Print effect. - Fixed up curses colour detection and Unicode bug in python2 on Windows. 1.2.0 ----- - Added Windows support, complete with `Screen.wrapper()` to handle all required screen set up. The old from_XXX class methods are now deprecated. - Fixed ColourImageFile to do bare minimum rendering on low colour terminals. - Added formal palette property to Screen for image conversions. - Verified Python 3.4 support. 1.1.0 ----- - Added the Julia Set and Cog effects. - Fixed up off-by-one error in line drawing. - Added support for screen resizing while playing a scene. - Added support for Python 3. 1.0.0 ----- - Added Bressenham line drawing algorithm with anti-aliasing. - Added Random Noise effect. - Added support for blessed as well as curses - if you want to continue to use curses, construct the Screen using the `from_curses()` class method. - Fixed up some docs errors. 0.4.0 ----- - Added support for 256 colour terminals. - Moved ${c,a} syntax for inline colouring from Screen to Renderer. - Created some samples for 256 colour mode and colour images. 0.3.0 ----- - Added support for multi-colour rendering using ${c,a} syntax. - Added Snow effect. - Fixed bug when erasing small Sprites. - Fixed up various documentation niggles. 0.2.0 ----- - Original public release. python-asciimatics-1.15.0/CONTRIBUTING.rst000066400000000000000000000001761511423144500200530ustar00rootroot00000000000000If you'd like to contribute to this project, see http://asciimatics.readthedocs.org/en/latest/contributing.html for details. python-asciimatics-1.15.0/LICENSE000066400000000000000000000261211511423144500164150ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2016 Peter Brittain Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. python-asciimatics-1.15.0/MANIFEST.in000066400000000000000000000000231511423144500171370ustar00rootroot00000000000000include README.rst python-asciimatics-1.15.0/PULL_REQUEST_TEMPLATE.md000066400000000000000000000015651511423144500212160ustar00rootroot00000000000000# Thanks for taking the time to contibute to this project. You are a star! Checks ------ _Before you go any further, please make sure that you have read the [contributing guidelines](https://asciimatics.readthedocs.io/en/latest/contributing.html), run the test suite and that your clone of this repository was taken after 18 October 2018. (I had to fix up the git history and so clones before that date will have all sorts of merge issues)._ _Now please delete this pre-amble section and fill in the rest of the template..._ Issues fixed by this PR ----------------------- _Please list any Issues here_ What does this implement/fix? ----------------------------- _Please add any further information about the fix if it is not obvious from the related Issue above_ Any other comments? ------------------- _If there is anything else you feel you need to add, please do so here!_ python-asciimatics-1.15.0/README.rst000066400000000000000000000147621511423144500171070ustar00rootroot00000000000000 .. image:: https://github.com/peterbrittain/asciimatics/actions/workflows/test.yml/badge.svg :target: https://github.com/peterbrittain/asciimatics/actions/workflows/test.yml :alt: Build status .. image:: https://app.codacy.com/project/badge/Grade/c1fed1f2dc6a47a1bbe91f8851456beb :target: https://app.codacy.com/gh/peterbrittain/asciimatics/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade :alt: Code Health .. image:: https://codecov.io/gh/peterbrittain/asciimatics/graph/badge.svg?token=UlVFVeLagX :target: https://codecov.io/gh/peterbrittain/asciimatics :alt: Code Coverage .. image:: https://img.shields.io/pypi/v/asciimatics.svg :target: https://pypi.python.org/pypi/asciimatics :alt: Latest stable version .. image:: https://badges.gitter.im/asciimatics/Lobby.svg :alt: Join the chat at https://gitter.im/asciimatics/Lobby :target: https://gitter.im/asciimatics/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge ASCIIMATICS =========== Asciimatics is a package to help people create full-screen text UIs (from interactive forms to ASCII animations) on any platform. It is licensed under the Apache Software Foundation License 2.0. Why? ---- Why not? It brings a little joy to anyone who was programming in the 80s... Oh and it provides a single cross-platform Python class to do all the low-level console function you could ask for, including: * Coloured/styled text - including 256 colour terminals and unicode characters (even CJK languages) * Cursor positioning * Keyboard input (without blocking or echoing) including unicode support * Mouse input (terminal permitting) * Detecting and handling when the console resizes * Screen scraping In addition, it provides some simple, high-level APIs to provide more complex features including: * Anti-aliased ASCII line-drawing * Image to ASCII conversion - including JPEG and GIF formats * Many animation effects - e.g. sprites, particle systems, banners, etc. * Various widgets for text UIs - e.g. buttons, text boxes, radio buttons, etc. Currently this package has been proven to work on CentOS 6 & 7, Raspbian (i.e. Debian wheezy), Ubuntu 14.04, Windows 7, 8 & 10, OSX 10.11 and Android Marshmallow (courtesy of https://termux.com), though it should also work for any other platform that provides a working curses implementation. It should be implementation agnostic and has been successfully tested on CPython and PyPy2. (Please let me know if you successfully verified it on other platforms so that I can update this list). Installation ------------ Asciimatics supports Python version 3. For the precise list of tested versions, refer to `pypi `_. The last version of asciimatics to support Python 2 is v1.14. To install asciimatics, simply install with `pip` as follows: .. code-block:: bash $ pip install asciimatics This should install all your dependencies for you. If you don't use pip or it fails to install them, you can install the dependencies directly using the packages listed in `requirements.txt `_. Additionally, Windows users (who aren't using `pip`) will need to install `pywin32`. How to use it? -------------- To use the low-level API, simply create a Screen and use it to print coloured text at any location, or get mouse/keyboard input. For example, here is a variant on the classic "hello world": .. code-block:: python from random import randint from asciimatics.screen import Screen def demo(screen): while True: screen.print_at('Hello world!', randint(0, screen.width), randint(0, screen.height), colour=randint(0, screen.colours - 1), bg=randint(0, screen.colours - 1)) ev = screen.get_key() if ev in (ord('Q'), ord('q')): return screen.refresh() Screen.wrapper(demo) That same code works on Windows, OSX and Linux and paves the way for all the higher level features. These still need the Screen, but now you also create a Scene using some Effects and then get the Screen to play it. For example, this code: .. code-block:: python from asciimatics.effects import Cycle, Stars from asciimatics.renderers import FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen def demo(screen): effects = [ Cycle( screen, FigletText("ASCIIMATICS", font='big'), int(screen.height / 2 - 8)), Cycle( screen, FigletText("ROCKS!", font='big'), int(screen.height / 2 + 3)), Stars(screen, 200) ] screen.play([Scene(effects, 500)]) Screen.wrapper(demo) should produce something like this: .. image:: https://asciinema.org/a/18756.png :alt: asciicast :target: https://asciinema.org/a/18756?autoplay=1 Or maybe you're looking to create a TUI? In which case this `simple code `__ will give you this: .. image:: https://asciinema.org/a/45946.png :alt: contact list sample :target: https://asciinema.org/a/45946?autoplay=1 Documentation ------------- Full documentation of all the above (and more!) is available at http://asciimatics.readthedocs.org/ More examples ------------- More examples of what you can do are available in the project samples directory, hosted on GitHub. See https://github.com/peterbrittain/asciimatics/tree/v1.15/samples. To view them, simply download these files and then simply run them directly with `python`. Alternatively, you can browse recordings of many of the samples in the gallery at https://github.com/peterbrittain/asciimatics/wiki. Bugs and enhancements --------------------- If you have a problem, please check out the troubleshooting guide at http://asciimatics.readthedocs.io/en/latest/troubleshooting.html. If this doesn't solve your problem, you can report bugs (or submit enhancement requests) at https://github.com/peterbrittain/asciimatics/issues. Alternatively, if you just have some questions, feel free to drop in at https://gitter.im/asciimatics/Lobby. Contributing to the project --------------------------- If you'd like to take part in this project (and see your name in the credits!), check out the guidance at http://asciimatics.readthedocs.org/en/latest/contributing.html python-asciimatics-1.15.0/asciimatics/000077500000000000000000000000001511423144500176775ustar00rootroot00000000000000python-asciimatics-1.15.0/asciimatics/__init__.py000066400000000000000000000006361511423144500220150ustar00rootroot00000000000000""" Asciimatics is a package to help people create full-screen text UIs (from interactive forms to ASCII animations) on any platform. It is licensed under the Apache Software Foundation License 2.0. """ __author__ = 'Peter Brittain' try: from .version import version except ImportError: # Someone is running straight from the GIT repo - dummy out the version version = "0.0.0" __version__ = version python-asciimatics-1.15.0/asciimatics/constants.py000066400000000000000000000013771511423144500222750ustar00rootroot00000000000000""" This module is just a collection of simple helper functions. """ #: Attribute conversion table for the ${c,a} form of attributes for #: :py:obj:`~.Screen.paint`. MAPPING_ATTRIBUTES = { "1": 1, "2": 2, "3": 3, "4": 4, } #: Regex for asciimatics ${c,a,b} embedded colour attributes. COLOUR_REGEX = r"^\$\{((\d+),(\d+),(\d+)|(\d+),(\d+)|(\d+))\}(.*)" # Text attributes for use when printing to the Screen. A_BOLD = 1 A_NORMAL = 2 A_REVERSE = 3 A_UNDERLINE = 4 # Text colours for use when printing to the Screen. COLOUR_DEFAULT = -1 COLOUR_BLACK = 0 COLOUR_RED = 1 COLOUR_GREEN = 2 COLOUR_YELLOW = 3 COLOUR_BLUE = 4 COLOUR_MAGENTA = 5 COLOUR_CYAN = 6 COLOUR_WHITE = 7 # Line drawing style constants ASCII_LINE = 0 SINGLE_LINE = 1 DOUBLE_LINE = 2 python-asciimatics-1.15.0/asciimatics/effects.py000066400000000000000000001133111511423144500216700ustar00rootroot00000000000000""" This module defines `Effects` which can be used for animations. For more details see http://asciimatics.readthedocs.io/en/latest/animation.html """ from abc import ABCMeta, abstractmethod from random import randint, random, choice from math import sin, cos, pi import datetime from asciimatics.paths import DynamicPath from asciimatics.screen import Screen class Effect(metaclass=ABCMeta): """ Abstract class to handle a special effect on the screen. An Effect can cover anything from a static image at the start of the Scene through to dynamic animations that need to be redrawn for every frame. The basic interaction with a :py:obj:`.Scene` is as follows: 1. The Scene will register with the Effect when it as added using :py:meth:`.register_scene`. 2. The Scene will call :py:meth:`.Effect.reset` for all Effects when it starts. 3. The Scene will determine the number of frames required (either through explicit configuration or querying :py:obj:`.stop_frame` for every Effect). 4. It will then run the scene, calling :py:meth:`.Effect.update` for each effect that is in the scene. The base Effect will then call the abstract method _update() if the effect should be visible. 5. If any keys are pressed or the mouse moved/clicked, the scene will call :py:meth:`.Effect.process_event` for each event, allowing the effect to act on it if needed. New Effects, therefore need to implement the abstract methods on this class to satisfy the contract with Scene. Since most effects don't require user interaction, the default process_event() implementation will ignore the event (and so effects don't need to implement this method unless needed). """ def __init__(self, screen, start_frame=0, stop_frame=0, delete_count=None): """ :param screen: The Screen that will render this Effect. :param start_frame: Start index for the effect. :param stop_frame: Stop index for the effect. :param delete_count: Number of frames before this effect is deleted. """ self._screen = screen self._start_frame = start_frame self._stop_frame = stop_frame self._delete_count = delete_count self._scene = None def update(self, frame_no): """ Process the animation effect for the specified frame number. :param frame_no: The index of the frame being generated. """ if (frame_no >= self._start_frame and (self._stop_frame == 0 or frame_no < self._stop_frame)): self._update(frame_no) def register_scene(self, scene): """ Register the Scene that owns this Effect. :param scene: The Scene to be registered """ self._scene = scene @abstractmethod def reset(self): """ Function to reset the effect when replaying the scene. """ @abstractmethod def _update(self, frame_no): """ This effect will be called every time the mainline animator creates a new frame to display on the screen. :param frame_no: The index of the frame being generated. """ @property @abstractmethod def stop_frame(self): """ Last frame for this effect. A value of zero means no specific end. """ @property def delete_count(self): """ The number of frames before this Effect should be deleted. """ return self._delete_count @property def screen(self): """ The Screen that will render this Effect. """ return self._screen @delete_count.setter def delete_count(self, value): self._delete_count = value @property def frame_update_count(self): """ The number of frames before this Effect should be updated. Increasing this number potentially reduces the CPU load of a Scene (if no other Effect needs to be scheduled sooner), but can affect perceived responsiveness of the Scene if it is too long. Handle with care! A value of 0 means refreshes are not required beyond a response to an input event. It defaults to 1 for all Effects. """ return 1 @property def safe_to_default_unhandled_input(self): """ Whether it is safe to use the default handler for any unhandled input from this Effect. A value of False means that asciimatics should not use the default handler. This is typically the case for Frames. """ return True @property def scene(self): """ The Scene that owns this Effect. """ return self._scene def process_event(self, event): """ Process any input event. :param event: The event that was triggered. :returns: None if the Effect processed the event, else the original event. """ return event class Scroll(Effect): """ Special effect to scroll the screen up at a required rate. Since the Screen has a limited size and will not wrap, ensure that it is large enough to Scroll for the desired time. """ def __init__(self, screen, rate, **kwargs): """ :param screen: The Screen being used for the Scene. :param rate: How many frames to wait between scrolling the screen. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._rate = rate self._last_frame = None def reset(self): self._last_frame = 0 def _update(self, frame_no): if (frame_no - self._last_frame) >= self._rate: self._screen.scroll() self._last_frame = frame_no @property def stop_frame(self): return 0 class Cycle(Effect): """ Special effect to cycle the colours on some specified text from a Renderer. The text is automatically centred to the width of the Screen. This effect is not compatible with multi-colour rendered text. """ def __init__(self, screen, renderer, y, **kwargs): """ :param screen: The Screen being used for the Scene. :param renderer: The Renderer which is to be cycled. :param y: The line (y coordinate) for the start of the text. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._renderer = renderer self._y = y self._colour = 0 def reset(self): pass def _update(self, frame_no): if frame_no % 2 == 0: return y = self._y image, _ = self._renderer.rendered_text for line in image: if self._screen.is_visible(0, y): self._screen.centre(line, y, self._colour) y += 1 self._colour = (self._colour + 1) % 8 @property def stop_frame(self): return 0 class BannerText(Effect): """ Special effect to scroll some text (from a Renderer) horizontally like a banner. """ def __init__(self, screen, renderer, y, colour, bg=Screen.COLOUR_BLACK, **kwargs): """ :param screen: The Screen being used for the Scene. :param renderer: The renderer to be scrolled :param y: The line (y coordinate) for the start of the text. :param colour: The default foreground colour to use for the text. :param bg: The default background colour to use for the text. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._renderer = renderer self._y = y self._colour = colour self._bg = bg self._text_pos = None self._scr_pos = None def reset(self): self._text_pos = 0 self._scr_pos = self._screen.width def _update(self, frame_no): if self._scr_pos == 0 and self._text_pos < self._renderer.max_width: self._text_pos += 1 if self._scr_pos > 0: self._scr_pos -= 1 image, colours = self._renderer.rendered_text for (i, line) in enumerate(image): line += " " colours[i].append((self._colour, 2, self._bg)) end_pos = min( len(line), self._text_pos + self._screen.width - self._scr_pos) self._screen.paint(line[self._text_pos:end_pos], self._scr_pos, self._y + i, self._colour, bg=self._bg, colour_map=colours[i][self._text_pos:end_pos]) @property def stop_frame(self): return self._start_frame + self._renderer.max_width + self._screen.width class Print(Effect): """ Special effect that simply prints the specified text (from a Renderer) at the required location. """ def __init__(self, screen, renderer, y, x=None, colour=7, attr=0, bg=0, clear=False, transparent=True, speed=4, **kwargs): """ :param screen: The Screen being used for the Scene. :param renderer: The renderer to be printed. :param x: The column (x coordinate) for the start of the text. If not specified, defaults to centring the text on screen. :param y: The line (y coordinate) for the start of the text. :param colour: The foreground colour to use for the text. :param attr: The colour attribute to use for the text. :param bg: The background colour to use for the text. :param clear: Whether to clear the text before stopping. :param transparent: Whether to print spaces (and so be able to overlay other Effects). If False, this will redraw all characters and so replace any Effect underneath it. :param speed: The refresh rate in frames between updates. Note that a speed of 1 will force the Screen to redraw the Effect every frame update, while a value of 0 will redraw on demand - i.e. will redraw every time that an update is required by another Effect. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._renderer = renderer self._transparent = transparent self._y = y self._x = ((self._screen.width - renderer.max_width) // 2 if x is None else x) self._colour = colour self._attr = attr self._bg = bg self._clear = clear self._speed = speed self._frame_no = 0 def reset(self): pass # Nothing required def _update(self, frame_no): self._frame_no = frame_no if self._clear and \ (frame_no == self._stop_frame - 1) or (self._delete_count == 1): for i in range(0, self._renderer.max_height): self._screen.print_at(" " * self._renderer.max_width, self._x, self._y + i, bg=self._bg) elif self._speed == 0 or frame_no % self._speed == 0: image, colours = self._renderer.rendered_text for (i, line) in enumerate(image): self._screen.paint(line, self._x, self._y + i, self._colour, attr=self._attr, bg=self._bg, transparent=self._transparent, colour_map=colours[i]) @property def stop_frame(self): return self._stop_frame @property def frame_update_count(self): # Only demand update for next update frame. return self._speed - (self._frame_no % self._speed) if self._speed > 0 else 1000000 class Mirage(Effect): """ Special effect to make bits of the specified text appear over time. This text is automatically centred on the screen. """ def __init__(self, screen, renderer, y, colour, **kwargs): """ :param screen: The Screen being used for the Scene. :param renderer: The renderer to be displayed. :param y: The line (y coordinate) for the start of the text. :param colour: The colour attribute to use for the text. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._renderer = renderer self._y = y self._colour = colour self._count = 0 def reset(self): self._count = 0 def _update(self, frame_no): if frame_no % 2 == 0: return y = self._y image, colours = self._renderer.rendered_text for i, line in enumerate(image): if self._screen.is_visible(0, y): x = (self._screen.width - len(line)) // 2 for j, c in enumerate(line): if c != " " and random() > 0.85: if colours[i][j][0] is not None: self._screen.print_at(c, x, y, colours[i][j][0], colours[i][j][1]) else: self._screen.print_at(c, x, y, self._colour) x += 1 y += 1 @property def stop_frame(self): return self._stop_frame class _Star(): """ Simple class to represent a single star for the Stars special effect. """ def __init__(self, screen, pattern): """ :param screen: The Screen being used for the Scene. :param pattern: The pattern to loop through """ self._screen = screen self._star_chars = pattern self._cycle = None self._old_char = None self._respawn() def _respawn(self): """ Pick a random location for the star making sure it does not overwrite an existing piece of text. """ self._cycle = randint(0, len(self._star_chars)) (height, width) = self._screen.dimensions while True: self._x = randint(0, width - 1) self._y = self._screen.start_line + randint(0, height - 1) if self._screen.get_from(self._x, self._y)[0] == 32: break self._old_char = " " def update(self): """ Draw the star. """ if not self._screen.is_visible(self._x, self._y): self._respawn() cur_char, _, _, _ = self._screen.get_from(self._x, self._y) if cur_char not in (ord(self._old_char), 32): self._respawn() self._cycle += 1 if self._cycle >= len(self._star_chars): self._cycle = 0 new_char = self._star_chars[self._cycle] if new_char == self._old_char: return self._screen.print_at(new_char, self._x, self._y) self._old_char = new_char class Stars(Effect): """ Add random stars to the screen and make them twinkle. """ def __init__(self, screen, count, pattern="..+.. ...x... ...*... ", **kwargs): """ :param screen: The Screen being used for the Scene. :param count: The number of starts to create. :param pattern: The string pattern for the stars to loop through Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._pattern = pattern self._max = count self._stars = [] def reset(self): self._stars = [_Star(self._screen, self._pattern) for _ in range(self._max)] def _update(self, frame_no): for star in self._stars: star.update() @property def stop_frame(self): return 0 class _Trail(): """ Track a single trail for a falling character effect (a la Matrix). """ def __init__(self, screen, x): """ :param screen: The Screen being used for the Scene. :param x: The column (y coordinate) for this trail to use. """ self._screen = screen self._x = x self._y = 0 self._life = 0 self._rate = 0 self._clear = True self._maybe_reseed(True) def _maybe_reseed(self, normal): """ Randomly create a new column once this one is finished. """ self._y += self._rate self._life -= 1 if self._life <= 0: self._clear = not self._clear if normal else True self._rate = randint(1, 2) if self._clear: self._y = 0 self._life = self._screen.height // self._rate else: self._y = randint(0, self._screen.height // 2) - \ self._screen.height // 4 self._life = \ randint(1, self._screen.height - self._y) // self._rate def update(self, reseed): """ Update that trail! :param reseed: Whether we are in the normal reseed cycle or not. """ if self._clear: for i in range(0, 3): self._screen.print_at(" ", self._x, self._screen.start_line + self._y + i) self._maybe_reseed(reseed) else: for i in range(0, 3): self._screen.print_at(chr(randint(32, 126)), self._x, self._screen.start_line + self._y + i, Screen.COLOUR_GREEN) for i in range(4, 6): self._screen.print_at(chr(randint(32, 126)), self._x, self._screen.start_line + self._y + i, Screen.COLOUR_GREEN, Screen.A_BOLD) self._maybe_reseed(reseed) class Matrix(Effect): """ Matrix-like falling green letters. """ def __init__(self, screen, **kwargs): """ :param screen: The Screen being used for the Scene. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._chars = [] def reset(self): self._chars = [_Trail(self._screen, x) for x in range(self._screen.width)] def _update(self, frame_no): if frame_no % 2 == 0: for char in self._chars: char.update((self._stop_frame == 0) or ( self._stop_frame - frame_no > 100)) @property def stop_frame(self): return self._stop_frame class Wipe(Effect): """ Wipe the screen down from top to bottom. """ def __init__(self, screen, bg=0, **kwargs): """ :param screen: The Screen being used for the Scene. :param bg: Optional background colour to use for the wipe. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._bg = bg self._y = None def reset(self): self._y = 0 def _update(self, frame_no): if frame_no % 2 == 0: if self._screen.is_visible(0, self._y): self._screen.print_at( " " * self._screen.width, 0, self._y, bg=self._bg) self._y += 1 @property def stop_frame(self): return self._stop_frame class Sprite(Effect): """ An animated character capable of following a path around the screen. """ def __init__(self, screen, renderer_dict, path, colour=Screen.COLOUR_WHITE, clear=True, speed=2, **kwargs): """ :param screen: The Screen being used for the Scene. :param renderer_dict: A dictionary of Renderers to use for displaying the Sprite. :param path: The Path for the Sprite to follow. :param colour: The colour to use to render the Sprite. :param clear: Whether to clear out old images or leave a trail. :param speed: The refresh rate in frames between updates. Note that a speed of 1 will force the Screen to redraw the Effect every frame update, while a value of 0 will redraw on demand - i.e. will redraw every time that an update is required by another Effect. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._renderer_dict = renderer_dict self._path = path self._index = None self._colour = colour self._clear = clear self._old_height = None self._old_width = None self._old_x = None self._old_y = None self._dir_count = 0 self._dir_x = None self._dir_y = None self._old_direction = None self._speed = speed self.reset() def reset(self): self._dir_count = 0 self._dir_x = None self._dir_y = None self._old_x = None self._old_y = None self._old_direction = None self._path.reset() def last_position(self): """ Returns the last position of this Sprite as a tuple (x, y, width, height). """ return self._old_x, self._old_y, self._old_width, self._old_height def overlaps(self, other, use_new_pos=False): """ Check whether this Sprite overlaps another. :param other: The other Sprite to check for an overlap. :param use_new_pos: Whether to use latest position (due to recent update). Defaults to False. :returns: True if the two Sprites overlap. """ (x, y) = self._path.next_pos() if use_new_pos else (self._old_x, self._old_y) w = self._old_width h = self._old_height x2, y2, w2, h2 = other.last_position() if ((x > x2 + w2 - 1) or (x2 > x + w - 1) or (y > y2 + h2 - 1) or (y2 > y + h - 1)): return False else: return True def _update(self, frame_no): if self._speed == 0 or frame_no % self._speed == 0: # Blank out the old sprite if moved. if (self._clear and self._old_x is not None and self._old_y is not None): for i in range(0, self._old_height): self._screen.print_at( " " * self._old_width, self._old_x, self._old_y + i, 0) # Don't draw a new one if we're about to stop the Sprite. if self._delete_count is not None and self._delete_count <= 2: return # Figure out the direction of the sprite, if enough time has # elapsed. (x, y) = self._path.next_pos() if self._dir_count % 3 == 0: direction = None if self._dir_x is not None: dx = (x - self._dir_x) // 2 dy = y - self._dir_y if dx * dx > dy * dy: direction = "left" if dx < 0 else "right" elif dx == 0 and dy == 0: direction = "default" else: direction = "up" if dy < 0 else "down" self._dir_x = x self._dir_y = y else: direction = self._old_direction self._dir_count += 1 # If no data - pick the default if direction not in self._renderer_dict: direction = "default" # Now we've done the directions, centre the sprite on the path. x -= self._renderer_dict[direction].max_width // 2 y -= self._renderer_dict[direction].max_height // 2 # Update the path index for the sprite if needed. if self._path.is_finished(): self._path.reset() # Draw the new sprite. # self._screen.print_at(str(x)+","+str(y)+" ", 0, 0) image, colours = self._renderer_dict[direction].rendered_text for (i, line) in enumerate(image): self._screen.paint(line, x, y + i, self._colour, colour_map=colours[i]) # Remember what we need to clear up next frame. self._old_width = self._renderer_dict[direction].max_width self._old_height = self._renderer_dict[direction].max_height self._old_direction = direction self._old_x = x self._old_y = y @property def stop_frame(self): return self._stop_frame def process_event(self, event): if isinstance(self._path, DynamicPath): return self._path.process_event(event) else: return event class _Flake(): """ Track a single snow flake. """ _snow_chars = ".+*" _drift_chars = " ,;#@" def __init__(self, screen): """ :param screen: The Screen being used for the Scene. """ self._screen = screen self._x = 0 self._y = 0 self._rate = 0 self._char = None self._reseed() def _reseed(self): """ Randomly create a new snowflake once this one is finished. """ self._char = choice(self._snow_chars) self._rate = randint(1, 3) self._x = randint(0, self._screen.width - 1) self._y = self._screen.start_line + randint(0, self._rate) def update(self, reseed): """ Update that snowflake! :param reseed: Whether we are in the normal reseed cycle or not. """ self._screen.print_at(" ", self._x, self._y) cell = None for _ in range(self._rate): self._y += 1 cell = self._screen.get_from(self._x, self._y) if cell is None or cell[0] != 32: break if ((cell is not None and cell[0] in [ord(x) for x in self._snow_chars + " "]) and (self._y < self._screen.start_line + self._screen.height)): self._screen.print_at(self._char, self._x, self._y) else: if self._y > self._screen.start_line + self._screen.height: self._y = self._screen.start_line + self._screen.height drift_index = -1 if cell: drift_index = self._drift_chars.find(chr(cell[0])) if 0 <= drift_index < len(self._drift_chars) - 1: drift_char = self._drift_chars[drift_index + 1] self._screen.print_at(drift_char, self._x, self._y) else: self._screen.print_at(",", self._x, self._y - 1) if reseed: self._reseed() class Snow(Effect): """ Settling snow effect. """ def __init__(self, screen, **kwargs): """ :param screen: The Screen being used for the Scene. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._chars = [] def reset(self): # Make the snow start falling one flake at a time. self._chars = [] def _update(self, frame_no): if frame_no % 3 == 0: if len(self._chars) < self._screen.width // 3: self._chars.append(_Flake(self._screen)) for char in self._chars: char.update((self._stop_frame == 0) or ( self._stop_frame - frame_no > 100)) @property def stop_frame(self): return self._stop_frame class Clock(Effect): """ An ASCII ticking clock (telling the correct local time). """ def __init__(self, screen, x, y, r, bg=Screen.COLOUR_BLACK, **kwargs): """ :param screen: The Screen being used for the Scene. :param x: X coordinate for the centre of the clock. :param y: Y coordinate for the centre of the clock. :param r: Radius of the clock. :param bg: Background colour for the clock. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._x = x self._y = y self._r = r self._bg = bg self._old_time = None def reset(self): pass def _update(self, frame_no): # Helper functions to map various time elements def _hour_pos(t): return (t.tm_hour + t.tm_min / 60) * pi / 6 def _min_pos(t): return t.tm_min * pi / 30 def _sec_pos(t): return t.tm_sec * pi / 30 # Clear old hands if self._old_time is not None: ot = self._old_time self._screen.move(self._x, self._y) self._screen.draw(self._x + (self._r * sin(_hour_pos(ot))), self._y - (self._r * cos(_hour_pos(ot)) / 2), char=" ", bg=self._bg) self._screen.move(self._x, self._y) self._screen.draw(self._x + (self._r * sin(_min_pos(ot)) * 2), self._y - (self._r * cos(_min_pos(ot))), char=" ", bg=self._bg) self._screen.move(self._x, self._y) self._screen.draw(self._x + (self._r * sin(_sec_pos(ot)) * 2), self._y - (self._r * cos(_sec_pos(ot))), char=" ", bg=self._bg) # Draw new ones new_time = datetime.datetime.now().timetuple() self._screen.move(self._x, self._y) self._screen.draw(self._x + (self._r * sin(_hour_pos(new_time))), self._y - (self._r * cos(_hour_pos(new_time)) / 2), colour=Screen.COLOUR_WHITE, bg=self._bg) self._screen.move(self._x, self._y) self._screen.draw(self._x + (self._r * sin(_min_pos(new_time)) * 2), self._y - (self._r * cos(_min_pos(new_time))), colour=Screen.COLOUR_WHITE, bg=self._bg) self._screen.move(self._x, self._y) self._screen.draw(self._x + (self._r * sin(_sec_pos(new_time)) * 2), self._y - (self._r * cos(_sec_pos(new_time))), colour=Screen.COLOUR_CYAN, bg=self._bg, thin=True) self._screen.print_at("o", self._x, self._y, Screen.COLOUR_YELLOW, Screen.A_BOLD, bg=self._bg) self._old_time = new_time @property def stop_frame(self): return self._stop_frame @property def frame_update_count(self): # Only need to update once a second return 20 class Cog(Effect): """ A rotating cog. """ def __init__(self, screen, x, y, radius, direction=1, colour=7, **kwargs): """ :param screen: The Screen being used for the Scene. :param x: X coordinate of the centre of the cog. :param y: Y coordinate of the centre of the cog. :param radius: The radius of the cog. :param direction: The direction of rotation. Positive numbers are anti-clockwise, negative numbers clockwise. :param colour: The colour of the cog. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._x = x self._y = y self._radius = radius self._old_frame = 0 self._rate = 2 self._direction = direction self._colour = colour def reset(self): pass def _update(self, frame_no): # Rate limit the animation if frame_no % self._rate != 0: return # Function to plot. def f(p): return self._x + (self._radius * 2 - (6 * (p // 4 % 2))) * sin( (self._old_frame + p) * pi / 40) def g(p): return self._y + (self._radius - (3 * (p // 4 % 2))) * cos( (self._old_frame + p) * pi / 40) # Clear old wave. if self._old_frame != 0: self._screen.move(f(0), g(0)) for x in range(81): self._screen.draw(f(x), g(x), char=" ") # Draw new one self._old_frame += self._direction self._screen.move(f(0), g(0)) for x in range(81): self._screen.draw(f(x), g(x), colour=self._colour) @property def stop_frame(self): return self._stop_frame class RandomNoise(Effect): """ White noise effect - like an old analogue TV set that isn't quite tuned right. If desired, a signal image (from a renderer) can be specified that will appear from the noise. """ def __init__(self, screen, signal=None, jitter=6, **kwargs): """ :param screen: The Screen being used for the Scene. :param signal: The renderer to use as the 'signal' in the white noise. :param jitter: The amount that the signal will jump when there is noise. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._signal = signal self._strength = 0.0 self._step = 0.0 self._jitter = jitter def reset(self): self._strength = 0.0 self._step = -0.01 def _update(self, frame_no): if self._signal: start_x = int((self._screen.width - self._signal.max_width) // 2) start_y = int((self._screen.height - self._signal.max_height) // 2) text, colours = self._signal.rendered_text else: start_x = start_y = 0 text, colours = "", [] for y in range(self._screen.height): if self._strength < 1.0: jitter = int(self._jitter - self._jitter * self._strength) offset = jitter - 2 * randint(0, jitter) else: offset = 0 for x in range(self._screen.width): ix = x - start_x iy = y - start_y if (self._signal and random() <= self._strength and x >= start_x and y >= start_y and iy < len(text) and 0 <= ix < len(text[iy])): self._screen.paint(text[iy][ix], x + offset, y, colour_map=[colours[iy][ix]]) else: if random() < 0.2: self._screen.print_at(chr(randint(33, 126)), x, y) # Tune the signal self._strength += self._step if self._strength >= 1.25 or self._strength <= -0.5: self._step = -self._step @property def stop_frame(self): return self._stop_frame class Julia(Effect): """ Julia Set generator. See http://en.wikipedia.org/wiki/Julia_set for more information on this fractal. """ # Character set to use so we still get a grey scale for low-colour systems. _greyscale = '@@&&99##GGHHhh3322AAss;;::.. ' # Colour palette for 256 colour xterm mode. _256_palette = [196, 202, 208, 214, 220, 226, 154, 118, 82, 46, 47, 48, 49, 50, 51, 45, 39, 33, 27, 21, 57, 93, 129, 201, 200, 199, 198, 197, 0] def __init__(self, screen, c=None, **kwargs): """ :param screen: The Screen being used for the Scene. :param c: The starting value of 'c' for the Julia Set. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._width = screen.width self._height = screen.height self._centre = [0.0, 0.0] self._size = [4.0, 4.0] self._min_x = self._min_y = -2.0 self._max_x = self._max_y = 2.0 self._c = c if c is not None else [-0.8, 0.156] self._scale = 0.995 def reset(self): pass def _update(self, frame_no): # Draw the new image to the required block. c = complex(self._c[0], self._c[1]) sx = self._centre[0] - (self._size[0] / 2.0) sy = self._centre[1] - (self._size[1] / 2.0) for y in range(self._height): for x in range(self._width): z = complex(sx + self._size[0] * (x / self._width), sy + self._size[1] * (y / self._height)) n = len(self._256_palette) while abs(z) < 10 and n >= 1: z = z ** 2 + c n -= 1 colour = \ self._256_palette[ n - 1] if self._screen.colours >= 256 else 7 self._screen.print_at(self._greyscale[n - 1], x, y, colour) # Zoom self._size = [i * self._scale for i in self._size] area = self._size[0] * self._size[1] if area <= 4.0 or area >= 16: self._scale = 1.0 / self._scale # Rotate self._c = [self._c[0] * cos(pi / 180) - self._c[1] * sin(pi / 180), self._c[0] * sin(pi / 180) + self._c[1] * cos(pi / 180)] @property def stop_frame(self): return self._stop_frame class Background(Effect): """ Effect to be used as a Desktop background. This sets the background to the specified colour. """ def __init__(self, screen, bg=0, **kwargs): """ :param screen: The Screen being used for the Scene. :param bg: Optional colour for the background. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._bg = bg def reset(self): pass def _update(self, frame_no): self._screen.clear_buffer(7, 0, self._bg) @property def frame_update_count(self): return 1000000 @property def stop_frame(self): return self._stop_frame python-asciimatics-1.15.0/asciimatics/event.py000066400000000000000000000034041511423144500213730ustar00rootroot00000000000000""" This module defines basic input events. For more details, see http://asciimatics.readthedocs.io/en/latest/.html """ class Event(): """ A class to hold information about an input event. The exact contents varies from event to event. See specific classes for more information. """ class KeyboardEvent(Event): """ An event that represents a key press. Its key field is the `key_code`. This is the ordinal representation of the key (taking into account keyboard state - e.g. caps lock) if possible, or an extended key code (the `KEY_xxx` constants in the :py:obj:`.Screen` class) where not. """ def __init__(self, key_code): """ :param key_code: the ordinal value of the key that was pressed. """ self.key_code = key_code def __repr__(self): """ :returns: a string representation of the keyboard event. """ return f"KeyboardEvent: {self.key_code}" class MouseEvent(Event): """ An event that represents a mouse move or click. Allowed values for the buttons are any bitwise combination of `LEFT_CLICK`, `RIGHT_CLICK` and `DOUBLE_CLICK`. """ # Mouse button states - bitwise flags LEFT_CLICK = 1 RIGHT_CLICK = 2 DOUBLE_CLICK = 4 def __init__(self, x, y, buttons): """ :param x: The X coordinate of the mouse event. :param y: The Y coordinate of the mouse event. :param buttons: A bitwise flag for any mouse buttons that were pressed (if any). """ self.x = x self.y = y self.buttons = buttons def __repr__(self): """ :returns: a string representation of the mouse event. """ return f"MouseEvent ({self.x}, {self.y}) {self.buttons}" python-asciimatics-1.15.0/asciimatics/exceptions.py000066400000000000000000000054321511423144500224360ustar00rootroot00000000000000""" This module defines the exceptions used by asciimatics. """ class ResizeScreenError(Exception): """ Asciimatics raises this Exception if the terminal is resized while playing a Scene (and the Screen has been told not to ignore a resizing event). """ def __init__(self, message, scene=None): """ :param message: Error message for this exception. :param scene: Scene that was active at time of resize. """ super().__init__() self._scene = scene self._message = message def __str__(self): """ Printable form of the exception. """ return self._message @property def scene(self): """ The Scene that was running when the Screen resized. """ return self._scene class StopApplication(Exception): """ Any component can raise this exception to tell Asciimatics to stop running. If playing a Scene (i.e. inside `Screen.play()`) the Screen will return to the calling function. When used at any other time, the exception will need to be caught by the application using Asciimatics. """ def __init__(self, message): """ :param message: Error message for this exception. """ super().__init__() self._message = message def __str__(self): """ Printable form of the exception. """ return self._message class NextScene(Exception): """ Any component can raise this exception to tell Asciimatics to move to the next Scene being played. Only effective inside `Screen.play()`. """ def __init__(self, name=None): """ :param name: Next Scene to invoke. Defaults to next in the list. """ super().__init__() self._name = name @property def name(self): """ The name of the next Scene to invoke. """ return self._name class InvalidFields(Exception): """ When saving data from a Frame, you can ask the Frame to validate the data before saving. This is the exception that gets thrwn if any invalid data is found. """ def __init__(self, fields): """ :param fields: The list of the fields that are invalid. """ super().__init__() self._fields = fields @property def fields(self): """ The list of fields that are invalid. """ return self._fields class Highlander(Exception): """ There can be only one Layout or Widget with certain options set (designed to fill the rest of the screen). If you hit this exception you have a bug in your application. If you don't get the name, take a look at `this link `__. """ python-asciimatics-1.15.0/asciimatics/parsers.py000066400000000000000000000434611511423144500217400ustar00rootroot00000000000000""" This module provides parsers to create ColouredText objects from embedded control strings. """ import re from abc import ABCMeta, abstractmethod from logging import getLogger from asciimatics import constants from asciimatics.utilities import _DotDict # Diagnostic logging logger = getLogger(__name__) class Parser(metaclass=ABCMeta): """ Abstract class to represent text parsers that extract colour control codes from raw text and convert them to displayable text and associated colour maps. """ #: Command to display some text. Parameter is the text to display DISPLAY_TEXT = 0 #: Command to change active colour tuple. Parameters are the 3-tuple of (fg, attr, bg) CHANGE_COLOURS = 1 #: Command to move cursor to abs position. Parameters are (x, y) where each are absolute positions. MOVE_ABSOLUTE = 2 #: Command to move cursor to relative position. Parameters are (x, y) where each are relative positions. MOVE_RELATIVE = 3 #: Command to delete part of the current line. Params are 0, 1 and 2 for end, start, all. DELETE_LINE = 4 #: Command to delete next N characters from this line. DELETE_CHARS = 5 #: Next tab stop NEXT_TAB = 6 #: Set cursor visibility. Param is boolean setting True=visible SHOW_CURSOR = 7 #: Clear the screen. No parameters. CLEAR_SCREEN = 8 #: Save the cursor position. No parameters. SAVE_CURSOR = 9 #: Restore the cursor position. No parameters. RESTORE_CURSOR = 10 def __init__(self): """ Initialize the parser. """ self._state = None def reset(self, text, colours): """ Reset the parser to analyze the supplied raw text. :param text: raw text to process. :param colours: colour tuple to initialise the colour map. """ self._state = _DotDict() self._state.text = text # Force colours to be mutable (in case a tuple was passed in). self._state.attributes = list(x for x in colours) if colours else None @abstractmethod def parse(self): """ Generator to return coloured text from raw text. Generally returns a stream of text/color tuple/offset tuples. If there is a colour update with no visible text, the first element of the tuple may be None. :returns: a 3-tuple of (start offset in raw text, command to execute, parameters) """ def append(self, text): """ Append more text to the current text being processed. :param text: raw text to process. """ self._state.text += text class ControlCodeParser(Parser): """ Parser to replace all control codes with a readable version - e.g. "^M" for carriage return. """ def parse(self): """ Generator to return coloured text from raw text. :returns: a 3-tuple of (start offset in raw text, command to execute, parameters) """ if self._state.attributes: yield (0, Parser.CHANGE_COLOURS, tuple(self._state.attributes)) offset = 0 while len(self._state.text) > 0: letter = self._state.text[0] if ord(letter) < 32: yield (offset, Parser.DISPLAY_TEXT, "^" + chr(ord("@") + ord(letter))) else: yield (offset, Parser.DISPLAY_TEXT, letter) offset += 1 self._state.text = self._state.text[1:] class AsciimaticsParser(Parser): """ Parser to handle Asciimatics rendering escape strings. """ # Regular expression for use to find colour sequences in multi-colour text. # It should match ${n}, ${m,n} or ${m,n,o} _colour_sequence = re.compile(constants.COLOUR_REGEX) def parse(self): """ Generator to return coloured text from raw text. :returns: a 3-tuple of (start offset in raw text, command to execute, parameters) """ if self._state.attributes: yield (0, Parser.CHANGE_COLOURS, tuple(self._state.attributes)) offset = last_offset = 0 while len(self._state.text) > 0: match = self._colour_sequence.match(str(self._state.text)) if match is None: yield (last_offset, Parser.DISPLAY_TEXT, self._state.text[0]) self._state.text = self._state.text[1:] offset += 1 last_offset = offset else: # The regexp either matches: # - 2,3,4 for ${c,a,b} # - 5,6 for ${c,a} # - 7 for ${c}. if match.group(2) is not None: attributes = (int(match.group(2)), constants.MAPPING_ATTRIBUTES[match.group(3)], int(match.group(4))) elif match.group(5) is not None: attributes = (int(match.group(5)), constants.MAPPING_ATTRIBUTES[match.group(6)], None) else: attributes = (int(match.group(7)), 0, None) yield (last_offset, Parser.CHANGE_COLOURS, attributes) offset += 3 + len(match.group(1)) self._state.text = match.group(8) class AnsiTerminalParser(Parser): """ Parser to handle ANSI terminal escape codes. """ # Regular expression for use to find colour sequences in multi-colour text. _colour_sequence = re.compile(r"^(\x1B\[([^@-~]*)([@-~]))(.*)") _os_cmd = re.compile(r"^(\x1B].*\x07)(.*)") def reset(self, text, colours): """ Reset the parser to analyze the supplied raw text. :param text: raw text to process. :param colours: colour tuple to initialise the colour map. """ super().reset(text, colours) if self._state.attributes is None: self._state.init_colours = False self._state.attributes = [None, None, None] else: self._state.init_colours = True self._state.offset = 0 self._state.last_offset = 0 self._state.cursor = 0 def parse(self): def _handle_escape(st): match = self._colour_sequence.match(str(st.text)) if match is None: # Not a CSI sequence... Check for some other options. match = self._os_cmd.match(str(st.text)) if match: # OS command - just swallow it. return len(match.group(1)), None elif len(st.text) > 1 and st.text[1] == "M": # Reverse Index - i.e. move up/scroll return 2, [(st.last_offset, Parser.MOVE_RELATIVE, (0, -1))] # Unknown escape - guess how many characters to ignore - most likely just the next char # unless we can see the start of a new sequence. logger.debug("Ignoring: %s", st.text[0:2]) if len(st.text) < 2: return -1, None if st.text[1] in ("[", "]"): return -1, None return (2, None) if st.text[1] != "(" else (3, None) else: # CSI sequence - look for the various options... results = [] if match.group(3) == "m": # We have found a SGR escape sequence ( CSI ... m ). These have zero or more # embedded arguments, so create a simple FSM to process the parameter stream. in_set_mode = False in_index_mode = False in_rgb_mode = False skip_size = 0 attribute_index = 0 last_attributes = tuple(st.attributes) for parameter in match.group(2).split(";"): try: parameter = int(parameter) except ValueError: parameter = 0 if in_set_mode: # We are processing a set fore/background colour code if parameter == 5: in_index_mode = True elif parameter == 2: in_rgb_mode = True skip_size = 3 else: logger.info(("Unexpected colour setting", parameter)) break in_set_mode = False elif in_index_mode: # We are processing a 5;n sequence for colour indices st.attributes[attribute_index] = parameter in_index_mode = False elif in_rgb_mode: # We are processing a 2;r;g;b sequence for RGB colours - just ignore. skip_size -= 1 if skip_size <= 0: in_rgb_mode = False else: # top-level stream processing if parameter == 0: # Reset st.attributes = [constants.COLOUR_WHITE, constants.A_NORMAL, constants.COLOUR_BLACK] elif parameter == 1: # Bold st.attributes[1] = constants.A_BOLD elif parameter in (2, 22): # Faint/normal - faint not supported so treat as normal st.attributes[1] = constants.A_NORMAL elif parameter == 7: # Inverse st.attributes[1] = constants.A_REVERSE elif parameter == 27: # Inverse off - assume that means normal st.attributes[1] = constants.A_NORMAL elif parameter in range(30, 38): # Standard foreground colours st.attributes[0] = parameter - 30 elif parameter in range(40, 48): # Standard background colours st.attributes[2] = parameter - 40 elif parameter == 38: # Set foreground colour - next parameter is either 5 (index) or 2 (RGB color) in_set_mode = True attribute_index = 0 elif parameter == 48: # Set background colour - next parameter is either 5 (index) or 2 (RGB color) in_set_mode = True attribute_index = 2 elif parameter == 39: # Default foreground colour st.attributes[0] = -1 elif parameter == 49: # Default background colour st.attributes[2] = -1 elif parameter in range(90, 98): # Bright foreground colours st.attributes[0] = parameter - 82 elif parameter in range(100, 108): # Bright background colours st.attributes[2] = parameter - 92 else: logger.debug("Ignoring parameter: %s", parameter) new_attributes = tuple(st.attributes) if last_attributes != new_attributes: results.append((st.last_offset, Parser.CHANGE_COLOURS, new_attributes)) elif match.group(3) == "K": # This is a line delete sequence. Parameter defines which parts to delete. param = match.group(2) if param in ("", "0"): # Delete to end of line results.append((self._state.last_offset, Parser.DELETE_LINE, 0)) elif param == "1": # Delete from start of line results.append((self._state.last_offset, Parser.DELETE_LINE, 1)) elif param == "2": # Delete whole line results.append((self._state.last_offset, Parser.DELETE_LINE, 2)) elif match.group(3) == "P": # This is a character delete sequence. Parameter defines how many to delete. param = 1 if match.group(2) == "" else int(match.group(2)) results.append((self._state.last_offset, Parser.DELETE_CHARS, param)) elif match.group(3) == "A": # Move cursor up. Parameter defines how far to move.. param = 1 if match.group(2) == "" else int(match.group(2)) results.append((self._state.last_offset, Parser.MOVE_RELATIVE, (0, -param))) elif match.group(3) == "B": # Move cursor down. Parameter defines how far to move.. param = 1 if match.group(2) == "" else int(match.group(2)) results.append((self._state.last_offset, Parser.MOVE_RELATIVE, (0, param))) elif match.group(3) == "C": # Move cursor forwards. Parameter defines how far to move.. param = 1 if match.group(2) == "" else int(match.group(2)) results.append((self._state.last_offset, Parser.MOVE_RELATIVE, (param, 0))) elif match.group(3) == "D": # Move cursor backwards. Parameter defines how far to move.. param = 1 if match.group(2) == "" else int(match.group(2)) results.append((self._state.last_offset, Parser.MOVE_RELATIVE, (-param, 0))) elif match.group(3) == "H": # Move cursor to specified position. x, y = 0, 0 params = match.group(2).split(";") y = int(params[0]) - 1 if params[0] != "" else 0 if len(params) > 1: x = int(params[1]) - 1 if params[1] != "" else 0 results.append((self._state.last_offset, Parser.MOVE_ABSOLUTE, (x, y))) elif match.group(3) == "h" and match.group(2) == "?25": # Various DEC private mode commands - look for cursor visibility, ignore others. results.append((self._state.last_offset, Parser.SHOW_CURSOR, True)) elif match.group(3) == "l" and match.group(2) == "?25": # Various DEC private mode commands - look for cursor visibility, ignore others. results.append((self._state.last_offset, Parser.SHOW_CURSOR, False)) elif match.group(3) == "h" and match.group(2) == "?1049": # This should really create an alternate screen, but clearing is a close # approximation results.append((self._state.last_offset, Parser.CLEAR_SCREEN, None)) elif match.group(3) == "l" and match.group(2) == "?1049": # This should really return to the normal screen, but clearing is a close # approximation results.append((self._state.last_offset, Parser.CLEAR_SCREEN, None)) elif match.group(3) == "J" and match.group(2) == "2": # Clear the screen. results.append((self._state.last_offset, Parser.CLEAR_SCREEN, None)) elif match.group(3) == "s": # Save cursor pos results.append((self._state.last_offset, Parser.SAVE_CURSOR, None)) elif match.group(3) == "u": # Restore cursor pos results.append((self._state.last_offset, Parser.RESTORE_CURSOR, None)) else: logger.debug("Ignoring control: %s", match.group(1)) return len(match.group(1)), results if self._state.init_colours: self._state.init_colours = False yield (0, Parser.CHANGE_COLOURS, tuple(self._state.attributes)) while len(self._state.text) > 0: char = ord(self._state.text[0]) new_offset = 1 if char > 31: yield (self._state.last_offset, Parser.DISPLAY_TEXT, self._state.text[0]) self._state.last_offset = self._state.offset + 1 elif char == 7: # Bell - ignore pass elif char == 8: # Back space yield (self._state.last_offset, Parser.MOVE_RELATIVE, (-1, 0)) elif char == 9: # Tab yield (self._state.last_offset, Parser.NEXT_TAB, None) elif char == 13: # Carriage return yield (self._state.last_offset, Parser.MOVE_ABSOLUTE, (0, None)) elif char == 27: new_offset, results = _handle_escape(self._state) if new_offset == -1: break if results is not None: yield from results else: logger.debug("Ignoring character: %d", char) yield (self._state.last_offset, Parser.DISPLAY_TEXT, " ") self._state.last_offset = self._state.offset + 1 self._state.offset += new_offset self._state.text = self._state.text[new_offset:] python-asciimatics-1.15.0/asciimatics/particles.py000066400000000000000000000757301511423144500222530ustar00rootroot00000000000000""" This module implements a particle system for complex animcation effects. For more details, see http://asciimatics.readthedocs.io/en/latest/animation.html """ from abc import ABCMeta, abstractmethod from copy import copy from math import pi, sin, cos, sqrt from random import uniform, randint from asciimatics.effects import Effect from asciimatics.screen import Screen class Particle(): """ A single particle in a Particle Effect. """ def __init__(self, chars, x, y, dx, dy, colours, life_time, move, next_colour=None, next_char=None, parm=None, on_create=None, on_each=None, on_destroy=None): """ :param chars: String of characters to use for the particle. :param x: The initial horizontal position of the particle. :param y: The initial vertical position of the particle. :param dx: The initial horizontal velocity of the particle. :param dy: The initial vertical velocity of the particle. :param colours: A list of colour tuples to use for the particle. :param life_time: The life time of the particle. :param move: A function which returns the next location of the particle. :param next_colour: An optional function to return the next colour for the particle. Defaults to a linear progression of `chars`. :param next_char: An optional function to return the next character for the particle. Defaults to a linear progression of `colours`. :param parm: An optional parameter for use within any of the :param on_create: An optional function to spawn new particles when this particle first is created. :param on_each: An optional function to spawn new particles for every frame of this particle (other than creation/destruction). :param on_destroy: An optional function to spawn new particles when this particle is destroyed. """ self.chars = chars self.x = x self.y = y self.dx = dx self.dy = dy self.colours = colours self.time = 0 self.life_time = life_time self._move = move self._next_colour = ( self._default_next_colour if next_colour is None else next_colour) self._next_char = ( self._default_next_char if next_char is None else next_char) self._last = None self.parm = parm self._on_create = on_create self._on_each = on_each self._on_destroy = on_destroy @staticmethod def _default_next_char(particle): """ Default next character implementation - linear progression through each character. """ return particle.chars[ (len(particle.chars) - 1) * particle.time // particle.life_time] @staticmethod def _default_next_colour(particle): """ Default next colour implementation - linear progression through each colour tuple. """ return particle.colours[ (len(particle.colours) - 1) * particle.time // particle.life_time] def last(self): """ The last attributes returned for this particle - typically used for clearing out the particle on the next frame. See :py:meth:`.next` for details of the returned results. """ return self._last def next(self): """ The set of attributes for this particle for the next frame to be rendered. :returns: A tuple of (character, x, y, fg, attribute, bg) """ # Get next particle details x, y = self._move(self) colour = self._next_colour(self) char = self._next_char(self) self._last = char, x, y, colour[0], colour[1], colour[2] self.time += 1 # Trigger any configured events if self.time == 1 and self._on_create is not None: self._on_create(self) elif self.life_time == self.time and self._on_destroy is not None: self._on_destroy(self) elif self._on_each is not None: self._on_each(self) return self._last class ParticleEmitter(): """ An emitter for a particle system to create a set of :py:obj:`._Particle` objects for a :py:obj:`.ParticleEffect`. After initialization, the emitter will be called once per frame to be displayed on the Screen. """ def __init__(self, screen, x, y, count, new_particle, spawn, life_time, blend=False): """ :param screen: The screen to which the particle system will be rendered. :param x: The x location of origin of the particle system. :param y: The y location of origin of the particle system. :param count: The count of new particles to spawn on each frame. :param new_particle: The function to call to spawn a new particle. :param spawn: The number of frames for which to spawn particles. :param life_time: The life time of the whole particle system. :param blend: Whether to blend particles or not. A blended system picks the colour based on the number of overlapping particles, while an unblended one picks the colour based on a the state of Each Particle individually as they are drawn. Defaults to False. """ super().__init__() self._screen = screen self._x = x self._y = y self._count = count self._new_particle = new_particle self._life_time = life_time self.particles = [] self.time_left = spawn self._blend = blend @staticmethod def _find_colour(particle, start_index, screen_data): """ Helper function to find an existing colour in the particle palette. """ _, fg2, attr2, bg2 = screen_data index = start_index for i, colours in enumerate(particle.colours): if (fg2, attr2, bg2) == colours: index = i break return index def update(self): """ The function to draw a new frame for the particle system. """ # Spawn new particles if required if self.time_left > 0: self.time_left -= 1 for _ in range(self._count): new_particle = self._new_particle() if new_particle is not None: self.particles.append(new_particle) # Now draw them all for particle in self.particles: # Clear our the old particle last = particle.last() if last is not None: char, x, y, fg, attr, bg = last screen_data = self._screen.get_from(x, y) if self._blend and screen_data: index = self._find_colour(particle, 0, screen_data) - 1 fg, attr, bg = particle.colours[max(index, 0)] self._screen.print_at(" ", x, y, fg, attr, bg) if particle.time < particle.life_time: # Draw the new one char, x, y, fg, attr, bg = particle.next() screen_data = self._screen.get_from(x, y) if self._blend and screen_data: index = self._find_colour(particle, -1, screen_data) + 1 fg, attr, bg = \ particle.colours[min(index, len(particle.colours) - 1)] self._screen.print_at(char, x, y, fg, attr, bg) else: self.particles.remove(particle) class ParticleEffect(Effect, metaclass=ABCMeta): """ An Effect that uses a :py:obj:`.ParticleEmitter` to create the animation. To define a new ParticleEffect, you must implement the reset() method to construct a chain of ParticleEmitter objects and append them to the internal _active_systems list. """ def __init__(self, screen, x, y, life_time, **kwargs): """ :param screen: The Screen being used for the Scene. :param x: The column (x coordinate) for the origin of the effect. :param y: The line (y coordinate) for the origin of the effect. :param life_time: The life time of the effect. Also see the common keyword arguments in :py:obj:`.Effect`. """ super().__init__(screen, **kwargs) self._x = x self._y = y self._life_time = life_time self._active_systems = [] self.reset() @abstractmethod def reset(self): """ Reset the particle effect back to its initial state. This must be implemented by the child classes. """ def _update(self, frame_no): # Take a copy in case a new system is added to the list this iteration. for system in copy(self._active_systems): if len(system.particles) > 0 or system.time_left > 0: system.update() else: self._active_systems.remove(system) @property def stop_frame(self): return self._stop_frame class Rocket(ParticleEmitter): """ A rocket being launched from the ground. """ def __init__(self, screen, x, y, life_time, on_destroy=None): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of the rocket. :param y: The line (y coordinate) for the origin of the rocket. :param life_time: The life time of the rocket. :param on_destroy: The function to call when the rocket explodes. """ super().__init__( screen, x, screen.height - 1, 1, self._next_particle, 1, life_time) self._end_y = y self._acceleration = (self._end_y - self._y) // life_time self._on_destroy = on_destroy def _next_particle(self): return Particle("|", self._x, self._y, 0, self._acceleration, [(Screen.COLOUR_YELLOW, Screen.A_BOLD, 0)], self._life_time, self._move, on_destroy=self._on_destroy) def _move(self, particle): particle.x += particle.dx particle.y += particle.dy if particle.y <= self._end_y: # Rounding errors may mean we need to end slightly early. particle.y = self._end_y particle.time = self._life_time - 1 return int(particle.x), int(particle.y) class RingExplosion(ParticleEmitter): """ A classic firework explosion in a simple ring. """ def __init__(self, screen, x, y, life_time): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of this explosion. :param y: The line (y coordinate) for the origin of this explosion. :param life_time: The life time of this explosion. """ super().__init__( screen, x, y, 30, self._next_particle, 1, life_time) self._colour = randint(1, 7) self._acceleration = 1.0 - (1.0 / life_time) def _next_particle(self): direction = uniform(0, 2 * pi) return Particle("***:. ", self._x, self._y, sin(direction) * 3 * 8 / self._life_time, cos(direction) * 1.5 * 8 / self._life_time, [(self._colour, Screen.A_BOLD, 0), (self._colour, 0, 0), (0, 0, 0)], self._life_time, self._explode) def _explode(self, particle): # Simulate some gravity and slowdown in explosion particle.dy = particle.dy * self._acceleration + 0.03 particle.dx *= self._acceleration particle.x += particle.dx particle.y += particle.dy return int(particle.x), int(particle.y) class SerpentExplosion(ParticleEmitter): """ A firework explosion where each trail changes direction. """ def __init__(self, screen, x, y, life_time): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of this explosion. :param y: The line (y coordinate) for the origin of this explosion. :param life_time: The life time of this explosion. """ super().__init__( screen, x, y, 8, self._next_particle, 2, life_time) self._colour = randint(1, 7) def _next_particle(self): direction = uniform(0, 2 * pi) acceleration = uniform(0, 2 * pi) return Particle("++++- ", self._x, self._y, cos(direction), sin(direction) / 2, [(self._colour, Screen.A_BOLD, 0), (0, 0, 0)], self._life_time, self._explode, parm=acceleration) @staticmethod def _explode(particle): # Change direction like a serpent firework. if particle.time % 3 == 0: particle.parm = uniform(0, 2 * pi) particle.dx = (particle.dx + cos(particle.parm) / 2) * 0.8 particle.dy = (particle.dy + sin(particle.parm) / 4) * 0.8 particle.x += particle.dx particle.y += particle.dy return int(particle.x), int(particle.y) class StarExplosion(ParticleEmitter): """ A classic firework explosion to a Peony shape with trails. """ def __init__(self, screen, x, y, life_time, points, on_each): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of this explosion. :param y: The line (y coordinate) for the origin of this explosion. :param life_time: The life time of this explosion. :param points: Number of points the explosion should have. :param on_each: The function to call to spawn a trail. """ super().__init__( screen, x, y, points, self._next_particle, 1, life_time) self._colour = randint(1, 7) self._acceleration = 1.0 - (1.0 / life_time) self._on_each = on_each self._points = points self._point_count = 0 def _next_particle(self): direction = self._point_count * 2 * pi / self._points self._point_count += 1 return Particle("+", self._x, self._y, sin(direction) * 3 * 8 / self._life_time, cos(direction) * 1.5 * 8 / self._life_time, [(self._colour, Screen.A_BOLD, 0), (0, 0, 0)], self._life_time, self._explode, on_each=self._on_each) def _explode(self, particle): # Simulate some gravity and slowdown in explosion particle.dy = particle.dy * self._acceleration + 0.03 particle.dx *= self._acceleration particle.x += particle.dx particle.y += particle.dy return int(particle.x), int(particle.y) class StarTrail(ParticleEmitter): """ A trail for a :py:obj:`.StarExplosion`. """ def __init__(self, screen, x, y, life_time, colour): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of this trail. :param y: The line (y coordinate) for the origin of this trail. :param life_time: The life time of this trail. :param colour: The colour of this trail. """ super().__init__( screen, x, y, 1, self._next_particle, 1, life_time) self._colour = colour def _next_particle(self): return Particle("+:,. ", self._x, self._y, 0, 0, [(self._colour, Screen.A_BOLD, 0), (self._colour, 0, 0), (0, 0, 0)], self._life_time, self._twinkle) @staticmethod def _twinkle(particle): # Simulate some gravity particle.dy += 0.03 particle.y += particle.dy return int(particle.x), int(particle.y) class PalmExplosion(ParticleEmitter): """ A classic firework explosion into a palm shape. """ def __init__(self, screen, x, y, life_time, on_each=None): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of this explosion. :param y: The line (y coordinate) for the origin of this explosion. :param life_time: The life time of this explosion. :param on_each: The function to call to spawn a trail. """ super().__init__( screen, x, y, 6, self._next_particle, 2, life_time) self._colour = randint(1, 7) self._on_each = on_each self._arc_start = uniform(pi / 6, pi / 3) self._arc_end = self._arc_start + uniform(pi / 6, pi / 2) def _next_particle(self): direction = uniform(self._arc_start, self._arc_end) return Particle("* ", self._x, self._y, cos(direction) * 1.5, -sin(direction), [(self._colour, Screen.A_BOLD, 0), (0, 0, 0)], self._life_time, self._explode, on_each=self._on_each) @staticmethod def _explode(particle): # Simulate some gravity particle.dy += 0.2 particle.x += particle.dx particle.y += particle.dy return int(particle.x), int(particle.y) class ExplosionFlames(ParticleEmitter): """ An explosion of flame and smoke. """ def __init__(self, screen, x, y, life_time): """ :param screen: The Screen being used for this particle system. :param x: The column (x coordinate) for the origin of this explosion. :param y: The line (y coordinate) for the origin of this explosion. :param life_time: The life time of this explosion. """ super().__init__( screen, x, y, 30, self._next_particle, life_time - 10, life_time, blend=True) def _next_particle(self): direction = uniform(0, 2 * pi) d = self._life_time - 10 r = uniform(0, sin(pi * (d - self.time_left) / (d * 2))) * 3.0 return Particle("#", self._x + sin(direction) * r * 2.0, self._y + cos(direction) * r, sin(direction) / 2.0, cos(direction) / 4.0, [ (Screen.COLOUR_BLACK, 0, 0), (Screen.COLOUR_RED, 0, 0), (Screen.COLOUR_RED, Screen.A_BOLD, 0), (Screen.COLOUR_YELLOW, Screen.A_BOLD, 0), (Screen.COLOUR_WHITE, Screen.A_BOLD, 0), ], 10, self._burn, next_colour=self._colour) @staticmethod def _burn(particle): particle.x += particle.dx particle.y += particle.dy return int(particle.x), int(particle.y) @staticmethod def _colour(particle): return particle.colours[0] class DropEmitter(ParticleEmitter): """ Replicate the whole screen with Particles and then drop them a cell at a time. """ def __init__(self, screen, life_time): """ :param screen: The Screen being used for this particle system. :param life_time: The life time of this particle system. """ super().__init__( screen, 0, 0, 20, self._next_particle, life_time, life_time) self._particles = None self._full_count = 0 def _next_particle(self): # Find all particles on the Screen when we create our first particle. if self._particles is None: self._particles = [] for x in range(self._screen.width): for y in range(self._screen.height): ch, fg, attr, bg = self._screen.get_from(x, y) if ch != 32: self._particles.insert( randint(0, len(self._particles)), (x, y, ch, fg, attr, bg)) self._full_count += 1 # Stop now if there were no more particles to move. if len(self._particles) == 0: return None # We got here, so there must still be some screen estate to move. if randint(0, len(self._particles)) < self._full_count * 0.1: x, y, ch, fg, attr, bg = self._particles.pop() return Particle(chr(ch), x, y, 0.0, 0.0, [(fg, attr, bg)], self._life_time, self._move) # Keep lint happy return None @staticmethod def _move(particle): result = int(particle.x), int(particle.y) particle.x += particle.dx particle.y += particle.dy particle.dy += 0.3 return result class ShotEmitter(ParticleEmitter): """ Replicate the whole screen with Particles and then explode the screen from a given location. """ def __init__(self, screen, x, y, diameter, life_time): """ :param screen: The Screen being used for this particle system. :param x: The x position of the origin of the explosion. :param y: The y position of the origin of the explosion. :param diameter: The diameter of the explosion. :param life_time: The life time of this particle system. """ super().__init__( screen, x, y, 50, self._next_particle, life_time, life_time) self._particles = None self._diameter = diameter def _next_particle(self): # Find all particles on the Screen when we create our first particle # and sort by distance from the origin. if self._particles is None: self._particles = [] for x in range(self._screen.width): for y in range(self._screen.height): ch, fg, attr, bg = self._screen.get_from(x, y) if ch != 32: self._particles.append((x, y, ch, fg, attr, bg)) if self._diameter: self._particles = filter(self._filter, self._particles) self._particles = sorted(self._particles, key=self._sort, reverse=True) # Stop now if there were no more particles to move. if len(self._particles) == 0: return None # We got here, so there must still be some screen estate to move. x, y, ch, fg, attr, bg = self._particles.pop() r = min(10, max(0.001, sqrt(((x - self._x) ** 2) + ((y - self._y) ** 2)))) return Particle(chr(ch), x, y, (x - self._x) * 40.0 / r ** 2, (y - self._y) * 20.0 / r ** 2, [(fg, attr, bg)], self._life_time, self._move) def _sort(self, data): dx = data[0] - self._x dy = data[1] - self._y return (dx * dx / 4.0) + (dy * dy) def _filter(self, data): dx = data[0] - self._x dy = data[1] - self._y return dx ** 2 / 4.0 + dy ** 2 < self._diameter ** 2 / 4.0 @staticmethod def _move(particle): result = int(particle.x), int(particle.y) if (particle.dx, particle.dy) == (0, 0): particle.dx, particle.dy = 100, 100 particle.x += particle.dx particle.y += particle.dy return result class RainSource(ParticleEmitter): """ Source of the raindrops for a rain storm effect. This emits rain drops from a single line at the top of the screen (starting sufficiently off- screen to ensure that it can cover all the screen due to horizontal motion). """ def __init__(self, screen, life_time, on_each): """ :param screen: The Screen being used for this particle system. :param life_time: The life time of this particle system. :param on_each: Function to call on each iteration of the particle. """ super().__init__( screen, 0, 0, 4, self._next_particle, life_time, life_time) self._particles = None self._on_each = on_each def _next_particle(self): speed = randint(1, 3) return Particle(" ``\\"[speed], randint(-self._screen.height, self._screen.width), 0, (speed + 1) / 2.0, (speed + 1) / 2.0, [(Screen.COLOUR_CYAN, 0, 0)], self._life_time, self._move, on_each=self._on_each) @staticmethod def _move(particle): particle.x += particle.dx particle.y += particle.dy return int(particle.x), int(particle.y) class Splash(ParticleEmitter): """ Splash effect for falling rain. """ def __init__(self, screen, x, y): """ :param screen: The Screen being used for this particle system. """ super().__init__( screen, x, y, 1, self._next_particle, 1, 3) def _next_particle(self): return Particle("v", self._x, self._y, 0, 0, [(Screen.COLOUR_CYAN, 0, 0)], self._life_time, self._splash) @staticmethod def _splash(particle): return int(particle.x), int(particle.y) class StarFirework(ParticleEffect): """ Classic rocket with star explosion. """ def reset(self): self._active_systems = [] self._active_systems.append( Rocket(self._screen, self._x, self._y, 10, on_destroy=self._next)) def _next(self, parent): self._active_systems.append( StarExplosion( self._screen, parent.x, parent.y, self._life_time - 10, randint(6, 20), on_each=self._trail)) def _trail(self, parent): if len(self._active_systems) < 150 and randint(0, 100) < 50: self._active_systems.insert( 0, StarTrail(self._screen, parent.x, parent.y, 10, parent.colours[0][0])) class RingFirework(ParticleEffect): """ Classic rocket with ring explosion. """ def reset(self): self._active_systems = [] self._active_systems.append( Rocket(self._screen, self._x, self._y, 10, on_destroy=self._next)) def _next(self, parent): self._active_systems.append(RingExplosion( self._screen, parent.x, parent.y, self._life_time - 10)) class SerpentFirework(ParticleEffect): """ A firework where each trail changes direction. """ def reset(self): self._active_systems = [] self._active_systems.append( Rocket(self._screen, self._x, self._y, 10, on_destroy=self._next)) def _next(self, parent): self._active_systems.append(SerpentExplosion( self._screen, parent.x, parent.y, self._life_time - 10)) class PalmFirework(ParticleEffect): """ Classic palm shaped firework. """ def reset(self): self._active_systems = [] self._active_systems.append( Rocket(self._screen, self._x, self._y, 10, on_destroy=self._next)) def _next(self, parent): self._active_systems.append(PalmExplosion( self._screen, parent.x, parent.y, self._life_time - 10, on_each=self._trail)) def _trail(self, parent): if len(self._active_systems) < 100 and randint(0, 100) < 80: self._active_systems.insert( 0, StarTrail(self._screen, parent.x, parent.y, 10, parent.colours[0][0])) class Explosion(ParticleEffect): """ An explosion effect. """ def reset(self): self._active_systems = [] self._active_systems.append( ExplosionFlames(self._screen, self._x, self._y, self._life_time)) class DropScreen(ParticleEffect): """ Drop all the text on the screen as if it was subject to gravity. """ def __init__(self, screen, life_time, **kwargs): """ See :py:obj:`.ParticleEffect` for details of the parameters. """ # No need for an origin as this uses the whole screen. super().__init__(screen, 0, 0, life_time, **kwargs) def reset(self): self._active_systems = [] self._active_systems.append( DropEmitter(self._screen, self._life_time)) class ShootScreen(ParticleEffect): """ Shoot the screen out like a massive gunshot. """ def __init__(self, screen, x, y, life_time, diameter=None, **kwargs): """ See :py:obj:`.ParticleEffect` for details of the parameters. In addition, it is possible to set the diameter of this effect using the extra keyword parameter. """ # Need to set the field first because the underlying constructor calls reset. self._diameter = diameter super().__init__(screen, x, y, life_time, **kwargs) def reset(self): self._active_systems = [] self._active_systems.append( ShotEmitter(self._screen, self._x, self._y, self._diameter, self._life_time)) class Rain(ParticleEffect): """ Rain storm effect. """ def __init__(self, screen, life_time, **kwargs): """ See :py:obj:`.ParticleEffect` for details of the parameters. """ # No need for an origin as this uses the whole screen. super().__init__(screen, 0, 0, life_time, **kwargs) def reset(self): self._active_systems = [] self._active_systems.append( RainSource(self._screen, self._life_time, self._collision)) def _collision(self, particle): # Already calculated new position, so go back in history _, x, y, _, _, _ = particle.last() # Note that dx = dy, so simply calculation of next point to check. current_char = None dx = 0 for dx in range(min(1, int(particle.dx))): next_point = self._screen.get_from(int(x + dx), int(y + dx)) if next_point is None: current_char = None break current_char = next_point[0] if current_char != 32: break # If there's a collision, kill this drop and make a splash. if (current_char not in [32, None, ord("`"), ord("\\"), ord("v")] or particle.y + dx >= self._screen.height): particle.time = particle.life_time self._active_systems.append( Splash(self._screen, x + dx - 1, y + dx - 1)) python-asciimatics-1.15.0/asciimatics/paths.py000066400000000000000000000155261511423144500214010ustar00rootroot00000000000000""" This module provides `Paths` to create animation effects with Sprites. For more details see http://asciimatics.readthedocs.io/en/latest/animation.html """ from abc import ABCMeta, abstractmethod def _spline(t, p0, p1, p2, p3): """ Catmull-Rom cubic spline to interpolate 4 given points. :param t: Time index through the spline (must be 0-1). :param p0: The previous point in the curve (for continuity). :param p1: The first point to interpolate. :param p2: The second point to interpolate. :param p3: The last point to interpolate. """ return ( t * ((2 - t) * t - 1) * p0 + (t * t * (3 * t - 5) + 2) * p1 + t * ((4 - 3 * t) * t + 1) * p2 + (t - 1) * t * t * p3) / 2 class _AbstractPath(metaclass=ABCMeta): """ Class to represent the motion of a Sprite. The Screen will reset() the Path before iterating through each position using next_pos() and checking whether it has reached the end using is_finished(). """ def __init__(self): """ To define a Path, use the methods to jump to a location, wait or move between points. """ self._steps = [] self._index = None self._rec_x = 0 self._rec_y = 0 @abstractmethod def reset(self): """ Reset the Path for use next time. """ @abstractmethod def next_pos(self): """ :return: The next position tuple (x, y) for the Sprite on this path. """ @abstractmethod def is_finished(self): """ :return: Whether this path has got to the end. """ class Path(_AbstractPath): """ Class to record and play back the motion of a Sprite. The Screen will reset() the Path before iterating through each position using next_pos() and checking whether it has reached the end using is_finished(). """ def __init__(self): """ To define a Path, use the methods to jump to a location, wait or move between points. """ super().__init__() self._steps = [] self._index = 0 self._rec_x = 0 self._rec_y = 0 self.reset() def reset(self): """ Reset the Path for use next time. """ self._index = 0 def next_pos(self): """ :return: The next position tuple (x, y) for the Sprite on this path. """ result = None if self._index <= len(self._steps): result = self._steps[self._index] self._index += 1 return result def is_finished(self): """ :return: Whether this path has got to the end. """ return self._index >= len(self._steps) def _add_step(self, pos): """ Add a step to the end of the current recorded path. :param pos: The position tuple (x, y) to add to the list. """ self._steps.append(pos) self._rec_x = pos[0] self._rec_y = pos[1] def wait(self, delay): """ Wait at the current location for the specified number of iterations. :param delay: The time to wait (in animation frames). """ for _ in range(0, delay): self._add_step((self._rec_x, self._rec_y)) def jump_to(self, x, y): """ Jump straight to the newly specified location - i.e. teleport there and don't create a path to get there. :param x: X coord for the end position. :param y: Y coord for the end position. """ self._add_step((x, y)) def move_straight_to(self, x, y, steps): """ Move straight to the newly specified location - i.e. create a straight line Path from the current location to the specified point. :param x: X coord for the end position. :param y: Y coord for the end position. :param steps: How many steps to take for the move. """ start_x = self._rec_x start_y = self._rec_y for i in range(1, steps + 1): self._add_step(( int(start_x + (x - start_x) / float(steps) * i), int(start_y + (y - start_y) / float(steps) * i))) def move_round_to(self, points, steps): """ Follow a path pre-defined by a set of at least 4 points. This Path will interpolate the points into a curve and follow that curve. :param points: The list of points that defines the path. :param steps: The number of steps to take to follow the path. """ # Spline interpolation needs a before and after point for the curve. # Duplicate the first and last points to handle this. We also need # to move from the current position to the first specified point. points.insert(0, (self._rec_x, self._rec_y)) points.insert(0, (self._rec_x, self._rec_y)) points.append(points[-1]) # Convert the points into an interpolated set of more detailed points. steps_per_spline = steps // (len(points) - 3) for j in range(1, len(points) - 2): for t in range(1, steps_per_spline + 1): y = _spline(float(t) / steps_per_spline, float(points[j - 1][1]), float(points[j][1]), float(points[j + 1][1]), float(points[j + 2][1])) x = int(points[j][0] + ((points[j + 1][0] - points[j][0]) * float(t) / steps_per_spline)) self._add_step((x, int(y))) class DynamicPath(_AbstractPath, metaclass=ABCMeta): """ Class to create a dynamic path that reacts to events The Screen will reset() the Path before iterating through each position using next_pos() and checking whether it has reached the end using is_finished(). """ def __init__(self, screen, x, y): """ To implement a DynamicPath, override the :py:meth:`.process_event()` method to react to any user input. """ super().__init__() self._screen = screen self._x = self._start_x = x self._y = self._start_y = y self.reset() def reset(self): """ Reset the Path for use next time. """ self._x = self._start_x self._y = self._start_y def next_pos(self): """ :return: The next position tuple (x, y) for the Sprite on this path. """ return self._x, self._y def is_finished(self): """ :return: Whether this path has got to the end. """ return False @abstractmethod def process_event(self, event): """ Process any mouse event. :param event: The event that was triggered. :returns: None if the Effect processed the event, else the original event. """ python-asciimatics-1.15.0/asciimatics/renderers/000077500000000000000000000000001511423144500216705ustar00rootroot00000000000000python-asciimatics-1.15.0/asciimatics/renderers/__init__.py000066400000000000000000000023771511423144500240120ustar00rootroot00000000000000""" This module provides `Renderers` to create complex animation effects. For more details see http://asciimatics.readthedocs.io/en/latest/rendering.html """ from asciimatics.renderers.base import Renderer, StaticRenderer, DynamicRenderer from asciimatics.renderers.box import Box from asciimatics.renderers.charts import BarChart, VBarChart from asciimatics.renderers.figlettext import FigletText from asciimatics.renderers.fire import Fire from asciimatics.renderers.images import ImageFile, ColourImageFile from asciimatics.renderers.players import AbstractScreenPlayer, AnsiArtPlayer, AsciinemaPlayer from asciimatics.renderers.kaleidoscope import Kaleidoscope from asciimatics.renderers.plasma import Plasma from asciimatics.renderers.rainbow import Rainbow from asciimatics.renderers.rotatedduplicate import RotatedDuplicate from asciimatics.renderers.scales import Scale, VScale from asciimatics.renderers.speechbubble import SpeechBubble __all__ = ["Renderer", "StaticRenderer", "DynamicRenderer", "Box", "BarChart", "VBarChart", "FigletText", "Fire", "ImageFile", "ColourImageFile", "AbstractScreenPlayer", "AnsiArtPlayer", "AsciinemaPlayer", "Kaleidoscope", "Plasma", "Rainbow", "RotatedDuplicate", "Scale", "VScale", "SpeechBubble"] python-asciimatics-1.15.0/asciimatics/renderers/base.py000066400000000000000000000205761511423144500231660ustar00rootroot00000000000000""" This module provides common code for all Renderers. """ from abc import ABCMeta, abstractmethod import re from wcwidth.wcwidth import wcswidth from asciimatics.screen import Screen, TemporaryCanvas from asciimatics.constants import COLOUR_REGEX #: Attribute conversion table for the ${c,a} form of attributes for #: :py:obj:`~.Screen.paint`. ATTRIBUTES = { "1": Screen.A_BOLD, "2": Screen.A_NORMAL, "3": Screen.A_REVERSE, "4": Screen.A_UNDERLINE, } class Renderer(metaclass=ABCMeta): """ A Renderer is simply a class that will return one or more text renderings for display by an Effect. In the simple case, this can be a single string that contains some unchanging content - e.g. a simple text message. It can also represent a sequence of strings that can be played one after the other to make a simple animation sequence - e.g. a rotating globe. """ @property @abstractmethod def max_width(self): """ :return: The max width of the rendered text (across all images if an animated renderer). """ @property @abstractmethod def rendered_text(self): """ :return: The next image and colour map in the sequence as a tuple. """ @property @abstractmethod def images(self): """ :return: An iterator of all the images in the Renderer. """ @property @abstractmethod def max_height(self): """ :return: The max height of the rendered text (across all images if an animated renderer). """ def __repr__(self): """ :returns: a plain string representation of the next rendered image. """ return "\n".join(self.rendered_text[0]) class StaticRenderer(Renderer): """ A StaticRenderer is a Renderer that can create all possible images in advance. After construction the images will not change, but can by cycled for animation purposes. This class will also convert text like ${c,a,b} into colour c, attribute a and background b for any subsequent text in the line, thus allowing multi-coloured text. The attribute and background are optional. """ # Regular expression for use to find colour sequences in multi-colour text. # It should match ${n}, ${m,n} or ${m,n,o} _colour_sequence = re.compile(COLOUR_REGEX) def __init__(self, images=None, animation=None): """ :param images: An optional set of ascii images to be rendered. :param animation: A function to pick the image (from images) to be rendered for any given frame. """ super().__init__() self._images = images if images is not None else [] self._index = 0 self._max_width = 0 self._max_height = 0 self._animation = animation self._colour_map = None self._plain_images = [] def _convert_images(self): """ Convert any images into a more Screen-friendly format. """ self._plain_images = [] self._colour_map = [] for image in self._images: colour_map = [] new_image = [] for line in image.split("\n"): new_line = "" attributes = (None, None, None) colours = [] while len(line) > 0: match = self._colour_sequence.match(line) if match is None: new_line += line[0] colours.append(attributes) line = line[1:] else: # The regexp either matches: # - 2,3,4 for ${c,a,b} # - 5,6 for ${c,a} # - 7 for ${c}. if match.group(2) is not None: attributes = (int(match.group(2)), ATTRIBUTES[match.group(3)], int(match.group(4))) elif match.group(5) is not None: attributes = (int(match.group(5)), ATTRIBUTES[match.group(6)], None) else: attributes = (int(match.group(7)), 0, None) line = match.group(8) new_image.append(new_line) colour_map.append(colours) self._plain_images.append(new_image) self._colour_map.append(colour_map) @property def images(self): """ :return: An iterator of all the images in the Renderer. """ if len(self._plain_images) <= 0: self._convert_images() return iter(self._plain_images) @property def rendered_text(self): """ :return: The next image and colour map in the sequence as a tuple. """ if len(self._plain_images) <= 0: self._convert_images() if self._animation is None: index = self._index self._index += 1 if self._index >= len(self._plain_images): self._index = 0 else: index = self._animation() return (self._plain_images[index], self._colour_map[index]) @property def max_height(self): """ :return: The max height of the rendered text (across all images if an animated renderer). """ if len(self._plain_images) <= 0: self._convert_images() if self._max_height == 0: for image in self._plain_images: self._max_height = max(len(image), self._max_height) return self._max_height @property def max_width(self): """ :return: The max width of the rendered text (across all images if an animated renderer). """ if len(self._plain_images) <= 0: self._convert_images() if self._max_width == 0: for image in self._plain_images: new_max = max(wcswidth(x) for x in image) self._max_width = max(new_max, self._max_width) return self._max_width class DynamicRenderer(Renderer, metaclass=ABCMeta): """ A DynamicRenderer is a Renderer that creates each image as requested. It has a defined maximum size on construction. """ def __init__(self, height, width, clear=True): """ :param height: The max height of the rendered image. :param width: The max width of the rendered image. """ super().__init__() self._must_clear = clear self._canvas = TemporaryCanvas(height, width) def _clear(self): """ Clear the current image. """ # self._canvas.clear_buffer(Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK) self._canvas.clear_buffer(None, 0, 0) def _write(self, text, x, y, colour=Screen.COLOUR_WHITE, attr=Screen.A_NORMAL, bg=Screen.COLOUR_BLACK): """ Write some text to the specified location in the current image. :param text: The text to be added. :param x: The X coordinate in the image. :param y: The Y coordinate in the image. :param colour: The colour of the text to add. :param attr: The attribute of the image. :param bg: The background colour of the text to add. This is only kept for back compatibility. Direct access to the canvas methods is preferred. """ self._canvas.print_at(text, x, y, colour, attr, bg) @property def _plain_image(self): return self._canvas.plain_image @property def _colour_map(self): return self._canvas.colour_map @abstractmethod def _render_now(self): """ Common method to render the latest image. :returns: A tuple of the plain image and the colour map as per :py:meth:`.rendered_text`. """ @property def images(self): # We can't return all, so just return the latest rendered image. return [self.rendered_text[0]] @property def rendered_text(self): if self._must_clear: self._clear() return self._render_now() @property def max_height(self): return self._canvas.height @property def max_width(self): return self._canvas.width python-asciimatics-1.15.0/asciimatics/renderers/box.py000066400000000000000000000020201511423144500230240ustar00rootroot00000000000000""" This module implements an ASCII box renderer. """ from asciimatics.constants import SINGLE_LINE from asciimatics.renderers.base import StaticRenderer from asciimatics.utilities import BoxTool class Box(StaticRenderer): """ Renders a simple box using ASCII characters. This does not render in extended box drawing characters as that requires non-ASCII characters in Windows and direct access to curses in Linux. """ def __init__(self, width, height, uni=False, style=SINGLE_LINE): """ :param width: width of box :param height: height of box :param uni: True to use UNICODE character set, defaults to False :param style: desired line style, based on line style definitions in :mod:`~asciimatics.constants`: `ASCII_LINE`, `SINGLE_LINE`, `DOUBLE_LINE`. `uni` parameter takes precedence and the style will be ignored if `uni==False` """ super().__init__() self._images = [BoxTool(uni, style).box(width, height)] python-asciimatics-1.15.0/asciimatics/renderers/charts.py000066400000000000000000000447451511423144500235440ustar00rootroot00000000000000""" This module implements bar chart renderers. """ from abc import abstractmethod from asciimatics.constants import DOUBLE_LINE, SINGLE_LINE from asciimatics.renderers.base import DynamicRenderer from asciimatics.screen import Screen from asciimatics.utilities import BoxTool class _BarChartBase(DynamicRenderer): #: Constant to indicate no axes should be rendered. NONE = 0 NO_AXIS = 0 #: Constant to indicate just the x axis should be rendered. X_AXIS = 1 #: Constant to indicate just the y axis should be rendered. Y_AXIS = 2 #: Constant to indicate both axes should be rendered. BOTH = 3 BOTH_AXES = 3 def __init__(self, height, width, functions, char="#", colour=Screen.COLOUR_GREEN, bg=Screen.COLOUR_BLACK, gradient=None, scale=None, axes=Y_AXIS, intervals=None, labels=False, border=True, keys=None, gap=None): # See children BarChart and VBarChart for argument descriptions and pydocs super().__init__(height, width) self._functions = functions self._char = char self._colours = [colour] if isinstance(colour, int) else colour self._bgs = [bg] if isinstance(bg, int) else bg self._scale = scale self._axes = axes self._intervals = intervals self._labels = labels self._border = border self._keys = keys self._gap = gap # Box drawing tool for border, allows user to change the border line style self._border_lines = BoxTool(self._canvas.unicode_aware, DOUBLE_LINE) if border else None # Box drawing tool for axes self._axes_lines = BoxTool(self._canvas.unicode_aware, SINGLE_LINE) # Normalize the gradient so that it is 3-tuple wide (bg is optional, if not there, set it) self._gradient = None if gradient: self._gradient = [] for item in gradient: if len(item) == 2: self._gradient.append((item[0], item[1], Screen.COLOUR_BLACK)) elif len(item) == 3: self._gradient.append(item) else: raise ValueError("Gradients must be 2-tuple or 3-tuple in size") @abstractmethod def _render_now(self): pass @property def border_style(self): """ The current drawing style of the border. Possible values are defined in :mod:`~asciimatics.constants`: * `ASCII_LINE` -- ASCII safe characters * `SINGLE_LINE` -- UNICODE based single line * `DOUBLE_LINE` -- UNICODE based double line Note that your canvas must support UNICODE style characters to use them """ return self._border_lines.style @border_style.setter def border_style(self, style): if self._border_lines: self._border_lines.style = style @property def axes_style(self): """ The current drawing style of the axes. Possible values are defined in :mod:`~asciimatics.constants`: * `ASCII_LINE` -- ASCII safe characters * `SINGLE_LINE` -- UNICODE based single line Note that your canvas must support UNICODE style characters to use them """ return self._axes_lines.style @axes_style.setter def axes_style(self, style): self._axes_lines.style = style def _setup_chart(self): """ Draws any borders and returns initial height, width, and starting X and Y. """ # Dimensions for the chart. int_h = self._canvas.height int_w = self._canvas.width start_x = 0 start_y = 0 # Create the box around the chart... if self._border: draw = self._border_lines.box_top(self._canvas.width) self._write(draw, 0, 0) for line in range(1, self._canvas.height): self._write(self._border_lines.v, 0, line) self._write(self._border_lines.v, self._canvas.width - 1, line) draw = self._border_lines.box_bottom(self._canvas.width) self._write(draw, 0, self._canvas.height - 1) int_h -= 4 int_w -= 6 start_y += 2 start_x += 3 return int_h, int_w, start_x, start_y class BarChart(_BarChartBase): """ Renderer to create a horizontal bar chart using the specified functions as inputs for each entry. Can be used to chart distributions or for more graphical effect - e.g. to imitate a sound equalizer or a progress indicator. """ def __init__(self, height, width, functions, char="#", colour=Screen.COLOUR_GREEN, bg=Screen.COLOUR_BLACK, gradient=None, scale=None, axes=_BarChartBase.Y_AXIS, intervals=None, labels=False, border=True, keys=None, gap=None): """ :param height: The max height of the rendered image. :param width: The max width of the rendered image. :param functions: List of functions to chart. :param char: Character to use for the bar. Defaults to '#' :param colour: Colour(s) to use for the bars. This can be a single value or list of values (to cycle around for each bar). Defaults to green. :param bg: Background colour to use for the bars. This can be a single value or list of values (to cycle around for each bar). Defaults to black. :param gradient: Colour gradient to use for the bars. This is a list of tuple pairs specifying a threshold and a colour, or triplets to include a background colour too. Defaults to no gradients. :param scale: Maximum value for the bars. This is used to scale the function values to the maximum space available. Any value over this will be truncated when drawn. Defaults to the number of available characters in the chart. :param axes: Which axes to draw. :param intervals: Units for interval markers on the main axis. Defaults to none. :param labels: Whether to draw size indication labels on the x-axis. :param border: Whether to draw a border around the chart. :param keys: Optional keys to name each bar on the y-axis. :param gap: distance between bars. A value of None will auto-calculate (default). If the scale parameter is not specified, the maximum length of the bar is based on the available space. A chart with no borders, no axes, no keys or labels will have a bar length based solely on the width of the graph. * Borders use 4 characters height and 6 characters width * Keys use the width of the widest key plus 1 * Labels use a height of 1 * An X_AXIS uses a height of 1 * A Y_AXIS uses a width of 1 """ # Have to have a call to super as the defaults for the class are different than the parent super().__init__( height, width, functions, char, colour, bg, gradient, scale, axes, intervals, labels, border, keys, gap) def _render_now(self): int_h, int_w, start_x, start_y = self._setup_chart() # Make room for the keys if supplied. if self._keys: max_key = max(len(x) for x in self._keys) key_x = start_x int_w -= max_key + 1 start_x += max_key + 1 # Now add the axes - resizing chart space as required... if (self._axes & BarChart.X_AXIS) > 0: int_h -= 1 if (self._axes & BarChart.Y_AXIS) > 0: int_w -= 1 start_x += 1 if self._labels: int_h -= 1 # Use given scale or whatever space is left in the grid scale = int_w if self._scale is None else self._scale if self._axes & BarChart.X_AXIS: self._write(self._axes_lines.h * int_w, start_x, start_y + int_h) if self._axes & BarChart.Y_AXIS: for line in range(int_h): self._write(self._axes_lines.v, start_x - 1, start_y + line) if self._axes & BarChart.BOTH == BarChart.BOTH: self._write(self._axes_lines.up_right, start_x - 1, start_y + int_h) if self._labels: pos = start_y + int_h if self._axes & BarChart.X_AXIS: pos += 1 self._write("0", start_x, pos) text = str(scale) self._write(text, start_x + int_w - len(text), pos) # Now add any interval markers if required... if self._intervals is not None: i = self._intervals while i < scale: x = start_x + int(i * int_w / scale) - 1 for line in range(int_h): self._write(self._axes_lines.v_inside, x, start_y + line) self._write(self._axes_lines.h_up, x, start_y + int_h) if self._labels: val = str(i) self._write(val, x - (len(val) // 2), start_y + int_h + 1) i += self._intervals # Allow double-width bars if there's space. bar_size = 2 if int_h >= (3 * len(self._functions)) - 1 else 1 gap = self._gap if self._gap is None: gap = 0 if len(self._functions) <= 1 else (int_h - (bar_size * len( self._functions))) / (len(self._functions) - 1) # Now add the bars... for i, fn in enumerate(self._functions): bar_len = int(fn() * int_w / scale) y = start_y + (i * bar_size) + int(i * gap) # First draw the key if supplied if self._keys: key = self._keys[i] pos = max_key - len(key) self._write(key, key_x + pos, y) # Now draw the bar colour = self._colours[i % len(self._colours)] bg = self._bgs[i % len(self._bgs)] if self._gradient: # Colour gradient required - break down into chunks for each colour. last = 0 size = 0 for threshold, colour, bg in self._gradient: value = int(threshold * int_w / scale) if value - last > 0: # Size to fit the available space size = value if bar_len >= value else bar_len size = min(size, int_w) for line in range(bar_size): self._write( self._char * (size - last), start_x + last, y + line, colour, bg=bg) # Stop if we reached the end of the line or the chart if bar_len < value or size >= int_w: break last = value else: # Solid colour - just write the whole block out. for line in range(bar_size): self._write(self._char * bar_len, start_x, y + line, colour, bg=bg) return self._plain_image, self._colour_map class VBarChart(_BarChartBase): """ Renderer to create a vertical bar chart using the specified functions as inputs for each entry. Can be used to chart distributions or for more graphical effect - e.g. to imitate a sound equalizer or a progress indicator. """ def __init__(self, height, width, functions, char="#", colour=Screen.COLOUR_GREEN, bg=Screen.COLOUR_BLACK, gradient=None, scale=None, axes=_BarChartBase.X_AXIS, intervals=None, labels=False, border=True, keys=None, gap=None): """ :param height: The max height of the rendered image. :param width: The max width of the rendered image. :param functions: List of functions to chart. :param char: Character to use for the bar. Defaults to '#' :param colour: Colour(s) to use for the bars. This can be a single value or list of values (to cycle around for each bar). Defaults to green. :param bg: Background colour to use for the bars. This can be a single value or list of values (to cycle around for each bar). Defaults to black. :param gradient: Colour gradient to use for the bars. This is a list of tuple pairs specifying a threshold and a colour, or triplets to include a background colour too. Defaults to no gradients. :param scale: Maximum value for the bars. This is used to scale the function values to the maximum space available. Any value over this will be truncated when drawn. Defaults to the number of available characters in the chart. :param axes: Which axes to draw. :param intervals: Units for interval markers on the main axis. Defaults to none. :param labels: Whether to draw size indication labels on the y-axis. :param border: Whether to draw a border around the chart. :param keys: Optional keys to name each bar on the x-axis. :param gap: distance between bars. A value of None will auto-calculate (default). Minimum value when auto-calculated is 1, for no gaps specify 0. If the scale parameter is not specified, the maximum length of the bar is based on the available space. A chart with no borders, no axes, no keys or labels will have a bar height based solely on the width of the graph. * Borders use 4 characters height and 6 characters width * Keys use a height of 1 * Labels vertical bar chart use the width of the widest label plus 1 (label values depend on the scale of the chart) * An X_AXIS uses a height of 1 * A Y_AXIS uses a width of 1 """ super().__init__( height, width, functions, char, colour, bg, gradient, scale, axes, intervals, labels, border, keys, gap) def _render_now(self): int_h, int_w, start_x, start_y = self._setup_chart() # Make room for the keys if supplied. if self._keys: int_h -= 1 # Now add the axes - resizing chart space as required... if self._axes & VBarChart.X_AXIS: int_h -= 1 if self._axes & VBarChart.Y_AXIS: int_w -= 1 start_x += 1 # Use given scale or whatever space is left in the grid scale = int_h if self._scale is None else self._scale # Calculate labels and intervals, adjust width based on widest label if self._labels: labels = [('', False) for x in range(int_h)] labels[0] = ('0', False) labels[-1] = (str(scale), False) if self._intervals: next_interval = self._intervals # pylint: disable-next=consider-using-enumerate for i in range(0, len(labels)): value = (i + 1) * scale / int_h if value >= next_interval: labels[i] = (str(next_interval), True) next_interval += self._intervals # Change size based on widest_label = max(len(x[0]) for x in labels) int_w -= widest_label + 1 start_x += widest_label + 1 if self._axes & VBarChart.X_AXIS: self._write(self._axes_lines.h * int_w, start_x, start_y + int_h) if self._axes & VBarChart.Y_AXIS: for line in range(int_h): self._write(self._axes_lines.v, start_x - 1, start_y + line) if self._axes & VBarChart.BOTH == BarChart.BOTH: self._write(self._axes_lines.up_right, start_x - 1, start_y + int_h) # Draw labels and intervals if self._labels: y = start_y + int_h - 1 for label, interval in labels: x = start_x - len(label) - 1 if label != '': self._write(label, x, y) if interval: self._write(self._axes_lines.v_right, start_x - 1, y) self._write(self._axes_lines.h_inside * int_w, start_x, y) y -= 1 # Size bars based on available space bar_width = int_w gap = 0 if len(self._functions) > 1: if self._gap is None: # Evenly size bars and gaps bars_and_gaps = 2 * len(self._functions) - 1 bar_width = int_w // bars_and_gaps gap = bar_width total_gap_space = gap * (len(self._functions) - 1) else: # Use given gap size, calculate bar width gap = self._gap total_gap_space = gap * (len(self._functions) - 1) total_bar_space = int_w - total_gap_space bar_width = total_bar_space // len(self._functions) if bar_width <= 0: raise ValueError( f"Not enough space. {len(self._functions)} bars + {total_gap_space} space for gaps " f"is > your graph width of {int_w}") # Write keys if self._keys: y = start_y + int_h if self._axes & VBarChart.X_AXIS: y += 1 x = start_x for key in self._keys: self._write(key, x, y) x += bar_width + gap # Write bars values = [fn() for fn in self._functions] scale_factor = scale / int_h for pos in range(1, int_h + 1): x = start_x threshold = pos * scale_factor - (scale_factor / 2) for index, value in enumerate(values): colour = self._colours[index % len(self._colours)] bg = self._bgs[index % len(self._bgs)] if value >= threshold: if self._gradient: # First gradient is the base colour draw_colour = self._gradient[0][1] draw_bg = self._gradient[0][2] # Loop through gradients to see if the colour should # be incremented to next value pos_value = scale * (pos / int_h) for gradient in self._gradient[1:]: if pos_value >= gradient[0]: draw_colour = gradient[1] draw_bg = gradient[2] else: break else: draw_colour = colour draw_bg = bg self._write(self._char * bar_width, x, start_y + int_h - pos, draw_colour, bg=draw_bg) x += bar_width + gap return self._plain_image, self._colour_map python-asciimatics-1.15.0/asciimatics/renderers/figlettext.py000066400000000000000000000013071511423144500244220ustar00rootroot00000000000000""" This module implements Figlet text renderer. """ from pyfiglet import Figlet, DEFAULT_FONT from asciimatics.renderers.base import StaticRenderer class FigletText(StaticRenderer): """ This class renders the supplied text using the specified Figlet font. See http://www.figlet.org/ for details of available fonts. """ def __init__(self, text, font=DEFAULT_FONT, width=200): """ :param text: The text string to convert with Figlet. :param font: The Figlet font to use (optional). :param width: The maximum width for this text in characters. """ super().__init__() self._images = [Figlet(font=font, width=width).renderText(text)] python-asciimatics-1.15.0/asciimatics/renderers/fire.py000066400000000000000000000116751511423144500232010ustar00rootroot00000000000000""" This module implements a fire effect renderer. """ import copy from random import randint, random from asciimatics.renderers.base import DynamicRenderer from asciimatics.screen import Screen class Fire(DynamicRenderer): """ Renderer to create a fire effect based on a specified `emitter` that defines the heat source. The implementation here uses the same techniques described in http://freespace.virgin.net/hugo.elias/models/m_fire.htm, although a slightly different implementation. """ _COLOURS_16 = [ (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, 0), (Screen.COLOUR_RED, Screen.A_BOLD), (Screen.COLOUR_RED, Screen.A_BOLD), (Screen.COLOUR_RED, Screen.A_BOLD), (Screen.COLOUR_RED, Screen.A_BOLD), (Screen.COLOUR_YELLOW, Screen.A_BOLD), (Screen.COLOUR_YELLOW, Screen.A_BOLD), (Screen.COLOUR_YELLOW, Screen.A_BOLD), (Screen.COLOUR_YELLOW, Screen.A_BOLD), (Screen.COLOUR_WHITE, Screen.A_BOLD), ] _COLOURS_256 = [ (0, 0), (52, 0), (88, 0), (124, 0), (160, 0), (196, 0), (202, 0), (208, 0), (214, 0), (220, 0), (226, 0), (227, 0), (228, 0), (229, 0), (230, 0), (231, 0), ] _CHARS = " ...::$$$&&&@@" def __init__(self, height, width, emitter, intensity, spot, colours, bg=False): """ :param height: Height of the box to contain the flames. :param width: Width of the box to contain the flames. :param emitter: Heat source for the flames. Any non-whitespace character is treated as part of the heat source. :param intensity: The strength of the flames. The bigger the number, the hotter the fire. 0 <= intensity <= 1.0. :param spot: Heat of each spot source. Must be an integer > 0. :param colours: Number of colours the screen supports. :param bg: (Optional) Whether to render background colours only. """ super().__init__(height, width) self._emitter = emitter self._intensity = intensity self._spot_heat = spot self._count = len([c for c in emitter if c not in " \n"]) line = [0 for _ in range(self._canvas.width)] self._buffer = [copy.deepcopy(line) for _ in range(self._canvas.width * 2)] self._colours = self._COLOURS_256 if colours >= 256 else \ self._COLOURS_16 self._bg_too = bg # Figure out offset of emitter to centre at the bottom of the buffer e_width = 0 e_height = 0 for line in self._emitter.split("\n"): e_width = max(e_width, len(line)) e_height += 1 self._x = (width - e_width) // 2 self._y = height - e_height def _render_now(self): # First make the fire rise with convection for y in range(len(self._buffer) - 1): self._buffer[y] = self._buffer[y + 1] self._buffer[len(self._buffer) - 1] = [0 for _ in range(self._canvas.width)] # Seed new hot spots x = self._x y = self._y for c in self._emitter: if c not in " \n" and random() < self._intensity: self._buffer[y][x] += randint(1, self._spot_heat) if c == "\n": x = self._x y += 1 else: x += 1 # Seed a few cooler spots for _ in range(self._canvas.width // 2): self._buffer[randint(0, self._canvas.height - 1)][ randint(0, self._canvas.width - 1)] -= 10 # Simulate cooling effect of the resulting environment. for y, row in enumerate(self._buffer): for x in range(self._canvas.width): new_val = row[x] if y < len(self._buffer) - 1: new_val += self._buffer[y + 1][x] if x > 0: new_val += self._buffer[y][x - 1] if x < self._canvas.width - 1: new_val += self._buffer[y][x + 1] self._buffer[y][x] = new_val // 4 # Now build the rendered text from the simulated flames. self._clear() for x in range(self._canvas.width): for y, row in enumerate(self._buffer): if row[x] > 0: colour = self._colours[min(len(self._colours) - 1, row[x])] if self._bg_too: char = " " bg = colour[0] else: char = self._CHARS[min(len(self._CHARS) - 1, row[x])] bg = 0 self._write(char, x, y, colour[0], colour[1], bg) return self._plain_image, self._colour_map python-asciimatics-1.15.0/asciimatics/renderers/images.py000066400000000000000000000144571511423144500235220ustar00rootroot00000000000000""" This module implements renderers that produce content based on image files. """ from PIL import Image from asciimatics.renderers.base import StaticRenderer from asciimatics.screen import Screen class _ImageSequence(): """ Simple class to make an iterator for a PIL Image object. """ def __init__(self, im): self.im = im def __getitem__(self, ix): try: if ix: self.im.seek(ix) return self.im except EOFError as exc: raise IndexError from exc class ImageFile(StaticRenderer): """ Renderer to convert an image file (as supported by the Python Imaging Library) into an ascii grey scale text image. """ # The ASCII grey scale from darkest to lightest. _greyscale = ' .:;rsA23hHG#9&@' def __init__(self, filename, height=30, colours=8): """ :param filename: The name of the file to render. :param height: The height of the text rendered image. :param colours: The number of colours the terminal supports. """ super().__init__() with Image.open(filename) as image: background = image.info['background'] if 'background' in \ image.info else None for frame in _ImageSequence(image): ascii_image = "" frame = frame.resize( (int(frame.size[0] * height * 2.0 / frame.size[1]), height), Image.BICUBIC) grey_frame = frame.convert('L') for py in range(0, grey_frame.size[1]): if py > 0: ascii_image += "\n" for px in range(0, grey_frame.size[0]): real_col = frame.getpixel((px, py)) col = grey_frame.getpixel((px, py)) if real_col == background: ascii_image += " " else: if colours >= 256: ascii_image += "${%d}" % (232 + col * 23 // 256) else: ascii_image += "${%d,%d}" % ( 7 if col >= 85 else 0, Screen.A_BOLD if col < 85 or col > 170 else Screen.A_NORMAL ) ascii_image += self._greyscale[ (int(col) * len(self._greyscale)) // 256] self._images.append(ascii_image) class ColourImageFile(StaticRenderer): """ Renderer to convert an image file (as supported by the Python Imaging Library) into an block image of available colours. .. warning:: This is only compatible with 256-colour terminals. Results in other terminals with reduced colour capabilities are severely restricted. Since Windows only has 8 base colours, it is recommended that you avoid this renderer on that platform. """ def __init__(self, screen, filename, height=30, bg=Screen.COLOUR_BLACK, fill_background=False, uni=False, dither=False): """ :param screen: The screen to use when displaying the image. :param filename: The name of the file to render. :param height: The height of the text rendered image. :param bg: The default background colour for this image. :param fill_background: Whether to set background colours too. :param uni: Whether to use unicode box characters or not. :param dither: Whether to dither the rendered image or not. """ super().__init__() with Image.open(filename) as image: # Create temp Image with web palette for quantization. tmp_img = Image.new("P", (1, 1)) tmp_img.putpalette(screen.palette) # Convert each frame in the image. for frame in _ImageSequence(image): ascii_image = "" # Resize to the required size and standardize on RGBA to detect transparency. new_frame = frame.resize( (int(frame.size[0] * height * 2.0 / frame.size[1]), height * 2 if uni else height), Image.BICUBIC) new_frame = new_frame.convert('RGBA') # Convert to terminal 256 colour palette. new_frame2 = new_frame.convert('RGB') new_frame2 = new_frame2.quantize( colors=256, palette=tmp_img, dither=Image.Dither.FLOYDSTEINBERG if dither else Image.Dither.NONE) # Decide what "brush" we're going to use for the rendering. brush = "▄" if uni else "#" # Convert the resulting image to coloured ASCII codes. for py in range(0, new_frame2.size[1], 2 if uni else 1): # Looks like some terminals need a character printed before # they really reset the colours - so insert a dummy char # to reset the background if needed. if py > 0: if uni: ascii_image += "${%d,2,%d}." % (bg, bg) ascii_image += "\n" for px in range(0, new_frame2.size[0]): real_col = new_frame.getpixel((px, py)) real_col2 = new_frame.getpixel((px, py + 1)) if uni else real_col col = new_frame2.getpixel((px, py)) col2 = new_frame2.getpixel((px, py + 1)) if uni else col if (real_col[3] < 64 and real_col2[3] < 64): if fill_background or uni: ascii_image += "${%d,2,%d}." % (bg, bg) else: ascii_image += "${%d} " % bg else: if fill_background or uni: ascii_image += "${%d,2,%d}%s" % (col2, col, brush) else: ascii_image += "${%d}#" % col if uni: ascii_image += "${%d,2,%d}." % (bg, bg) self._images.append(ascii_image) python-asciimatics-1.15.0/asciimatics/renderers/kaleidoscope.py000066400000000000000000000101231511423144500247010ustar00rootroot00000000000000""" This module implements a kaeldioscope effect renderer. """ from math import sin, cos, pi, atan2 from asciimatics.renderers.base import DynamicRenderer class Kaleidoscope(DynamicRenderer): """ Renderer to create a 2-mirror kaleidoscope effect. This is a chained renderer (i.e. it acts upon the output of another Renderer which is passed to it on construction). The other Renderer is used as the cell that is rotated over time to create the animation. You can specify the desired rotational symmetry of the kaleidoscope (which determines the angle between the mirrors). If you chose values of less than 2, you are effectively removing one or both mirrors, thus either getting the original cell or a simple mirrored image of the cell. Since this renderer rotates the background cell, it needs operate on square pixels, which means each character in the cell is drawn as 2 next to each other on the screen. In other words the cell needs to be half the width of the desired output (when measured in text characters). """ def __init__(self, height, width, cell, symmetry): """ :param height: Height of the box to contain the kaleidoscope. :param width: Width of the box to contain the kaleidoscope. :param cell: A Renderer to use as the backing cell for the kaleidoscope. :param symmetry: The desired rotational symmetry. Must be a non-negative integer. """ super().__init__(height, width) self._symmetry = symmetry self._rotation = 0 self._cell = cell def _render_now(self): # Rotate a point (x, y) through an angle theta. def _rotate(x, y, theta): return x * cos(theta) - y * sin(theta), x * sin(theta) + y * cos(theta) # Reflect a point (x, y) in a line at angle theta def _reflect(x, y, theta): return x * cos(2 * theta) + y * sin(2 * theta), x * sin(2 * theta) - y * cos(2 * theta) # Get the base cell now - so we can pick out characters as needed. text, colour_map = self._cell.rendered_text # Integer maths will result in gaps between characters if you rotate from the starting # point to desired end-point. We therefore look for the reverse mapping from the final # character and trace-back instead. for dx in range(self._canvas.width // 2): for dy in range(self._canvas.height): # Figure out which segment of the circle we're in, so we know what affine # transformations to apply. ox = dx - self._canvas.width / 4 oy = dy - self._canvas.height / 2 segment = round(atan2(oy, ox) * self._symmetry / pi) if segment % 2 == 0: # Just a rotation required for even segments. x1, y1 = _rotate( ox, oy, 0 if self._symmetry == 0 else -segment * pi / self._symmetry) else: # Odd segments require a rotation and then a reflection. x1, y1 = _rotate(ox, oy, (1 - segment) * pi / self._symmetry) x1, y1 = _reflect(x1, y1, pi / self._symmetry / 2) # Now rotate once more to simulate the rotation of the background cell too. x1, y1 = _rotate(x1, y1, self._rotation) # Re-normalize back to the box coordinates and draw the character that we found # from the reverse mapping. x2 = int(x1 + self._cell.max_width / 2) y2 = int(y1 + self._cell.max_height / 2) if (0 <= y2 < len(text)) and (0 <= x2 < len(text[y2])): self._write(text[y2][x2] + text[y2][x2], dx * 2, dy, colour_map[y2][x2][0], colour_map[y2][x2][1], colour_map[y2][x2][2]) # Now rotate the background cell for the next frame. self._rotation += pi / 180 return self._plain_image, self._colour_map python-asciimatics-1.15.0/asciimatics/renderers/plasma.py000066400000000000000000000047131511423144500235240ustar00rootroot00000000000000""" This module implements a plasma effect renderer. """ from math import sin, pi, sqrt from asciimatics.renderers.base import DynamicRenderer from asciimatics.screen import Screen class Plasma(DynamicRenderer): """ Renderer to create a "plasma" effect using sinusoidal functions. The implementation here uses the same techniques described in http://lodev.org/cgtutor/plasma.html """ # The ASCII grey scale from darkest to lightest. _greyscale = ' .:;rsA23hHG#9&@' # Colours for different environments _palette_8 = [ (Screen.COLOUR_BLUE, Screen.A_NORMAL), (Screen.COLOUR_BLUE, Screen.A_NORMAL), (Screen.COLOUR_MAGENTA, Screen.A_NORMAL), (Screen.COLOUR_MAGENTA, Screen.A_NORMAL), (Screen.COLOUR_RED, Screen.A_NORMAL), (Screen.COLOUR_RED, Screen.A_BOLD), ] _palette_256 = [ (18, 0), (19, 0), (20, 0), (21, 0), (57, 0), (93, 0), (129, 0), (201, 0), (200, 0), (199, 0), (198, 0), (197, 0), (196, 0), (196, 0), (196, 0), ] def __init__(self, height, width, colours): """ :param height: Height of the box to contain the plasma. :param width: Width of the box to contain the plasma. :param colours: Number of colours the screen supports. """ super().__init__(height, width) self._palette = self._palette_256 if colours >= 256 else self._palette_8 self._t = 0 def _render_now(self): # Internal function for creating a sine wave radiating out from a point def f(x1, y1, xp, yp, n): return sin(sqrt((x1 - self._canvas.width * xp) ** 2 + 4 * ((y1 - self._canvas.height * yp) ** 2)) * pi / n) self._t += 1 for y in range(self._canvas.height - 1): for x in range(self._canvas.width - 1): value = abs(f(x + self._t / 3, y, 1 / 4, 1 / 3, 15) + f(x, y, 1 / 8, 1 / 5, 11) + f(x, y + self._t / 3, 1 / 2, 1 / 5, 13) + f(x, y, 3 / 4, 4 / 5, 13)) / 4.0 fg, attr = self._palette[ int(round(value * (len(self._palette) - 1)))] char = self._greyscale[int((len(self._greyscale) - 1) * value)] self._write(char, x, y, fg, attr, 0) return self._plain_image, self._colour_map python-asciimatics-1.15.0/asciimatics/renderers/players.py000066400000000000000000000243271511423144500237310ustar00rootroot00000000000000""" This module implements renderers that play content to the screen. """ from abc import abstractmethod import json from asciimatics.renderers.base import DynamicRenderer from asciimatics.screen import Screen from asciimatics.parsers import AnsiTerminalParser, Parser class AbstractScreenPlayer(DynamicRenderer): """ Abstract renderer to play terminal text with support for ANSI control codes. """ def __init__(self, height, width): """ :param height: required height of the renderer. :param width: required width of the renderer. """ super().__init__(height, width, clear=False) self._parser = AnsiTerminalParser() self._current_colours = [Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK] self._show_cursor = False self._cursor_x = 0 self._cursor_y = 0 self._save_cursor_x = 0 self._save_cursor_y = 0 self._counter = 0 self._next = 0 self._buffer = None self._parser.reset("", self._current_colours) self._clear() @abstractmethod def _render_now(self): """ Render the next iteration. """ def _play_content(self, text): """ Process new raw text. :param text: thebraw text to be processed. """ lines = text.split("\n") for i, line in enumerate(lines): self._parser.append(line) for _, command, params in self._parser.parse(): # logging.debug("Command: {} {}".format(command, params)) if command == Parser.DISPLAY_TEXT: # Just display the text... allowing for line wrapping. if self._cursor_x + len(params) >= self._canvas.width: part_1 = params[:self._canvas.width - self._cursor_x] part_2 = params[self._canvas.width - self._cursor_x:] self._print_at(part_1, self._cursor_x, self._cursor_y) self._print_at(part_2, 0, self._cursor_y + 1) self._cursor_x = len(part_2) self._cursor_y += 1 if self._cursor_y - self._canvas.start_line >= self._canvas.height: self._canvas.scroll() else: self._print_at(params, self._cursor_x, self._cursor_y) self._cursor_x += len(params) elif command == Parser.CHANGE_COLOURS: # Change current text colours. self._current_colours = params elif command == Parser.NEXT_TAB: # Move to next tab stop - hard-coded to default of 8 characters. self._cursor_x = (self._cursor_x // 8) * 8 + 8 elif command == Parser.MOVE_RELATIVE: # Move cursor relative to current position. self._cursor_x += params[0] self._cursor_y += params[1] if self._cursor_y < self._canvas.start_line: self._canvas.scroll(self._cursor_y - self._canvas.start_line) elif command == Parser.MOVE_ABSOLUTE: # Move cursor relative to specified absolute position. if params[0] is not None: self._cursor_x = params[0] if params[1] is not None: self._cursor_y = params[1] + self._canvas.start_line elif command == Parser.DELETE_LINE: # Delete some/all of the current line. if params == 0: self._print_at( " " * (self._canvas.width - self._cursor_x), self._cursor_x, self._cursor_y) elif params == 1: self._print_at(" " * self._cursor_x, 0, self._cursor_y) elif params == 2: self._print_at(" " * self._canvas.width, 0, self._cursor_y) elif command == Parser.DELETE_CHARS: # Delete n characters under the cursor. for x in range(self._cursor_x, self._canvas.width): if x + params < self._canvas.width: cell = self._canvas.get_from(x + params, self._cursor_y) else: cell = (ord(" "), self._current_colours[0], self._current_colours[1], self._current_colours[2]) self._canvas.print_at( chr(cell[0]), x, self._cursor_y, colour=cell[1], attr=cell[2], bg=cell[3]) elif command == Parser.SHOW_CURSOR: # Show/hide the cursor. self._show_cursor = params elif command == Parser.SAVE_CURSOR: # Save the cursor position. self._save_cursor_x = self._cursor_x self._save_cursor_y = self._cursor_y elif command == Parser.RESTORE_CURSOR: # Restore the cursor position. self._cursor_x = self._save_cursor_x self._cursor_y = self._save_cursor_y elif command == Parser.CLEAR_SCREEN: # Clear the screen. self._canvas.clear_buffer( self._current_colours[0], self._current_colours[1], self._current_colours[2]) self._cursor_x = 0 self._cursor_y = self._canvas.start_line # Move to next line, scrolling buffer as needed. if i != len(lines) - 1: self._cursor_x = 0 self._cursor_y += 1 if self._cursor_y - self._canvas.start_line >= self._canvas.height: self._canvas.scroll() def _print_at(self, text, x, y): """ Helper function to simplify use of the renderer. """ self._canvas.print_at( text, x, y, colour=self._current_colours[0], attr=self._current_colours[1], bg=self._current_colours[2]) class AnsiArtPlayer(AbstractScreenPlayer): """ Renderer to play ANSI art text files. In order to tidy up files, this must be used as a context manager (i.e. using `with`). """ def __init__(self, filename, height=25, width=80, encoding="cp437", strip=False, rate=2): """ :param filename: the file containingi the ANSI art. :param height: required height of the renderer. :param width: required width of the renderer. :param encoding: text encoding ofnthe file. :param strip: whether to strip CRLF from the file content. :param rate: number of lines to render on each update. """ super().__init__(height, width) # pylint: disable-next=consider-using-with self._file = open(filename, "rb") self._strip = strip self._rate = rate self._encoding = encoding def __enter__(self): """ Create context for use as a context manager. """ return self def __exit__(self, exc_type, exc_value, traceback): """ Clear up the resources for this context. """ if self._file: self._file.close() def _render_now(self): count = 0 line = None while count < self._rate and line != "": line = self._file.readline().decode(self._encoding) count += 1 if self._strip: line = line.rstrip("\r\n") self._play_content(line) return self._plain_image, self._colour_map class AsciinemaPlayer(AbstractScreenPlayer): """ Renderer to play terminal recordings created by asciinema. This only supports the version 2 file format. Use the max_delay setting to speed up human interactions (i.e. to reduce delays from typing). In order to tidy up files, this must be used as a context manager (i.e. using `with`). """ def __init__(self, filename, height=None, width=None, max_delay=None): """ :param filename: the file containingi the ANSI art. :param height: required height of the renderer. :param width: required width of the renderer. :param max_delay: maximum time interval (in secs) to wait between frame updates. """ # Open the file and check it looks plausibly like a supported format. # pylint: disable-next=consider-using-with self._file = open(filename, "rb") header = json.loads(self._file.readline()) if header["version"] != 2: raise RuntimeError("Unsupported file format") # Use file details if not overridden by constructor params. height = height if height else header["height"] width = width if width else header["width"] # Construct the full player now we have all the details. super().__init__(height, width) self._max_delay = max_delay def __enter__(self): """ Create context for use as a context manager. """ return self def __exit__(self, exc_type, exc_value, traceback): """ Clear up the resources for this context. """ if self._file: self._file.close() def _render_now(self): self._counter += 0.05 if self._counter >= self._next: if self._buffer: self._play_content(self._buffer) self._buffer = None while True: try: self._next, _, self._buffer = json.loads(self._file.readline()) if self._next > self._counter: # Speed up playback if requested. if self._max_delay and self._next - self._counter > self._max_delay: self._counter = self._next - self._max_delay break self._play_content(self._buffer) except ValueError: # Python 3 raises a subclass of this error, so will also be caught. break return self._plain_image, self._colour_map python-asciimatics-1.15.0/asciimatics/renderers/rainbow.py000066400000000000000000000025701511423144500237070ustar00rootroot00000000000000""" This module implements a rainbow effect renderer. """ from asciimatics.renderers.base import StaticRenderer class Rainbow(StaticRenderer): """ Chained renderer to add rainbow colours to output of another renderer. The embedded rendered must not use multi-colour mode (i.e. ${c,a} mark-ups) as these will be converted to explicit text by this renderer. """ # Colour palette when limited to 16 colours (8 dim and 8 bright). _16_palette = [1, 1, 3, 3, 2, 2, 6, 6, 4, 4, 5, 5] # Colour palette for 256 colour xterm mode. _256_palette = [196, 202, 208, 214, 220, 226, 154, 118, 82, 46, 47, 48, 49, 50, 51, 45, 39, 33, 27, 21, 57, 93, 129, 201, 200, 199, 198, 197] def __init__(self, screen, renderer): """ :param screen: The screen object for this renderer. :param renderer: The renderer to wrap. """ super().__init__() palette = self._256_palette if screen.colours > 16 else self._16_palette for image in renderer.images: new_image = "" for y, line in enumerate(image): for x, c in enumerate(line): colour = (x + y) % len(palette) new_image += '${%d,1}%s' % (palette[colour], c) if y < len(image) - 1: new_image += "\n" self._images.append(new_image) python-asciimatics-1.15.0/asciimatics/renderers/rotatedduplicate.py000066400000000000000000000024311511423144500255770ustar00rootroot00000000000000""" This module implements a renderer that renders another renderer but rotated. """ from asciimatics.renderers.base import StaticRenderer class RotatedDuplicate(StaticRenderer): """ Chained renderer to add a rotated version of the original renderer underneath and centre the whole thing within within the specified dimensions. """ def __init__(self, width, height, renderer): """ :param width: The maximum width of the rendered text. :param height: The maximum height of the rendered text. :param renderer: The renderer to wrap. """ super().__init__() for image in renderer.images: mx = (width - max(len(x) for x in image)) // 2 my = height // 2 - len(image) tab = (" " * mx if mx > 0 else "") + "\n" + (" " * mx if mx > 0 else "") new_image = [] new_image.extend(["" for _ in range(max(0, my))]) new_image.extend(image) new_image.extend([x[::-1] for x in reversed(image)]) new_image.extend(["" for _ in range(max(0, my))]) if mx < 0: new_image = [x[-mx:mx] for x in new_image] if my < 0: new_image = new_image[-my:my] self._images.append(tab.join(new_image)) python-asciimatics-1.15.0/asciimatics/renderers/scales.py000066400000000000000000000023351511423144500235170ustar00rootroot00000000000000""" This module implements renderers that show measuring scales to the screen. """ from asciimatics.renderers.base import StaticRenderer class Scale(StaticRenderer): """ This renders a linear scale, useful for debugging positions of your creations. Every 5 spaces gets a tick mark, every 10 a number. """ def __init__(self, width): """ :param width: The width of the scale """ super().__init__() contents = [] for x in range(1, width + 1): if x % 10 == 0 and x > 0: contents.append(str(x)[-2]) elif x % 5 == 0: contents.append('+') else: contents.append('-') text = ''.join(contents) self._images = [text] class VScale(StaticRenderer): """ This renders a vertical linear scale, useful for debugging positions of your creations. Writes lowest significant digit of a count running vertically. """ def __init__(self, height): """ :param width: The width of the scale """ super().__init__() contents = [str(i)[-1] for i in range(1, height + 1)] text = '\n'.join(contents) self._images = [text] python-asciimatics-1.15.0/asciimatics/renderers/speechbubble.py000066400000000000000000000027301511423144500246670ustar00rootroot00000000000000""" This module implements a speech-bubble effect renderer. """ from wcwidth.wcwidth import wcswidth from asciimatics.renderers.base import StaticRenderer class SpeechBubble(StaticRenderer): """ Renders supplied text into a speech bubble. """ def __init__(self, text, tail=None, uni=False): """ :param text: The text to be put into a speech bubble. :param tail: Where to put the bubble callout tail, specifying "L" or "R" for left or right tails. Can be None for no tail. """ super().__init__() max_len = max(wcswidth(x) for x in text.split("\n")) if uni: bubble = "╭─" + "─" * max_len + "─╮\n" for line in text.split("\n"): filler = " " * (max_len - len(line)) bubble += "│ " + line + filler + " │\n" bubble += "╰─" + "─" * max_len + "─╯" else: bubble = ".-" + "-" * max_len + "-.\n" for line in text.split("\n"): filler = " " * (max_len - len(line)) bubble += "| " + line + filler + " |\n" bubble += "`-" + "-" * max_len + "-`" if tail == "L": bubble += "\n" bubble += " )/ \n" bubble += "-\"`\n" elif tail == "R": bubble += "\n" bubble += (" " * max_len) + "\\( \n" bubble += (" " * max_len) + " `\"-\n" self._images = [bubble] python-asciimatics-1.15.0/asciimatics/scene.py000066400000000000000000000104451511423144500213520ustar00rootroot00000000000000""" This module defines Scene objects for animation purposes. For more details, see http://asciimatics.readthedocs.io/en/latest/animation.html """ class Scene(): """ Class to store the details of a single scene to be displayed. This is made up of a set of :py:obj:`.Effect` objects. See the documentation for Effect to understand the interaction between the two classes and http://asciimatics.readthedocs.io/en/latest/animation.html for how to use them together. """ def __init__(self, effects, duration=0, clear=True, name=None): """ :param effects: The list of effects to apply to this scene. :param duration: The number of frames in this Scene. A value of 0 means that the Scene should query the Effects to find the duration. A value of -1 means don't stop. :param clear: Whether to clear the Screen at the start of the Scene. :param name: Optional name to identify the scene. """ self._effects = [] for effect in effects: self.add_effect(effect, reset=False) self._duration = duration if duration == 0: self._duration = max(x.stop_frame for x in effects) self._clear = clear self._name = name def reset(self, old_scene=None, screen=None): """ Reset the scene ready for playing. :param old_scene: The previous version of this Scene that was running before the application reset - e.g. due to a screen resize. :param screen: New screen to use if old_scene is not None. """ # Always reset all the effects. for effect in self._effects: effect.reset() # If we have an old Scene to recreate, get the data out of that and # apply it where possible by cloning objects where appropriate. if old_scene: for old_effect in old_scene.effects: # catching AttributeErrors here has hidden bugs, so explicitly # check for the cloning interface before calling it. if hasattr(old_effect, "clone"): old_effect.clone(screen, self) def exit(self): """ Handle any tidy up required on the exit of the Scene. """ # Save off any persistent state for each effect. for effect in self._effects: if hasattr(effect, "save"): effect.save() def add_effect(self, effect, reset=True): """ Add an effect to the Scene. This method can be called at any time - even when playing the Scene. The default logic assumes that the Effect needs to be reset before being displayed. This can be overridden using the `reset` parameter. :param effect: The Effect to be added. :param reset: Whether to reset the Effect that has just been added. """ # Reset the effect in case this is in the middle of a Scene. if reset: effect.reset() effect.register_scene(self) self._effects.append(effect) def remove_effect(self, effect): """ Remove an effect from the scene. :param effect: The effect to remove. """ self._effects.remove(effect) def process_event(self, event): """ Process a new input event. This method will pass the event on to any Effects in reverse Z order so that the top-most Effect has priority. :param event: The Event that has been triggered. :returns: None if the Scene processed the event, else the original event. """ for effect in reversed(self._effects): event = effect.process_event(event) if event is None: break return event @property def name(self): """ :return: The name of this Scene. May be None. """ return self._name @property def effects(self): """ :return: The list of Effects in this Scene. """ return self._effects @property def duration(self): """ :return: The length of the scene in frames. """ return self._duration @property def clear(self): """ :return: Whether the Scene should clear at the start. """ return self._clear python-asciimatics-1.15.0/asciimatics/screen.py000066400000000000000000003070431511423144500215370ustar00rootroot00000000000000""" This module defines common screen output function. For more details, see http://asciimatics.readthedocs.io/en/latest/io.html """ import os import signal import struct import sys import time from abc import ABCMeta, abstractmethod from functools import update_wrapper, partial from itertools import zip_longest from locale import getlocale, getdefaultlocale from logging import getLogger from math import sqrt from wcwidth import wcwidth, wcswidth from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import ResizeScreenError, StopApplication, NextScene from asciimatics.utilities import _DotDict from asciimatics import constants logger = getLogger(__name__) # Looks like pywin32 is missing some Windows constants ENABLE_EXTENDED_FLAGS = 0x0080 ENABLE_QUICK_EDIT_MODE = 0x0040 class _DoubleBuffer(): """ Pure python Screen buffering. """ def __init__(self, height, width): """ :param height: Height of the buffer to create. :param width: Width of the buffer to create. """ super().__init__() self._height = height self._width = width self._double_buffer = None line = [(" ", Screen.COLOUR_WHITE, 0, 0, 1) for _ in range(self._width)] self._screen_buffer = [line[:] for _ in range(self._height)] self.clear(Screen.COLOUR_WHITE, 0, 0) def clear(self, fg, attr, bg, x=0, y=0, w=None, h=None): """ Clear a box in the double-buffer. This does not clear the screen buffer and so the next call to deltas will still show all changes. Default box is the whole screen buffer. :param fg: The foreground colour to use for the new buffer. :param attr: The attribute value to use for the new buffer. :param bg: The background colour to use for the new buffer. :param x: Optional X coordinate for top left of box. :param y: Optional Y coordinate for top left of box. :param w: Optional width of the box. :param h: Optional height of the box. """ width = self._width if w is None else w height = self._height if h is None else h width = max(0, min(self._width - x, width)) height = max(0, min(self._height - y, height)) line = [(" ", fg, attr, bg, 1) for _ in range(width)] if x == 0 and y == 0 and w is None and h is None: self._double_buffer = [line[:] for _ in range(height)] else: for i in range(y, y + height): self._double_buffer[i][x:x + w] = line[:] def invalidate(self): """ Invalidate the screen buffer to force a full refresh. """ line = [(None, None, None, None, 1) for _ in range(self._width)] self._screen_buffer = [line[:] for _ in range(self._height)] def get(self, x, y): """ Get the cell value from the specified location :param x: The column (x coord) of the character. :param y: The row (y coord) of the character. :return: A 5-tuple of (unicode, foreground, attributes, background, width). """ return self._double_buffer[y][x] def set(self, x, y, value): """ Set the cell value from the specified location :param x: The column (x coord) of the character. :param y: The row (y coord) of the character. :param value: A 5-tuple of (unicode, foreground, attributes, background, width). """ self._double_buffer[y][x] = value def deltas(self, start, height): """ Return a list-like (i.e. iterable) object of (y, x) tuples """ for y in range(start, min(start + height, self._height)): for x in range(self._width): old_cell = self._screen_buffer[y][x] new_cell = self._double_buffer[y][x] if old_cell != new_cell: yield y, x def scroll(self, lines): """ Scroll the window up or down. :param lines: Number of lines to scroll. Negative numbers move the buffer up. """ line = [(" ", Screen.COLOUR_WHITE, 0, 0, 1) for _ in range(self._width)] if lines > 0: # Limit to buffer size - this will just invalidate all the data lines = min(lines, self._height) for y in range(0, self._height - lines): self._double_buffer[y] = self._double_buffer[y + lines] self._screen_buffer[y] = self._screen_buffer[y + lines] for y in range(self._height - lines, self._height): self._double_buffer[y] = line[:] self._screen_buffer[y] = line[:] else: # Limit to buffer size - this will just invalidate all the data lines = max(lines, -self._height) for y in range(self._height - 1, -lines - 1, -1): self._double_buffer[y] = self._double_buffer[y + lines] self._screen_buffer[y] = self._screen_buffer[y + lines] for y in range(0, -lines): self._double_buffer[y] = line[:] self._screen_buffer[y] = line[:] def block_transfer(self, buffer, x, y): """ Copy a buffer entirely to this double buffer. :param buffer: The double buffer to copy :param x: The X origin for where to place it in this buffer :param y: The Y origin for where to place it in this buffer """ # Just copy the double-buffer cells - the real screen will sync on refresh. block_min_x = max(0, x) block_max_x = min(x + buffer.width, self._width) # Check for trivial non-overlap if block_min_x > block_max_x: return # Copy the available section for by in range(0, self._height): if y <= by < y + buffer.height: self._double_buffer[by][block_min_x:block_max_x] = buffer.slice( block_min_x - x, by - y, block_max_x - block_min_x) def slice(self, x, y, width): """ Provide a slice of data from the buffer at the specified location :param x: The X origin :param y: The Y origin :param width: The width of slice required :return: The slice of tuples from the current double-buffer """ return self._double_buffer[y][x:x + width] def sync(self): """ Synchronize the screen buffer with the double buffer. """ # We're copying an array of tuples, so only need to copy the 2-D array (as the tuples are immutable). # This is way faster than a deep copy (which is INCREDIBLY slow). self._screen_buffer = [row[:] for row in self._double_buffer] @property def height(self): """ The height of this buffer. """ return self._height @property def width(self): """ The width of this buffer. """ return self._width @property def plain_image(self): return ["".join(x[0] for x in self.slice(0, y, self.width)) for y in range(self.height)] @property def colour_map(self): return [[x[1:4] for x in self.slice(0, y, self.width)] for y in range(self.height)] class _AbstractCanvas(metaclass=ABCMeta): """ Abstract class to handle screen buffering. """ # Characters for anti-aliasing line drawing. _line_chars = " ''^.|/7.\\|Ywbd#" _uni_line_chars = " ▘▝▀▖▌▞▛▗▚▐▜▄▙▟█" # Colour palette for 8/16 colour terminals _8_palette = [ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, ] + [0x00 for _ in range(248 * 3)] # Colour palette for 256 colour terminals _256_palette = [ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x87, 0x00, 0x00, 0xaf, 0x00, 0x00, 0xd7, 0x00, 0x00, 0xff, 0x00, 0x5f, 0x00, 0x00, 0x5f, 0x5f, 0x00, 0x5f, 0x87, 0x00, 0x5f, 0xaf, 0x00, 0x5f, 0xd7, 0x00, 0x5f, 0xff, 0x00, 0x87, 0x00, 0x00, 0x87, 0x5f, 0x00, 0x87, 0x87, 0x00, 0x87, 0xaf, 0x00, 0x87, 0xd7, 0x00, 0x87, 0xff, 0x00, 0xaf, 0x00, 0x00, 0xaf, 0x5f, 0x00, 0xaf, 0x87, 0x00, 0xaf, 0xaf, 0x00, 0xaf, 0xd7, 0x00, 0xaf, 0xff, 0x00, 0xd7, 0x00, 0x00, 0xd7, 0x5f, 0x00, 0xd7, 0x87, 0x00, 0xd7, 0xaf, 0x00, 0xd7, 0xd7, 0x00, 0xd7, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5f, 0x00, 0xff, 0x87, 0x00, 0xff, 0xaf, 0x00, 0xff, 0xd7, 0x00, 0xff, 0xff, 0x5f, 0x00, 0x00, 0x5f, 0x00, 0x5f, 0x5f, 0x00, 0x87, 0x5f, 0x00, 0xaf, 0x5f, 0x00, 0xd7, 0x5f, 0x00, 0xff, 0x5f, 0x5f, 0x00, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x87, 0x5f, 0x5f, 0xaf, 0x5f, 0x5f, 0xd7, 0x5f, 0x5f, 0xff, 0x5f, 0x87, 0x00, 0x5f, 0x87, 0x5f, 0x5f, 0x87, 0x87, 0x5f, 0x87, 0xaf, 0x5f, 0x87, 0xd7, 0x5f, 0x87, 0xff, 0x5f, 0xaf, 0x00, 0x5f, 0xaf, 0x5f, 0x5f, 0xaf, 0x87, 0x5f, 0xaf, 0xaf, 0x5f, 0xaf, 0xd7, 0x5f, 0xaf, 0xff, 0x5f, 0xd7, 0x00, 0x5f, 0xd7, 0x5f, 0x5f, 0xd7, 0x87, 0x5f, 0xd7, 0xaf, 0x5f, 0xd7, 0xd7, 0x5f, 0xd7, 0xff, 0x5f, 0xff, 0x00, 0x5f, 0xff, 0x5f, 0x5f, 0xff, 0x87, 0x5f, 0xff, 0xaf, 0x5f, 0xff, 0xd7, 0x5f, 0xff, 0xff, 0x87, 0x00, 0x00, 0x87, 0x00, 0x5f, 0x87, 0x00, 0x87, 0x87, 0x00, 0xaf, 0x87, 0x00, 0xd7, 0x87, 0x00, 0xff, 0x87, 0x5f, 0x00, 0x87, 0x5f, 0x5f, 0x87, 0x5f, 0x87, 0x87, 0x5f, 0xaf, 0x87, 0x5f, 0xd7, 0x87, 0x5f, 0xff, 0x87, 0x87, 0x00, 0x87, 0x87, 0x5f, 0x87, 0x87, 0x87, 0x87, 0x87, 0xaf, 0x87, 0x87, 0xd7, 0x87, 0x87, 0xff, 0x87, 0xaf, 0x00, 0x87, 0xaf, 0x5f, 0x87, 0xaf, 0x87, 0x87, 0xaf, 0xaf, 0x87, 0xaf, 0xd7, 0x87, 0xaf, 0xff, 0x87, 0xd7, 0x00, 0x87, 0xd7, 0x5f, 0x87, 0xd7, 0x87, 0x87, 0xd7, 0xaf, 0x87, 0xd7, 0xd7, 0x87, 0xd7, 0xff, 0x87, 0xff, 0x00, 0x87, 0xff, 0x5f, 0x87, 0xff, 0x87, 0x87, 0xff, 0xaf, 0x87, 0xff, 0xd7, 0x87, 0xff, 0xff, 0xaf, 0x00, 0x00, 0xaf, 0x00, 0x5f, 0xaf, 0x00, 0x87, 0xaf, 0x00, 0xaf, 0xaf, 0x00, 0xd7, 0xaf, 0x00, 0xff, 0xaf, 0x5f, 0x00, 0xaf, 0x5f, 0x5f, 0xaf, 0x5f, 0x87, 0xaf, 0x5f, 0xaf, 0xaf, 0x5f, 0xd7, 0xaf, 0x5f, 0xff, 0xaf, 0x87, 0x00, 0xaf, 0x87, 0x5f, 0xaf, 0x87, 0x87, 0xaf, 0x87, 0xaf, 0xaf, 0x87, 0xd7, 0xaf, 0x87, 0xff, 0xaf, 0xaf, 0x00, 0xaf, 0xaf, 0x5f, 0xaf, 0xaf, 0x87, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xd7, 0xaf, 0xaf, 0xff, 0xaf, 0xd7, 0x00, 0xaf, 0xd7, 0x5f, 0xaf, 0xd7, 0x87, 0xaf, 0xd7, 0xaf, 0xaf, 0xd7, 0xd7, 0xaf, 0xd7, 0xff, 0xaf, 0xff, 0x00, 0xaf, 0xff, 0x5f, 0xaf, 0xff, 0x87, 0xaf, 0xff, 0xaf, 0xaf, 0xff, 0xd7, 0xaf, 0xff, 0xff, 0xd7, 0x00, 0x00, 0xd7, 0x00, 0x5f, 0xd7, 0x00, 0x87, 0xd7, 0x00, 0xaf, 0xd7, 0x00, 0xd7, 0xd7, 0x00, 0xff, 0xd7, 0x5f, 0x00, 0xd7, 0x5f, 0x5f, 0xd7, 0x5f, 0x87, 0xd7, 0x5f, 0xaf, 0xd7, 0x5f, 0xd7, 0xd7, 0x5f, 0xff, 0xd7, 0x87, 0x00, 0xd7, 0x87, 0x5f, 0xd7, 0x87, 0x87, 0xd7, 0x87, 0xaf, 0xd7, 0x87, 0xd7, 0xd7, 0x87, 0xff, 0xd7, 0xaf, 0x00, 0xd7, 0xaf, 0x5f, 0xd7, 0xaf, 0x87, 0xd7, 0xaf, 0xaf, 0xd7, 0xaf, 0xd7, 0xd7, 0xaf, 0xff, 0xd7, 0xd7, 0x00, 0xd7, 0xd7, 0x5f, 0xd7, 0xd7, 0x87, 0xd7, 0xd7, 0xaf, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xff, 0xd7, 0xff, 0x00, 0xd7, 0xff, 0x5f, 0xd7, 0xff, 0x87, 0xd7, 0xff, 0xaf, 0xd7, 0xff, 0xd7, 0xd7, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x5f, 0xff, 0x00, 0x87, 0xff, 0x00, 0xaf, 0xff, 0x00, 0xd7, 0xff, 0x00, 0xff, 0xff, 0x5f, 0x00, 0xff, 0x5f, 0x5f, 0xff, 0x5f, 0x87, 0xff, 0x5f, 0xaf, 0xff, 0x5f, 0xd7, 0xff, 0x5f, 0xff, 0xff, 0x87, 0x00, 0xff, 0x87, 0x5f, 0xff, 0x87, 0x87, 0xff, 0x87, 0xaf, 0xff, 0x87, 0xd7, 0xff, 0x87, 0xff, 0xff, 0xaf, 0x00, 0xff, 0xaf, 0x5f, 0xff, 0xaf, 0x87, 0xff, 0xaf, 0xaf, 0xff, 0xaf, 0xd7, 0xff, 0xaf, 0xff, 0xff, 0xd7, 0x00, 0xff, 0xd7, 0x5f, 0xff, 0xd7, 0x87, 0xff, 0xd7, 0xaf, 0xff, 0xd7, 0xd7, 0xff, 0xd7, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x87, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0x08, 0x08, 0x08, 0x12, 0x12, 0x12, 0x1c, 0x1c, 0x1c, 0x26, 0x26, 0x26, 0x30, 0x30, 0x30, 0x3a, 0x3a, 0x3a, 0x44, 0x44, 0x44, 0x4e, 0x4e, 0x4e, 0x58, 0x58, 0x58, 0x62, 0x62, 0x62, 0x6c, 0x6c, 0x6c, 0x76, 0x76, 0x76, 0x80, 0x80, 0x80, 0x8a, 0x8a, 0x8a, 0x94, 0x94, 0x94, 0x9e, 0x9e, 0x9e, 0xa8, 0xa8, 0xa8, 0xb2, 0xb2, 0xb2, 0xbc, 0xbc, 0xbc, 0xc6, 0xc6, 0xc6, 0xd0, 0xd0, 0xd0, 0xda, 0xda, 0xda, 0xe4, 0xe4, 0xe4, 0xee, 0xee, 0xee, ] def __init__(self, height, width, buffer_height, colours, unicode_aware): """ :param height: The buffer height for this object. :param width: The buffer width for this object. :param buffer_height: The buffer height for this object. :param colours: Number of colours for this object. :param unicode_aware: Force use of unicode options for this object. """ super().__init__() # Can we handle unicode environments? self._unicode_aware = unicode_aware # Create screen buffers. self.height = height self.width = width self.colours = colours self._buffer_height = height if buffer_height is None else buffer_height self._buffer = None self._start_line = 0 self._x = 0 self._y = 0 # dictionary cache for colour blending self._blends = {} # Reset the screen ready to go... self.reset() def clear_buffer(self, fg, attr, bg, x=0, y=0, w=None, h=None): """ Clear a box in the current double-buffer used by this object. This is the recommended way to clear parts, or all, ofthe Screen without causing flicker as it will only become visible at the next refresh. Defaults to the whole buffer if no box is specified. :param fg: The foreground colour to use for the new buffer. :param attr: The attribute value to use for the new buffer. :param bg: The background colour to use for the new buffer. :param x: Optional X coordinate for top left of box. :param y: Optional Y coordinate for top left of box. :param w: Optional width of the box. :param h: Optional height of the box. """ self._buffer.clear(fg, attr, bg, x, y, w, h) def reset(self): """ Reset the internal buffers for the abstract canvas. """ # Reset our screen buffer self._start_line = 0 self._x = self._y = None self._buffer = _DoubleBuffer(self._buffer_height, self.width) self._reset() def scroll(self, lines=1): """ Scroll the abstract canvas up one line. :param lines: The number of lines to scroll. Defaults to down by one. """ self._buffer.scroll(lines) self._start_line += lines def scroll_to(self, line): """ Scroll the abstract canvas to make a specific line. :param line: The line to scroll to. """ self._buffer.scroll(line - self._start_line) self._start_line = line @abstractmethod def _reset(self): """ Internal implementation required to reset underlying drawing interface. """ @abstractmethod def refresh(self): """ Refresh this object - this will draw to the underlying display interface. """ def get_from(self, x, y): """ Get the character at the specified location. :param x: The column (x coord) of the character. :param y: The row (y coord) of the character. :return: A 4-tuple of (ascii code, foreground, attributes, background) for the character at the location. """ # Convert to buffer coordinates y -= self._start_line if y < 0 or y >= self._buffer_height or x < 0 or x >= self.width: return None cell = self._buffer.get(x, y) return ord(cell[0]), cell[1], cell[2], cell[3] def print_at(self, text, x, y, colour=7, attr=0, bg=0, transparent=False): """ Print the text at the specified location using the specified colour and attributes. :param text: The (single line) text to be printed. :param x: The column (x coord) for the start of the text. :param y: The line (y coord) for the start of the text. :param colour: The colour of the text to be displayed. :param attr: The cell attribute of the text to be displayed. :param bg: The background colour of the text to be displayed. :param transparent: Whether to print spaces or not, thus giving a transparent effect. The colours and attributes are the COLOUR_xxx and A_yyy constants defined in the Screen class. """ # Convert to the logically visible window that our double-buffer provides y -= self._start_line # Trim text to the buffer vertically. Don't trim horizontally as we don't know whether any # of these characters are dual-width yet. Handle it on the fly below... if y < 0 or y >= self._buffer_height or x > self.width: return text = str(text) if len(text) > 0: if self._unicode_aware: j = 0 for i, c in enumerate(text): # Handle under-run and overrun of double-width glyphs now. # # Note that wcwidth uses significant resources, so only call when we have a # unicode aware application. The rest of the time assume ASCII. width = wcwidth(c) if self._unicode_aware and ord(c) >= 256 else 1 if x + i + j < 0: x += (width - 1) continue if x + i + j + width > self.width: return # Handle modifier glyphs - just delete them for now. if width == 0: j -= 1 continue # Now handle the update. if c != " " or not transparent: # Fix up orphaned double-width glyphs that we've just bisected. if x + i + j - 1 >= 0 and self._buffer.get(x + i + j - 1, y)[4] == 2: self._buffer.set(x + i + j - 1, y, ("x", 0, 0, 0, 1)) self._buffer.set(x + i + j, y, (c, colour, attr, bg, width)) if width == 2: j += 1 if x + i + j < self.width: self._buffer.set(x + i + j, y, (c, colour, attr, bg, 0)) # Now fix up any glyphs we may have bisected the other way. if x + i + j + 1 < self.width and self._buffer.get(x + i + j + 1, y)[4] == 0: self._buffer.set(x + i + j + 1, y, ("x", 0, 0, 0, 1)) else: # Optimized version that ignores double-width characters if x < 0: text = text[-x:] x = 0 if x + len(text) > self.width: text = text[:self.width - x] if not transparent: self._buffer.set(slice(x, x + len(text)), y, [(c, colour, attr, bg, 1) for c in text]) else: for i, c in enumerate(text): if c != " ": self._buffer.set(x + i, y, (c, colour, attr, bg, 1)) def block_transfer(self, buffer, x, y): """ Copy a buffer to the screen double buffer at a specified location. :param buffer: The double buffer to copy :param x: The X origin for where to place it in the Screen :param y: The Y origin for where to place it in the Screen """ self._buffer.block_transfer(buffer, x, y) @property def start_line(self): """ :return: The start line of the top of the canvas. """ return self._start_line @property def unicode_aware(self): """ :return: Whether unicode input/output is supported or not. """ return self._unicode_aware @property def dimensions(self): """ :return: The full dimensions of the canvas as a (height, width) tuple. """ return self.height, self.width @property def palette(self): """ :return: A palette compatible with the PIL. """ if self.colours < 256: # Use the ANSI colour set. return self._8_palette else: return self._256_palette def centre(self, text, y, colour=7, attr=0, colour_map=None): """ Centre the text on the specified line (y) using the optional colour and attributes. :param text: The (single line) text to be printed. :param y: The line (y coord) for the start of the text. :param colour: The colour of the text to be displayed. :param attr: The cell attribute of the text to be displayed. :param colour_map: Colour/attribute list for multi-colour text. The colours and attributes are the COLOUR_xxx and A_yyy constants defined in the Screen class. """ if self._unicode_aware: x = (self.width - wcswidth(text)) // 2 else: x = (self.width - len(text)) // 2 self.paint(text, x, y, colour, attr, colour_map=colour_map) def paint(self, text, x, y, colour=7, attr=0, bg=0, transparent=False, colour_map=None): """ Paint multi-colour text at the defined location. :param text: The (single line) text to be printed. :param x: The column (x coord) for the start of the text. :param y: The line (y coord) for the start of the text. :param colour: The default colour of the text to be displayed. :param attr: The default cell attribute of the text to be displayed. :param bg: The default background colour of the text to be displayed. :param transparent: Whether to print spaces or not, thus giving a transparent effect. :param colour_map: Colour/attribute list for multi-colour text. The colours and attributes are the COLOUR_xxx and A_yyy constants defined in the Screen class. colour_map is a list of tuples (foreground, attribute, background) that must be the same length as the passed in text (or None if no mapping is required). """ if colour_map is None: self.print_at(text, x, y, colour, attr, bg, transparent) else: offset = next_offset = 0 current = "" for c, m in zip_longest(str(text), colour_map): if m: if len(current) > 0: self.print_at(current, x + offset, y, colour, attr, bg, transparent) offset = next_offset current = "" if len(m) > 0 and m[0] is not None: colour = m[0] if len(m) > 1 and m[1] is not None: attr = m[1] if len(m) > 2 and m[2] is not None: bg = m[2] if c: current += c next_offset += wcwidth(c) if ord(c) >= 256 else 1 if len(current) > 0: self.print_at(current, x + offset, y, colour, attr, bg, transparent) def _blend(self, new, old, ratio): """ Blend the new colour with the old according to the ratio. :param new: The new colour (or None if not required). :param old: The old colour. :param ratio: The ratio to blend new and old :returns: the new colour index to use for the required blend. """ # Don't bother blending if none is required. if new is None: return old # Check colour blend cache for a quick answer. key = (min(new, old), max(new, old)) if key in self._blends: return self._blends[key] # No quick answer - do it the long way... First lookup the RGB values # for both colours and blend. (r1, g1, b1) = self.palette[new * 3:new * 3 + 3] (r2, g2, b2) = self.palette[old * 3:old * 3 + 3] # Helper function to blend RGB values. def f(c1, c2): return ((c1 * ratio) + (c2 * (100 - ratio))) // 100 r = f(r1, r2) g = f(g1, g2) b = f(b1, b2) # Now do the reverse lookup... nearest = (256 ** 2) * 3 match = 0 for c in range(self.colours): (rc, gc, bc) = self.palette[c * 3:c * 3 + 3] diff = sqrt(((rc - r) * 0.3) ** 2 + ((gc - g) * 0.59) ** 2 + ((bc - b) * 0.11) ** 2) if diff < nearest: nearest = diff match = c # Save off the answer and return it self._blends[key] = match return match def highlight(self, x, y, w, h, fg=None, bg=None, blend=100): """ Highlight a specified section of the screen. :param x: The column (x coord) for the start of the highlight. :param y: The line (y coord) for the start of the highlight. :param w: The width of the highlight (in characters). :param h: The height of the highlight (in characters). :param fg: The foreground colour of the highlight. :param bg: The background colour of the highlight. :param blend: How much (as a percentage) to take of the new colour when blending. The colours and attributes are the COLOUR_xxx and A_yyy constants defined in the Screen class. If fg or bg are None that means don't change the foreground/background as appropriate. """ # Convert to buffer coordinates y -= self._start_line for i in range(w): if x + i >= self.width or x + i < 0: continue for j in range(h): if y + j >= self._buffer_height or y + j < 0: continue old = self._buffer.get(x + i, y + j) new_bg = self._blend(bg, old[3], blend) new_fg = self._blend(fg, old[1], blend) self._buffer.set(x + i, y + j, (old[0], new_fg, old[2], new_bg, old[4])) def is_visible(self, x, y): """ Return whether the specified location is on the visible screen. :param x: The column (x coord) for the location to check. :param y: The line (y coord) for the location to check. """ return ((0 <= x < self.width) and (self._start_line <= y < self._start_line + self.height)) def move(self, x, y): """ Move the drawing cursor to the specified position. :param x: The column (x coord) for the location to check. :param y: The line (y coord) for the location to check. """ self._x = int(round(x * 2, 0)) self._y = int(round(y * 2, 0)) def draw(self, x, y, char=None, colour=7, bg=0, thin=False): """ Draw a line from drawing cursor to the specified position. This uses a modified Bressenham algorithm, interpolating twice as many points to render down to anti-aliased characters when no character is specified, or uses standard algorithm plotting with the specified character. :param x: The column (x coord) for the location to check. :param y: The line (y coord) for the location to check. :param char: Optional character to use to draw the line. :param colour: Optional colour for plotting the line. :param bg: Optional background colour for plotting the line. :param thin: Optional width of anti-aliased line. """ # Decide what type of line drawing to use. line_chars = (self._uni_line_chars if self._unicode_aware else self._line_chars) # Define line end points. x0 = self._x y0 = self._y x1 = int(round(x * 2, 0)) y1 = int(round(y * 2, 0)) # Remember last point for next line. self._x = x1 self._y = y1 # Don't bother drawing anything if we're guaranteed to be off-screen # pylint: disable-next=too-many-boolean-expressions if ((x0 < 0 and x1 < 0) or (x0 >= self.width * 2 and x1 >= self.width * 2) or (y0 < 0 and y1 < 0) or (y0 >= self.height * 2 and y1 >= self.height * 2)): return dx = abs(x1 - x0) dy = abs(y1 - y0) sx = -1 if x0 > x1 else 1 sy = -1 if y0 > y1 else 1 def _get_start_char(cx, cy): needle = self.get_from(cx, cy) if needle is not None: letter, cfg, _, cbg = needle if colour == cfg and bg == cbg and chr(letter) in line_chars: return line_chars.find(chr(letter)) return 0 def _fast_fill(start_x, end_x, iy): next_char = -1 for ix in range(start_x, end_x): if ix % 2 == 0 or next_char == -1: next_char = _get_start_char(ix // 2, iy // 2) next_char |= 2 ** abs(ix % 2) * 4 ** (iy % 2) if ix % 2 == 1: self.print_at(line_chars[next_char], ix // 2, iy // 2, colour, bg=bg) if end_x % 2 == 1: self.print_at(line_chars[next_char], end_x // 2, iy // 2, colour, bg=bg) def _draw_on_x(ix, iy): err = dx px = ix - 2 py = iy - 2 next_char = 0 while ix != x1: if ix < px or ix - px >= 2 or iy < py or iy - py >= 2: px = ix & ~1 py = iy & ~1 next_char = _get_start_char(px // 2, py // 2) next_char |= 2 ** abs(ix % 2) * 4 ** (iy % 2) err -= 2 * dy if err < 0: iy += sy err += 2 * dx ix += sx if char is None: self.print_at(line_chars[next_char], px // 2, py // 2, colour, bg=bg) else: self.print_at(char, px // 2, py // 2, colour, bg=bg) def _draw_on_y(ix, iy): err = dy px = ix - 2 py = iy - 2 next_char = 0 while iy != y1: if ix < px or ix - px >= 2 or iy < py or iy - py >= 2: px = ix & ~1 py = iy & ~1 next_char = _get_start_char(px // 2, py // 2) next_char |= 2 ** abs(ix % 2) * 4 ** (iy % 2) err -= 2 * dx if err < 0: ix += sx err += 2 * dy iy += sy if char is None: self.print_at(line_chars[next_char], px // 2, py // 2, colour, bg=bg) else: self.print_at(char, px // 2, py // 2, colour, bg=bg) if dy == 0 and thin and char is None: # Fast-path for polygon filling _fast_fill(min(x0, x1), max(x0, x1), y0) elif dx > dy: _draw_on_x(x0, y0) if not thin: _draw_on_x(x0, y0 + 1) else: _draw_on_y(x0, y0) if not thin: _draw_on_y(x0 + 1, y0) def fill_polygon(self, polygons, colour=7, bg=0): """ Draw a filled polygon. This function uses the scan line algorithm to create the polygon. See https://www.cs.uic.edu/~jbell/CourseNotes/ComputerGraphics/PolygonFilling.html for details. :param polygons: A list of polygons (which are each a list of (x,y) coordinates for the points of the polygon) - i.e. nested list of 2-tuples. :param colour: The foreground colour to use for the polygon :param bg: The background colour to use for the polygon """ def _add_edge(a, b): # Ignore horizontal lines - they are redundant if a[1] == b[1]: return # Ignore any edges that do not intersect the visible raster lines at all. if (a[1] < 0 and b[1] < 0) or (a[1] >= self.height and b[1] >= self.height): return # Save off the edge, always starting at the lowest value of y. new_edge = _DotDict() if a[1] < b[1]: new_edge.min_y = a[1] new_edge.max_y = b[1] new_edge.x = a[0] new_edge.dx = (b[0] - a[0]) / (b[1] - a[1]) / 2 else: new_edge.min_y = b[1] new_edge.max_y = a[1] new_edge.x = b[0] new_edge.dx = (a[0] - b[0]) / (a[1] - b[1]) / 2 edges.append(new_edge) # Create a table of all the edges in the polygon, sorted on smallest x. logger.debug("Processing polygon: %s", polygons) min_y = self.height max_y = -1 edges = [] last = None for polygon in polygons: # Ignore lines and polygons. if len(polygon) <= 2: continue # Ignore any polygons completely off the screen x, y = zip(*polygon) p_min_x = min(x) p_max_x = max(x) p_min_y = min(y) p_max_y = max(y) if p_max_x < 0 or p_min_x >= self.width or p_max_y < 0 or p_min_y > self.height: continue # Build up the edge list, maintaining bounding coordinates on the Y axis. min_y = min(p_min_y, min_y) max_y = max(p_max_y, max_y) for i, point in enumerate(polygon): if i != 0: _add_edge(last, point) last = point _add_edge(polygon[0], polygon[-1]) edges = sorted(edges, key=lambda e: e.x) # Check we still have something to do: if len(edges) == 0: return # Re-base all edges to visible Y coordinates of the screen. for edge in edges: if edge.min_y < 0: edge.x -= int(edge.min_y * 2) * edge.dx edge.min_y = 0 min_y = max(0, min_y) max_y = min(max_y - min_y, self.height) logger.debug("Resulting edges: %s", edges) # Render each line in the bounding rectangle. for y in [min_y + (i / 2) for i in range(0, int(max_y) * 2)]: # Create a list of live edges (for drawing this raster line) and edges for next # iteration of the raster. live_edges = [] new_edges = [] for edge in edges: if edge.min_y <= y <= edge.max_y: live_edges.append(edge) if y < edge.max_y: new_edges.append(edge) # Draw the portions of the line that are inside the polygon. count = 0 last_x = 0 for edge in live_edges: # Draw the next segment if 0 <= y < self.height: if edge.max_y != y: count += 1 if count % 2 == 1: last_x = edge.x else: # Don't bother drawing lines entirely off the screen. if not ((last_x < 0 and edge.x < 0) or (last_x >= self.width and edge.x >= self.width)): # Clip raster to screen width. self.move(max(0, last_x), y) self.draw( min(edge.x, self.width), y, colour=colour, bg=bg, thin=True) # Update the x location for this active edge. edge.x += edge.dx # Rely on the fact that we have the same dicts in both live_edges and new_edges, so # we just need to resort new_edges for the next iteration. edges = sorted(new_edges, key=lambda e: e.x) class TemporaryCanvas(_AbstractCanvas): """ A TemporaryCanvas is an object that can only be used to draw to a buffer. This class is desigend purely for use by dynamic renderers and so ignores some features of a full Canvas - most notably the screen related fhnction (e.g. the screen buffer and related properties). """ def __init__(self, height, width): """ :param height: The height of the screen buffer to be used. :param width: The width of the screen buffer to be used. """ # Colours and unicode rendering are up to the user. Pick defaults that won't limit them. super().__init__(height, width, None, 256, True) @property def plain_image(self): return self._buffer.plain_image @property def colour_map(self): return self._buffer.colour_map def refresh(self): pass def _reset(self): pass class Canvas(_AbstractCanvas): """ A Canvas is an object that can be used to draw to the screen. It maintains its own buffer that will be flushed to the screen when `refresh()` is called. """ def __init__(self, screen, height, width, x=None, y=None): """ :param screen: The underlying Screen that will be drawn to on refresh. :param height: The height of the screen buffer to be used. :param width: The width of the screen buffer to be used. :param x: The x position for the top left corner of the Canvas. :param y: The y position for the top left corner of the Canvas. If either of the x or y positions is not set, the Canvas will default to centring within the current Screen for that location. """ # Save off the screen details. super().__init__( height, width, None, screen.colours, screen.unicode_aware) self._screen = screen self._dx = (screen.width - width) // 2 if x is None else x self._dy = (screen.height - height) // 2 if y is None else y def refresh(self): """ Flush the canvas content to the underlying screen. """ self._screen.block_transfer(self._buffer, self._dx, self._dy) def _reset(self): # Nothing needed for a Canvas pass @property def origin(self): """ The location of top left corner of the canvas on the Screen. :returns: A tuple (x, y) of the location """ return self._dx, self._dy class Screen(_AbstractCanvas, metaclass=ABCMeta): """ Class to track basic state of the screen. This constructs the necessary resources to allow us to do the ASCII animations. This is an abstract class that will build the correct concrete class for you when you call :py:meth:`.wrapper`. If needed, you can use the :py:meth:`~.Screen.open` and :py:meth:`~.Screen.close` methods for finer grained control of the construction and tidy up. Note that you need to define the required height for your screen buffer. This is important if you plan on using any Effects that will scroll the screen vertically (e.g. Scroll). It must be big enough to handle the full scrolling of your selected Effect. """ # Text attributes for use when printing to the Screen. A_BOLD = constants.A_BOLD A_NORMAL = constants.A_NORMAL A_REVERSE = constants.A_REVERSE A_UNDERLINE = constants.A_UNDERLINE # Text colours for use when printing to the Screen. COLOUR_DEFAULT = constants.COLOUR_DEFAULT COLOUR_BLACK = constants.COLOUR_BLACK COLOUR_RED = constants.COLOUR_RED COLOUR_GREEN = constants.COLOUR_GREEN COLOUR_YELLOW = constants.COLOUR_YELLOW COLOUR_BLUE = constants.COLOUR_BLUE COLOUR_MAGENTA = constants.COLOUR_MAGENTA COLOUR_CYAN = constants.COLOUR_CYAN COLOUR_WHITE = constants.COLOUR_WHITE # Standard extended key codes. KEY_ESCAPE = -1 KEY_F1 = -2 KEY_F2 = -3 KEY_F3 = -4 KEY_F4 = -5 KEY_F5 = -6 KEY_F6 = -7 KEY_F7 = -8 KEY_F8 = -9 KEY_F9 = -10 KEY_F10 = -11 KEY_F11 = -12 KEY_F12 = -13 KEY_F13 = -14 KEY_F14 = -15 KEY_F15 = -16 KEY_F16 = -17 KEY_F17 = -18 KEY_F18 = -19 KEY_F19 = -20 KEY_F20 = -21 KEY_F21 = -22 KEY_F22 = -23 KEY_F23 = -24 KEY_F24 = -25 KEY_PRINT_SCREEN = -100 KEY_INSERT = -101 KEY_DELETE = -102 KEY_HOME = -200 KEY_END = -201 KEY_LEFT = -203 KEY_UP = -204 KEY_RIGHT = -205 KEY_DOWN = -206 KEY_PAGE_UP = -207 KEY_PAGE_DOWN = -208 KEY_BACK = -300 KEY_TAB = -301 KEY_BACK_TAB = -302 KEY_NUMPAD0 = -400 KEY_NUMPAD1 = -401 KEY_NUMPAD2 = -402 KEY_NUMPAD3 = -403 KEY_NUMPAD4 = -404 KEY_NUMPAD5 = -405 KEY_NUMPAD6 = -406 KEY_NUMPAD7 = -407 KEY_NUMPAD8 = -408 KEY_NUMPAD9 = -409 KEY_MULTIPLY = -410 KEY_ADD = -411 KEY_SUBTRACT = -412 KEY_DECIMAL = -413 KEY_DIVIDE = -414 KEY_CAPS_LOCK = -500 KEY_NUM_LOCK = -501 KEY_SCROLL_LOCK = -502 KEY_SHIFT = -600 KEY_CONTROL = -601 KEY_MENU = -602 def __init__(self, height, width, buffer_height, unicode_aware): """ Don't call this constructor directly. """ super().__init__( height, width, buffer_height, 0, unicode_aware) # Initialize base class variables - e.g. those used for drawing. self.height = height self.width = width self._last_start_line = 0 # Set up internal state for colours - used by children to determine # changes to text colour when refreshing the screen. self._colour = 0 self._attr = 0 self._bg = 0 # tracking of current cursor position - used in screen refresh. self._cur_x = 0 self._cur_y = 0 # Control variables for playing out a set of Scenes. self._scenes = [] self._scene_index = 0 self._frame = 0 self._idle_frame_count = 0 self._forced_update = False self._unhandled_input = self._unhandled_event_default @classmethod def open(cls, height=None, catch_interrupt=False, unicode_aware=None): """ Construct a new Screen for any platform. This will just create the correct Screen object for your environment. See :py:meth:`.wrapper` for a function to create and tidy up once you've finished with the Screen. :param height: The buffer height for this window (for testing only). :param catch_interrupt: Whether to catch and prevent keyboard interrupts. Defaults to False to maintain backwards compatibility. :param unicode_aware: Whether the application can use unicode or not. If None, try to detect from the environment if UTF-8 is enabled. """ if sys.platform == "win32": # Clone the standard output buffer so that we can do whatever we # need for the application, but restore the buffer at the end. # Note that we need to resize the clone to ensure that it is the # same size as the original in some versions of Windows. old_out = win32console.PyConsoleScreenBufferType( win32file.CreateFile("CONOUT$", win32file.GENERIC_READ | win32file.GENERIC_WRITE, win32file.FILE_SHARE_WRITE, None, win32file.OPEN_ALWAYS, 0, None)) try: info = old_out.GetConsoleScreenBufferInfo() except pywintypes.error: info = None win_out = win32console.CreateConsoleScreenBuffer() if info: win_out.SetConsoleScreenBufferSize(info['Size']) else: win_out.SetStdHandle(win32console.STD_OUTPUT_HANDLE) win_out.SetConsoleActiveScreenBuffer() # Get the standard input buffer. win_in = win32console.PyConsoleScreenBufferType( win32file.CreateFile("CONIN$", win32file.GENERIC_READ | win32file.GENERIC_WRITE, win32file.FILE_SHARE_READ, None, win32file.OPEN_ALWAYS, 0, None)) win_in.SetStdHandle(win32console.STD_INPUT_HANDLE) # Hide the cursor. win_out.SetConsoleCursorInfo(1, 0) # Disable scrolling out_mode = win_out.GetConsoleMode() win_out.SetConsoleMode( out_mode & ~ win32console.ENABLE_WRAP_AT_EOL_OUTPUT) # Enable mouse input, disable quick-edit mode and disable ctrl-c # if needed. in_mode = win_in.GetConsoleMode() new_mode = (in_mode | win32console.ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS) new_mode &= ~ENABLE_QUICK_EDIT_MODE if catch_interrupt: # Ignore ctrl-c handlers if specified. new_mode &= ~win32console.ENABLE_PROCESSED_INPUT win_in.SetConsoleMode(new_mode) screen = _WindowsScreen(win_out, win_in, height, old_out, in_mode, unicode_aware=unicode_aware) else: # Reproduce curses.wrapper() stdscr = curses.initscr() curses.noecho() # Shouldn't fail on real systems. This code is for running tests in CI pipelines. try: curses.cbreak() except curses.error: pass stdscr.keypad(1) # Fed up with linters complaining about original curses code - trying to be a bit better... # noinspection PyBroadException # pylint: disable=broad-except try: curses.start_color() except Exception as e: logger.debug(e) screen = _CursesScreen(stdscr, height, catch_interrupt=catch_interrupt, unicode_aware=unicode_aware) return screen @abstractmethod def close(self, restore=True): """ Close down this Screen and tidy up the environment as required. :param restore: whether to restore the environment or not. """ @classmethod def wrapper(cls, func, height=None, catch_interrupt=False, arguments=None, unicode_aware=None): """ Construct a new Screen for any platform. This will initialize the Screen, call the specified function and then tidy up the system as required when the function exits. :param func: The function to call once the Screen has been created. :param height: The buffer height for this Screen (only for test purposes). :param catch_interrupt: Whether to catch and prevent keyboard interrupts. Defaults to False to maintain backwards compatibility. :param arguments: Optional arguments list to pass to func (after the Screen object). :param unicode_aware: Whether the application can use unicode or not. If None, try to detect from the environment if UTF-8 is enabled. """ screen = Screen.open(height, catch_interrupt=catch_interrupt, unicode_aware=unicode_aware) restore = True try: try: if arguments: return func(screen, *arguments) else: return func(screen) except ResizeScreenError: restore = False raise finally: screen.close(restore) def _reset(self): """ Reset the Screen. """ self._last_start_line = 0 self._colour = None self._attr = None self._bg = None self._cur_x = None self._cur_y = None def refresh(self): """ Refresh the screen. """ # Scroll the screen now - we've already sorted the double-buffer to reflect this change. if self._last_start_line != self._start_line: self._scroll(self._start_line - self._last_start_line) self._last_start_line = self._start_line # Now draw any deltas to the scrolled screen. Note that CJK character sets sometimes # use double-width characters, so don't try to draw the next 2nd char (of 0 width). for y, x in self._buffer.deltas(0, self.height): new_cell = self._buffer.get(x, y) if new_cell[4] > 0: self._change_colours(new_cell[1], new_cell[2], new_cell[3]) self._print_at(new_cell[0], x, y, new_cell[4]) # Resynch for next refresh. self._buffer.sync() def clear(self): """ Clear the Screen of all content. Note that this will instantly clear the Screen and reset all buffers to the default state, without waiting for you to call :py:meth:`~.Screen.refresh`. It is designed for use once at the start of your application to reset all buffers and the screen to a known state. If you want to clear parts, or all, of the Screen inside your application without any flicker, use :py:meth:`~.Screen.clear_buffer` instead. """ # Clear the actual terminal self.reset() self._change_colours(Screen.COLOUR_WHITE, 0, 0) self._clear() def get_key(self): """ Check for a key without waiting. This method is deprecated. Use :py:meth:`.get_event` instead. """ event = self.get_event() if event and isinstance(event, KeyboardEvent): return event.key_code return None @abstractmethod def get_event(self): """ Check for any events (e.g. key-press or mouse movement) without waiting. :returns: A :py:obj:`.Event` object if anything was detected, otherwise it returns None. """ @staticmethod def ctrl(char): """ Calculate the control code for a given key. For example, this converts "a" to 1 (which is the code for ctrl-a). :param char: The key to convert to a control code. :return: The control code as an integer or None if unknown. """ # Convert string to int... assuming any non-integer is a string. # TODO: Consider asserting a more rigorous test without falling back to past basestring. if not isinstance(char, int): char = ord(char.upper()) # Only deal with the characters between '@' and '_' return char & 0x1f if 64 <= char <= 95 else None @abstractmethod def has_resized(self): """ Check whether the screen has been re-sized. :returns: True when the screen has been re-sized since the last check. """ def getch(self, x, y): """ Get the character at a specified location. This method is deprecated. Use :py:meth:`.get_from` instead. :param x: The x coordinate. :param y: The y coordinate. """ return self.get_from(x, y) def putch(self, text, x, y, colour=7, attr=0, bg=0, transparent=False): """ Print text at the specified location. This method is deprecated. Use :py:meth:`.print_at` instead. :param text: The (single line) text to be printed. :param x: The column (x coord) for the start of the text. :param y: The line (y coord) for the start of the text. :param colour: The colour of the text to be displayed. :param attr: The cell attribute of the text to be displayed. :param bg: The background colour of the text to be displayed. :param transparent: Whether to print spaces or not, thus giving a transparent effect. """ self.print_at(text, x, y, colour, attr, bg, transparent) @staticmethod def _unhandled_event_default(event): """ Default unhandled event handler for handling simple scene navigation. """ if isinstance(event, KeyboardEvent): c = event.key_code if c in (ord("X"), ord("x"), ord("Q"), ord("q")): raise StopApplication("User terminated app") if c in (ord(" "), ord("\n"), ord("\r")): raise NextScene() def play(self, scenes, stop_on_resize=False, unhandled_input=None, start_scene=None, repeat=True, allow_int=False): """ Play a set of scenes. This is effectively a helper function to wrap :py:meth:`.set_scenes` and :py:meth:`.draw_next_frame` to simplify animation for most applications. :param scenes: a list of :py:obj:`.Scene` objects to play. :param stop_on_resize: Whether to stop when the screen is resized. Default is to carry on regardless - which will typically result in an error. This is largely done for back-compatibility. :param unhandled_input: Function to call for any input not handled by the Scenes/Effects being played. Defaults to a function that closes the application on "Q" or "X" being pressed. :param start_scene: The old Scene to start from. This must have name that matches the name of one of the Scenes passed in. :param repeat: Whether to repeat the Scenes once it has reached the end. Defaults to True. :param allow_int: Allow input to interrupt frame rate delay. :raises ResizeScreenError: if the screen is resized (and allowed by stop_on_resize). The unhandled input function just takes one parameter - the input event that was not handled. """ # Initialise the Screen for animation. self.set_scenes( scenes, unhandled_input=unhandled_input, start_scene=start_scene) # Mainline loop for animations try: while True: a = time.time() self.draw_next_frame(repeat=repeat) if self.has_resized(): if stop_on_resize: self._scenes[self._scene_index].exit() raise ResizeScreenError("Screen resized", self._scenes[self._scene_index]) b = time.time() if b - a < 0.05: # Just in case time has jumped (e.g. time change), ensure we only delay for 0.05s pause = min(0.05, a + 0.05 - b) if allow_int: self.wait_for_input(pause) else: time.sleep(pause) except StopApplication: # Time to stop - just exit the function. return def set_scenes(self, scenes, unhandled_input=None, start_scene=None): """ Remember a set of scenes to be played. This must be called before using :py:meth:`.draw_next_frame`. :param scenes: a list of :py:obj:`.Scene` objects to play. :param unhandled_input: Function to call for any input not handled by the Scenes/Effects being played. Defaults to a function that closes the application on "Q" or "X" being pressed. :param start_scene: The old Scene to start from. This must have name that matches the name of one of the Scenes passed in. :raises ResizeScreenError: if the screen is resized (and allowed by stop_on_resize). The unhandled input function just takes one parameter - the input event that was not handled. """ # Save off the scenes now. self._scenes = scenes # Set up default unhandled input handler if needed. if unhandled_input is None: # Check that none of the Effects is incompatible with the default # handler. safe = True for scene in self._scenes: for effect in scene.effects: safe &= effect.safe_to_default_unhandled_input if safe: unhandled_input = self._unhandled_event_default self._unhandled_input = unhandled_input # Find the starting scene. Default to first if no match. self._scene_index = 0 if start_scene is not None: for i, scene in enumerate(scenes): if scene.name == start_scene.name: self._scene_index = i break # Reset the Scene - this allows the original scene to pick up old # values on resizing. self._scenes[self._scene_index].reset( old_scene=start_scene, screen=self) # Reset other internal state for the animation self._frame = 0 self._idle_frame_count = 0 self._forced_update = False self.clear() def draw_next_frame(self, repeat=True): """ Draw the next frame in the currently configured Scenes. You must call :py:meth:`.set_scenes` before using this for the first time. :param repeat: Whether to repeat the Scenes once it has reached the end. Defaults to True. :raises StopApplication: if the application should be terminated. """ scene = self._scenes[self._scene_index] try: # Check for an event now and remember for refresh reasons. event = self.get_event() got_event = event is not None # Now process all the input events while event is not None: event = scene.process_event(event) if event is not None and self._unhandled_input is not None: self._unhandled_input(event) event = self.get_event() # Only bother with a refresh if there was an event to process or # we have to refresh due to the refresh limit required for an # Effect. self._frame += 1 self._idle_frame_count -= 1 if got_event or self._idle_frame_count <= 0 or self._forced_update: self._forced_update = False self._idle_frame_count = 1000000 for effect in scene.effects: # Update the effect and delete if needed. effect.update(self._frame) if effect.delete_count is not None: effect.delete_count -= 1 if effect.delete_count <= 0: scene.remove_effect(effect) # Sort out when we next _need_ to do a refresh. if effect.frame_update_count > 0: self._idle_frame_count = min(self._idle_frame_count, effect.frame_update_count) self.refresh() if 0 < scene.duration <= self._frame: raise NextScene() except NextScene as e: # Tidy up the current scene. scene.exit() # Find the specified next Scene if e.name is None: # Just allow next iteration of loop self._scene_index += 1 if self._scene_index >= len(self._scenes): if repeat: self._scene_index = 0 else: raise StopApplication("Repeat disabled") from e else: # Find the required scene. for i, scene in enumerate(self._scenes): if scene.name == e.name: self._scene_index = i break else: raise RuntimeError(f"Could not find Scene: '{e.name}'") from e # Reset the screen if needed. scene = self._scenes[self._scene_index] scene.reset() self._frame = 0 self._idle_frame_count = 0 if scene.clear: self.clear() @property def current_scene(self): """ :return: The scene currently being rendered. To be used in conjunction with :py:meth:`.draw_next_frame`. """ return self._scenes[self._scene_index] def force_update(self, full_refresh=False): """ Force the Screen to redraw the current Scene on the next call to draw_next_frame, overriding the frame_update_count value for all the Effects. :param full_refresh: if True force the whole screen to redraw. """ self._forced_update = True if full_refresh: self._buffer.invalidate() @abstractmethod def _change_colours(self, colour, attr, bg): """ Change current colour if required. :param colour: New colour to use. :param attr: New attributes to use. :param bg: New background colour to use. """ @abstractmethod def wait_for_input(self, timeout): """ Wait until there is some input or the timeout is hit. :param timeout: Time to wait for input in seconds (floating point). """ @abstractmethod def _print_at(self, text, x, y, width): """ Print string at the required location. :param text: The text string to print. :param x: The x coordinate :param y: The Y coordinate :param width: The width of the character (for dual-width glyphs in CJK languages). """ @abstractmethod def _clear(self): """ Clear the window. """ @abstractmethod def _scroll(self, lines): """ Scroll the window up or down. :param lines: Number of lines to scroll. Negative numbers scroll down. """ @abstractmethod def set_title(self, title): """ Set the title for this terminal/console session. This will typically change the text displayed in the window title bar. :param title: The title to be set. """ class ManagedScreen(): """ Decorator and class to create a managed Screen. It can be used in two ways. If used as a method decorator it will create and open a new Screen, pass the screen to the method as a keyword argument, and close the screen when the method has completed. If used with the with statement the class will create and open a new Screen, return the screen for using in the block, and close the screen when the statement ends. Note that any arguments are in this class so that you can use it as a decorator or using the with statment. No arguments are required to use. """ def __init__(self, func=lambda: None): """ :param func: The function to call once the Screen has been created. """ update_wrapper(self, func) self.func = func self.screen = None def __get__(self, obj, objtype): """ Class decorator method, so we can use the class in a with statement. See https://stackoverflow.com/a/3296318/4994021 for details. """ return partial(self.__call__, obj) def __call__(self, *args, **kwargs): screen = Screen.open() kwargs["screen"] = screen output = self.func(*args, **kwargs) screen.close() return output def __enter__(self): """ Method used for with statement """ self.screen = Screen.open() return self.screen def __exit__(self, etype, value, traceback): """ Method used for with statement """ self.screen.close() if sys.platform == "win32": import win32con import win32console import win32event import win32file import pywintypes class _WindowsScreen(Screen): """ Windows screen implementation. """ # Virtual key code mapping. _KEY_MAP = { win32con.VK_ESCAPE: Screen.KEY_ESCAPE, win32con.VK_F1: Screen.KEY_F1, win32con.VK_F2: Screen.KEY_F2, win32con.VK_F3: Screen.KEY_F3, win32con.VK_F4: Screen.KEY_F4, win32con.VK_F5: Screen.KEY_F5, win32con.VK_F6: Screen.KEY_F6, win32con.VK_F7: Screen.KEY_F7, win32con.VK_F8: Screen.KEY_F8, win32con.VK_F9: Screen.KEY_F9, win32con.VK_F10: Screen.KEY_F10, win32con.VK_F11: Screen.KEY_F11, win32con.VK_F12: Screen.KEY_F12, win32con.VK_F13: Screen.KEY_F13, win32con.VK_F14: Screen.KEY_F14, win32con.VK_F15: Screen.KEY_F15, win32con.VK_F16: Screen.KEY_F16, win32con.VK_F17: Screen.KEY_F17, win32con.VK_F18: Screen.KEY_F18, win32con.VK_F19: Screen.KEY_F19, win32con.VK_F20: Screen.KEY_F20, win32con.VK_F21: Screen.KEY_F21, win32con.VK_F22: Screen.KEY_F22, win32con.VK_F23: Screen.KEY_F23, win32con.VK_F24: Screen.KEY_F24, win32con.VK_PRINT: Screen.KEY_PRINT_SCREEN, win32con.VK_INSERT: Screen.KEY_INSERT, win32con.VK_DELETE: Screen.KEY_DELETE, win32con.VK_HOME: Screen.KEY_HOME, win32con.VK_END: Screen.KEY_END, win32con.VK_LEFT: Screen.KEY_LEFT, win32con.VK_UP: Screen.KEY_UP, win32con.VK_RIGHT: Screen.KEY_RIGHT, win32con.VK_DOWN: Screen.KEY_DOWN, win32con.VK_PRIOR: Screen.KEY_PAGE_UP, win32con.VK_NEXT: Screen.KEY_PAGE_DOWN, win32con.VK_BACK: Screen.KEY_BACK, win32con.VK_TAB: Screen.KEY_TAB } _EXTRA_KEY_MAP = { win32con.VK_NUMPAD0: Screen.KEY_NUMPAD0, win32con.VK_NUMPAD1: Screen.KEY_NUMPAD1, win32con.VK_NUMPAD2: Screen.KEY_NUMPAD2, win32con.VK_NUMPAD3: Screen.KEY_NUMPAD3, win32con.VK_NUMPAD4: Screen.KEY_NUMPAD4, win32con.VK_NUMPAD5: Screen.KEY_NUMPAD5, win32con.VK_NUMPAD6: Screen.KEY_NUMPAD6, win32con.VK_NUMPAD7: Screen.KEY_NUMPAD7, win32con.VK_NUMPAD8: Screen.KEY_NUMPAD8, win32con.VK_NUMPAD9: Screen.KEY_NUMPAD9, win32con.VK_MULTIPLY: Screen.KEY_MULTIPLY, win32con.VK_ADD: Screen.KEY_ADD, win32con.VK_SUBTRACT: Screen.KEY_SUBTRACT, win32con.VK_DECIMAL: Screen.KEY_DECIMAL, win32con.VK_DIVIDE: Screen.KEY_DIVIDE, win32con.VK_CAPITAL: Screen.KEY_CAPS_LOCK, win32con.VK_NUMLOCK: Screen.KEY_NUM_LOCK, win32con.VK_SCROLL: Screen.KEY_SCROLL_LOCK, win32con.VK_SHIFT: Screen.KEY_SHIFT, win32con.VK_CONTROL: Screen.KEY_CONTROL, win32con.VK_MENU: Screen.KEY_MENU, } # Foreground colour lookup table. _COLOURS = { Screen.COLOUR_DEFAULT: (win32console.FOREGROUND_RED | win32console.FOREGROUND_GREEN | win32console.FOREGROUND_BLUE), Screen.COLOUR_BLACK: 0, Screen.COLOUR_RED: win32console.FOREGROUND_RED, Screen.COLOUR_GREEN: win32console.FOREGROUND_GREEN, Screen.COLOUR_YELLOW: (win32console.FOREGROUND_RED | win32console.FOREGROUND_GREEN), Screen.COLOUR_BLUE: win32console.FOREGROUND_BLUE, Screen.COLOUR_MAGENTA: (win32console.FOREGROUND_RED | win32console.FOREGROUND_BLUE), Screen.COLOUR_CYAN: (win32console.FOREGROUND_BLUE | win32console.FOREGROUND_GREEN), Screen.COLOUR_WHITE: (win32console.FOREGROUND_RED | win32console.FOREGROUND_GREEN | win32console.FOREGROUND_BLUE) } # Background colour lookup table. _BG_COLOURS = { Screen.COLOUR_DEFAULT: 0, Screen.COLOUR_BLACK: 0, Screen.COLOUR_RED: win32console.BACKGROUND_RED, Screen.COLOUR_GREEN: win32console.BACKGROUND_GREEN, Screen.COLOUR_YELLOW: (win32console.BACKGROUND_RED | win32console.BACKGROUND_GREEN), Screen.COLOUR_BLUE: win32console.BACKGROUND_BLUE, Screen.COLOUR_MAGENTA: (win32console.BACKGROUND_RED | win32console.BACKGROUND_BLUE), Screen.COLOUR_CYAN: (win32console.BACKGROUND_BLUE | win32console.BACKGROUND_GREEN), Screen.COLOUR_WHITE: (win32console.BACKGROUND_RED | win32console.BACKGROUND_GREEN | win32console.BACKGROUND_BLUE) } # Attribute lookup table _ATTRIBUTES = { 0: lambda x: x, Screen.A_BOLD: lambda x: x | win32console.FOREGROUND_INTENSITY, Screen.A_NORMAL: lambda x: x, # Windows console uses a bitmap where background is the top nibble, # so we can reverse by swapping nibbles. Screen.A_REVERSE: lambda x: ((x & 15) * 16) + ((x & 240) // 16), Screen.A_UNDERLINE: lambda x: x } def __init__(self, stdout, stdin, buffer_height, old_out, old_in, unicode_aware=False): """ :param stdout: The win32console PyConsoleScreenBufferType object for stdout. :param stdin: The win32console PyConsoleScreenBufferType object for stdin. :param buffer_height: The buffer height for this window (for testing only). :param old_out: The original win32console PyConsoleScreenBufferType object for stdout that should be restored on exit. :param old_in: The original stdin state that should be restored on exit. :param unicode_aware: Whether this Screen can use unicode or not. """ # Save off the screen details and set up the scrolling pad. info = stdout.GetConsoleScreenBufferInfo()['Window'] width = info.Right - info.Left + 1 height = info.Bottom - info.Top + 1 # Detect UTF-8 if needed and then construct the Screen. if unicode_aware is None: # According to MSDN, 65001 is the Windows UTF-8 code page. unicode_aware = win32console.GetConsoleCP() == 65001 super().__init__( height, width, buffer_height, unicode_aware) # Save off the console details. self._stdout = stdout self._stdin = stdin self._last_width = width self._last_height = height self._old_out = old_out self._old_in = old_in # Windows is limited to the ANSI colour set. self.colours = 8 # Opt for compatibility with Linux by default self._map_all = False # Set of keys currently pressed. self._keys = set() def close(self, restore=True): """ Close down this Screen and tidy up the environment as required. :param restore: whether to restore the environment or not. """ if restore: # Reset the original screen settings. self._old_out.SetConsoleActiveScreenBuffer() self._stdin.SetConsoleMode(self._old_in) def map_all_keys(self, state): """ Switch on extended keyboard mapping for this Screen. :param state: Boolean flag where true means map all keys. Enabling this setting will allow Windows to tell you when any key is pressed, including metakeys (like shift and control) and whether the numeric keypad keys have been used. .. warning:: Using this means your application will not be compatible across all platforms. """ self._map_all = state def get_event(self): """ Check for any event without waiting. """ # Look for a new event and consume it if there is one. while len(self._stdin.PeekConsoleInput(1)) > 0: event = self._stdin.ReadConsoleInput(1)[0] if event.EventType == win32console.KEY_EVENT: # Pasting unicode text appears to just generate key-up # events (as if you had pressed the Alt keys plus the # keypad code for the character), but the rest of the # console input simply doesn't # work with key up events - e.g. misses keyboard repeats. # # We therefore allow any key press (i.e. KeyDown) event and # _any_ event that appears to have popped up from nowhere # as long as the Alt key is present. key_code = ord(event.Char) logger.debug("Processing key: %x", key_code) if (event.KeyDown or (key_code > 0 and key_code not in self._keys and event.VirtualKeyCode == win32con.VK_MENU)): # Record any keys that were pressed. if event.KeyDown: self._keys.add(key_code) # Translate keys into a KeyboardEvent object. if event.VirtualKeyCode in self._KEY_MAP: key_code = self._KEY_MAP[event.VirtualKeyCode] # Sadly, we are limited to Linux terminal input and so # can't return modifier states in a cross-platform way. # If the user decided not to be cross-platform, so be # it, otherwise map some standard bindings for extended # keys. if (self._map_all and event.VirtualKeyCode in self._EXTRA_KEY_MAP): key_code = self._EXTRA_KEY_MAP[event.VirtualKeyCode] else: if (event.VirtualKeyCode == win32con.VK_TAB and event.ControlKeyState & win32con.SHIFT_PRESSED): key_code = Screen.KEY_BACK_TAB # Don't return anything if we didn't have a valid # mapping. if key_code: return KeyboardEvent(key_code) else: # Tidy up any key that was previously pressed. At # start-up, we may be mid-key, so can't assume this must # always match up. if key_code in self._keys: self._keys.remove(key_code) elif event.EventType == win32console.MOUSE_EVENT: # Translate into a MouseEvent object. logger.debug("Processing mouse: %d, %d", event.MousePosition.X, event.MousePosition.Y) button = 0 if event.EventFlags == 0: # Button pressed - translate it. if (event.ButtonState & win32con.FROM_LEFT_1ST_BUTTON_PRESSED != 0): button |= MouseEvent.LEFT_CLICK if (event.ButtonState & win32con.RIGHTMOST_BUTTON_PRESSED != 0): button |= MouseEvent.RIGHT_CLICK elif event.EventFlags & win32con.DOUBLE_CLICK != 0: button |= MouseEvent.DOUBLE_CLICK return MouseEvent(event.MousePosition.X, event.MousePosition.Y, button) # If we get here, we've fully processed the event queue and found # nothing interesting. return None def has_resized(self): """ Check whether the screen has been re-sized. """ # Get the current Window dimensions and check them against last # time. re_sized = False info = self._stdout.GetConsoleScreenBufferInfo()['Window'] width = info.Right - info.Left + 1 height = info.Bottom - info.Top + 1 if width != self._last_width or height != self._last_height: re_sized = True return re_sized def _change_colours(self, colour, attr, bg): """ Change current colour if required. :param colour: New colour to use. :param attr: New attributes to use. :param bg: New background colour to use. """ # Change attribute first as this will reset colours when swapping # modes. if colour != self._colour or attr != self._attr or self._bg != bg: new_attr = self._ATTRIBUTES[attr]( self._COLOURS[colour] + self._BG_COLOURS[bg]) self._stdout.SetConsoleTextAttribute(new_attr) self._attr = attr self._colour = colour self._bg = bg def _print_at(self, text, x, y, width): """ Print string at the required location. :param text: The text string to print. :param x: The x coordinate :param y: The Y coordinate :param width: The width of the character (for dual-width glyphs in CJK languages). """ # We can throw temporary errors on resizing, so catch and ignore # them on the assumption that we'll resize shortly. try: # Move the cursor if necessary if x != self._cur_x or y != self._cur_y: self._stdout.SetConsoleCursorPosition( win32console.PyCOORDType(x, y)) # Print the text at the required location and update the current # position. self._stdout.WriteConsole(text) self._cur_x = x + width self._cur_y = y except pywintypes.error: pass def wait_for_input(self, timeout): """ Wait until there is some input or the timeout is hit. :param timeout: Time to wait for input in seconds (floating point). """ rc = win32event.WaitForSingleObject(self._stdin, int(timeout * 1000)) if rc not in [0, 258]: raise RuntimeError(rc) def _scroll(self, lines): """ Scroll the window up or down. :param lines: Number of lines to scroll. Negative numbers scroll down. """ # Scroll the visible screen up by one line info = self._stdout.GetConsoleScreenBufferInfo()['Window'] rectangle = win32console.PySMALL_RECTType( info.Left, info.Top + lines, info.Right, info.Bottom) new_pos = win32console.PyCOORDType(0, info.Top) self._stdout.ScrollConsoleScreenBuffer( rectangle, None, new_pos, " ", 0) def _clear(self): """ Clear the terminal. """ info = self._stdout.GetConsoleScreenBufferInfo()['Window'] width = info.Right - info.Left + 1 height = info.Bottom - info.Top + 1 box_size = width * height self._stdout.FillConsoleOutputAttribute( 0, box_size, win32console.PyCOORDType(0, 0)) self._stdout.FillConsoleOutputCharacter( " ", box_size, win32console.PyCOORDType(0, 0)) self._stdout.SetConsoleCursorPosition( win32console.PyCOORDType(0, 0)) def set_title(self, title): """ Set the title for this terminal/console session. This will typically change the text displayed in the window title bar. :param title: The title to be set. """ win32console.SetConsoleTitle(title) else: # UNIX compatible platform - use curses import curses import select import termios class _CursesScreen(Screen): """ Curses screen implementation. """ # Virtual key code mapping. _KEY_MAP = { 27: Screen.KEY_ESCAPE, curses.KEY_F1: Screen.KEY_F1, curses.KEY_F2: Screen.KEY_F2, curses.KEY_F3: Screen.KEY_F3, curses.KEY_F4: Screen.KEY_F4, curses.KEY_F5: Screen.KEY_F5, curses.KEY_F6: Screen.KEY_F6, curses.KEY_F7: Screen.KEY_F7, curses.KEY_F8: Screen.KEY_F8, curses.KEY_F9: Screen.KEY_F9, curses.KEY_F10: Screen.KEY_F10, curses.KEY_F11: Screen.KEY_F11, curses.KEY_F12: Screen.KEY_F12, curses.KEY_F13: Screen.KEY_F13, curses.KEY_F14: Screen.KEY_F14, curses.KEY_F15: Screen.KEY_F15, curses.KEY_F16: Screen.KEY_F16, curses.KEY_F17: Screen.KEY_F17, curses.KEY_F18: Screen.KEY_F18, curses.KEY_F19: Screen.KEY_F19, curses.KEY_F20: Screen.KEY_F20, curses.KEY_F21: Screen.KEY_F21, curses.KEY_F22: Screen.KEY_F22, curses.KEY_F23: Screen.KEY_F23, curses.KEY_F24: Screen.KEY_F24, curses.KEY_PRINT: Screen.KEY_PRINT_SCREEN, curses.KEY_IC: Screen.KEY_INSERT, curses.KEY_DC: Screen.KEY_DELETE, curses.KEY_HOME: Screen.KEY_HOME, curses.KEY_END: Screen.KEY_END, curses.KEY_LEFT: Screen.KEY_LEFT, curses.KEY_UP: Screen.KEY_UP, curses.KEY_RIGHT: Screen.KEY_RIGHT, curses.KEY_DOWN: Screen.KEY_DOWN, curses.KEY_PPAGE: Screen.KEY_PAGE_UP, curses.KEY_NPAGE: Screen.KEY_PAGE_DOWN, curses.KEY_BACKSPACE: Screen.KEY_BACK, 9: Screen.KEY_TAB, curses.KEY_BTAB: Screen.KEY_BACK_TAB # Terminals translate keypad keys, so no need for a special # mapping here. # Terminals don't transmit meta keys (like control, shift, etc), so # there's no translation for them either. } def __init__(self, win, height=None, catch_interrupt=False, unicode_aware=False): """ :param win: The window object as returned by the curses wrapper method. :param height: The height of the screen buffer to be used (for teesting only). :param catch_interrupt: Whether to catch SIGINT or not. :param unicode_aware: Whether this Screen can use unicode or not. """ # Determine unicode support if needed. if unicode_aware is None: try: encoding = getlocale()[1] if not encoding: encoding = getdefaultlocale()[1] except ValueError: encoding = os.environ.get("LC_CTYPE") unicode_aware = (encoding is not None and encoding.lower() == "utf-8") # Save off the screen details. super().__init__( win.getmaxyx()[0], win.getmaxyx()[1], height, unicode_aware) self._screen = win self._screen.keypad(1) # Set up basic colour schemes. self.colours = curses.COLORS # Disable the cursor. curses.curs_set(0) # Non-blocking key checks. self._screen.nodelay(1) # Store previous handlers for restoration at close self._signal_state = _SignalState() # Set up signal handler for screen resizing. self._re_sized = False self._signal_state.set(signal.SIGWINCH, self._resize_handler) # Set up signal handler for job pause/resume. self._signal_state.set(signal.SIGCONT, self._continue_handler) # Catch SIGINTs and translated them to ctrl-c if needed. if catch_interrupt: # Ignore SIGINT (ctrl-c) and SIGTSTP (ctrl-z) signals. self._signal_state.set(signal.SIGINT, self._catch_interrupt) self._signal_state.set(signal.SIGTSTP, self._catch_interrupt) # Enable mouse events curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION) # Lookup the necessary escape codes in the terminfo database. self._move_y_x = curses.tigetstr("cup") self._up_line = curses.tigetstr("ri").decode("utf-8") self._down_line = curses.tigetstr("ind").decode("utf-8") self._fg_color = curses.tigetstr("setaf") self._bg_color = curses.tigetstr("setab") self._default_colours = curses.tigetstr("op") if self._default_colours: self._default_colours = self._default_colours.decode("utf-8") self._clear_line = curses.tigetstr("el").decode("utf-8") if curses.tigetflag("hs"): self._start_title = curses.tigetstr("tsl").decode("utf-8") self._end_title = curses.tigetstr("fsl").decode("utf-8") else: self._start_title = self._end_title = None self._a_normal = curses.tigetstr("sgr0").decode("utf-8") self._a_bold = curses.tigetstr("bold").decode("utf-8") self._a_reverse = curses.tigetstr("rev").decode("utf-8") self._a_underline = curses.tigetstr("smul").decode("utf-8") self._clear_screen = curses.tigetstr("clear").decode("utf-8") # Look for a mismatch between the kernel terminal and the terminfo # database for backspace. Fix up keyboard mappings if needed. try: kbs = curses.tigetstr("kbs").decode("utf-8") tbs = termios.tcgetattr(sys.stdin)[6][termios.VERASE] if tbs != kbs: self._KEY_MAP[ord(tbs)] = Screen.KEY_BACK except termios.error: pass # Conversion from Screen attributes to curses equivalents. self._ATTRIBUTES = { Screen.A_BOLD: self._a_bold, Screen.A_NORMAL: self._a_normal, Screen.A_REVERSE: self._a_reverse, Screen.A_UNDERLINE: self._a_underline } # Byte stream processing for unicode input. self._bytes_to_read = 0 self._bytes_to_return = b"" # We'll actually break out into low-level output, so flush any # high level buffers now. self._screen.refresh() def close(self, restore=True): """ Close down this Screen and tidy up the environment as required. :param restore: whether to restore the environment or not. """ self._signal_state.restore() if restore: self._screen.keypad(0) curses.echo() # Shouldn't fail on real systems. This code is for running tests in CI pipelines. try: curses.nocbreak() except curses.error: pass try: curses.endwin() except curses.error: pass @staticmethod def _safe_write(msg): """ Safe write to screen - catches IOErrors on screen resize. :param msg: The message to write to the screen. """ try: sys.stdout.write(msg) except OSError: # Screen resize can throw IOErrors. These can be safely # ignored as the screen will be shortly reset anyway. pass def _resize_handler(self, *_): """ Window resize signal handler. We don't care about any of the parameters passed in beyond the object reference. """ curses.endwin() curses.initscr() self._re_sized = True def _continue_handler(self, *_): """ Job pause/resume signal handler. We don't care about any of the parameters passed in beyond the object reference. """ self.force_update(full_refresh=True) def _scroll(self, lines): """ Scroll the window up or down. :param lines: Number of lines to scroll. Negative numbers scroll down. """ if lines < 0: start = curses.tparm(self._move_y_x, 0, 0).decode("utf-8") scroll = (self._up_line + self._clear_line) * -lines else: start = curses.tparm(self._move_y_x, self.height, 0).decode("utf-8") scroll = (self._down_line + self._clear_line) * lines self._safe_write(f"{start}{scroll}") def _clear(self): """ Clear the Screen of all content. """ self._safe_write(self._clear_screen) sys.stdout.flush() def refresh(self): """ Refresh the screen. """ super().refresh() try: sys.stdout.flush() except OSError: pass @staticmethod def _catch_interrupt(signal_no, frame): """ SIGINT handler. We ignore the signal and frame info passed in. """ # Stop pep-8 shouting at me for unused params I can't control. del frame # The OS already caught the ctrl-c, so inject it now for the next # input. if signal_no == signal.SIGINT: curses.ungetch(3) elif signal_no == signal.SIGTSTP: curses.ungetch(26) def get_event(self): """ Check for an event without waiting. """ # Spin through notifications until we find something we want. key = 0 while key != -1: # Get the next key key = self._screen.getch() if key == curses.KEY_RESIZE: # Handle screen resize self._re_sized = True elif key == curses.KEY_MOUSE: # Handle a mouse event _, x, y, _, bstate = curses.getmouse() buttons = 0 # Some Linux modes only report clicks, so check for any # button down or click events. if (bstate & curses.BUTTON1_PRESSED != 0 or bstate & curses.BUTTON1_CLICKED != 0): buttons |= MouseEvent.LEFT_CLICK if (bstate & curses.BUTTON3_PRESSED != 0 or bstate & curses.BUTTON3_CLICKED != 0): buttons |= MouseEvent.RIGHT_CLICK if bstate & curses.BUTTON1_DOUBLE_CLICKED != 0: buttons |= MouseEvent.DOUBLE_CLICK return MouseEvent(x, y, buttons) elif key != -1: # Handle any byte streams first logger.debug("Processing key: %x", key) if self._unicode_aware and key > 0: # Start of unicode byte stream if key & 0xC0 == 0xC0: self._bytes_to_return = struct.pack(b"B", key) self._bytes_to_read = bin(key)[2:].index("0") - 1 logger.debug("Byte stream: %d bytes left", self._bytes_to_read) continue # Process unicode bytestream if still expecting data. if self._bytes_to_read > 0: self._bytes_to_return += struct.pack(b"B", key) self._bytes_to_read -= 1 if self._bytes_to_read > 0: continue # If we get here we have a key definition. key = ord(self._bytes_to_return.decode("utf-8")) # Handle a genuine key press. logger.debug("Returning key: %x", key) if self._bytes_to_return: # UTF-8 character - resetting _bytes_to_return self._bytes_to_return = b"" return KeyboardEvent(key) if key in self._KEY_MAP: return KeyboardEvent(self._KEY_MAP[key]) elif key != -1: return KeyboardEvent(key) return None def has_resized(self): """ Check whether the screen has been re-sized. """ re_sized = self._re_sized self._re_sized = False return re_sized def _change_colours(self, colour, attr, bg): """ Change current colour if required. :param colour: New colour to use. :param attr: New attributes to use. :param bg: New background colour to use. """ # Change attribute first as this will reset colours when swapping # modes. if attr != self._attr: self._safe_write(self._a_normal) if attr != 0: self._safe_write(self._ATTRIBUTES[attr]) self._attr = attr self._colour = None self._bg = None # next check for default colours - which reset both fg and bg. if Screen.COLOUR_DEFAULT in (colour, bg): if self._default_colours: self._safe_write(self._default_colours) self._colour = colour if colour == Screen.COLOUR_DEFAULT else None self._bg = bg if bg == Screen.COLOUR_DEFAULT else None else: colour = Screen.COLOUR_WHITE if colour == Screen.COLOUR_DEFAULT else colour bg = Screen.COLOUR_BLACK if bg == Screen.COLOUR_DEFAULT else bg # Now swap colours if required. if colour != self._colour: self._safe_write(curses.tparm( self._fg_color, colour).decode("utf-8")) self._colour = colour if bg != self._bg: self._safe_write(curses.tparm( self._bg_color, bg).decode("utf-8")) self._bg = bg def _print_at(self, text, x, y, width): """ Print string at the required location. :param text: The text string to print. :param x: The x coordinate :param y: The Y coordinate :param width: The width of the character (for dual-width glyphs in CJK languages). """ # Move the cursor if necessary cursor = "" if x != self._cur_x or y != self._cur_y: cursor = curses.tparm(self._move_y_x, y, x).decode("utf-8") # Print the text at the required location and update the current # position. try: self._safe_write(cursor + text) except UnicodeEncodeError: # This is probably a sign that the user has the wrong locale. # Try to soldier on anyway. self._safe_write(cursor + "?" * len(text)) # Update cursor position for next time... self._cur_x = x + width self._cur_y = y def wait_for_input(self, timeout): """ Wait until there is some input or the timeout is hit. :param timeout: Time to wait for input in seconds (floating point). """ try: select.select([sys.stdin], [], [], timeout) except OSError: # Any error will almost certainly result in a a Screen. Ignore. pass def set_title(self, title): """ Set the title for this terminal/console session. This will typically change the text displayed in the window title bar. :param title: The title to be set. """ if self._start_line is not None: self._safe_write(f"{self._start_title}{title}{self._end_title}") class _SignalState(): """ Save previous user signal state while setting signals. Used for signal restoration when asciimatics no longer has control of the user program. """ def __init__(self): self._old_signal_states = [] def set(self, signalnum, handler): """ Set signal handler and record their previous values. :param signalnum: The const/enum matching to the signal to be set. :param handler: The function/const to set the signal to """ old_handler = signal.getsignal(signalnum) # Some environments may install a non-Python handler (which returns None at this point). # We can't reinstate these, so just reset the default handler in such cases. if old_handler is None: old_handler = signal.SIG_DFL self._old_signal_states.append((signalnum, old_handler)) signal.signal(signalnum, handler) def restore(self): """ Restore saved signals to their previous handles. """ for signalnum, handler in self._old_signal_states: signal.signal(signalnum, handler) self._old_signal_states = [] python-asciimatics-1.15.0/asciimatics/sprites.py000066400000000000000000000072121511423144500217440ustar00rootroot00000000000000""" This module provides `Sprites` to create animation effects with Paths. For more details see http://asciimatics.readthedocs.io/en/latest/animation.html """ import random from asciimatics.effects import Sprite from asciimatics.renderers import StaticRenderer # Images for Sam-ple sprite. from asciimatics.screen import Screen sam_default = [ """ ______ .` `. / - - \\ | __ | | | \\ / '.______.' """, """ ______ .` `. / o o \\ | __ | | | \\ / '.______.' """ ] sam_left = """ ______ .` `. / o \\ | | |-- | \\ / '.______.' """ sam_right = """ ______ .` `. / o \\ | | | --| \\ / '.______.' """ sam_down = """ ______ .` `. / \\ | | | ^ ^ | \\ __ / '.______.' """ sam_up = """ ______ .` __ `. / v v \\ | | | | \\ / '.______.' """ # Images for an arrow Sprite. left_arrow = """ /____ / \\ ____ \\ """ up_arrow = """ /\\ / \\ /| |\\ | | """ right_arrow = """ ____\\ \\ ____ / / """ down_arrow = """ | | \\| |/ \\ / \\/ """ default_arrow = [ """ /\\ / \\ /|><|\\ | | """, """ /\\ / \\ /|oo|\\ | | """, ] # Simple static function to swap between 2 images to make a sprite blink. def _blink(): if random.random() > 0.9: return 0 else: return 1 class Sam(Sprite): """ Sam Paul sprite - an simple sample animated character. """ def __init__(self, screen, path, start_frame=0, stop_frame=0): """ See :py:obj:`.Sprite` for details. """ super().__init__( screen, renderer_dict={ "default": StaticRenderer(images=sam_default, animation=_blink), "left": StaticRenderer(images=[sam_left]), "right": StaticRenderer(images=[sam_right]), "down": StaticRenderer(images=[sam_down]), "up": StaticRenderer(images=[sam_up]), }, path=path, start_frame=start_frame, stop_frame=stop_frame) class Arrow(Sprite): """ Sample arrow sprite - points where it is going. """ def __init__(self, screen, path, colour=Screen.COLOUR_WHITE, start_frame=0, stop_frame=0): """ See :py:obj:`.Sprite` for details. """ super().__init__( screen, renderer_dict={ "default": StaticRenderer(images=default_arrow, animation=_blink), "left": StaticRenderer(images=[left_arrow]), "right": StaticRenderer(images=[right_arrow]), "down": StaticRenderer(images=[down_arrow]), "up": StaticRenderer(images=[up_arrow]), }, path=path, colour=colour, start_frame=start_frame, stop_frame=stop_frame) class Plot(Sprite): """ Sample Sprite that simply plots an "X" for each step in the path. Useful for plotting a path to the screen. """ def __init__(self, screen, path, colour=Screen.COLOUR_WHITE, start_frame=0, stop_frame=0): """ See :py:obj:`.Sprite` for details. """ super().__init__( screen, renderer_dict={ "default": StaticRenderer(images=["X"]) }, path=path, colour=colour, clear=False, start_frame=start_frame, stop_frame=stop_frame) python-asciimatics-1.15.0/asciimatics/strings.py000066400000000000000000000135771511423144500217570ustar00rootroot00000000000000""" This module provides classes to handle embedded control strings for widgets. """ from asciimatics.parsers import Parser class ColouredText(): """ Unicode string-like object to store text and colour maps, using a parser to convert the raw text passed in into visible text and an associated colour map. This only handles simple colour change commands and will ignore more complex commands). """ def __init__(self, raw_text, parser, colour=None, colour_map=None, offsets=None, text=None): """ :param raw_text: The raw unicode string to be processed :param parser: The parser to process the text :param colour: Optional starting colour tuple to use for this text. :param colour_map: Optional ready parsed colour map for this text. :param offsets: Optional ready parsed offsets for this text. :param text: Optional ready parsed text for this text. The colour_map, offsets and text options are to optimize creation of substrings from an existing ColouredText object and should not be used in general. """ super().__init__() self._raw_text = raw_text self._raw_offsets = [] self._parser = parser self._colour_map = None self._last_colour = colour if colour else (None, None, None) self._init_colour = colour self._colour_map = [] self._text = "" if colour_map: self._colour_map = colour_map self._last_colour = colour_map[-1] self._raw_offsets = offsets self._text = text else: self._parser.reset(self._raw_text, self._init_colour) for offset, command, params in self._parser.parse(): if command == Parser.DISPLAY_TEXT: self._colour_map.append(self._last_colour) self._raw_offsets.append(offset) self._text += params elif command == Parser.CHANGE_COLOURS: self._last_colour = params def __repr__(self): """ Return the processed (displayable) text. """ return self._text def __len__(self): """ Returns the length of the processed (displayable) text. """ return len(self._text) def __getitem__(self, item): """ Slice magic method. """ if isinstance(item, int): start = self._raw_offsets[item] stop = None if item == len(self._raw_offsets) - 1 else self._raw_offsets[item + 1] step = 1 colour_index = max(0, item - 1) base = self._raw_offsets[item] offsets = [0] else: try: start = None if item.start is None else self._raw_offsets[slice(item.start, None, None)][0] except IndexError: start = len(self._raw_text) try: stop = None if item.stop is None else self._raw_offsets[slice(item.stop, None, None)][0] except IndexError: stop = None step = item.step colour_index = max(0, item.start - 1 if item.start else 0) try: base = self._raw_offsets[item][0] offsets = [x - base for x in self._raw_offsets[item]] except IndexError: base = 0 offsets = [] try: colour = self._colour_map[colour_index] except IndexError: colour = self._init_colour return ColouredText(self._raw_text[slice(start, stop, step)], parser=self._parser, colour=colour, text=self._text[item], colour_map=self._colour_map[item], offsets=offsets) def __add__(self, other): """ Addition magic method. """ if hasattr(other, "raw_text"): new_text = self._raw_text + other.raw_text else: new_text = self._raw_text + str(other) return ColouredText(new_text, parser=self._parser, colour=self._init_colour) def __eq__(self, other): """ Equals magic method. """ if isinstance(other, ColouredText): return self.raw_text == other.raw_text return NotImplemented def __ne__(self, other): """ Not equals magic method. """ x = self.__eq__(other) if x is not NotImplemented: return not x return NotImplemented def startswith(self, text): """ Check whether parsed (i.e. displayed) text starts woth specified string. """ return self._text.startswith(text) def join(self, others): """ Join the list of ColouredObjects using this ColouredObject. :param others: the list of other objects to join. """ try: return ColouredText(self._raw_text.join([x.raw_text for x in others]), parser=self._parser, colour=self._init_colour) except AttributeError: return ColouredText(self._raw_text.join(others), parser=self._parser, colour=self._init_colour) @property def colour_map(self): """ Colour map for the processed text (for use with `paint` method). """ return self._colour_map @property def raw_text(self): """ Raw (unprocessed) text for this object. """ return self._raw_text @property def first_colour(self): """ First colour triplet used for this text. """ return self._init_colour @property def last_colour(self): """ Last colour triplet used for this text. """ return self._last_colour python-asciimatics-1.15.0/asciimatics/utilities.py000066400000000000000000000137261511423144500222750ustar00rootroot00000000000000""" This module is just a collection of simple helper functions. """ from datetime import date, datetime from logging import getLogger from asciimatics.constants import SINGLE_LINE, DOUBLE_LINE # Diagnostic logging logger = getLogger(__name__) def readable_mem(mem): """ :param mem: An integer number of bytes to convert to human-readable form. :return: A human-readable string representation of the number. """ for suffix in ["", "K", "M", "G", "T"]: if mem < 10000: return f"{int(mem)}{suffix}" mem /= 1024 return f"{int(mem)}P" def readable_timestamp(stamp): """ :param stamp: A floating point number representing the POSIX file timestamp. :return: A short human-readable string representation of the timestamp. """ if date.fromtimestamp(stamp) == date.today(): return str(datetime.fromtimestamp(stamp).strftime("%I:%M:%S%p")) else: return str(date.fromtimestamp(stamp)) class _DotDict(dict): """ Modified dictionary to allow dot notation access. This can be used for quick and easy structures. See https://stackoverflow.com/q/2352181/4994021 """ __getattr__ = dict.get __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ class BoxTool(): """ Tool for building boxes out of characters. Supports a variety of line styles from `asciimatics.constants`: * ``ASCII_LINE`` -- ASCII safe characters (0) * ``SINGLE_LINE`` -- Unicode based single lined box (1) * ``DOUBLE_LINE`` -- Unicode based double lined box (2) Individual characters of a box can be accessed directly through attributes. Most attribute names are based on the Extended-ASCII characters used for the UNICODE version of the shape. The names describe the directions the piece point in (not the part of the box). For example, "up_left" is a corner piece that has a part that points up and a part that points left -- the character usually used for the bottom right hand corner of a box. Attribute values are: * ``up_left`` -- corner piece facing up and left * ``up_right`` -- corner piece facing up and right * ``down_left`` -- corner piece facing down and left * ``down_right`` -- corner piece facing down and right * ``h`` -- horizontal line * ``v`` -- vertical line * ``v_inside`` -- vertical line used inside the grid * ``v_left`` -- vertical line with mid joiner facing to the left * ``v_right`` -- vertical line with mid joiner facing to the right * ``h_up`` -- horizontal line with a mid joiner facing up * ``h_down`` -- horizontal line with a mid joiner facing down * ``cross`` -- intersection between vertical and horizontal """ def __init__(self, unicode_aware, style=SINGLE_LINE): """ :param unicode_aware: boolean indicating if the terminal is Unicode aware. If False, will force the use of the ASCII style :param style: line style specifier. Supports ``ASCII_LINE``, ``SINGLE_LINE``, and ``DOUBLE_LINE``. Defaults to ``SINGLE_LINE``. """ self.unicode_aware = unicode_aware # Call property to get side-effect of setting values self.style = style @property def style(self): """ The line drawing style used to draw boxes. Possible styles are set in :mod:`asciimatics.constants`. :param style: One of ``ASCII_LINE``, ``SINGLE_LINE``, or ``DOUBLE_LINE`` """ return self._style @style.setter def style(self, style): self._style = style if style == SINGLE_LINE and self.unicode_aware: self.down_right = "┌" self.down_left = "┐" self.up_right = "└" self.up_left = "┘" self.h = "─" self.h_inside = "─" self.v = "│" self.v_inside = "│" self.v_left = "┤" self.v_right = "├" self.h_up = "┴" self.h_down = "┬" self.cross = "┼" elif style == DOUBLE_LINE and self.unicode_aware: self.down_right = "╔" self.down_left = "╗" self.up_right = "╚" self.up_left = "╝" self.h = "═" self.h_inside = "═" self.v = "║" self.v_inside = "║" self.v_left = "╣" self.v_right = "╠" self.h_up = "╩" self.h_down = "╦" self.cross = "╬" else: self.down_left = "+" self.down_right = "+" self.up_right = "+" self.up_left = "+" self.h = "-" self.h_inside = "-" self.v = "|" self.v_inside = ":" self.v_left = "+" self.v_right = "+" self.h_up = "+" self.h_down = "+" self.cross = "+" # --- Empty box methods def box_top(self, width): """ Returns a string containing the top border of a box :param width: width of box, including corners """ return self.down_right + (width - 2) * self.h + self.down_left def box_bottom(self, width): """ Returns a string containing the bottom border of a box :param width: width of box, including corners """ return self.up_right + (width - 2) * self.h + self.up_left def box_line(self, width): """ Returns a string with a vertical bar on each end, padded with spaces in between for the given width. :param width: width of box including sides """ return self.v + (width - 2) * ' ' + self.v def box(self, width, height): """ Returns a string containing a box with the given width and height. """ lines = [self.box_top(width)] for _ in range(height - 2): lines.append(self.box_line(width)) lines.append(self.box_bottom(width)) return '\n'.join(lines) + '\n' python-asciimatics-1.15.0/asciimatics/widgets/000077500000000000000000000000001511423144500213455ustar00rootroot00000000000000python-asciimatics-1.15.0/asciimatics/widgets/__init__.py000066400000000000000000000023041511423144500234550ustar00rootroot00000000000000"""This is the module initialization for widgets""" # flake8: noqa from asciimatics.effects import Background from asciimatics.widgets.button import Button from asciimatics.widgets.checkbox import CheckBox from asciimatics.widgets.datepicker import DatePicker from asciimatics.widgets.divider import Divider from asciimatics.widgets.dropdownlist import DropdownList from asciimatics.widgets.filebrowser import FileBrowser from asciimatics.widgets.frame import Frame from asciimatics.widgets.label import Label from asciimatics.widgets.layout import Layout from asciimatics.widgets.listbox import ListBox from asciimatics.widgets.multicolumnlistbox import MultiColumnListBox from asciimatics.widgets.popupdialog import PopUpDialog from asciimatics.widgets.popupmenu import PopupMenu from asciimatics.widgets.radiobuttons import RadioButtons from asciimatics.widgets.textbox import TextBox from asciimatics.widgets.text import Text from asciimatics.widgets.timepicker import TimePicker from asciimatics.widgets.verticaldivider import VerticalDivider from asciimatics.widgets.widget import Widget from asciimatics.widgets.utilities import _enforce_width, _find_min_start,\ _get_offset, _split_text, _euclidian_distance python-asciimatics-1.15.0/asciimatics/widgets/baselistbox.py000066400000000000000000000221461511423144500242430ustar00rootroot00000000000000"""This is the baseclass for list box types""" from datetime import datetime, timedelta from abc import ABCMeta, abstractmethod from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.widgets.widget import Widget from asciimatics.widgets.scrollbar import _ScrollBar class _BaseListBox(Widget, metaclass=ABCMeta): """ An Internal class to contain common function between list box types. """ __slots__ = ["_options", "_titles", "_line", "_start_line", "_required_height", "_on_change", "_on_select", "_validator", "_search", "_last_search", "_scroll_bar", "_parser"] def __init__(self, height, options, titles=None, label=None, name=None, parser=None, on_change=None, on_select=None, validator=None): """ :param height: The required number of input lines for this widget. :param options: The options for each row in the widget. :param label: An optional label for the widget. :param name: The name for the widget. :param parser: Optional parser to colour text. :param on_change: Optional function to call when selection changes. :param on_select: Optional function to call when the user actually selects an entry from this list - e.g. by double-clicking or pressing Enter. :param validator: Optional function to validate selection for this widget. """ super().__init__(name) self._titles = titles self._label = label self._parser = parser self._options = self._parse_options(options) self._line = 0 self._value = None self._start_line = 0 self._required_height = height self._on_change = on_change self._on_select = on_select self._validator = validator self._search = "" self._last_search = datetime.now() self._scroll_bar = None def reset(self): pass def process_event(self, event): if isinstance(event, KeyboardEvent): if len(self._options) > 0 and event.key_code == Screen.KEY_UP: # Move up one line in text - use value to trigger on_select. self._line = max(0, self._line - 1) self.value = self._options[self._line][1] elif len(self._options) > 0 and event.key_code == Screen.KEY_DOWN: # Move down one line in text - use value to trigger on_select. self._line = min(len(self._options) - 1, self._line + 1) self.value = self._options[self._line][1] elif len(self._options) > 0 and event.key_code == Screen.KEY_PAGE_UP: # Move up one page. self._line = max(0, self._line - self._h + (1 if self._titles else 0)) self.value = self._options[self._line][1] elif len(self._options) > 0 and event.key_code == Screen.KEY_PAGE_DOWN: # Move down one page. self._line = min( len(self._options) - 1, self._line + self._h - (1 if self._titles else 0)) self.value = self._options[self._line][1] elif event.key_code in [Screen.ctrl("m"), Screen.ctrl("j")]: # Fire select callback. if self._on_select: self._on_select() elif event.key_code > 0: # Treat any other normal press as a search now = datetime.now() if now - self._last_search >= timedelta(seconds=1): self._search = "" self._search += chr(event.key_code) self._last_search = now # If we find a new match for the search string, update the list selection new_value = self._find_option(self._search) if new_value is not None: self.value = new_value else: return event elif isinstance(event, MouseEvent): # Mouse event - adjust for scroll bar as needed. if event.buttons != 0: # Check for normal widget. if (len(self._options) > 0 and self.is_mouse_over(event, include_label=False, width_modifier=1 if self._scroll_bar else 0)): # Figure out selected line new_line = event.y - self._y + self._start_line if self._titles: new_line -= 1 new_line = min(new_line, len(self._options) - 1) # Update selection and fire select callback if needed. if new_line >= 0: self._line = new_line self.value = self._options[self._line][1] if event.buttons & MouseEvent.DOUBLE_CLICK != 0 and self._on_select: self._on_select() return None # Check for scroll bar interactions: if self._scroll_bar: if self._scroll_bar.process_event(event): return None # Ignore other mouse events. return event else: # Ignore other events return event # If we got here, we processed the event - swallow it. return None def _add_or_remove_scrollbar(self, width, height, dy): """ Add or remove a scrollbar from this listbox based on height and available options. :param width: Width of the Listbox :param height: Height of the Listbox. :param dy: Vertical offset from top of widget. """ if self._scroll_bar is None and len(self._options) > height: self._scroll_bar = _ScrollBar( self._frame.canvas, self._frame.palette, self._x + width - 1, self._y + dy, height, self._get_pos, self._set_pos) elif self._scroll_bar is not None and len(self._options) <= height: self._scroll_bar = None def _get_pos(self): """ Get current position for scroll bar. """ if self._h >= len(self._options): return 0 return self._start_line / (len(self._options) - self._h) def _set_pos(self, pos): """ Set current position for scroll bar. """ if self._h < len(self._options): pos *= len(self._options) - self._h pos = int(round(max(0, pos), 0)) self._start_line = pos @abstractmethod def _find_option(self, search_value): """ Internal function called by the BaseListBox to do a text search on user input. :param search_value: The string value to search for in the list. :return: The value of the matching option (or None if nothing matches). """ def required_height(self, offset, width): return self._required_height @property def start_line(self): """ The line that will be drawn at the top of the visible section of this list. """ return self._start_line @start_line.setter def start_line(self, new_value): if 0 <= new_value < len(self._options): self._start_line = new_value @property def value(self): """ The current value for this list box. """ return self._value @value.setter def value(self, new_value): # Only trigger change notification after we've changed selection old_value = self._value self._value = new_value for i, [_, value] in enumerate(self._options): if value == new_value: self._line = i break else: # No matching value - pick a default. if len(self._options) > 0: self._line = 0 self._value = self._options[self._line][1] else: self._line = -1 self._value = None if self._validator: self._is_valid = self._validator(self._value) if old_value != self._value and self._on_change: self._on_change() # Fix up the start line now that we've explicitly set a new value. self._start_line = max(0, self._line - self._h + 1, min(self._start_line, self._line)) def _parse_options(self, options): """ Parse a the options list for ColouredText. :param options: the options list to parse :returns: the options list parsed and converted to ColouredText as needed. """ if self._parser: parsed_value = [] for option in options: parsed_value.append((self._parse_option(option[0]), option[1])) return parsed_value return options @abstractmethod def _parse_option(self, option): """ Parse a single option for ColouredText. :param option: the option to parse :returns: the option parsed and converted to ColouredText. """ @property @abstractmethod def options(self): """ The list of options available for user selection. """ python-asciimatics-1.15.0/asciimatics/widgets/button.py000066400000000000000000000060421511423144500232340ustar00rootroot00000000000000"""This module defines a button widget""" from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.widgets.widget import Widget class Button(Widget): """ A Button widget to be displayed in a Frame. It is typically used to represent a desired action for te user to invoke (e.g. a submit button on a form). """ __slots__ = ["_text", "_text_raw", "_add_box", "_on_click"] def __init__(self, text, on_click, label=None, add_box=True, name=None, **kwargs): """ :param text: The text for the button. :param on_click: The function to invoke when the button is clicked. :param label: An optional label for the widget. :param add_box: Whether to wrap the text with chevrons. :param name: The name of this widget. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._add_box = add_box self.text = text self._on_click = on_click self._label = label def set_layout(self, x, y, offset, w, h): # Do the usual layout work. then recalculate exact x/w values for the # rendered button. super().set_layout(x, y, offset, w, h) text_width = self.string_len(self._text) if self._add_box: # Minimize widget to make a nice little button. Only centre it if there are no label offsets. if offset == 0: self._x += max(0, (self.width - text_width) // 2) self._w = min(self._w, text_width) + offset else: # Maximize text to make for a consistent colouring when used in menus. self._text += " " * (self._w - text_width) def update(self, frame_no): self._draw_label() (colour, attr, bg) = self._pick_colours("button") self._frame.canvas.print_at( self._text, self._x + self._offset, self._y, colour, attr, bg) def reset(self): self._value = False def process_event(self, event): if isinstance(event, KeyboardEvent): if event.key_code in [ord(" "), 10, 13]: self._on_click() return None # Ignore any other key press. return event if isinstance(event, MouseEvent): if event.buttons != 0 and self.is_mouse_over(event, include_label=False): self._on_click() return None # Ignore other events return event def required_height(self, offset, width): return 1 @property def text(self): """ The current text for this Button. """ return self._text_raw @text.setter def text(self, new_text): self._text_raw = new_text self._text = f"< {new_text} >" if self._add_box else new_text @property def value(self): """ The current value for this Button. """ return self._value @value.setter def value(self, new_value): self._value = new_value python-asciimatics-1.15.0/asciimatics/widgets/checkbox.py000066400000000000000000000057521511423144500235160ustar00rootroot00000000000000"""This module defines a checkbox widget""" from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.widgets.widget import Widget class CheckBox(Widget): """ A CheckBox widget is used to ask for Boolean (i.e. yes/no) input. It consists of an optional label (typically used for the first in a group of CheckBoxes), the box and a field name. """ __slots__ = ["_text", "_on_change"] def __init__(self, text, label=None, name=None, on_change=None, **kwargs): """ :param text: The text to explain this specific field to the user. :param label: An optional label for the widget. :param name: The internal name for the widget. :param on_change: Optional function to call when text changes. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._text = text self._label = label self._on_change = on_change def update(self, frame_no): self._draw_label() # Render this checkbox. check_char = "✓" if self._frame.canvas.unicode_aware else "X" (colour, attr, bg) = self._pick_colours("control", self._has_focus) self._frame.canvas.print_at( f"[{check_char if self._value else ' '}]", self._x + self._offset, self._y, colour, attr, bg) (colour, attr, bg) = self._pick_colours("field", self._has_focus) self._frame.canvas.print_at( self._text, self._x + self._offset + 4, self._y, colour, attr, bg) def reset(self): pass def process_event(self, event): if isinstance(event, KeyboardEvent): if event.key_code in [ord(" "), 10, 13]: # Use property to trigger events. self.value = not self._value else: # Ignore any other key press. return event elif isinstance(event, MouseEvent): # Mouse event - rebase coordinates to Frame context. if event.buttons != 0: if self.is_mouse_over(event, include_label=False): # Use property to trigger events. self.value = not self._value return None # Ignore other mouse events. return event else: # Ignore other events return event # If we got here, we processed the event - swallow it. return None def required_height(self, offset, width): return 1 @property def value(self): """ The current value for this Checkbox. """ return self._value @value.setter def value(self, new_value): # Only trigger the notification after we've changed the value. old_value = self._value self._value = new_value if new_value else False if old_value != self._value and self._on_change: self._on_change() python-asciimatics-1.15.0/asciimatics/widgets/datepicker.py000066400000000000000000000126241511423144500240370ustar00rootroot00000000000000"""This module defines a datepicker widget""" from datetime import date, datetime from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import InvalidFields from asciimatics.screen import Screen from asciimatics.widgets.label import Label from asciimatics.widgets.layout import Layout from asciimatics.widgets.listbox import ListBox from asciimatics.widgets.temppopup import _TempPopup from asciimatics.widgets.widget import Widget class _DatePickerPopup(_TempPopup): """ An internal Frame for editing the currently selected date. """ def __init__(self, parent, year_range=None): """ :param parent: The widget that spawned this pop-up. :param year_range: Optional range to limit the year selection to. """ # Create the lists for each entry. now = parent.value if parent.value else date.today() if year_range is None: year_range = range(now.year - 50, now.year + 50) self._days = ListBox(3, [(f"{x:02}", x) for x in range(1, 32)], centre=True, validator=self._check_date) self._months = ListBox(3, [(now.replace(day=1, month=x).strftime("%b"), x) for x in range(1, 13)], centre=True, on_change=self._refresh_day) self._years = ListBox(3, [(f"{x:04}", x) for x in year_range], centre=True, on_change=self._refresh_day) # Construct the Frame location = parent.get_location() super().__init__(parent.frame.screen, parent, location[0] - 1, location[1] - 2, 13, 5) # Build the widget to display the time selection. layout = Layout([2, 1, 3, 1, 4], fill_frame=True) self.add_layout(layout) layout.add_widget(self._days, 0) layout.add_widget(Label("\n/", height=3), 1) layout.add_widget(self._months, 2) layout.add_widget(Label("\n/", height=3), 3) layout.add_widget(self._years, 4) self.fix() # Set up the correct time. self._years.value = parent.value.year self._months.value = parent.value.month self._days.value = parent.value.day def _check_date(self, value): try: date(self._years.value, self._months.value, value) return True except (TypeError, ValueError): return False def _refresh_day(self): self._days.value = self._days.value def _on_close(self, cancelled): try: if not cancelled: self._parent.value = self._parent.value.replace(day=self._days.value, month=self._months.value, year=self._years.value) except ValueError as e: raise InvalidFields([self._days]) from e class DatePicker(Widget): """ A DatePicker widget allows you to pick a date from a compact, temporary, pop-up Frame. """ __slots__ = ["_on_change", "_child", "_year_range"] def __init__(self, label=None, name=None, year_range=None, on_change=None, **kwargs): """ :param label: An optional label for the widget. :param name: The name for the widget. :param on_change: Optional function to call when the selected time changes. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._label = label self._on_change = on_change self._value = datetime.now().date() self._child = None self._year_range = year_range def update(self, frame_no): self._draw_label() # This widget only ever needs display the current selection - the separate Frame does all # the clever stuff when it has the focus. (colour, attr, background) = self._pick_colours("edit_text") self._frame.canvas.print_at( self._value.strftime("%d/%b/%Y"), self._x + self._offset, self._y, colour, attr, background) def reset(self): pass def process_event(self, event): if event is not None: if isinstance(event, KeyboardEvent): if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]: event = None elif isinstance(event, MouseEvent): if event.buttons != 0: if self.is_mouse_over(event, include_label=False): event = None if event is None: self._child = _DatePickerPopup(self, year_range=self._year_range) self.frame.scene.add_effect(self._child) return event def required_height(self, offset, width): return 1 @property def value(self): """ The current selected date. """ return self._value @value.setter def value(self, new_value): # Only trigger the notification after we've changed the value. old_value = self._value self._value = new_value if old_value != self._value and self._on_change: self._on_change() python-asciimatics-1.15.0/asciimatics/widgets/divider.py000066400000000000000000000033711511423144500233510ustar00rootroot00000000000000"""This module defines a divider between widgets""" from asciimatics.widgets.widget import Widget class Divider(Widget): """ A divider to break up a group of widgets. """ __slots__ = ["_draw_line", "_required_height", "_line_char"] def __init__(self, draw_line=True, height=1, line_char=None): """ :param draw_line: Whether to draw a line in the centre of the gap. :param height: The required vertical gap. :param line_char: Optional character to use for drawing the line. """ # Dividers have no value and so should have no name for look-ups either. super().__init__(None, tab_stop=False) self._draw_line = draw_line self._required_height = height self._line_char = line_char def register_frame(self, frame): # Update line drawing character if needed once we have a canvas to query. super().register_frame(frame) if self._line_char is None: self._line_char = "─" if self._frame.canvas.unicode_aware else "-" def process_event(self, event): # Dividers have no user interactions return event def update(self, frame_no): (colour, attr, background) = self._frame.palette["borders"] if self._draw_line: self._frame.canvas.print_at(self._line_char * self._w, self._x, self._y + (self._h // 2), colour, attr, background) def reset(self): pass def required_height(self, offset, width): return self._required_height @property def value(self): """ The current value for this Divider. """ return self._value python-asciimatics-1.15.0/asciimatics/widgets/dropdownlist.py000066400000000000000000000144271511423144500244570ustar00rootroot00000000000000"""This module defines a dropdown list widget""" from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.widgets.divider import Divider from asciimatics.widgets.layout import Layout from asciimatics.widgets.listbox import ListBox from asciimatics.widgets.temppopup import _TempPopup from asciimatics.widgets.text import Text from asciimatics.widgets.utilities import _enforce_width from asciimatics.widgets.widget import Widget class _DropdownPopup(_TempPopup): """ An internal Frame for selecting an item from a drop-down list.. """ def __init__(self, parent): """ :param parent: The widget that spawned this pop-up. """ # Decide which way to present the list - up or down from the parent widget. location = parent.get_location() if parent.frame.screen.height - location[1] < 3: height = min(len(parent.options) + 4, location[1] + 2) start_line = location[1] - height + 2 reverse = True else: start_line = location[1] - 1 height = min(len(parent.options) + 4, parent.frame.screen.height - location[1] + 1) reverse = False if parent.fit: width = min(max(map(lambda x: len(x[0]), parent.options)) + 4, parent.width) else: width = parent.width # Construct the Frame super().__init__(parent.frame.screen, parent, location[0], start_line, width, height) # Build the widget to display the time selection. layout = Layout([1], fill_frame=True) self.add_layout(layout) self._field = Text() self._field.disabled = True divider = Divider() divider.disabled = True self._list = ListBox(Widget.FILL_FRAME, [(f" {i[0]}", i[1]) for i in parent.options], add_scroll_bar=len(parent.options) > height - 4, on_select=self.close, on_change=self._link) layout.add_widget(self._list if reverse else self._field, 0) layout.add_widget(divider, 0) layout.add_widget(self._field if reverse else self._list, 0) self.fix() # Set up the correct time. self._list.value = parent.value def _link(self): # pylint: disable=protected-access self._field.value = self._list.options[self._list._line][0] def _on_close(self, cancelled): if not cancelled: self._parent.value = self._list.value class DropdownList(Widget): """ This widget allows you to pick an item from a temporary pop-up list. """ __slots__ = ["_on_change", "_child", "_options", "_line", "_fit"] def __init__(self, options, label=None, name=None, on_change=None, fit=None, **kwargs): """ :param options: The options for each row in the widget. :param label: An optional label for the widget. :param name: The name for the widget. :param on_change: Optional function to call when the selected time changes. :param fit: Shrink width of dropdown to fit the width of options. Default False. The `options` are a list of tuples, where the first value is the string to be displayed to the user and the second is an interval value to identify the entry to the program. For example: options=[("First option", 1), ("Second option", 2)] Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._label = label self._on_change = on_change self._child = None self._options = options self._line = 0 if len(options) > 0 else None self._value = options[self._line][1] if self._line is not None else None self._fit = fit @property def options(self): """ The set of allowed options for the drop-down list. """ return self._options @options.setter def options(self, new_value): self._options = new_value self.value = self._value @property def fit(self): """ Whether to shrink to largest element width or not. """ return self._fit def update(self, frame_no): self._draw_label() # This widget only ever needs display the current selection - the separate Frame does all # the clever stuff when it has the focus. text = "" if self._line is None else self._options[self._line][0] (colour, attr, background) = self._pick_colours("field", selected=self._has_focus) if self._fit: width = min(max(map(lambda x: len(x[0]), self._options)) + 1, self.width - 3) else: width = self.width - 3 self._frame.canvas.print_at( f"[ {_enforce_width(text, width, self._frame.canvas.unicode_aware):{width}}]", self._x + self._offset, self._y, colour, attr, background) def reset(self): pass def process_event(self, event): if event is not None: if isinstance(event, KeyboardEvent): if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]: event = None elif isinstance(event, MouseEvent): if event.buttons != 0: if self.is_mouse_over(event, include_label=False): event = None if event is None: self._child = _DropdownPopup(self) self.frame.scene.add_effect(self._child) return event def required_height(self, offset, width): return 1 @property def value(self): """ The current value for this DropdownList. """ return self._value @value.setter def value(self, new_value): # Only trigger change notification after we've changed selection old_value = self._value self._value = new_value for i, [_, value] in enumerate(self._options): if value == new_value: self._line = i break else: self._value = self._line = None if old_value != self._value and self._on_change: self._on_change() python-asciimatics-1.15.0/asciimatics/widgets/filebrowser.py000066400000000000000000000151151511423144500242450ustar00rootroot00000000000000"""This module defines a file browser selection""" from re import compile as re_compile import os import unicodedata from collections import namedtuple from asciimatics.utilities import readable_timestamp, readable_mem from asciimatics.widgets.multicolumnlistbox import MultiColumnListBox class FileBrowser(MultiColumnListBox): """ A FileBrowser is a widget for finding a file on the local disk. """ def __init__(self, height, root, name=None, on_select=None, on_change=None, file_filter=None): r""" :param height: The desired height for this widget. :param root: The starting root directory to display in the widget. :param name: The name of this widget. :param on_select: Optional function that gets called when user selects a file (by pressing enter or double-clicking). :param on_change: Optional function that gets called on any movement of the selection. :param file_filter: Optional RegEx string that can be passed in to filter the files to be displayed. Most people will want to use a filter to finx files with a particular extension. In this case, you must use a regex that matches to the end of the line - e.g. use ".*\.txt$" to find files ending with ".txt". This ensures that you don't accidentally pick up files containing the filter. """ super().__init__( height, [0, ">8", ">14"], [], titles=["Filename", "Size", "Last modified"], name=name, on_select=self._on_selection, on_change=on_change) # Remember the on_select handler for external notification. This allows us to wrap the # normal on_select notification with a function that will open new sub-directories as # needed. self._external_notification = on_select self._root = root self._in_update = False self._initialized = False self._file_filter = None if file_filter is None else re_compile(file_filter) def update(self, frame_no): # Defer initial population until we first display the widget in order to avoid race # conditions in the Frame that may be using this widget. if not self._initialized: self._populate_list(self._root) self._initialized = True super().update(frame_no) def _on_selection(self): """ Internal function to handle directory traversal or bubble notifications up to user of the Widget as needed. """ if self.value and os.path.isdir(self.value): self._populate_list(self.value) elif self._external_notification: self._external_notification() def clone(self, new_widget): # Copy the data into the new widget. Notes: # 1) I don't really want to expose these methods, so am living with the protected access. # 2) I need to populate the list and then assign the values to ensure that we get the # right selection on re-sizing. # pylint: disable=protected-access new_widget._populate_list(self._root) new_widget._start_line = self._start_line new_widget._root = self._root new_widget.value = self.value def _populate_list(self, value): """ Populate the current multi-column list with the contents of the selected directory. :param value: The new value to use. """ # Nothing to do if the value is rubbish. if value is None: return # Stop any recursion - no more returns from here to end of fn please! if self._in_update: return self._in_update = True # We need to update the tree view. self._root = os.path.abspath(value if os.path.isdir(value) else os.path.dirname(value)) # The absolute expansion of "/" or "\" is the root of the disk, so is a cross-platform # way of spotting when to insert ".." or not. tree_view = [] if len(self._root) > len(os.path.abspath(os.sep)): tree_view.append((["|-+ .."], os.path.abspath(os.path.join(self._root, "..")))) tree_dirs = [] tree_files = [] try: files = os.listdir(self._root) except OSError: # Can fail on Windows due to access permissions files = [] for my_file in files: full_path = os.path.join(self._root, my_file) try: details = os.lstat(full_path) except OSError: # Can happen on Windows due to access permissions details = namedtuple("stat_type", "st_size st_mtime") details.st_size = 0 details.st_mtime = 0 name = f"|-- {my_file}" tree = tree_files if os.path.isdir(full_path): tree = tree_dirs if os.path.islink(full_path): # Show links separately for directories real_path = os.path.realpath(full_path) name = f"|-+ {my_file} -> {real_path}" else: name = f"|-+ {my_file}" elif self._file_filter and not self._file_filter.match(my_file): # Skip files that don't match the filter (if present) continue elif os.path.islink(full_path): # Check if link target exists and if it does, show statistics of the # linked file, otherwise just display the link try: real_path = os.path.realpath(full_path) except OSError: # Can fail on Linux prof file system. real_path = None if real_path and os.path.exists(real_path): details = os.stat(real_path) name = f"|-- {my_file} -> {real_path}" else: # Both broken directory and file links fall to this case. # Actually using the files will cause a FileNotFound exception name = f"|-- {my_file} -> {real_path}" # Normalize names for MacOS and then add to the list. tree.append(([unicodedata.normalize("NFC", name), readable_mem(details.st_size), readable_timestamp(details.st_mtime)], full_path)) tree_view.extend(sorted(tree_dirs)) tree_view.extend(sorted(tree_files)) self.options = tree_view self._titles[0] = self._root # We're out of the function - unset recursion flag. self._in_update = False python-asciimatics-1.15.0/asciimatics/widgets/frame.py000066400000000000000000000676351511423144500230320ustar00rootroot00000000000000"""This module defines a class to display widgets""" from copy import copy, deepcopy from logging import getLogger from wcwidth import wcswidth from asciimatics.effects import Effect from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import Highlander, InvalidFields from asciimatics.screen import Screen, Canvas from asciimatics.utilities import BoxTool from asciimatics.widgets.scrollbar import _ScrollBar from asciimatics.widgets.utilities import THEMES # Logging logger = getLogger(__name__) class _BorderManager: def __init__(self, frame, has_border, can_scroll): """ Helper class to manage the border and scroll bar attached to a frame. Allows for different character to be used in the border and the changes in sizing requirements with borders on and off with scroll bars on and off. :param frame: frame being manager :param has_border: True if the frame has a border :param can_scroll: True if the frame has a scroll bar """ self._frame = frame self.has_border = has_border self.scroll_bar = None self.box = BoxTool(frame.canvas.unicode_aware) if can_scroll: scroll_y = 2 scroll_height = frame.canvas.height - 4 if not has_border: scroll_height = frame.canvas.height - 2 scroll_y = 1 self.scroll_bar = _ScrollBar( frame.canvas, frame.palette, frame.canvas.width - 1, scroll_y, scroll_height, frame.get_scroll_pos, frame.set_scroll_pos, absolute=True ) # Optimization for non-unicode displays to avoid slow unicode calls. self.string_len = wcswidth if frame._canvas.unicode_aware else len @property def can_scroll(self): return self.scroll_bar is not None def get_rectangle(self): """ Returns the bounding box defined by the usable space left after borders and/or scroll bars are accounted for. :returns: Tuple containing, x, y, height and width of bounding box """ if self.has_border: x = 1 y = self._frame.canvas.start_line + 1 h = self._frame.canvas.height - 2 w = self._frame.canvas.width - 2 else: x = 0 y = self._frame.canvas.start_line h = self._frame.canvas.height w = self._frame.canvas.width if self.can_scroll: w -= 1 return x, y, h, w def draw(self): """ Draws the border and/or scroll bars onto the frame managed by this object. """ frame = self._frame if self.has_border: # Draw the basic border first. (colour, attr, bg) = frame.palette["borders"] for dy in range(frame.canvas.height): y = frame.canvas.start_line + dy if dy == 0: frame.canvas.print_at( self.box.box_top(frame.canvas.width), 0, y, colour, attr, bg ) elif dy == frame.canvas.height - 1: frame.canvas.print_at( self.box.box_bottom(frame.canvas.width), 0, y, colour, attr, bg ) else: frame.canvas.print_at(self.box.v, 0, y, colour, attr, bg) frame.canvas.print_at(self.box.v, frame.canvas.width - 1, y, colour, attr, bg) # Now the title (colour, attr, bg) = frame.palette["title"] title_width = self.string_len(frame.title) frame.canvas.print_at( frame.title, (frame.canvas.width - title_width) // 2, frame.canvas.start_line, colour, attr, bg ) if self.can_scroll and frame.canvas.height > 5: self.scroll_bar.update() class Frame(Effect): """ A Frame is a special Effect for controlling and displaying Widgets. It is similar to a window as used in native GUI applications. Widgets are text UI elements that can be used to create an interactive application within your Frame. """ #: Colour palette for the widgets within the Frame. Each entry should be #: a 3-tuple of (foreground colour, attribute, background colour). palette = {} def __init__(self, screen, height, width, data=None, on_load=None, has_border=True, hover_focus=False, name=None, title=None, x=None, y=None, has_shadow=False, reduce_cpu=False, is_modal=False, can_scroll=True): """ :param screen: The Screen that owns this Frame. :param width: The desired width of the Frame. :param height: The desired height of the Frame. :param data: optional data dict to initialize any widgets in the frame. :param on_load: optional function to call whenever the Frame reloads. :param has_border: Whether the frame has a border box. Defaults to True. :param hover_focus: Whether hovering a mouse over a widget (i.e. mouse move events) should change the input focus. Defaults to false. :param name: Optional name to identify this Frame. This is used to reset data as needed from on old copy after the screen resizes. :param title: Optional title to display if has_border is True. :param x: Optional x position for the top left corner of the Frame. :param y: Optional y position for the top left corner of the Frame. :param has_shadow: Optional flag to indicate if this Frame should have a shadow when drawn. :param reduce_cpu: Whether to minimize CPU usage (for use on low spec systems). :param is_modal: Whether this Frame is "modal" - i.e. will stop all other Effects from receiving input events. :param can_scroll: Whether a scrollbar should be available on the border, or not. """ super().__init__(screen) self._focus = 0 self._max_height = 0 self._layouts = [] self._effects = [] self._canvas = Canvas(screen, height, width, x, y) self._data = None self._on_load = on_load self._hover_focus = hover_focus self._initial_data = data if data else {} self._title = None self.title = title # Use property to re-format text as required. self._has_shadow = has_shadow self._reduce_cpu = reduce_cpu self._is_modal = is_modal self._has_focus = False self._border_mgr = _BorderManager(self, has_border, can_scroll) # A unique name is needed for cloning. Try our best to get one! self._name = title if name is None else name # Flag to catch recursive calls inside the data setting. This is # typically caused by callbacks subsequently trying to re-use functions. self._in_call = False # Now set up any passed data - use the public property to trigger any # necessary updates. self.data = deepcopy(self._initial_data) # Ensure that we have the default palette in place self._theme = None self.set_theme("default") def get_scroll_pos(self): """ Get current position for scroll bar. """ if self._canvas.height >= self._max_height: return 0 return self._canvas.start_line / (self._max_height - self._canvas.height + 1) def set_scroll_pos(self, pos): """ Set current position for scroll bar. """ if self._canvas.height < self._max_height: pos *= self._max_height - self._canvas.height + 1 pos = int(round(max(0, pos), 0)) self._canvas.scroll_to(pos) def add_layout(self, layout): """ Add a Layout to the Frame. :param layout: The Layout to be added. """ layout.register_frame(self) self._layouts.append(layout) def add_effect(self, effect): """ Add an Effect to the Frame. :param effect: The Effect to be added. """ effect.register_scene(self._scene) self._effects.append(effect) def fix(self): """ Fix the layouts and calculate the locations of all the widgets. This function should be called once all Layouts have been added to the Frame and all widgets added to the Layouts. """ # Remove any focus now before we reset... if self._has_focus: try: self._layouts[self._focus].blur() except IndexError: pass # Do up to 2 passes in case we have a variable height Layout. fill_layout = None fill_height = y = 0 for _ in range(2): # Pick starting point/height - varies for borders. x, y, height, width = self._border_mgr.get_rectangle() start_y = y # Process each Layout in the Frame - getting required height for # each. for layout in self._layouts: if layout.fill_frame: if fill_layout is None: # First pass - remember it for now. fill_layout = layout elif fill_layout == layout: # Second pass - pass in max height y = layout.fix(x, y, width, fill_height) else: # A second filler - this is a bug in the application. raise Highlander("Too many Layouts filling Frame") else: y = layout.fix(x, y, width, height) # Can stop now if no fill required. if fill_layout is None: break # We hit a variable height Layout - figure out the available space and reset everything # to the new values. fill_height = max(1, start_y + height - y) # Remember the resulting height of the underlying Layouts. self._max_height = y # Reset text if self._has_focus: while self._focus < len(self._layouts): try: self._layouts[self._focus].focus(force_first=True) break except IndexError: self._focus += 1 self._clear() def _clear(self): """ Clear the current canvas. """ # It's orders of magnitude faster to reset with a print like this # instead of recreating the screen buffers. (colour, attr, bg) = self.palette["background"] self._canvas.clear_buffer(colour, attr, bg) def _update(self, frame_no): # TODO: Should really be in a separate Desktop Manager class - wait for v2.0 if self.scene and self.scene.effects[-1] != self: if self._focus < len(self._layouts): self._layouts[self._focus].blur() self._has_focus = False # Reset the canvas to prepare for next round of updates. self._clear() # Update all the widgets first. for layout in self._layouts: layout.update(frame_no) # Then update any effects as needed. for effect in self._effects: effect.update(frame_no) # Draw any border if needed. self._border_mgr.draw() # Now push it all to screen. self._canvas.refresh() # And finally - draw the shadow if self._has_shadow: (colour, _, bg) = self.palette["shadow"] self._screen.highlight( self._canvas.origin[0] + 1, self._canvas.origin[1] + self._canvas.height, self._canvas.width - 1, 1, fg=colour, bg=bg, blend=50) self._screen.highlight( self._canvas.origin[0] + self._canvas.width, self._canvas.origin[1] + 1, 1, self._canvas.height, fg=colour, bg=bg, blend=50) def set_theme(self, theme): """ Pick a palette from the list of supported THEMES. :param theme: The name of the theme to set. """ if theme in THEMES: self._theme = theme self.palette = THEMES[theme] if self._border_mgr.can_scroll: self._border_mgr.scroll_bar.palette = self.palette @property def title(self): """ Title for this Frame. """ return self._title @title.setter def title(self, new_value): self._title = " " + new_value[0:self._canvas.width - 4] + " " if new_value else "" @property def data(self): """ Data dictionary containing values from the contained widgets. """ return self._data @data.setter def data(self, new_value): # Don't allow this function to recurse. if self._in_call: return self._in_call = True # Do a key-by-key copy to allow for dictionary-like objects - e.g. # sqlite3 Row class. self._data = {} if new_value is not None: for key in list(new_value.keys()): self._data[key] = new_value[key] # Now update any widgets as needed. for layout in self._layouts: layout.update_widgets() # All done - clear the recursion flag. self._in_call = False @property def stop_frame(self): # Widgets have no defined end - always return -1. return -1 @property def safe_to_default_unhandled_input(self): # It is NOT safe to use the unhandled input handler on Frames as the # default on space and enter is to go to the next Scene. return False @property def canvas(self): """ The Canvas that backs this Frame. """ return self._canvas @property def focussed_widget(self): """ The widget that currently has the focus within this Frame. """ # If the frame has no focus, it can't have a focussed widget. if not self._has_focus: return None try: layout = self._layouts[self._focus] return layout.get_current_widget() except IndexError: # If the current indexing is invalid it's because no widget is selected. return None @property def frame_update_count(self): """ The number of frames before this Effect should be updated. """ result = 1000000 for layout in self._layouts: if layout.frame_update_count > 0: result = min(result, layout.frame_update_count) for effect in self._effects: if effect.frame_update_count > 0: result = min(result, effect.frame_update_count) return result @property def reduce_cpu(self): """ Whether this Frame should try to optimize refreshes to reduce CPU. """ return self._reduce_cpu @property def border_box(self): """ Instance of :class:`~asciimatics.utilities.BoxTool` that specifies the characters used to draw the border to this frame. You can change the border character style by modifying the :attr:`style` property on this object. Allowed styles are defined in :mod:`~asciimatics.constants`. """ return self._border_mgr.box def find_widget(self, name): """ Look for a widget with a specified name. :param name: The name to search for. :returns: The widget that matches or None if one couldn't be found. """ result = None for layout in self._layouts: result = layout.find_widget(name) if result: break return result def clone(self, _, scene): """ Create a clone of this Frame into a new Screen. :param _: ignored. :param scene: The new Scene object to clone into. """ # Assume that the application creates a new set of Frames and so we need to match up the # data from the old object to the new (using the name). if self._name is not None: for effect in scene.effects: if isinstance(effect, Frame): # Using protected access to our own class type on purpose. # pylint: disable=protected-access logger.debug("Cloning: %s", effect._name) if effect._name == self._name: effect.set_theme(self._theme) effect.data = self.data for layout in self._layouts: layout.update_widgets(new_frame=effect) def reset(self): # Reset form to default state. self.data = deepcopy(self._initial_data) # Now reset the individual widgets. self._canvas.reset() for layout in self._layouts: layout.reset() layout.blur() # Then reset any effects as needed. for effect in self._effects: effect.reset() # Set up active widget. self._focus = 0 while self._focus < len(self._layouts): try: self._layouts[self._focus].focus(force_first=True) break except IndexError: self._focus += 1 # Call the on_load function now if specified. if self._on_load is not None: self._on_load() def save(self, validate=False): """ Save the current values in all the widgets back to the persistent data storage. :param validate: Whether to validate the data before saving. Calling this while setting the `data` field (e.g. in a widget callback) will have no effect. When validating data, it can throw an Exception for any """ # Don't allow this function to be called if we are already updating the # data for the form. if self._in_call: return # We're clear - pass on to all layouts/widgets. invalid = [] for layout in self._layouts: try: layout.save(validate=validate) except InvalidFields as exc: invalid.extend(exc.fields) # Check for any bad data and raise exception if needed. if len(invalid) > 0: raise InvalidFields(invalid) def blur(self): """ Blur this Frame. """ # If the frame has no focus, it's a NOOP. if not self._has_focus: return self._layouts[self._focus].blur() self._has_focus = False logger.debug("Blurred frame: %s", self) def switch_focus(self, layout, column, widget): """ Switch focus to the specified widget. :param layout: The layout that owns the widget. :param column: The column the widget is in. :param widget: The index of the widget to take the focus. """ # Find the layout to own the focus. for i, l in enumerate(self._layouts): if l is layout: break else: # No matching layout - give up now return self._layouts[self._focus].blur() self._focus = i self._layouts[self._focus].focus(force_column=column, force_widget=widget) def move_to(self, x, y, h): """ Make the specified location visible. This is typically used by a widget to scroll the canvas such that it is visible. :param x: The x location to make visible. :param y: The y location to make visible. :param h: The height of the location to make visible. """ start_x, start_y, height, width = self._border_mgr.get_rectangle() if ((start_x <= x < start_x + width) and (y >= start_y) and (y + h < start_y + height)): # Already OK - quit now. return if y < start_y: self._canvas.scroll_to(y - 1 if self._border_mgr.has_border else y) else: line = y + h - self._canvas.height + (1 if self._border_mgr.has_border else 0) self._canvas.scroll_to(max(0, line)) def rebase_event(self, event): """ Rebase the coordinates of the passed event to frame-relative coordinates. :param event: The event to be rebased. :returns: A new event object appropriately re-based. """ new_event = copy(event) if isinstance(new_event, MouseEvent): origin = self._canvas.origin new_event.x -= origin[0] new_event.y -= origin[1] - self._canvas.start_line logger.debug("New event: %s", new_event) return new_event def _outside_frame(self, event): origin = self._canvas.origin if (event.y < origin[1] or event.y >= origin[1] + self._canvas.height or event.x < origin[0] or event.x >= origin[0] + self._canvas.width): return True return False def _find_next_tab_stop(self, direction): old_focus = self._focus self._focus += direction while self._focus != old_focus: if self._focus < 0: self._focus = len(self._layouts) - 1 if self._focus >= len(self._layouts): self._focus = 0 logger.debug("Trying tab to layout %s", self._focus) try: if direction > 0: self._layouts[self._focus].focus(force_first=True) else: self._layouts[self._focus].focus(force_last=True) return except IndexError: self._focus += direction # If we get here, we need to reset the layout focus if direction > 0: self._layouts[self._focus].focus(force_first=True) else: self._layouts[self._focus].focus(force_last=True) def _switch_to_nearest_vertical_widget(self, direction): """ Find the nearest widget above or below the current widget with the focus. This should only be called by the Frame when normal Layout navigation fails and so this needs to find the nearest widget in the next available Layout. It will not search the existing Layout for a closer match. :param direction: The direction to move through the Layouts. """ # If no current widget, just find next one current_widget = self._layouts[self._focus].get_current_widget() if current_widget is None: self._find_next_tab_stop(direction) return # Otherwise, find the nearest option focus = self._focus focus += direction while self._focus != focus: if focus < 0: focus = len(self._layouts) - 1 if focus >= len(self._layouts): focus = 0 match = self._layouts[focus].get_nearest_widget(current_widget, direction) if match: self.switch_focus(self._layouts[focus], match[1], match[2]) return focus += direction def _handle_desktop_ordering(self, event): claimed_focus = False if isinstance(event, MouseEvent) and event.buttons > 0: # TODO: Should have Desktop Manager handling this - wait for v2.0 # Claim focus if mouse click is inside the Frame. if (0 <= event.x < self._canvas.width and self._canvas.start_line <= event.y < self._canvas.start_line + self._canvas.height): self._scene.remove_effect(self) self._scene.add_effect(self, reset=False) if not self._has_focus and self._focus < len(self._layouts): self._layouts[self._focus].focus() self._has_focus = claimed_focus = True logger.debug("Blurring: %s", self._scene.effects) for effect in self._scene.effects: if effect is not self: try: effect.blur() except AttributeError: pass else: return claimed_focus, True elif isinstance(event, KeyboardEvent): # TODO: Should have Desktop Manager handling this - wait for v2.0 # By this stage, if we're processing keys and topmost, we have the focus. if self._scene.effects[-1] is not self: return claimed_focus, True if not self._has_focus and self._focus < len(self._layouts): self._layouts[self._focus].focus() self._has_focus = True return claimed_focus, False def process_event(self, event): # Rebase any mouse events into Frame coordinates now. old_event = event event = self.rebase_event(event) # Should we change z-order or quit now? claimed_focus, quit_now = self._handle_desktop_ordering(event) if quit_now: return old_event # No need to do anything if this Frame has no Layouts - and hence no # widgets. Swallow all Keyboard events while we have focus. # # Also don't bother trying to process widgets if there is no defined # focus. This means there is no enabled widget in the Frame. if (self._focus < 0 or self._focus >= len(self._layouts) or not self._layouts): if event is not None and isinstance(event, KeyboardEvent): return None else: # Don't allow events to bubble down if this window owns the Screen - as already # calculated when taking the focus - or is modal. return None if claimed_focus or self._is_modal else old_event # Give the current widget in focus first chance to process the event. event = self._layouts[self._focus].process_event(event, self._hover_focus) logger.debug("Current widget left event: %s", event) # If the underlying widgets did not process the event, try processing # it now. if event is not None: if isinstance(event, KeyboardEvent): if event.key_code == Screen.KEY_TAB: # Move on to next widget. self._layouts[self._focus].blur() self._find_next_tab_stop(1) # Find next tab stop will have already set the new focus. old_event = None elif event.key_code == Screen.KEY_BACK_TAB: # Move on to previous widget. self._layouts[self._focus].blur() self._find_next_tab_stop(-1) # Find next tab stop will have already set the new focus. old_event = None if event.key_code == Screen.KEY_DOWN: # Move on to nearest vertical widget in the next Layout self._switch_to_nearest_vertical_widget(1) old_event = None elif event.key_code == Screen.KEY_UP: # Move on to nearest vertical widget in the next Layout self._switch_to_nearest_vertical_widget(-1) old_event = None elif isinstance(event, MouseEvent): # Give layouts/widgets first dibs on the mouse message. for layout in self._layouts: if layout.process_event(event, self._hover_focus) is None: return None # If no joy, check whether the scroll bar was clicked. if self._border_mgr.can_scroll: if self._border_mgr.scroll_bar.process_event(event): return None # Don't allow events to bubble down if this window owns the Screen (as already # calculated when taking the focus) or if the Frame is modal or we handled the # event. return None if claimed_focus or self._is_modal or event is None else old_event python-asciimatics-1.15.0/asciimatics/widgets/label.py000066400000000000000000000042441511423144500230020ustar00rootroot00000000000000"""This mdoule implements a widget to give a text label""" from asciimatics.widgets.widget import Widget from asciimatics.widgets.utilities import _split_text class Label(Widget): """ A text label. """ __slots__ = ["_text", "_required_height", "_align"] def __init__(self, label, height=1, align="<", name=None): """ :param label: The text to be displayed for the Label. :param height: Optional height for the label. Defaults to 1 line. :param align: Optional alignment for the Label. Defaults to left aligned. Options are "<" = left, ">" = right and "^" = centre :param name: The name of this widget. """ # Labels have no value and so should have no name for look-ups either. super().__init__(name, tab_stop=False) # Although this is a label, we don't want it to contribute to the layout # tab calculations, so leave internal `_label` value as None. # Also ensure that the label really is text. self._text = str(label) self._required_height = height self._align = align def process_event(self, event): # Labels have no user interactions return event def update(self, frame_no): (colour, attr, background) = self._frame.palette[ self._pick_palette_key("label", selected=False, allow_input_state=False)] for i, text in enumerate( _split_text(self._text, self._w, self._h, self._frame.canvas.unicode_aware)): self._frame.canvas.paint( f"{text:{self._align}{self._w}}", self._x, self._y + i, colour, attr, background ) def reset(self): pass def required_height(self, offset, width): # Allow one line for text and a blank spacer before it. return self._required_height @property def text(self): """ The current text for this Label. """ return self._text @text.setter def text(self, new_value): self._text = new_value @property def value(self): """ The current value for this Label. """ return self._value python-asciimatics-1.15.0/asciimatics/widgets/layout.py000066400000000000000000000602241511423144500232400ustar00rootroot00000000000000"""This module implements the displaying of widgets appropriately""" from logging import getLogger from wcwidth import wcswidth from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import Highlander, InvalidFields from asciimatics.screen import Screen from asciimatics.utilities import _DotDict from asciimatics.widgets.utilities import _euclidian_distance from asciimatics.widgets.widget import Widget # Logging logger = getLogger(__name__) class Layout(): """ Widget layout handler. All Widgets must be contained within a Layout within a Frame.The Layout class is responsible for deciding the exact size and location of the widgets. The logic uses similar ideas as used in modern web frameworks and is as follows. 1. The Frame owns one or more Layouts. The Layouts stack one above each other when displayed - i.e. the first Layout in the Frame is above the second, etc. 2. Each Layout defines the horizontal constraints by defining columns as a percentage of the full canvas width. 3. The Widgets are assigned a column within the Layout that owns them. 4. The Layout then decides the exact size and location to make the Widget best fit the canvas as constrained by the above. """ __slots__ = ["_column_sizes", "_columns", "_frame", "_has_focus", "_live_col", "_live_widget", "_fill_frame", "_gutter"] def __init__(self, columns, fill_frame=False, gutter=0): """ :param columns: A list of numbers specifying the width of each column in this layout. :param fill_frame: Whether this Layout should attempt to fill the rest of the Frame. Defaults to False. :param gutter: gutter space between columns specified in characters, defaults to 0 The Layout will automatically normalize the units used for the columns, e.g. converting [2, 6, 2] to [20%, 60%, 20%] of the available canvas. """ total_size = sum(columns) self._column_sizes = [x / total_size for x in columns] self._columns = [[] for _ in columns] self._frame = None self._has_focus = False self._live_col = 0 self._live_widget = -1 self._fill_frame = fill_frame self._gutter = gutter @property def fill_frame(self): """ Whether this Layout is variable height or not. """ return self._fill_frame @property def frame_update_count(self): """ The number of frames before this Layout should be updated. """ result = 1000000 for column in self._columns: for widget in column: if widget.frame_update_count > 0: result = min(result, widget.frame_update_count) return result def register_frame(self, frame): """ Register the Frame that owns this Widget. :param frame: The owning Frame. """ self._frame = frame for column in self._columns: for widget in column: widget.register_frame(self._frame) def add_widget(self, widget, column=0): """ Add a widget to this Layout. If you are adding this Widget to the Layout dynamically after starting to play the Scene, don't forget to ensure that the value is explicitly set before the next update. :param widget: The widget to be added. :param column: The column within the widget for this widget. Defaults to zero. :returns: The passed in widget (so you can store a reference if needed). """ # Make sure that the Layout is fully initialised before we try to add any widgets. if self._frame is None: raise RuntimeError("You must add the Layout to the Frame before you can add a Widget.") # Now process the widget. self._columns[column].append(widget) widget.register_frame(self._frame) if widget.name in self._frame.data: widget.value = self._frame.data[widget.name] return widget def clear_widgets(self): """ Clear all widgets from this Layout. This method allows users of the Layout to dynamically recreate a new Layout. After calling this method, you can add new widgetsback into the Layout and then need to call `fix` to force the Frame to recalculate the resulting new overall layout. """ self._columns = [[] for _ in self._columns] self._live_col = 0 self._live_widget = -1 def focus(self, force_first=False, force_last=False, force_column=None, force_widget=None): """ Call this to give this Layout the input focus. :param force_first: Optional parameter to force focus to first widget. :param force_last: Optional parameter to force focus to last widget. :param force_column: Optional parameter to mandate the new column index. :param force_widget: Optional parameter to mandate the new widget index. The force_column and force_widget parameters must both be set together or they will otherwise be ignored. :raises IndexError: if a force option specifies a bad column or widget, or if the whole Layout is readonly. """ logger.debug("Focus: %s", self) had_focus = self._has_focus col, wid = self._live_col, self._live_widget self._has_focus = True if force_widget is not None and force_column is not None: self._live_col = force_column self._live_widget = force_widget elif force_first: self._live_col = 0 self._live_widget = -1 self._find_next_widget(1) elif force_last: self._live_col = len(self._columns) - 1 self._live_widget = len(self._columns[self._live_col]) self._find_next_widget(-1) if self._live_widget == -1: raise IndexError("No live widgets") if (col, wid) != (self._live_col, self._live_widget) or not had_focus: self._columns[self._live_col][self._live_widget].focus() def blur(self): """ Call this to take the input focus from this Layout. """ logger.debug("Blur: %s", self) if self._has_focus: self._has_focus = False try: self._columns[self._live_col][self._live_widget].blur() except IndexError: # don't worry if there are no active widgets in the Layout pass def fix(self, start_x, start_y, max_width, max_height): """ Fix the location and size of all the Widgets in this Layout. :param start_x: The start column for the Layout. :param start_y: The start line for the Layout. :param max_width: Max width to allow this layout. :param max_height: Max height to allow this layout. :returns: The next line to be used for any further Layouts. """ total_gutter = self._gutter * (len(self._columns) - 1) x = start_x width = max_width - total_gutter y = w = 0 max_y = start_y string_len = wcswidth if self._frame.canvas.unicode_aware else len dimensions = [] for i, column in enumerate(self._columns): # For each column determine if we need a tab offset for labels. # Only allow labels to take up 1/3 of the column. if len(column) > 0: offset = max(0 if c.label is None else string_len(c.label) + 1 for c in column) else: offset = 0 offset = int(min(offset, width * self._column_sizes[i] // 3)) # Start tracking new column dimensions.append(_DotDict()) dimensions[i].parameters = [] dimensions[i].offset = offset # Do first pass to figure out the gaps for widgets that want to fill remaining space. fill_layout = None fill_column = None y = start_y w = int(width * self._column_sizes[i]) for widget in column: h = widget.required_height(offset, w) if h == Widget.FILL_FRAME: if fill_layout is None and fill_column is None: dimensions[i].parameters.append([widget, x, w, h]) fill_layout = widget else: # Two filling widgets in one column - this is a bug. raise Highlander("Too many Widgets filling Layout") elif h == Widget.FILL_COLUMN: if fill_layout is None and fill_column is None: dimensions[i].parameters.append([widget, x, w, h]) fill_column = widget else: # Two filling widgets in one column - this is a bug. raise Highlander("Too many Widgets filling Layout") else: dimensions[i].parameters.append([widget, x, w, h]) y += h # Note space used by this column. dimensions[i].height = y # Update tracking variables for the next column. max_y = max(max_y, y) x += w + self._gutter # Finally check whether the Layout is allowed to expand. if self.fill_frame: max_y = max(max_y, start_y + max_height) # Now apply calculated sizes, updating any widgets that need to fill space. for column in dimensions: y = start_y for widget, x, w, h in column.parameters: if h == Widget.FILL_FRAME: h = max(1, start_y + max_height - column.height) elif h == Widget.FILL_COLUMN: h = max_y - column.height widget.set_layout(x, y, column.offset, w, h) y += h return max_y def get_current_widget(self): """ Return the current widget with the focus, or None if there isn't one. """ return self._columns[self._live_col][self._live_widget] if self._has_focus else None def get_nearest_widget(self, target_widget, direction): """ Find the nearest enabled widget to the specified target widget, bearing in mind direction of travel. Direction of travel is defined to be the movement from current Layout to next. This is important for the case where we wrap back to the beginning or end of the Layouts - and so should still only look for the widgets nearest the top/bottom (depending on direction of travel). This function may return None if there is no match (e.g. all widgets are disabled). :param target_widget: the target widget to match. :param direction: The direction of travel across Layouts. """ best_distance = 999999999 match = None for i, column in enumerate(self._columns): indexed_column = list(enumerate(column)) if direction < 0: indexed_column = reversed(indexed_column) # Force this to be a list for python 2/3 compatibility. live_widgets = list(filter(lambda x: x[1].is_tab_stop and not x[1].disabled, indexed_column)) try: j, candidate = live_widgets[0] new_distance = _euclidian_distance(target_widget, candidate) if new_distance < best_distance: best_distance = new_distance match = candidate, i, j except IndexError: pass return match def _find_nearest_horizontal_widget(self, direction): """ Find the nearest widget to the left or right of the current widget with the focus. :param direction: The direction to move through the columns. """ current_col = self._live_col current_widget = self._columns[self._live_col][self._live_widget] while True: current_col += direction # Check if we need to wrap back to the beginning or end of the columns. if current_col >= len(self._columns): current_col = 0 if current_col < 0: current_col = len(self._columns) - 1 # Check if we've got back where we started - if so we had no match and we're done. if self._live_col == current_col: return # OK - we're still looking. FInd the closest live widget. live_widgets = filter(lambda x: x[1].is_tab_stop and not x[1].disabled, enumerate(self._columns[current_col])) best_distance = 999999999 best_index = -1 for index, widget in live_widgets: self._live_col = current_col # An exact match on line (i.e. same Y value) trumps any closest distance. Break out now if # we find a match that way. if widget.get_location()[1] == current_widget.get_location()[1]: self._live_col = current_col self._live_widget = index return new_distance = _euclidian_distance(current_widget, widget) if new_distance < best_distance: best_distance = new_distance best_index = index if best_index >= 0: self._live_col = current_col self._live_widget = best_index return def _find_next_widget(self, direction, stay_in_col=False): """ Find the next widget to get the focus, following TAB logic :param direction: The direction to move through the widgets. :param stay_in_col: Whether to limit search to current column. (Used for up/down in columns). """ current_widget = self._live_widget current_col = self._live_col while 0 <= self._live_col < len(self._columns): self._live_widget += direction while 0 <= self._live_widget < len(self._columns[self._live_col]): widget = self._columns[self._live_col][self._live_widget] if widget.is_tab_stop and not widget.disabled: return self._live_widget += direction # No need to do more if we are staying in the column. if stay_in_col: break # If we got here move to the ne t column. self._live_col += direction self._live_widget = -1 if direction > 0 else len(self._columns[self._live_col]) if self._live_col == current_col: break # We've exhausted our search - give up and stay where we were. self._live_widget = current_widget def _update_focus(self, column, widget, set_focus=True): """ Helper function to move focus if new state matches the passed in state. :param column: Old index of column with focus. :param widget: Old index of widget with focus. :param set_focus: Whether to set a new focus or not. """ if (column, widget) != (self._live_col, self._live_widget): self._columns[column][widget].blur() if set_focus: self._columns[self._live_col][self._live_widget].focus() def process_event(self, event, hover_focus): """ Process any input event. :param event: The event that was triggered. :param hover_focus: Whether to trigger focus change on mouse moves. :returns: None if the Effect processed the event, else the original event. """ # Check whether this Layout is read-only - i.e. has no active focus. logger.debug("Layout event: %s %s", self, event) if self._live_col < 0 or self._live_widget < 0: # Might just be that we've unset the focus - so check we can't find a focus. self._find_next_widget(1) if self._live_col < 0 or self._live_widget < 0: return event # Give the active widget the first refusal for this event if we already have focus. if self._has_focus: event = self._columns[self._live_col][self._live_widget].process_event(event) # Check for any movement keys if the widget refused them. if event is not None: if isinstance(event, KeyboardEvent): if event.key_code == Screen.KEY_TAB: # Move on to next widget, unless it is the last in the Layout. col, wid = self._live_col, self._live_widget self._find_next_widget(1) if self._live_col >= len(self._columns): self._live_col = 0 self._live_widget = -1 self._find_next_widget(1) self._update_focus(col, wid, set_focus=False) return event # If we got here, we still should have the focus. self._update_focus(col, wid) event = None elif event.key_code == Screen.KEY_BACK_TAB: # Move on to previous widget, unless it is the first in the Layout. col, wid = self._live_col, self._live_widget self._find_next_widget(-1) if self._live_col < 0: self._live_col = len(self._columns) - 1 self._live_widget = len(self._columns[self._live_col]) self._find_next_widget(-1) self._update_focus(col, wid, set_focus=False) return event # If we got here, we still should have the focus. self._update_focus(col, wid) event = None elif event.key_code == Screen.KEY_DOWN: # Move on to nearest widget below our current focus. col, wid = self._live_col, self._live_widget self._find_next_widget(1, stay_in_col=True) self._update_focus(col, wid) event = event if wid == self._live_widget else None elif event.key_code == Screen.KEY_UP: # Move on to nearest widget above our current focus. col, wid = self._live_col, self._live_widget self._find_next_widget(-1, stay_in_col=True) self._update_focus(col, wid) event = event if wid == self._live_widget else None elif event.key_code == Screen.KEY_LEFT: # Move on to nearest widget to the left. col, wid = self._live_col, self._live_widget self._find_nearest_horizontal_widget(-1) self._update_focus(col, wid) event = None elif event.key_code == Screen.KEY_RIGHT: # Move on to nearest widget to the right. col, wid = self._live_col, self._live_widget self._find_nearest_horizontal_widget(1) self._update_focus(col, wid) event = None elif isinstance(event, MouseEvent): logger.debug("Check layout: %d, %d", event.x, event.y) if ((hover_focus and event.buttons >= 0) or event.buttons > 0): # Mouse click - look to move focus. for i, column in enumerate(self._columns): for j, widget in enumerate(column): if widget.is_mouse_over(event): self._frame.switch_focus(self, i, j) widget.process_event(event) return None return event def update(self, frame_no): """ Redraw the widgets inside this Layout. :param frame_no: The current frame to be drawn. """ for column in self._columns: for widget in column: # Don't bother with invisible widgets if widget.is_visible: widget.update(frame_no) def save(self, validate): """ Save the current values in all the widgets back to the persistent data storage. :param validate: whether to validate the saved data or not. :raises: InvalidFields if any invalid data is found. """ invalid = [] for column in self._columns: for widget in column: if widget.is_valid or not validate: if widget.name is not None: # This relies on the fact that we are passed the actual # dict and so can edit it directly. In this case, that # is all we want - no need to update the widgets. self._frame.data[widget.name] = widget.value else: invalid.append(widget.name) if len(invalid) > 0: raise InvalidFields(invalid) def find_widget(self, name): """ Look for a widget with a specified name. :param name: The name to search for. :returns: The widget that matches or None if one couldn't be found. """ result = None for column in self._columns: for widget in column: if widget.name is not None and name == widget.name: result = widget break return result def update_widgets(self, new_frame=None): """ Reset the values for any Widgets in this Layout based on the current Frame data store. :param new_frame: optional old Frame - used when cloning scenes. """ for column in self._columns: for widget in column: logger.debug("Updating: %s", widget.name) # First handle the normal case - pull the default data from the current frame. if widget.name in self._frame.data: widget.value = self._frame.data[widget.name] elif widget.is_tab_stop: # Make sure every active widget is properly initialised, by calling the setter. # This will fix up any dodgy NoneType values, but preserve any values overridden # by other code. widget.value = widget.value # If an old frame was present, give the widget a chance to clone internal state # from the previous view. If there is no clone function, ignore the error. if new_frame: try: widget.clone(new_frame.find_widget(widget.name)) except AttributeError: pass def reset(self): """ Reset this Layout and the Widgets it contains. """ # Ensure that the widgets are using the right values. self.update_widgets() # Reset all the widgets. for column in self._columns: for widget in column: widget.reset() widget.blur() # Find the focus for the first widget self._live_widget = -1 self._find_next_widget(1) def enable(self, columns=None): """ Enable all widgets in the specified columns of this Layout. :param columns: The list of columns to enable. Defaults to all columns. """ # Enable all widgets in required columns. for column in columns if columns else range(len(self._columns)): for widget in self._columns[column]: widget.disabled = False def disable(self, columns=None): """ Disable all widgets in the specified columns of this Layout. :param columns: The list of columns to disable. Defaults to all columns. """ # Disable all widgets in required columns. for column in columns if columns else range(len(self._columns)): for widget in self._columns[column]: widget.disabled = True # Update focus if needed. if columns is None or self._live_col in columns: self._find_next_widget(1) python-asciimatics-1.15.0/asciimatics/widgets/listbox.py000066400000000000000000000115501511423144500234050ustar00rootroot00000000000000"""This module implements the listbox widget""" from asciimatics.strings import ColouredText from asciimatics.widgets.utilities import _enforce_width from asciimatics.widgets.baselistbox import _BaseListBox class ListBox(_BaseListBox): """ A ListBox is a widget that displays a list from which the user can select one option. """ def __init__(self, height, options, centre=False, label=None, name=None, add_scroll_bar=False, parser=None, on_change=None, on_select=None, validator=None): """ :param height: The required number of input lines for this ListBox. :param options: The options for each row in the widget. :param centre: Whether to centre the selected line in the list. :param label: An optional label for the widget. :param name: The name for the ListBox. :param parser: Optional parser to colour text. :param on_change: Optional function to call when selection changes. :param on_select: Optional function to call when the user actually selects an entry from :param validator: Optional function to validate selection for this widget. The `options` are a list of tuples, where the first value is the string to be displayed to the user and the second is an interval value to identify the entry to the program. For example: options=[("First option", 1), ("Second option", 2)] """ super().__init__( height, options, label=label, name=name, parser=parser, on_change=on_change, on_select=on_select, validator=validator) self._centre = centre self._add_scroll_bar = add_scroll_bar def update(self, frame_no): self._draw_label() # Prepare to calculate new visible limits if needed. height = self._h width = self._w - self._offset # Clear out the existing box content (colour, attr, background) = self._frame.palette["field"] for i in range(height): self._frame.canvas.print_at( " " * self.width, self._x + self._offset, self._y + i, colour, attr, background) # Don't bother with anything else if there are no options to render. if len(self._options) <= 0: return # Decide whether we need to show or hide the scroll bar and adjust width accordingly. if self._add_scroll_bar: self._add_or_remove_scrollbar(width, height, 0) if self._scroll_bar: width -= 1 # Render visible portion of the text. y_offset = 0 if self._centre: # Always make selected text the centre - not very compatible with scroll bars, but # there's not much else I can do here. self._start_line = self._line - (height // 2) start_line = self._start_line if self._start_line < 0: y_offset = -self._start_line start_line = 0 for i, (text, _) in enumerate(self._options): if start_line <= i < start_line + height - y_offset: colour, attr, background = self._pick_colours("field", i == self._line) if len(text) > width: text = text[:width - 3] + "..." paint_text = _enforce_width(text, width, self._frame.canvas.unicode_aware) paint_text += " " * (width - self.string_len(str(paint_text))) self._frame.canvas.paint( str(paint_text), self._x + self._offset, self._y + y_offset + i - start_line, colour, attr, background, colour_map=paint_text.colour_map if hasattr(paint_text, "colour_map") else None) # And finally draw any scroll bar. if self._scroll_bar: self._scroll_bar.update() def _find_option(self, search_value): for text, value in self._options: if text.startswith(search_value): return value return None def _parse_option(self, option): """ Parse a single option for ColouredText. :param option: the option to parse :returns: the option parsed and converted to ColouredText. """ try: return ColouredText(option.raw_text, self._parser) except AttributeError: return ColouredText(option, self._parser) @property def options(self): """ The list of options available for user selection This is a list of tuples (, ). """ return self._options @options.setter def options(self, new_value): # Set net list of options and then force an update to the current value to align with the new options. self._options = self._parse_options(new_value) self.value = self._value python-asciimatics-1.15.0/asciimatics/widgets/multicolumnlistbox.py000066400000000000000000000241171511423144500257010ustar00rootroot00000000000000"""This module implements the widget for a multiple column list box""" from re import match as re_match from itertools import zip_longest from asciimatics.strings import ColouredText from asciimatics.widgets.utilities import _enforce_width from asciimatics.widgets.baselistbox import _BaseListBox class MultiColumnListBox(_BaseListBox): """ A MultiColumnListBox is a widget for displaying tabular data. It displays a list of related data in columns, from which the user can select a line. """ def __init__(self, height, columns, options, titles=None, label=None, name=None, add_scroll_bar=False, parser=None, on_change=None, on_select=None, space_delimiter=' '): """ :param height: The required number of input lines for this ListBox. :param columns: A list of widths and alignments for each column. :param options: The options for each row in the widget. :param titles: Optional list of titles for each column. Must match the length of `columns`. :param label: An optional label for the widget. :param name: The name for the ListBox. :param add_scroll_bar: Whether to add optional scrollbar for large lists. :param parser: Optional parser to colour options and titles text. :param on_change: Optional function to call when selection changes. :param on_select: Optional function to call when the user actually selects an entry from :param space_delimiter: Optional parameter to define the delimiter between columns. The default value is blank space. The `columns` parameter is a list of integers or strings. If it is an integer, this is the absolute width of the column in characters. If it is a string, it must be of the format "[][%]" where: * is the alignment string ("<" = left, ">" = right, "^" = centre) * is the width in characters * % is an optional qualifier that says the number is a percentage of the width of the widget. Column widths need to encompass any space required between columns, so for example, if your column is 5 characters, allow 6 for an extra space at the end. It is not possible to do this when you have a right-justified column next to a left-justified column, so this widget will automatically space them for you. An integer value of 0 is interpreted to be use whatever space is left available after the rest of the columns have been calculated. There must be only one of these columns. The number of columns is for this widget is determined from the number of entries in the `columns` parameter. The `options` list is then a list of tuples of the form ([val1, val2, ... , valn], index). For example, this data provides 2 rows for a 3 column widget: options=[(["One", "row", "here"], 1), (["Second", "row", "here"], 2)] The options list may be None and then can be set later using the `options` property on this widget. """ if titles is not None and parser is not None: titles = [ColouredText(x, parser) for x in titles] super().__init__( height, options, titles=titles, label=label, name=name, parser=parser, on_change=on_change, on_select=on_select) self._columns = [] self._align = [] self._spacing = [] self._add_scroll_bar = add_scroll_bar self._space_delimiter = space_delimiter for i, column in enumerate(columns): if isinstance(column, int): self._columns.append(column) self._align.append("<") else: match = re_match(r"([<>^]?)(\d+)([%]?)", column) self._columns.append(float(match.group(2)) / 100 if match.group(3) else int(match.group(2))) self._align.append(match.group(1) if match.group(1) else "<") if space_delimiter == ' ': self._spacing.append(1 if i > 0 and self._align[i] == "<" and self._align[i - 1] == ">" else 0) else: self._spacing.append(1 if i > 0 else 0) def _get_width(self, width, max_width): """ Helper function to figure out the actual column width from the various options. :param width: The size of column requested :param max_width: The maximum width allowed for this widget. :return: the integer width of the column in characters """ if isinstance(width, float): return int(max_width * width) if width == 0: width = (max_width - sum(self._spacing) - sum(self._get_width(x, max_width) for x in self._columns if x != 0)) return width def _print_cell(self, space, text, align, width, x, y, foreground, attr, background): # Sort out spacing first. if space: self._frame.canvas.print_at(self._space_delimiter * space, x, y, foreground, attr, background) # Now align text, taking into account double space glyphs. paint_text = _enforce_width(text, width, self._frame.canvas.unicode_aware) text_size = self.string_len(str(paint_text)) if text_size < width: # Default does no alignment or padding. buffer_1 = buffer_2 = "" if align == "<": buffer_2 = " " * (width - text_size) elif align == ">": buffer_1 = " " * (width - text_size) elif align == "^": start_len = int((width - text_size) / 2) buffer_1 = " " * start_len buffer_2 = " " * (width - text_size - start_len) paint_text = paint_text.join([buffer_1, buffer_2]) self._frame.canvas.paint( str(paint_text), x + space, y, foreground, attr, background, colour_map=paint_text.colour_map if hasattr(paint_text, "colour_map") else None) def update(self, frame_no): self._draw_label() # Calculate new visible limits if needed. height = self._h width = self._w delta_y = 0 # Clear out the existing box content (colour, attr, background) = self._frame.palette["field"] for i in range(height): self._frame.canvas.print_at( " " * width, self._x + self._offset, self._y + i + delta_y, colour, attr, background) # Allow space for titles if needed. if self._titles: delta_y += 1 height -= 1 # Decide whether we need to show or hide the scroll bar and adjust width accordingly. if self._add_scroll_bar: self._add_or_remove_scrollbar(width, height, delta_y) if self._scroll_bar: width -= 1 # Now draw the titles if needed. if self._titles: row_dx = 0 colour, attr, background = self._frame.palette["title"] for i, [title, align, space] in enumerate( zip(self._titles, self._align, self._spacing)): cell_width = self._get_width(self._columns[i], width) self._print_cell( space, title, align, cell_width, self._x + self._offset + row_dx, self._y, colour, attr, background) row_dx += cell_width + space # Don't bother with anything else if there are no options to render. if len(self._options) <= 0: return # Render visible portion of the text. self._start_line = max(0, self._line - height + 1, min(self._start_line, self._line)) for i, [row, _] in enumerate(self._options): if self._start_line <= i < self._start_line + height: colour, attr, background = self._pick_colours("field", i == self._line) row_dx = 0 # Try to handle badly formatted data, where row lists don't # match the expected number of columns. for text, cell_width, align, space in zip_longest( row, self._columns, self._align, self._spacing, fillvalue=""): if cell_width == "": break cell_width = self._get_width(cell_width, width) if len(text) > cell_width: text = text[:cell_width - 3] + "..." self._print_cell( space, text, align, cell_width, self._x + self._offset + row_dx, self._y + i + delta_y - self._start_line, colour, attr, background) row_dx += cell_width + space # And finally draw any scroll bar. if self._scroll_bar: self._scroll_bar.update() def _find_option(self, search_value): for row, value in self._options: # TODO: Should this be aware of a sort column? if row[0].startswith(search_value): return value return None def _parse_option(self, option): """ Parse a single option for ColouredText. :param option: the option to parse :returns: the option parsed and converted to ColouredText. """ option_items = [] for item in option: try: value = ColouredText(item.raw_text, self._parser) except AttributeError: value = ColouredText(item, self._parser) option_items.append(value) return option_items @property def options(self): """ The list of options available for user selection This is a list of tuples ([, ..., ], ). """ return self._options @options.setter def options(self, new_value): # Set net list of options and then force an update to the current value to align with the new options. self._options = self._parse_options(new_value) self.value = self._value python-asciimatics-1.15.0/asciimatics/widgets/popupdialog.py000066400000000000000000000071321511423144500242450ustar00rootroot00000000000000"""This module implements a Pop up dialog message box""" from inspect import isfunction from functools import partial from wcwidth import wcswidth from asciimatics.widgets.button import Button from asciimatics.widgets.frame import Frame from asciimatics.widgets.layout import Layout from asciimatics.widgets.textbox import TextBox from asciimatics.widgets.utilities import _split_text class PopUpDialog(Frame): """ A fixed implementation Frame that provides a standard message box dialog. """ def __init__(self, screen, text, buttons, on_close=None, has_shadow=False, theme="warning"): """ :param screen: The Screen that owns this dialog. :param text: The message text to display. :param buttons: A list of button names to display. This may be an empty list. :param on_close: Optional function to invoke on exit. :param has_shadow: optional flag to specify if dialog should have a shadow when drawn. :param theme: optional colour theme for this pop-up. Defaults to the warning colours. The `on_close` method (if specified) will be called with one integer parameter that corresponds to the index of the button passed in the array of available `buttons`. Note that `on_close` must be a static method to work across screen resizing. Either it is static (and so the dialog will be cloned) or it is not (and the dialog will disappear when the screen is resized). """ # Remember parameters for cloning. self._text = text self._buttons = buttons self._on_close = on_close # Decide on optimum width of the dialog. Limit to 2/3 the screen width. string_len = wcswidth if screen.unicode_aware else len width = max(string_len(x) for x in text.split("\n")) width = max(width + 2, sum(string_len(x) + 4 for x in buttons) + len(buttons) + 5) width = min(width, screen.width * 2 // 3) # Figure out the necessary message and allow for buttons and borders # when deciding on height. delta_h = 4 if len(buttons) > 0 else 2 self._message = _split_text(text, width - 2, screen.height - delta_h, screen.unicode_aware) height = len(self._message) + delta_h # Construct the Frame self._data = {"message": self._message} super().__init__( screen, height, width, self._data, has_shadow=has_shadow, is_modal=True) # Build up the message box layout = Layout([width - 2], fill_frame=True) self.add_layout(layout) text_box = TextBox(len(self._message), name="message") text_box.disabled = True layout.add_widget(text_box) layout2 = Layout([1 for _ in buttons]) self.add_layout(layout2) for i, button in enumerate(buttons): func = partial(self._destroy, i) layout2.add_widget(Button(button, func), i) self.fix() # Ensure that we have the right palette in place self.set_theme(theme) def _destroy(self, selected): self._scene.remove_effect(self) if self._on_close: self._on_close(selected) def clone(self, screen, scene): """ Create a clone of this Dialog into a new Screen. :param screen: The new Screen object to clone into. :param scene: The new Scene object to clone into. """ # Only clone the object if the function is safe to do so. if self._on_close is None or isfunction(self._on_close): scene.add_effect(PopUpDialog(screen, self._text, self._buttons, self._on_close)) python-asciimatics-1.15.0/asciimatics/widgets/popupmenu.py000066400000000000000000000050751511423144500237560ustar00rootroot00000000000000"""This module implements a pop up menu widget""" from collections import defaultdict from functools import partial from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.widgets.button import Button from asciimatics.widgets.frame import Frame from asciimatics.widgets.layout import Layout class PopupMenu(Frame): """ A widget for displaying a menu. """ palette = defaultdict(lambda: (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_CYAN)) palette["focus_button"] = (Screen.COLOUR_CYAN, Screen.A_NORMAL, Screen.COLOUR_WHITE) def __init__(self, screen, menu_items, x, y): """ :param screen: The Screen being used for this pop-up. :param menu_items: a list of items to be displayed in the menu. :param x: The X coordinate for the desired pop-up. :param y: The Y coordinate for the desired pop-up. The menu_items parameter is a list of 2-tuples, which define the text to be displayed in the menu and the function to call when that menu item is clicked. For example: menu_items = [("Open", file_open), ("Save", file_save), ("Close", file_close)] """ # Sort out location based on width of menu text. w = max(len(i[0]) for i in menu_items) h = len(menu_items) if x + w >= screen.width: x -= w - 1 if y + h >= screen.height: y -= h - 1 # Construct the Frame super().__init__( screen, h, w, x=x, y=y, has_border=False, can_scroll=False, is_modal=True, hover_focus=True) # Build the widget to display the time selection. layout = Layout([1], fill_frame=True) self.add_layout(layout) for item in menu_items: func = partial(self._destroy, item[1]) layout.add_widget(Button(item[0], func, add_box=False), 0) self.fix() def _destroy(self, callback=None): self._scene.remove_effect(self) if callback is not None: callback() def process_event(self, event): # Look for events that will close the pop-up - e.g. clicking outside the Frame or ESC key. if event is not None: if isinstance(event, KeyboardEvent): if event.key_code == Screen.KEY_ESCAPE: event = None elif isinstance(event, MouseEvent) and event.buttons != 0: if self._outside_frame(event): event = None if event is None: self._destroy() return super().process_event(event) python-asciimatics-1.15.0/asciimatics/widgets/radiobuttons.py000066400000000000000000000101171511423144500244340ustar00rootroot00000000000000"""This module implements the widget for radio buttons""" from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.widgets.widget import Widget class RadioButtons(Widget): """ A RadioButtons widget is used to ask for one of a list of values to be selected by the user. It consists of an optional label and then a list of selection bullets with field names. """ __slots__ = ["_options", "_selection", "_start_column", "_on_change"] def __init__(self, options, label=None, name=None, on_change=None, **kwargs): """ :param options: A list of (text, value) tuples for each radio button. :param label: An optional label for the widget. :param name: The internal name for the widget. :param on_change: Optional function to call when text changes. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._options = options self._label = label self._selection = 0 self._start_column = 0 self._on_change = on_change def update(self, frame_no): self._draw_label() # Decide on check char check_char = "•" if self._frame.canvas.unicode_aware else "X" # Render the list of radio buttons. for i, (text, _) in enumerate(self._options): fg, attr, bg = self._pick_colours("control", self._has_focus and i == self._selection) fg2, attr2, bg2 = self._pick_colours("field", self._has_focus and i == self._selection) check = check_char if i == self._selection else " " self._frame.canvas.print_at( f"({check}) ", self._x + self._offset, self._y + i, fg, attr, bg) self._frame.canvas.print_at( text, self._x + self._offset + 4, self._y + i, fg2, attr2, bg2) def reset(self): pass def process_event(self, event): if isinstance(event, KeyboardEvent): if event.key_code == Screen.KEY_UP: # Use property to trigger events. self._selection = max(0, self._selection - 1) self.value = self._options[self._selection][1] elif event.key_code == Screen.KEY_DOWN: # Use property to trigger events. self._selection = min(self._selection + 1, len(self._options) - 1) self.value = self._options[self._selection][1] else: # Ignore any other key press. return event elif isinstance(event, MouseEvent): # Mouse event - rebase coordinates to Frame context. if event.buttons != 0: if self.is_mouse_over(event, include_label=False): # Use property to trigger events. self._selection = event.y - self._y self.value = self._options[self._selection][1] return None # Ignore other mouse events. return event else: # Ignore non-keyboard events return event # If we got here, we processed the event - swallow it. return None def required_height(self, offset, width): return len(self._options) @property def value(self): """ The current value for these RadioButtons. """ # The value is actually the value of the current selection. return self._options[self._selection][1] @value.setter def value(self, new_value): # Only trigger the notification after we've changed the value. old_value = self._value for i, (_, value) in enumerate(self._options): if new_value == value: self._selection = i break else: self._selection = 0 self._value = self._options[self._selection][1] if old_value != self._value and self._on_change: self._on_change() python-asciimatics-1.15.0/asciimatics/widgets/scrollbar.py000066400000000000000000000064601511423144500237100ustar00rootroot00000000000000"""This module implements a scroll bar capability for widgets""" class _ScrollBar(): """ Internal object to provide vertical scroll bars for widgets. """ def __init__(self, canvas, palette, x, y, height, get_pos, set_pos, absolute=False): """ :param canvas: The canvas on which to draw the scroll bar. :param palette: The palette of the parent Frame. :param x: The x location of the top of the scroll bar. :param y: The y location of the top of the scroll bar. :param height: The height of the scroll bar. :param get_pos: A function to return the current position of the scroll bar. :param set_pos: A function to set the current position of the scroll bar. :param absolute: Whether the scroll bar should use absolute co-ordinates when handling mouse events. The current position for the scroll bar is defined to be 0.0 at the top and 1.0 at the bottom. The scroll bar will call `get_pos` to find the current position when drawing and uses `set_pos` to update this position on a mouse click. The widget using the scroll bar is responsible for maintaining its own state of where the current view is scrolled (e.g. which is the top line in a text box) and for providing these two functions to translate that internal state into a form the scroll bar can use. """ self._canvas = canvas self.palette = palette self.max_height = 0 self._x = x self._y = y self._height = height self._absolute = absolute self._get_pos = get_pos self._set_pos = set_pos def update(self): """ Draw the scroll bar. """ # Sort out chars cursor = "█" if self._canvas.unicode_aware else "O" back = "░" if self._canvas.unicode_aware else "|" # Now draw... try: sb_pos = self._get_pos() sb_pos = min(1, max(0, sb_pos)) sb_pos = max(int(self._height * sb_pos) - 1, 0) except ZeroDivisionError: sb_pos = 0 (colour, attr, bg) = self.palette["scroll"] y = self._canvas.start_line if self._absolute else 0 for dy in range(self._height): self._canvas.print_at(cursor if dy == sb_pos else back, self._x, y + self._y + dy, colour, attr, bg) def is_mouse_over(self, event): """ Check whether a MouseEvent is over thus scroll bar. :param event: The MouseEvent to check. :returns: True if the mouse event is over the scroll bar. """ return event.x == self._x and self._y <= event.y < self._y + self._height def process_event(self, event): """ Handle input on the scroll bar. :param event: the event to be processed. :returns: True if the scroll bar handled the event. """ # Convert into absolute coordinates if needed. new_event = event if self._absolute: new_event.y -= self._canvas.start_line # Process event if needed. if self.is_mouse_over(new_event) and event.buttons != 0: self._set_pos((new_event.y - self._y) / (self._height - 1)) return True return False python-asciimatics-1.15.0/asciimatics/widgets/temppopup.py000066400000000000000000000060271511423144500237550ustar00rootroot00000000000000"""This module implements a base class for popups""" from collections import defaultdict from abc import abstractmethod from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import InvalidFields from asciimatics.screen import Screen from asciimatics.widgets.frame import Frame class _TempPopup(Frame): """ An internal Frame for creating a temporary pop-up for a Widget in another Frame. """ def __init__(self, screen, parent, x, y, w, h): """ :param screen: The Screen being used for this pop-up. :param parent: The widget that spawned this pop-up. :param x: The X coordinate for the desired pop-up. :param y: The Y coordinate for the desired pop-up. :param w: The width of the desired pop-up. :param h: The height of the desired pop-up. """ # Construct the Frame super().__init__( screen, h, w, x=x, y=y, has_border=True, can_scroll=False, is_modal=True) # Set up the new palette for this Frame self.palette = defaultdict(lambda: parent.frame.palette["focus_field"]) self.palette["selected_field"] = parent.frame.palette["selected_field"] self.palette["selected_focus_field"] = parent.frame.palette["selected_focus_field"] self.palette["invalid"] = parent.frame.palette["invalid"] # Internal state for the pop-up self._parent = parent def process_event(self, event): # Look for events that will close the pop-up - e.g. clicking outside the Frame or Enter key. cancelled = False if event is not None: if isinstance(event, KeyboardEvent): if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]: event = None elif event.key_code == Screen.KEY_ESCAPE: event = None cancelled = True elif isinstance(event, MouseEvent) and event.buttons != 0: if self._outside_frame(event): event = None # Remove this pop-up if we're done; otherwise bubble up the event. if event is None: try: self.close(cancelled) except InvalidFields: # Nothing to do as we've already prevented the Effect from being removed. pass return super().process_event(event) def close(self, cancelled=False): """ Close this temporary pop-up. :param cancelled: Whether the pop-up was cancelled (e.g. by pressing Esc). """ self._on_close(cancelled) self._scene.remove_effect(self) @abstractmethod def _on_close(self, cancelled): """ Method to handle any communication back to the parent widget on closure of this pop-up. :param cancelled: Whether the pop-up was cancelled (e.g. by pressing Esc). This method can raise an InvalidFields exception to indicate that the current selection is invalid and so the pop-up cannot be dismissed. """ python-asciimatics-1.15.0/asciimatics/widgets/text.py000066400000000000000000000174401511423144500227110ustar00rootroot00000000000000"""This widget implements a text based input field""" from re import match from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.widgets.utilities import _find_min_start, _enforce_width, _get_offset from asciimatics.widgets.widget import Widget class Text(Widget): """ A Text widget is a single line input field. It consists of an optional label and an entry box. """ __slots__ = ["_column", "_start_column", "_on_change", "_validator", "_hide_char", "_max_length"] def __init__(self, label=None, name=None, on_change=None, validator=None, hide_char=None, max_length=None, readonly=False, **kwargs): """ :param label: An optional label for the widget. :param name: The name for the widget. :param on_change: Optional function to call when text changes. :param validator: Optional definition of valid data for this widget. This can be a function (which takes the current value and returns True for valid content) or a regex string (which must match the entire allowed value). :param hide_char: Character to use instead of what the user types - e.g. to hide passwords. :param max_length: Optional maximum length of the field. If set, the widget will limit data entry to this length. :param readonly: Whether the widget prevents user input to change values. Default is False. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._label = label self._column = 0 self._start_column = 0 self._on_change = on_change self._validator = validator self._hide_char = hide_char self._max_length = max_length self._readonly = readonly def set_layout(self, x, y, offset, w, h): # Do the usual layout work. then apply max length to resulting dimensions. super().set_layout(x, y, offset, w, h) if self._max_length: # Allow extra char for cursor, so contents don't scroll at required length self._w = min(self._w, self._max_length + self._offset + 1) def update(self, frame_no): self._draw_label() # Calculate new visible limits if needed. self._start_column = min(self._start_column, self._column) self._start_column += _find_min_start(self._value[self._start_column:self._column + 1], self.width, self._frame.canvas.unicode_aware, self._column >= self.string_len(self._value)) # Render visible portion of the text. (colour, attr, background) = self._pick_colours("readonly" if self._readonly else "edit_text") text = self._value[self._start_column:] text = _enforce_width(text, self.width, self._frame.canvas.unicode_aware) if self._hide_char: text = self._hide_char[0] * len(text) text += " " * (self.width - self.string_len(text)) self._frame.canvas.print_at( text, self._x + self._offset, self._y, colour, attr, background) # Since we switch off the standard cursor, we need to emulate our own # if we have the input focus. if self._has_focus: text_width = self.string_len(text[:self._column - self._start_column]) self._draw_cursor( " " if self._column >= len(self._value) else self._hide_char[0] if self._hide_char else self._value[self._column], frame_no, self._x + self._offset + text_width, self._y) def reset(self): # Reset to original data and move to end of the text. self._start_column = 0 self._column = len(self._value) def process_event(self, event): if isinstance(event, KeyboardEvent): if event.key_code == Screen.KEY_BACK and not self._readonly: if self._column > 0: # Delete character in front of cursor. self._set_and_check_value("".join([self._value[:self._column - 1], self._value[self._column:]])) self._column -= 1 elif event.key_code == Screen.KEY_DELETE and not self._readonly: if self._column < len(self._value): self._set_and_check_value("".join([self._value[:self._column], self._value[self._column + 1:]])) elif event.key_code == Screen.KEY_LEFT: self._column -= 1 self._column = max(self._column, 0) elif event.key_code == Screen.KEY_RIGHT: self._column += 1 self._column = min(len(self._value), self._column) elif event.key_code == Screen.KEY_HOME: self._column = 0 elif event.key_code == Screen.KEY_END: self._column = len(self._value) elif event.key_code >= 32 and not self._readonly: # Enforce required max length - swallow event if not allowed if self._max_length is None or len(self._value) < self._max_length: # Insert any visible text at the current cursor position. self._set_and_check_value(chr(event.key_code).join([self._value[:self._column], self._value[self._column:]])) self._column += 1 else: # Ignore any other key press. return event elif isinstance(event, MouseEvent): # Mouse event - rebase coordinates to Frame context. if event.buttons != 0: if self.is_mouse_over(event, include_label=False): self._column = (self._start_column + _get_offset(self._value[self._start_column:], event.x - self._x - self._offset, self._frame.canvas.unicode_aware)) self._column = min(len(self._value), self._column) self._column = max(0, self._column) return None # Ignore other mouse events. return event else: # Ignore other events return event # If we got here, we processed the event - swallow it. return None def required_height(self, offset, width): return 1 @property def frame_update_count(self): # Force refresh for cursor if needed. return 5 if self._has_focus and not self._frame.reduce_cpu else 0 @property def readonly(self): """ Whether this widget is readonly or not. """ return self._readonly @readonly.setter def readonly(self, new_value): self._readonly = new_value @property def value(self): """ The current value for this Text. """ return self._value @value.setter def value(self, new_value): self._set_and_check_value(new_value, reset=True) def _set_and_check_value(self, new_value, reset=False): # Only trigger the notification after we've changed the value. old_value = self._value self._value = new_value if new_value else "" if reset: self.reset() if old_value != self._value and self._on_change: self._on_change() if self._validator: if callable(self._validator): self._is_valid = self._validator(self._value) else: self._is_valid = match(self._validator, self._value) is not None python-asciimatics-1.15.0/asciimatics/widgets/textbox.py000066400000000000000000000360411511423144500234200ustar00rootroot00000000000000"""This module implements a multi line editing text box""" from copy import copy from logging import getLogger from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.strings import ColouredText from asciimatics.widgets.widget import Widget from asciimatics.widgets.utilities import _find_min_start, _enforce_width, _get_offset # Logging logger = getLogger(__name__) class TextBox(Widget): """ A TextBox is a widget for multi-line text editing. It consists of a framed box with option label. """ __slots__ = ["_line", "_column", "_start_line", "_start_column", "_required_height", "_as_string", "_line_wrap", "_on_change", "_reflowed_text_cache", "_parser", "_hide_cursor", "_auto_scroll"] def __init__(self, height, label=None, name=None, as_string=False, line_wrap=False, parser=None, on_change=None, readonly=False, **kwargs): """ :param height: The required number of input lines for this TextBox. :param label: An optional label for the widget. :param name: The name for the TextBox. :param as_string: Use string with newline separator instead of a list for the value of this widget. :param line_wrap: Whether to wrap at the end of the line. :param parser: Optional parser to colour text. :param on_change: Optional function to call when text changes. :param readonly: Whether the widget prevents user input to change values. Default is False. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._label = label self._line = 0 self._column = 0 self._start_line = 0 self._start_column = 0 self._required_height = height self._as_string = as_string self._line_wrap = line_wrap self._parser = parser self._on_change = on_change self._reflowed_text_cache = None self._readonly = readonly self._hide_cursor = False self._auto_scroll = True def update(self, frame_no): self._draw_label() # Calculate new visible limits if needed. height = self._h if not self._line_wrap: self._start_column = min(self._start_column, self._column) self._start_column += _find_min_start( str(self._value[self._line][self._start_column:self._column + 1]), self.width, self._frame.canvas.unicode_aware, self._column >= self.string_len(str(self._value[self._line]))) # Clear out the existing box content (colour, attr, background) = self._pick_colours("readonly" if self._readonly else "edit_text") self._frame.canvas.clear_buffer( colour, attr, background, self._x + self._offset, self._y, self.width, height) # Convert value offset to display offsets # NOTE: _start_column is always in display coordinates. display_text = self._reflowed_text display_start_column = self._start_column display_line, display_column = 0, 0 for i, (_, line, col) in enumerate(display_text): if line < self._line or (line == self._line and col <= self._column): display_line = i display_column = self._column - col # Restrict to visible/valid content. self._start_line = max(0, display_line - height + 1, min(self._start_line, display_line)) # Render visible portion of the text. for line, (text, _, _) in enumerate(display_text): if self._start_line <= line < self._start_line + height: paint_text = _enforce_width( text[display_start_column:], self.width, self._frame.canvas.unicode_aware) self._frame.canvas.paint( str(paint_text), self._x + self._offset, self._y + line - self._start_line, colour, attr, background, colour_map=paint_text.colour_map if hasattr(paint_text, "colour_map") else None) # Since we switch off the standard cursor, we need to emulate our own # if we have the input focus. if self._has_focus and not self._hide_cursor: line = str(display_text[display_line][0]) logger.debug("Cursor: %d,%d", display_start_column, display_column) text_width = self.string_len(line[display_start_column:display_column]) self._draw_cursor( " " if display_column >= len(line) else line[display_column], frame_no, self._x + self._offset + text_width, self._y + display_line - self._start_line) def reset(self): # Reset to original data and move to end of the text. self._start_line = 0 self._start_column = 0 if self._auto_scroll or self._line > len(self._value) - 1: self._line = len(self._value) - 1 self._column = 0 if self._is_disabled else len(self._value[self._line]) self._reflowed_text_cache = None def _change_line(self, delta): """ Move the cursor up/down the specified number of lines. :param delta: The number of lines to move (-ve is up, +ve is down). """ # Ensure new line is within limits self._line = min(max(0, self._line + delta), len(self._value) - 1) # Fix up column if the new line is shorter than before. if self._column >= len(self._value[self._line]): self._column = len(self._value[self._line]) def process_event(self, event): def _join(a, b): if self._parser: return ColouredText(a, self._parser, colour=b[0].first_colour).join(b) return a.join(b) if isinstance(event, KeyboardEvent): old_value = copy(self._value) if event.key_code in [10, 13] and not self._readonly: # Split and insert line on CR or LF. self._value.insert(self._line + 1, self._value[self._line][self._column:]) self._value[self._line] = self._value[self._line][:self._column] self._line += 1 self._column = 0 elif event.key_code == Screen.KEY_BACK and not self._readonly: if self._column > 0: # Delete character in front of cursor. self._value[self._line] = _join( "", [self._value[self._line][:self._column - 1], self._value[self._line][self._column:]]) self._column -= 1 else: if self._line > 0: # Join this line with previous self._line -= 1 self._column = len(self._value[self._line]) self._value[self._line] += \ self._value.pop(self._line + 1) elif event.key_code == Screen.KEY_DELETE and not self._readonly: if self._column < len(self._value[self._line]): self._value[self._line] = _join( "", [self._value[self._line][:self._column], self._value[self._line][self._column + 1:]]) else: if self._line < len(self._value) - 1: # Join this line with next self._value[self._line] += \ self._value.pop(self._line + 1) elif event.key_code == Screen.KEY_PAGE_UP: self._change_line(-self._h) elif event.key_code == Screen.KEY_PAGE_DOWN: self._change_line(self._h) elif event.key_code == Screen.KEY_UP: self._change_line(-1) elif event.key_code == Screen.KEY_DOWN: self._change_line(1) elif event.key_code == Screen.KEY_LEFT: # Move left one char, wrapping to previous line if needed. self._column -= 1 if self._column < 0: if self._line > 0: self._line -= 1 self._column = len(self._value[self._line]) else: self._column = 0 elif event.key_code == Screen.KEY_RIGHT: # Move right one char, wrapping to next line if needed. self._column += 1 if self._column > len(self._value[self._line]): if self._line < len(self._value) - 1: self._line += 1 self._column = 0 else: self._column = len(self._value[self._line]) elif event.key_code == Screen.KEY_HOME: # Go to the start of this line self._column = 0 elif event.key_code == Screen.KEY_END: # Go to the end of this line self._column = len(self._value[self._line]) elif event.key_code >= 32 and not self._readonly: # Insert any visible text at the current cursor position. self._value[self._line] = _join( chr(event.key_code), [self._value[self._line][:self._column], self._value[self._line][self._column:]]) self._column += 1 else: # Ignore any other key press. return event # If we got here we might have changed the value... if old_value != self._value: self._reflowed_text_cache = None if self._on_change: self._on_change() elif isinstance(event, MouseEvent): # Mouse event - rebase coordinates to Frame context. if event.buttons != 0: if self.is_mouse_over(event, include_label=False): # Find the line first. clicked_line = event.y - self._y + self._start_line if self._line_wrap: # Line-wrapped text needs to be mapped to visible lines display_text = self._reflowed_text clicked_line = min(clicked_line, len(display_text) - 1) text_line = display_text[clicked_line][1] text_col = display_text[clicked_line][2] else: # non-wrapped just needs a little end protection text_line = max(0, clicked_line) text_col = 0 self._line = min(len(self._value) - 1, text_line) # Now figure out location in text based on width of each glyph. self._column = (self._start_column + text_col + _get_offset( str(self._value[self._line][self._start_column + text_col:]), event.x - self._x - self._offset, self._frame.canvas.unicode_aware)) self._column = min(len(self._value[self._line]), self._column) self._column = max(0, self._column) return None # Ignore other mouse events. return event else: # Ignore other events return event # If we got here, we processed the event - swallow it. return None def required_height(self, offset, width): return self._required_height @property def _reflowed_text(self): """ The text as should be formatted on the screen. This is an array of tuples of the form (text, value line, value column offset) where the line and column offsets are indices into the value (not displayed glyph coordinates). """ if self._reflowed_text_cache is None: if self._line_wrap: self._reflowed_text_cache = [] limit = self._w - self._offset for i, line in enumerate(self._value): column = 0 while self.string_len(str(line)) >= limit: sub_string = _enforce_width( line, limit, self._frame.canvas.unicode_aware) self._reflowed_text_cache.append((sub_string, i, column)) line = line[len(sub_string):] column += len(sub_string) self._reflowed_text_cache.append((line, i, column)) else: self._reflowed_text_cache = [(x, i, 0) for i, x in enumerate(self._value)] return self._reflowed_text_cache @property def hide_cursor(self): """ Set to True to stop the cursor from showing. Defaults to False. """ return self._hide_cursor @hide_cursor.setter def hide_cursor(self, new_value): self._hide_cursor = new_value @property def auto_scroll(self): """ When set to True the TextBox will scroll to the bottom when created or next text is added. When set to False, the current scroll position will remain even if the contents are changed. Defaults to True. """ return self._auto_scroll @auto_scroll.setter def auto_scroll(self, new_value): self._auto_scroll = new_value @property def value(self): """ The current value for this TextBox. """ if self._value is None: self._value = [""] return "\n".join([str(x) for x in self._value]) if self._as_string else self._value @value.setter def value(self, new_value): # Convert to the internal format old_value = self._value if new_value is None: new_value = [""] elif self._as_string: new_value = new_value.split("\n") self._value = new_value # TODO: Sort out speed of this code if self._parser: new_value = [] last_colour = None for line in self._value: if hasattr(line, "raw_text"): value = line else: value = ColouredText(line, self._parser, colour=last_colour) new_value.append(value) last_colour = value.last_colour self._value = new_value self.reset() # Only trigger the notification after we've changed the value. if old_value != self._value and self._on_change: self._on_change() @property def readonly(self): """ Whether this widget is readonly or not. """ return self._readonly @readonly.setter def readonly(self, new_value): self._readonly = new_value @property def frame_update_count(self): # Force refresh for cursor if needed. if self._has_focus and not self._frame.reduce_cpu and not self._hide_cursor: return 5 return 0 python-asciimatics-1.15.0/asciimatics/widgets/timepicker.py000066400000000000000000000113021511423144500240500ustar00rootroot00000000000000"""This module implements a time picker widget""" from datetime import datetime from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.screen import Screen from asciimatics.widgets.label import Label from asciimatics.widgets.layout import Layout from asciimatics.widgets.listbox import ListBox from asciimatics.widgets.temppopup import _TempPopup from asciimatics.widgets.widget import Widget class _TimePickerPopup(_TempPopup): """ An internal Frame for editing the currently selected time. """ def __init__(self, parent): """ :param parent: The widget that spawned this pop-up. """ # Construct the Frame location = parent.get_location() super().__init__(parent.frame.screen, parent, location[0] - 1, location[1] - 2, 10 if parent.include_seconds else 7, 5) # Build the widget to display the time selection. self._hours = ListBox(3, [(f"{x:02}", x) for x in range(24)], centre=True) self._minutes = ListBox(3, [(f"{x:02}", x) for x in range(60)], centre=True) self._seconds = ListBox(3, [(f"{x:02}", x) for x in range(60)], centre=True) if self._parent.include_seconds: layout = Layout([2, 1, 2, 1, 2], fill_frame=True) else: layout = Layout([2, 1, 2], fill_frame=True) self.add_layout(layout) layout.add_widget(self._hours, 0) layout.add_widget(Label("\n:", height=3), 1) layout.add_widget(self._minutes, 2) if self._parent.include_seconds: layout.add_widget(Label("\n:", height=3), 3) layout.add_widget(self._seconds, 4) self.fix() # Set up the correct time. self._hours.value = parent.value.hour self._minutes.value = parent.value.minute self._seconds.value = parent.value.second def _on_close(self, cancelled): if not cancelled: self._parent.value = self._parent.value.replace(hour=self._hours.value, minute=self._minutes.value, second=self._seconds.value) class TimePicker(Widget): """ A TimePicker widget allows you to pick a time from a compact, temporary, pop-up Frame. """ __slots__ = ["_on_change", "_child", "include_seconds"] def __init__(self, label=None, name=None, seconds=False, on_change=None, **kwargs): """ :param label: An optional label for the widget. :param name: The name for the widget. :param seconds: Whether to include selection of seconds or not. :param on_change: Optional function to call when the selected time changes. Also see the common keyword arguments in :py:obj:`.Widget`. """ super().__init__(name, **kwargs) self._label = label self._on_change = on_change self._value = datetime.now().time() self._child = None self.include_seconds = seconds def update(self, frame_no): self._draw_label() # This widget only ever needs display the current selection - the separate Frame does all # the clever stuff when it has the focus. (colour, attr, background) = self._pick_colours("edit_text") self._frame.canvas.print_at( self._value.strftime("%H:%M:%S" if self.include_seconds else "%H:%M"), self._x + self._offset, self._y, colour, attr, background) def reset(self): pass def process_event(self, event): if event is not None: # Handle key or mouse selection events - e.g. click on widget or Enter. if isinstance(event, KeyboardEvent): if event.key_code in [Screen.ctrl("M"), Screen.ctrl("J"), ord(" ")]: event = None elif isinstance(event, MouseEvent): if event.buttons != 0: if self.is_mouse_over(event, include_label=False): event = None # Create the pop-up if needed if event is None: self._child = _TimePickerPopup(self) self.frame.scene.add_effect(self._child) return event def required_height(self, offset, width): return 1 @property def value(self): """ The current selected time. """ return self._value @value.setter def value(self, new_value): # Only trigger the notification after we've changed the value. old_value = self._value self._value = new_value if old_value != self._value and self._on_change: self._on_change() python-asciimatics-1.15.0/asciimatics/widgets/utilities.py000066400000000000000000000262641511423144500237440ustar00rootroot00000000000000"""This module defines commonly used pieces for widgets""" from logging import getLogger from math import sqrt from collections import defaultdict from functools import lru_cache from wcwidth import wcswidth, wcwidth from asciimatics.screen import Screen # Logging logger = getLogger(__name__) #: Standard palettes for use with :py:meth:`~Frame.set_theme`. #: Each entry in THEMES contains a colour palette for use by the widgets within a Frame. #: Each colour palette is a dictionary mapping a colour key to a 3-tuple of #: (foreground colour, attribute, background colour). #: The "default" theme defines all the required keys for a palette. THEMES = { "default": { "background": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLUE), "shadow": (Screen.COLOUR_BLACK, None, Screen.COLOUR_BLACK), "disabled": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLUE), "invalid": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_RED), "label": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLUE), "borders": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLUE), "scroll": (Screen.COLOUR_CYAN, Screen.A_NORMAL, Screen.COLOUR_BLUE), "title": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLUE), "edit_text": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLUE), "focus_edit_text": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_CYAN), "readonly": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLUE), "focus_readonly": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_CYAN), "button": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLUE), "focus_button": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_CYAN), "control": (Screen.COLOUR_YELLOW, Screen.A_NORMAL, Screen.COLOUR_BLUE), "selected_control": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLUE), "focus_control": (Screen.COLOUR_YELLOW, Screen.A_NORMAL, Screen.COLOUR_BLUE), "selected_focus_control": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_CYAN), "field": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLUE), "selected_field": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLUE), "focus_field": (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLUE), "selected_focus_field": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_CYAN), }, "monochrome": defaultdict( lambda: (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK), { "invalid": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_RED), "label": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), "title": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), "selected_focus_field": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_edit_text": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_button": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), "selected_focus_control": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), "disabled": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLACK), } ), "green": defaultdict( lambda: (Screen.COLOUR_GREEN, Screen.A_NORMAL, Screen.COLOUR_BLACK), { "invalid": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_RED), "label": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "title": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "selected_focus_field": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_edit_text": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_button": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "selected_focus_control": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "disabled": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLACK), } ), "bright": defaultdict( lambda: (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK), { "invalid": (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_RED), "label": (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLACK), "control": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_control": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLACK), "selected_focus_control": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLACK), "selected_focus_field": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_button": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLACK), "focus_edit_text": (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_BLACK), "disabled": (Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLACK), } ), "tlj256": defaultdict( lambda: (16, 0, 15), { "invalid": (0, 0, 196), "label": (88, 0, 15), "title": (88, 0, 15), "selected_focus_field": (15, 0, 88), "focus_edit_text": (15, 0, 88), "focus_button": (15, 0, 88), "selected_focus_control": (15, 0, 88), "disabled": (8, 0, 15), } ), "warning": defaultdict( lambda: (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_RED), { "label": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_RED), "title": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_RED), "focus_edit_text": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_RED), "focus_field": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_RED), "focus_button": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_YELLOW), "focus_control": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_RED), "disabled": (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_RED), "shadow": (Screen.COLOUR_BLACK, None, Screen.COLOUR_BLACK), } ), } def _enforce_width(text, width, unicode_aware=True): """ Enforce a displayed piece of text to be a certain number of cells wide. This takes into account double-width characters used in CJK languages. :param text: The text to be truncated :param width: The screen cell width to enforce :return: The resulting truncated text """ # Double-width strings cannot be more than twice the string length, so no need to try # expensive truncation if this upper bound isn't an issue. if (2 * len(text) < width) or (len(text) < width and not unicode_aware): return text # Can still optimize performance if we are not handling unicode characters. if unicode_aware: size = 0 for i, char in enumerate(str(text)): c_width = wcwidth(char) if ord(char) >= 256 else 1 if size + c_width > width: return text[0:i] size += c_width elif len(text) + 1 > width: return text[0:width] return text def _find_min_start(text, max_width, unicode_aware=True, at_end=False): """ Find the starting point in the string that will reduce it to be less than or equal to the specified width when displayed on screen. :param text: The text to analyze. :param max_width: The required maximum width :param at_end: At the end of the editable line, so allow spaced for cursor. :return: The offset within `text` to start at to reduce it to the required length. """ # Is the solution trivial? Worth optimizing for text heavy UIs... if 2 * len(text) < max_width: return 0 # OK - do it the hard way... result = 0 string_len = wcswidth if unicode_aware else len char_len = wcwidth if unicode_aware else lambda x: 1 display_end = string_len(text) while display_end > max_width: result += 1 display_end -= char_len(text[0]) text = text[1:] if at_end and display_end == max_width: result += 1 return result def _get_offset(text, visible_width, unicode_aware=True): """ Find the character offset within some text for a given visible offset (taking into account the fact that some character glyphs are double width). :param text: The text to analyze :param visible_width: The required location within that text (as seen on screen). :return: The offset within text (as a character offset within the string). """ result = 0 width = 0 if unicode_aware: for char in text: if visible_width - width <= 0: break result += 1 width += wcwidth(char) if visible_width - width < 0: result -= 1 else: result = min(len(text), visible_width) return result @lru_cache(256) def _split_text(text, width, height, unicode_aware=True): """ Split text to required dimensions. This will first try to split the text into multiple lines, then put a "..." on the last 3 characters of the last line if this still doesn't fit. :param text: The text to split. :param width: The maximum width for any line. :param height: The maximum height for the resulting text. :return: A list of strings of the broken up text. """ # At a high level, just try to split on whitespace for the best results. tokens = text.split(" ") result = [] current_line = "" string_len = wcswidth if unicode_aware else len for token in tokens: for i, line_token in enumerate(token.split("\n")): if string_len(current_line + line_token) > width or i > 0: # Don't bother inserting completely blank lines # which should only happen on the very first # line (as the rest will inject whitespace/newlines) if len(current_line) > 0: result.append(current_line.rstrip()) current_line = line_token + " " else: current_line += line_token + " " # At this point we've either split nicely or have a hugely long unbroken string # (e.g. because the language doesn't use whitespace. # Either way, break this last line up as best we can. current_line = current_line.rstrip() while string_len(current_line) > 0: new_line = _enforce_width(current_line, width, unicode_aware) result.append(new_line) current_line = current_line[len(new_line):] # Check for a height overrun and truncate. if len(result) > height: result = result[:height] result[height - 1] = result[height - 1][:width - 3] + "..." # Very small columns could be shorter than individual words - truncate # each line if necessary. for i, line in enumerate(result): if len(line) > width: result[i] = line[:width - 3] + "..." return result def _euclidian_distance(widget1, widget2): """ Find the Euclidian distance between 2 widgets. :param widget1: first widget :param widget2: second widget """ point1 = widget1.get_location() point2 = widget2.get_location() return sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2) python-asciimatics-1.15.0/asciimatics/widgets/verticaldivider.py000066400000000000000000000021731511423144500251020ustar00rootroot00000000000000"""This module implements a vertical division between widgets""" from asciimatics.widgets.widget import Widget class VerticalDivider(Widget): """ A vertical divider for separating columns. This widget should be put into a column of its own in the Layout. """ __slots__ = ["_required_height"] def __init__(self, height=Widget.FILL_COLUMN): """ :param height: The required height for this divider. """ super().__init__(None, tab_stop=False) self._required_height = height def process_event(self, event): return event def update(self, frame_no): (color, attr, background) = self._frame.palette["borders"] vert = "│" if self._frame.canvas.unicode_aware else "|" for i in range(self._h): self._frame.canvas.print_at(vert, self._x, self._y + i, color, attr, background) def reset(self): pass def required_height(self, offset, width): return self._required_height @property def value(self): """ The current value for this VerticalDivider. """ return self._value python-asciimatics-1.15.0/asciimatics/widgets/widget.py000066400000000000000000000261041511423144500232050ustar00rootroot00000000000000""" This module allows you to create interactive text user interfaces. For more details see http://asciimatics.readthedocs.io/en/latest/widgets.html """ from abc import ABCMeta, abstractmethod from logging import getLogger from wcwidth import wcswidth from asciimatics.screen import Screen from asciimatics.widgets.utilities import _split_text # Logging logger = getLogger(__name__) class Widget(metaclass=ABCMeta): """ A Widget is a re-usable component that can be used to create a simple GUI. """ #: Widgets with this constant for the required height will be re-sized to #: fit the available vertical space in the Layout. FILL_FRAME = -135792468 #: Widgets with this constant for the required height will be re-sized to #: fit the maximum space used by any other column in the Layout. FILL_COLUMN = -135792467 __slots__ = ["_name", "_label", "_frame", "_value", "_has_focus", "_x", "_y", "_h", "_w", "_offset", "_display_label", "_is_tab_stop", "_is_disabled", "_is_valid", "_custom_colour", "_on_focus", "_on_blur", "string_len", "_readonly"] def __init__(self, name, tab_stop=True, disabled=False, on_focus=None, on_blur=None): """ :param name: The name of this Widget. :param tab_stop: Whether this widget should take focus or not when tabbing around the Frame. :param disabled: Whether this Widget should be disabled or not. :param on_focus: Optional callback whenever this widget gets the focus. :param on_blur: Optional callback whenever this widget loses the focus. """ super().__init__() # Internal properties self._name = name self._label = None self._frame = None self._value = None self._has_focus = False self._x = self._y = 0 self._w = self._h = 0 self._offset = 0 self._display_label = None self._is_tab_stop = tab_stop self._is_disabled = disabled self._is_valid = True self._custom_colour = None self._on_focus = on_focus self._on_blur = on_blur self._readonly = False # Helper function to optimise string length calculations - default for now and pick # the optimal version when we know whether we need unicode support or not. self.string_len = wcswidth @property def frame(self): """ The Frame that contains this Widget. """ return self._frame @property def is_valid(self): """ Whether this widget has passed its data validation or not. """ return self._is_valid @property def is_tab_stop(self): """ Whether this widget is a valid tab stop for keyboard navigation. """ return self._is_tab_stop @property def is_visible(self): """ Whether this widget is visible on the Canvas or not. """ return not (self._y + self._h <= self._frame.canvas.start_line or self._y >= self._frame.canvas.start_line + self._frame.canvas.height) @property def disabled(self): """ Whether this widget is disabled or not. """ return self._is_disabled @disabled.setter def disabled(self, new_value): self._is_disabled = new_value @property def custom_colour(self): """ A custom colour to use instead of the normal calculated one when drawing this widget. This must be a key name from the palette dictionary. """ return self._custom_colour @custom_colour.setter def custom_colour(self, new_value): self._custom_colour = new_value @property def frame_update_count(self): """ The number of frames before this Widget should be updated. """ return 0 @property def width(self): """ The width of this Widget (excluding any labels). Only valid after the Frame has been fixed in place. """ return self._w - self._offset def register_frame(self, frame): """ Register the Frame that owns this Widget. :param frame: The owning Frame. """ self._frame = frame self.string_len = wcswidth if self._frame.canvas.unicode_aware else len def set_layout(self, x, y, offset, w, h): """ Set the size and position of the Widget. This should not be called directly. It is used by the :py:obj:`.Layout` class to arrange all widgets within the Frame. :param x: The x position of the widget. :param y: The y position of the widget. :param offset: The allowed label size for the widget. :param w: The width of the widget. :param h: The height of the widget. """ self._x = x self._y = y self._offset = offset self._w = w self._h = h def get_location(self): """ Return the absolute location of this widget on the Screen, taking into account the current state of the Frame that is displaying it and any label offsets of the Widget. :returns: A tuple of the form (, ). """ origin = self._frame.canvas.origin return (self._x + origin[0] + self._offset, self._y + origin[1] - self._frame.canvas.start_line) def focus(self): """ Call this to give this Widget the input focus. """ logger.debug("Widget focus: %s", self) self._has_focus = True self._frame.move_to(self._x, self._y, self._h) if self._on_focus is not None: self._on_focus() def is_mouse_over(self, event, include_label=True, width_modifier=0): """ Check if the specified mouse event is over this widget. :param event: The MouseEvent to check. :param include_label: Include space reserved for the label when checking. :param width_modifier: Adjustment to width (e.g. for scroll bars). :returns: True if the mouse is over the active parts of the widget. """ # Disabled widgets should not react to the mouse. logger.debug("Widget: %s (%d, %d) (%d, %d)", self, self._x, self._y, self._w, self._h) if self._is_disabled: return False # Check this part of the canvas is visible - can't be clicked if not visible. if (event.y < self._frame.canvas.start_line or event.y >= self._frame.canvas.start_line + self._frame.canvas.height): return False # Check for any overlap if self._y <= event.y < self._y + self._h: if ((include_label and self._x <= event.x < self._x + self._w - width_modifier) or (self._x + self._offset <= event.x < self._x + self._w - width_modifier)): return True return False def blur(self): """ Call this to take the input focus from this Widget. """ logger.debug("Widget blur: %s", self) self._has_focus = False if self._on_blur is not None: self._on_blur() def _draw_label(self): """ Draw the label for this widget if needed. """ if self._label is not None: # Break the label up as required. if self._display_label is None: # noinspection PyTypeChecker self._display_label = _split_text( self._label, self._offset, self._h, self._frame.canvas.unicode_aware) # Draw the display label. (colour, attr, background) = self._frame.palette["label"] for i, text in enumerate(self._display_label): self._frame.canvas.paint( text, self._x, self._y + i, colour, attr, background) def _draw_cursor(self, char, frame_no, x, y): """ Draw a flashing cursor for this widget. :param char: The character to use for the cursor (when not a block) :param frame_no: The current frame number. :param x: The x coordinate for the cursor. :param y: The y coordinate for the cursor. """ (colour, attr, background) = self._pick_colours("readonly" if self._readonly else "edit_text") if frame_no % 10 < 5 or self._frame.reduce_cpu: attr |= Screen.A_REVERSE self._frame.canvas.print_at(char, x, y, colour, attr, background) def _pick_palette_key(self, palette_name, selected=False, allow_input_state=True): """ Pick the rendering colour for a widget based on the current state. :param palette_name: The stem name for the widget - e.g. "button". :param selected: Whether this item is selected or not. :param allow_input_state: Whether to allow input state (e.g. focus) to affect result. :returns: A colour palette key to be used. """ key = palette_name if self._custom_colour: key = self._custom_colour elif self.disabled: key = "disabled" elif not self._is_valid: key = "invalid" elif allow_input_state: if self._has_focus: key = "focus_" + palette_name if selected: key = "selected_" + key return key def _pick_colours(self, palette_name, selected=False): """ Pick the rendering colour for a widget based on the current state. :param palette_name: The stem name for the widget - e.g. "button". :param selected: Whether this item is selected or not. :returns: A colour tuple (fg, attr, background) to be used. """ return self._frame.palette[self._pick_palette_key(palette_name, selected)] @abstractmethod def update(self, frame_no): """ The update method is called whenever this widget needs to redraw itself. :param frame_no: The frame number for this screen update. """ @abstractmethod def reset(self): """ The reset method is called whenever the widget needs to go back to its default (initially created) state. """ @abstractmethod def process_event(self, event): """ Process any input event. :param event: The event that was triggered. :returns: None if the Effect processed the event, else the original event. """ @property def label(self): """ The label for this widget. Can be `None`. """ return self._label @property def name(self): """ The name for this widget (for reference in the persistent data). Can be `None`. """ return self._name @property @abstractmethod def value(self): """ The value to return for this widget based on the user's input. """ @abstractmethod def required_height(self, offset, width): """ Calculate the minimum required height for this widget. :param offset: The allowed width for any labels. :param width: The total width of the widget, including labels. """ python-asciimatics-1.15.0/doc/000077500000000000000000000000001511423144500161535ustar00rootroot00000000000000python-asciimatics-1.15.0/doc/build.sh000077500000000000000000000012671511423144500176170ustar00rootroot00000000000000PYTHONPATH=.. sphinx-apidoc ../asciimatics -o ./source -f cat source/asciimatics.rst | awk -- '/:undoc-members:/ {next} { print $0 } /:members:/ { print " :inherited-members:"}' > source/tmp.rst mv -f source/tmp.rst source/asciimatics.rst cat source/asciimatics.widgets.rst | awk -- '/:undoc-members:/ {next} { print $0 } /:members:/ { print " :inherited-members:"}' > source/tmp.rst mv -f source/tmp.rst source/asciimatics.widgets.rst cat source/asciimatics.renderers.rst | awk -- '/:undoc-members:/ {next} { print $0 } /:members:/ { print " :inherited-members:"}' > source/tmp.rst mv -f source/tmp.rst source/asciimatics.renderers.rst PYTHONPATH=.. sphinx-build -b html ./source ./build python-asciimatics-1.15.0/doc/source/000077500000000000000000000000001511423144500174535ustar00rootroot00000000000000python-asciimatics-1.15.0/doc/source/_static/000077500000000000000000000000001511423144500211015ustar00rootroot00000000000000python-asciimatics-1.15.0/doc/source/_static/custom.css000066400000000000000000000005461511423144500231320ustar00rootroot00000000000000.toggle .header { display: block; clear: both; border-color: #c8c8c8 ; border-style: solid ; border-width: 1px ; font-size: x-small ; font-style: italic ; margin-left: auto ; margin-right: auto ; padding: 3px 2em ; } .toggle .header:after { content: " [+]"; } .toggle .header.open:after { content: " [-]"; } python-asciimatics-1.15.0/doc/source/_templates/000077500000000000000000000000001511423144500216105ustar00rootroot00000000000000python-asciimatics-1.15.0/doc/source/_templates/page.html000066400000000000000000000007401511423144500234130ustar00rootroot00000000000000{% extends "!page.html" %} {% set css_files = css_files + ["_static/custom.css"] %} {% block footer %} {% endblock %} python-asciimatics-1.15.0/doc/source/animation.rst000066400000000000000000000215631511423144500221730ustar00rootroot00000000000000.. _animation-ref: Animation ========= Scenes and Effects ------------------ The asciimatics package gets its name from a storyboard technique in films ('animatics') where simple animations and mock-ups are used to get a better feel for the planned film. Much like these storyboards, you need two key elements for your animation. 1. One or more :py:obj:`.Scene` objects that encompass the key stages of your animation. 2. One or more :py:obj:`.Effect` objects in each Scene that actually display something on the Screen. An Effect is basically an object that encodes something to be displayed on the Screen. It can be anything from :py:obj:`.Print` that just displays some rendered text at a specific location for a certain time to :py:obj:`.Snow` that adds dynamically generated falling snow to the Scene. These are the building blocks of your animation and will be rendered in the strict order that they appear in the Scene, so most of the time you want to put foreground Effects last to ensure they overwrite anything else. There is no hard and fast rule of how to divide up your Scenes, though there is normally a natural cut where you want to move between effects or clear the Screen, much like you'd need to move to a different cell in a comic strip. These cuts are where you should consider creating a new Scene. Once you have built up a set of Effects into a list of one or more Scenes, you can pass this list to :py:meth:`.play` which will run through the Scenes in order, or stop playing if the user exits by pressing 'q' (assuming you use the default key handling). Timing Effects -------------- When playing animations, asciimatics will try to redraw the Screen 20 times a second. Each iteration of the loop produces a new frame (no relation to the widget class `Frame`) and increments the frame counter. This counter is passed as the `frame_no` parameter on :py:meth:`~.Effect.update` to every `Effect` and so can be used to time the animation. For example, if you only want the Effect to do something every half a second, you could wait for `frame_no` to increase by 10 before doing the next update. This is also the counter that determines when to start/stop an `Effect` based on the `start_frame` and `stop_frame` properties on each `Effect`. Specifying non-zero values will delay the start of the `Effect` until, or stop drawing it at, the specified frame count in the `Scene`. See the credits sample for an example of how to use these properties. Sprites and Paths ----------------- A :py:obj:`.Sprite` is a special Effect designed to move some rendered text around the Screen, thus creating an animated character. As such, they work like any other Effect, needing to be placed in a Scene and passed to the Screen (through the ``play()`` method) to be displayed. They typically take: - a set of Renderers to animate the motion of the character when moving in any direction - a default Renderer (to be used when standing still) - a path to define where the Sprite moves. Much like Renderers, the paths come in 2 flavours: 1. A :py:obj:`.Path` is a pre-defined path that can be fully determined at the start of the program. This provides 4 methods - ``jump_to()``, ``wait()``, ``move_straight_to()`` and ``move_round_to()`` - to define the path. Just decide on the path and script it by chaining these methods together. 2. A :py:obj:`.DynamicPath` which depends on the program state and so can only be calculated when needed - e.g. because it depends on what key the user is pressing. These provide an abstract method - ``process_event()`` - that must be overridden to handle any keys and Update the current coordinates of the Path, to be returned the next time the Sprite asks for an update. The full declaration of a Sprite is therefore something like this. .. code-block:: python # Sample Sprite that plots an "X" for each step along an elliptical path. centre = (screen.width // 2, screen.height // 2) curve_path = [] for i in range(0, 11): curve_path.append( (centre[0] + (screen.width / 4 * math.sin(i * math.pi / 5)), centre[1] - (screen.height / 4 * math.cos(i * math.pi / 5)))) path = Path() path.jump_to(centre[0], centre[1] - screen.height // 4), path.move_round_to(curve_path, 60) sprite = Sprite( screen, renderer_dict={ "default": StaticRenderer(images=["X"]) }, path=path, colour=Screen.COLOUR_RED, clear=False) For more examples of using Sprites, including dynamic Paths, see the samples directory. Particle Systems ---------------- A :py:obj:`.ParticleEffect` is a special Effect designed to draw a `particle system `_. It consists of one or more :py:obj:`.ParticleEmitter` objects which in turn contains one or more :py:obj:`.Particle` objects. The ``ParticleEffect`` defines a chain of ``ParticleEmitter``\ s that spawn one or more ``Particle``\ s, each with a unique set of attributes - e.g. location, direction, colour, etc. The ``ParticleEffect`` renders a frame by rendering each of these ``Particle``\ s and then updating them following the rules defined by the ``ParticleEmitter``. It all sounds a bit convoluted, doesn't it? Let's try a concrete example to clarify it... Consider the :py:obj:`.StarFirework` effect. This is constructed as follows. 1. The ``StarFirework`` constructs a ``Rocket``. This is a ``ParticleEmitter`` that has just one ``Particle`` that shoots vertically up the Screen to hit a pre-defined end point. 2. When this ``Particle`` hits its end-point, it expires and spawns a ``StarExplosion``. This is a ``ParticleEmitter`` that spawns many ``Particle``\ s in such a way that they are explode outwards radially from where the ``Rocket`` expired. 3. In turn, each of these ``Particle``\ s from the ``StarExplosion`` spawns a ``StarTrail`` on each new frame. These are ``ParticleSystem``\ s that spawn a single ``Particle`` which just hovers for a few frames and fades away. Putting this all together (by playing the Effect) you have a classic exploding firework. For more examples, see the other Effects in the particles and fireworks samples. CPU Considerations ------------------ Many people run asciimatics on low-power systems and so care about CPU. However there is a trade-off between CPU usage and responsiveness of any User Interface or the slickness of any animation. Asciimatics tries to handle this for you by looking at when each ``Effect`` next wants to be redrawn and only refreshing the ``Screen`` when needed. For most use-cases, this default should be enough for your needs. However, there are a couple of cases where you might need more. The first is very low-power (e.g. SOC) systems where you need to keep CPU usage to a minimum for a widget-based UI. In this case, you can use the ``reduce_cpu`` parameter when constructing your :py:obj:`.Frame`. The other case, is actually the opposite problem - you may find that asciimatics is being too conservative and you need to refresh the ``Screen`` before it thinks you need to do so. In this case, you can simply force its hand by calling :py:meth:`.force_update`, which will force a full refresh of the ``Screen`` next time that :py:meth:`.draw_next_frame` is called. Using async frameworks ---------------------- If you cannot allow asciimatics to schedule each frame itself, e.g. because you are using an asynchronous framework like gevent, asyncio or twisted, that's fine. Asciimatics is designed to run in tiny time slices that are ideal for such a framework. All you need to do is call :py:meth:`.set_scenes` to set up your scenes and :py:meth:`.draw_next_frame` (every 1/20 of a second) to draw the next frame. For example, here is how you can run inside an asyncio event loop. .. code-block:: python import asyncio from asciimatics.effects import Cycle, Stars from asciimatics.renderers import FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen def update_screen(end_time, loop, screen): screen.draw_next_frame() if loop.time() < end_time: loop.call_later(0.05, update_screen, end_time, loop, screen) else: loop.stop() # Define the scene that you'd like to play. screen = Screen.open() effects = [ Cycle( screen, FigletText("ASCIIMATICS", font='big'), screen.height // 2 - 8), Cycle( screen, FigletText("ROCKS!", font='big'), screen.height // 2 + 3), Stars(screen, (screen.width + screen.height) // 2) ] screen.set_scenes([Scene(effects, 500)]) # Schedule the first call to display_date() loop = asyncio.new_event_loop() end_time = loop.time() + 5.0 loop.call_soon(update_screen, end_time, loop, screen) # Blocking call interrupted by loop.stop() loop.run_forever() loop.close() screen.close() python-asciimatics-1.15.0/doc/source/asciimatics.renderers.rst000066400000000000000000000050211511423144500244640ustar00rootroot00000000000000asciimatics.renderers package ============================= Submodules ---------- asciimatics.renderers.base module --------------------------------- .. automodule:: asciimatics.renderers.base :members: :inherited-members: :show-inheritance: asciimatics.renderers.box module -------------------------------- .. automodule:: asciimatics.renderers.box :members: :inherited-members: :show-inheritance: asciimatics.renderers.charts module ----------------------------------- .. automodule:: asciimatics.renderers.charts :members: :inherited-members: :show-inheritance: asciimatics.renderers.figlettext module --------------------------------------- .. automodule:: asciimatics.renderers.figlettext :members: :inherited-members: :show-inheritance: asciimatics.renderers.fire module --------------------------------- .. automodule:: asciimatics.renderers.fire :members: :inherited-members: :show-inheritance: asciimatics.renderers.images module ----------------------------------- .. automodule:: asciimatics.renderers.images :members: :inherited-members: :show-inheritance: asciimatics.renderers.kaleidoscope module ----------------------------------------- .. automodule:: asciimatics.renderers.kaleidoscope :members: :inherited-members: :show-inheritance: asciimatics.renderers.plasma module ----------------------------------- .. automodule:: asciimatics.renderers.plasma :members: :inherited-members: :show-inheritance: asciimatics.renderers.players module ------------------------------------ .. automodule:: asciimatics.renderers.players :members: :inherited-members: :show-inheritance: asciimatics.renderers.rainbow module ------------------------------------ .. automodule:: asciimatics.renderers.rainbow :members: :inherited-members: :show-inheritance: asciimatics.renderers.rotatedduplicate module --------------------------------------------- .. automodule:: asciimatics.renderers.rotatedduplicate :members: :inherited-members: :show-inheritance: asciimatics.renderers.scales module ----------------------------------- .. automodule:: asciimatics.renderers.scales :members: :inherited-members: :show-inheritance: asciimatics.renderers.speechbubble module ----------------------------------------- .. automodule:: asciimatics.renderers.speechbubble :members: :inherited-members: :show-inheritance: Module contents --------------- .. automodule:: asciimatics.renderers :members: :inherited-members: :show-inheritance: python-asciimatics-1.15.0/doc/source/asciimatics.rst000066400000000000000000000043031511423144500224760ustar00rootroot00000000000000asciimatics package =================== Subpackages ----------- .. toctree:: :maxdepth: 4 asciimatics.renderers asciimatics.widgets Submodules ---------- asciimatics.constants module ---------------------------- .. automodule:: asciimatics.constants :members: :inherited-members: :show-inheritance: asciimatics.effects module -------------------------- .. automodule:: asciimatics.effects :members: :inherited-members: :show-inheritance: asciimatics.event module ------------------------ .. automodule:: asciimatics.event :members: :inherited-members: :show-inheritance: asciimatics.exceptions module ----------------------------- .. automodule:: asciimatics.exceptions :members: :inherited-members: :show-inheritance: asciimatics.parsers module -------------------------- .. automodule:: asciimatics.parsers :members: :inherited-members: :show-inheritance: asciimatics.particles module ---------------------------- .. automodule:: asciimatics.particles :members: :inherited-members: :show-inheritance: asciimatics.paths module ------------------------ .. automodule:: asciimatics.paths :members: :inherited-members: :show-inheritance: asciimatics.scene module ------------------------ .. automodule:: asciimatics.scene :members: :inherited-members: :show-inheritance: asciimatics.screen module ------------------------- .. automodule:: asciimatics.screen :members: :inherited-members: :show-inheritance: asciimatics.sprites module -------------------------- .. automodule:: asciimatics.sprites :members: :inherited-members: :show-inheritance: asciimatics.strings module -------------------------- .. automodule:: asciimatics.strings :members: :inherited-members: :show-inheritance: asciimatics.utilities module ---------------------------- .. automodule:: asciimatics.utilities :members: :inherited-members: :show-inheritance: asciimatics.version module -------------------------- .. automodule:: asciimatics.version :members: :inherited-members: :show-inheritance: Module contents --------------- .. automodule:: asciimatics :members: :inherited-members: :show-inheritance: python-asciimatics-1.15.0/doc/source/asciimatics.widgets.rst000066400000000000000000000103731511423144500241470ustar00rootroot00000000000000asciimatics.widgets package =========================== Submodules ---------- asciimatics.widgets.baselistbox module -------------------------------------- .. automodule:: asciimatics.widgets.baselistbox :members: :inherited-members: :show-inheritance: asciimatics.widgets.button module --------------------------------- .. automodule:: asciimatics.widgets.button :members: :inherited-members: :show-inheritance: asciimatics.widgets.checkbox module ----------------------------------- .. automodule:: asciimatics.widgets.checkbox :members: :inherited-members: :show-inheritance: asciimatics.widgets.datepicker module ------------------------------------- .. automodule:: asciimatics.widgets.datepicker :members: :inherited-members: :show-inheritance: asciimatics.widgets.divider module ---------------------------------- .. automodule:: asciimatics.widgets.divider :members: :inherited-members: :show-inheritance: asciimatics.widgets.dropdownlist module --------------------------------------- .. automodule:: asciimatics.widgets.dropdownlist :members: :inherited-members: :show-inheritance: asciimatics.widgets.filebrowser module -------------------------------------- .. automodule:: asciimatics.widgets.filebrowser :members: :inherited-members: :show-inheritance: asciimatics.widgets.frame module -------------------------------- .. automodule:: asciimatics.widgets.frame :members: :inherited-members: :show-inheritance: asciimatics.widgets.label module -------------------------------- .. automodule:: asciimatics.widgets.label :members: :inherited-members: :show-inheritance: asciimatics.widgets.layout module --------------------------------- .. automodule:: asciimatics.widgets.layout :members: :inherited-members: :show-inheritance: asciimatics.widgets.listbox module ---------------------------------- .. automodule:: asciimatics.widgets.listbox :members: :inherited-members: :show-inheritance: asciimatics.widgets.multicolumnlistbox module --------------------------------------------- .. automodule:: asciimatics.widgets.multicolumnlistbox :members: :inherited-members: :show-inheritance: asciimatics.widgets.popupdialog module -------------------------------------- .. automodule:: asciimatics.widgets.popupdialog :members: :inherited-members: :show-inheritance: asciimatics.widgets.popupmenu module ------------------------------------ .. automodule:: asciimatics.widgets.popupmenu :members: :inherited-members: :show-inheritance: asciimatics.widgets.radiobuttons module --------------------------------------- .. automodule:: asciimatics.widgets.radiobuttons :members: :inherited-members: :show-inheritance: asciimatics.widgets.scrollbar module ------------------------------------ .. automodule:: asciimatics.widgets.scrollbar :members: :inherited-members: :show-inheritance: asciimatics.widgets.temppopup module ------------------------------------ .. automodule:: asciimatics.widgets.temppopup :members: :inherited-members: :show-inheritance: asciimatics.widgets.text module ------------------------------- .. automodule:: asciimatics.widgets.text :members: :inherited-members: :show-inheritance: asciimatics.widgets.textbox module ---------------------------------- .. automodule:: asciimatics.widgets.textbox :members: :inherited-members: :show-inheritance: asciimatics.widgets.timepicker module ------------------------------------- .. automodule:: asciimatics.widgets.timepicker :members: :inherited-members: :show-inheritance: asciimatics.widgets.utilities module ------------------------------------ .. automodule:: asciimatics.widgets.utilities :members: :inherited-members: :show-inheritance: asciimatics.widgets.verticaldivider module ------------------------------------------ .. automodule:: asciimatics.widgets.verticaldivider :members: :inherited-members: :show-inheritance: asciimatics.widgets.widget module --------------------------------- .. automodule:: asciimatics.widgets.widget :members: :inherited-members: :show-inheritance: Module contents --------------- .. automodule:: asciimatics.widgets :members: :inherited-members: :show-inheritance: python-asciimatics-1.15.0/doc/source/conf.py000066400000000000000000000211631511423144500207550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # asciimatics documentation build configuration file, created by # sphinx-quickstart on Fri Apr 3 17:57:45 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # import sys # import os from setuptools_scm import get_version # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.ifconfig', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'asciimatics' # noinspection PyShadowingBuiltins copyright = u'2015-23, Peter Brittain' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # Use setuptools_scm to get detailed patch versions. base_version = get_version(root='../..', relative_to=__file__) # The full version, including alpha/beta/rc tags. release = '.'.join(base_version.split('.')[:3]) # The short X.Y version. version = '.'.join(release.split('.')[:2]) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'classic' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'asciimaticsdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # 'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt', # Additional stuff for the LaTeX preamble. # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'asciimatics.tex', u'asciimatics Documentation', u'Peter Brittain', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'asciimatics', u'asciimatics Documentation', [u'Peter Brittain'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'asciimatics', u'asciimatics Documentation', u'Peter Brittain', 'asciimatics', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} # Include constructor comments for classes. autoclass_content = "both" python-asciimatics-1.15.0/doc/source/contacts.png000066400000000000000000000742241511423144500220100ustar00rootroot00000000000000PNG  IHDR1sBIT|dtEXtSoftwaregnome-screenshot> IDATxwxSd[`!a`If5dik3ڌ!i҆4BU2콧3 =~ %c&|^ޣsHH_{Svmڻw+++oDDDDDl.]7tP3`ҥ999_w}p^kPEDDDM9r5k0ydtRLju[l4ҶN9sfÇ}֯_^: ݎfk@DDDD2 X,g4nmӝzyyѥK"##l޼yѷ~;stݑ`0uV:vL&22rPVVݞ7K""""&`0Lx[EFF@o???IQZ@Ofi)J P.""""mh(m.# W".""""pwP.""""5( o}Z""Nm۾;v0a8:ŵu8< [ϜW l}k4oh{cʰϷo%IIdw<(bl6'wϳb٨~khhZmwj_`03Q̙SC=8,ĕv- -bƌFz xEөEq:>1bc~|'K;NTd$W^1Rm-39뮾H 2,c7?c˺5TVVӲ,f^}Uh*jVpA<==鞘ȃKĮII9ȱ1 tKL{oލɼ<0a&ӓ w~?+,,"=# ao>/YJ`@ ӱ=9|7x]v!3#hv{OlL#-۶3?;|i (SRR ۧaa&X|Mmuoشx:ưmmApp0=ztgdCM>_Y7M=ƙך`2hM,]'O 1;VGs-7Gsyd_D\U=~.,Gi|k,Gp=s9wddcps@xx8Wf3,ˋ_xFɴ3jBGT[~K; ہ}FZqL&/Ͽ7o >>l9%%%uJS~)Fwz@l6pϝwݷ+Wq"7N.fe~ݻ]zLڕKLqWcXn o7Ǎc$v0L?α73cΝ 0L2 I;r5bnljk*^x6g^k@Lt4//LY=~o_\' v e҄ umvBa՚5L<ɾ\ZPXL>}5j{!??ߩz@3"猊',4///, AAT3o333eegGrvݱrg:3:HXh(uC~%K̤iZkUYYYCBuvyu磏ӻ7{otۭ# 7^nx+?"LJCS}o,L=џ )//˪;sccVbodz8ZseJKKl[շؼYґ<54=YVMH{S55l꾟Fǵ]boflj91f$g:ꬬtװ`d2Ոf9֣;܋]v9vHhh(999nk-=rHU~+  G).._;~}+6r}ැsW}FN{ϱ'Gs֡4ݻwt`4 ɓnk-=tքHv;{ۯϿŋI;Ne}9Ƭ,h>>4\EDDD}2tԉ`GAAA[(""""RGYY>>>3Cٙ?>_GDDDD+fgI3"""""n󱈈甄p7S.""""fJEDDDDLI) q3%"""""nv^'k׭9g=vJN'LÏ0e;Ѻ]cӟ9S'??ţvU7o%a6c;mO~~x_V[rU]%_$3+}i J7^yN11Yؘjjǟ͟yxb4a<yoؾ'9]8v1 ;c.fMNB|=v$]uv|||i$ F#wz NZ5q+xDlJN "##y8֚0m,&OkX=>ˍ|</*W6m-59 0̬,^|y/y'{ig&56,╿@Td$W]1yŕj嫯9g8!e \u5Wרh6u>Ub fN|39.ޝ>9'NLs\3.Eͺ:yѽ>>>$sCyN!""ȚͥǺNb6ߪ7ˋqeʕL8+Vpm[֙1L:k`l<<< s*6ooovkjz]w8uk*qmJ:-NTVVr2/ׄH{jQU/Wh[uF!! GnN?zYGK4a޳|FVo9glQ=v:ucI @nDFDhg2 ݛƩS^c 1|卶1$ciwkN~]IΎUSIMEhǎ-۵zٓ8篏cG♿>ϖm!QoآSPP+..d21q8^|eAvNNmWZR[>%00_{cFc2-̘y{{3zHkU6?&:})S&Mj|i|,_M' xsW9sѩ#2<9lߟ#_ʆM8x^ۚ^jj|kt'gƪCkY3=(XDD\*3W̜oɐSٳ9M8F &9mzt?xgRzy'(0?;ۆhd/Tsf̦LÏ~ǶƌOOHպvª5k%!>|g9͕fɅG;w;v` #hߚkg55tƪ}"#"2y9͛g:uj[!"RDŽ8UDD~h("""""0%"""""n$\DDDDZ2z""gZ+""^h&\DDDD͔p7K@l޽źF4VNDDDDDΰ}f?VQDDDDDL(i!yyy=FYy9>>tDHHHr i'ؓV+%%IG^^^JEDDDDZn?z,6%"""""-u) ivJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDDLI) q3%"""""n$\DDDD͔p7S.""""fJEDDDD̳c@[ ""r^Z[ ̈́p9+_u""-Gvۓ'%2_a)`O),tCksIbdQ%-,oV;1mH$\DNBT,"CqrVK«Dw$-?H ݯiLuݚ%KQ#] KmH.ONA,XvU2 IDAT9SuhngZ,I!4ȇ+/Jh되>O%h&\DڅqX+rSu] !+?d3ճ xp8׾ej?j O ¶\Z3=:pnMǫOjWKmj {wl._ʢbU*6MnAXo*VvժT68r}"" %".t =2#zUi[}k#dQ%(kٸ\?GW9$JGI)f?_yıuyObd`bGqHIo:fcEgh0PRnϕa޼y믿Fu,LhD\ɍ1oa|ί{̩C;q݄3NQtЙ@FzOc2Vzw\16N=₹qr"}1yU‚eY=鶜QFnaᒔ:W/kwkt 6|0֜?۾7uF35:^ٗ \›O&%i3VgLw٤dedpn[Ҝ QK$5_o y{ѱ#""-KQw($Skb~v)YaX @d'ӣ Jz#0W8a0]lH2;ΟۦƲb#rM6PViHVe1PwMX\@IR .um-};/>؇܍P׃m[-oX f2+_ɦ_@`iRa_lYoED! Qg} 0ia+`:OEg.+mCxO3fS1!u2zFb#;$i2"}kr.j=Tm3ƞ":f\$Wd-VK`u 8 SKgsԬ K-yD""$%R=￷~ q/Cazr_`p-Zŋbj7uٚRO~Iˬ_X3xD.nb))SPb?r]V9|~I %Rñ=5zS!QUgMI0œਜf՟Fǘ,: 7Ryn8Uʛ_9uPFCտgSOkZmPXߝ)+Ώ=@a%$""* 2#(>\g{Av1=WF kUa x "!-l~Ҧ6/Dh_LF=cW')SP0J=-h "؋&D`-;iΔ9S Bۃ݃~\T݂""rNLqtOPcۆ0䒟6}1Ji{7Xiw}n x iХ 9Zzl$ Q ^wO)`y&7Kc1 5ROK^n/6`_qg iݙ26G1y9Uƿ~8ҬxDDm͛g8lD["-4u]Wi*iC7gҭ^cFt޶mp7S.""""f:0<"""gO4.""""fJEDDDDLQ#Mp5_ %M-usߘ>LԑoJqK.{qd;Ή-" Jfl%&;JM{uXrR.a2=Qࣤ dbp:AWlU7~%JmRW7eZX S._ )~ )-j㨤MS$ @ .6LDĽrDdz_\p{InN6NEJNX*Mx* Ihc%IMj^up ^y 1Xhd%azހ_p1ڟ`0gzb7œi1DxԎIfj0^w 5/%?0& !$Ћ"3?n=-sge$dIF5ڗ2Y;QnPb FCaErHڞKw9QhOX ~\96H_*vQR&:}y}0! XmGGDm%63jl (DDEE$:%@L C ANӱ$I^laC%թÙ2g %郫(M13|bR6dOc1r '` ozUgy3^B1r#v4ne|JNQ}?M#Dq>>-3:ʭܝ]))CjԕVUs=VR‚N*MΗkٸJGʘ,x)]{zc: kN?XTmdE}nMX\@IR .hV="rhm`qL Vr(ȬJr0zZY]f+OPRgʜT:W?c;59=O\ Ws49/v2մ ~v,z%[Ob4@?IhU}ɉ 1q(fձI^綗H_ZV1)rq4Jջa`T 5ڗN/IͪfBOʦڪmzZ65q6 JiJ…YU?]pRVBMkdv"\ӫj/ދ«2뿼#q8]+yoSmiK<( ]q:.:Ζ"*rıt˻4^Qfҭ ;o9+.$SRiQ8:a 6̇ۧ8r\nMb^F}a|?nm6/Dh_LF=cW'8?^Y\0ʱּ%rg="u$+LI l)QfBs4)ͣW8GcIDћ36"0,}(GwS3ek>^61 b!2;Ɛ8tC. O9%~ًIc\*#{T.ґ'킇(0.6>E:xqxKT=GKW$!Rnc8+1O/mzD+5f"-Jo; #1Lj>S0o<_a#:iaԸeEDDy*!Hؾq={u_v]enj鸽m6-Gq7%"""""n$\DDDDt`yDkEDDD̈́p7rHC(Z$II^Rw"yK늒}~˻[t #I}:sPzth4y%[sY'QGvo|^gfɶ\wʛmO'ܔHgPDΎ JٯÐspqWI+?a5ޕ\ ۜIZ3f`,oઔ^R^J ` фzp}W$iIȢBDO"/dx~9!5{ vAKH(RCE/V &J&X×~S./0`Iϭ?g2-8̺X?3qPm/ N K_eADD̈́KU?ԽiI9w9lv'#Ϙ RĞ9c Sٿ~v~8V}Hjo}$l2R;Žc8㱃sd<=̤&`LqoHLa0,u.9[ Vdf06qL[mWbxTm-f¥:?7oeӷfbfG;8𙋉JLmV=YYҝՋWcĖf\3i4^t5_ɧޣ7(P)]I÷5_A$}p_Ѭ[œz}x;=V+Z&ezy ą{s%[ϵH9^ŽSDDZf¥o2]]߳r8 / u5*!M^=R_ s}̃NșSeF`4q``[G;ٷX[8UoPdh5?`/ iV|7 v-լ|GOgLJIlM)j2ep@FSFSYO8vsSZ=Fi}J'_j$/]Fw:e*|Z^:S7W%'( CxݤzϘN6W3T6zXkw3T] q27>m..R 7Nv$-U5 N 1y*:o}y7bCaB4Wd^RF疋c|UVODDGI8Ş^fx^,^mMq_v[\-v(&9{vyT7Xb]ߦ̯[- ?x"iR 7MQ~:M9HIœP10:V ǵӨg1&'MnP6oɑ3:SF`hyA}-ݯ:0SEfiqCn\$/}ʑ2c䜔j(Fm[NػjkZ3t˻4^e OTSx3f~e:u_-e/Ɉj-ScXDi) 1̨?}w /O>-5p`f{GDD̈́KIOƯ/̘AlX8AMIۍ5]NQvׇrG-i73$M_u2qV34shK?R6tsgZ]yAp*6`,.j2:g_}a'չcG2EeVZ%CCcj'F)dծ|~A-97͛g8N&4l8Wn}}z=}qk5Xv̨۶mrwS.""""fJEDDDDLfG\DD^. q3%fygDDDD'Zri%mq);gDVWiK\SWA}(qpqh/ eu%s+D0W<< l_I-MDD1%fK/\7# V;.epXቈH;$\R=+}$l2R;Žc8?=v#y˽>S^Wj7hc%IMj^up Wt;o`F Sٿ~vo9}ƭ'!|X<9CAdwL혚;A~:{a9Q-<\(70& !$Ћ"3?n=-/>wv_6+OBKk/]},ջ%2kT81>ZX!y5ynaAB/f;G()RKz.FB/e6v*bLJ*-Ax0狣U32Ύ$30o0Ӈd" '>)So Ojo8TΌ!ALNl7nD IDAT%a定cRϗKv&fҭ wK^ˤ[{&Gk`g9pr>|+Cv~ǐiIup̙BsI**|5rXfŤlΟcN^ 0($pg<,ƥcVGLrNl?X̳)*AX]HlF f|`6ąpX J̬Wk|+e*4)ƑOi$] Kc7;tuÄ(%e]׌ Ѽ蘣Ń;lR2J22}D87OEi-Ϩ^,ݞn'1ڗ{wB;65>r08i'*mSck6)s_Oa>\ٙ1t3%r(_NJz)!L^# oKDo:;8TLs7. + Փ]rT<H^=R_Vgʜiw)RŮ{Jā :xLhLB0T{q +rLK eۡ" J-PTjeBYŃ:QR&3ʨ0HI/22$F]i%<>{ Y ,Y@ kE(.V{Zػ9޿g{m==XnZk*EZ7\PHX#!!d#;dOf2d̞drMH^ǃGks]뺒|;߫EWڢŠVE:߲*Z;W:m:_զޯ5Y=/oUŦfJ +mڭ._RB^OJ -o$}sqQN4h纕Q9[n/g&Ԭ.[z~O5;s i*tY*.vٷq0g,/oGAaZ#E.׌V蘀jGL=3=RgJǙ6}5(,Q?UV³ʼz|~jJT@rt^ǵTT٪՘;uB +[mbtmI*hS\_e}_~멖 MWjUHvnZ̔` ul{$QOpIڶQ&Iw]=fCgOBLN5 ܙ9δqFr 嗎w/!n}N.ױ=ӹ#G_ѯe2yfO30񵇵_֎{rv^IJH+TDBb(vnʕf۸kk?ϬY鯅IAX{NʭےmI6 =wF>ڜ.=jj̝X5K7cB1yd;oXLZ7ZC3!ng"Zhf\͸g𕏿E>VuY]Uu憙[Y?6hRĬ*Eת,~66 ,Q%2yu+)#_o ]jך;Ukt܎C_6UoU^U*˱HO >>_2HcŪ?u]+X:s|ڇ6Y:f4%5JM т{%/c6jxYEleWb$II {L=3XmX{xLmiXM{ _)_sQ v-K}_j\j.ޞuf*2W^&ifdTigCB9Z^yqҼ}8}n5}}KZ>/TKs\ZOIMɊTbAnc\E.mRբ'1t>T\YꕮqWCg-Pze.^ םgk`z'C}ӕCk-o駲 Fe}Wjh{쳚L@=gg*$^ɋ(vnJN3k7(}mR]y.w9:[q\˯{W~3::ڸUeں!N~>^jh(\|f3];GtSK:]"ɤ/՜y mᡧ^\ǿ@~^:_զz\?r{A߼z;^Š6{ ld;E w6'(*O-z`ڜRw1t3r e2鋟QBϔ?绻ʹ}[jUn~l=5 UM Y0 uΣOzxұ9swm׭Ynn.=0x\,{:R !ơ&qNoa<0y|10=cY]Ƃp`p` GFw+ubϺ~sE\*ou^1 Xg\zkŋ /{dR6Ua7pH8Az zL+ 5hgK5+0@xGg=]ΔgwW(poPx| \$BO8+bNi-\wH3f^~<8Y :wtsf$k%?fY>-LU=6uz<6lM{3ҔV=_X s?]F_xCrrݵ?ǥmIÙukrfxkGq#,уG}wK5rE~(]g).pڻtNOꃪ!A;04B8JR𬎽A͚_-od>#WjHGѡ-pSfT*+ӏ3eui7tCRXmu{\^humb*hjIIUvLsK,gk宿߯1ڇZZ(p(=FE&V /}ǒOPGk>ݿB޵up,~:{h$i6zLlW~;~.uIQŢ $IwKqO$=fU;KJ%IcZht.^..$v~]4~zɊ$ $Ţ=U}10}8C0}Kr7_)Ij $Ev7T៍K(gy^->Ք$,o.RFc}"I:qu'R}qvՇ1o\S$gRgJ TEۤ][:n,K 7NIRG}4HWbP~2RcCw5gϞJݘ3%SSʵX>ë!JŮd"IeMkU}>I iHT-QTRr^vB>w^]]*}O&7gs>־mNH]cc{rY.pc8 )=Ak"%I ~{=KQCu$),v66 ,_ޭ;$%j{OP [~=sM ۶}8v͒qOzCuoF;gIKJRzvoO ;[x9[;5۟oڷ:Dﭳk4Zϒ'SŢ!öuH\9_lzH[~]wIܜ?TLB8q 9ӏc|,vex}=mkE4zv_)IܴW P̜25GxQ hIݲt?5Ds066I$%([ O_oJJЙ6(mi${Y@jT.~W] ZcctyltOaOp#tP>xH136:JK['830lrgUM"yLڒ߭ .sc'$I0]A 5u^$駙P__׎i;-mQxx6n ɤN{~|p޿*mX-jq<%` paazfj46kѫYϮ[ &A0Lo.'_//@V)(Z0ӥ9%.]%0; :*Ronl\ٯ]o ic\fde^"/[룼8a5~~tmj:=_0L t^fӾ%]Rq<%` paazfj46kѫYϮ[PO6` p\0O^^CAV=SP(?//ݵ`K^֋܋QLQ|sg~z{XxNb5+0P&arklݛ@"=_nIҁkQJHh޺Pkܺ5:Ԭxl9mIJTzHr띮w`w˖a5p],JצY .CO8 dlvvڗ=WjHGJ۹K<ҶӶYzJ[;KN|Gw**$ISQzzYl]Z QeFk[rjk{{7nۈk\-_C{i 0q& /Sf$Yz~x{OrUҢfUp1ߓ&IږwFM/$1/ {ʞQpgk3jZT&txi׹!!2dXJZc8  EAWl ,6|{By[Wא57^hI҉;^S:d.>5 ]gs)~W] ZcctyltOaO!1FNmdfIDAT(5,DJ 230~TT蚄x}'>C˞q⮮ǝl^t>"=WX$oI[ڜ?m ̲ǘpg ety 7Sͦ?-t~/Iib)Wkc 1mWN-mQ]7EdRc?lm'3%7|sݾekIOl[G~*t3t1ǝ~.֋;ͻ =>z┾1[0?_]+ťzi۷woݺUKWt-p3e{[4tLSƆ)\p`p`p`p`p`p`p`p`p`p`p`p`p`p`>.) %p[r$%` '0!SyۭVO0\24İM\@]I]ԗ>HF q/׮T6u7O|},xb%H Sfd-U]ڔr>Se}_/pw)y2jV`646zx)x%!OL{pJ ʭыzMz0$ipI:RwQ'ͺ1)A??OLkp2l\19I!>k0#ʭ,20ҵ)~gKkt~>r7]vkV~c}Gn,oo]n#˖Ij+%itǼYm6uR[SfZ֔ٺ7#M *okEz*@]CX$v.nMN?/L`5Z,F=I9h5v Y֔ٺ7=MIA*miկ,"\/ʨtY4_{Ou{,)źmNTˏ>pZ-I:\[;XmZ ݐ'Vfi[r]ǐ5ٺ<6F_pVU+[+"NS <6Vjr,Ѭ@}PzFt()Oϗ/ٺ'=U#zfg֎Rmy=l~WY)IZX6X!!zಅ w^9uFcv,I:<>fU;KJ%I.=>+2^OHL&-{9f$- ѿ,LWm2 $D&IN9ɒ_嫮C;3͝J;ڎN=6IQŢ $IwKqWv.N5e==c\f#>;9,.^(_//=x4Wja)lpi[.:lîox^k{܏p $5YZO}g$9BTTƤD=X.YZ^VEŲچ}!Z!ͦpJN648]Orp$YT<F}cB$I'n'nEbP~2RpGw wl1L {zgvYD$ڋږǹcYO-IR//W`TfE ŎF<2ReGE鞜Ndo pS'#U=_;/8F#T<kjwMJNΫK_Y}&1hzz÷2y0]1 hMiZ߯;Yۜ: aʸ85tvwge芸Xul*ljrz]%= יWQOR3dM _2%3%ISŢ!ڸ\5rW)ӎO|;PVd¨_<~~ڸz{}m~a9'~. ά/`Tj$I+FصqOLPL&5v{z3`҈z> Ehf.ͤyX{3R{3˹"I}iӽ驃:/_J RDk-mi$rNWsxEŋqǹk1m}?=UO,Nf#˖hed 4DYl ߖz{!~\=Σ]uUoÞipbݗ[|gpPap8o̟ǖg*W;:Jq9qҥm68|#DtD?ZH̟wg ,X$'`_*,RJpև^7+$\w=zMuwh]~?h}?CK ;AWrCGez";K^-)t\~r 띊JOt_zmV-G3HRNmnzw_?_V:$=.) %HKIG=244u,/QL?U7t}U:ZycVgQzj2dgn\0SrjtSK=u:j B8.Ic+|eRtu5[TZ>cՖUz`2~qN4_8vK6\6S߾6qR{` :B8.IWe뵜-o$嗷C5ڸ,B| cΫjt0K"T^סNt!73Gôva3V^?ToV],jPԄ@ݹ1^J.6Y\;kz3L0Fsba֧%{: ՖJŪÓuh͊Vv{qWB8%A4jL }KWyڴ,B;UU3|eU~U2G\U]޺m}re~T=\q[TpU!>ڼ"__<'Xޜ?SEM %S. aZ0L+ѢOz ո}M[>~.IN7Q:V,[w5IN13}*mny&YCS(չ6K):+Bo|\7mV7X+Frj:=Lwl׺E3 t6Kfxs ﭛ(3%X3} 7Z=C#3'6_$\h?mwfwƄULgp׺E3Mtêh:cVΧf7Yq!laaOY\;פc;Oô*=L!l `sXymf[ޥ'^-QSkfzfkesSlNecYo৏yNMN7藯(Lf;wr/j˚h͟(o$h9:{٥V Ae$k3•sA?}F|X̼P5C7QhfykӲճmJj:tMV BuC˵~F_2^ _/ņ΍y@>Qs@o-9WRӮf4*@O8&ΥY^JPOg޺~ur5vY $9=k,c֮n+uӚhWjf;_o|L_"NktMf~-lɤ/~.F =z_%-LX͉ ?Zߟ߭з7'ϒ3y^$ۻnݪ+Wy߲2PGT9cs總aۮ[\F##㋙c?^O####O#);c)܁y§>.뻌Nhg,S!~riCІ6mw"Oq}@z`xR5>ipEԙo޽uV-]ӵ6!(!|::v8Gyyy5務2z w'0!0!0!0_̜˜. `r'0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!prB8AC/ ArR kaz`-HW̙x>`J Wxx  ?v8Ǔuӆ$ 6߬5lIENDB`python-asciimatics-1.15.0/doc/source/contributing.rst000066400000000000000000000053631511423144500227230ustar00rootroot00000000000000Contributing ============ Getting started --------------- So you want to join in? Great! There's a few ground rules... #. Before you do anything else, read up on the design. * You should find all general background in these 4 classes: :py:obj:`.Screen`, :py:obj:`.Scene`, :py:obj:`.Effect` and :py:obj:`.Renderer`. * You will find more details on TUIs in these 3 classes: :py:obj:`.Frame`, :py:obj:`.Layout` and :py:obj:`.Widget`. #. If writing a new Effect, consider why it can't be handled by a combination of a new Renderer and the :py:obj:`.Print` Effect. For example, dynamic Effects such as :py:obj:`.Snow` depend on the current Screen state to render each new image. #. Go the extra yard. This project started on a whim to share the joy of someone starting out programming back in the 1980s. How do you sustain that joy? Not just by writing code that works, but by writing code that other programmers will admire. #. Make sure that your code is `PEP-8 `_ compliant. Tools such as flake8 and pylint or editors like pycharm really help here. #. Please run the existing unit tests against your new code to make sure that it still works as expected. I normally use nosetests to do this. In addition, if you are adding significant extra function, please write some new tests for your code. If you're not quite sure about something, feel free to join us at https://gitter.im/asciimatics/Lobby and share your ideas. When you've got something you're happy with, please feel free to submit a pull request at https://github.com/peterbrittain/asciimatics/issues. Building The Documentation -------------------------- Install the dependencies and build the documentation with: .. code-block:: bash $ pip install -r requirements/dev.txt $ cd doc $ ./build.sh You can then view your new shiny documentation in the ``build`` folder. Running The Tests ------------------ Install the dependencies and run the tests with the following: .. code-block:: bash $ pip install -r requirements/dev.txt $ python -m unittest On most systems this will avoid running tests that require a Linux TTY. If you are making changes to the Screen, you must also run the TTY tests. You can force that on a Linux box using the following: .. code-block:: bash $ FORCE_TTY=Y python -m unittest The reason for this split is that you only typically get a TTY on a live interactive connection to your terminal. This means you should always be able to run the full suite manually. However, many CI systems do not provide a valid TTY and so these tests regularly fail on various build servers. Fortunately, Travis provides a working TTY and so we enable the full suite of tests on any check-in to master. python-asciimatics-1.15.0/doc/source/index.rst000066400000000000000000000010251511423144500213120ustar00rootroot00000000000000.. asciimatics documentation master file, created by sphinx-quickstart on Fri Apr 3 17:57:45 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to asciimatics' documentation! ====================================== Contents: .. toctree:: :maxdepth: 2 intro contributing io rendering animation widgets troubleshooting modules Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` python-asciimatics-1.15.0/doc/source/intro.rst000066400000000000000000000056311511423144500213450ustar00rootroot00000000000000Introduction ============ Asciimatics is a package to help people create simple ASCII animations on any platform. It is licensed under the Apache Software Foundation License 2.0. Why? ---- Why not? It brings a little joy to anyone who was programming in the 80s... Oh and it provides a single cross-platform Python class to do all the low-level console function you could ask for, including: * Coloured/styled text - including 256 colour terminals * Cursor positioning * Keyboard input (without blocking or echoing) * Mouse input (terminal permitting) * Detecting and handling when the console resizes * Screen scraping In addition, it provides some simple, high-level APIs to provide more complex features including: * Anti-aliased ASCII line-drawing * Image to ASCII conversion - including JPEG and GIF formats * Many animation effects - e.g. sprites, particle systems, banners, etc. * Various widgets for text UIs - e.g. buttons, text boxes, radio buttons, etc. Currently this API has been proven to work on CentOS 6 & 7, Raspbian (i.e. Debian wheezy), Ubuntu 14.04, Windows 7, 8 & 10 and OSX 10.11, though it should also work for any other platform that provides a working curses implementation. Installation ------------ Asciimatics supports Python versions 2 & 3. For a list of the precise list of tested versions, see `here `__. To install asciimatics, simply install with `pip`. You can get it from `here `_ and then just run: .. code-block:: bash $ pip install asciimatics This should install all your dependencies for you. If you don't use pip or it fails to install them, you can install the dependencies directly using the packages listed in `requirements.txt `_. Additionally, Windows users will need to install `pywin32`. Quick start guide ----------------- Once you have installed asciimatics as per the instructions above, simply create a :py:obj:`.Screen`, put together a :py:obj:`.Scene` using some :py:obj:`.Effect` objects and then get the Screen to play it. An Effect will typically need to display some pre-formatted text. This is usually provided by a :py:obj:`.Renderer`. For example: .. code-block:: python from asciimatics.screen import Screen from asciimatics.scene import Scene from asciimatics.effects import Cycle, Stars from asciimatics.renderers import FigletText def demo(screen): effects = [ Cycle( screen, FigletText("ASCIIMATICS", font='big'), screen.height // 2 - 8), Cycle( screen, FigletText("ROCKS!", font='big'), screen.height // 2 + 3), Stars(screen, (screen.width + screen.height) // 2) ] screen.play([Scene(effects, 500)]) Screen.wrapper(demo) python-asciimatics-1.15.0/doc/source/io.rst000066400000000000000000000334711511423144500206240ustar00rootroot00000000000000Basic Input/Output ================== Creating a Screen ----------------- The starting point for any asciimatics program is the :py:obj:`.Screen` object. It can most easily be obtained from the :py:meth:`.wrapper` static method. This will handle all the necessary initialization for your environment and pass the constructed Screen into the specified function. For example: .. code-block:: python from asciimatics.screen import Screen from time import sleep def demo(screen): screen.print_at('Hello world!', 0, 0) screen.refresh() sleep(10) Screen.wrapper(demo) You can also use the :py:obj:`.ManagedScreen` class as a function decorator to achieve the same thing as the above. For example: .. code-block:: python from asciimatics.screen import ManagedScreen from asciimatics.scene import Scene from asciimatics.effects import Cycle, Stars from asciimatics.renderers import FigletText @ManagedScreen def demo(screen=None): screen.print_at('Hello world!', 0, 0) screen.refresh() sleep(10) demo() Or you can also use it as a context manager (i.e. using the `with` keyword). For example: .. code-block:: python from asciimatics.screen import ManagedScreen from asciimatics.scene import Scene from asciimatics.effects import Cycle, Stars from asciimatics.renderers import FigletText def demo(): with ManagedScreen() as screen: screen.print_at('Hello world!', 0, 0) screen.refresh() sleep(10) demo() If you need more control than this allows, you can fall back to using :py:meth:`.open`, but then you have to call :py:meth:`.close` before exiting your application to restore the environment. Output ------ Once you have a Screen, you probably want to ensure that it is clear before you do anything. To do this call :py:meth:`~.Screen.clear`. Now that it's blank, the simplest way to output text is using the :py:meth:`~.Screen.print_at` method. This allows you to place a string at a desired location in a specified colour. The coordinates are zero-indexed starting at the top left of the screen and move down and right, so the example above displays `Hello world!` at (0, 0) which is the top left of the screen. Colours ^^^^^^^ There is a long history to terminals and this is no more obvious than when it comes to colours. Original terminals had limited colours, and so used attributes to change the format, using effects like bold, underline and reverse video. As time wore on, more colours were added and you can get full 24 bit colour on some terminals. For now, asciimatics limits itself to a maximum of the 256 colour palette. You can find how many colours your terminal supports by looking at the :py:obj:`~.Screen.colours` property. These days most terminals will support a minimum of 8 colours. These are defined by the `COLOUR_xxx` constants in the Screen class. The full list is as follows: .. code-block:: python COLOUR_BLACK = 0 COLOUR_RED = 1 COLOUR_GREEN = 2 COLOUR_YELLOW = 3 COLOUR_BLUE = 4 COLOUR_MAGENTA = 5 COLOUR_CYAN = 6 COLOUR_WHITE = 7 These should always work for you as background and foreground colours (even on Windows). For many systems you can also use the attributes (see later) to double the number of foreground colours. If you have a display capable of handling more than these (e.g. 256 colour xterm) you can use the indexes of the colours for that display directly instead. For a full list of the colour indices, look `here `__. When creating effects that use these extra colours, it is recommended that you also support a reduced colour mode, using just the 8 common colours. For an example of how to do this, see the :py:obj:`.Rainbow` class. Finally, some terminals have the concept of a default colour. These can often have special attributes that are otherwise impossible to set in a terminal - e.g. transparency. If your terminal supports these you can use the ``COLOUR_DEFAULT`` setting to use them. If not supported, asciimatics will treat them as a black background and white foreground. Attributes ^^^^^^^^^^ Attributes are a way of modifying the displayed text in some basic ways that early hardware terminals supported before they had colours. Most systems don't use hardware terminals any more, but the concept persists in all native console APIs and so is also used here. Supported attributes are defined by the `A_xxx` constants in the Screen class. The full list is as follows: .. code-block:: python A_BOLD = 1 A_NORMAL = 2 A_REVERSE = 3 A_UNDERLINE = 4 Most systems will support bold (a.k.a bright), normal and reverse attributes. Others are capable of more, but you will have difficulties using them in a cross-platform manner and so they are deprecated. The attribute is just another parameter to `print_at`. For example: .. code-block:: python # Bright green text screen.print_at('Hello world!', 0, 0, COLOUR_GREEN, A_BOLD) Multicoloured strings ^^^^^^^^^^^^^^^^^^^^^ If you want to do something more complex, you can use the :py:meth:`~.Screen.paint` method to specify a colour map for each character to be displayed. This must be a list of colour/attribute values (tuples or lists) that is at least as long as the text to be displayed. This method is typically used for displaying complex, multi-coloured text from a Renderer. See :ref:`animation-ref` for more details. Unicode support ^^^^^^^^^^^^^^^ As of V1.7, asciimatics is officially misleadingly named! It has support for unicode input and output. Just use a unicode literal where you would previously have used a string. For example: .. code-block:: python # Should have a telephone at the start... screen.print_at(u'☎ Call me!', 0, 0, COLOUR_GREEN, A_BOLD) If your system is configured to support unicode, this should be output correctly. However, not all systems will work straight out of the box. See :ref:`unicode-issues-ref` for more details on how to fix this. Clearing the Screen ^^^^^^^^^^^^^^^^^^^ Once you have started your application, you will likely want to clear parts, or all, of the Screen at times. The recommended way to do that is using :py:meth:`~.Screen.clear_buffer`. This prevents the flicker that you will see if you tried using the previously mentioned `clear` method instead. Refreshing the Screen --------------------- Just using the above methods to output to screen isn't quite enough. The Screen maintains a buffer of what is to be displayed and will only actually display it once the :py:meth:`~.Screen.refresh` method is called. This is done to reduce flicker on the display device as new content is created. Applications are required to re-render everything that needs to be displayed and then call refresh when all the new content is ready. Note that the :py:meth:`.play` and :py:meth:`.draw_next_frame` methods will do this for you automatically at the end of each frame, so you don't need to call it again inside your animations. Input ----- To handle user input, use the :py:meth:`.get_event` method. This instantly returns the latest key-press or mouse event, without waiting for a new line and without echoing it to screen (for keyboard events). If there is no event available, it will return `None`. The exact class returned depends on the event. It will be either :py:obj:`.KeyboardEvent` or :py:obj:`.MouseEvent`. Handling of each is covered below. If you wish to wait until some input is available, you can use the :py:meth:`.wait_for_input` method to block execution and then call :py:meth:`.get_event` to retrieve the input. KeyboardEvent ^^^^^^^^^^^^^ This event is triggered for any key-press, including auto repeat when keys are held down. ``key_code`` is the ordinal representation of the key (taking into account keyboard state - e.g. caps lock) if possible, or an extended key code (the ``KEY_xxx`` constants in the Screen class) where not. For example, if you press 'a' normally :py:meth:`.get_event` will return a KeyboardEvent with ``key_code`` 97, which is ``ord('a')``. If you press the same key with caps lock on, you will get 65, which is ``ord('A')``. If you press 'F7' you will always get ``KEY_F7`` irrespective of the caps lock. The control key (CTRL) on a keyboard returns control codes (the first 31 codes in the ASCII table). You can calculate the control code for any key using the :py:meth:`.ctrl` method. Note that not all systems will return control codes for all keys, so this function can return None if asciimatics doesn't believe the key will work. For best system compatibility, stick to the control codes for alphabetical characters - i.e. "A" to "Z". As of V1.7, you can also get keyboard events for Unicode characters outside the ASCII character set. These will also return the ordinal representation of the unicode character, just like the previous support for ASCII characters. If you are seeing random garbage instead, your system is probably not correctly configured for unicode. See :ref:`unicode-issues-ref` for how to fix this. MouseEvent ^^^^^^^^^^ This event is triggered for any mouse movement or button click. The current coordinates of the mouse on the Screen are stored in the ``x`` and ``y`` properties. If a button was clicked, this is tracked by the ``buttons`` property. Allowed values for the buttons are ``LEFT_CLICK``, ``RIGHT_CLICK`` and ``DOUBLE_CLICK``. .. warning:: In general, Windows will report all of these straight out of the box. Linux will only report mouse events if you are using a terminal that supports mouse events (e.g. xterm) in the terminfo database. Even then, not all terminals report all events. For example, the standard xterm function is just to report button clicks. If you need your application to handle mouse move events too, you will need to use a terminal that supports the additional extensions - e.g. the xterm-1003 terminal type. See :ref:`mouse-issues-ref` for more details on how to fix this. Screen Resizing --------------- It is not possible to change the Screen size through your program. However, the user may resize their terminal or console while your program is running. Asciimatics will continue to run as best as it can within its original dimensions, or you can tell it to re-create the Screen to the new size if desired. In a little more detail, you can read the Screen size (at the time of creation) from the :py:obj:`~.Screen.dimensions` property. If the user changes the size at any point, you can detect this by calling the :py:meth:`.has_resized` method. In addition, you can tell the Screen to throw an exception if this happens while you are playing a Scene by specifying ``stop_on_resize=True``. Once you have detected that the screen size has changed using one of the options above, you can either decide to carry on with the current Screen or throw it away and create a new one (by simply creating a new Screen object). If you do the latter, you will typically need to recreate your associated Scenes and Effects to run inside the new boundaries. See the bars.py demo as a sample of how to handle this. Scraping Text ------------- Sometimes it is useful to be able to read what is already displayed on the Screen at a given location. This is often referred to as screen scraping. You can do this using the :py:meth:`~.Screen.get_from` method. It will return the displayed character and attributes (as a 4-tuple) for any single character location on the Screen. .. code-block:: python # Check we've not already displayed something before updating. current_char, fg, attr, bg = screen.get_from(x, y) if current_char != 32: screen.print_at('X', x, y) .. warning:: Some languages use double-width glyphs. When scraping text for such glyphs, you will find that ``get_from`` returns the character for both of the 2 locations containing the glyph. For example, if you printed ``是`` at ``(0, 0)``, you would find that asciimatics returns this value for both ``(0, 0)`` and ``(0, 1)``. For more details on which languages (and hence unicode characters) are affected by this see, `here `__ and `here `__. Drawing shapes -------------- The Screen object also provides some anti-aliased line drawing facilities, using ASCII characters to represent the line. The :py:meth:`~.Screen.move` method will move the drawing cursor to the specified coordinates and then the :py:meth:`~.Screen.draw` method will draw a straight line from the current cursor location to the specified coordinates. You can override the anti-aliasing with the ``char`` parameter. This is most useful when trying to clear what was already drawn. For example: .. code-block:: python # Draw a diagonal line from the top-left of the screen. screen.move(0, 0) screen.draw(10, 10) # Clear the line screen.move(0, 0) screen.draw(10, 10, char=' ') If the resulting line is too thick, you can also pick a thinner pen by specifying ``thin=True``. Examples of both styles can be found in the Clock sample code. In addition, there is the :py:meth:`~.Screen.fill_polygon` method which will draw a filled polygon in the specified colour using a set of points passed in to define the required shape. This uses the scan-line algorithm, so you can cut holes inside the shape by defining one polygon inside another. For example: .. code-block:: python # Draw a large with a smaller rectangle hole in the middle. screen.fill_polygon([[(60, 0), (70, 0), (70, 10), (60, 10)], [(63, 2), (67, 2), (67, 8), (63, 8)]]) Unicode drawing --------------- The drawing methods covered above are unicode aware and will default to the correct character set for your terminal, using unicode block characters where possible and falling back to pure ASCII text if not. python-asciimatics-1.15.0/doc/source/mac_settings.png000066400000000000000000035452271511423144500226630ustar00rootroot00000000000000PNG  IHDRp(IOA IDATxi^ŕ&HWU111gc"zb~͸<|Z־%ƾ! 2;F!6bem0, W]S*|2O{$}Ώ72o.9y{uQG9LLLLLLLLLLLLLLLLLLLLLLLLLLL 8,aIdK X&&&&&&&&&&&&&&&&&&&&&&&&&&& 6 lQa2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2`2p@O|裏vVr_|۲ejwUWJ}˖/+]uUr/mkc# yr. C\݇9\糿rU%8$ƿ%K*ܲ5?BpsmAV}{^c/[,?/_nɟ!?%P7}1/';X?,(?YE`_{a?`hbivwg[wa)rWm'`H.%<'}9C'!T׬cN '0?C?_r;餓$9 r; b,Y.rw%80 /t6mjcXuqhle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]y]c4^u?adKݮGvv}].؜5F5^&K~hle]Ѱ7o.e.^!9?qO~R=իݒKܼycu3fpӧ7=fHu>=|^6V;32<\ Qh!\OXw_:hɧ?6#beo>wgğWޖ?֟p= ȟC/O???f](oGT|K_[/#3=~oxVQox\?~?oʅ_?bk8h+;?yxsV ۰β#sFo'~; ^KOurTu:Ƭ_ǟ¿g?c wǺ aի׸;OrqxN uֹKٳg3g _1- z`26L 'T’Ә ƉaX?`'YId!cb_e ˵zFL>D' 8]OEG]7/+Qqſg?Cv(b_~7:Tā 1caE%b\ȿ_y?|#ڎ8xsy71nAanzl#א=7 PJ#Rpv1>A#3$;n$r׮].޼Y㓸.o" cfob0O]7Y +6Cmiו x*7K7Ir %#? PZh\o( x%$CW_W?טgyn3<3GYx"2QˑɟO(EY2, 쯿q>o # ek6酻(GddY%>O?˘R=;O*.y 1*-k/< ~IO=O8ژۿ*`A{;EYí>us1nnɫ$;?'pL).]fdjC+F! 1!uDgX;a0jتkNE(P{isy433o7U?Mc"0k*?#I:{;+vV,+$-1'Cg(O$)&? /!fHg[A?r?6b;b.FwGל1Cfuւ]b;' n6l & N I^fJ6^Rs1}zEQ`3V?N)R1>XG_X >v4I"W^y%"'#?JEz|i&IO6'*k08)~PfTvz-cW>SI4u*rx{'$??pN]֯_'mvjA ɔ479p-! ['ğ)c>.9Sz`6]cu_g_A~rWn&ϵ<=L213|A/2] |mnWno21cӃVZ!zy1/䙭7,TG!>|0[(!L)f+k>=';'IeLFu&uϽ Ĺ  p~vi>k,9jժ} n9n}wdgP-“Eod\/փ9fcݾǹu.'?ц> /{jr_;{D~ }Qޱn-x1Qb\6}'1ty+իukݺܚիʕ'g=ش:Fh3_x>& X'lOɟ揮i;B[ߏLr|LOGMy0n(eonSxiW뇮v6B[onS/z%M+WW!S<^p)(}.ꕾș;osK%G]{Xg^J=L>í߰Aο 6JWQl'8=m*qy13ܞyssd~c0s4xЍٽ'ݏ^:Pvf hynu1${~z|rH{پ&~{CTz}B. (ИXpOh^\_sF?7r4D\ȋ_%([ {!o_?V}7NE>YeWOEٰK=Q. yw CY8˴9'.yw_߄RKsM\ڸK>~oX j')źj,IZRs0MG|}މ29iQo8Ά)-\vm5YKr[`A_󆦾d&k [,~l0NL{W{~+kfm?i{73Of 0e#_Q/F'~.rmVw뭷s9)wigGYâx~[Whk,)dWfFZ13Fۿ_\s (1&=?|?/OvR}H,ˏxY~O;Վz^j5m㤞/?emB$p7H7l(Kup i6ge2wۜOגOu-7*l4LrШId p%Ǜ!G=$rM2a< P鸡b|rof =`/[ WoDz[G΄毮_4^^Sn Co-sN8y/]^o軴:eG?fs{uVw}݇cy]wIt͚nc|~ϩnt/8px;pw78K/CFxzc_^gЋC??$[L|X&A9Kymh_'ͤ}tK)kߋ֯6lD=i awmN^ZKS.-+Mq'O@Wץ5ucڵw+o T?q{ ፒIH&C1>7]0w VO57|;F/$%Os?^GE-i+=٦{ًe7>nV_aOfƤI;aEv߾};=yc`?L*za7c A ,.ypvg?ѿ9=e_KS?d{Y_%oy 05.ԉu/÷ ˗/O'oe?6 4E;POB u`zu2GFIRi$.7>x_Q~kH)g(˚ 2ɟFڳfπbfa3vmަ0M$H{12_de Nn߾I'}7Ld|pep?}.fGxk_#3?-'X{Y7ϿHϤP2)Y [ӯrυ,MUYhg%3N\Q/v{/ o`umDGFECy\ٸKʟ?SL]~.`qCr\ ueܻr 5?ha5k[n$le/ [&r)ܐm]u6q~1aM1`o{L>aJ$e%ȍ0C1;Bk~ i>EM]z^vS7}_?f.3Y`\ng|BࠓnK=9gӸ?|g s>X}3p-JN8mܸѝz/rw̙ng߂ k3[z[fqa͙̟N;4ya5ʱkyɽGM3~]V?2㏏apBE;'ܹs؏3p_oq/҂EOxlٲ{ 9tOH^d|Tv^//"mPoюen _{NW5T<+u?!~i½ַM#E+%FIF N1}\e%QoG~^Ƚ`otC&wG*ɎXY٪5kd˙şZt|K(lǁ=V˘'ƿsמ?ߒN+m?}?o ?|(QSm}{r.iЦׁ oy^VIw*>Vߤ_Gӯ$7|8L5EpRDh`Pd2^wܨe Bo6f \w~(܊+bm}6|9$j.N[+Vop1`"(Bi# 6RB2/nG#"o}ʟƓ8k_K2i)&q r_Rژf2=X+K?ӿR&6O -B&&bk|^mO>d \=g7%C"A$SO;-_I˯<ž1c|0M+W7޽{Cbm ~d+N8^Wu8[ugWq^d1y~wS'#NI . 9_OQ봃K?Y3_Ϗ˨+4ȗN ~-yelK%>? Y؅p cd|SpnzI+(ue ?1Ӧu =W|"iszM#Ϝٸ;~Ov7S3#ԣy%y{1Kv}] Ww%pۯO6 KOT-O-}Omc#^įן b6榷WQx-hg0WKCӪZt!LҒ:9^%KTk $|54ktFҭ%>K-sᗰҵ/Iް4/eyuNMRcx֘m0[dod/Z>~.n EIr'OQG^|Ebr3kֱdK/6|B$b}bb̩7:$*wۭ l18!{ѦMNZq\oؔ+d!  dAxr hliYYU4M/oӊ~s]7'W$K&~ddȅn/cd?T-#+ h}]'x"T˒0r߾}$pQ.s;/&XjU;:,Ν;Sb7Y|GLtwYWG5~G8"|D?;vҏr*Ik3̽3ʕ+c`_g^ ׯќA_ s=kF{q{&Nu|\%]>i_z?| e:d*ɒ_Zj$3f<u_.`?k$׽a-œOxIDWX$n}9 |vM'3Un5J)JUY+:' "P&3Y*8AQ(ZVzO-٧Moo~L8NF׻ϵ!h`& *U0$Sx,i\cC}hkveY?73Jr?pOJW|1#>G uPoNDn?iS#~YG?'SPeZoq_߸Iu_}6 8uԴb3#>.(Tz 'L"8y듹d&vCrN'wu©?\ 7(~蓷$ P8ˇ |kN 8S?i܊.5J}޸o3m{G`1:SϨw,ˤq!03Qj:6k>d0>,AN+|qjphΛ;wM~zr{a k{̑5 }7O_rH觎űGgߞDφiyH/ʈ?ygї?/r\j_xY~~@(7:`qz׾q2FyLEmz6On7myǍ'Lovr?O(6N )akVon:d/TmxCQGy27QpO+y(WX׶6!Y;?a2 N&o|hCC44vkl )$^{c}%^4MLhCO}5؊2=53;,n_PY:L$^ o)$V#]aM}+;?j.^_/[,:U Pʄ '~n۶[dWvFY+G,NOKf3%\l+ecv|i>N408>Ѭ:%8]rkl7PYzj{wf~,nolo]BQ/̐^Ц" 8e> olş%ˌ~uL~6Hqʶ1lgY6jk>rclܝE7$,tZ  o3k)&[n_Y͟nkke.u}ѢŒte"v}<JG•/v7o\p-^|}O,K̩_&p|g%$C;wJUNXzO'GȀ>$K%/~[ `} Vb`x 8XKC;ݕ[qnݺU~ L~f4&Jdx~ qޘ[?Ηq05ͺn+92)h?yF>%֎G!jE\3y"F?s 2֟Es~?'J$=}W>V굳mqh8?e ׽!|ٸK \&(:2C}qp_F]7?\K"d"ҿAlG?.`Bu yßz'k ןgcV[$dq Z"W%t%>SS\pžs(R_'{礇b$9 upO^I@uh^1zA2ZG?-&E ڞOA|Ж(CAir|[3?fhSy*$p}QgJן''?_t!ͽ/;3cg}NHXwgqF!l?`ݿ!TwgG_ٵ^ٽ{ _q-$p3j+$q~iy5O k-[䮼x/z9g ?NM6ğIWJE &f{T_yl3QJvc?ɏ%Cu9Hl,t`/hK[?S-3 Ki/;4kI?,hTX{m|nkL>^E: ީv9n;[~B'p殜>dQK`Vג ]AF.&w\d s,5rwrVN, 'u}'te^HYF>ӥЅ_n@{ #)ku?+ e!K\nX+c5:I C4W[.S]!?L1C],\)ux FAL8o7mmoʟ} { ??%K5[o\ٳ-饗F6lH|ླ,OMykߏ_C, &e)od%XYCxieiok5Nٖhw_㽩7,K~j-K4d ]DbP(ʟ:I9Mj!Vɿܯ7)ؤٿ##],;?C"6>|wVePƧvA 7g@> f.`q=U^|F%g~J/(kTiЊ<0͟7/}*I\d8~69dn<듹)^)sOcYA;RH_T&O7"x.ǒpx( 5uԕ&~Q%k&oMJYi(1)GcWN꘼ \~B9$sypK/v=\LtMNQr HHnڴ=P޿_N6K^><( K.aN| g$`gnib^oSݽ C7|{|K[$A'5cL?<=e]JZսm??{?9?]Q>_kI[Id+I,cW,.fD⭕\Sa6\|dnk:5 mX= >*k$f)fژkp 1ʭg8 Cq]s/G&B9zڛ7|d~>y[m[e#` S(  &x%o'poE=ě׮WqM?O'ˡ_!:ll?12廳3!?LPT?.>;6 U$ D]w&p8Eqǎ ƃ!_ڶd_?it{҄ʉ'ޕcO({p n aƌw+?L֫SSYrvܗ^~ٝ{-{(Ev~v.ϢFM{f̒|mag]OOoЯJ=oku/ۺ\|\yCLF5nn7pj[ӯ~ Wik=cϽnG~_!e>ډn'$1ӝjAt$.WϽc2`5KOsʘXƠƺ05yaÀh۷o]d-=\3Gܽ>t {_po{ҏsOc2fp{NTSƿw ܻ:։7Nr䂓>/M|6('͘枚7l'r1橹ka&7{މ\ؕK'0q͚~ҐYfN|MW8O"aŜV|  MX`hpОWHIXWoș6;9#J2h >[ԋooo?':҈?->^Q7 fϞ'g̘ԃKA˖W-Ԥmg4_-[Ïccq8<}zgm_E}+\d̏|7>Jm-2 zpH?23{]\9#&:LPw7KG`'- #Zj܃><Ҏ51&1?k|L3(jʁHw \.8ˣQe=^i`fwinۜYn u?Y龽RGN<~+Bn1 64)n-Z/_N^ {V:Y-Zؑ-xuG"o5zmFIXKswxQnOO{^tn5kWI7,ϊ3$5s%{>G_H-4#,->E5.Y_3b|aU6؇Eھ5s^yq{]v- hެ3)6慾MFF+8cցޠ?&S*C|O+|- b|0^*jz~/ %QXw:O'$?[=%TƛʆPvω6cܞ=32CJ'_&4%"YDŽ?NK񄫡N>Kz{>Fq/OB#i %6u}onz9;Yr$ %CqMaF=2F9আ9i^R0k$- \s؏R؟`699Xkz'MX^`\Jy~#!2گ~sP~ظI q㿷QoEfFM37C0k1?B@Q/yhUyG?CM?ZZepoYϿٞƵ=?G?Z|S)N%B.'28q{|gܯl^oGHC/ߛ~6NcZ{?2OL&cFj,7Q&s m%IY5N!cD? n5L0_({0~/N=z[0rC?x4kZ4~0M5ςML]4OOҶo>5̮1mZeWf'_~d2~K"vWA.+vgc|cznÆ!ߞh!GŃ_)Ov2_8TJHnCTbnsdXqw:~ݺtx?Lt:oD9Ira-S^sl^^qѰcbTFB}^A9F?qp2}NO㗷7e\S;^9 dGy mӤ_6k<3A7^1??S%bT!?|LLhkZT'Hѧ3N3VYWڃP'kd[dOYBWfG{cϿ, bSb!yUϿ~s4HKcẴ?H?֗`amr P/4h?3t}p;9̋׵qmc8%Uhl#v7 o' \Lf H}~$Ai,\gyn[Ÿ~ Hc1bԟ:UBV L84L WOm{K6ou{ڸN+&奇hMp#/'̈?O}_x)&I›.ͽo^&.+XmMכx5l= _tk~u㿗tOpxtOis?} f[)oʺ?Zїϰ?t_e̥-:/`}_HK/|7N@ɡ_񵂜7ڑjJGUO?2oѮGAFdB.,ŇXabŸƾ,+_XeבdxQSrysN#0 &,WO9F[ѺQy56_Lv+P^vlH&Jln~` gLZ?p8Q^7b֯ln1_]&|\7\TCcOTN4oL |~#?[׺%,ZYb׏I`[, `I–Ix`O@͙{Y5N{kp6쿏+j?uIǘ?~{@)b4;Ϝf"/?1CY0#1_gGGG/}-I%Y?_~rx!Y!:e*oDJi3߅ӑM"[֖[u~h0 MSULx2OׄQc6fyz=e{)enkb-eRxOi71W3~Rƀ}Q 4z#K>=Qk!*6̑`ꀛ;w[m|MZ-\Np4& 3o^y>7'6v8@ΏX)N&1'?1!dD,vE]'l} 3Lвߑֿ .е>R7W?84&Na?Cqb3g??xlo<5? g90A?H.%W:GNVẏ7?!AL( ~>~>5Q_ZdC yVwa^cN#x#>xYFW?#~ݺ29: \P9hR͘6ɝvGmK8嵞t]Y/'T†9O`8$7 #\O^uF8!LZd'|Ӄƴ4zG$a-Q/Gi1a+'e%'_$tD.u/Yf+! <8{pe?ȶ?10wUfOf0g&g++Z>sij~Ǒ`ͤ3h@$$G ~}4Īȿ,Iӏ5rlࡼ*jt)-` d`'p# fAx8'BƵs4D%sL,21$[آVeLKZKN[۩qL6?'u!VKR&~߲.o ]x~_?gLyc +L}GyϣʿH<{B'F2Y[dRצ*e;'Q.KJM~ү, [`2 p` 8*~= ~V)S\G5{Mޕ`^,XN"Yʄ)2&y+}mބG~:z$˟ooOO _>Aط#06g?xho|=3=#{ ?f9~~| ?BҎ6?_ƇqO}Vl)aߣC?''pN?[I 53B=* *DdžE%#B7\oR+p_=2O'GF$qOa8$Ү ]Qobq`e3;1OciZ-afҗ},Dn3t\r۲eݶmw 7H8 9x}8?S/C2zS(w,3mᾳgђI&I&I'r$7e8uIciwxߜ9s܌3'OtmXCmpv?v=~h{vǟrȟ?&7&ԍ⏘ <%:J4gPna:- ^>J[)?EL\ IDATdCfK?ZemaWՙWh_?${+)UnbhbMXŷgT8dm)#? #UdY/+rlw< 6yŒyqp<%< bj MbEJ)F67D3)xØf &E)XcuE) $朧mm/F˯}D1qmkKiZ{?9l=8u}<Ĥ|m&5:9:!|U(X8[GvժUnӦM{ݮ]ݻ3<yw^/u=s̽袋`uzy"G {Aj?$f̞6n.ryevh.m${/ ;6S%@8Lwydu̡)8=ϸ~shC_K@Dh ȥ9n߅#Ë7sng o 񔊥Vqf>L>|>'FabRٽ82SC?4iK'p͏+lZ{ ok[Ѳ?eK<Kkkh*NO(,ی~`d0LgY2N_CW\n޺=#ݻ㻟P%/kWbLyV ]ЁG}d{[nq{s_7q}PG0ca1wŊq".ƼM.wG?{nC2Ot:ujc?MTYvϘ>ݿ -\zi~^i[be0?8](KC}g:[؈Zoa9ߌ" dZ_4k쯒>Te?f //;X#ݗ5er,~ L7!+ !ǒJG[oo?$߼)yǶ[瞱Jۄ;Qo$ PmZugԵ^>Oݯ>~1(k?]85k#4C6Ms^pzC$aՙd˖i;v{LN>쳒x'-Ntm>'"X8 ˖-ts\/[ުGm<8?^rӿ~۶^q?pؿum^%zoycKk՗2f _δ ?> y 7-~&IZe~׏>rR.9*n#0npӦMO-'^@~7p?Is9ǭYF6Zzkd/m5G}ڟ7;|t[F\N>SJ[ I N{V9#^5|ό |01CC??&AD?L F{a$_%a{e[z)b??4|]%Ӡ^W #SEg?FT3V_??9~-2U ǝrZIO(]wSNᒰTP>$%[ossG?oC.-XQ~zL_s~9>ǚv<@-\smi_8*JR0`=Y}5n_MC+p_g?w'J߇3iCKиw]h+"%Bwa1u_^Sʽd²8MO޶3GH.Z$n}$f{ySH>XJֲSc2zrL$>Bާ=kxxָ6n ݫ&iNOi^ڷ}?po}];}{;BJ_Oe“m\.]Y'i?[a \sw~yA zCB!(Kfu]w;YeÀ~-uQG6}Cr'nx8U_EbwÆ N HX?I[khRm'y޽|N7{V g}ڻ?~hC_ د{ͷo-^j{A~ a,c m!;&uNX-}&&]EjEǺkg%\bri2VP} ࠛQ<܄<3P?h[xP?kNNoq?->Kn*&w%4ƭX?p%p˶2.K]﷟Xj^MMw)t%ﴑ)zQ*~~|Og?[M(um6ps,~Ju6@[? ҥŗ#t~hCww}s2笳j_wS&̝~_}7~O 7om'ݫ}iC__V8 \ X6X_w;dgb~q=e?"~=}B_3pI9=񈿤a<_= O?m۶|͎ 4)> LQ7?VW&G}zJbk _um M7tStGI?QO뾶7:_ [lqя?loCOvR~?i*u=sp:e=4]eH_qe_H\.X &0u}e[? BV%79oժUTSrGOR}7o]b:0Oq&uzoZu}nr} gA 7ޘF)m?q56*裏v7ݼUHct=}#Cޫ~g0q_y; |&K\۷~$?$qQO'lsu?g.2w>۽꫒eⶫ˳{e^)eV+qlké6~$Momƛu}k{|3soX.sO<(c1ІH|]Yr׼GWs}m719+ ܐ-JE!u?m}zddoA-mJ269K?>דp}hmK~݆zP0uRfR{4._E1 X_Cp=ݶv/XJ;X~Bq,1uRWs$mUj9&hھv$cG!%'sM [pq.X \$),\$_IːqY'j90b=N'pO;4crW˄#0{G$|~HvfYgq"'6|Ry׼#{儳 8?k^TJotxu{[Da:ǽ|[2֗zh,c-ׇDK#eB/ gJN .j26$ueevye 7]xߡo톍W_-7kV^z/~~_I%HI_6;8gg{wq_]ޕW_ݷspױg8]ūwg"w~m;1{챳^ƽ;w9Dx0kyng쯿2?8/s=Wa+|㙡Qo2Ki{p:6]o8d/3FtDeu(׶uK\w7)ƫ׿X~tƣ]:0~ׂk>dSS""(1_GwoGڵOԬ. \$gՏ])ǣw۹k#{wǝwMnrSNUqeϗ_/H_R(YGV_o>SLL'SFj>3U_r$qo}׽_m;p7r{Gu/_+oJQo^<_gu<̽uoN̼_^1iI6O_"_ qn+pUW]ޢ}'}2iڒ*au1?^QP ӿV1lוwFQio8gs o0B^ pPF(!*ܠtsE@% EsSS3ѧj3Փެ=ӯ/úg<P&npy ?y ƚϾmu2"'} eux:zݺu6m~o~_){xüssndC(LcpP8> b j^:22g8SB\4P͋, ! dl~~y=Wv3min!#/C5|qbLjpJJiǮOLح({h]GOhqIYy.36S&t Ť)*A|wv3< Po:\vfd :bX]gۥK;v,͚5e'OXn*i7o8.t)G(ʑ|/:=luKieI\8 a36VK/]]zyY'2Ȃj>)E^wԘMb/\hM|/zֆ~q7;k3awISh4~D8i2M4A5.rI͋Ӽ:udx q'7hxlڬ)?nUg5+핫#U_uӚk3tE:˃^i ..2O[=@^xp$~aa!|<ˇKaO?&Qx"O޽l.WBotVoՆ&ΚKk6o~lVqXIk6lv}B[;pE4BfO9Ϛ q!a̹p2?x|`6NWjȚۤ7J3#GmC~=Ю]{j|tz|?K5.Nl4[.b7tOƆ2FLZ푮?q6ĴR_M?U˵Py&k@ N6 نLÕid]w?zMWmuuUq޸w6te䔞~|سIex}w>3.uq GK&DXw^xp'%D/\嫤O*')^'LkYe $:$G7s/'̃a=am;S;vAwrM w2qOEYVR#ątzzɵ aFƿ m%נ^80!{r/"UV$?vΜ;GgΞ3 ,{<)[>]U績6oQ-K Pcߝwޘ~N> Հ_00+T@YM5yk^f̜I?@Np\QKz:fd@?|?u!B]G{ Z!qbd nm8Oǎ٣w\A:Cme0$!@x:ٴhIk\8Ryg]ĿIjY nJmo0QIj[~7E mzzwCdl\F]xUV 'Zĵ֭ er[yȐǖnR6XN_:?n^ Y6n4Ok?idڵk-ThW2ϬB^)[ooIEg,uMw˹]_2]Xc*%x>SpFCqWCw P f f*P R4yiL iϗ7]<,k=o5Sy6dfd]UˋNմ۴i36niE{a;vV;cE߶Ĺ|V>l$6=ps{rr=Rj]0W3Rm)97$w.{{JJJiڴ N8p,P#..̄ Cv̘4jhBرh \]> iK؋MRB :6 IDAT0jpo13Ĭz][%kYLn%| u2T];Y# / #֏>ݧ/XvlY5V~N9CGҁGCIM=LO#,'>IZuE7l:u9~{I{YCYZ>p@vUtj%8GwcCTTR=p~u=0-YܻX Wf̙3Tx(륗^pw/t!Č:Ʋ]G~4o*qU_3` CGdbnBs$蔶5Ou}պk_#t3.6/%%޸V7#'o0f.66Uj#q䗠E)7UGd6{S/zP=ص%]1|oZ@W5ƿ#|y\>+xBGK=A~KafjWQ&/֗e~R_[Vnx=#H~kۮm脤N=f_6/`oos^d E804yqpk|x]2Nc6d mC!Nh(o(G+]xg] A&b_Φ_] n6ln6E5 '4/2:NS-K6ӿ_#w^9Z.\6tp5LhAY!Rȍ1 \wC_aÆ$H'" `E>>;xN:E\WshǮ]\qr(_tzp2.k[mkd;pe9$?oҌeNR/qy% mBx$?Q͍L5Q?z>l*o-_e+i߁Cmи2EwE֖2V6A IO-PNu׿:c>8>{凉汇- Vxĵ%=B [;o>m!;xޤrf g'd b3^ 8qN>@-Z zQ-3 8U.SO=euj>^co͛=xk$?x9wy6t|:Gq4'πqWes}H?7،G y\&3b67TyPyr6fillrѸTIoexO_h 돌<2vƥb5#t#2N,hJҬ|pWh)exա~iC_v56z6گPxfck7D=kOnt.~+-HtE˂k{6_/ ݄%@θ a_E% yIFuOʧe4$–Ixl/?_6/=RQM7mE!h[Mq@5En+mޢtȄc,5V竞>MȢQMG`,Dd0\\?h-I>w&X:5aHņ//p9W.ׂEOnTel~ _lho2?yQ?Hi^ҳQGI]l,`bMXqW(N@ځCG}qث(Kg~oYἐ 堬H*Gr$P/}:fgZoiUt sL2 ֦iЖ,e ]йz{ 8rԆ|R:dt;J#'qh_ /߷qjV%N/^L`( H7eJlDGUP3wmׅ#iՕ&MГO=Eo#eփ].[T81_h}r>jvԏ%2A(66xǽi߾}U[{۷g0v֭P{)T>}p#/#t?qƼ$ҕiˎ]wiҴ4xpz⩧`rZZn \/XBӠ%T1n"3-|^CKy.[Ap[1nE,fw庍d&Zu!hҴ\-;vҕoڂv/SFyJisT-C1>b.`\K>''@_ k[j^KvOgŴODֲLH9=ӱ{yez%BmdЂ+Wq}Xfˌlzƥ $ ')lO@,0t B}P"{pF;Іq%Ѹ6_@QsP  uO* qls߽mh} N -+ Ƴld d ͕L/->-G@Z0Nio~7n|$;ײ1GKcp*l~T(壏h…Oigr0 >[%%_YE{{wot4 } iӆ%lٲ_FefP1yD=oBvq0%l?.αw-<[PrV}2Y7ɨ_o"_Ӧu{=w6m\xiF΋O&Jy>ߢE5` ښc[XIl$WUbtq|P )<;jq4rdY{= ռWeًVtB WABmA>cfgh؃7v/C"j>˺I =pG\?矯s_:~Pi2|"iw=Pg(兌ΣGf W(@] =be 9q#**Gl WO^{NN|ڭ[7~\p!8zmnjY퇨U۔LҟBGȪt؏Yd]|6zٔx_Ņ1 kO筝Lj4vP~3?ؿ.H{wp Tܭw9Mmƕ)i'nXQ1 ثty~P6ax+^@:>YҳQɏcsʴ}nAwr 5nW ^=-._MO=I% iw9q"m۶C@'NkC]vb[YYUt.EpŽ[wz .*sтo[GK}hr*lpŽ82^ދZmO϶lEO<{[/=i*^󗯢iRQeX\ЏznR+ަɳq[gt%O==o?OګIoͽVvsf3Vք4[_+ieڲR&.4 3?+^+q~p5X*cLW&LJǨ<+8WSFI\]gHLJWGxƴ cՂѥ |r-T,IJ+(pZHpq\(6J oO~7/fS@0)L(65? #*=WIԔblgռQ^a@|A OmCAְs1-hW܇y%mܵﭣJڶc;V|yYn y%x|դLuP{lblBH_Lʧ5uG (Guq`NFyJ  HkYY9|e ^2EVX's^\Mh[7bl$BY5ӛX!惵рHK9G̊'[25ʓp,2<\ͭ1OZecЏߠoނi[n-[ zF 4< +P克t#@qe4?{R\flZ8dp^Lʠ,;n&Openo^*h{X/ƞ ԙc۟˲qE_{MAx#eh^q0뵕@ PSg S _]܄x79z472@kYf2@k_wlb_N|duNڳo?젢 . kdMFY,=u/ OW*-+Cnݺp W\fl:t /*cCӟMz jӡ3,? L+Gв :ooߥWј)ө}s/PA4f4*,*RWR]N#^, /Xl%뛿l%M;uWV1X+ u-(*庣 hKjo7m?B_qb5BT~ IDAT8m{IlPtt E6_|Go>[nEa<|5KYzq=gKP?lgGIlF~ݮkQ-0.=/Ag1{ oZ^$ uc1`Q X8wx{a}<5Fԍl=Z]{9;6o?'lԃLII/h(7|g2 &Ц53G(\  <$>} g_bTZ&GYe~9l{ж(?l*fkl|o.6y}YN]&-6W~8KyU%_QK}п G(k!x U(vxmvߓroG x"y5H}Qu˔VO6y4v1ؘ5Aґ#G20*Yq>_?6:u=z/ }?Jmڴaw܉/'a}w6?0cO[{S=LxZ9oL[9LMkS&9ԍ>A#ڟ65\7ӦyF 7xp3z `Q^`\"|PD.t=q<8mqr"3ٛW &x /.)2 IFޗ\|=ro:jze?ڍztQRqG('5fm}OeM-5+qG? [ntԧ pARN:N>\3X+&yYFb@֯OɣF|iGv\ki>N6k !sG"em땀ʀyIѼ3.W?|_i$l _R~< q#w]@o~te/HQ+_P~ލ=O}x#em%!;/V.\: 3 l25-o1_l:ky-dƤ y&NHfv۶m7x:wDS7o6mZR֩yI)P{zC `nP77?Nzv6M;6n5?A?/c8l:0Ȕ-9:+'=[q;u=^YҢ8/n,"3~gY?h^Seր~mּɣkrϺG(:Μ=GW~I.YP4h]Љ#7o{P~+2pPI37C}?7;wB8 B+*ҳgvc+ᥗ^=zn+:(~׋|$"߶Zc<JpMACJFԹ h[KQޠmSaq)=߲5=t~ƀj.!(eu{ -=@wHI>eٌz>PWi;hMcE#Q;yiϿ_it3\62׈d"y9i$e:D&L{s(-[Q6mDr3fxAeSP S[}%@1 Ԯ];O76nMKV1nxs7$ȼɋbwPl&Mo JGP='Յkx]S_-t^3+k ؓ7NA sHL T# ۂC=D}h|ռK/ЩM8%=QVNk}thX–-6Vs}?~a΀oT[y >M"8l:T@64_6A{)5䊗*>tuxԎnWW?{)!rr`@ռnߎzSa7c@Ϯ3>NXjirtyl:q=j^?'#xg-+{yO+k[G#+B&IܦgY }/ΪO3({m\w4`@ X yH(=pWN}G?3{${%t `9q&]kPV"4; mJ_ԧQԏN=]tقBЅռQ*yA5/p8bwӖ냴ռ/gw[tḊzWC T$t]bfuLJCG}D3gΤ󦯀-++ A]QGycc?!?̳4lD9s.g`j4&Ϛ'#~֢%nԵ|2hA`gȋ2p2jwkX7ꀺ QF3&۳c=ڟkzWf:1qS7.MmZӖ-[ؓv!4߳cQG.|Ӡ>eg W^jwn|A / 0_ˢzԡk׮L]FqWgx/||~\}J]_})oprhݐsB_hS=~N4WdxK~~?{;Č '|r )fp wមE?9g~5^~_Ӧױ>t%rl \6d9v:sl~xjqܹ&k tȂCA&;ou^P_޺fS!1o(ȑ!28R9cЋNw\j7Q?Fͦ=p}7޲}≙]qs3d[Q$MhszǨp(UVVҀ`jP~&8}yи@.7o#\=|R E{oȐVcΎ@7jC3[Y 6m-x?24/r:N9{k50k#pWƭÀM9?_?N(}/"x Po/xݫ_Hx ?D+y4M6= 0{зfC^- /YVZ 2{. k(@\7y.QըѴ-c'O ^>Z޹G.l.PKJ}{u?/q2 pmıP'+6P{9uCU3,~Q3i*TVy iΒeMAO>0~t~"GsџDj1 B=H%_`hE|Eռ)/EKĂqnR7ЈuuмG*DL2r>{κHI2Vyc&@U,q뫤ވAM4.L52IǑZVq0/na7qiձS_'-@ a @+ߗH=z m!ؽǂ6poӦ {`#((ԧH+1cxVxM5''H1fpR]z#o(j֌U@O<4lݚ:tLtF fEK9,X*r1ZK;Q_l+m h~eL=k⥬u^VIOF0}&uй3ت5lޜ5+RZ&&WҶGs(4h…|_o4lْO%}uٲe eD7E)^`п)/yA)ʄA9Z,9@^xĆ '|d)-[򳈔cq[PP$e}T?mԖQcxF˥Oퟎ܊ΟL]οj'@._Δ.Wu CM~~5|y:Ӎhkj@NF@GE5u#wQ|R!R0!q1hKL^V2Źbˊ?ҕ'ڏN?}ZlYQhd(?\P.3|AbhN۴yJJJ^=fjq/4o!Cщ3ЂVxIOdYitKGFpOӃͭrsn06=s>8UQZxp+qTS__[Q˿~Hs.9TUCxPT P+|/I|q f[3ڲc\Fqmh[[qp{iݴs'/[ċǭ"-}Xq z/jt$dűL،qMA58#FS W} е&6Q6t >ï:<<h|7j87i2M6ΜE- Ys,`1 W ^M]{F|qEm[ǨkרvLGO;/Xf/ZB?!u5o>M9&MmC|lڶsxvK?=pOD9ހDڋ-֭[  yCr-[C w׮]\F>p<0TeUb]p1Zܷvʠ+={t+o::"tnv-|(lۏr^k޻Kd3];)-՟KajNS̸L_:xd/q\ețǎz2'229eWfꭁ }a6>|SO=E0|+uH2Z\>4kp5uϧiC|.n HcƎwf@|m_u|`&'ˠPNv]3V 65㤑LQٷ^h9g00:>cy|t|╫`fv˵AP#B oT' (N2 e{̙Lp}}1ҎGwF[ !Q..m IDAT\-jHp+FuPƪKu>y+ռ #EZ(&M5nG.Gf7&bGI.שFl"NK_hM?޸k?꾍hiWhI.ʎ:Fu>/YֿӞz)n>Op@ x‹EpOD B5Kz!sAڹ@Na'FYGPPOSGPHгmq-m{ E1oOfn7qz!es5YGM]*yyoNWB[.C[Z=|I"鎷޸GhܚA5/@LT<:NS-yȡMh۝M2jr~9 E TeV? Npx_믯FM.\s.ҹs< u:,Ǒ.0X 6nwdG)Tx"Ķhb+4c Ϣ\'ɦ>B lg-\D.&柴÷sC}N#޿SYM./?l!d#PҰ2TUl$B #>½U=dD?TxZZ gEųBP@?X#׮]RMd<7.pQ+^S> Ċ, E|ǎ]~)IYBE^_|1h?t3_d@E_N+\Ok{=ubGa'Be:.b[?] x7kfv uit9q~Vy*p(O=.@ZiOץ~<:W)ƌ \5yŗ5PPVR/gK:iѷ%S"H kSîX~΢#7|3BNVs[21¶5)} C ҀƣT@F@&EmvTZ"H i8xbۯ?}v0}~ OTQԻw.e.rFUbknm@]\k ,\XOu1w*)ITyyIFPq(+<_K__lA_R_6k,FWSuF3 P5pռ47nt5EQ; s]kp QxhA䑀2y2eڼy3oc8׀|( /@8:YܒA5Bzʸ yVϣ87r _ڍ&ΘIfΦ3Ys 9ΙGg/[xupQ1wLm;v{e>dRD/ꌺNģ|Wbc3PǍ?xb'{pW!j6hg6m oÇЎ;GOvp`YX,F_K{ Wx"OB~fڭ[w& Tx" aiM;5,$P;Fo߾WR@.s-#vX?/yT[WҌ`,όtɘ9?%'5@&@KjfNe `j?~zƿtq+׶op7eבo*ա!rgiys3y':|]O>$!0B^#Y=(eԖQ60qp6 1>;}ʗDs e|Y@#ng/pےm&MǁYGi[gLE2̣n6^WJr |tm7-pt˷mo!YimrW7k_o^Dƌ\3`+^q Qq^bx~~5 PKzQQ ۏFG>;HG? eԷo***C2Գ7؄,`D_rc\F֡3zuNk^-iަ=wβ%gPp+]BW>\ Ɋ]h |1+iKVt^A5Sռ罛252x64kܘq?ᏌEs4 iY~!碊bfxjw]i ytuU@P:t̼I(/fwر ]{#/qTVVr˖- 6&EX&4_K/g@V6J]jݵܕ8~6#1cCWoa!2Vd?Q$Z%G(K>o?L\\d]q4I?P\?<sʷ_//do1]/zHb7ɐ'._p/yYOpTyy,l^3^Tk֭k@M[VڙdHCvS%I{To,-mҐ!P b^6ŸI\@(g `EK y+n3y rOT^bV*_ayg7 N-Bq ݛL׷AWev z뭡pm5}kGI6_u$Mh~YuP-+4'p|){Lq{G.8KzII){Л0@{ G?v=fA\u~2PM]DP]Kq +⶚#5Э=k 82_7BLyFFY#맾X;bѣ/o* 4mŀ;c[#}WG>4bWG(?pv0^^55<8l@u7,I>qqq ^2hu=U\ Xq%Miy ~e/G(WU⣓=sFƒj^^'29PqΝ WSIռE'+1p ysuȀ⟴p",Z>3kAv޽ATu~+>DݯN:K1zg_qeuԮs;pF͙GZAE4z$KP[רkϞt~9XƽPiLLJy8[^u^^uSQ}.mBGg:X3T l!q>2y\#cYƝ.ש~^udi77v!w˖-Ɵlb ܸq#{f/7RVPvܒ4G[g:@`^;vї;7]۶eb<_@eKZprK>6:p KmzK[C ePig"շQRg_.|<ĖҷA`_҄J8 .9̿ Oj;s+'b/CL] {Ӣ{ wRL9ʹ[5$H|+\7 2z4~6?tR۠lRtG]~Ng0~8u854F<M=bhY" g`A\ `m kq {Kx~IWCRkP-ӺtISx#-8j^YR%รRG6A?shl4iB_F}Vozm z?s`qHo<~+~ pTH%]KN5m~Py\!u b7S4 ȫJwLG2?{n@YTR2/Q>B-@[Uzޠ NF~}Ѳ8vY3<$h`K_Z(u9ԦM'z7:vJu={8>{v;uJeew+k$GA&kc0f$c^}c7jp~>x|\P+@j6sXXŕ 9<&M1lU҇7N|^ eC|4E<˰@. "ܑ#h Ѷ|;<4w;v;hȰayF-??8uMqƒj>)2 O>A[o}Z^^ΞGFQWu)sקj.dW婃Hz~F^~~ݼx7sӈ4yl2k.][+ƌI3fq0m49?u]ʶ-h]?;`/( Sr+FY uD]Qgm@[& mlڬۧu`xH;4ߘ\Wc77jMPlVbP6x"*(WUUE=ffdYY۷؂$Z}~R m6[[VoVGۏl2.|m[/z.Pxv@_z%+ÿtZ@`ԇܘG\YK/4lڟǹs6֔tklv#?5F rͱŰ8r&]R.ÖmSvv=5tm6.KG]kf#~Ӂt/1i}{z١CS^6ӡB| j1EѺG^\ uXIO֨n`Ma7 >Hb[cA&Ǐ#5k]sXG2.gM4xpzEڽg/#Gآ.z++Dz,\93fD]M&:F-?y'4zsY染q1? q

,@WL5jxǾ\'+^: `"?j_?=FCo8w y'6 ^,n'}H~E^Fw`֭~KP#)oHOǟ3kA7nظt1.~*4{2~ZzZѐ{)#R2(Гԯ9cc?Y?tה~K~@X@oɮ?.u/W}0{p]xMTmw/64Ș6k0 6& @ˠk oUxjV#z,%2$]gk?>z[L'L3 IDAT;xx1޷SLL=^{ʶf^GY=ze8ct֍:7/zsC|u6Jǿy]:|Jqe'%vWoD1cqOV!ϓ& Tyôgةc~ưD΢_6;tVRۗVݻwt-d0M4pEhڣgiD/^҅y+`*ܖEe׶M6 0#/<oao^@ݑ_PFIln!~a~m.G+T }3Hs|/\~QϽG:zοКs?X͚tcm{ WA K\$yfׇq򐟝bC:R(2̋"c@qA@^2p6y㉫AB04oAc9/ le#x6iҽbS-7]#-^G(ҍ~/C}nsǖX:\O7ѷByg752N:qLBw~׳?6QLZ601ͿtuЉJQ@Zj 5A[/Bz啮 <9ņ#6~8/e:Ohk`3iͳїe 5k1fm_]B^Y<`pU{%zkxxP P@٪|4W;U3󤴠<|\"sȧ7z:p.=w]_A5kם&||ߓW4yɺ%}"7n-2N8ee=l rO0'֮[On-۶іm<ҶkM̶mT{ொl_;S꽪w9^93:8fE"HLcɂ$E%DA 9QŜϫ{֫^WwoZ;իݟzϒ#ҁZ67oNr tM4engΜIePG~ h) ׷=|2q?CZd Կ>#?[x}F>?2H+9 P*&;W ?lpa؄i kP1AAlb}6}k<\#Ϥw'XL,̨aFz ]2ddi(l3#?|SsFɤ%-dc?2v9ۤ–'ޓ*/.-觓t,쳾O_SGgEgDBF`5ِe%i ؠ:nˋC]# =bdK_}qF$^K$=Zv3(,rgxԀ Z~otjÓ6'C>>.{KOjt.Ґy̙i.U’tGh׿vsEt<5%e6ilj`y yLFEӒ+;ѐ!h^8Jy\WnƇ7we} 14s^"?2返R^X}2R>^x!_ 4p.Ս+"=`5,¶>xrRw:uy"?v]BRWuφ ҔCGᣆ",qL4K9G6'T׍8[oM| {~g OMC(K3s?-7$^Bu#dWtHyE:Cyl!џ4ƺ1WIF5s3DNb* 1o粄~?ԼF 3V4Mj"rgBK+qe'y%N(%,4_ɐ?;cX/]Z2:n3yq Xp1qv]mMa[I&R za Uq]/_P*y,Eun.H *Pkm߲e+ }}N 3(TdiOVF =Z37mx"NbdnS2ݿѩOS۟Hg \r<ȋ2}*~5k7Tusapʦ1\kj|WZIx<RCԡcG>Ȁ9^M$MUJ4i_={h^8m۶7|[AMp_զ <&Ϙ+֭gMƀ颇xui54ij׾={:s?K4粓B+WUëV;>}p"z׹-oᝋ6hsM\jp>󳢂ֿGs> ?Fl Uׯ͝;^z%ڹs;Zyǎ4xJ8>ـwȝC(Y\ƶ 2$ >OI{QQ;tG6g}qwMRn6`)Z$.c叺ў6s *O'9ri2ݼ,Wzq<XUyΰnZ( `K,ᣐ'N{*h„h7vw}D_g'+Y5 KWOS">P'P1agGrGɇ~un/ OP\HG0>vg3f˃5UګܪRe o%ncO:$ + .ҜnE;fڟ~QnuNoP| ' 5qbC[-+aд $K^w(壔S?qJXM7E1I0j:\s {TK+ކt̘15t@V1Z*ߛb_z;zًΜIs.unGDKKW6kҕǟ5kьR- P$mR\,|5Ѵ3iͺu\d\5omv?-6uyVy*m5xU'R-ߴ#_jdcsxȆو&EiT`3P6sV'._;y#eJQ5?W/g?78c\b=FjIӳzk)guܞr{Yx25+yKwN(J u?H+̏{'Cx/ybgjg][z6q{U+,.f7j3@ P[mm6ۊImȫ.%@GyV0?٤y| _{l8?s!om5/7tzS@gwx߂.?N?s:ytg%aPRC 6K)u:l S&MG& ւߣ6M۶ԥK7\Vԅ7kփX;:3fynEEڴik?>GMSg[ pԄ9!}ڌԩ[pG\)++V0_V^M]veZxkRE:w̿wK[ӈQihcO0H5 Gg63!l*zg'EÆWl-Ϳ]*I愴+s/I}gi5u hڢ۵ǹhQuGGOoo kM:hum: lRyM_OA\x:nX6=xqï0Q+Mj+4EfNz+tʼ_LXwxY [xq?~l@UcUIgx`*[/6t҇e-旕}x۾];p/~6^ir̜)㏹!ڽhhĎ[K^? =FG!G=oُjRک\ m #z+O/]jyP|cO>dmiF +mHC3/w|e` >p}9ꏑԘT];q1CMv}G3 +_6N@u^?^G ꅇ/x`zs6z郏??QPfAM8(o]T+j^KW_}5 +zҥ p w֭ =ztj-ԏ-k8bύ7DMk3UauUkɊdJZf-rx)]ˇ==⋴Gh…4~t-Զ];n;`? /<C 1_¼M 2sqЗo);HTt~৕_4[Nߗy֤y_^Ƣـ/[xCMp en]syHDF4[ٹ+вM/O2_9݃0Tls z}:}2&uMFYM}Qm}f`^x]qNV&n 3ctˈFtnd1< N*657u^bo-[ x-[V*a\y2 M6ud2i`ԗN Xȭ;+>wCՍUi_fM4cϛߞ[:t5'Ykk/p?9 /ʜytg3 T \KYŦ/k/W'S+6,}]Iڐ_lˀܣGO1cV*x招>}&߳{=m~4a$B|uK̙haIG=nX'86M͞7,YJ^fecOmG|Q?}}yJCojUleBcn1cO6Q6]YٸS۔-}W37+u?^N/_?>i pA=e]AAW,b>_>'ϼl+?'*- IDAT6&uqa՗bO֏i4gI#GkGկݺw# űfNJl`/}8ay)@2uz5yaɏC)Tۤö}YG(y8d,yB1k+#\ /]r ܤISgC~Gg^s yϤs9(V@WM,KŦwc\-lEx5ǽxӎX (22vL?וCY^vm:/\D k ]LgЎ_Ѿ}ۿ%aдϾ`ub-<7 r#]'VɹccWpk\c2THGŖI@L={^yq{c ,ͣ\?SNaV@\fiBǎ0;07`PN1ˠmg4~:N7z_Mm{G}BY \jqt2n{n3}_!㕋JXs}?(:Ɓ0`NLnPϿxq7:wmo߾|#<]y1x۳gO8qbu OmAж?[<%o@z` Zl_ >L/i}ӀA4c΃ ._xv=h ͚;>eAkS>K/2ƛoі_awuUp2Zl9_egϝG-^]v@ЖqۦϞC/Kv'OA[7K،-elTƿ2qɇJ/T+ȿr?˪OxU6&qlVTmfJ*^mƢ ]rzW{U]i_Ӂjw?W-#_u8`63>yk~^[|ݜC?s|>fy׮_!o;ȧëKыݻw n3}ڟ/6~g]:{Q Kr*. [0B@P":^aIΣÒ4wv"kC %8PMߍAEʟPNfC@gЙמB{΋248= Ң>P?Mr\_7/y%'Hwi>Ж(Җaݎ}tW-XT3fPttN4}v8p?H|n7Sńn |u6=< K0Q[n>o`mеNdk?&+M8 "E]|mYx:=n?:z8?W9r, >w PQc\?b=|]{ToDVnG:eޘgUmϿP5V@ܬ`=Cƍ{g{tiCa$ !=⋯sϿLO?^-aoRuzw \lYi% !:l O6x/6O:4͛7ӵG Dͺƍc/@?nwt͜&G'gՑ//\5a/H?K lK?Gj퇜__roL/MIAZW?& ܰWU񺟪OYr;a!b\oԝ<\#=4 ,eQB  slT?tPF5(p@uPgAyB S'F"?xiMy$\Q5?_Pl?~O<κT8[e-Ϥs/<;NÃV(¸.E\s @{ h-Z:OwԉzGC ^}nowZ]v);w^+^u?I^~dr:v{QA3ɓgrrc?ˡKt{ ԣG_./]կh3m{d P XNuh4yԌy^K/.ZnM^{-w}#5jv}}'8[o%RT%< <m-~˜9z촞͚Q^  /%+VҚG6=}m НC C#g۸̓Տ>+u3~L~"ifŎ!Yu]]>2??Ϝ.e3u,U_lUD$y(._2ndFXqU%ǨQ5DOtZGilFYS_ץIp:/](T5dQV+ǫ\яzQKf20`V@Y嘟zuXqV i*;u^K/ 9d",j^>Lşx{t^sΠs {ޠ8/\|jР.BΓ/谔q:,!l#b2X02||$zvŊUo~>.o]_}\_{Pvy$?w1Tf.-eeʕ2| #qDak.]G'#>&/]v];;QNߴm4 *SKN|z)ii/3uY|_Lw]p`mZ8`5 -ͅ#%!:tqni1۰aCZp!;vz2r8F'UӪUX~_ kK9) OC0 s/hwߣwp(6ϻSdu/>ƸUV|,|{w-B3f̠/۷W.NW@|ud-.:2Ϳ\[64e*{»Vܮ\=z9s2e[oӫ۶0p2rYl9[h=twx6y}_3M¸(ο\?/o/LMxLٸݻwI|Br DZԿ8ĆFOA044 ifwp8T*T{|K+6ԧQ嬳SguZ;j];_/?(etGJXh[Ҙ6)~uMz)'GPI C@8maɇcH iry2 *weh%ʿ2?j|:t^SOЕQƱr!iȃ(ӠQ袋*aPFZ1/:uX8O:`|Qʖ ˓Mӣm4ido+W wJԂB%P0K}:Kȑ2eo' O%l~l~pMKotDVťڲu?GiihǎlYEK/-?_mDbSd'UFYbSoK+zse_/Gڍ|rI? 65{Y#V?ϝ@g8e./}ArtznPA DphE_>M-T-rT|M ˿ECT4_ K>w_d\mIDh@ ڝKzuq]مtͧ7Pv\NtAs%E P 6pOCMWd $])a=MT@q4ſn})Շɓ1h:f8<.O{a+ִK-DQyor&N|no#.T]1caAuX>qv6Iۥ|P2^'|ڀ/qHg\>|ღh޽ot!w^u! 0+;w ྽] -ub%ք矌Pw9x4_Zq.]ѣH+ט1c8 :|pW_}u6/nNUC.T*2_7{hꌙ4롇-gP^Qz#i̸4},3w>=/]{=8>M5ƌyQeQǔ3%\|lg.1 Ch=FtE,}r:"Qܼ/z{9$$+?7<|jm{iu sPot 9YuB^0gewmΣҖ 薢9Tiz$I_$tytJ-[L/8Z\ێ\.:/Tm6 6tl{/"XGŋ%/ @ 0ץFZZ3@p)/%+Q 0l4u:%M0!c˼7NֳWkʨ ux/?.BjpԠ9 ^4S{N =r2T˙tA//M66qXÕ.@P-ܴqM8X1 P~a[;z4d]4` Zb5}ڱkr׎0:,uG IDATw0p hڂmh#Z-dSϙ3vO`YgM읦G%YJޤ_gO4{\Zu{y^SKN*xaȅެ|ԂjW@4yAcufpW]j5X8=[#{$ ?y̛7ACR?mwޗ}{c q:zO>^{ pumnnN[QRcA>?7koڔ?_ ̛7_[EeС4rHȈG[y+uHKz/ ?;v &ќh9ڷjߡ#DW_M^w=ڵ+u EFvyQe۵u!]GYo^SZ׋?| ;>K"?x#o+}'j7 }Z>$uya'F8E'LZ\8?Hq:9+E"Ta̽;B}I=9@-ľ$n _^_9Xzc v{:e`Q#iY/KLXg^ӟDm۶XZ DŽf&w ܜ0yiK/8$~imgc1$^f8z @X `h:P`H+l_ۂ"C0ݽ8@`(6b,_ 58 $㕤'qߦʟ_̥^]^`wʩEM.-/h@?\w.59ͅur ofapC6% v!ᴼeul9Sy$Nĕ(oM.e62*#w DLٳi94m,6r$uԉ.nܮɛQ֭O49/˅8+ml~%\Qn?gW׵MHxd֧?'CZuկ~[tN" ׂaI/x}@!)I@$Nh*it_(]ׅp*}Ae++5Pc'&{Zce,S S;xJtq ō%QRëu4MAv ~a̕p1e%IEqnuyߖUTfqٶt] vܸ |2`Ysg>ɀ-h\*ip ,Μ9H}`~q鮻jG:oЫ.H§(W7&Mh5/`*{qGJn 2(k]v˨mYrg'kxq^'?;=xGaq 2׍Wqww^^{qnQ̨>&Г6+F[noMoK :/Z16?䮻W&kްa͙3ÓseM0p|Ly]5ڱ&m(Uk6 (Ns?ux8omʹwpȩnKiKQ23uyiȥ(Egu-?Ө"d/_ZJ~8D.E,ο1r9yI:!ϝcRp zrM ]VNj2*yag3*ksSZ:\,߰ &V&!-Z/83?ի3@A J@pYv}Bߴ_ȆkW%gåRsYuuZ\߶OofMjڼ 5nޘ\b.'M/7DMޢoNzlTXϛʛuX (RweZR.esǎOFC%|ȁ};7f,-Z0_m3޸NCEnDCرH=yhђۂ6U5x :/O>{i~ lAuo갫ǔ_2_m>/_a9uV_%OQ̿RϜ5SJ!8 llYWίeԟ'-,|x培f.-^ /&,ܹ=q=tH#y~?Ҿ8 :nxر&NHk֮^z^Mftڶm}m7n+Wҵ^㞑qGM7x#rqӕdzo??z+u֍AO&Q^芫x}vmi3g8ahlUp» ]٦ uًMDc'L!w ݺѭvaP_ ÚzAޙ&`Ǜ\ė_;qEwhy_a'kH\qȣB?秵ui_y,~"6IH)v!2? ϊ/Vr~/ʸD]ZB29hx?ً6mzq61a~T:,QԡÒRۀzі"G^}AS0MJPjBWB2ے];SMvI!x:}YUK q:u"u/p2 +- w)[nC>؜^qŕԧO_ᄆ4vrOZvQtҠACCzM=zFݻ a! ޻ȋ2(:P'0>}n'ݢ-a>}G1{}D}kڹڵG޵[3[fɟ!aWֹ|,/Gwq*+m4|f}-7w\UK MP~?G)WGl{I&_Q6@- FяtykGɿo!4jԘpn6_‹,G$xzk+ᣖ˖цg/?p_߲Ņq_%eAq /E_~ H/g,cm zoAG׮hWwL]`m9e۠MPiС4e 2}:_Sg8e?؃SkԱsg⪫3ɲ랷(WnYl cgqr /qؐɿggUqzKy1mo-S!/)kh- ޴i_@} n|yb1k?"cܚ4ʞp*`q| 6,YFowwX*ytX8{l{,/K8F};w~m_a TrR)[bK c PƔ3_x$u')Liǟ/!ËiFz*aԏMj޼9ǁq:,酨.pxaa mG?pៅ,'689䟯K+Ui|俸m+1b޸8Z1ӨQchĈ4lHw8kſunjˠqmq\@/x^yU6MnԜ,4#ݺ9s W_B[n[ߥmepxIK>ÒRG%N>{Cm ?Mf^\ cPO8|-:x0WW_}Suh/ڍ]jQcs2Sݻ7-^vE/5߼ܸ_̮]hѢE;?څzIK V@٫uؑ64ϔ[ǔi6n^:k  dT6}NW-[RmQ˖~׶];x 2mMji8i߲U+BœaFy_=*QOt3е4tK_Կ?^٨q?Dِ+O?%O?a}Pä?;5ɇe=[޵m< \I;st]sGk!YԶtGN}ܭkY(r>ϩ0).N) auK8T7+tAP.TΥ<@uޮmW PƥzBqM{ꅓɟ)%kô71e66nbcp"p :{n_}8W:xpa;M*Xj\@%`skO~4lw1xn M@ʢN/nu<PۊCz~M߸qgq4msmhs}66c{TEIK}οRCN}p pVJ3f,OƻtNdU3x693`={6=3앋wCHǏg#iE^A-Z9Cxv]p\/>FjB(酸o@2:6lHAq]tQCjҸq`jWT[o\ k|0nDo/4n^0! cYGڸR?g1}َ[ZL6~k/ڿhhyf?;kGXXC[1RY69ٮs? s0?;J?g\?kE#\p!8Y%! 5,'#7^3 FQ(BC(a N )m'L/l|b"[D&/?dk7 mʔ q?Gte6cl 2-khe![Gn8| 8iW&ز:0Sܗ*#O3/?W̿24 jPӥtwȮWmۦ {?^z)M4+ҥ;;s(}0>"<㐆<ȋ2( +j[mUR+u{T̛@'vh;{3{'2y/jöϜ2eq1,+e w$(?0!Kk-?S;h`{_q#~|Զm{>Mɳ|Xfjp8x3rqv$?^;9_u?iOEo:]s vB\V̺?8 j+֭#lzEh'ڟhd?jbop]odb)MB oU6韬τJ|Ht}F:Mg֕95x]t[L -LiH%J٬^`pt2TEX.)+){xI)eP./k˗%Jo/|A*H_#IyhY u\Pƨąyxt[{3~Fw%,|4e$ <BV'e4PxEYL*%Nh(0`T痼R?X@xxlVd6nܔ67 €ű h߮3dJ%܇ypW8믴.>xtyO0WBSK]:MZ/uXp)jY_d-kL _ Vi{M7xuuZ\収5OP6mEOnBgjcܮlӆzG+f[Ɯޚ?ο]CYds_%E]p%>d:_(P_Cֻ9|Y">kw߃cN>JƳ퐵ղoq&}Rٿ&!^dOʑmN C׌G)(!gڽVzi :) tZ!y!0=ϓ'uyerO Pv ]P2W#/M m Oe0o=E.iG߾9X >Yx:0R'@k\8߮};0kc=s/]=@_O[e^%\?hR?_? V<ʥ$OF l}x_77>7>S>yWI*T]f#?#?\미미*aU>j0Sb4?)/ U_e}_6awY^S|zu|ȡqܑk}W~ \M/Ӫ",|j`N鿥Ze^6 ?a5S߶S`0b2V]_d iLMywR7f^93.U{4k MLgRYv9v<ɟyB=eLWYbGOYϟ8y?ᇝ*^eԧ_W]FOG"?#4IdYV8]1oA,(D_S/?ǯ,.1ƾKUwRCp*?תvMNGԏS:wtW? IDATU=P5]L^zE(PIx:XQ7 p #eZV;GZ:埰N67!S3t2 } S[Hc`l;(+M@^ㅪc;j_)}F<'8[NٺoȻov썚/FV>wm_qgN֌'u߭t?({\,`e_#g[(S?o10'5N󗺊m_ YH)0:Kt]H"jO Ӂ4oZ ֚lU^u\u ې[.OyY7/?mRoا8l'vB˂TQ},p?#-՗in^I/9OB1s)==2Zt8_Կzܹ_(>Wfp?e/2G\0,§BW2s(w۔/mh^_RpMw+y:\"H% f96J[Ne!?o迒A1Oͣ[G6AjlY< |iF֢BmFSyX9KkӀS 'ޱjN~rȗfBCW o (KBsګژVlG}ҿ\?W&'fQ>|2z_d׿FnqO?&ɗϻ8r>>d-i˗FwB61ߤC{yv~3ND0:Ep#,lMf2*űGU(åOxDl|˥L69ڟR\o܈'ڟ2о1qWcI/ܰ 0 MeiTZ\ZV&pIpn! .U^):{򂤪|7mʆ^|iWmy=zlUR?2߽dF+IOϓ'Wm#O d^y{TLy'x)dPǛWqe+ONJ~%2Vz3t?Q/Yxz{˧ʗ;ڿhxz/>2t?uTբeJJ7u__\+IsUȷ kuz6j(xJV(o>ܗRPte$h*Qʕ]#+}56e)i.qU!Fk ڵ|i傫i;N!.^/?!.?wZ[?q_h~J?PP>?ʟ!{K!^(]4_Կ-z~pU(]%8c] Rh~J9iSxJȿ[{:UnNy3b0z@u@WmڴΝ;%\FQc3:_Xg&j~J~t;x1[6{PYVXAݺu8q̙3gϞVo qIa,t=U6ضh<ko!:?j;uvoȐ!zuώ;RӦM3ן#GZ 奎8NgРA<w0:?S10W =wd WN-}yu]YZ5 ѓu{Msqo)`3uZqUգeRDg>$A{< _d*a.c/iqI/a]SFV#Ԛ*^_(s߈ V.pIA!}: U?Y1yR^|5ݻӦiՖgcd?1e?| nO&Yc.K?e<`x2*B>i{zlP0Vl}.]7 /ׯܫW/^?ǧܮn_۷o 60[`מ>i8_Rm _t,߶m[+W-[ڨcrիVэ7]V2xԢ7o!yoZ4֭[G]w}A?_76t> (x(X0on_zk2k~ijٲۤc%K_Ɏ'!-K-n2 HG  2zaF (M$u۶mtw`T {!`P_|7ގ3zؠWߦQFpÇ 9'E@^zin#Fl-/mNH"22uWyt.\aD&9vOX}UWO$ :#wq΢Ժ|+$mcjw#a\]N+>̣]ެ~K|9M2c~a.\Ӊ_o7eyY]Կ{_Dו珌be˽x<;}&LCQ/7 F]{o(bs M.mvU;PGq_g(]vԄu 9%&) ?رg\x/20>uuھ*i/ۤ맇~>U>p[v!:\ qc͛@ܾ}:פNqۣov@[n1^C7{WG I=p־^_|:ӲsfoH[/6&>@gt:}^L^;'\6s!ʎ%qeSs0#rٴq|vOP:"F?E36_N^_Ixҵkr{@]~6x+zUkɱH'W(l~ꩧk֬a9_bbѢE_:tpvT5rJ5ۿ"SG0#G؏Jѿb_ޠ=-[ Ä_sT\\1!sxJzR??_OӍb쯔+H\+i?ܗ$#9:R|m.2e;fZvw}S~Ve\O(N wv3Bnٲ%|OOsLF%^q^{3M[~}0˟ ۯ8蠵u[jbڵ e+!ܮ4!}}=7 Z}փ^W? дUBd*xDמaI²lSSǼnIiXƞVkqE*MX:n*L MuӇ.^Zmsyfk,Kum~02cuũxۮ_2ЖF/?Asw[; Bt䲡F~2~ʽ/GwCH*GG@~4_[[icݸqcO4P{ܱ.tuuB_~1lr<ٸhh^-g8jG%sPAS.c^J|OE?HtNNWXnZ?駟 /\w'Uz9CT(rCݘ_z?d ~rU٦-wk0y>+wXv/(_M~¿_߯ռq!c׌3W_qSbQ|7Cߕ:z1In2vѺ# ޥ10{=S_ô͜MZ)bOkj/ީ)LړemU|~Ͻ;>ܖ;pnS=cAr /Ln+k ^|F:c4{.jlnȽ}?^}ѭ?O?#иM^w~.u_hߠ3*Xۖ-ތGa>h4q|SO]w]Q FܞxټD#KGbuwmMрkq;(v~up_;Su֙[nNFRַx;v(m~w ;w?яB C;p3/?E*  EyxcK/\q<<~_FҀk)Y'j\CPy$jP e[ƍ0sO<2M4:.*=q``G\Pѧ,(_yb1˱ v[0`bp-gGG ꋨf:}އIIjg=^9N T!5޶׎%ͫR?;ӬYs`)̇3 !vmA6Q1<=icǖ^}5 wy?nO` }HYOA _WW e=I֭W^6'qđތ/(<з:gfڨukCU0XVKX͎ ֜hq)φ?AN {#~z+Q\Y[=`N+_<`xlM:K?櫧x4 Otظ7>2,gI>8I=yY 0Pѧ_O33a/0JIY3z⊄ڌ!(ϼ 9Z+sd+ xڟSsrj<1?mS 觸}K3[wH>29[H;=3]FC '.e#{T賙~F<~\?r,nOu <-۟#{MG~8s f[i?w^TS.Mz_əS'set".SgJ7ʘ,G=9֑?A3G@n(1? Z*z;x#)xO}P:[~w/bx,ycs(b}ҴQ/ȓ'_o6::$Sl޼9W]1F)b-+,D'eDxbn , 'b9s]m%g,z;xobV9mS6!g6wy! R>O<1+o}|e_]c)#d䪟]?i_X!lF/iCŝW6N>(Z<ѲDGMDc5Y3e qV6-4 b={>'NGpO@_]Zأ+~cXH7O1vӯm^s a.BN&^~X*z#>6טTSG1SS5v~Ln$s%#cWϣֿJoΰlo}iy9߿Kk r ǟ??.]&O^|f]WFGV+co)v?n:ؖ94!Ҥ C?YSdڟ7Uނ'R2]{JۿK'0P|(>@e) )eT>']_ЈtN|j2xI /W `v֝wޙ){'ր@G] eAxHI i,<gT:ugo_Cbͥa!П ^{?33}gwcpL.&ډ2;oA}ڏ!OwbNG)TDE-sMy|iߞw} 2@^_\o%;JVр2zx3Myy{[_j҅~4LVLh +݁k=buL1\ T0ŀǬ xc?#w 8G/c #-<ܰ(G(wж\xL].< }6'ы6<ć}w,x x[-Vҁ>2I&-[K⛎PNiL/)ݥ|C ϶ (NSL+Oym\xБ!.dt+?%6xʛǸ roLgPOLc9ڢq /`Ӡ,6 '[{#ȗ3<#3e }c|0}Y c~ ,귻+t=v/<Ț>5Fyu{mCx"]{Mu,?[ԛ+ g;uW_27{wwxU$pU8I/zo+.ϕFuƻ:?k1zo49#e~À[ȓa>ioi(WS:EcU\W 0RbhO0*nk/,/Ց-,.gCo1; ĩ^cۦwީQi\1?'Ɖ>+jm=qEGIˀ{lv=BYuS~d?|~p6B+œߒd0Hy4Dzm黄xble929EiB╾ghRSp_Sb埏?\h>_.]rJ>[ߤbsTgs÷To?tḞҰ,szGW [Ty m!9d }.1jddns0m̔锖2Q.uQn.!Ea.ŁҊ(<G(G)^9> ^{`$Rڐ4A[nMOFڀҏeG(1#eĄUR !v0S1FRymذ!/Y?цlrcɱw@}qw~W? 5kׄ8^‹8Z;.ǾIBl?<.d`ŀ?ޫ:֎w1|^y9q.ַ;R&?M'{\7~+UYwaJ.?i1rǑR&G}BA:'KCkR0|g0~2V- y׭+.kvMc5ɧ2ɋ#~Ea4cG0'xR2 cP JJP;O:1O|?G)#+/+ 'mXJG?_i?4d?r-ᣜ0xɑ"&32I)!= Ʊ4#82RusGAAL2JOCZ(}aC6PO 9+AoPJ>۾琜#rmg|h==]z1lL5ty<2eMMz'j8Y6S+:yO*p-S&AS/+鄀OrW]p-}@1w\zomM ?}#h 4s˵v~x/\;15! M*WSÜU^}>UJ0_A;?r9 %o{чfV+%}e"W^"{$ oO/M Ϟg\tgI >E"٘B[L2*RO]u[۵"_vyd`aݦ1kC1S0m_aFXNy ǟaA~h lD#= m)q?Fk=_~K6PX1:hNXGz:z7`I&/ yVj/vewŷ]Jlcwy]&rƀY]`Paڕn !DPNJ&e2w֮]WF)bey0tGAI -BcC9Au:_|k_t59ƓOFI=PbcP[x>ݲX6aP~WlVWeNGopbs)H ^aQ,_>dH OM1i㥗^vD \ΈtyB0j}ۃ~.~Oj xcېX}ӅxяiL<p̍ʶ΄~} (QN2uT E`/*'⪫*g.89 =3<]C4j`D02#hk#'ޫx>cgi C}33a|C?1ȁ%}ƧS.%;- Wf61y[~ XflX#NUwG#)c gf3X9WeG(SOG%O;mS|eb*KƟ ifmu m㟺bG6qp|3vRNEf:pqo/WףfU?G>EG9"2^$ LzO+B]GcʓZBSlhN;[n!m?u\s"~OLM.qm>%N6֬/ƃM fOϥ'~Z)5aW}]#m=-ꪫ9XV{[:ۯ:Lʹ'~Mw!+oV/7/U?ǟ_Xu R|*>9OKar\2FyW-[≥*1_(\k]ʩAx{_z|%I?/6ŗ^Ig#n{Ӝz)^mP lOo"_mN818-{\5D]϶Gdۢ'ȘlaG8Cui'@eOoPiڄHS"v;GRFSƣ -mn~sI0Z$c=ly"_W ^ x3Vةڄ #T* #Kaٯo1 łr-@<1m }MDۆxgl@/Ke6{6n>l#Ax,vl~vKg_B ŚsE1ϴˤX^& a XzgbQRHT^2z'/^};w C\ʄ]o~NN4ƒ6uABXne_p~4PSC z onmygZzndmZLj]& ,N j bvW' KmCGiB ᕨ8T 2zX:(K{qCKtPL Hd])ܩ?P,^;@4 Ѹ<3]n\hm7pCxP(+=&G֡yr29 IDATc]$%nf4WP O}GG~b\uڋGU]5i8-7!O;Ϭᕏ0p9BKj+DN+O]Og.׵?+% v:l&Ry.+)xL/œ13SpA\OF*p? F3pry3۶Y'U^(: ms?_htVO:s_xkzZhOsS_ڿ}Wksmڮbxwa\q!m0x ²Yy"'z2o>q}},7>O|~[cGu:쳌~S61o4|PfrbG~//iϫ"8Jc=9:s\$e5ښP RwVy"+vN9sKC? +kA4(P`Q_QtYg7_|%!90k2޳75w͆{hcNG[CL(ܨC̬I~ )ɠ#tT*Eme=2uQ)pK:t[TFh8湤?o*/Ǵ3%KmxT57&m2#O4 (gQ{;rg _LG(W@GD{Y偋-Bct@TcyqB~E}iG:2FqZߘ~Qhƴ5!#qxcuDJEyjktۛs̱a) L@ AG\ ~[7#.ʽ^d')+[UqEdieߑKj^G(RՍZ*Tnՠ\/T]y}~2#(*2H; ռlѳaAuKX= A_ Faƴ)+_9_}wuk%cw%ϕ._-T- ~gj~d>#~ '慰N;ZE'6ay~g=1Q}=>`cU_qg<n^cm3MG(a3ֶmq~ yx1f y{ZOLAʀ?P'>zXN2t㍵x0G xBSW}z|W8eXsXF/No32QFVS^jiK::\s/92zᰖ 혜o\cbM56mC6o6 o듯s;C_}O(6NxCÏwrzWʟTxt^i͇>DRJ/[xO./ݼ۲>zm=^W?ruoEjw>FrD?A>g_8 De@_pW84Sful!1R A(PtOY(86PǕX2KcyQPA{7?RP6摒t^|!(lnT7vˣĩ<9zTw\GQH2%byyP >WF[@$O͛pt0T~P*qgG5-<ñԙ%qY ?{eӾ( e;PRSec%c).$6o6dw.SvMcT7͌ Ϗ͡&'}R[woB\`ND `Hݹ#ssemzbTyg'[p33 ]hW>Mώn4L~F>yB, x3.d>#{7= M tE# ^FGw_i!kز8|񣭢L:VO:[ULS:Ɵ_2[Uo nqsZ W_uUzSC Z\#KYON9mJaXv '&&ñ_Z[յW)nh<JSGOGL'ߺLkxBF܀hoGqDW' Usɀu6aoi]GrxZ(6B_ʩ ?)><y6};}/9Ӽ$)z:ėxs/#>c5C?K_f{Ayoq[=˳y cț_yTQyyDaXYG(י`:6bhO醑_}&$۵??p?_cC[K>g5.|'^߁2_qkroդ2bӏ9s6>}g ]xzPxplR1Pؘ*ktV.D-Cux5ڊF^#,1hS&6^Xkˇ;m1poHl Ԫ=WcQ\W(spJ3W%r%H^(Ac~Hۣ#rGdl4FۺWnٖ-V1qׯ/^2Ra8RBՋ>2 AJݍ+j}mG~+Oky[Eͦ2XGY䴍#+3F_kSh>=ʾ >oבҧOkjeALrdzwzagW+sa ;uWEŀ1w[y4jf~m;m.0?̍C~jKⲱ2puOd_[휐2>`Q|oJY~X y sluX7 :Mѧ-KxkIm{s7u _ҏƙ~2:&#p<̚e,}5\M]ٷM~5DfYU[1L㯒#M~?MO4.1M^V\qӔ-1L#M~˟#dHS.I^Q?[?ܚ|scomZe4%Y˞(I3 m=ڰ,Lcje[Kג\w{ƿ}S2l|zF1>ǝz<.{]N/FfFc"v_z`?}EY). Hvz߶=p뉣Wzǟvz߾^7}g-M{I+ /[ej^w}m¾KF X[JEGޱ4Z}cgcXme7[{>wњ]@)s}?]Ry"0r}^Ie(Mc;[{>^#}am㏻ >pϪ꜇!o\U5ܳ~q6m*9tGjc>yケh6]a- C{>Mׅ gP]4.l8|&C}˜?]pg6s\†Taʣs6;sm eymNKpQIXB+$^gV^MgN YJmʙ<{]NC#>OewۭnB-ڊWʶ KR ً>i7qʫ41߫]]NS߶)U&y/# N6ltWH_z4m91n_wr{Ɵ/yP=?w938/+twxPqx.u;)YRhSB+m[oPXwǻ7BBOvK.9SY|UhSB+mOߪ3l U=c;*{nl'*P|W᧕[ѩݦوvx_k!g JZb϶7*tzn+GmTmZkˇ#.~ FF,c8XһhwӯhՌ+zj)4LƉd^% , kWq%}rv ·Bn Oqy-}S^Okb3<E)2’zg ]2ʨAXτӳ)Oerm?ss1|k.8Oq}ǿL(f]>60k(W"~*S霬..Wr//n-e3c%K^,ȝ> VF~-0i[d ʆfEc_'2"Dr _,/T%b:ߌz>hTcWƀKCl;銷i㹋NW|4Kz {)tm]tms9q~/w+i_.bb;̀)i7#}ďJN,.pBTꪰ({_&e%<8~J)I IDAT38[ n]lՍx%_#CƸuMm/E}xk[6}Ӻ#q幏/>J)S\\!o|cvr9O\|06|7T_h Gd7e:rῡG;Ӧ_j.g+^+o=p۸l~р /f'Ї@RZmBL4<OqA֫Va7 ˣ\(:F>nU^W96Mvcj80VF` H+}0w+{ǿ~<.].>eMJNqSCƸilHUi_Mkm<^=YmiU~SU[GjqWCcBvo!,1s_U[)/;dW++\ # $3z?]S}16_Pm_5L[ٮg.]Vco W5>wɈ8Ffնt)Wse2,5AVZ,֧ysծz}Hwm]^^xWkk)[T9e\}se.8ǀc1p 8ǀc1p 8ǀc1p 8]v 6ej6lPu]

0zi `1p 8ǀc`>0ٟg3L?A>O[9<ǻp 8ǀc1p 8fÀ =̇cp9zmpc1p 8Q[q6m*.k_ 肟r2u<9eiei ck9Eǀtn5o}boq{wc1p 8GNO> |n  O3:qGǣ8qxO\;O44e5.i1D@ҏS\?F ߎǀc1p 8nݺSNqÀ6}\o`\E˵pu0u8nMWǓ m񎗥/mch%ġ@ҽp݀늺νg{1p 8a0~8ꨣ2ܭIo 7ޮ-}cb11Juq?ʾeَ|xO/qK.0q\70.Jyǀc1p 8U|&]4nޞ+'>+>F?z^}9n7OǓi<9^&^_f 2--(X(oܸяPoe Tǀc1p 8>=0>*rx0nʢWu:n7+ԅxċ엶1IdXyb^hE٪U߿85kk׮1p 82k7ps_G.uPzn(>{ +wsJġq3w<9eiei ckӺwCs]vYnzeT15_z#^LNNs8ǀc1X`:~sY[^ 򾜯dz>+o~͛;oQ3_Zr.zsY~󵏋t?ocut.^|{HiQBc]z?ϊ>xDF C=X?M6-(ma厛[gy~W{^93 0ܿPcjxꪫ;#O=e?~p>_ 3 e/c݄N=p7,7-]\. ګE?c1p 8|k}׍Ӏ{ 7cOS_:(%/r xm۶%^r% ·ϞaP3;??꿊_b>LGw_._3*YgU01 {ꩧj JH/~N;կ~_zgZK^z)ɨ?Wڙ#晅O"ͨp-Ba . ;΂eTxooo/nio^_jk{f?j暟x8Ӌw}7I֞qy?~i^.`n[AyW_sy^ ic q.]4PY<8

c^xA )dpYI^vp4\ gN7۟_ox]sGV[(?3G?Qa7d2Boh+wT曩]>`b5(z1v+ O?t+Pb("]nӸO^{-Y0oрowY_ yF%T}/tpgff^0sp֞/=9p݀7Z?=xʀac ?W.}c1p 80`vn]#?gβy2|GƟcmSF;Oxn{??lм*~Iu-/k#Ͱ|`Sy+w,fsV9~wIq5{IvWW) y}i%_|%on=ra)ۅ] Eo M}QޓHP}tkќ62> '_09auǣ>:sBb7ϋnr1]#MJ^@bǀc1p 8Z=c>PijzZ<í( (yon5,7o.Ptڂ=xM?Qr|"0|k_kc]rKqGa^xaq]w:z]tE468pLӿ-Bzm OXuAӅ!E8<"|a>Gee, K{gM|L*.wN`!Dv]w֗o2ݜ˦09_s .* 69Cs6Ah3m.?Y7uSz cb+0G!} f IDAT}p 8@?܅7y}q<>wHχ-w)* 1BHkȸF~<~=EtÐڦt9z5ϯ 1 E+:Fǀ3E?OF/SSx'^q_TU6?+ZzъX.hz)y3Ro+>ǃ89nkUwڻ|Q9 ZlA[o9//~_ҥM 9cl:c*߼6W8jո u)s]7 ~=~ׯc1p 81kA7cB݁kðW+?(%/K#7FI{ʐJZ yGfftm"K- ۖ8NpW@?|7gbT S2Z}.8ʏoMIy⧿<@]lKW{?lG]q*37?/iw|Rxܖ/Ku_\W~ AI䉔'<:lQFh`$ey WɏrC'OZRQwyv(ssޢٕW\7ls y[vz뭵:#Zg(g7y}G5nc }!p=]Ʒplp>sp`ۋ~ î YorgaN&y0ĻaQ?cö j|?2bg;==mcEw-/I6Ri8Asꗇ1//s_T_CXkl=ypu2XW Yի]a; ~2sC*1HT'UJ.k#e1F^~<}7KE$C1P}rYsub gU񙯎wO?ۙ)ce8ꏊx`,=n5Zu\ xx9U^`0?.6mMUP|*i)Cаc S)XG@G"s0.0f㔉B6%ͨC,y4"A%^pQ+ ^(U&!2Quz̽zC6<+m}Q.1-L eڊWy|ރ'eTq{6W'xEW̥y?0-WxBcT`o1ͶO-AMl]G6)#0VeqEylpf\Ħ1Ki:Y7um|?tNΌt)pՐPͧwժUŞ{YW /b>9Ïg 1p 8n]#ʰ|q>QzX<*e Uܷ][_n~)8QJ.6[o=iaYwMtKXs>_2>[U&\a=?h|~IC=-Po>w6|> k c˘9UF%C%%lV{<_6O?GpE!ݞ` 2q,YLш#QP4Uy zX{mz/U;P_P,[2!ν2:NVQ[({Oc^2(ǜ=e|ieRŒsp}5Fg riv#\ֆ+_<1#?d&04<̹zޒ M~`0v5 j3'02ٕ-+|>3~Q}ًvF!&Zʱ\?m(#CD!i Buس2 ,&pb7w\Mj(B7{Ẋ#_}AP>^?ۀvK_RqqǥIca ΋T5MGC9 mp 8fmº./ukQzuay*.FWm?)Uv f}#,[iCG( nb-em,6ŮMl2$(p1sdh S*ZٿIGO-Mw.Zwkdp`Ww^]OUkZu(-Thv\$ 9)Tzf=;6G6tc *n?FX=4й`CА{= a\  p6B 9v )޹6Zc8^~}2dʠiC&Pww{{-w {Îǀc`nX*ܿjYbP}ݷ}8⃌2nr֝ iAigj+Ji0n]֐*/ Sh:Bj BjeWnSPpe xʾ I[_{rzYKz&X^Ƀ(LUhy)|_rZE9skgK+yhQC[v*й\ cgcμOnּlcflG( d!f$&$I D $AF؀L"JV@HHggu)o>{Cܪ[osy}ђmJѾ_}W_PU&2Mn3a!FGϗ]ǝSھ/OyiOZ?^hWWo5 m-l/A)_ū2i{oHVQO_3W;Fu>j~S^~uN6 &aE`dM~$jX. GN-z M[ƥݹs&S5e]85& ncOoe4<{djBt3oN 5wۇiN3PWǎF?կ~k_uzAe뷌68W˜p`j2YX#YfnET+Djq5J-2T!>;3ߕ$9gMΞ_|eЋC3~]%Sw~ o%ީ?Jnӱ OԯHzOat"*/nZOZ1]1̟1֮wlfdR|V3f#zq֧ ? lg&Ʃ}ϼٴO˓JC/(hz^g n|}xk봀k<4f. |7K R?Rѱ*- B^4O*Bn3a3]ZݮNN.O+!Ս3R =̏bz[vnWzO"\~\Mz뗺\>%3>΅ /nEn~ϪԱ-﷿⼴lMt"l/һdM".3pnMIov֩m :7uO5GH%&K5WK,a`3La`Zc@}6ʵ1̂`%Nq֠'eT3 oTA g-^smlKSts~ 8-=s50WbT%U w}/Rl:v2s>(gC]vߝO:wV❺l6$.g(h -lb>GQ܍7NZOJ;^ &EK}Jb9Vp@Kb[Z &~f?{+ZQޯmL{xQ[u_يt:zNoZ&6}Oۤ)/\sMFĵ*Ѿ#])p[b^ǏCNbBŪ_FE}OHgB^=JxԄ.˻K3µ\E/[r:o'x.|$pUW>S8Tڇ_9o+G\1~iVu>l3z׬n fѬ_b^مnFt2puMXoj=zfJEZo=G8e`y#YkĉEUܢ?W I *lyDk0T\qnXNQ00eaS9v)zCZ"[oM1Ϳx,z*ݽ~+whozx^!Ӳ]O8kLa#? >uǫ;~YwҨvW-! SjkwWԽBv ;k W\M'\?q|:Qf,^ϒf% $I~Z&Ӗ`aiC}Noj+>A.I$/g=nojE<:WO"Q-敷zEy2T/<쾭6hjGA{Kofb<ήU/L'|u$;vHfk&lSiꟛ^؍A˛[} a[cq)O_}ŋYXBi[!.goh^j)/?: WbdmFnyik+d5#~k_ zSɓ'7$=pt3R@M0^dL9a„D4l޵xNecz3{-\\Gr> 5\fc@O|8```?赀>zۢO[&J,-Oդ=,weZ?hRjʟ;/I3_G3U<}cc7xBG;fΎ5)3%9=k ?H.[3y?Ko~']a%'+I+]ߧq}np'CH(ϖ{!{yvn';UKj?yžZϲRPSv򙷴vݻ~f]םKSo3 ^/ V{/S%#{^%/hkWl `iv{3a|z܏j1t܎N_ ʻ.&UVVGo/mJ5oQ*y{;NiÊu%TWVj_-=Wylu18N 򔗞/g*󫥫|h;ʽ~S\7+Wddc ,܌λn.ˤWxfff,UUQIٹwQ2qjF:_|gy7ZQX/T{7փ裏Nc=H; 2kW+(֋:g(i*Oi*j!o-#͏F-!Ulٲ%S~b2czQ/,l򭺲kr%"Ҧ>>NN^y8J1S;u,<.KU$jvZfSM^$o=kOyޛh;{k&k1l^[=Xa+YDžZ;iOݳ'_^h|ұy"_U%jՕ\XZn_Z׵ou+l3+n­U~3ކ@3E1 =|Lx .5P,WF/MYoZXzRnE[ܪq/O>4N`liұ%\_X?J˄UcQʃ)J_9rdRGxmg݈,Φz\Qa` `^? mW},2h4B(zRq]~P>kG+.-iiio%*"?2Ho۶-IO)}{c\t(Ncc7.xÂǟ=tşBMW=p-Kv?}?Tu-<ҽ|޿Mx앟U$?>3aP^AZNbho27t'C$o~Ig_?\v.rO2TZ#F( IDAT5,Gh tOl6 N\|iC2>~{.Nj7tZu[?͛7ezhV2++(@~kz_|n7Q;WLg }8M}CL}L}/[}R4Fy-puQ-w=~|]HսS=l|wqYޏe_ʏJT~Wkw'?%V˫ᶗF/3vޝ<5ٿ8a"7+?oL4f{ǂ3^qqV=j~_r ^?{];MvpemF6^؆\M>dnBnQp5iheǡO-q_Ӳs:Zc cBwu~ڴihn׋JK3e+5o?[4W=eʔpuBI0>?'n m00P^ m8^z/3fy\W6^ B֍lTվC jj$*I R6@B{IcS>c͜:ujl\$P[3gLi 'JE-.s%p{7O,?ˏ>U_ag֬Y׽_ ````x1do/\Ix7fsԲ'֧l oۿ3v]n-?oMF Xe`WO_"7б2XY%Z&omaw-l*t/=f1dq7s?Ɩ[.Ӽس/x? 6mH!/ncʇ>1Y*۩v}cre559>} ^ZQnyӤ9Yտos8U-?hVA{$[>Nqoh1.3p}pmlրk3p{8npF!SxSN9%͓:P諛La٫PUlI$gFs^0aBn8ŧho^^zڋ ^Ltή0Au=a[##UWVeRYђqnPXgl /^/v00|>_m;Wy0v3 tv*^KO"'yrlqvfҫ?_ qqQ<͔(L E j'2銧8M7o;]Oen7tS뮻D8 Yo[.^FF^P0nR.}fKpQ/JWb^vcx vQ]k弗d^=3M#/VFYZ7啣s,3p53peR8z;/-e]um 24j}|f%V-fiF3DVwSO=5͟XZ-|#cp#Bpn^=醣|6o^I=E\܆glF\rI"nٲ%̙3kqko]v;wO>0Ywڴi詙x5Ul%zAZ`*17΃RͰׄc9& 㲰>? ;:CJi"xåa`p܃>8̚5k$g܎zDVmf/ni'OԏNd[o~fHo?K[7!Wկ~j趫I'xbbV ֤UMR=p˼I55V7+W>ccG- V?î:zT}^%5*;6L2%ou]"_bDXM%N81YYI+ψNN-. ݫ%,,E"]@po< &C# :4gsN}':DTf ܣnn<w^ Rv 91)DE[^\ieqB-fe˖%yW}q%^ve 6l+w k֬I|xfquҕHkbyނJs3w0> JC2-kҷ @p/&/rhx;8ښN;%3mV0p7ड़.lF[W[^&nZ所{! Mnv e3k]vm'ڏ?8۷/j{֭aժUЩvMlUfOT=5V3j%-?ūl\3wdflYKS+0ǏOEYۿ֮ŮDeʠ-UGbf '?^Pka```x3;$~K_ e~ R(ԷO?ժ_ ZSp7dड़.lF[W6Gt[!l@S۵txZpͨ+pɉ@z饗&K*k\ZBYp_X"q%jtiJO֒4W%qxůM''#4x87 00P!W{| _z("<rہA#l Anঝ<5ڥ_J B^+!76s6ppp(aRwkqb0;$j/9YFKi𢁽V6!茡/gN?znঝL<5ڥk8A ۃ&Xg.{6|i fZ~Y{j9]vs9k3q/acHGYD\zA}s᳟,_*NpO00000 5 C[Bz-f6qU]mv]륀+f.Y$qٓ~=.uM] @3[)=h4~R00000000`ds(x[Wg_R;ZX.\0<#+ti_``@p5x3j@ŗ:hfo,_ff'6 $gTN w\]w\ Xꆺh 2h#0000000nVmZ|Md+Fǀ 000f@}#GveU'p7 000000aMn7g|=W @3 hunG-`3m000000n\Qm„ ; l>dc ǏJߊ;C ; 6 \BY2&MF ! ````3pG}k=p3XbJ[ 6 \BY%d;餓%=De_oN 0^S_N/M2%͌yf204``````@ x'O3fH\&NƍǗ:an>]Dj  8R0000000`<|M GaT3uڨQ´i̙3Ü9s¼yR00000 PM}8ԧD_8pb`Jp000000C Z{$¶"f\+H3F2R%mA[ :C% @/@ ـ{K @0S҄;b7"G ȴ# 4`#u0000000  jӲ*m@azr1S҄;b O\f. @ @,1p.```````znv"mBr6KfIf 4.^ LI````````ܬ۴ʍ1R_0000PNpK  ^0ˬ,UlڅvDpb`Jp000000C """  8R0000000` m`*, AC``\& ep}+%#f1iS````@,1p.```````z@\fd7 @I@e`ڋ)i 1Pof 4;2 ```ܡG``````` fm`)l@,LҴ) 1S҄;b7ö$2x)/ @1;4XbH] \\}.~sNҦ00Ñ\& epp3_72h%p 0003;4XbH] ^ o}@c(a````1S҄;b4O\eg0;4XbH] J 4%zͰ  204``````@%ፈcT1;4XbH] ^ #k_Zw̘1|(OhS҄;b1D000Õܡ 7````````@m|. \80p000000C "2 6Cn 2kV>У [AڵX1 6? u?X?{20ā1e{21kVۊp E7 Fmi``ˀLV000000nVm@HDlC+v```] 20ā)e{b7"~kK0000;4XaF] "ep}liYf_fbm@K@e`:S 00000000@\iϙc~tAaѹ߯|+!/L-Y$?cW_CnHt.?Szy<#::裫q'?ڝ?CɀӺ7i`#u0000000 pi5XJ7~ yK.4\WUxG{nE>֬Y}ק~ߦyelǹ4 EqJlϤI 4n @ X?W}I\& YiP+Loٳ'5NnΝi>v$jiM6hB*gc IDAT\ښiW뮻βL'/0 `2;4XaF] "pW^ϟ|/^6lؐ:NߤiuG#FdmW|衇2y"h\80p000000C "V^7o^N:)T_5.uƌaرɹ1cƄ*hoZRK*n]gϯ囕;C8pG/NgySO=5̓%~K_ gqFXreXbE6mZn}+òeĉt5Xutwȑ#km.X003;4XaF] "ep}lKoV%\d|}$@?oXƍK|+_ ~y]7~#T.]4'>/Wp%j}4 "7/ePjˋ -JBͫÍ7O>97^x!]ua6o;c L)3 ep}+%Zpa ޭ5W~}T(<q_L-/e~G^v\?=$MĵwߝEif ݣ:*K|l?̔K s̱( O?=ZF.Z*Kkg]r001`^)O<ĠAAuA] t2k<k-W3L[n%zG&<3<31 8{ry޽ֈ/'ndѣG۷z뭊t|~H=cgwyiE|w;,(/Ik}{iyO]-+-ǵm۶4vׅ nk{OCe`́!i 2}3W镡t0g(&N0!H;x%bĂI&e}ms}eB-.Շ,\N%L.p׭0>묳2?O=tP&]Y\}zua"< @ X?]3<5δ &٭lX9Pm?.l_;yTr-?۷ϼdK;%X"M/ |\{Wtؽ{wR"%z_A{WUZ~er{= 9koXvׅŋۺў:a`ps`ƀv0p:lKn?5/ϕqx̘1i6mʄ3:o-%l%jpSO=5Mp+W"W3t|IH$ܹ3׮.,^\Dh\k6XÅLpp+J֭[U 'PFj#駟 3ϤB]k_2˿KE?~|#v-2/ٳR>)Sy;oRӝp]qu=uH 2;3; 1PW+70,~o.R5 Wp}~ƩiK-0sp`Mc /˗;,ٚ_÷mi;`````` Zx+;G_r;.b mFv mm۶LJoyk>?vlq ڣ׿yI]p:+IoƌN K`9 o%}^3/M՛ou|ww+޽"/ʏ;2D䕡s/R&ݫ#鴚OcO8餓r_Lʕ+3ᮿ瞌+21c$֎J^}d'ϟN^x;Ǹk7r3MƯ2a0)Wi}].W[sgT!Γ~ۧHoѼ% 'd蔀Y/u00aiK+wȑx{G{n۸δ #\ f` ```:Ur`zZy睙p}Q3gNa|;rK_LvKol}Ɠ~Əw̸97"~ɒ&&J okurďnq2lGu=`c~{˩,L:5vF/L0!/9v)ugkOV2>oR~x1خ.,>G`ܡ%y4 >}dHVO?=ϙW7EԷ2G;\w;8_v3- ڂ+/C"j^k rJs?{g3i*2n/Ze./l390KǏOALyP|p7n\2#Vn/QEIsEڟ(#O~[ݲKl7pCݰaC*NfV>c Rz\c믿^(hYp1x4 a```zǀ&o:'OUGy$7L-W⼼aҥfycAiylEe\;p+۠e8#+qJ36thYfex%o9o|[yPkY>ɣ]b]eyz\1bDfͤ֘o*wѢEAF . _>M2aΝzdDz7WJG94P' 7ַ*~lqw\ט!fqO[xlqDss pGuT]q-NG~tݚ`````x01S< ϼsΠhڴwZKY^K{Vx,zqٱq^q{C\ph$Oa``j~[nnݚ5(ԒPX2Z¯ŧt>4|5WfZj[oU+A8G3L}ycBT>jeH@cƌI* 2[W^ye&X˓)sO]ee˖eұmܸ@Qg00000|3gNϬ^_s\š˲\m1^άf\UWԽ꼕qm Dl@̷[V1 G); @~Zf×M]zuଳ Z+oE]e$Fo ykʀ!Aо~"W3[cW_M sԨQgͤ+קw|gg(w^pyqp qide}occқ7o^^57W(۔e]Ǿbの[ky6k|^9rZNbΫ5od;(7~xK'$~^1bDE9p|Z̙3+L>vBY*Ԭ˸qWx ؘ{@{mp5 _ew08Qʎ8000PF֫pp%>AuVQa,ixdz[ ]k{J4qONTxo\-9f-SO./."gR=Bmݖ&j,_^H~c]p.\mq^}:,[Օ^H= cOwޝJן{I4p5ҋ~&nRh-W]z饹{X!^}YqUJؘB{ mpYBp .a```1]IŸA}7l2<55uAKI,ԌWW ڷ5@sJ[3ee(ЬY\qf~s9x_v8oL\ݪ784ٗe"WV0:֛qdc'ON"o?,-k׮x,^17m&@~@=R0000P^♕Ovzi6n<W~4F o)S-l~dXbmVe\p+cckmpYByG1hf000ed7+zqU? t˗/ b> şTpfϞ=A6Nfs=?Zj8__}SqyX~4 ǏτQd37oz,-g&vЋ5G @Kq%7'%$-p'H44Κ6mZXtix wkapWs7n\PF%y 0000 VpmA7ؠkSN͝k~^U^s5Ɍ_ W^~HՌ]H ހ"?=cf>煏mue;.S~ՅlpjV'űWxN>=Y^;oƶOC3rqqܚс````< |ߨsqѱV7ܮ]jH[lN-2W%\R;3۬˸fnu[OZ8i!5(l6V^UhfT(F(+Ok.e7Wmo}bM|^{#]uUᤓNJfjTR.({!U -fy*p%X4C{/Wa,j,{nnXk&~W\9/?Gģ%%DHXH]fMmT8 f&o޼*g[%?``` r~w=jjExM֊J}+KHܧή5+*< 6266]<#y??)g &7$]Nc.FuAei?܉'&{yiGo~J:u ^ziЬT3& c6*p뮻p U\o5W{CFNyВ_.y|7xcEx-if~ =\&],9m۶C=4S{'m6 KCܸb??ǭ?```À^n_ܴiS*P \{=T^KZxqU%weS'ىu ?0.{ڱp?yP̔a`` fP =o _"~Юcљ7WB޼y;g* GqD,ۧz*L4)UwO i{j`_SHWZllHViyb-dǪo=y=o򤙿_kwQϺu٫i׻=SJ57`Go7ޕw+{h eqb嗫 .Zahɒ%+"2rسqn܋76% 000ma7+ s?̙}yoo&j %0^a"p>DL6s4^mf{9 !Kȇ&O]KU^wԨQuAyg4,- u000e;N?oկ_G y+\[zu&o~Qtq\+`\e nN2ze+wɃôE_N'eM{gP' . MgϞڏ:ꨠY5/N0!k}X- ª #36t,#ܵ8u%dzx֭[ayqk]Z5E&ʏFiQv^k^W_-Vfk?nk2uϿ曫cԇxI\+y/VWSA{3fdߪ2b1zl. j<K֍x`q̷h/7 5= =pm-Rœ_~}XbEj@"-LP51^HR gyffzkĚdeiX7.H H,~3FK;Kܴqz~O6-ǔ?caرlV.1ϼq^veh-]}z-NsUZV:/njK7ϕ1G~xGV{Uȋs1DP# tdnsO^?h̯O5T[Xrl:+·ѱy+^T\yɼq[^!6x> &P\.WF5à0K @y~Zv鹿`zkX_]؏zOO4["D38#L<9hf dкp S4Z/Ȩqt?~|(C=k֬$)S敩s!=,Xen6N5o;z1bD2YxqXlY2{ѳø*jb* IDATͶ CmR0cmym000 pAQF```````3ۤ{!j0 \l~1< 1ۤ{ }1cmym000 poP@6 AФګpK]f/ @@el epzx pl-%C_3 2Ӈ>0000P.֫~'4H`p8xCڜ6r0PwX1O%^M le=h5ڿkr 000000000 A3p/Y7>p7۾t"{0000 9m0000000 p{DžWf^zX?CPFEą0@: `3ۤ%;,_<+ Zx̘1q+_sI⪶ٳ?˒'諼^:~89&MA``z.2  @赀;l]`{ ' $_vZ(OB/x訰~SO ^qӞdg͚yԟ|UF˛ zޱW"ロf/N4,/;v쨸f~L(W<7oVM7ݔqm00ۻS``````` Z{^tR9a5`5#)ۗ+FzAonwرAK['tRv=RZYu#q6Ϗ?7qӃc{eennn!~500giWAB+A3 2PW4q 3gά*d#-opv˖-i/Tƶꫯŋ3fE^{- 8?$)S[&%귾fU|V/b2CYq/Y$<^x! pUNkMrʖѣGgҷv@OS00y 20ā)e{b f;WK(/olXtGjDa0hIh5Q]K*:nT͖W?KK/R5xwݺu' 7nLfkwVK(+_}Qf?v … ^s5y6000Ph];4XbH] &gjEkdž l3v:1j> Mm}øqpǫM3OrKz^bw3~j >|;i `nmK u?X?.^ LI````````&\>pkK͘}Sz] EQ6*i>%Zk}Gš5k*/RGXX +k; G.€gcx  VQ0000000nn泖P(W4l0荅G4U{Z=_O>Z+-QE{Wn۶|?iX姖2zZ bs 00 \ƃ80p000000P&p$J+C[a =j⤿w ޸5"s9'MN-_U cǎ nu_O=Tp-v6q*쁋\ @~ZvGeZ+yGAdMAp53Dzܙ3gfDF Ǎzk7-,A2Ɩz-t4nw^&mŽqԏ[MU92۷/ [~{^rvh\80̍q?z`pK./*ʨGc|P_ MҦ00@E 'Onx e-\_=pT PdҽkEy5jT8S1c2 wqG3T;.HP6 kedܹfn"8~#. @9@eWkfD%Kh'F*36?? p߇A柲? 3kW:&[Y Ү:5ԮX"Mt- &믿>#,!C<4Z/zی7oN\wu|Wp8=}j iԱ ߞ =}p5 &Γ0 1`Ng eȃ<@.{5f֮]kWeSUVܛ$0 K+˜n#ܗ_MeTY8 ``1kVm,2g\+H!l0hz] MD< gÆ WKk-/l??#Z2ʊW\2yGe'NYry晰zꠙ/R暮{+\W=J<{+mD󤥯WZnX00ci?"2nAʯ,U *RYUf}ښr/vߗٯm\.>sj@ ـ tIY&X>>Ewi5{,rn͛W`線+OP۔E¸+?{InDղ[lM7TQ.16M```p@e@=oym,બ2Ey30ʀym,બOrm=L4~W4QNRzɋKgqF8Ú7"[l]paF xWSL =\O?]^CΝ;3qyQTbUZUVmx5Voq°SOef ޾}{n3i&;2}zҬZԩS3q(OQZ>YM6%aӚ5k ?8D޽{!O> ŌzHqFhfA[XVfp`+vE~mF甕ٙB1S(ɞ,'|rZ6nݺ*W2]3+.UIj\f=ƍ!h\&ۀpZYwfzWKr)19mݖ$ZjIa {M|cAIVL+ =e 4H☾i裏?{ne>s`<Į&52 Vlfŋ7x#|n:fۍpep}"rH>gfl+X4 .[:|_``ŀӺ7i.Ƣn DI9̠ 7qCQo00|_,po+7_vir],}p~_Z+L\sMwibf֛f.Z(L00q_}"k8~Hۀ (RJ7~ le=h/߃~r̠m\>+ =e ɀ]gv\pg3fLUK=üyŒ3GQ^m%%yu-,APD] TR.N{jTǬY|wq)[Ɓf8gΜD#ַSLGqkeP88ÓV ~zʊS3oW/p>FM 2e 0000yp;g7b ڱ■ v~m:̀ w&wS! S7oޜgϞ$/ĩ=X"=a(>k[~坕D9;'w۶mI6n>BF?f [Veu]=讻J( «iz+|9n!pO=T=zt_®g5*..n{b:a```p@p3\om#ף>:ꨮ ̠m\>+1Fyy1{7dfJ짢lt˻r7oi9]vgy&5V_kvw6.mC޸GGLvwإ^ ׼к`$=쳙ٗzvxQM~a8s>.N^t%1ЮKݷo__ϔ guV:y^q{J9ka4kڋ13uԿpM}{QZ9Lmoyյ~;lٲ%0]\\c@8@ @@-1H{zZjm%jaJA;8.ksIwi:c# =\8z/2v̚ȑ#3\pwQ ]T/{۹^ґإfjS{{Μ{9]dI4սg^8'4^_꫃-l?/={f O`{Ni̦Uo== 'yB-@:W}{I۞yU(^8sA׊ݻw'a+}5eu=p趮ZyX6tqYf_P.4m0000@2aW5̈T+L͠m\>+wG?>m3' E"Hꪶ=(jE-Ȩs}>|::_ qݪg0( pTfSm2My lڴiSz5Ҋخ+]͖U4ЮY%(D_-/߬}} w0pݺu96HqPԟy ~!kpM{骞ً/0S$.[,Fzi;yn\iZ=)ч kWfFM1```~Z}ƣ@yEe {'~UEqq Xho \[ftMɲ2QSM?c:/g[i)ȿzwK ݉:%C[ԛ w^3LϏUV%U?y^5.V\<3/|k]ʋmWl&kgϞdK/!~Y@+x\s5WTO۠V{2ׄ"W/_Imߧ~:߇eXBy!L=O%DF do~6~R6000Ñ[9ҥKr`8;.n#t?ѣS# 7pCl'_f̰*?=Xȱ7KDn$l#v*^kBf qܽs{젵 w^,VfJ8ܙ3g4޴=cZ- c-dPX eleП7o^2#K+"qRho|Aʦp]vY[gܹI>ƏӵFhU^_ߢY2dy֌'qս QU76SwyAK?.n7/}|8_2RW⭕m„ 2Kkޕ(e5F5'N{?Wm$NkK{6*OzyӽW{ f}g#c}&<=gf͚oU] ■G Y t|Ary,m۶Z_F\LЋFzi_K3(j/oo\p+HQ^?l܋֎ ?.,wL*M^Uda_```Àߵ?3p+Ppo%l]#XK5߮]7m* 뗅O/_m޼9=صUwŊi[uYi~"6).}hB%Qm*q!l0C1 [9mEd{Q!*cSO=2@ТhV5V(v -2hߗ_~9&qNF ^{5_fM䲖:0k ykp5KuqY[ˤAܲk:^lY6-3Ϥnggbȯ/Fbms|>{W=bߛP z .Lf>ʤetM"6٤0#F3YFd)p[y&dVoen.rq}ml]U = zԏ-dVϤZ_Fny.n%ƁX?{yxشiSɧժ-||wqm{[zAUs큫ٷg6͸ ,\.'h````82[9`b-+,qW"l@o;sM/,{c'/6jy`/F𫰶k9IK\-nܢRv +\_/N%dmb.q[{x?6ߗuezdIy%^Hk/>VpSie0cuJvM{/Z,_<=o <3C/U|Ii؄XVVꎰ܏ahLST?7̋ۺFj9}"٤xVZVuUXdVܖݟ2eJʴcǎ>znE_=G/YYwߝkMU<@2NuR^gڵIj{;'Wp,}'ҥKdpVR;?>Ls^>/m ^ <};uß_183p1G1y[(^6f2Y~eܵ%50-2K<8.47 J/A)Ͽ˺?ܰjn^Z-\ ۾>Ӡ4{WF#w62dc-#*=f֋;yu2Z~Rj~V-m !f\ndd)r3؄~lY#pυ0GG{$kzAM[_^ Rf~1髙xN]pQx[Az]am m00̀ߵ?K(W@jF"WfmUg4us-s[v #GLu7nLX~}2V>{\$[4S%jn^Z-\-[d2(X$ynOj֛CE5.p+I{Dr- wܙއ~$ϲ_HU ĩUXMn$LS^K E*:oBf,po+wQpw_̿ꪫ),X4&u"=N&7m\ŸN t e&S袋ҁ\.m\s\EMw6.^8=`πV-Rߡe^}?m_&ܯ?ppC'ĉ00n^%P`uՅ"7Fe˖4 -?}mg~EEehTa)\_ZnTf@E-廧khFG{^,3®ނEn+q}mUFڤY繙gR=z4RV5!38?\(h׭[4 FtBMKѴW굀;la 000mgfI&|˿jժt[!Xag̘Kǟ@Uw[oM5*Z~/ |XKV[9Ek-"?Zg」䪮Q{3oy[c{3㮎:Puou P$HHB($D29 18I L6` [`Idm 0o}v]U]ꮪܵO{n>uZYe*w8uΟ??ƼW2[wtO,vq0ika0`0 E 6ˣc ܲo pF챃] 3=|lm Àa0ﴃ{0Uvl \|`ݻ70Ts 5TkIve%۞Xx'( ,hL ӦM # 70}_]K.$q_WM {p]v%<8&S6&;&z6?XNA,sBT$̙3ٳHENfʼno8痣8]{W (:p;Ik~'fӕ$2]wdzŻ c@,8_M&:!,i4mmmNlN Àa001i܁Ț$d e|h>C #2?@/D>03?Cڵk{=,iq. ^xa"Ν7|S6n(݁7 X%3ipݵ}y\6lH7cg$0 /ȍ7(8*k$J :ķ~;8csϕkFyDHiӦ%SN "bYH}~NG8w8Gh={^6{M;/W.<<İ(1.y{kX5*Y; ~`Awy>hbD>0=7y~iW^ye[_uU։v= iqw#ߍK.MCyLƟkTpI鼓aӕ$2]wdz-116  ##pæM$W6kRAp4 h0`0  @n0i˕y(\xҳjWr- 3?5ëd[8}8C }l6p*Su7rEP[Ol|nM\CmL?&V^z)q- ˔)Sl=E]8Vo<yͦNa͚5Ig',rx_T.;96ۙ$Y섭?;12166Àa ?1`nnc& o͍Ҍ6Àa0`0 e N604]lO 8|W/O}݁;3`KP› VJxW{G GU%p3i_6g;O9X P=ˬX"nl+t-Υ^:@fXb,vGΈ-adW4hKqzo9zN<]k/(X˰rğbzXvxb]Nn馤=>lY/X>un O}Oy'KGmPq.Yq{##Àa0P07K76b F<v=4 eÀa0`0 vXj׺faa0 1`nUIml|4[ Àa0`(< bt}W_=`Exe]r`cJ#;͉\ \][۞]Àa0`w %iտjĵ- 8jm3Àa0`0 FGH}Dvi r$wlyI'gb{gzνGtupm}1<Rc~noFjl ǀYdTfGïpi0  ŀ/nGI$k]/gKr;h6։X c \]Xk뫭mÀa0b` \\m^ \c~n\gϨa &޼ nEyo#jse۶m5$>&ppA q;g$.;2ZLKà~kjj0  e.WF_&핥Ka 1@;Gwo?~J^;v~Eyo#)s!z%}rm[fkgJ>~-FD Àap1`naF0`w01-Ξx +$. ~0g0`G pݟ9 qIbc D\=f3 c`sh(f #>loka00V1`ab[,vmxu~ -kh0  Xƀ5T? # jr 4$Io#Θ=;@1c}w162&g g8Kp{.4kmk? Àa0`# ;2Bp. Àa0`0  l1@" [wVlHd;a.4\3v,{Y0`0  0׌2Qi5 Àa0`0 $2]$2]w \)[d׶P6 Àa0`0 F>'Àa0`0  @L&M$w}r9 Nغc_Id;a.4 [ \0mmmq0 #ajÀa0`0   > kIÀa0`0  @b`׮]ꫯ^{쑇~X:ٴiS̬Y>.zh L,8=O&gi.iK>; / fl͝0`0  \`ӌ-^S:jco0  Àa0`8~;AM%ZXDj#E~;R8Mv΍Uˎų#U+VY$L,8 %M>6 gQ]n0  Àa`07?4p޶mۄƈbjA¼ͷXǀ g'K<O\^xɒ%j޽o߾wT)R(AZZ* gY'tDy)$"^^s5zY 7ܐ(-mLhTG[dW%GXDַMhysq;"_ɇ+C伥se #57y7CnoBx \pFඵI_4 hHm0  Àa ﴑ}-X` #ژnQ\|r93q}E ŅcOO@u?2\X%Jp!in:묳POW]uURO>Ȼےp7&z뭄oX[@O o=>E]2MvtMH}29J,M:)kqorH4N(.&k<?j IDAT47>ꬍcgBNh4*7 q;ڌ+lc綦\`>H_W兾諭0`ÁH 2uܹIhiO$VA ȃmooo":~z ^-W_}uhMBb%v6= ,^\%t4"zO~iax;"ȳӛdErdb%n~۳i'kVnVyG$(H^O B]Խ٣:J9?A@?z5{G$7X\0P-%;YnV޷&%^"Ky*[K؁-I޺)SÖ#VI+ȱ/X&aF<]aƍM^OHdg|mtk|r30`0  @.0`nf>~DYlF <=o]b}}q3o0 Kࢯ3̑kX>/^,o*HXjT?^K#J]̿-rCEwZGljSO;˒M4^"cUWDy%Iy.y'=el'ZMx_hd9y$\SIg\:wttF&'$2u~\chyFxSeM3唛g..0 #ajÀa0`0  e.Wrn>~Y_zPoa۰?vosos?V1%9=~y~y;xђ }ꩧd&M5mO˳>+GNu|f+fΝ0`0 2M̧'khc&~m 0 F\u~xOA2gr^5i^x!sN={v .[,͟??'=SIݖ_|1Ǯ]޽[NNrlGB.jIغɕFO|uu⿟Xh_2W/_(k8, R]2%[iR-LeRM~;aNLkz>-On쓯W5\Àa0`0  9!ey PpF4잶~ \]ap:s.{1$С4iRP&pY… e޽{?wDnGG,h3:&lF"2]&:-um KK'yEۓmzdErd &\e:$u!O7_M'ln:%8=~=Ofn;;}smi7j뺃] cٻn]Àa0`0 #;`LUmsֶ7W4<;ޞwsb'l߆T "^J\sM #MAj䯾?Ù%Jx s%Z_tE_~YxJe6m$Kkz!AF:e~g\9^F9~xD> ْ /H@r _tkS&C3;̕U+T,5iKyԺCqHYF&#\_u~gFfIwƄ0Me˷thim2ca0`0  c6ZM-:kؙ3;snϷ͵a`lcKp{6mOdM7ݔtg?~:A|BDUh{u]r?*_uŋ7HI [裏&]vِmA{.D}֭[:eYgJK^$08w=Fwy]K/ܰrH2 Ap}u b*Y8?*$^eh4 eÀa0`0 \[uh駟lvʴiB<җBiw-#24<[i`{- ʛ7o+VHwwAy]& ly9{ڜaRl%1پ}I,u [waڛ˹LƮ7m*w[o >.~Y&B:akɓ]p@H{割!" ;:dgg|/y%cq vOO[*]l |\?ߓ@&U=svlkϞ=u]lq6 'O#ϡ:V҆52ӧȘ`ΰ?g>I^Qxq~?.֭<~,DOx1H\]wdzcc][s -Vxƒu޼y^{7˖- Gnٳg'^Y [ٱcxtڂ:|>l{Qo%tɝ5rgW&D^sшl[ag]> -[\N-;X.6ZhzmJ:MgW,8PYSM"pm 3A0`0  |Āaɿq.k6;17ˏd^P .=S'N Q1< /`(vlQ[:rth8.?;Uf;aN5斞zܹs[#gԩSeҥAxz>XLXLzcQ뒮.l uro\g~~.4 w?i7W.;:yǴ^ g) o[qm~-[di˱v#=!py晠t۝~M48gTcn#|dǜD-}VSN2Vd$f9k#-Q. 7wU ^ť t wq&.@}aeTNoO"gIЂ\eX$]IjBV0˰>Yq#p%8=~Z6.w.H"pّ\=va m3  @aT1!mmǹ vG~pg)_~uYgZQg0f͚ ʞqo9s >uNg}^:vڠp.'Or'%\"A`::f|<1uL8,21OuJ͛7mFN:$9sfP\#pSғ 0XOI̾+[f.AL^m۶\C rJyW/`D\IntX.q'Qn8&\2{lܸQ]+S(vB'%]ժUmI2J^dɒ~ٴ48go9Ilukcx,*Sc]r,Wr_+xr kVuB]NᏗjyʯeraV.nLޏy/^GYx³[#'ݥJ)pqNefw$ؖ)~^_4^,בO}'i_: 8&Jt-1Aμ:*i:C$dY㏗_=Qa@BǴm)fCalw;ؘdK~S?>.=T8V~8YΘ" gjr+ XW2:4D>P¶PF:O90 [w͵Y~s[?kÀa0`0 r#pG . p$p!.ΘLt*SLI }{ X"l2ʸӧOP[g.4<VYw.5v4`I3z. Ư暤`(7:lC N8S?2vېqs-CKxo+"M5A/&y_ -#2mn_&a.Yq;2ݱԼ:Mz|W-H\i مv됳z/-/d,[F?N~W ϫOy/^*/ev4SM%ȗtΉu-jOEJmy\/Ts=UrV9|DY6cjLu WI25Y0&fEVF:\1 [gx>flפF%FkLK`>zX0`0  N]m [([DVv޽{C2 Q=S #3<;8 BR=XR9x>쳉0 {N;-, x0%o_$^zi^0p 2F~t/(څm6|́g裡dPm kgi48g0\tOeSW6e=u8)ԕM}OΦl{0,ΥEfd)8v$۽ x>/J9ϫ ΣlukFٟ wX\#~ =GW sk?39E^X6,[(c;Gz'eҩdCdvt9o9]̙#HEjVIj0.擨$x)׭[xtL:CdSW6eRCׅo,x{u;vӵdgzD]Gt: \> ;(1KnLmmme{ͭL"p3|80h[m,m, Àa0`;`LUy6 Ϣ#0gA]% ? \QI*C~x1O˟' =Ȯ 0Kr fl㜊y̶\ t֞o8f>#dLl3Fj|X8I\X6al "'/~ cɆcw"pSphPk1=3xXbe;knN*9Ymy/<6`i9Tnb!p[@:S .4 8^0~p7uLfZ{?7{Jg>?9uՍc\}\6a^źdb,*ݱc Y^LvaWe\B[_ȦX̉u^M!a<"UIsh_˃-ߏʾxi\nU_*8{Cxׂ@F" +H^Ņ2ZDy%W"%?5ijx$ f{zZZywZX'H___?ޫ7,|:-Yp)R$mRi,Cy'y ?\WYϞ!7rIA#駟00ߝH,ˆXW:(˽7/zg{AYNY9L?Icm!NqV >dٱ|4 hu0`0  @0i{ddkVnV r1A\w3DɊ@&pt#PaMHl{钷 $S©Qz]^ڭhIW IDAT''W.mv8zf0y01ݕcws!>vVY\ՑH dWW-O%Z,"o{d+y3oy%HWDȭrrsll+RuW'/L)O{8yIwDX#OjݽUrä&9_N+fMH[|73 o/_8F$:TcXD:XCgT\8Z& w.tJC3?SLt5mD+ T5i<$kX,4!Y. L;,tJ7l%=pSLɍ3=SI޳?OT|5A#h0h[m,m, Àa0`;m~'{T4m/tm\N.T/&#p<`@.[]a$1=pb{9Y sxy_lFƖ $WlKQ'p6HL ]|8u {ʝǬ=G-3[GcR-?M]WJO\e2B=лۃ:!Ya\[!Q;8%K}Ƶtuu^`Lَu-B❎Z7,eNI]Jw!ezwx&v0?l4ޟeC΢L&O޳tTfͅ0 Àa0@ ;;,Mi ٲ0bN'C&p/ r?RS  n> f\#P. t%7=hoq0mǜFa_dzlhz=yau#;:@"p:nrݧ;.~n(4۶DJdcx6Q/I5=VG[jD+cL1=L+q|U"iJ4HCj:A\^ t,Fnot`?a.t\У3n#Nl3\դ Àa0`}.>hI۷'ཱུiӦgbb. L<Jj]خRׁy/:az}([,X/Cq.Qߩj(wrJ};9%c2%%hpMuý69k3Ce2 fo'e~kZx5rW/&g־/ HWeQ /Y7mH#_:yț~-ʣ?%m5Q0^1.p6z, _8Ou^/"?,)- F!5 SX=:aJ#ͅu& ΰ^XY?Tm{#uw @tHYBb,Iv,Q4Lt.e$a0FFÌՆÀa0`0 rN߄a-Bz H i셁wބ&p9DzXY H, ]Ol OLʃu\#P.`_Afϙ3g=nqtl?4esE(3k.arsc l8Xp9<6Xǐ9s̟?_fϞG*w8u}5 TxO3.l@>=?s r$fY$Kǩm;8k%b˖-rCug#Id):ޱ  f>⚔E[Aj%OR^*?(Kca\RW輰:4馧zt;tXCX_K0 ҋF؍^XWp^q΢m A6,xYpW-Y"x/}H}<"W A}ˏ]ry8VDFTʃG~VЁȽ; \?A{OGDh+M㤩N뤵V5TaLxjbazђYؘ iAֶ$*ICE&5iU bK&1fcX18oʶ2Y8N5L ii>@޺-L w„ o[I1# yС>%tiDyn:Mj#qut>pN4C{` i<ދ.({譣5" ^J=kxٰaCR\=[#pزpڣ\.Xg(o$/Xae$R尦;Hkřmy_M2=XR??p}Cq3˩s&vLٱw !w ?؅:Ympۮm3 ^ۼ㾋pϡ4Xid+%U\dJ2$buuƲ(Cҗ:m0񡑛m2C0/Ժ SqHFN:e&Q/,/,MzŸC91xDd)cA[e .GZhkp~J_%ߍ^e^(Μc<"8x$H #A< ZH*V&yn8YlmW"o{$'+mg?=D0P / 7xcO˚ Gl|&N\[[%cTx|q[\#pGbm{d~z"R.HSnq̥Q2#/Lԥ []?7H\iܦĸǰtA01̧ͭtXOtc})cQuʺXld*]29)b-rW/{5?q^^5޵?:Z~WWǪ BKWM/O`+cKq8/T~^&GKX<g|=VO[;-岺JNnrM[Z.TȆJ0A:jdjCLih]Ma˭AԒ,XIԒ%y(%HX")J 0;ZJvWD˱# A8 w)Y:T'-iFeኊ=b<9qr9qj9qrAttfn |Nxu-gzS3u2ԥN:eXNK.9^J=Zs3?,ya$^]5,izaF\\rI?Wxow5N`.D62  Àa0; wh44.&0RisO¸VVlE.yV]|=5 O-M,B7m/}ƬkdO}!a}[mb I^2W. og{_P6\[ gO̱m.s fn{e;ؚ:XEԉrپ/Pz c߱ջ8PGK8e(k=7=Vw H%7Wgv}>=_OlWOMZ?H dAdED+$@ә4G9_eX?$.~=.܉5n%Ɣq/1]KS2ύTyy3Nz(N3N =Wy:OhTc]21v޴5h,ʵ^'U}Z˩^e^,?nul 9fc1G-͒cZ!7y3gȿu(fx aWytݸ~bx-^8q/P, ) 5Y*˹Fvx!!w(z[M։110K&0Mo 0:]ZstJ|(c,}Q'0~cі0RҐ_gs9Vׁ5k,,v޸\/^|EzS X Xx PuÙrټ/X$ڃ:>k!vj 3~>W^lC N IxPq{Υ[&/[,NvfCi[&8?jRګeObu0@B,I_EjDz:|H=Lgtr:|Hbg:%uʜXl5X̌ua^kcAx gz&,c ٵU/c5rW#/?ULKd)Hw-5JTϊ|nۂ}+~3"u6xxZqrAKR!k~JCmxAXW8 п 2Zscxg-=mAtF>"M.)?ˢxgl l obx^Hm],"uFr9m,nqF4M޲alZL̙.sȂɲtdYfxܚ@gqJCai',̱f%/]qtf>$y1ݍ3ҭˍ ύ>J.77{?7(ݺx`:8trazqKR%[x`::^3hv.% f bÀa0`0 ;m~Oh~8 G1:z@jE07\}A,JEVg[Wqa(G06.1X=x0;XK,Q4ߣgSv 5k͛h͚5}&}ډ?`=zIT9E]V3xP65?thĉSm.lc}ttis0?M" 2Uq0D+%"!FV" uպ pq11mßX߆p\ظظ\rAڢ RIB"NOX0.|%bYx|^CeFy";ࢁ$T. WߍO*=Q.Xvu& tP1 IDAT^\QYk)Nk{dW+xU/{*$V#ƪ>J~K{J97Z#Ox1_*/e;[#"m/xvKīHG]>ٯd,Cx~{^VGo%r|S̨/'5Uȅrh8l]X%7 UrWRI2NDobn[Zli BP1 b$+3"x%?ry+"TV7VɢqrrsEp&-έQ[[S#-u5 RNjkk.zR۶!q-=f!]<I0K q+ac; VV ϶69:˹?n/ dQxY8A&7cqc$Y9/-pr1#3'i2{F̟-ʜ,+L_$s[}XP6$D׏{"{stC&mzu86 CK:(S1]03rZO**uPcak \۔t+ָtZ]|u#JRm e3&1g7  `6P.l#$.$yukFW+7x ]<*{r7^.o|/C<"O_)\9'+HTu S6 ^#s-!YEd{Klk;KX|{D^gі-erDcllS[**騭e -q>mo}TWWK}m4osLRmll EHzBg҃$P$-[: *>:q0HN/ڪ-˹/y9V"Ҧ Px*cl9zHLo~rء dvQߔvNu- N9|;WLy3@\imTNmsڶRKesSX)k+n4͵56𤭩 .zՂYK6! Z;KaH!̸zn9nH?XyN=ҘС$91>Xi>Dj9[[D6N6l {p r''\۶mKHߺuk[vAgc:ONظF^D9Dfu˂17=.sʂQ?[2oz,#O%ʖMkdْQdɒ>.i۷oN9唠G}L6mA#ǒZ"/7ˤ#e=n3r3I]?ҦO.֭ -SO=5Cr=f>tp!Z2,}Aix/J81cƀU_$r3U\߇a]uKn纙*}|#ptgoÀa0`0 5#oF핥KAGHŸ_l1/[&cEE>@"̇Y䑬E鸠t萬%q6f0Ld:%!c%u)0ΥWX{p,{q=: mn\ʙz// I4:%SIB<]R>ʯc<"@~/ GCt}PYJ/DS$QYARKc0:V緖 ΝLni/K[r9Li PW+d[륭>q&-X+tO4)8*$XKN%|ƹy[4,ܾ!% #m0`0  -iޗfkB/`7Dp3{!͕RÀa $k:D.V i Rzg:u 8\N"i c4Ca4J#G: w(NNc8<%rHCrd9BVDd~MFX]p-Κϯj9>l<%KErE΍~E9_l9 O2y/Vζ߃6DjL oȅ-er~K3"OwEގH@^V&;ZR9BfO0^fԏ ^\幷}5ϘI'ϙ3jW蜻'0yp|`/cl/l l0\DH" Dac:RiZޕީ>_=<%SSIȈLkBh٧ /JU^X eww]{`u׽H^O^[ޫx`14GQΡU u|v.7`p𖠔O/𒸎qlױٙGcq\߶31,Ts&r6&TNfm7ręJdtA{v\Z_AzvXHNPc#Umܾ{nyTZuTue?c{gJa;\HK˺@-A+hO_n pUOͯ,ƺO;ey٧e{ ^2|n(˺jS>UVvR{_^}ǀ~ 1ǀ'|}4^s<1hmmMLD'a3ϕ3W?MRҲNꅺl `e*aj뮳m*52-,lg]m,n-3E\B#EPׂQ@Q cB\,j^r{q ǰbG~/Ov(k>x~ ڰqD8`كtcOE>#ז}zjﻢ\_1zcz6#:Eq8C;}ӧ> kx!xX*hjպ *լzϗm *vez >o[־uɺ[>GԾئ.O`tiL@e$f'Yk޽Ӕ?.^QRu җoelďRk ۝%4aD9k70ed SeBlՂ@`JAT&0(\;rk+ZsyLoyt9(U.h[XyT{o{}*ylׯ{owP-ӗ pu;_UTJ EY&PeʏMҪpUehYWP}^Pw^ksXcT-~eRH0`ñ *{2u>}8/$1l?c?c1_b/xkdBr(~"+qyn1ue{CS NqGTRKʴ1cxqf/h+SU)_[*d_G^|^"ǘ_ jM5܇.83ǰ2rtІ1|zNSwoZI`T~ h [7eʪ -TZ|^`mveSP>yTjW+|ծlX姮7! x`a#\ -{MK,aGͪ( lYW/⏪TNÅs]oa6$*Tf-&TJELlI%Tt&)LmTęN<.mԱxS>a _\yayJKj\^#^?eյVZ{j{~5^~5kײ>_ p Iwr*Pv>Е=W|8j޿Z{RV݃A};a~Q2rZ ~o|#}BPf䅅yoebz~ 1ǀ~ c@;G?{>77'Zn oy~^_q/~1<~T%/yɕj`>XWe4,ӪS~WYވaKnp7pΝƯЇzS800SL;?OHJe$lh#xq_}~?+(>cU5&@Uo.(G^njMZ5^A[e vEn^*ڛ}>pG K@5:$e NS==(Sh{|=[Wc՜޺*{>c]?lZ`خ .5=7m̮[ VNPeY&0UTthg1]IP*rmɌrF%omTr.nmLtTu3r5TNOf\:6Ksq𘸱2J)s20`ӱ3y˼vuu=U~ZoW1OY5[Y>N0a&a^HKX>xxm *aYű޺lQ_ku-]yj>e}U{L<!}{ٮڽurU[w]+?1.p?c?c>}^x/kD*VS^?,ύ+o'߱^~l?xAVY@.Z5F²Ҫ WZ/n}/7u 8]Fܸ2i{V 1#x>ttv4hN/ע%:64'ղ}ޏ^_5GzTReEc-pwzTRyh7G$:wE&N`zO`v -zUTvoL{|KxCQ K,exP` QmWU}^tq٫>ejW|UqmWeuxOyg… rox־UPS[x@cZK 6ZhT ӹTϖ9RDΐ)3 Bۉr.jMP?)׳}q_܇TzկK>wEEKBR/z@;ڇ׏wFze6Ge7{qc`#8;tT:9UOIDO_Xj%<_{' TWT^]~MF IDAT<9Xu dG2Z_eU|,I\PK6QPZ*[pzwpQDPf Y,/ZjVUTf 2rTZR7kt˄& &6&gXoKou<=#,cqcUVYRRSULYoj._M]>շ%慬}e]XZopUXeƱ+X^@j~?k㑌U\m*pY/=vkcOP_/ǀ~ 1ǀ%Cyˏ?c?12YAY2AP-ig1qVëAfśk%לیckTR9U'S 3q>-)+A*g^+LaL]l"e>Oy-?\n^+(a-Gz&@adNbgcEbӘ.PLv2+djJ.JЖkژ(ؘ*bd*pTZ( LL.- +&Zbuy <,cU2!:'*Z:xAe7_+_-w-+?vqWWWaĥ妠wvb8C061lSuoXUWP~w_kOu_gUWVSջU]ͯ؇ۮ.4?S(/}//}cя?c;|~<͏O?c?1k`j٦({P0QRU5g1,cX0*46:(&qiM0~CćŀLO|яox1PM9'oJPf*\?m\=GB\]уzp?^=֏׌[߳7D>k~5+צփO=W֥mAgfGC?})TFO"1204tTz7 nUJIRv9_R)XP.xy4ʇGc9aޱt7|37Cq{9^{ۼ1J L{lic6h-Nc`"˔$uP)ڶ\6ktl@kf( \ w:DtD^i+;,'Z:=pr=oG>?G;Snv_cqO}JٽOo]ňjSuu\@&A'7BNB[UW)?V2X0 boNks.;2r)Gh5onmD:(b%P-v-TK.-(lLK阧ee*q-Qjs7k 'YX rؾr.<uNTs_n׃Kkpx<)녪z)wcڔnyQʇpWgǨ)=,68Jҕo*zjg*+UW}j׵LSKK_8c?c/_u?&c?cĀkH1d wst >(n4Fq18cE皵kA8o6NQ~JG9Gew2ձJk̴,?te?նLU* EjLV&ǸFm-և15cxX^`v Ac9fSA{7UUzc[ֽVY?laG~5D]w݅Or'?|3LKxJW1/k-xx\Do[w]IIURqKŽ&޹0(_Cf k9tp#Of-:*YI6%-O, t&JG;Q_`*S/1NMLlLnɼɢJXo-fk<c}B\ Oh'-5Ե8̪k,{7Wm^Z~4渖}*KJ OlQc٧g]ͩ9sX_>C?.S(+mm뮳6Ϟ={}P8=xћx_ԧ/_;p}(_tϏ?c?/1\CyAǀ~ 17=cD4ƐөBğuc5=$S"qcǧD?>kMI\G!8O|Bb\>|D ˢO _7{*Lg9܋zh}򘀗ZAý`0އ0zX~'؇C}qb8X9㰆Oa '!O 4[f昊ZǪݫB[ozn5+h뵄^PY?O+|몽Z|Qʪ몽Z|Qʪ몽~Tmoy[p-WO|;ڏڻ-7 px!6ޘSe\n*E2!'jȎAy>ha\j,f9M`@1o,&*9Ղa.5P!e]K(SuK(;n9/0&[[-ZnJj+Shcw%3_h>]ʅ<]y:k}MUkڕUc몽Z|Qʪk 3 ] M{6_}]+lƻNZowNVW~^_1}>Wkt-0ծumw-mbQBZD-`U\K..Mo-%7q_SO>.//}~ 1ǀw {?c?1`:^aʈdD3bhFʈfaF]GjVq_6q9Jc>(cb_5B֯S >o{fgGJK-7dMկ~ຳ+}WуOi=p^7֋ J@<*le(F0|1tO#;&7-jST/ui i@A/vЋlΡ=]VmaS}eWcd}CW7No|#n1r,{;jevS&H?h<Š sssw/3xt/c9GDž<6kZo]d |ecK(+h+y\-,Ld%]LTNZ7*ۊqm``ha`ZHH;IEn>J﹂3%5类Y*.4g =W;?㶕s666s߫:zu_C=-A}޶mqT%* Kꅨ  җPVQs(`Q V+Z5FYէ>yNyYV>ݶƩz귉uUVV({PjSVz-Se>pc?cG%?,~1ǀ~ 1ŀ h0^#Nm\–Dшaoba 1L')@>"vq6{G= 2]2לU)zpg9p+_=o~n}6=g< _}&=x`~_y?g0 O 4/<)m=iOõnOӯrֹW^_UWPP_wWm~*w[5ϯگ/x_gOY}{zz3?3,~~ +__]9˿rgܯ:NeվT/<< @/Jm.w;[oc>Ź*e71՜jA ۂ,SK5 o[λ f s\ǖټRR[-[\EMkV(0YڸT:rܳjslf [y2㣈 bϖזz\Kw*w[u[Σ9Fs=޲jxC?~q#ޕ>5<߽O5']˵T>լW3y*5Vrxq|qK"m#k^j_??c?x<Āph1ǀ~ 13.y=š´U=qI |߈x1$ 1ψ~|;1qJ9jیWb~ܾ!zE*%.ոLsqk~ǫc?) j>Iᆬ^xQ)*%\($ɧ0_`T2Δ+8SD38?=3gp$fbfΟ¹Y,;sX,3sX2jKh,.4^^AVC^Gf4j tj5kut t+h74h6WЩJfzoЩjԱZUUohyM9g} vczSӮ7v}zMlXFDzVXA^~f{ moֱFKBۭ.lְsjL bJYU[!25)Egt9_6Q-TsSY\ \Trpa5nױZ`o{{ico]^v7W;nuՖwok 6Ve|X>k7[3mf ֊|>6>%\D,ɭ"jKyX@}Fmˍ%z}n+ˋX^^jˬ/`iy^,EԖf,-a~qˋX^\Y,I9'g0?.aan_f83Yn <̝,fΟǹgQ"I!p1OO>:bsd>_>^ǡ~ 1ǀ |ۏ??c?Z PMz3zJ& T(X^6jqGeZm#=9} o3\Sf?>l'|+a !E?w Y*lf,*E,f.zqыGn>@95צ%1S.bZ2OOba,fϞIVqvbg&pnrSg$;ssX=T5 hc+ &6X'Pv dX%DmЮ%-_u4 X5h4B`^+ 4%]APr!K0\hJI)᭄M4qk.X%\n&ꄪ WVmIJ&\ckJvl tWЪB>`e_PDf''rZVS^jɱ<:8f%DKĥu ~/oc$ е Z#rA%yk/np2-56A-#%؎86?X.lnC5 c/ܮʲm]X6VA6-?VZ_֚ mI¦Uo&6AF[klB7ic} 6NZk;.#m'>hs\g|F!?F((^δM[h߃;SˏiШ/^K[/ʏtXYF}+7X( IDATb 2K+X/y4eeI[[Xsy,JhŅY,/aai 󄸄sX^Xs X?Źycqvrcafs1{~ s9̝Yb ffg13{Bzֳpׇ%}_2⢯&>*iwЏ?cĀpKS%18"&&&0==xnߕu|!y߷ze`ŷ~|03?.۸{!IœM38^ULc2ǜm`QQ`a`  #BcaGaŢ#QE`E"pb0CZ7t8BJ CG\$DLڤ01$n± $,IK i dDLK&e")t HBCB_G!t GM)ݵqօ Gh`& 2`[ӐcF am݄e :˄ik<ly1Xf ܗ2tB\ օ%bcD! qMtt}/6LX-4y.Wnf e n1y&cl )c!nmH1ض c;a 7 $ cc"a[M$miΕHT\ А:$JȱN$O%Ld&2rc!ȤiٔbRC:i2MȤM IBF)#2QHg 5PJȧrYk BVG>c5QhglTS6ybD[DFC}Y bB9C5#iYgk3e܂DD9ǹ: Q;:(L]5t@%`is*RFT6iK-)е%" \i|<67ŲhcBӹ8L]1hqL9!1US*%Wg &&\wdaPdhRJb\Jbiy23m\<|27sW IL($Q-RDT>Ss-`c(Ҙ<Cq q>{s}Ƥ|Lp3E)+*M}I"KhL3Ǥ( # ϾX#(t}Ek!bQ("F1= M C!AD"Q"0b±1DcFG! ":xp`qd at|1nC 1 0 at6LV 9ٙs8q8wUxK +pE?֏?c?P1 [ַy<רZOTp}^?'Wa:_t KƸLe5jo'L_Nq%N5bPA.q/2Fc>h`>n_Eܨrً}زUz޶#/w>~>uoxW){I77fGqwj_Ig'|Q%/.s `)N#G\Eǁ5>&_`" C' ÎcH dP&L꺄Ihj!cd U K G趉 HxH2i mpl-]MMӖϴ$`4 t-m/m r 9&, :ᧉn&D1&!cZ/ K@ ݀ij09ٯj2?0~f44YAkq8"*cƠ[0q?0 7yotOOp[Fz…OZ1hL uM y-yV f\Hț5t4Xq)ۖ0`Ml!2ai#n6K\CX~vB߇15D@ʱq4)@Ht$Qr,AnB>a"בNYȥ2q!餉AnZG:mҐN[(u21I(ȱqdB&RZG&GHeL5͙jUTɚ?m2ճ)ŬrN'ecМڼ.A/l uqejdYskX$31E[(-&dƔTe㉬oJ,׼ec_]WfmL 4JKL\!<j`rAha:G(k\b;a- <UXM c+^v0A\jWRcs M c`8JTNCh -[(ٞ™)-'p/4OI:U"N\KL钅J)!DKYJbȔi*F\);(ٞce߄L;]-%1}Ө J ym%1YrP$-&QblBҷd>)W)IYy Lf(RDs iKewRBR p s\|JB6!b"q um$Xl 6h4F,B8V1 !x$Xx(Ƣ!D##4B,X8`8X!o" ƃ#1>6F1`$4`h#Ƃ1Bo`# "H%3(O1;3'N<>$5nj~}tU/]}ǂ~ 1ǀ~ <%Pbm oϝ;'<7#ϕW+oZbp6op54^+N0fqi_g U^bL]gY~{1?k`G[I>pƺ)v[ZnՋGK9sBwU | MS E$>КI9W?W9^mEw5Y6Vt INMaCֲ"TԆp#0cpbQ"֑ B HQ%+,dGڌIК15M[ G.eFFY ) KYBЎ>Mŭa&҆ EjY %zIS6., 6DB`V*n↫%x$`jT]BP|h 5qaK`Mh.u$ PJ5 *U VuU5>uշf@ WK`˒e}M*4BZTjM*h  nJ^TT3,SM讒jboy-nk,Bay]M Gb[^#*!)TƩx] Wa8 8TRm[2>c"ǑǤ.א3#LXRp%! [{ILBHu}\@JlF7)PH$OkeՑK(PՑ0:ՈR(f,9aTRuKkBEjFȵlӶ|`:j:rY*ouU2LisV% նYC[Wo%:\;w"d OK(̴\ߖP0АJɂB'sn*Z xezfڢ%urĵ0IL(#$|$qq46siL&Jܧ)aL\6QZc B9FOr%73շ2`Z@cӘ* JXcq3jr\} S'N+ CK)YXJ/Obbβ ^U uy-ST˹RӨl:+TS[HJlF09IJXKm "KXDXM/mlFBa`@(B1FjZBLb[~HD)?K.M'Q%P&QH(n]PuqKRyO&$OJ\"L*,&&$2)o3+~mdT'wlBGw?ʟ~ٴav[>[#Pv35|mmF`YJ8kG`Qm&aTR}Fhcah=G4h$X$Xd ڸh$H0"cD cP74pxL*rB"L;W߆6D0;*m1  "8@ B0@pt1 8PhLBDg>tZp~d?c?cQ/女B`ϕs}ÉS:H1$ 3 GddBهQ ħE?nfq21S~M[_}wV R|;#CDzk~-S'{Ky8-EpׄM|a >KQ]ޙ޳|[:vK[j[ܱђ&Xo&>?6ыx_s$fg1J MSJլ )Ҷ.AlZ*fjZ]- 9n#K_ӑ6Gj Mw\Ҷed`pA,S02ueK`1mulIVrTR1  $d$uL+U1%yZJ))@[RKjS 4&T}j \>4v kRK`h19^]eeW+[LM_~V62!NLɿ \i*\e'S!xtOho`;y,[@Қ | y] {y&յT*ST:.uȖ `* L%ХiPF5Ce.!a6a貏i3(H:҉25tʆLI0l\ ITR.IZ&MȤtĦ\Un*ތL\\BN1%b)L\0}//gH+Uis z fmTr][*qKy]9!UEU%\B2j&&Ynpoۨt` T E*]e`*S"x K TcNnp mL8֔j[%ecڲf.S%EٸTNRZ"Pה[NfbU -RqBQ Hef~-O.s J.`pi7TR*AoYofJc*r]0ʴJxnIFi]D$TT)LI@սK%nBZ^*djT(I@L*+*x /i^HmM\`mi i pE*r覵Qʥ}-2KNЙLӜwP&]+Ao%*!AƑ0}2m07o#Kun) M IIHʚf- l*tcU8R)[:Oo1K.Sg@qݸ)ɤсm[p!Ln!eJx>o?aFPykaiM>0֢04f9ТsƍES d]b1ĨedWĠGv Xa q## !<F$2*-m4x8h(<!L;N5(B BADR9" a,8aC#i vD@(!n#QG1:0R4ffΣ>T>_>/lZ뫽c?xbĀpE?7j'L\ py~?9ܿ}~H1L41!pmڌCՈ`IE-ם}8C222S!s4"cr7n*/r{!b@*ghI.Jz~wnm\4=`;֏[r!|9y1|;uqOvX*n?S2nY:ϔs96Sƭsx\.-ywj|]|{ -|6>|an^x{%|ѝ^;YBr4:K?AZ& @dt^-8E`-M9'Mdm[tt8r)\Ԧ*AF2m"5,_!t]X4%O L]KBWmGBZ*s -Vk.Y*ApɔÄLgL.ULC%DkxrD*`BRA4τ5 {5wNFp!v床\ׄA+\?RKhkVUrЄ2LndH/!\KM2\7䚇ngX?TJ4ԖEUkL %x}*ob;APkۈ(mmakXR!t.%M%t$5Wǔq0cJ$l’P'32TR ͹mvUI*L䓄H@v?r6ÔT ᦳ:iGKum6'$Ŕ׶D1Nf5P+/PI;2r5ȵBfPZp ]sZ޺)\ݬIۢ\H+-neUӗ)- (TҺYں!SS15b+T]em0u2ۨ> LC,dckK.&_` a V9- KhkupeoʾT:.SSine_Sr^*X閯hf ᴻ,שjͥUT&PR1:S15t庹m*ri }9L̵rօ̈́΄:(8-0ש-rP؅L4\/sg$/J`@5F!D%(ZO-6ͥPb*oVf\| EZM5o LF镳T3u,ӂK`ˏ&r߹>9Sy,ιTF˵qQZF4K"&0TÈiRkDbrƍ#LrdLڶѐ\7 *q1E+qCEgxcA7ur0<7 5׹t_'f{yxi޵"822 qHL&Q&NFhb EQQct_( ADZ<5zpԨZsMj]ZתU5k@] \@njVZURSQ|SN?EO{bSP>3l6!Bq(@91p쌁=Y]Y9s IDATM 'o,a.ޓ7Ͼ^c3vtD--ݳ $.7'괠:ƚ~5n=:XAC}AK5>ح;` ]V - vLp v=|_&_O;[uImy\s%c`a`.ѭwo}?CMD%n<"օK-ظE|27\mBIhqɉm?M|Md 06\Ḍ#wcic3Č9]c*1S%67(~VXL[ ^)!oX\2q˾_̹GpQf:#n\@) b`1˜tfc~j1rYL-xL3u-9Iez_W5 ' ,O chc=vc\ ~X4D%~zf&vg V4[w0րضl>X s}-uvg.>#ycًq;hC.4e`s{=36N1 V̍stnb+1jp T!P\zX>Ā Eb& OyQD.cc[o6#U/[.~2:ocw #`Kҁ}{JAV@2KmA۠ny."pnK~WضY-ybqӃnv[zn5U5MumuZM5: Ztmծ7Tmjuk 8ZfV`[UmR'2[ZsMmEjUU++jyD,WRj+kO ?.@'BOzbs.(@91pl}D__CTy]/d|yc:3i'~GgM6ܣW{ fw^P,LC wtb?O+=zspuW3^vӾ+8^ o{qp-Þ}4|OuOv}۪[`= nѷ-[6]ojmuymnmлv]Qߥk^9Qg?:知/:W}za'?[?}۟{>q9ԅ睧Ͽ|} [/V߾:}E[7/]{oZtM}l;.6Wv'Eс\$ֈ($MHIJ'6M&iQh &Y(`aJ кa%In$>=ަxatںA.cb@],Hy[\2tKoq,/66P ]ط( ̨%Z W.L3:q $v:cg?̀[x¸8u@Qţo1xbq9]geL`Ћm!&m3Z˖HcYgn 7.\#@[{_әu)>$T}˾xwʉ^xSIm ;G,9p/&.ѨE+S/II(w]9D~WܰKr˶mX,+CYW1qh1s ;bbMLCI-!|i:5%nnwHv!p7:i0dQcn6єb,q7vK2QDsKףּ8e{럥cEK2q'1u34<1s|yX#LZz^'&#7s:iRY/Sd0PcQ&bRb{]:jΜn(:g1j-NY PqY޳d,1u31.=3۩3hup\-:#[hs1/|i}^|c4f[c=h.4 MiKseq3[p1z>@L`o ˍsm}}&&܌dmk LX~(\⑉a{hG<37b\bG%g{M7vNzb=tᦽ=n6#Q:]K}v-O/7nXBJ:D{0ràc$+Lnw ̶wumS҉vnӑ6n[1kMyYzGNUfV" lۺ55U[βȭ\_t׬뚃jUomMkعjkuU+\jI'+dmC6ޖظhZ^.r c(@91P"cmj4j?>dߏu~cu 2.̕y?1]% y#xfye˺̟m]TuyPK;<^'w:ׯ~]cN}+ڪ{m3ܦO;,N}1n_ Q bbIhuز@:w[ o۪o΂} /Ϩ;e>ݪ kv3h?ݪ?lmﴶmzw]ϩn v+_ݭtu+{tD{XݫsաCD^zw]l.8G{sK_pt/tمf~+_um7/Qߠ}m7{/{uKnwooV_b۶yO.:tN5bT$, ΀&&QY껨dX L 2$~ƱX<bKF1Ǿ8a8/=@~iw %˜}Ulu_b~1=1ph,0Jn vm41^ d!]Dd%Ӏj0}(l-(Kd3:t],3(8$8R*ҡ zzm1@uёDr: X ds@~ؾlq֑q 46 7Q-";9܍u`6v]! ͸bզIĬ6`o&2jCap[΁@_mSl[MLr1"RL,Hp,wEY"<8V@,YشY@xe %&č5Vt[iޏ5ck;5äapv]aBxb9w4کY;%hh@m˲mKŽ]'ZcZ5 @ nX_C&ޘ2bbNbd6~\a0|`h&:`6:0 \GٸطtFZL2Px eT@+ʺE%cbn$fW3Z3fK1Sgt:PlX ]rfy:K/󁻀S?0iߴo 좗7w,L[.uJ.+ u,t>{z}vKE44,\bJv=XlEktsgRF昸@\ 5k4"T3bFu.or(z%>Ϭgo~j@KDz(8s<"#MܤA|rFm'nq?EvF@.17:[2sÍyD,{m$]ASD+yczm=tzZ-@WحKƾ4-nnj}[j6-"m4nUo9jTծyPAqUXrkub+nZ3lZЇ[*6nŭR_5 KSOh8x}Lwg?=d2Bd^-]r c(3Jr:YOA =wO5>@ XG~?V}ug@*?uAU/Z1u~WzqWѧpKvmC'NZ@uس +0;}no[`_ ܢwwqzqs>}y ?tƀ^┙e{tKc NNХ]\;AUZ_;A+'h[ݻ& vmm W颋._R_ }+ b~uW ׮DwW^{Ԧ{T^s~m_%7G/Y?|MKn2|ļ}C;DgҬ06piq莵Xc,4 28"r[׽B! ,L?<":f7`1 3 { %cq|➃`ba[ 97.wQݛG]"n=)`' pi]X@_UY3ER[Xb]IٺS'N2}Xs:ug_bEXzjjs4K`eeL$|<Ŭ,vZO3lsg]*fsžoeq}s 3| 4O֣;9#w2۾Av \ǹE&c)O}tXݞ)o`36JO25'h" } ؖ\044~0]LvI3S Ey:q T;brwos%b TY*/|%y`ץpCH {D/n{d]%$a"{|%ζmԥPwav:X]u[uׇۮ۩lnӪlլZD2 ha^Cf]:SSzS֚͊FٹUUmUȚqj qպj^WT|5VTYWZMvm{}Lw-?Qi;M wYr c(9J[ oZwU\˿#Ȼۏkb['_:r.AрX|3/?s@)AK/ *f^t^P3x~m'芠bZ:=hꪠ n6ܭ=?負W{pc,P ;ڦjMomq}VݣMY=r>!ئ[6Cj˛ԍzus~͌/[̤}yc-KnUWW^ݣ'hP٣UbV8 kLL&ȹHhZue[nެٻ^pu[׺ X{ߵk/]o]{-o/?ԁ&r_v=b.n0W:Gsy.<,"98 5SMpуk#'Dֆf8b.Gllh'X.coń%x8 EN }[oi1w8A\fpG"# 5#6.nZN]1_zqs.b3=3P;4{+d[ YS5DiA"幮],݄ \ 2ИbZW.D"O9?L^,\{HSR1kǏ2î#cɦ֙j'zO-Kt-@#Nϖf>:f78IF-YnN0jc#ݘӑK|1=uncuA9\T2[1M]-Dғ;t^ `+IT3cóXcї;DA/]SKg-0wj}}gζ\oa=د@BD;+h\=ށ4`ML=6뛽7ڪF[ugͺl?nvon-(5~^>N0{$}*U IDATO=l_tb~-آ׷v.]ݦ4V"]=^ϭg-k{W5o %^M#ldPW_}X^a@__~xWjrŭoǿ"[{u%Z/tׯz0n_YW_}w]|\\$Ո4,uNHèP884 5 0iDcbtas!^w~l?l~;ܢ?lK;]إS'j'nMk+`}y:&-qC&䏜v]%]G>0ykm>pÕ6} j~mrW0.' ໄL[b[^&2_]xٺܳ4#ʹM-JrOH$NZ-mAj ܍&)GD uҏ]c3aFfT@"u53gc"ö-=n處Kgk? 41=#3i ź@ %*_zoC@*ŬZt̚Jbz@`Ʌ|m[xX1Z:kC"&.ѝK.g13lx[k.F0gwN2ä 7uG 6L_KIJ;&F9T (gLE0=|Y">(L1s ,L3@֬[߈R1]Onnݷ[]-7e3,R`czqjݷXP4PQcӑ )B ;!D$*zF}b>`R _CzoH3b[F9i 5`&m/z?8d֡ܙu%%K r)GE!OǑ@|$n>&-֙ٱ[zogظcNSvt҇ NX..K:6-f.fu:|7kah?Xlݍ96nn1YYzY}cm -غjٗ.ll]t||SVq:nŀ] GL= h<ò.]<4/`/[%Η(dLBtLn}Ab"]\lLDC:]wN\ ;#zN.8Ϟ6FظŒM, M|rKNC~ mmݮKr555UuuMn5jj6m]2mfZZbubVnFeM5ғ[QWʪj:ԓtSb}kˇ7, By?>"c`]o;Eo7go՟u Ke^rJ4]RۥZ#mZ Y]S`1,&#G#,i hpKw ^nJyG[zً n+/.p{ %:˗__tЅ眥 9W4$ rGYaihLm1V,Q)f2CHd뽍8QD.2(lmbYN[mA[-6/mJ7.ذI`ݵ`c&gi Ф5 ddIm]XH߁\@j$CSralZzfM|}ex Хvu}b>kdC ^)Z-1tt'FEf 6p1[!K\rl )ӗbhYl0g%.^sưsMʮ f`,tc(l@)`82;Y.-L-q37%JxݺrsK>Y g֡kXs 5h6,ݺ[똰s@a(`5h5a]نb .}։9KsmHM+1aݿ1u瘹DcZd2Ltfyz7Òe{u3;:7+x]/.y} vfB@^9͓9t/wf%0g7B,l⪧YuR+w}oc֎e?w4b\aO!6n=:;b|sFu<3K-z^ەtчumn3nn[vGm)Ֆ5`vԤ]SMf5[-5 -r;M.!U&:E*M՚.NVuk55kUUUD)W[núek]1+R]QRjuMU[lMzN;qk:׮^w]c(@91T%-a‘nϹk}ILdx"*}K_zooGG4sx߬ϦO>'?vh4<d 8x>r7} ľ06Ӄ拨g N:+h褠uk~zj_ >ԧzKxvhv=O xڣ폓b~;! U/A]:kEnǽZBܗv.m_v-m"ݪըӻvަ/PnWhmeŤŢh(k7J-f6.рxuי{4ŶҺ]& 5w ]Nط_ٷ<~劋'K]d܋9~&ٚHl2=Yib:6ƚDo!%qhD% -D=na}iV.Dҋ!] L\ Z_*}=0{1N=[6,\^әKoFlE %WES1\ps.Q(W;0i`D].}SCM80:ѥn}5"f [k㍀?^*r<;ubaF 5C0A4vQgY^{^[A&b匵,r4%>l6Lh┳}W{f{ ml1SU3?[e_8K߭@73wDwW`,0m b# nH n/rVmi2D'`9ۖ سCBpi?֜AC7h ̴.ۥKN6Zg-2mbOBMXH!DbͲRL\j“ٕDCG.l!waݎ"sH^VMkl~zvp%xuKrh@X}R}8d˜e"_ ceqN>1S@&n׀Z@&-).p \F!綝Dټ$o7sŚ%r 3m1g _Z,PLǢbm7'^mXLw6hlgDls uϛ3w:΀^gG=tA<Mz S8p u 1Xկ+.'ڣ-pvi.qG#,.-&.Px ]>.[m\[Ҿb.1p}=b>:Klzpgaf8 9 2HŚFIq@(0( 5#(5 67PeEDSu; SzYI~䩇IyP-;UŌ~iqÎa,l1\,P& ,F).`Y1.ZD s>] َٹF.vcb;iD:^ \.^kD,O8>Aw|{ hg ڸc)pF69nOwE-ľl ^ۮ4}1}S͈Xɸ GW-P1Fa1O\,*q%H97d_XD)+wȺf쫟jB?xh2ȴ^c}FweT# Z #3c,\,(k6h1kn|i@n0>G։RBǹ69iQ)F.-pX@`/3ЦE#N`bn104׾10Ed1Жei@)f/ YQ`wkpv$E6nmaDO05:k`2ʛ+k}Y֭9ݶ61%xַsLKj̷ug3[u&c1:0[2;in/[Jf:oz׉Rҵ.a`3v.F2]YgD(3MqL]tiK$7c]>\@sw|X |o?fL0]dسq;"Bc 'BQb7A Ƒ\}nT rXA$t3 RS M=d:1Z67`{Q ɞ恙i~b:Ӯu' O&Nen2J]~-֑1$:tm~ۍ9-D(36v}uݠ!xu&cz5 m)hiwmm[o#>&U55u%BRPVjZZkͪ%ͪ5H8ըu6ZEu-nmM5kVeQ~ԃ:x1'/问{Ùq|\4-/e91Pr cO(n *0.mW-zckUӁzk78Y=t:WUYݫZUӫT̜}gK// _>OYѩš IDAT]SN9EW^y^򒗈Hg< {Ygs|>#!-ω>stM7Uznf; 6wituKt2v .Ҿ%FyLbnyd eW?]t!MY 1IlvjY @KSDXY`f.-$*,8t!0 +3b zPP.faS&E%'oT d akZŠ- &ff1iPLPu+W3k>8a/V.qk %јت.rzC:m#"~bb?}:01o3uXAvHb[ 0lh-c[3AZഏEF4ׁ^- 1ḍ bMô$"^"ytX@_lgٮ}X OY1pmL[z@-Ib$˞$5P L"T urEdrj^W\f{=HXz<ш"$ 7SP `-Rtgҿhg2 455D.柃HX>*ӤG1ˀZ┱g'X#+^GZ k!;̴A?("ѴAnfxh;Io"G&=-"sY`36N[b7]4sY|.f kO k&'g4e߳lpb{n"+=C`U*wZXxdǩ둙ήX'֢笛kX$=mP +&,uY\cb\Džݠ ׎E@[-g^[2tgbLp1;h?sbv듑60cG4+}M] wb|'@١=m;P^4(YOOs7h0x՝k:%re:mض@B@AC m_)FLCД)a@xO1ziphXâa7 ?HȥK,N(qXlp)qʱbHI-5bKbqs{Xb6-,#K7X4LQhڍ<0Ty<w1pzm^KQ4w ^K-q uZ$xuuMm7Zضt҃ZrEMmje4S۪7ͼ]ZCZCzEkƭVmW+rY[iZʊVUzI:?9mp*nyɼ[(@91Pcg t!w p+ϹGO4s7p.z[n700Y}No_.uw-zEg.>S9m*q*Vw1{~C{E}wz38u|9 |}^o] ?ER^x/_գ$I.}8<}?l`;Lox7O7{@c#uew[@Z&@.% 2r<Ǿ9[&owx=,]t#M5c KƈE'eYq;S SDXdbcĬt&5cEK-z."ktzf< -,0W}GDqnj̧c{DYa]؎E0fs<_"( ؎MQ-tRg^ S ~¶f>ј=b4C3;.f{pH@v9.-dzvygomfv2׌0̰Acb>-3%5f_^*5c؁d>ݮ'f1cR $m)51|z%1a9#[bvtOrZ~#-2"Ї*λ"."ZO u&]L\zCX`y63O*M&>^jҳ_DZyɞG*l[ҧo},ܩm `>ԝ6c_ x8*x W#&.Q@> umCwn⭺L_s޼qk+UvqznzϛߨSS`q3_C>a8{y6gk^[q;,p鵯}Y ež};ޡ{Ǧ%]>eK8{48~]-#Nm@[e-t2sD&B*; [onV"{3XK"-[m|miw;jYס<ì.*nZ\b;"2s}><ȏq008>}v:9tZ< (v; ׿m)[<Ϋ-ԲfoV'}uz|]AW] EA,C7M-ѽi) bbqQf0eP?àt9OYT]d5Q[yRp*2ⴓi]IGYQtD [/m)Kٮ^LTkG9>4Zpjh^`(AՈμkϙ7N,buzly@uYOŲ_Czy%=D> ӷ.e3ЎG>XcR >?3o=ˌyʱ{yXsl@wla}."~gLaؾl['Mo:}L`eYڍA$5r˱=y`=@A_5~OCeQ9֬b{s}3იH IbO7on7((㛛`uknBHUÖT͉0l^zk6ڐVW]j=؆Y6 f͆U[Q]UVUXl:ī"VT][QmuU+k{Oj{W=Z]۫k'jeuڞZ]٭+{bYWV\SYU 5Uju K횚j9jE8JmMսZꔃu)=O~o-p.r c(@91> Oԅҧ~P9?LJKGSo>w׿./;fö_lP}($.n pi,p:h'~G|@{OXp=3<7(Y'mokw7=zoxu~ ܥ7'=ܩ{t?vhMtq Lv TyĐ/jӧmMo}9+[e>d?m7-WV]ڦ/[l_t_=Q/o;[iSjY= U[O>d}{^W[ښVYٷmz3i۷->y]vb~_=IznԚ%Uj!!;6(N<P$FAa0Oxv`cblG& g{rs>>X1e{m7s-JʉiMer h uVȾ&[-ʉͨm A5ГN_GU{th^;GxV˧p.4숩lwau<:]Xq-#7g)_5oǷoԕ#[t[׻߹[k߯#s::;3Z܌[03C̼h7gC3:4wP󳳚gjnlAvh2kRFs3Vl~vFsA f9YzQAp 4wf\?~jގ:fcAϰ[wpF33{9-^}5:8G8\6/p>vvMhu s4?;ٹ;~s|h}s.<כߒ]y:ό [۳n~D}!?ܡZA/¡9:4YCs:rhV t^`yFGQgF7guёy-LYfóZ82#gmy.х>:uȬхy;<0Gl#:F#:qdNYcGgt!=:m򱣳:vtNG͹c:z>8:: G)ı9~ؼn`؜N׉:ıYpI!8>cs:q|NǏSwA7\'o<6gpq;qF;Ypյ tÉ9gӉ9?tI![Z:;Cu!xl7?lYGq :y|A7>hþ8:I?9&ֿm<81a}/2m8cvNGc7pNwaQ89}8x(a8}숎qlGlza;>oG/رC|>zQ1) 9=vHG,(u28q{q;|H-E=# :tdVyovg=t,=Y3eΞ3eϣѬ=jvg{VeI9`r* S_~.e.amX?UyaUNPNu11J@xJ^.ֶ p~TWPuWۻ/  ~+_i\^ҟy}?~&lM(:۞ ޽۔\Iozw~^D7Ǟ~5e6(iߖݨ(M፪dzwv}o끻}z~/#eɮWq8볽o&B繥EY~eR9~$T+6 MOKZoMwN[7.l1@{ƥK_mX&-6o_{S4^SkoR[KSk5?g>Qr;c&P-VĨiQ'3[nŞ͝vǎf L֎ճTI6m[66DvXtZcÜKس\d&됩۹7O(oQo)(nM-KDr2(p(pATnM~q^yBH$%[2oG- w;pj֜.@]jyĦF+M+c#.7VCHJI2FF)RTQ\R\R얛岪H JlkȠp=*҈*VꥢjTR-}j9bJWTYZTV5 U0oAݢQY<}G%[__ٴZ,VmhJn[r9TŢJQrd˥2SJCUPe?}Kn㉬_O%?SOЦ\R}Dleέlv^k.eU)kou9rI2Ů'ԮSEUTʪq STTsb}jJ5rqjYjIJIjQ5LRWJTEZQZYZ5j%Ek%5+%֨WԨG7Jj(5E5kKԬGj+h]j6"5Vl&jUM֫hFj5+lv͒ZHͲ&YDVI&;٬jUVY-U5ן(DI[fYfM{s}n^LFddՖ7AZ;;QӾɊOV65,kTY'~:k5]3QNt @MoKEj銮槪fju{tUӴ?VwvU;LudCLayoYCM׵o{~9ڱ2?]ӵ5ko>kj?}LѶjc9߆auDikp}) zMoCj닺{kvOֵ/.'رM7Ͻr5YT]{]S?hh5MO6END IDATSuMO}SuMN}lhzIZ]qjhoickjꚚ}MS?ݬibɉ&'`(u_i5٪zOuMj*4kj*jUUQ]zfFVF3RQVVV{A)(sVQYWyZZl*{=mqZ2J:)]9&drp(+ym}9111Hr}jZ(9 J]c̳N뮳G$/˿/,\z0>S>sl.⼄OemZ+mɴ p_[oo ^vd^HVc֒xivlɜ1N_ʭ\W:}(w>]K7a[{[n[iu:Ҡ3-Ӄei~Y;T2uCXʹv`GS+uphWԴĪYs%unңnї7Y?_֞*#FtqZYz.IO~sh5*ӯ}kloE5K:T;-+ eO~ms̿3(`QbwmwqGv\ 8{XG?ڮk=v=p@ξ}XsM,&ZT6޲p[%$x e-*$xKC_?4 ž+J;Fe쏷hVúxXuU;s"i|\]H[G=Ӯ%ѭ l+^QQXT%T *A( =E(UxT UC=E_%JmZ U}=OeW{6_C u= ߋ7 ncۘ_ÄB[_Pg>Ϙϓ+(p<6]][~A+ @^(}<7(ȧpxvL`L |9ߠbS1ݘsMϮ#/*qkKJ%_iR 'WRU+*U1e_2u} u%0_1^-V TjϪj50XݨU)jPZA-2pZߍjz-PZhfSF߁&5COHzQgmZPPFF#4=|=PZi4݇U5>pYR tRJ<\g>`cw]_5~j|QTWlڬVTJjCK鋏4|pʱ0#) c2K#RV)G Lg*>* TSϹ#|ć$Wx[`D%_ዯbb4r1T)Fs+ =G]C[Vm@W2eٜS|ң{6-=ZVMuxhAJ52+wVmkLY;Է^e 1l2)<#QfJKywc$vml'K,[KVyc `M`)ܯ(ZuM8=AIN߃dwyפ^g|3# 3 -g;ƗI.[Ը(mXo>y@^k(o b % Eh p+RJoPu8{֬vn[,py]N֭:xT+*SO_T ޕC_/me?Pކz^N_P)T)=h ` HE)1,е)=b @B`7Z*KyiiK{ ia\7Hz@S^/8 nЖ@]#0|kc67Hxnnh]9} U 0xa (ǜ38PV`چc R*~ЁRXڰ跁n)WT ^;PX U,y* @bA%ST }q.|oj UC\ୖ (˞mVN]]1VOu oAZ3w8 lxeڬojUm۬zj}MdY+@o fWVTmchkP6\M  6m]V3vAҖQ1N6.@I@A\.G}'&ZM hQ6umV W8^ s^ȜҾ9`P -oPIPJCf]ڲJmY.k_Y/kڴG7.է6-=s %f}ȬRktUf.˜]$^;S۫]l:m[EgZ^uA%+lذL)dnXm{N01i&\ߤ>E͌vN M;P 澠 yo/$M 5jpթu ܢ5hY?]QbmX v܀\ԴZ3.`X;.܍ղ )m 23W*e;57U.4vQAY@qtEbnEU  @1{>\S|PE@kXPԶt6*65*7U *u[St*qPhK7_W5e kc,{MZFy[>ꔺgQj U@[ Jk5ˁt5ԯcJ6@YS4XGK Xi QӢt^Qs&QPu5K_N d_SO-&@1MԮ]bh-Pu%Sز 5l*\i ;enerb `h g>1`muZ_`)_/re-g bJ5-`ue'bX Ǝe cm]eQܢ嘜zkf ЗY {1c/+*nlcKR? ]SӢ-֩Q:[-PA[T+}H*6xdž,Gvo1(jX=;mTg>Li̞;x> (osS6~*#>{ƹ<ئȇ.–ki|вGHh|o ]%|LoMJ58҆2) gb9cVR)ֻR}6Z)stevr۵P ~ _wv@w t@w to.X%o^Q޵AvM?~/?י˯%+IЇ>$R?O(%\jjڮGIܻᄏ]]zW~.͘L$_i2_{dCrޯ5?sQ`/n P{f]ݤ]MzgvHWg4M![)Vn~Nf ڧ=z Sۢ>/3/sn %z,v!3Mڲ0ˡe-jJIjʙ\JfN^Σ5%݆tJY6?SI g8iui&Qδ;k-#3=}DFn9 zX!wfѲ:&[n馳m'-vYw=_>*B\v]^z3KI2p[T[ n{˴BymRu2ɔ$i}X(loCK yW]mٶaUQ频v[f E-uoeey=N8 d 0[ Ub}t\,usM} l6,z^K~M2Ho`ԻAXBh묁M9TA s2A*vNيZ%,Г@^gl/=T*XJ?,ͦx"e^7ȾTf})̺y){ w}gl@UۿZ,?v(_ n>1lTN'ke9 \S/P:ճ/;D<]S? 娳$ "uVA sVvEe[U #Sz*S|#TX-j[N$m:exϔzPZwy(oQԖVb꫎n m}c+ټtQP6jSQbz*dlbkr(,ԸYluSbb+ȝF,`U.Ǩ%X+ N?:p5ߔB`wuB YGNYQN5=SRa')9U/X1i+8 @5ll<*jl}$smr1\F5rQƶf?L}E6cAl9&d[W璦ȺcMnŎYE[OUlKd;^Z^Жl㲳bS%qQuԮ  f K~2mI MU TgL2^Ao%/W%&?V[MlcEvjX(WɹN򭁹*5jc2{ e! b) ߻>}Q0`XsGWYe2P,O  E l269 T2RU&6TZ3)Ȝ.߭/{] ߎݗߩ;c;c;c< /U7}WHiK O|io^8آ},p\ZŖ3I'Vsfz ՙ |K.zɺs[Q&:,z'Ou?^ڿQߢ>&-0 =nP7Yվ65F~:3ճm<%ʞOѕ{^uvf-­[G@.ȏbm-:4os۴}kVܭ:?aˮ k}nr/a)*֣J7|֗}{:g<@]ognྶ p;hߚh K7j"ҁ\ٌ.nԥٍ*; TlZwV룹59VcldӚͮ7s+̺q>GktKnr-hn>=rk炭X/VTn~0c*Q$G7ܣң܀q.lXJ]ZtQZqe{`:{#˩gQ&m28 d,D=˴s9/&sM8WҮ=c_ \.'Td^j\yZF} Ei2MԸrm e }b֬;.{ivR_L}wKO*\GUӅ(nn nf< sy(l/lig>#څvk;G>-nh/0Pkc@ Ԣbu Eń"m@rRQv6 Xյ 2$ S4`6FWqc DUXlu}a[x)_MidOh]&"`bo/9F1f@r4۩ym`u {fg匽Y0{C,>91TDZ"k /is+qbݰ Hb1 fk]-J~쓁A[/[TnS7TH~ebX)ol\Jy '6R&E-Ye+5Un­KA[lۖPj=U@ TzW lX)rQUԩQ [5ua7a eX0 6-QVɼuV ,vuTԍf쬓E  .OI4E.j]O'QRokΒ٠l x-QӢ VԽX[5(\QuשG/V~la .m2@'yES:8 erN/د O8u)kǢbl03qfn V1nbL&mISX m̆,e&@Z·z&\.l9I,;lcҖk [vJZu, 2J\g?Lf{]Q*Af->EY. ke얫lĢ6lOjղ}P7-JUk|PrJJI {)qVz%Tʕʕ@M}>̨rGE﹧2[/-M㒳},=8Qy{mc\e!@q˺=f](+]oT2/4Ϟߚ?ߤuk(Pz()30S ׹ fRJr*V*ӯLJ}i{J9ſOi*(pݗ˿k/111ڌ.zZlk+V9-_Yvm{\T\ MT\+ɺsx;zhwѮOb']8m^bǏެ6I#/^8I{bj6rk:+̦5>}Ln/ڿ-fq ^n{s-aԱGrKr8T=y6VX3}.^ _;ңɁ?ԲأCtƥbq%-K=]breVj;ZLֶoҫg+'&6QvN;-L(3g*hM_Ny6 !X"o߾Tg~3 -rX'&ۙvX}hoO*Lf~f =::/}K:U|r )ŜrOS>[~TT.6`u;FV┷2|vpL)NPٚ6Σ ݩ|)q5k[ MA]bQQɋ풁.V$,jMGe  Pj[TpЩuQReqEK=`gԒYַb[SjV(Ujb#^E}oQ|Ȁ2yB95-j[-j>P* wJ{wWx^ڏm;>6n|;oS'a ˸{MB0 W 7Z.“:v?wuIq0m w(R 'LlQܦS(tئΐR?LzB۟_?<u-_ݗ1114wqhr^vG8{*wء,[MMg.lf'koCAs9! \morb EyK!n'MTo_^7e eѸ=\%oe Q5:j۝E8PK-GڑՎ+ylu&@.glJ@B`W&ph-cAsceyDx =H]wܡsf씶)\ɂm!{&Jq?<38vnF! EYKn.y@Gy},5JrlOwtg>cG)( YSfX(*˷u{G֩8SvX*Z/y7m`eg?v?O=,#)Q(2S{75dq;1pOғH.J:,*6F%g*mLI˜DX-jm`-mP1>dO%ԵEPiUrA6k@ΩqL%T>-9pjԶ@8 5drq[glPEAKV.Rh9:  LevY({jVTS |yblKZ,e5l*AN)jk l.Pjf<hM 4+mQ9h甩t-jo-VƊX씁%7el 5 Ț c쬌\FRa@%cYc{x*VLɔ5b ˺D5 E~0G3VqqɶX333? BpZJn>Lq.7:,v h/n2c?[?i)m7mx>׫f6lnʮe ^<ԵGظTI+3ktzgzuvmhz{Դgmbu̔ggm̡M m2] &pW7=mvsSTv.v1 L_M\>0'mdLLJdbSMNd{ %kZfX(n_@ܺe&6[?]g%.ɨpf|^p}MtoC߉np*^qv۝[>Ե;#07]dQ&jG~v>wTmR)UF%T5dlClgzr`kjxzWү 1tºuO|l:}SOچ/S (};z-VNK-cm;vӟ6[c^=̀B TfY d2K7_w| ^s=d*@uug>wRv]2|T ]n7ȧԨ7L-2Z E`l``=PdFLca EMOXD+0n⺨k4Eq -E%oh@KRlea2\N>ٳRU2v\p]T|ٛl'ǖۢ)nkY˻>s@[U&vn]hcK]2oQZf lQꢢe; Z@. E,v% ߲H\ Y߆Q٢Er ՜rlolm eA&,V٢VE \\@Ztm6}C ~`R~5+zj{@QxSp cJ?ʁ;A?oV}td_Nk֭`j@MM;4@:AmzP>ɺP:ݧLOtFLJwOexn]"{|ݗ111+c pw }RuA(oN<,pQ.% DŅ%/H>8.HpO˿KSd&ێ;vZ۳\,}1Jw֘T_s:=_;r-φtNfӣf<~(̬[V*}-cs󜃷(\;ӹ}}xnۼB_زT6}?:xK K[ 6ӫ47\*Ijm[Kyg=ӧ  EEZl;А(/LP=?ɋdHO,36ŲnZ}?- PNKbGwie,/b˙PwnR)(>ud X(3&e.6QexZ:pKIom%X({ #=ڹmXF:Hަ^v۷U;X72Gڙvf;sںa@ekyUB =Bg ܕ=`M9ݲS2%۶ Ll>Q?ԳvGuh}uB{\(M;p q<{{y7oݯz}>rw-"9\ZqfEXM[m|{]wݥ[o>G}aϟNh m{yq}4g͒u-po9q vy(%o{y55^XB5c,"3Z|cyE)qZٓŔqX%S"e.GeV Ix)[g\*arѬɼEU uȖ2PY͢`RQrCm[ UbOvɞm3EaF%A5, Bm .zK>(=hV(=X_ #>)A?Hkw>\>`xQ U>1m@\Z> SZRcOrNb^{NLO\{e Mg5؟6En*`i (ӟQle߮ݗw-*ݗ+/Ż11o1]K^^cPz}ʟZAT\ $})S Tqq!Ē\}vm/z~6K\plO.Y.zJ 7&lyۆ%MzgvHḓ͟wugn~gǒ9 xJnɭYaS Bn[䗞bЊ6Q&2#ze{tlJՇVz&w:M`tnң۲D'ݳyfKnݸLWdVݙ5ٰRC:mUW}uM7clɣc;(ۙA9@Z,*NmML%bpsk=VcACK9^ 0pv:𼦐{XVq:ԸɾgkR'{L b =: >9qaebL bb2g{f_?ɻ {hm5yoӮ|N(-/nGtA~.ne9Q2weƍ`\dFA\\.YlCYZlyNm{bS\,ZZQ=x=M5ŧzԝ%T?u_>E?r˭^[ ?gbO|ANSMsyw fL-a#wwm߱><[gNiQv珩YoeXe;?{MUjow|Ⱥb{gܣSf}JUPϹ@cN X (h=]QqNZ2C˱86`roo)HnHFF݈~BlJ8)"Qȑ] R]-qɱ-erdܢ%@/2SDVfļeҏzu0 [6d޲}k%TK P`*[grnɺ[-LP,ٟU_ W%Rַuܖ 3Vb* >fE. S[ZTk IL}52NMh[fnβ4%-vƞ&I@AZ@-{au4JR54>ߴY7;bTVD6խS "x E)f}S;Hk lDM3E L[LƖv-L)K֖Mk00kvǨhvzk*]lU[hNt jPweT1|mV2r zDZ{g1 צa0:e q.Y87UʮgRVΡY#F[[>s Eq %nνP6ey- a\Sb\6^SʭV"E~w)+" T*УX‚9XcT0O<Qzn}ؒ<q2bAA ј?¸'jIenǞ79iX~קm?~֭[tAۍ&yH 䦔"v tJ2s{՟BNLeR}?Jieo˺ .莁莁莁x.ܳ }^¾َ畮GŦPqtM<~TU|E/MŋO"կ~N}zv|;芭?{^h;!(g:?8ܣ;7/77.7dv.ڧrK-=e2M^=&g{WY鵺TڐHO3)ei'*dSA MԲ  v.fs g0VH&z]L;wu.s]7u2S[ Vʉ 7QuQ޲4}to(SPo~e&?2 \2p+(s.uHluvm.ԵF}4[GtHV9^6X'ݾuX;ݴ`[m iQӚge& 8sp~mOX*JrfAQ!jG3(qgڒ|o+@MpEqZ(X_|/ W2mŢNeP>un05e8kb8}YcQdb%o!0~Y BA uq:Ækղ~}gU*cf/ӆk=,# hM 5-}{FK'?Oq>FiͶZ)EuK-֡=[oEN}# l6pɁ*(暽:~hV+:q듺듷;(fFNOcO_MMvX$Taz[g5+&9,\Ie,#STfy,W+~r\3keG[O(T-\oR9PgROI&ewM2MTlBux8hK6Y+]ovgaK]@Y[t6>928l \2qka7`IaBmok|Ag<> >Y|Vgluy~0*X|Ps<p,TtY@T9&c^P.j e,p2|8B;QwP6ɫe?S|E1E.k⬛7Q/EJvS&^YԾ5fr ߢȡm v )k]^.p XLiL>W.0`DAe6[ UorGnXm8IM86|@@J͗2k,TRͬW색z\-Z4*(ot"{A]v@T`s#mfK5g#Lt 7A[-Z߲ @܂QFqKfѸ7pK[o[M/.Щ5o]^']syL *=2`I+?AJ0d@P_Z@TiWn-3l^.+wu<|+PUIu@w t@w t@w ioԿ%V<723&ֽ[ 1bM7֖w6U8{K/}@َ)]܃g]~aQ8v2~67e jdS9{|xP;7nͭ5l+ۯr}>J9-y@GsNU 0 T2Y[ _*he8uf-/5?v~z,|w3e B\UNL&._yW9+],ynņrSO>a&5G MgRzw)mIe{=)pQf=gk–k@:9A>6J)۫ׯ/Ml#Q"48z~r֙:SlxRw u6+W0@Ihڸar3({quz~뮽ZZNs 'n횊aw|ߒ^I'rp{mL&}`;ᆱkBp\.cJ7x{o9y6;nLlځ[qoӨB[qQ Qb P͠8#CmNFq7՞]\Sif cZ;k9EerlRv)a;2y|ȵ9 ,45m@! 0VN RruK(#fr*2*Үv޲qlɉ.ɑGZ^.6BƔ|V9ƢW'7tT7,ȹx#r9,Q{6fמqu=r GȽ=Tx~װ羟BK C"ѣ867ޫx|zBu{>zO`6{=ozf>o[54LR$ܤp$v2n[ a "6^ ;H!@Y*pCd t8f==Q0Fh}`|W(vX ֽpj:ɿ18&m_ߏ/N6Sm5XhZ:mW)hD;۴&l67&mf6*6V:tGl)g>&A-ڑ@vwЕe@f{`]um98JZO1Q-cu\X2NMע$n@x-S<<^'qcN81S(ЬHsm>e> hWu]@\_[9'_Zc{@\? uV&{n[_҂ߝte2G} EyTigd.\==ӻO^'.{Ƣf<pY]Q͙̮.=Kujƴ.0iyJmr.Q$VIP\JyʚiJFK \a<-#fGlW2gsY_{2 MM'#6pB9Zl-_f9&M ./L%fКLA( pWQݢM)@=,OLj򥮮Mũ~wJݔ>xIJ@ņyʕJЎɄ֮9\7l01_8{vBa\ I} ]lrnkoXj*\`G.իGswf0`%M=kS[ls(qأf t7qeuN&6Re,ۖ]>ٚy ,0(eb!<7=r4P 2ٔ%,3nbE- urڠ@("UbT,Mp;ؗ0 pgPBuK9p*$@ԔY'ɉM$J:-̖KSjm5DgS2ZQ?vd@)Egq Wl=uTo=׶sKSu*^Ժ[Z9r˧]6P0flYܔݜF vZreʶke쉁U֬]njYO by|[BrLT_}F2vDkm7c n[l-mX2iTKY<[2uvliɺaVS}dZT0 pKZ2.y Y;\mrJXg iS,;7 M*͋5^22N*i:$i/<1m6ty!D^œK2p{ .y ^~/ cTCԾe-:n2[k׬g6luouvy眭sM+ϹKZqJy \+~:I'u'oac=nn2ݼC (RtV,iYƐ}wSb\\r1eSߚJ`%m1T%V28TaZ )oNf\jٌ(nQ$,ܾyo}.HK-Pew 9)2`2FJNߢ%K#V`gJeᢀ-,oPa DźجuYs L"JSN:つSb;4ůc.K׎x^XSVy>%e2UjRu t씲V˱uJXvXupi>6yAԭq9|,eedȚSZ]Z:D{4U~N}l6q~@^.MG^.+x`KJ~NJ܇:: F딶K`໗qkJEgm}#o6bѩQ"nMw8@En\`/:hݸ!+ϫ~y,ɷͪ%,lWcaGK6 Sڢ iX.= IDAT'O|l{Է))aN-[rod|םwv~Gf6x~GJ&` C*4^{!;Dp*wo(pN'NR0P8Bmro[a[iQKuaEaB;:9bPSC 5 7)ҡI;^L֫u\|g?M[X ,sXcw>cuqujWqu Ӥ}GnO]w۳_?,z:>V3َe#;S`\MUt|D2 V wښ-XoM9M^(}8mqY6mGYm2 }OW8>mH#^?s汮YOag>~ߨlc5s׬r?>Srqlڐ~Q?u;yv vO8.ׂئ߇\#;岟}9TY5uc)kG=c幎,_Gl6|ݦOUlDTn;yjQ0<@Xn[ j8BM>M>m:+2'mtۿ62@;':U]]mY:!ڤb4ձfkR*>S6ڬǻP^'G'hȤ=5:YM:1d΀loXUKFhڶC=ב󑙴#׿٭nnвXX:)Ne{Nk;,;ԨI}$EjghGYʎ`8;2Re>Tr gG~2wt8&"A-*\'ַP-F@.W޾(}.ʀ\?;k:-E  \c˺%wn͙,4,4{}KFnwL{OԬi[f<}TtJY,6KܴA|"m:M]ܚ$wE5(*׭O>UVr:a>/vfˊa"55Ek<]A1as4T& \9/w .2E.6I:huV(ޔN826Y}wt߽1j7agםwQWrO=@ƍ V?e{)* rYmڴ QS2pS:,lhW:5Ѐ^'xlW=H>SBG~d- $UW\V>M7 K*K-P%_f=czGjyB:)r[9r fwQ.S)QВ2||lE\KnBoWx"3*2Jo1i[M6 dQRs,Q璓 ҦT-f䍦B׬3޾RyE!C[l=e[_ ЋY.϶v@^CX]Y"+e $U]y}Դ :5g*Sl i?JUbW h]\@L]= vUFɚАg9<ԹV4FcusSiȩU-;K}PRo )[(<]CCn{,-2m9X<̩+0)~粃 GZ/YUFEK6w@mS@eTBupf PP~ *aL^r(c\$ #C^L(sf-f^p`-sNk1Kf̘ۄ@_O$:˽M9m{ΧJgC$^p۫LKf+6F7R\^1'%J${ƂlDrfܣWթiDa{ n 86!`m@HH2p @h `0#CPo!u\?Vs'选ޤZ"3'kZ֑wbfO՜:FO5(2obN Ugr='mXYjmj\k `4Rutc'Ԋkϊ@N UP\i>eqj@{:F}Z8F3&H7h;Λsɦ8`9d;&ՖIV>Ǡi묜&qch%*ܱ'ksKM56U먆k%ktdC#eq[~dCjj4{k"kbS툆k:ݻ>')TSBZzжvlj=ڇk\- 5N٦ 5W+Tm\aC&X}]KEq.Cq7mZOLڟ-4<װT q! \YF?lm%ʦ?=?p\$Ǥ_Ўulc-beZjth7ԊzڎrjՂ煫;F ڀW9 *5Wou,c|+v=[;7·>8֎xn:csI4A{,_Tjuzs}Fkn/8y''ƙ&7u=s\oN?WfMvC^s;N~PnjoGPϣ]ދ G65@<7M5o{΃伉ޜ{:s&Y?`3v9y5]\mm'O6pm;ډª@ Wh;s]ڶ&xmZ)!}vڜv.@ߣ͹kDq :pOܯ^Pa1֨/3{4׌gʽel|q/Y0]3$c9Yl\s8?ڑ_?S}駌uM{z}=x`~ @!ѿe ʢLM1 pN¾Stl2hNΩ9UFX-V&ꅮ:=U;cuelΊ6*ցm:5ڨcB-{gtNs]uEUJWyOTNF颎 5ڑ|G1{Z7;!պV7Nѯ;jtFke MEmuZRo '/6ԨFwZV>jQ 9qTVۑpvTM迟qo3[B uPw'!p-s=v \p}iyeV(h h^kwvہ1yvwTsNQ͍MӜvyۥ9.iƴfb*5hLXj[ nhJuW^ѫ^yU>rf}'.Ԁ, 5+sprګfrod&te7eegqԮ=2 >uS`:}/K,6q8 Sb)q-կx@|'$b Ͽl SܝVtu}Z燫 bĹJGʊ6Vګ N>Qbև\]نWs?<.);VY=ζ*{ߔ*wUY؆l2AߏV|Gދ$pmŹSsUzJOҍUz-겘xmUeB[>Q7]ѩ쪶+h V*Spunڮ?D=Re ȶ,眩Nj*]Ze2yhr~,9F;} t_{Ս6Vj]ReDF@UzxJE@eЖOLu˶uV)UkZ>g3JІz\E^to,iGVg㋲^{#ZefeQo! (`L=}a 2^~j@0ql;}s8eq-tU۸_r>m䠃_ؼ Tekq>?ws͹gpmLO@⵭n=〾H[QژR *%'W۶EӦ/t{NR?ڑkK cK*{ၺ__Shsmw= qi:RgowҳBQ?OzVe$ʡPߧeg;{)p^8ԅ'?hp/pzP`@چIY,Q'pX/ח UovVڝ} W׵T'{"q:/yLSn8߫ޣm堃Uq3?w ~St|YW&iy4L4d4lyѠN5 6 ia4?6Voj쎟ӭZ9YuDA/jVFojtGg֕~ϿZ=5UۂOֳَ fG:˞?0IG&P"fwQ&HI=iyS iq E=R=.!QFSBw3pK. e&m% \'doQ.[} JenpvǴO,"wwk61mQڒ\wwiVleΌvft0׋/@+5rWKJC? f썱,M ~vL%ͯ]^:xmi/nӆ~ ~nM>LylGs.ʨQ;R>lO駝l49/%;쒱.5e]ٌ뒃2*@Vd-"uQٜiɯ8rJ7b ր.Vdھ.#.YQT,sZn?vYPۿWvᨣӷ0]yPMףN?jp@ixC#U7(*c `s&(3ZWk;p`2>Ml<:ŕõ:P`?=SqSU#`rБb=Ϊ2Fևx>mw` h?yR~e]؟nQl_Y9e7:=`o6XYLy+ (˵g{)~_G#S^V~fݫUqԃ}8G mhk執?J瀤0 >oUv-bGN V选5ls,?WqI^X &}cյ)}߇r؇1E{p}W-i* هَcc,\ʲE۲=+=#ٯr_;"\rj'CxBGǡrW^re fߖl<=}v~y%}cǥcoos}`ݟwׇ9p< ǃU:!XeBroyøP՝m. W銈.g^?1ιܞk"Peq@dK2RZx^==;}um? pl.򾉺eftM*Εs[2)ZԴ3;hjNQ_4eрꇝ-(ڠch6D=UWj`lX}~Nou՚3:gZfc5z3Vo>#)o>ݟt ^X.j=͋VNժX:x~pq ׬@Yȡmn.gb6#m}8_E;8;^w*>b; IDATa9ۭ,7X ʖ9 wRLv-өkSV}j56bPަz?36m*\)gI=]H|¦sq *x$;[39]1=9nfʀܙ\쒻NٲqcN;m;ު"*J`,SIdlS34XG&Sx@gQ.Q=e(ȺO:c{JM`uug2iaFzg7H2+6mD-M{h~תU+;se@c2t>Le \2Ʉjى6+K-VI|I+i=+ 潫lEǭ|}5ǕnW"kzɐ<R,zM2^{xwW'P&1c>R7Y$lE{ՕW-oEYK.6%keri- Ը,3IS3Ye ˺lυ^Qঝ2db6e@ .0V(qmAڢEMϩ` \|J!S?.9.9lK&MlQ.pvepQblˀm|hh˾dޒJ} S{cQL- ӁZ`/jPɥ5 +u,`+aTVUG@ٹ(pGlblK : \]mܖ^M; 5 -8u.csɞ 1j][ղm2rݱ,+[rk rp3ˀdPY.SG@EAۏxЩb[,-Ж,mNY@kx_-5ʛM2>(pQluJ_¨eǃۏu.@שvl/_(:ޢ͙2Lw \J\˻EΘ2iTY5m2 ݤgYD&) `cLm6R:kQࢶE՟f ~n&nM.>pϧ]F@\;sPd"_/Uu)17VX|ϻkCWibjk{c-iRegxIs"}Xe{P2F1Ip~jm&u|Q2xc S*Tzgrnuyb6s9ݵa4کheuvyOAqEDl~hUtii4hX)iN#zǺl`,M|NF]lo+7x'Vwc5e vuGiuF:~m{jY(8^8RBx x-7-lYt&pv1֟F*i>_q̛7+-CzuŀM&W㒉ppɽe`& .ׇ>[L-US Xx_4 K䮘EQN3P;h唸s5{fvuk@7]X*whfĺڪ|2Le@nrYfJTRy.dR䡺>5n>\@ [i.I=e#d9%.of]xZSKTsqrq{l9R]w^W\~ {\{exguI's)e3JD˥=r" kM˞ey/KYBA\ޔ\)MyN=4qDrW +W:5o"ǯ.gvqKe>C=ly;{)i*9O<[?SڸaRt\[HCv$tٖzX|zy>eܳOb0ڔteX]2hn n.n7j%U2p1`E,G97_T@݌t>EMy@ l۔fKEiK)EuHvh,ɻC![%,שqӦd]Z&R}&\R}1X.ͭ-}tN!kŦuvǨpx(ϳMeR9cPTYS\SwQx;M K~-R,2/@u`Җ\,ůˁZ/*ҥn-@/ { ``e@/jNgm Z@g9C(cܿnZ/@6mY*s*\,Sh`>2LeK9@?+;}y,Q{@ <*wUM.J\rn-Jݠ7das?@FK6 29 ]KvG),:%n ;o$>e{P7X߱O#E/~SC$jmUm&/>HT0QkI09aE'T(PSK}9C2pG-1@0𶶶Vk`2n?j5|TLOt ߬~ϙ7}W+,?6Ga9샚2kY)ZG1OG::m+壺 S W^ӆqhZ>ڻ^\0K-؏7wjgS\OGL3jޛ5Qw|qNr`=(Ӥ{6Է{̯k9/[4u;S7Om_˘S~}X+ϞOkUul،VgwO1OP_B6Xqoy/jݍ@mw9Q?g.mau۲/æ=m8x))ߋ|L%ׂiw| {PN*MwmBn6y5ZkuFK?1`G7bĜRW~JWG\Q燘xGftj4QO?ށȝ%v~M{ٴƚtVlVF:,fЖmAfYtqA&x=Uctfrk]G˜Z 0/Ż]5z˥\Wxg9@MTlƜ'5VDŽ'j@ 4hmX]^jU IA`Y}njf;+-KgVi}#!ltޯGK~~ᖃKe3sZt}f>44T<00`]R$,Ţ r(yie21&??dbSᢤխy5]wjiNi;;^mY۩Y@\nWft͌v(j|WL\@TdA9ɤ lH+H+굜Z_ 01k6/EIk0jhNKۜ1+ ~س/Fj0UEA@3V|w0x) bt^.pɫo)Yu_ny@EUKn\`39}peԑ4{em;vJCdc]Ҿnu۾JqZpp `[SzKdꢲŃs*plX-4P(ÚK嬍]ƞSZƴڒEZײW2˵Zd.׌{@.?/vd=B&c\\)쓹+/O@AۤsEn&qGmP2D80uIٷ84*՛Po/y _8]t{;:/ܖ؎FBAZP )nQ%p$H8rq(mj Xd P.7ؤ`' 47a~MX7PW+e*׿Rf ӧלC܉;]VK>W@;Z;=`i ѩcm>d Pcnm4|x%VoM:QGF25{5h6QLte8vqޯIѯv k{F >ܢ?YfV[W, 88`Sw/To\+T^ >mUY\dvbu̱n?ƍwM]+̮)+ڻhv}?>5w;S&5?նXϗ:Vʲ]ֺzewUkۉ:}ںX7N+ eYF=mܿ:Fevr90M{ v  kcHm]нHxcu`L]ԛ%/;٭{۶>Ng}y8}np֎(x;GPb)g3C~o-;`hNҙ" c *FCZ10FW)f7ƛAW몱LY閮=ob[uXQo} s ˱QkuGhA-uViEdMTIAo67j^`f,6дS=@OiE-}pWs5zn>ǀwJ\`.pmKM[&ql=[ (EJ,8֩iG5kZfNj^[թ]ݚ=SiNwfƦ[`/߻.7StJ|kJWi씱$[.e(zmcE ٶ'C6ԃ?Az S wra믷2P@9㤩WQb7|9?jlcl+N-K=Jhqq*u{Nzd-Şz7!Oցkº9TSqP s^D9pzYJ&D= l VPTI]7'kܰ6%=J^-<^{zqL@MdRW_uuyè2ɴY&S(߲Z|X&M.ҶnV>U:WTZ}%Z\I^HHSnͷ ISb\Vac.7wvn5\!a0rrs ri \p]&LI:9m5[egZ:PJ9a\MȲJ} (-'ဗi 5 5u@~gl[\( ]TNA4eY$ZfwXOK^l?ۚ:e 45`tJYT(uQ޺TNQ Wzw`)p > .rٵ~^嶚¶bw9Y_fa6PNˁ\5IXЬr0 cӌ \f`;roe?7wS:[s"pMC s2[hc@[;EAbs@! 2Ϟ %49,HN&rEzjtבFnՠ0YYe^T.j)szpr^(BqU-y)uɨtS6奊j\A|֖sئ3ysyB?^'%75=/3%?>]3b^o '>^V6{I'./%K}98,vzz荫y_8'6y۲m˺I 56VmE2E-fA,, Dڶ9qf=t4_Jm+pTkKC]B {~j@ y=ߚOKjε9 J}WM0t­:5M1{ik{Z8ԫf?{\ /ە^[K1նuim-ꠍ s=hk@&sPd$@AAŽ5b@B ޻^[SzеK?v 娘p~]8գxvlZ_56G:CӧO>OTm8@Ex48?wx~4|x[ڐ~_iQ]lmbm[0uܮ3@{!m Pv_8ۚHڶt;`_^2ֿYǶ 9g?V?hĝ>f v rrfLA6^&`꘽l{!.:rwpT-VoQe(Ћrt]/;){k]]?i߱J}gwAy ۏgh.W4/Wxډ :myb1nV2og`6; icvp6kc^ؘ9=፝;X/m]?ooӶ5qsǵ~< s|hHm<[/.U-6.?mNWm=3@Jq/h&wnТP.u:lj[9*e2VdýzsiwT+ IDAT{ڶ+7^q){v:p'\ rD]í+2-^0A[жU~m;cGݸ@qvdԵע9_hGWm+;]w7sy4~~gG4/lΝ1?inT}]GG[-vmAvQtDgmhe>%I<:F'Y,pw]5fi ڸR1g9 [nr>pgK`dپX^Vީ5fst'u{ZCS[&(` jovoY`,}cy%Xj+UF*hg4ͼr+UOmOaJ,ZŚ5@-srn硺>M3aՌ^vweS4+mwf[{O֌h)p;= rBtJ&+09#ͥV /0h2Y($z-oV)eSKL9zrSܼE]rSƚ]% =ocO )e昀K/H~|77K Ɠe[oaٸo{QVjݺuٰu˭7Y6HvȨ_y 'uy!o֯wvd'Дo9NZR3Zuk֔ٸqW=<1is~z;g2)XB[?Y~eMS:siڦQfb1N*Ek*]CśMkӦy晖? 7wg^<]u^3f ͚ sd庬[ȷeBg9Ifۜ˰-ػf,%.`PpZ֭S6%mN,)7".,KE`۔MK-aȋN7Tdbs*[g˲,C܌bL+侂9.nh0ajOS`,t6vWNv{^7l}^&AMTH)2]-'SRYN3:كJNZ`e=1W uoY % 4Բfqw(mھ{ ^ Կ@vw ;~є@[rr<.VǨr-լk+ډk1`/7`qQԇR؀mɠ-D ܞe-X$[[? }孩KySc\̻ʽ/PG@6<ٹO)WRen*\\֍}SeʚmrJtR\ZifU&68JsYb \^;by8L;Lao/8./; %I~9{e( Ey[wR$PѶ+6P0ܢɊ"j 2X۬@(l`%n@H"fP=X 5?tevͬ{_r>{ mx8.muƫmM>yǴL $ښA $7(~*zm;9om} "m`קOg}턴@Ѷ2VWiK9/hOP([~d5}e@*7^ e+Ȩi%q-?zNLGŬ0fvo߶6|PꚒ|&9;"U R}|_z D;ngohc}[n [4jۺ ŧHGwX{RoٵYko{9bǭ?3_~g۰tn/0F Ү~v;}.7Pr3OnzԜ;~u۞j;篱C_Z:X\Li=oG^/;`0ecuzYsLuK_O4mw)n67V?}{Ye8Eη~ן_{_m;>i븏M L'_}+Ў;uuܿvWeO~}Z_g}P T=>#uh+׈{n|?qt m ̥h_{_K62@V/5=Xn/x!l!>FOMt5֏*p+̣(:`z/E;eNXԲ*DC7:EtNQ2qf$֨+6άlUO4L4ctslNԯccD^?N^X˥}kgl%X f?;@C@]^SZuTzY5V?RG:jLQ|g6L@xRq:$0AxX CLA0}\r?ys/U}Ϲp(X͊E5 ;[3QvnݡӢխ1lfWL3թٱi]1E[Le[^nmҔݼSgE-kϸY(gSA89(nwZ(!'Xz7z=%ˏ++gݬGyX_v.Bms=[ygLffqcjT_6wqy;iӦMePef';ٲo}-*0.j^29{e` }uW+.u]|rg[rM tGwygyݤR)_po߰A$@ք~;f#o}ޣw}ܶ6}E }[ކ_+/nT[XY,p6ݫGfG 5Rɽeou-7 LTȀjsdXf*ڤI$Li:Y(oQ㢺&g?oԐ[}U*FIkwPP\7f\qwwwAAeT$y{KXf\T-+4ڢuplJե@ԹfSergө`d֡uVN%Z֛ʸsQ.u42j];.jӎ fZȭ op@/\iO9GGK]SݵA<נq9-0rx)-s z{TNDv-`?Z؁ ]hZ.зg t`H[Tݶ`j[yְT5mؒq۪ծnw{vw_|+tk@ЯQxwlp>e`E8wdU$ kv{^c@Ā_+4߲Cˏёwg fdY`i}=;@}{fx{k+.㹞+ׁnZFOV}T`ڙ6~ _x> )K=<3\{I|g+=c‡}uu? @nvծ 2#\?K @ޗ Z0@'wnK_ a`gvBsŏXdP\/.EOvxwS6傆L |gAwO{8ŜP˖mzT]?YK&}_`Z^\1~ZZe^VZ+Zˌ*ZYѵ[J!?Lc\f,gqD_ȻCЋb_2=AgVyoWkkM){Rtu&:ݠ͊m6 nV5mKB8TҢTӆy0?΄h~>OgyxBZgy ,x$BA giٻ\ ϲl3%Mt_46%ݒ&e>[VVq_B&g0oF21m -TdV+`Yf?Lv.y.ǶYk߾y8>?яY Ǩ[&/[+ernAFoa VsjV)⹺ +o )W_^zgY\ͲlX'[&.ZԸӫ.x-W;Ƿ?T*5Z(k^B[~ƀ/mön+:nE@]u}SE i臗]=/}?ìEG%Ev!A]u%u e:o |i--]jӬX% %oTX(jr4ٵl8mTFX6 .Mgj-ʒ{ܢ(4keiv]n\7k@@,T Zz:2[f]j}j[@]@E L^ nX(`)J]Ա=@yS5A`˝:b-^ξLZ{J]. s3֥PkvϚ5(2kٷkP\b HY S^ V-63lq1}5f<Ƣ]D0]Pr V↊[ :6[Ζ ȥJ;5,t]-,k۞;`y]pY&[ޭSr]A6E.kT]+Z<`. ]77+e3[v_Vw4iR҆}qY2X/JG4+^^y2oCzN0H!Ӗ'yznҵǦoGp˜6{nܼ^iEN*N(r".SfT,S*P*)hϑ3C)zpC÷>2LuC(;,Cv HJרloՑ+\(t>W{qn!ʢo-T tkZ=r]C^{f;>j?ÿS#T\?Rx EOz Lx+.\{{r]@?w/@O13{r{e+;xfPиK{^߮]w,} W@?wtdv50O-ۑ{Z=Rp탞}cA[58r) N` y * Wv @~ tpF[_moo2XKf5&T]q@*=?Wo3dDaʿte߰?+=[ԉk+)-0ٲt-vN) k] IDAT|oXx-7+2%%|X'Զk-#reT(RUnM)o}uq_ՆUl9ץ̽>e"us]n\R AsfOoUG L DЫ z~~XP5k_|n&u@q[n}v~я.^55˩Ćc꺚mwXm glzA]N˶v]fHAv~ض:dZMUW3neJ\Լ5EaM]W3cD-8@]( ̒I,PzEXBpwj^(6 x6Ck<.rɯՁQNdaM*W)J@/^8):b+|엛ZZ ԯ@f :fEL)MkjZ@/ej,~@u2*X 4u2{A\,QRSvt`o`ؠ5e5i{z3k il!v΁v_ߔr2rWcl-k`,@U.gdQ]Bנ,r2P.b"okrK} 6٩r{(x[Ni=2Z@ncyn 2"m@03!rn5:}t2>\כ&A6ܪ :6Zloږ~ 'FӁfe?ϩ}Uuy*BUnũr#g޸ j o?x*olf˽M&cJŒJMRcH*G;l1EI˻EɾDlLcvܡ;{Ӄx ^ p}K'yP{+D/ӏZBQZb8/cǼpG_?E 2eA+=xɑ:۲t~P4EV!t}ه}qp/%}DPN -4/ż[hɋջM֔ƴ41b:۠6%%KOQ]҈G  AWJ}4;7W_eF펯s6_z}zM1%-Vǧ7h&YXd9w8S"l't66! *kJ[B;p·ۼxچ}A_>9a?.EAW]gj353QlyB{/%8%MM5S*k%L1kmr]fSm nA] @;.۶̊ZX(w[7Qv<24?NuK&M-lQq ~W`T]m^,_@`KmSQFA˶ vqEmj PfƦuV oha+zk kaE2MQŢ]RvE.@׶1xVe&,ӭ:d{ր-`E,ߥ%gl6d.9E԰X)s,XY, v :clcL z@.w.@,jW!Y,(/vNըp^9Oh8X,C(7o?㞃| r^gw{c{n9ۥ^W;씁f T:3ytL}hގZ-kurQꒋEnYmqrpaĹWfѝgJ[Lt-/KrT(75a@K(nCѠw>^xˋ2ͺoPs>7Ý-0la [`O@~'/Xv V9npW!}ԗ"uot]ۊy=[KŢ&jzI߬w5%yk1Il c:}_mbooUiĬ?RaL֚Ҩ~2"-9XP ~.&ˀYԸdYuJRzX,Է #j-3{+xw|c:kuRtfh\dR-*G(٢xdLȘȠT˚W,.t fHK'GO!x }7{!l磗pyp>߄7QeD)\q{vQs bLԸmqm-=/j֟0;kqM}M˚FMjkb)S!q0TFj+Ԁ SζXljUjt5JTJ2׎C[il˼jPn\\_V bl*\ SVu5|5[Kf}z`0@ `f9js *zZɬj@9QZlŲ \d.XoUJ[mJY hJp~;/mdǾ`8MYzܭgN541/Paʖ 5WUo %#Zf k\ʶ}ul^ުhmQVj8j6LgdYkmkjt/۲h=ju,X"{ڮ𚦪Eʶyo|Zj8Pm# 4'knCaNybAmX5[9f *#p}[-PRqyS)w#0njViUy`.Ԯ:T g9r],[`'P]C }uSӚƨscXP.TJ`'\@/֩k1Y;-jYQ}Zpr @3e.'E.:;-2mi˵awةdegSɴ ?_Z[y%Y6Z]@X &v!ծly(c[=N7 e[b~_ Jn2rK310`ecZ;|QF`۲<ݮ>z{:]{^29RZvumLwm؆Ͽ)d7&g0}Le?܆\phZ_Yc X)|pb]~|A7svMe1Y?~SKM6((H+)H)Hr<\m,D4hjLxLd\1pQE1N4S kjǩۇϿ}GG {{y<<Ɏvo-pll=G;u/y9~Y~N\wFGGBP·m'{Y>#6b^U/׶bNVWF_UzbB/"b L5{]iԀhKP_W\Kkt? k fԗ VL7 Z O+)iADnTZ?;1*@]H"yfE ̆6G2JZ me!iC2J^*?L]X!^d&nW^f,E,-ky@g)r Z`씼(rL< SPvXyX"'QeLE}ּ)euԳA-`v 5)s@F 0pԞ+M-kN9.cT:rwh<`O.e۲P&O@SlQ>p~ڛ [΋ 5Xnk18 yF< d0z`˹{ޥQZnp6l؝gyġU{>d+K..hkr\`ͳ:w ׁ\4gM6z2 sۦ5-vmM}<<-]Tݪmc F [u˻6UZljчu0>dZLqŸ>ԷT_GUȧGk\=nVmn*VYܨx)o߂26T"iDTd\XԷq&Bm5ܢ$Ѹ͊$JŶ(wΝڹOpO?Hh/oyI}⺕^8q*^ѝgs7k١Ka-0la [`d{/KwnYOf>' u/F*H(iQ֞et|}+o?tY': i[^s:3F!COK_*4bJP ΁3|fkS׆ ΁Ͳ/ߺ8sSku~j1,Ѣwыz팮W{z6_6`-v0vȢ<=9"!0$&e^{zö~зGp+\6 ԵZ.jgrKnrIo \֝-Ϥ}r.jT-!3^2[sQyΩ H8T%52hu)3f]ukXL|B^EE,`xW.h>V)jW檪͑qE1į"[>bVMS&bB ֕miVL6nEE2p;P (&/`J[pNY쒹uSb9d\'S_uY#У$7f}h5,#Hky(X"~]-drLfqꑻ$亳Km[}DnSNSjZԵlsY'K_WW>Pkbmh/0 ;冺2Ģ6Xb;Rgkuwd~S@,`*]fLԒ)y;RT$Ey-\Sb1D 8E9"sMVlPꔹ6`$_Qlզ)^"5Y4?6N>;הŀN)?Ag (w?];Y#6fE obƔru. }Qa|\T}Kݮkhm^S' 65K.na~)i[ۦ]pus[QҢ[>[5hžmۚ|[K=_vMгṯNz}{MFnUOwZuLuyKmT'3v=݆Z<<ؤ[^vCJ}`L_S2#/[0hs@Ku \-w7c,1\fX? mryAA;{}feOJex.v+i x[,˾zeO5JTdr /Wm9la #7?[8[Tb 4 \S>]6Z.1PƚN @fսp9b+ՔVsYOdU9w:aQ\3clQzuvf <ښ*c -D6Ql9HK&/Aǹ+-wNrmF vs۝1Vtej6˵iX;s]fܨ=2ٸ](ؗkYm1-T6QTtuTwmR-T a ei唼@=$B.`8IE]ԸfLetQmU2 ]rfb vz 1uuuz5Y6ԩfxki6O2sPeXɆX'؎1"@ܦA]rD2*z`5F,Z mMJ-VŨ(]..eMoec16My~; uyu Udf9u/@REu0֠,VX(7 w\[nTZ6-V계ʗr;v9Y n$ci쬕se96l`/`qb- f(a;6l`k]F 6fun@,VɨkYF1 0ΛdC}k `1(/ l)߬{Zخ;כL\. w2r[RxKzf3x#Է_mQ`;@"9^G. [7& ]۳\BԶ\z j IDAT ;!m7dj\Fw*6˭rQ7e7lPIp]? 4?bP [7ޤ*6B`87p 3'J 9UR:7W[^5mڴ -ʉT\xRTBxJTTdB*ۘbɨ"H*bh"x4xEnLXԷw:Of)4}94;A/1ze]? u[`~+u qjA_O k_Y,_ULjm6%z}_kǿ-҈>ZTW 4bVJ#J*U!hk?gHnTˍZ6Zm[@EF;bTIiM:)YIl382E͚l2hlQӆ! -PU XA-%B@1eaGÐk6\~=ToߝLr(`;i-baJdΉ֩# o2kd׭T^QR[kEP-[|I`-ܶ5˲Jȵ} :E. \Է:: r,dAnǬ+3+Ta;5Su6ж)l?lC|[}ݚ)Vfj\-۶[sjA'2qܢ:5"v2j\sm2U6 t(pU6úmuaR]b@ņ-A}u|EFݯ˼5e-e2̀=]ok<`.m3쾺)w]NىvS9( [&vQg500X up)`Ilrg +,ƺ u ZnvX;,p5xlZW?BBWr{d $zvΆc6ˁE>Aa`0ٹ.k8.?@K \w@5-euu4rޥ,v{d`7plMFkS}P,Mk([6e`c6.#[o :2@ER)qdQb4.+\2m%n(b`*NMS8F0N d<,5lvLn֕t ]Guj}Y:ozӳggz)9gog]viϞ=Sun{vk:slYfb?FcONN.Ä~0B`Bb<9<6u^'=pgCuysm:prnii۷O6<}1z=u]:VeSPa9О]gi9gk @I\۩rAqmE[.kkwRI%K)5Y5{:Ԭ5LF[o5y2vf5Ern(LWY-C,[u˖j ]^;`P_(Qse.cbFak/"cmBrn][ h6E-/Q֝\] 5"+7PZݜ %.#G0J}5.1d6㰍6E8?P%,ڠ;p ֱnFԅ5a#]w ;z6eqP(6 QLkXؔs2%)o92Fzk,Y 2srYޔy=2uUuS,[-Tu-Fv:X3;Kd얱T` -V v lYQ,P#שp nA",8r7P  E"oE;Z%/UQb dCwźS Q4mlJ]h e 9f҂Y9E26fL\{Pƚl}KK.,Bu EA)T,u6Q} e2&/uk [[e Q. -\]CcaN{ ]\̒렴@՞Y&V)/HNk*Zh|7+Ӡ,d%2-]Xr m rx]86dLrjcvyvaZ۩hBEBOz=9Ύf;u,ñ q,vfV8to[m. \\skf>O.Ϡ=mjܵgunv죾.htM&Y < sq-{o`-_Q;mKnɸET.S~_Mb}< P۫j0U洷z_ 7LDMuH%-6IM2T2!-79x"XS:ۤC/5-0l'} vW֝g7Ut7/{<V'Jgz.^~/&rhɥ}sY%7bv)75J?G?&g)l!"ZAۇWw(jndzsf{RIozִ>xBRzN{w<7?kFz`vj|8M^x^E/ze:X2;2 (Z,݅~,a-;_c,YX5u- XPwY (p#*[S)k9dbqrGMbÀ,X2@Jm;Ɓ8/6l݀**W,{E  qL&t~ Ee#oKei :Kf;ր/b썱 &;.b_@(0U ݖ]Ψx]+E #ԋX1f씿\-CKq;|u hi#-vypQʲY" b_MU26dm[wNfl\6mn puy+epЋ]{S]\Te{cnU7Є@,Muk[ĠF}- wFrGsA>g0wט6>b,6+*)ϘxKn<4POEBm"欓1%No6Kn$P,۵s?2*O)/[eV,[(߱#;]CG?la [`8v[uc{>oJ6?ȭг5 'Ei% evԲbAO/zQKd/SYWA7&1Pʾ̋io1Wxc`,*V}hbRf}_G dvj17ӏ*Q?.~P3ȸ_.8Q{P~ٗ)9tOkf^/Sf_zVl{vԧEO}[gO|i|Vnis>}X#ϻD#~jt4R6Q86[rʲN8atPUr?ǰ{OX*;e-*[>O=ɝD26~Y\_^lzY-(!6{c,Y+Bn.u{ qf- jcˎu]S5P n ڢe픴[b 8S Z^xzٕePkV(k6ZY@=N%kVA=~_<] @XP ,S'- *pש-K@LFHFm er(өQ1[{uU}'T A]@]/E۲QʀwLHT^&E6gX#u2VXr%PV5r@25/܆-lQ!EAnj=0ܫת׮rLZQ3 @n`AKƭZv-`4evSշ߆A[=},(iZ0{d앝2dlLeܢr$eYߩ`b:5>@m@*p9v]ii-k٩lb[_η\YS:5,5. Ӏ0"B2qQt,P:{cw u^C>nh,؀-dbl Ձ[@P:v[^Av\d ,J_Ѿ%O-5m =,@*ٻ@j68@ujau[%:]Sםk=0wg-v\> ;)rw53[. r- 6u:zk k^풙ˀm˲R `mٳm6dZ̢2AMu6mdjMBᲶ-CٷiXWQ̍1U T5<]/X`úP2gYWk6Smyei3ޢlQ*NM\dB\>'R1QJ#B9T2W2uS&qEb%QǶ(R9SwwBU$O0;:/dӿW 9uѢʥ:|ݷÚ[`jt׫ۺþ_ܲB[ʏ/<ww_m^^<96ofċL /n`^DҨ(75z,eV_-_oO[Zeۙ_S5u-.GY˯C?ޠ ?I &N'tsyn-U卶ͺA?St^=wz>]5m^RzS' S5grz SNxr n~w:@gc~J m/y]Ҫi>/\0}^ϨgXs0la cܞqR*o/k<q! -A; .⒁gיsn͠ǝ-kT6P4c~)d^gZ /s nMٗA9O,QȶL\,m2fgrKegL0jum \+5՚ΎauN ֬QZ@[Sb+mrmX|RY)J=iȍ:dߚ[)zɴĆkyM9X,mwuMnl12 ܚrMMjYq%Ζ0ЭX%c3daEXum{@YEM Bl]=,gY /}-jG---y=(dmSHck|mj~SݚZԴDi }Y%/-8m1R,?܋-Xhhrgz^TfP!ɡET55, `2rCuX식ʕ<[k%z~XPw(*Ջsljh |%lm)` b]F٬]hwP2"֩j7cEaqE- G<XL9[ydQ5;K%sq5uSڵ>fnj*$cP}Q l6nt5嘆U6ǖ[dM9[~(Ի]2N>^n]( !:K6n]-fgγRˬꢴ2PeYZ֗[MԷNՏ`5{Y%cL7巌o9s3` a֏­ɺ9=0Z٫/3m<Z_jX^#c'ʐu+LTBxD8 ܤɘ-R1S&qccK)@}W,X"h"f9&m߹S;d 3p ]3:K+tE8w/Ol>[wx:~M_ё;?la [`8v[nKޮ^?;N?_]Ӻwpis*pݗO `*ZDZ x;]^F#=Ki[19QLoL!>7Jk,R:ŘQ}__Ft[in-҈GMo>P\ ؆yqo)(̮-;]ZW+-ʃ('$ۺ麺AO3ԩs5yNܣmU2WM=_uzʶ^"7m}}~SO|pъw]q{ خ|ȩnr*ڏkt' P epHN^OE2x~a<[Ą)"h IDAT;w4KdֱO~w>2ޥgiT,[QԖj<_<_ބ&EM%M'4Qwrs'}_ MKeʧS%bJJEJFcJ"JEDbĢJƔFŔFƕǔEmJؾQ%`)epB2ӗ_L엎$ĔDoT)Q)*XmQ2zS<Sb("E"vx$H|E1E#;Q%W$d$xt^l'(7w(bad@X* )%w1{n7;K1N\ƹcJYhm6cqGRѤȌǒ~xLgT%vOr D"f$DuWLdDdQ%XLǕJ)+ {1D:TŔi)g:T:l2L*\2L:t&\:L:a/~r٨r$TĔ$%&%l}r2i1rIe3ie1e I)[_fϦ>W>Kı<ےr)y򅸊Jl+U(T*^BbZ|V}*R_*d*7)RVK*~iM/US򙼔&l{NRROY9y%ΑҸV^Ne/cJ&JIʾۇr>h_JjO\hOgU*gTV&Sv_vurO0ϺK)˜emz(:f5QʨTNi2Jq9Y+9fҎ/9RN˧s*Ӥwdw+D)kSFW*U*w{Eyԧﱜg5s  *yn/kIs?u.yYs8ON\{ڙl[V훕T(qΜł >iFb֭gc{="e!B!b7-?{2_IX`OJ|Vbƞ|!|.%?\6l>L6B6evk>la [`O M%o}e:qqZ(%ԵCEECX żȏ}^dOry ߢ?L/edoYQs fSa-.CZTd_Ke/wU|H~-}8;1Z{} J?(tRz+ˆ]XfG~|B =-]4uͶmӪ/83}qk >Գfq|x`2%~J>9 VMe%-@@;kix1la {[s2] .ݫ6GS(?wY4w4S.i4&ɴ-a\Ln2nɼ)5--lMkҎ-hDYJ%_Sy^ڗr9i3Ys2Y{^Ⱥ<^'䥳*&SʧfSIN[|Oܴ\FY).&3d*S*ʦ?(((Nj ˜'is^RIY+R)e)@K+NH {RɌRJ~)G@Q:2Ҝ/W>Q.R6U)|?mu,ɦS6e9&LޝsS6Yݲ9)V\F\V\F3l>k0%udriyS2*s09^)W+_L+4vyB@"`d@_̪XsZ/g~^e7eVeU` *ထ< 9@k/ vY3/TkDr^4>?Q0zi1],eN53֩&}M43ij䔧ff5;[Զff6iLQ3[kfl?~״W3d۶kzʹKF%m*jLI[4gO[z:azx:~;wkv%+cx:aLY[}ms43SV9˚VftLYۦni{Ir{#igv;t:]IVf$A1dr4&K2`11`,|_OuF0B]8SU]tuyyf5hر}wUڡ8F OW6þ\sv/P:] աM:]orΡҮ.Y{~6pls{Lw,P/ {{k*痤}\s渞4RvMBubOi*p,X7}$=;M=|牣8W'%U;G"}E0-ʼneI˖qSi(NR[sƎb~sa1oЏ y#6-בLzM-%_W 0`@4ϹϟuS PF(;:9MKyՋwi;b}}͞KԪ+٠J5U)UŬ\-qeMU5˦tŦx2+k6NdӮPkZ)hyuUZZjTJEJq|lhv<`w [R`"?xX̯Ewa|[:NQV.齍sfggl'(_~˻}-hE ,Zmc7GzOuzwwۯz{qo>xi[{=zusGcw~~kwN$ ϹKzKs^X߫7vzY}\>ҹz@U۫]z+uA=^Ktkl>IgɞyP:k5}MR{v+mkWvC{szeMv''m >ϐ;@֋^yS{hoi / |#ߐ;w>}[ +//LX%]_]if`(%;ڮq[Pj]O)tCU̶d:e WQ44 [MMWQ(jol'&mo6p4Q~ \s[-yFKneB6(>o۬k!(7lA&si0jUw5jyuBej^kِ W-KG?6 u;VӑQ5my;߆غ&iiԲrM涀 y˦gPjՐۢ] [ϦkrZvx[g].E sr7SaT7XꆀԑbɎ-G0ܰe`p䅾"U5凮B `4`A8l)]I) B :CNRv 0 |&&`h>Y? ԉT_iS J|u \c`,5iG}`b' v@vHv~ߵuz@nheЋ5{PnWo5E Mz@^q7аiw5 md}Yk܋4y # xh<5MFFTq$hh<5Csk:4D6?ꏃb~MD~pľ" dք#ƑDA[I$hjw4ӖN_7t4%% SuG}D^[~aCuzX'{7(~ RgPܣv?rD6ul0ۉtc%v*McuStpH nJPI68bf8R]'Q QێB&\IT& OnR(?`O4|G01E4(S3@6y6Ży 0mVl V]5ԁ F] TV^3>s^cO.f UUTs7hq2@]\ѺTT RQ([h[BY*)P'UqQ:q01`wUrp\K?q\pa|ulEet%uΗ.-'g}nq/|X-𳏼K?gY↋>}3{ػgic#|{g {SN[Iqi8-s,6s9 uzwD5A}m xtO7wx'Ч=7{g V;p2Y)jqzh\={}(;/w]Kp xU@O;KzWkIh-u=z]\9OUlU]9yJWϳÇȑ#V<$l7_ZXoTfkr y.+tUfXW E쀳Zb{|ۻ|,8 s[/ipfGps8?ܝ_G=QVJijUwK=W pw٥mbʞA0P.l.|[ -vi("a]W*q%c6!nKm|1myyȾtX3]W_M%:5\@d:]-S(B8& ga=O骰mYDn\|t»cr+>Z"-:]G~Wඬ̏\c6ml>nm􋿟Z>乾Q FǕ5yb꺮<ǗNl]996l>iqM)Ԩi?'䅮-g;P`CƺV3~PS 48 &y=_NJPš'/ &q(  }@!$AvSJH)*OJ̴kp'C@N)#C`ꫝ@Y}#qRDaE\Bz@=Tװ˶z6gX6p5To 5^ b- u@c@e/VPe%t`3S xPSAT#&K@ph4I4I[c $(0xj2I 8nMch:2nkcis8qlaiFIq4d#$h#$}vR\Ӷ&cSml$v>6I{tdRQi6cM7X?ƸF[ͶgAFWi׎qtѱqGiF_mlL;}I1}tdtmLz:Ĺ58Ӷ67lv1ikװtڣ㮵t1;j֘cڠm~F㞵&h]rNmYwh8eMm vi<u1j3h @; Y̽׵c2j0,ؽQFa?UoV s \ϽK5#1pӋEV1Nbj@p+Gt7%˟}W\/oT2eɜ V"m6y}z^}ۥ{U(m?k^]]ޯgۚK^S߭?񵃺tPk穾ڊG\DΝe4+}GNښꫯ֮ ^e@vns\XԳE{|fs|P[ڝpd.-6;Ɍڝw@]<g+@ pQ]vezC߿]}/ɾ9u,}. [0_F=N?\\sq?np?eTKG,W\v }P4m uBu@m)nSrHmNkԸ)'Q/E.g`LF/0>JJ\: |7pm+PnK*vPz]``4L/9p`߀.j)@jJ 5j+*T 1Pր, 8KuVdLK̎x]@RjټfTn LǕܵoԨ\/`5=(ۡtns@`` X`3p-.` Lu Ldֆ~h0=Q5ж:. q^;!YGyVDJ#4EE i*6F]tbJ@qmPX$R' b]o)gwY)(Vu{&:Yv^`~?0Ebڞ^?5받Z v l`P(e{*TE YW;pE-(_QhԞڠWIl 6==߰Iga t E!C}{7"g> ^,q Ǹ IDATU1<8 4q7h]39V˲[͚Zj"zCƺjAzb#ں7a_5h[vqԵDjZT ,J d}kV>y\1@[^<;/hKjY<~BO\Pw9޳w9{t OO{nw^ř/Z`X~s߫ѕ].[޾~Ei<^EgaUaib6rqکSǭnI޲zU==~]5U-P9AoKbޒei[׼]޹McqIȞP os^Sg%u}ZޯKK4X=ê-VgW:JtAVRh ΡlT;NLQNazމN0͕'ި=7Pi %;OZ>=.xG<X(,P+}D,oRؖ}<6=W?U ܝj\Q1noo>V> p wn\>J{}uK-k3˲xN=Okvy R74;۴E^aamvQzD [R 4Le6^:"ۘ0ul:r"X5(@4Z(P`%4EI @Q7L劺a_A T]!vű]k"_rVnbzd,!-4m`[ a[*i/]`S myp-쏁$;v-E~Tڨ!߮ɗ bamٮeD hQJD/ՁEM XE^}E/lm#JSQ궰%%wZWzJ 蒑60m*Qp#Eg*E-6Ʊc7mGDȋ6lOV=>Knl> Zټ:k5DEin/24$c[>a'ՠ |x@~A7ՠ?5J5 hҖmQ$2@m1[[l ֻl``^XX4fG6usTSQl5`tB%t FyhPN55umdN`t#jQQ.EZiqb7HGz{z,j=xGˉ:Dnl644mE sfTd c2Tq(Q'Ξ? "%s0@+ryn{1 n@w86tjL49᭺冯h]'Oƺz2mT[2wk5dKZkm}Uj%ղeVLq;_`5Tjk5UK*1_)kujEU+Z-ꪎP'.ZX(Vwg 97PCOx~Oo/eg?]t/Z`X'?zuEMvEkǛgeepK=SݚwA-˘}[=;bUǭwݒtz{XOrXwŠ}z{w[F[Z 3ޫ{- Ҟ j-`I_IBEwk.j .Rݫ'Tݦ}@U>O\ݯUX-RZYVeelOf5ЊR@/jV,Q[fL`B 0 .c5$l%_ثKb@@R֙^i 漁(t[ɪuQ.ԭ.0wF]"'kvtQbZ1y{yoI#)bcS^Z2Uk.lɫ}kcIO}ht@\ݧY9lctAJkpvE-y٩EMKN`;PwZ;h砖.ʢ5zg/_s>M&^҉'18Ǽ~qc<a^8u~LG>UW]ewN~U˶nTǬs}uTR2p:F6N^cdΔ):.PdR׍W$J=ߎcsf!6}Sf\ &M#vdPbܔ*K`"Pm E|upuՖ&Y^-EN,<]hdע?7pYpQ;"צ[`j8>jѩFfӷ@crr45)G({YnڀVo䖗zUe>]!9A׀sBey5 z4@aphriemS~]p;= zfJ]Dc5j3hk|HNvwSuz0("MGY)oQn"(AE.nslm3ea\<Pb~hGQK' ` rÃVs{  z`wrݺPw\mMn}]溚'7TolVUoVZoUoʭi^/@[\\VZW^Wuz\ܲj?Ukk*-TTV=ښʕ5תf\*WUTYQuJY%-QBVJZܢ-\Uj?Nv;Oʻ\ݣ{vAփCoo#adohE ,Z`8s[?O^YLF#uف}ГVRPV;{ sJǽ=GdӞjg<_ogrv>cޖ=uَy,G!˘5KuvKc+{G_z5!>>zPahef+7)iOv{w|3?Lρ- |w ׽-g3xv1zGe_zMoc3:v yߨ^w\7?pM|٩5Q>zx28J9gﲹ[R Xzeᢐ%:UmbWի:R+fMQb%_ 0%v_PbkvɀQSb6-t Nl[LъZ: lmЕq:P:حH\|2|~blʦ6x ,XX#e*[PВ[zZtcX60]Ӯ |}rk*@ P:"7Ʈ撓X-֣zc:TRmKRjǁxS;uH]Ivu2dvdPubMK&꠸J۱d袐"g+!Vl^;1enMFB :.Y#THA[#vQ#"\po*I/QoԷ@Z_A*˫v֔֝C(b3C˅url4A>. T.mX6uAmԶ}))o~ri(JCSu'; y̞?XrMwPX J2'bV0rp}p4bk5jEfTd.M9 !J.QQ zEzCfMZ]zYzUzYZՠmZQVQe}]JYUro+,\bPڮ\hTZrJZ<ܒJkeWTY+kjYյe4 ]+-/B\dޕt8־{n=nl=s,=}\]?<6=Z?z%;ި_gn-hE ,Zn7v5]+9zc,z_:[.nvr YPX8-gC={'x+B%7wt/+ܲ^[zwʵA=='˺]5B-IKgpx[ pևzy}t<,_W߭74v=vP1{Ui_=Wyz,v׽Vox?ެ?^]Y9;'˭)gY\[suӼ lOdg~'``g~],>?_w=yϻ r,y[& ?O}So2.{鶮6K[ [ m9jO]Um7J`*Hk]쒱TJRi\lb:c7P3P1@-kP@i'VUlp(lyLY8FmטK ,w&X;~YLZk"2rbt%:wKjZ:oƦ|} Zkӑ."جR\@tQYE/XE%82)'l;ɨP. 㚂r(SCc{fqД6aKZO%#J ȋ6]of͍ k9iRnLGQ0A]*B8_O۞Ahk%*@nNy܎NԏJN쐉뫍o1DJ jOAigrw- a/*Hc@041y]mcF&R Zmmw1k6m2یCf]kɉ&N+C 'Nbn^NMuHT58$5b;FaO< M945 `Sݒ5IdVb\PFuzZ~.vĨxQ&%42zv 0ƺ[X%OPWGQn.\Mfռɶ_SM7QX&T¨oQ>M 3]a݌2Ȧ5kfM5D-ѱq`10Y1o%C4OGqX6Ů(Lm϶^ 5-.׾c-gr|S@.yX85d s}aGA_}Aϔq-LDDA׬z  {j9ڨ׻| IDAT~/P"Ҷk3R%ݰI'[.P=@nW`$Q0 q-ٳ$e~LS&ae2˳-2d\ Z ZN PeM oS \Զ6kdGfMNkzF*jY6jVTE[_7mΠ u5jU5K4jW$^R^QFlܲJ^^SV:жTU*VV%S߮UfɳzEniM+k%VR^jYU]|B]xB괼+/wÏ7Swܯ&+?]?~Uo}~y; hE ,Z`gn ^5 t}߱v1gwI:c, 14-?rWM]{E܊=l6׺=Ws'^cӜzW_wSU4o,8 fLY,-`,Y-c ZԶdRkMʟuwfszX&h}&ulKuAoyG LOϯbųt~M]Y8&ǞoZ0/| /A9Ly[z |zrQV~3?\yq'ĝCpR{۲lSeJdgmS% \uLV b30׊c) E튅2JYV5+ɀOTӦ[WmZt~ӱ]Xy5jfK-2lzg&jCn]m}qHfp]*jr"unm P߬͞Y(`Q3/l5z7rQ2y \(wQ!Ur ً3 XMľ C,lEkiPE-0^`ԷNq~=d咳 B`*\؆־lɸBrSF174u-*( C,%38GR 5%n%[4KeԸ:a4-q۩Gjw<& xRcjH=,T ֒ mC<r7Ven~SM-8@;yp2Kgl#jTVc5%.6ʑ)5]rLE8*2nCFeN"t,Fy #u#>٧T#`'*Nɣ5b #kWMC4k`' Z#@SP2YTJҒ'[(~7vUFu T/ɇ%_ 6S&`fє ]νk [µd|Q$D[gq3й/.]r_RsB;4ה*DiPZo@/VodYgLl1j\[}a< hԺ֞=[!0{:0-iTB}5 f=J p`5=Y)M5L=2>lT^Ga[CSܦ6unLhSb;Ė\~'ﮫ~)Su$I-v,+erbLquتGJx7U.ϠlSrU̺DJ"rS] }E Æć(oQ<Q΀Ӂ)nq|[ֺ6꒽Π-S6jp ꎜʨsj7To0&ٷY)SozdPTZEʚM E}[n˵5Z2pQTTU-k&WTؖ(T:RylJ*}hy'.En p'ǚ^v}#ާݺ!=L?}t/gn-hE ,Zn D G˺a+ CRT]ڿC {t,uJ58ةe9ًݚ <ۧ}]{o-+=dVnAW 9}Wo˜ +6|~"ʲoywԮRۧ4wMpvi3ܭF{ъk-%]%=Wl.Y6%=O^KaX;W[ޯT}6TQʊKNir'Y>8gq?'tT?,}]veJԔIo-;Ntm=Yǩ 3Sc1z^7 E6]Y( t-oy{ޓ`_>Kon {x sh|zsGy}}W_}9۹[F5Dmǖ]Mol ɎzNkŠ\WG)0DEAPd`2E͂kbWaRONHgIˍ=i/Y?[Pr]Q>Յ֬ X'(9OHuMKfMYԵfl Ş ).$lP`i$pJm@jXr30*Z!G.*_ΨzQkY0 'p}7˔qQf)xɲJc Rp˻u=a!Fi";|Xm{T-X %/P#6<"?7J\a`6mn6 u8E_SԸX!C۶3E.*H6]-:,}@6ɑ^7vڝn{PIKn{cɶ-l,ۉ:X^b?QraBU@ p׬ [(sɻ0;-t0b۶hcȦN96JZE.{[֟u&f)YYHTXqTn2kލihy@Ljɛm9j]ĨQ#-9d{cˊ5K㎩y-6k9Xs9?c`qGG ;ElșE5mZ` f ep;@5l킍rkɛ3ڱ بi#u`eY2FfSڕ}uG & 2Qzi"zQߔճ n`pm@oYGg]76 <@>LFmnO &Cz1 eD Rӣ¼Ȩ.rS,~f;)pQwQ3 ìձQLu}rvq$2v{lCgS{<Ƚ-2Žx1&6n49oasl`NauZšPq֝κtɽ6TkY7.i\֩T['zOb\c\QnrۊV*W+**WM[2[ҪAܲV%{Dk% ʧM]l1ݺyg3sYnlS"y׿(w/Z`X7l@OǺhI7u}W?v8|wna|ukQϢ8 ˣEE"<=-+w}w.52vh{/?E%Ky_ ۯ}\QΡ*t2,?=wu>5h?,}z`\`}>,:[ޮ0> #m}>YmY'<ݯtuuybrXOG鍯Vo~M=&7o}*=>}C?A~{ޣ%x<&ӟ>/yG6ysҗ:1~듟XW*׾5y]A LOϯnomK.]Y({kmǵ{>@S9e|zg=ݼFq$_{ì0xeܝ^om[>iaK,VX(c\.ڦ-kl]3l /6݋h=X3EzTrIrEkqK%kZVi eU.Zrk'hmmU}?tvsMϕw0=ݎCumld"[.aFGՏg'xo<{ghE ,Z`w卺{X3w9ˬ/=t,̀i7E9Km4emXAVtA7x[޹z{X/q~==?vWmw;`{w=IdlwSS+i싿ҧ%={}Ȟ޾{n]\2UuGk9+空|XaUɠ]YLZ>z߮w֙<Ϥ=z::~'> ˄Y~ի^uÚpx^{7~s{q(G4[*,[;c~2O7zg6]7{I6ܕt9G?Zzֳ>.]灧<)zl N ni۲ p8?/~iU>\׵so'>Qv}:uW\aٱɚ}ck|{0xB;f5y!.5;~Ɔms.˶uKMAqZJ|Դ@YO*Zfs!ֳ|uFG{\|{`q,=pKw+;ڪPڮR.*GRZSyZI@޵eVuuqnkImu;O7zW797 ӊ=׫L7~[ 7X\-h3~3ճuý]6Z%m8Dz ܅) zzwH/enT3wX[_wM_O>ۧ%ri=Vi/:w<'7oZ{O[ߺ~-?,Kd]/~ۥ#+>=rPYԽʇVr6W>kڹj-֫^ 5ҵWhɢcqf__ I~ aH/| 'A-Vm2$QcrͱP-Ϩ!W:W4gr~9ȼu:mX?6wej_~W^|#'םoC/PO=S5\c;egy3}2`G<_v'vM}<g?U>vKNx ܹw'r|70h!y)sQ ro%6,0ٳ\[-c=O\xW^{kWkWYYow繘_21;,Ӟ,ޜui_k_N=+Yyyne?s\2s̩g%t(:/u,yyLsJ^Y#y#9uHɶ|(҇-}8Gm}8G-}4G-},Dz-sEɶlKȷlK̶|[ζ|[ζ/ٖ>o3>Gɶ|>-+_̷l[_̶|[_([r/g[JKf[Ze[zouofͶ|[ߚo۔(ɷlKͶ|[ߣζ:m}?mG~:+m0fWXkĝNFTJ n\VcL$+q0gګ*fV* 7 ƅmQAYdQTDEQ]QPdE@eqTdyy#[YTw8q+3o/S#_.`&n0ʅJg..vUH'Z]%paVgyf66oy?X/ 6gBcd/n|BmBb |u/qm- ?lwڵ C6>7{`~3c8o>>uߟK;I z|s}nF\;9@jƳ~3_Pb/./J%w*VcK2N#]35|IE*Nk m o:kM+g]m-z=%%uע0W \`[t KpKa[+ ׁ[@[+Vgۢ1Ze\ CۀZ p r o q o+ֺa:E0WEۄr pep n q9!5&ܝq pu %%m[zKKp'\+7@\k W c 5rzK+z oA\q o nkp1ZKxo pr&5A\kq(C3 IDATA1n,7 p=%=%%a\zxK{[kAp+8Kp1Cx 8!֦h pSq p=%=ۄ6uz+7gm Ma,>GxkSi pS7xKpycqTr pS|C .n\o/쇀[Kpa%X\dS7Ao 6xqrc^Am6:nZ?E q3)3A\[&?!Wn7[pc3m2q omp=u q %P!.{I np=}A@4GLT@oMZ?Lu0i}I+?zv6@\GGv>ax \,P(wRBbbQbᑜl.a~X pх- MctwRk}|@ jE ohsމ'?z 6oO O3½gr K:pn;BytTeuZ]*?{>doL`8LA{VuX4gOJXS[#3Ň<.H}n4iojڍ;=s"ij*}=3wT>1+ǷLuNu.\>хwʉn|v1>AP\]cUn9&rC{(۲cˌ=*Bcue@OnAt8^4Z]hv]v qh2F ~0@YƄY[ 2[^cD'#DuoƬ sbۿ7㘷sdzK>f J o1N'3e裏/(tu\k+'pBK#>f@kW~1F#8sᾸ3u|L>ZՌOKuAdgY v|XymQ9 oy?_U?kY?k_P q>=t 6be*vLc%$kδ]]I$2L2VMj8wWq@W@.goߺaV,\o b ޾u3[grv]F o, ׃[o=u+Yqirڷ2{[ξU 7@[j[oᖭUzb&\,\oKv[i עYApž.[Z oimoKK dƛ: a6bߚ}qW[nA66pž5}Kp.xD;<=oi3pK ad:b۷#ط4p ohzxncnc8W[~+m2p 5ƙ}Kp p }go nռ1=۷:&.-M\CW!.T \6o鄸jnþ!7pxyoSg_m0pSozk-\ooi^`piߊy \o qվ!. \ViL\o}k}K7Xm0p r qվ5ĥkSоl:xK 7:p[}KkȥKg2;n0piW-\ڷu1pou-`֝KoZgҾՑ5p o4:.- `f \ܬ} pih6ppc.4o C\7ɗU./1Ny8r1"}[mX@C!O5<߰Aʋ8𶻻{qǞ#>#}_s ~=cn~[AZ'3Uk:6p~n7vK8K[&ݒI쓌=J@'yUᠤ [Kr:ֺŐIg$+d[eBlN LZ+)h[Y3GH}Ӥ҉{axuRġ~Uꗈ}# ;oa{#) #(rcY q/w-ϭy%\,]w5,s\a*-]]̎g.mi:z+2쏷Kp1ǀnK 2`]磯{Kl6}]|ْc1ܯ}k@g~)@_p/0 T {އ_atq|=ݔbSݸx VNO`ݮLcu2*V&&VV1Te!_`d[[[7[e):#ٷ.VE(7۷ s#jt)ؾmRnD(3NY F'KQvɱ}[l#i2:٪ndJ|rj2Fzٷu%JE'-\gjrOۈPξ%u W#5>Yۦeo.-\gu5>s#BٙjJ|2[&K|2#µp7P6Һ #OZFjJ|7pC|7pV-\O[NZM[q`jtoiQ.B'ӾnPF] ʱ+eO`q6epPneS8G)7G(n2B34o9b:V,\ojX:7Pf@\1p}ۈP-cepS|݃\Podq+,-. 4o]2 \F)K|4q5BY㓯ظJ\oපoe2!ndB\?hbJ2[,QQ \geo9LhK+3㓝+4oede5q,-[p}LhK.=+ʌN[5q,-[oj|rS qfg2>.[Zl/G0RΡTΣ0"J2Jŏ3mwW>#>x\mlꗵL4[Ǧ2aMRy`J5L`Ry;Lc8VUja! qi۪uv6MV`ڷScҾu1bF=s[߅[bF(\moف1pҾd[N 7cJm\ׁb1޾ma2B'GM-i߶2p5B4p 7c:+QnJ(2p5B9%(1ڃ1ʭ ܨ7 1ʭ ܨ7tr[{p5F9c6pi2J=}K\xq%e.#ep.7byA'nL܌M5Ov=t5p}",=[([d \oC2y\Q 1bl2mSߦ҃+ֺumqn1V@nK7PQ&m9tF!F;u 1ʍ\\v2J{쿵μelG=[[vۈQK..;pLK }p}[:7 \nԃQ&۷p7Ue.mU\F)o3o_uڃdJ.A>GhJ($"]yp\d' 9-}~:!8z^ ى *vZ<6~ #>#>x_: |B-weKmwྒs-qҎJ)?OW$I&ZjChŔ%^ߨ.WH+e_Yrڋهjݸڃ۪=:铙ױ] OJZs O.玵N{.\6-c("9np P'v 0G{~cA`gJtn8& adxpG2B7:+o /5Ӑu]wYx.D?oiFdsnoڴI,6r], 2`]磯{!i{>XL_F9ꨣpꩧ⬳矏o}[M=ܗz'WKJ=1@Wr&_NW|7_ccϺVo~6ގ[<7`)6h2%b㮩&X]s7+OW'6M**IBn־%\q}m+G*g[-\ڇyoA\mK#-}+eoكZa*U ۲5evx;(3>J'GRf׺\dneP<l}ms[Zb x'Ktz,\܃V -\g a|nlHZM= o5>Q& 1匁m~C\o׸\[?oվX >:1j~9vy;p=F==M-;p-Nbtp9lSQ>: W \2BQ.{p?e؅rwk(& uɩt~b\Re5pW'[K}-m˴7P}j+]b*[O\q r reO6ajrpykS9 WAn7m&죓x C\1p7p};pePс  q}u<>:Y"iz4pkR7\ud7w2:׃\F'NA 7qt mmF#(I|rR#FyEsq (Q`?n. ]X. nEQ&vFw ;_w@qнx'=)%bd;}mXY<:|"&c82)adB, lwI&ߕW{JuV⿒~Knc VWMKs69{̙&Y]g!ml肯.b.hMN(mvmy7˸x?~>6>w_?A|օm긶mC\w[r,^{5O.S7BUn_~wımZm3AwetA9p_~c;_2Dj.;p[A\K?9gvn5>9pa'?X onԁk->h 6Xc޾_%fׁ6 iD); ٷpoOe|¥,\plсyk azKpe%8Bˑ}{__auW=e2b r pKnQ-A^n,.,Atj.كwd^k޲ o9q㓳e2{pMf}K1ʴp[ue0po۴)>is.c q* 7([QVٷ6 qp }.MnjpM ڷnL =ΆܿۈOC;pżURh#Ja-2rE[dP̡P(ab~6erK=׃ۅ.G*a1U=xO]O}U@@lG/n;qؼa ;SxP.y=ζpi־-hY&C8)ɁL 8$)I^յduJF@(>ZZ?U˨j='9 d?ZIO4i mu7TzpS{xb^G16-ZBrڸvWIYc8w̱^|d)#D~2م3G{M~YǡX_!;Q/bMGKpS̱ZÿV\|U8Mv?"oo?|!, h5pu^vmpkڜmߨYAb |uQDZmf|?#ڸqo6%$TUəf-4npG=ni9? aTs|Kmr-~q~>qnlp_~ oV_7ǟպ9վY!K_ p_8$=HꤋP%}*`GVN2ª*VUT+XYIfj:2pi0!BZuLe}[ E)Zr{Lx+[[F([龥+ÈT:p-ni[ouᄉu Wzpy}k1$A\)u[F'2pk}pZLX7K 1qLp \ \҃Kpk-}Y \er5uZ!Nl-;pzxkl: wwpy IDATASڃ uv=O#1j\u&Pa+= .{pV׃\pӾG܃uazuQہ%-?` 8Yzpeڷa\F'tA\gO6QʌQNUdu1omOZD(Ӽe)>MЁ!ɩG(7 \F(7:p-αt:ւl%:\BYYzp#PP 넹/ՁkS\d-Bmd^LxVqj|2g"}{UlZY!q (y9[dZa}?!ײ:p|u1?e,)n}+m]:p nK|M3ben܃ۇMbZׁ+PfmK= q oɌP& 7پx+,;{pفdvf"iۖJeJv1 V^"eG0E=֮߯ p_n!q[wiOX\?$vų7^~ xvѿG}G}#Z~}쇱y >*Mҁ:6pp>Xu&]U;iߚL`d{'8åS].,kڇsd9YY׫dNjXֺG1hj=֍Ժgii,W;jGpDhgiӮMҸ-!//|o҅pdy):ރoNC(01{K~A;bY bHcٟyZ.Z3:+૿7r^~hQ={$I[YABŶ} ylv.(-9l{1cMOO7W1@|1?w;_zӾ6ٙ=;0pc w75pM h|rkٷ1+o- ܗuE(2p_&'ȼmفcMB[(jZ,\cB|a:=4qL@\ZP- ܨÙ\Mm2p׃۸76pكK \ O6nf|D(360C\Pntb~X2>Y"m*= ܳ:p=Zׁ+nB#ir=m\ՙ W \c!YצbVF =rep-`2A.#}tB\bҾw9h}KeZOl o psb+7o]n],\ڷu1ξ[֑fb r=a(e2-an\oަx,tpv=j2J/o pK7;w!n&By\Dy$/2J"^[^εBi0_ֵ EclSpqFa v:yx;n_ohh<=7/>O|6-կ+ki-Y~yb3&". 엌ad{WƱWeG$ENdiʞ]]26%%\U]GkyEڇ˓~W/=`-/g0ݵ6 W_gYB\WqD>;--h/ݳw. ?W;_Q~|܏CKga9Z\zy9֖C?\Sq+@VƳYu ]]]ݒ\BN.8"BG(ⓟd|uk֬BZZh"'|2p?u 1+\lu8}nV|$|",ܒgyf*S0u>3c(Ƿn1[=/ޞUW]%c>}׻ns76=Ưwn|[gݎ *9daS:+vu~ӵ qSX%OVVFu޺.\B\yD'd xKҼuCȼu-[Q0pio-[]j6oX}'md*[ket2An`\6 \5qف܃;j 8W;pu.#}uUx1X#ή`5{o[g᪁Nqb vp-v1qAþwJ|u15Rvmtc V~V[t6,F.pirWo}-\ Aaec$Jnp[bm]{W#[v0W[kqD4܁K7}#kjߪ[QfP4:pم{M,`uC:p޺Lx+ɩP:pS2pcVq?G׸3z Wiz[O4(;6ŗu\ 1pM!6mҾu.omRo d5pM U&[o[zW,\q5>s6D(j|%{#oid]F(Lpk7E־6>F9Xu1bۻl*[ ,Q{p p5>3oijI4qCط>>6ٷ)~ `f[Z+6ہ+wV n0penlsTΣX0J bbbB^u. n\ToY" rS~@@lG>!\ l>-xb Eu.fQTFPpvEZeJLMINJd5{bP{j2٤$CqkZt'- f=LS@V{d9_Š}8n։Ǫ vẩn?ыoLYh*8bcq)/C5{IO^Q^ڝrB>7B?%˙l<:.ra Y]\/.̾/Y1U:w,ni?&/N:&CO~=ܳ ,1Wt__B~mJݒ|R8{7G1">] 5m/d>xM1߿+gNyrwwqpG6=.삸o>~k}=.s*\G e-ܹB\e|r14G_`/ɣ\,b$_pyXK!F._D1 aݺ7&Bٓ. n^h_X?[?E]xxg??/}%@@lG쏯ƓcU< >ف.mG(ܹÖ^$ce8y؉<Ɓ{wwVF񡤀'T)dVcɰӒT/Hd@Y&t%vLiO|n;hW8r߄ܗޟ?ӮI{GWOt㲉n '#xwVr@nxH0FsC aŊ2|Om>/1mPVXߣ.bgu;g|W\idze>;񎰿N;->~mhu\\ufW7OK#`_$O#y94Et}jVB?} u\>.--9laÆ&~L 8q 74]G C, gy'|OU{%WpU뮻g+\?>z?>>n>l|k_k0y~wBZ>lr|ns py9Vpz.9ڷwu8ZÚJ35ԪG+ f V'Sn+'g[pҲm[}K u\,:Vo2B92n:p5:Z1q}[ ua2FYAQf(FY-u9o p>Jo=%54pmSϾed5o-$>Y;p|-;p}@F߲ ׸\ڷ5Wu1ʌRxko]nxۈPv pݷ 5J|n*.[H-[b2J٘(yC9-;p}ƛG'zp5B9Rf|}fpN.:ZFnP\Lueo6-[v"VL\0oi޲W⓽y+.Ax\Nv, 14p%B۷҃k6u-#[[pKtr*!BZl o\[[O.oBo72oفW#fJ|طĕep}Uځk<M\߁+G([(,ҁ[oj-=)5μOem\\V\/ q p;eq\oSH|䦡ɾ W#}Qft:~gPw*6bCehFܒRR򥂘\'+#_auЎP?oK.Vn"]߉Ot}/&2Vo_8s3@@lGŧ_feyKǒ%iG(osz pgc2j#L A5 XƋ}C'糧InIzpشI N/j?nWn\iڍ;={w̿E%]~T𧌉2_HNu+c=XضN:q7XwSba: 0Ya UNirn|>^_N ՅƋjpAu/6T{vq&0~W 2.Rǹ8} c?83_~yx~%/޾馛 |7W^y o;찦_B|MqkBP"{w(sE.,Ux__ppz bUZ(OMaeRê*3Ib'nSUԪ VV1SF(;`p]/Z2gݺ\ت}0om}>\\1qZ-\oD(+ȕd[}-۷ x W##)FYK[uk̟}o:Vb}Xځ4plh:x+1 r}.-\E).\߃6oڷkV[5oC5FpCr5C,\+(⊅\Zo w?}`D(z'3Bު.c$>9D(.\[kobz歷oڃj߶#.\c7(g:p5GY+ξ5:xF+ &G8q oiTnQ#:xKKV \m(G8E[+ʟ 7Kp`:ujr*!FV޾%eׁPmQV )B9mD({.!.ᭌl<ʡ 7p]rse&Aط ol,s[c}mԁE(_G7c6(9Pftroiup%F9PNq3!D(;g.jYw:m[oפn]mMo聾"BY o5B9Qu<-}mM[u>fRwZgҾ}ܤ\[P%\[ڷ5 r܆[y[D#># \<=Ď}xbe6Ahk*"iNbrٴo+a"+66</bDN~Ns8gj7'=1ŹSKq <5&~\W}UM}A\S][b%Z>c[i#%%нiKLOv_A+ ^g 06BA_ts9 f ˂Y.s \䢧.rI l{{ۂD[ sօ~>1n?ƶ\9C{S0%(=묳Tn#͟iL-xG:*0c{5f-S b}3aڵs ,7{?ޗpUoZ=q14p\5p,e 쾵nV1j6E(+&.c}2-`J1.�}o]|r2([Nm6'KF(\bF=O: &.#/L צOV [we׃^[wCIAp{p=6o&5. 5p3B\gxkpW9\7}"ŭrB#2F #(r>R(4b #K&/#fbXgN-ùS8|by29(A8O ḉ8lbXT$j9ՇMjvɬV qHW͸?fH:Ahm.ZxfrqHq\N =x'R_&[.qƅ!L0B970ؚEKhkmlfl[]E쬋yAoUABŶ}oo?;?-2X|wH᷿`o_6Zurggegyڷ:g!vXOqliUNWL65I pr]4q \Aܦ\>>YgF(~۷p rMiomZ۷5\o 5DĽ֤p.>Y;p'KMq}ƾ!.c¥}C@(+.\F(7>>۹mPuҾ! X҃6u2B )~mT[ׁ[I['}L;puV;p=ٷ1? \Zs܁;R.addRQ ("`OP[b\,6-HzvӁ[O3 NK#X%9ɣdz?/>䶳~%#>#>xw7L;¸cvt_g;B9EznL-{{bx\CLJ𥩥5ŕ~49y{}wTqi_Zm[Sq҃_Wq;Vd2BVc%ţNY钾Y#I'>7ڃcJ}.#7م#J8L@ۇ0ƪ VQ^qC˘lԱǐ6u۳jpv>0Y|mv? sօ~>\ hL.4c(4kl]'Ex@}n<ᶞ l|&;+z> ) p$mgXYbXC 7I@jm ԦfjFlܙ q+ġu;pهpd7nz+=2:ٍku۷[[ gZ4 Fn}nWi.cռ[r=j6zp-ԾҺe[ };dpi:VfL7e[mpo[V-gu=쿥}kdYG(FWvɜ#mW \ (g \O=jf;p7d;p㓃--ЃD(7:K{f{p%B'1pl 4Fyk-ha h>Jy}pi~;LD(p)\׃.\l 6'KxT\ F)=G'3>Y. \Rfطܳ3p϶)6Vbe[M!\׃:pm pSg=4pZo \F=o+1ĵ)=MbZ1qZoU,klk4Bݷ:ڷ q?L\½ɺeήуK+6ӃzpSҲu׃e[vߪ}k& 7+}+[O ފ+uHڷ:Tzpʶo93F9ۃ?3:Y \;+j [1q=l G (ž-r(K(s(3:8x_F._F!_:vQʴp㓝żfbMs!{Jn t.<}xGË|v[ohhm{~;.׌.>m=eYwh^׋{ۋ=8ԅ pvE޻8hb߱N&pEHqCW`*WjZĵ^9Nj ݴ]b҈eUδnG7 ]h ?}&1 lt᪉n^.>ڋGz.驽h^n;փK%x*BXj찏>p6^\mB.LB.\f4sd.40]l׽~G= +#8bAc1#[b]e#[+zc7ec W{peo5\vZh\5pCn*ݷ'[|2{ojOҾnlJ-m܃1ʄjm'ӾUx%BR:pk#1bQ֦*7s{p pdo)׺eo^Jp6)bV2JX\mRerOv 7ۨ"طec[.pW=gveJ|N&Ƚ0>0p]D(,ܻľKnSnLM }=>hb:(K҃khu.>ف\\F'4iS[ ܿ\\tnHbB %bR°3sKy]ֽn;BͱV^+%]ӅL8J k W+*~@@lwGg :l~pM'ش=ݐ/8-|׋~K6AQNsEze8&׉w0'׃ptK{dDtJ'.uS{L]'1jv7UZu&m}\3ՃMmr&X%%p%N:qX-r7~:^ϼ/.3փ ǻqT<փWLtS3 ˱O~X{%87<YkF*븘6Cej{.ڶW{?7 sօ~>ǣsȫg?Cyn8}{qG}p_'c־moy/>os|=3gv|_|kpyJI+<fF+0M[M\_ [N7Ӄ۷\%x՟ t{u#o6bkOd{˹)>Y~v-!D(n tB"ZR[ 7(G}F \7h}k mu1ځKL+ xe1ڷV{peY>F=۷ ЃۈQHtOk:p}2*.D({vG(sۨk.[ڸ\+(s[c[ւ7ط46(5fbZ,Qvz(sd;pi-8[(Kp⓭p+=}kD(;kc89F q}.o5F%V#2jdomo%BY;pe"ہ1k!6ܦecq'GnZ8:KF({pno%Bݷb\|pnlSeƛ7ۃe߁9o 7Ӂ{[k!V#6P1ʾ(;ب7҃kAmVmNX|Ϻ(2|q.uo\9ow:p}\q:qT&\ .-\erqqX>F)Bz[Z=.F9D'l3uH%M{-\M m2`ΊK-uMEl>a7)_)0Z,@@B#9Jȥq;\*!_*ˣTZuuʋ}~~\µcK2eru/2S~|ԁ޹ _v7w7I'_&{ҁV-V k;X^GPK6, [ގT'N*n6Չ*/jҏ˘eF}J5?sg.,CixAP&#a9/XiNf .LƋv{|kЅm_A ?׳}q7~75^Hu9znř[TO1]ĪJEmkU`Zt5STfP9Swzj&:heV{q۷vݷjpo{,lmv D*G Wo}nt:Wc q%VZҁK`k}e7;u؉ G'8q}[f(7}-\Zq]F(k|p5>YgvJ \Pdg6F'Ӽ pž[SvVbqnQnP6⓽ ޾ܽm#B}q#7D(3'B mo0FF W;pi0ide (.B9'knk"-=qr| u.#=q\ڷs ۷6ط+wҼUA\+P\뢓[me+ʧ(e'Ӿ[o9eo]"[l,F(;+')iSmPfnQq.. m [ohP\o ln|RV* l,\rq}2[쾕[ܨ77Pf2v6[":쾕ٷM=J2cog}MlRd#ﵩ(ӾA66pub1BrqX ss] p=8fh 옳ó?^n[W>#>#g|:`l>xg<񖁖`um.c cߵ oY֍}(`]eO-vNiiז{03Ѓ ˻\2ځcCSD/w#b2{i?wwI')%8nx ZZwvJ'4-a0&;.\9މJ=8؋O{RaSm[J}8'&NAD[0 D1\Ȏm7MVz.J꼭,̶_G{ |.!{d]JjU[ s91ҸW;+slm_|-|#ĝ -qzP7s+;߿ =#Mgqp݈M[Kj Trr 3)Q``TMʾ у.F YڅKVnnu&UFO^jc `rƍfC-ְуmv. ʌOk@ pik[ \m붛[Ѓ[oj.A55.BY \]MU}do%FY#mmt:YY:p dYׁ+\oJ|2#dLVm(BY \ڷjJU W!.Z}k-Yn#]ҁk{HdmܨV \oP{pu1q2eh|2Ap7G# 8JXu0pV;pC2;p죔O a҃).\Oev*!ĵ ξ wJso]22:٦87D({6>>9Bo qف+=ƙq ou2BY K{IA 7D([oBM&5V`ׅpxk,}K ܖ- \?l z#B٦o"ҾUoCn:~nf(eC[&ʬ=>B pm{}&nWoL+m4?DkҼ6OQ~u<[qSt:}K֡b ۷p9΂&lΆbR eF'CTBprb-˗,]vmG(o}=](vwsh⢔eqt On OD#s !a b IDATK0سm\FԪK{ng`سݘ]хO;:ZYUcs|j:h ;+bp׏uN!V Nvnh?Ow\mv&e.p\2։N1ՉLv֩N\:։C=Xb)cL &cb}#( 8b688jraEBY$_˂g>moCw]gy/wJnHi#i攙l \WIn߻\qlm) Ihq $SBC !z1ll3gSb[;{6ְ=Ga扗r\~szh[Τy^~E] YDep{075p prj2._K {oi>!K{A\oಃ e:e5p}B9m>l.;Os'9L \<Ō3ϕ pSK~7Co|J/ f p \o#!ڷ(k68Lgಃg n:!\:,ڷZɠW26p}=W3p7p q pd[U ܐA[' \QfCfN(tp)ew+6pi5puBYyVzn8܃\6p9LK ľ7p{"W('(3p eN'eVg#uv'`S~9d eWgC ,QN&i*čwط|2[vpo9A!nY45ԛQ6Qmb.e؇ܳ> yi?\k' )z4:Კ8iL5nmScQ;+h$YmI;BE'i={vhEXIY X+!m8B\طlNOwL;Uvlѝ:D;w“kwۑqMmz3oz5'l?ͭyflٲ۶ma֭[qQGEF-'% lS@~RPS@;.<[0ysx6g?ǧ?Y9sEUo{p:߿ÿ[|_w_^fne7mi2anֿ]lYer698\4p#ĥ+ݼ-fݾʱ'8\#mNY}M''歶orݾ匲[? W'i 7Uvoµ Wk W'q:6P^aJl]Ծ- WbwQO6QV 7 :,8o>o3pE O&A\QljqU6(|B܁n e.6,omO 4p ⺅vp-\ߺ7p}F[B\1+`W:.]qB9\7ptg|A^fުߺ}링ܧیAE \or>9P^xV!ڷY4pUK6L \r.').!ywo%+ oeWbB9t eN)I2! \ߪ}Kddp'k7oMrsW վ l p{C>[rnKk3ʴo%M!'LmlF(nO'irFYnߚ. \޿P-ۯq[;匲'}.K`lUoQb@PX۬UQq6353tgq`Z|+L-L멁{̑8tv8S)C'\;P;~?qm_ݗ=w-M5JK@8fCs p)5cN/vTp$yZMZN"y q[qIMfۓbmʼnW5Bk^-g9{~a' x;8u|bp\s3Ouxv~z\\ۀcoQݺ3[6cӦM[ZޣMc=VM 7.ܦu@>hO: M83hzp? 9?/=P[vpC7eiO{^׵^k&8몫W_+2'D\qp饗K.گႃ8b3n{ ˝y,X\lcwk{}"ivVN(p|[m⚉k r9sO_MZ o䲇km Q匲ZN[-No㔲[qdqJ'%.mB9ioC2\oͼ۷;%`.PL(G h߶sMێmWro95p \?c7 5pǰ7N'U\Gkm%nڷn:M,ܡ \B\p9@!nnҼ|rr|rq&nnPvK 7|' Ba^+ A[!2>ZOdnn@EZ7r>4pXouF- qFO'K&.gu>@_ ~O'- :Lx;6d;k!ٷ|r \N)trbqS wXקEn7O bBY \(r>Yz"UOvpܤ9kಃ۾2;ɜP=d ri!'gN9or1[P|2-\7tf}Um̡ިdzjcM~};:w( ܵq p/^̔<8C=4 ËcM@w|^?>/>w%< LM=| M֫5cۣ7OIe:OI38{7Õ3x ޵gNⅵؤyI\}؈=ڰu 5ϡI{]æ-X7ӯsn\8?F˿OB^1!s;;Kgm¤vj_И%8MXغ 6elބ#QKvO!U 뤓Nž={cnr`|XgF'p9폿Oy{OVx/qA/=,-c!hvX촰`ne\)nFh[طѺ[vpܦYq9\\[ܢ-AC\oEPf6(up{!.-\ ń2Mup nվ PV`\I \No nվj|B˳gF.a>[!Sʅo5pGܚW'rx(t8"8:'+pk 7oEmluઁ+k3n\mFK U ⲃ[?CArK W \?ɩ}{vr:9oڌ,f sھc>:Am&UqַVb߁}ԣ`!nO('NOOcn޶cbl]{KN>x޻KPG @/VW%]xZ.Nŷ52lPN4gGO|H6sy@y@y<=q'?6m_Kr:׫M(e8Atl.aO{ŶnrN+vq,m9LۼKWM[3fqB9vo eZj 6躁 \ r;. qC`{b5M\pMZ(mn*5 7|`~ˋmlFp5p.-{AmGOpC<5pKxoپ%h%f}k ܟ`ಃ.!)ȥk6?EP'5pB7N( Ly- 7@ `[zYbA-gAnZ!W. '03ʴpnnHW' m%Rw۴ \Q|N(5p%o9|r4p3;o Wb7}+Yqk \[}nf:A@p\'EP7oN 7uW \ڷ6 r ܮf}d}[n]1L Wmؿ i7(Gc>L;0<3f}k>KXOfVgi NvܯҾUxڷRv7RbvE ܁ emܲudfFsYT54Qgʵ*굺^?wPڿ)\u|e:[p)D,>-/((I Ct'-0ˏ3kG\=r]3mәǞ":.v/,r'p,bpͼ}kB\)۩|6ɴo9.Ծ¼]/nFZ[P35xj\Zۄ.[ڿP޿d= &ۺhຉK 7vpwh-\ ڿxn-+!oiޚ,{'M=pI@nlorJ91"v+86 \vogbZ+)h$WN+ߞi@%ȥˋ3޿eW=qO(boM('K|B!6pdN(Dx34p eڷ~ ڷ> \pm:YgE@ N'ټtBY;+Y_7ڷ4p[P6 'wu>9CpE}F {־@n[ط qEO'K?ʄ:.g|F9WIW P6Kx|>8n:L WAܾCLgٿ}K"M6p}> ܐ!-\m>[}mo oઅ6p;z|r:[ZJoi2gc @I&uJnb:׿ʄ'K o }o =~SrP;j*č3ߕ2x{H w9M7gĭ5j:<[g,fgwLp9_N q릦p֦q||a1Glݗ>?w{'[;P;px:q; 79 9 \N9;{ziZY[YfimVxY3q U{vUwwF?֙ĝI9lWj w֩$>PSJCv؜qc5YVPlO|%P{w3hTFqQN)6Ov'µ.AoZN)QV We.־e}A[Uڷ亁 \'3! e+ qkB^l4 \R&.[ }޾IxmBg IDAToi/([oҾKK%S Kp' pk9u(Gg3jf;`2}` 7I 7I4q%}upSO+ \o[.[e}'}7qFY ܤKV.2?XV I4o9 \q:9Qo}+!Ōr(}k[mdp}F?Bτo?3!fKxڷlmj ;2_|2anmoXq9ۻBpw6fw;h^k,&j3ӾϠVQIa?'8#oByrr=;`N߉/{}p7n;䗟M@zgqϳΏm蓷⻗طs> ܾ5xC\Q{Oamp%'z^ApM0xKk3n:-9/oCpݾ[6p|jҾn> L;/bs%Kx|2giF'ٿu'۷/ b7oup n'}Kxɹ:o\Z o noN7do 3-\o O&Uk\k*% |Dx2\ڷ+AIO;\n:ux޿IE|>9iU7\1=p#jUA6Qf2uBbrBY-UxKA V3rlrF;4qnwYn?suoi5fPs3Mf 4juԪM6UhT8s8rBy͙pީtqu#ԃ-߁(߁8ށs'~woO 8t,[c:xUcglL*^Q(˦쫛m͞egm«>T'I~w8m$޻O+u׻j~-W~~].TԀ iUmi:T/n}p.4Q3=>ۛcxأ=u6Gvh dAY'a-_lJm_?X0஝<((xxg~KOn1C\zѿtxS'{=ncjF8`BG:r K6mlFK`K6pM|rjrNY¾Z95p-¾-&-guJ6-\Qp2AM('tF9i68,AAn߄2m\oc߾ݙ7pj' r;hꌲ\kZ7' hߪ+!ಁ 6ho`/ľu6QvZ!h 7Q['+jrH!.\Zo唲Y+[P}a`B6ٷp}>?+۷-\[Z~}{M'k Bf-\ejRgW}![(;IpWj g2-[p}bM();UWXŌr?oE'9\oҺLW[B-8[5p s oռ͢km:rmL(o(7tN(}[[|Fɒ| e5pM,8}k@Kp[N(瓽6o9,'Kۿ;`('=nJ6oC f`B\@ oF-q1V;}g;wC&?2U 'y4p?z<۷o9l<np[Ƞ.[oN-\PVN(sF/o9\nڷ}&96U4;Ը767۷u1SW5 p >O&YCguqHq[qo]I~ٔ@@w?}8X%ܼe83;MI3xe ,:f >ݮKIޝT/wƟ0s [?s>ؓ-ݼ9K}vIw6(nM1Qs(֏bblhVFդ=fzD_Owi9snFhk6qg2;r:9^m |rQh߲ \ eo}:\7pN(۔r=\BMgU^R2-\B6ɫ;- .1pwp}F9vp[f|2'm@W n h};|>uvEڷ6|\2gp9,pv98<7t'sB9:i'u瓭}o{ r[( \7ps W>|ie!p5prW--\7p>38Lwm:'댲\5pmBy.!oK|p}B^ܦʿ'Ӿ.AnD 7޿K3jrg3>,nn ^S[5ohZ޿'&n8Lpo e[).Pv06ٷ~y7N'pdx|{ r>o}k[PG6Lx+.o9P+>b'qf|rfw.mBy;|nFV/7p[qF9S\Oy'/zZ7ޕ܃*95jh(%Эmjv5pǥo9&.[ *N_mG;yU8tqϋ}w|uM=/?(߁(߁[_׮:9uhʾweq@!,&m g}gj֦'AX~ i^,| \{{9C[L!C[?Sx<Ly|]]" Rr y,؊vw=n nm*q2p#6#+fF W} 7}i 34u '7-mbɃnoc w[r2g'2[jy-anԾ-->7Z }S[p4p ~ (Q& X;h5jz ڙN(mѼn|(Kp{O{(6C{O{ 壏>KKK8g|(Kx{^6o.甓do^L(_BlҼkڌr eZm6p9l3:lۧ䄲$3Ʉ(Ӿ+('9 }[޾L[B\5pm> 4oyynJoiF 7CquB9'2 \ؾM|r"cpnq.-\I} px'' o9Lo"o f%k}!n4pf* Ʉ>3mj擵v.[r`'i rkޮo?ʴp<&no9Lxg ʴo ^pC[r>yXk82|i'fߦ p"5pi~δ\6G۶FZ,fѠ[V3 sY?oa 𔭿&p1hv _4ˇLJNnޛ^I~@@w u]b~5Çw};'p|4?39wڗ5W6MY75Qkxz fiq|d~B/N*q<{2@MxQ(:'n9=ӣ216M[< k nS )u@;gݦ<^ͤYKyx[>h/{{{9}?ЖSx oS;8̯A[Pz25k,,`vGr-ټjcbk=W3pdNiW;9m/u r-\omN6N(GwpKp[ p' o%&K[tp[Eb&. `}p nc ܦx76pwHZri AnJ_7z|2 q n+,܊ڷ:*iS{eɏ4p |2 e):j 8-d(Ӽ +@ \QV-\ڌr pwpz .[냀wp>jfrJ>ɿMVr:/}k tp_q>Q|r/ֿ'P;|2[O6p'O唲$.gZQVV2 +n:'%eodrȐzySArxg qf rȐ^S!Ծ k'4pپ't2A' \P 7p?3&6po?2}Ѓ[F7(k vp%Z_I&. \瓓7B׾ux-/9'iⲃKܾ= m6hi6Po4lPmְVnm,Y4f t3MqؿG=ث'}PG{i}VGhUo-M߼jS0w|w|;p_ݗ>wTqޞ M_HV)ٴJ&%J;8ӿ$E˖1 [6jes8~: #9iQT1LOdjilZy/ǗnPg}\)((_=[ӏ na 7 m4YYvN ٸ,NKb ޥN+޽d;Ō'*m޿-ft:g¾fzWN'Gp+j&Z}V@qF&p9l[l|ڷ} oEnmFy[6pվ- n34q8-Al}ۡ}\ e(/ׄjZfٿ#< nuB[o {ͼu -m\le3ʜOeZ>,'iV@۷}3ʴpCXa|2۷gHPm爀Wڿ..n7xMR&+oEtB9?!n }3!Dk\o}Fy(5xWpռM[6N('&J6s x^_7M& q p n4pܾ@V'پU 6"n|>YbBY2&nr!.-\Q3oK;}]pW0̾ emڌZ}#ᭁ7Kڷ}7rB>[[-y7 6pn5[oo?@\ڷ^  IDAThk[qdqU̼M6pi&W67p piM(K:--8O'5W9,vqB9_=|=dd,oA5pZ~V"oqo&^hbGc56p Tk54u8\\U_7^Ác߾_-'9&>j4g"@=pE'n"pk! @@~>Q=}}[Z\BYji2E qݝ['@m1agyoy@y@yp ;9rxsM\o_o}BYz;ⵈnkKy jd2mEZm4qݼ6O(}-hz6N)'3 mEM6 e[>ƍ[;[o4qS:`k)崁K`[;ռN((Uk5!.>Ombnu 7N(G 킵py}nAYqB9Z|ratB-Cܼs2otp|remກ+n>lwpObB_&n>Z6Qd= qM۷gWj>4*."o-܂믿^y sQoߞ8'{\Lk A0M'+>IaekSTh[oW'Ca޺}[O&noc۷.\PP~)rFw۷ve7ڷ</M o3мu6vp eV8\Y_7vp'gE6p piܾB\6p;*.tB6;Cjr06d!M(|Z}nPM\ʜQEx/(9eZڿb&dom+=PgrN(,ڷ҃B\tF_O(L\p6nUKx!oiઅgS 7QN'J%fߦ7pC2Fz*JnTh̀VYԪ3VqؿoKz!uSx}>&ĽSrBcgT;Pkx8ZS̏s 9埇7Ҟeû&Gqpu[O:qWFq|󓣨UFa|GNڎ Zo[I8@vعu0/_Q=Q=P=P={ @;nSש7m=?p~m.ݥ瞅6 r[`;vZz. }P9eL'}Sʄfj6ZlzwY~܀ yVu6ON&vk n.M\Z2K WanNP|r%č[5o o w}+l|r- \ n ުM~6D6P^ e7pd eۣh oiUۢh'rqB9@!}+>,+7N(p=MJ+8C!ٸ!h 7"8Zd|>7P L'+C\3pK̾n>ٷR]^0p3}Q+x [ \'}bBY hߪk[P#Z"U6N(sJY!oㄲٷM ⲁM\5` \ڷzh|(d[ eq>n_7ڷ  zpվk& m q|8 \1͠.ۼ:doӓ7fKhKwpmB^YlJO}&C[p;r>Lh&O6pv)fڸ!o pj8bB  rBYzPVpq܁ffm4khV sk5Ьm֪8iʏ,w9m]ġ:)g{{׀XSO|w|wyg߀{^r u(9ZlkB#8{2 7>NObDfݖ]yc7iS0^ :u_6`e%-Ж{{{{s=S<ӟӞ4\wu𓯯Z\s5z=O_׹+'?Y'=IuWueץ^__=At[],sFYl{Zhwt r]XB΂Zˋ;7pmq*r[?i-;j7pie5q zϾM>`O(m>-!._'oK}K3ʉ elBa8M[)sFYEO\8vҺg(8Sʩvr>!nrF9@Mmҿ䤁gJ.g9lvp.ۓqz} e'ӊ3n憀Ӈou>٠m>.nH oN'|}svvgyf1<`wp{uo%Ջ0x+}{A\oಃ e:Dܴ{uؿ) -Oo>=\A.iZm@<dy% qWYofffo3۷7r32)0p3}.M\P}d+PV p ޾^M:2-;Pk5ɴo97pmF[ڷj np ozoBbV2mҾjr:Yzx[۞ڷ+ ^oe3poM~J/, re[7p ekrJ&nj7plJ9/ lr虁%3EW[q:ovu`O}n}{ qCO;׬Qk6D]amFCZZjs|nMb rBppq|Uц'ۄǸKw~#C2Ϥ|w|;pކ{_,|]oWCo;1:s7EGpՖQ\iG8s#[ޣu [q!CYi?/nؖgy/@y@yڼܴ=餓g>Sa-_)}n r n몫/B\[_~y~]r% p  Xl-VKmk-'۝y,w r+mh[o0&naFpqµ\jy+ȧ[ m ЖڷjFkzSr 71puBܴ7p ꄲBB\o΅U \qF|2+ \ke'Gp(V1pɂcx}nrڿ=.; \ܾ=:l \:,㼃mQd \[lBY/۷4p ⺅K'.|:[?9ޣFv8(eo^ }+Ky(2vd3os6pڿNn:M(5{)e7p xo7p޿Um \o6eo \Zkn޿e ܼrI>[7p୸};L; 77p0p}>Y \PnnJno䪉k%ȵeNn0 o}>nrc{צc7×eC\M({֦cohI/Z -Z4p.mz9'g Z ;566ƭgPUјOþ [<8ɖJ9Pf7O,'b سAF=vm(9vN˝v>- \)ۙ\Zj3&G P[orB9And\o 墅pcnps5piڄ۸t`!n(}>96p 夅׿ Ʉr pܚy+3jO)Ӿrp-!ܴ۱)Eo95p \?c/N)c${4pjC\oObh}%U צ rip6pisikp:᭟gzo "8AtBPXo. * ' m \^26OZ t3U6iF7CqmBp%psto ߑ PPL( jrJ H hJ"jߚy+dC\[N(|HڷkZbnٿ}-_+x'UVhZ AwK6N(:ӧ%ۂm'ːϛd5p|_DgnPNۿ{}[':!B _@'\n1.g q9 r3}3ʉmo/d>9=p8n%nO! \-o8 q>9z:QCmm͹:j:j9֫Yj cvg?g \ixX'{P ~t~u .O{{1~6p}۳)߁(߁XC}_4~xQiF|si/6n:z'ЎO Y;hϦC4i:X;oޖ.((X;Y_|jΝ^~ynXZZR;pOn$uB\mJyXjmϣێKy,[bwE ,vZؽhJp% \vodC\MuoCp5xKp e rqEW"%[o}+x2+ \pFK W VP({7@}mڷN+XW&\o\Q&5WϐO(ir<}m-\5p Sʅb \B\h ޲#no[5qrij攣KV._ON&k3nj6oFo ۘSnt[?}Jy˖-8>ٮC,z(?{cS-߁(߁8ށ~ǡqף7oo#a6lZ8@e9~%];hˇuy@y@y=\vk9{nn߯][N&=sKP˟)״n-Oa_흋<ۋ3 hkﶃN76{]:Lлٙ?ȝ4h-an nm_7fy נm< ʜOfkkȍ[()7 BV=oc7MZ-\bnd./oe \Qtp nM \Z=#xnf& ܣ,\o|rP^e-\B۴?{oO( ܴ;=?oc2쳡 U7ؾt^n03! e7p+nZ&nPW\q'5pCn|wp)ڿM njಃK \K瓽+hҾL ZԾ eڷjJ[PBܾd7p> \[}nf:A ܷ$.'#۷ 7p:U[qFY5A %}\o u;]1L Wmؿ ܞ6pro?FxKhK;0n2I1 gy|*j /pFnb~ \vpJVmBKmt-,:m% :MB^*/ q rRdkr>93ʅk[uԾz=ݸsj*ug)\?#e67p.-C[?ڷS.ON'mMhJ os \oa7 Zp.g*:mẅWm08%voGb6i۽ \\ڷb[cC \k}+߿mr4pOvV6p& -,ܢ{h:p9G1'M';SʿN>Y ep/.gℲ^>6pSnWninqנ}S p5VgE&۷AtF!p [p}B9O-\ⲃbBp n}BY Ki \\Z>Lx /YPk3ʯWIW nFKx \TI IDATMgij7۷p}>y}-\o8-\)>nrΐ^!ϾbnnٷʡU 7m}K%o&up3 ڷ,=* !Gu>'%ڷ'$'/P)e eoyoWL(7pվdWm}!Ծo;t.MfeR>$ /?_W$ݩж:7'qJ^Zc^lmZZSgy+kn]7l}K{& sK[,?,|k^Ey{A{ڹg3LLzz꩸kikH~3knjdPn4Pw2t z-jmV^rNEZnayosl5ocWtB9cwZa.narF-\S橯g%̍7о5ύfr:ٽ+o-,\56bF9K6uOڷnr%U 7N)7Do%NnU6}K6۷n.оU73yVBn߲d+}DW r.AnWgA\7( 唲[IN(trmnJ[ҼtuW7pR'm:N('3gѲVդiS֯Y \־e%-\oҼɗq! o3ʄOLgCP67pi4p&3ׄ|B \QKx[4pmJ7Q; [o򤁫!KM[oiEV2p}BQ%5.'Uk gPg]O!hz:՜P6 77p,\QfV;o d䛂v}#M\k޾97piup.7p+e W6L7o|2oqFY ܤn:lQV 07%m({>o}+!Ōr3jZVq?%} O >"LMm4oh}nߦnPvl2 \~#d q7l\Q|A\N'|@c~>&&MTjh똫60Ӝ׍Zv6ɝlz}v>?~9眓_<\O0Vts7;ύk޿ 廟uqx{_~F;P;Pkx?={ w-OXR'a4ޮկ.P}y)`޽jz<qVH ֋-ϩg>~8q0o(MG{X~~'{ [7p~_Ӽ }::A߆aֿK'eXtL@b3nǥnnaB v2nFq^s6\O&5WOSVnPmV;ctrljW!O({κ{y珹[IB@Y4zjUtt:`z 3 .(:02"Q|uXdeP]DE4BuT?$tI\T>>O*נѽ\S6 e- 쓁X(sQ] U.vun pQ(ByMyw/oW;eO^&c\Od= s jlr \Է{ԷdrpJV:W:uٷ{+x[\ok-sqGa '@ Z푕wEyk ⢺'Srөur o9VWCoFV:rpk =.V'F}{Էpk N} ĭךuQg|5T+[ࢾQؑk'I#GU\S9z^+oQGĭշ'*wB2p]/{teRcEQU2uGݜۗq[3pW9=W=W=okxO}{r1QaZKJykGV5Ekvĭ--voO^w䨳P^Y)r%'o ஔ \#}2жG rpk=eP 㖃.,jR~Oޚ}rfZW=5%PSG =1S5{l/SG[*m=9f8z\6J#'\,=.9k 6ۣWk/%\UoQ2p'/߿7QlmiNMm5l}'o@Rm5tC:PdStPo?z{B{}x#uZxs65po|o }Ss[9}@YLcC?gtͯ}&8f? NM(y6 h|߷\=qz3a =TzwwM ygxs쓟SY(nOBzֳD6\}m ry qx쇸5eG <쒱Q۠v(+򼡢!>컧^TEe6uy6<g 0`O|d߶j5Ζlm7[jlm4->t}c7 ܇ʳKuv.oԉ#n|+65L |+;྽s&߻gwȝ@t"ٕZ<:̿h߾$_Y__[r 196eP֦M}lc  ٘G|L+W]up ;r E&˔eΟZߟS)p,;f9y򔧘J py n5ޑqGZn)Da; wp`* w8%'e)tP/t?;7us_7<g+5vjm4fjٴK7{t7\65M joݨ?Ip}1PRZp>Ի@uw7;DK"ɿ3^86eP>ugfGg/tE}woL2EH{vlSW:g2pٗwTSQk 䢼?|VRo~[g;~TǏdߩpQ⢼z]yX+{C+o87k~?70p @>^kǰ}{C ÁC_Ϝxz]Eezz2<2>JLC׮@}ϗ|\\PAo>{}`]WJih@nݕ{(=~ՕSk@A0p]|?,{5 ߳1SFGoQK{~(H0R ¾W?akD"O^|þArg$">ͣh`~+Ca0Fca?V0kE=PQ8Px8XF c_QIIJqHxq4ϼТ(T3\b̼PH;X.5rgf\y9ǘZ.X?up^1-fM5WiMmŲnUZinjQc-*U.veee/K|+-vSߢ|Qh\hF݅Ky,+wBer]ef.ڝ4g滻ߢe٪r)˟q++l|8ʧsW>=3UR3BZ\.4ϴXfVʅ|ŲP9g*UXj9iQ|T< ,sNy*Um<3e*)xer6UY*y.=e2TiLI iȔ&,UO3=bM$$=5M2MIc${~cH&#&L!cE@Dhv%4##EHmPȵ^[#yH(R@㉶2S0tm^?P8T*Ck77>L:ڽ:ݎ:ݎzZHni XhNnwG;mmu[u-5ZU򎚭Z;;j0orv6ƶhr@K;juh{k[WBW^~=WWt0rh-SfzӞ,2p.}knǏL m%pTaOרj*vyk8m2H;p`ص\Ӱ'k? P=SV0 E P ];~ FvL90$=38h;i < U^S0,_a7@77 ˱?KONR9cA\ 7{Acz{@zr# GÁ2/>@wYŁA೽d/P^hீn Fbo,/ #@p$/) F(R(4B"-ۇFhj4#ţ@(4 $w#@I$*C[O'"@4)ĚCMHx<8N5xdkOMIb'Nܝ(MFJX$$m}tSM46Дg]S<3T4SQ*LU1UV幁ڬ̔wTU9Q9K+UByY*fBU -4KAۊgU*皗@Br g{ .LL90cW p-sYvgԀ*W #J\T}_ B(+,(\dZll1+-m\s@.vA ]6kV]l<@`i`h ,^k)bn׻حQV|U)9,Z6~h>PUpf ͹_jfrVv}W@n€mj~Y.Tl@مrfسRUjf*dL%xq\E^*EYV2{wbeTUR(=Re9@64i>Q&Jx5+A d?`x$N 2@$2)ڟi8'\/@q`̠HjB~m 7gþz t[vw`U70Pvt mu{={-;Muu-}u;][mu-uwVQmnk FkGֶv: u]Nn6wȶ b2ms:q-֎:D=e lw$4mW1x>uVs~Co_O/<)nuA665M lj`Snx/S߆냋: =oiIؾ|DYYwW<~}L{X]w7=v^:IUU9s(yo:!Ru _Bk;7lwV/?qoUYvav\7gl/Pu[^ ~A lT>6=~?nЊ2:^@At* @ځ)O_`)SPFdں|ԯ [/!YO@W]юeXU';Jv8EJE1:Ը!` vwU>[+ pzQ@q `;O v]7@f>!9-(^Oϓ @ν.j6`uuvXT(sE3pw(H;3]? Ё // .`Sr||)sC?Rn(n0F(xlD ##x:.mԶw˱8pbQ܎N6h4a]h*H1vlxLԲl@|nW@%*%u^u| %7u_h^W SSc7KFk^~}VLʾ+|Y=p_62\~g ReSٟY׾̂w IDATG?Qцb]VٷV}n~g~欝ٺ{3iw1P \޷zZ?^똛]"ˏڄ27k. cǏر kf%o_Q-Á e kWz*wM9˹TrQ;d=[vz=~`RײQuXXcy}Á,(3/"#gY52f֚mϜx|g Q=EQc[?2kdx,C10UnV(FY*c \]lQV.̊ٔsQMъ%4-Lsc[(f]7AQᢒY80lN l-fSY˕oۮu\5ϱsRuQ tj um Lf i@@{m2fӬQt /”K[6P6uisG[͆6߯C7-!v]?3L>׿[>t?ϏN ٜ(:p Sȿ˿wpkxCǎZޭ)nCt)rQ4CQeT(pM#6X"G0YoQzNeKcyNI ȍ=gslSˋ1C_Y%-۶~e*j/0k:[eèpQC6Ų+i\7[Y%NyU)w7Q& 4LfrДyxT[Yc} 7jȊ`|]?2nw!y(fQ|g9N<9XcZ6neu+FE5 ȾcF}2r}OQ!FLB`oz?FI'1y#%vS#whں)xdK9N4'w mDJ&9<oE˼%氘b+ΝE+ +fq-3KT&4ULr(ϰNSX.ֱ \ nidl[@UE,*`YSfy1S #75`^:dDkQ:7ռr٦@[+%־BmBW- xa3@"E mSJ23/J^|H2oa<_*lj ,EKѹ[Jf EI 1g3D![ƺ2@0xAb;9߳6S]n1|W{dΉiƵ^+b,_ؕ)/W?p{ZryZrQi:9xoR .jN=JVEM[ f],* ;*`.>9/P䢰,9|gBs.ݺ,-5)rb<֦MOsSf{ly_tLPj^&m'{0m,ihs86' 'fL[8w[?iOCÕ=n9!6ɵ*ʀlts. :^W}]Oy@۞zztuzmWnKrn@J2e6LeurVG;Zf#,&7novcۍZX&slVc'N〩pO>@tš+w=.nC:f-w \,$?7P_.6kɯ?q^2K65v ۟oЉx>|pz]`=dp~'kאzo|t*Z?=4|&W_?q);D:ҹ_Oש^]:&.B:^~Ax+,mkZt3L>[?(ϗr>R7{@`*ٴgs۠ӽOgՏ{Wʜߗ3=gC} j@{y}ӣ(=OC\z!)pǎhhy|B UD.kPe0ּx\rmþl&{1;r#@gb H>{>4 䍀8 X!(sh]7͗N<,on?H/9 }wo|>{b*{w}ǽsۀ1#جfN:ezwַ g6=k>w?,ߛq&y^wvlmmm j9zpwW[^wokWԲAM=g8PDn-yt {CnVC˙%4uo|~Oo:7oz~_z~j}M=빎kf|ԾdQݒ;'{4{ߵVFβ?%v`'jkE;d:5-Ҩ\=+K;\arwWirQCnpd{W[SDs/T*L9rOcdCEQ}P GԶQHNc 0j3{UnD# ;6;2숂q F6R4 5 ɽ @-P7iZ7+CSrq8vpw,ٙj;5]L[R'x4VLāZn6% s K4H;t:1,rp3I!y[nVL9K TOH4~@mTg*WZg*\,hSeUiV,Q8Pe梢DUw3[!.ɽE aLNn%iE.eakvu(}]̨\%q l˹leqTƮ^ ꓜ4PK1VKԶS<-g"6TJ30{|c#^` FRU)+lkJFn,ȵ N\y*cMQݒ;M-_ j$1+ y';J,?{$- Dh3V*qq8x+ ws /|(97@~i'"x2-S,3Pi@.V9vv Z}T-Sv"RUoe6ֶ Bmva 6m ԶQm; 5M˼m6Zj6ipw[;lVsKvh{)q>z}Sc(|.҇bYJ=7{tˉ`,lj`Sk5pӟK_ģvt}={aߥ߭v/Е$!7xngsh g68 ?>Yuoo)U_җp`}(~2 Oxm$/Yl*K_3X=aN߯gwL|}zy;sr[d,m g?ۮcǎrߺۛ3\Lc~̎Ǿ~Ꜭc:??UAI9p.tS z{uP6@O~E\p|uvmasN6!69j3xfygکg>읎?|:NV杭c~O]se4 3㞪~iv wvw~?,s] ,vοzSj\wܣǏ񣦐E1KDZAGԟ^:#(PPbxAO?x/?)3QȢEI ci.Jwhfz|lm"|ZljL|~;޽w^t{y|ʧ<7+et;-P62ƾ#4 TήOY{c= Piy屳xF=H!.Jc>VO0Գf#@WԵA8T ]gZ2o~d6|hD:3Z8R4ɹ W 7GPE|99hkL FЀ.Vʓvdb<5*[NYHi|.涝eclU3 h˷ɻ]haܵ럑]@el .\3JZwѫϗ/*M9 `lǮy?k@Zwe\U\gls[9D\Y̋R x|-rrWVyl c)YIi[N$ w'TZu$/SЍyQdgwkB?3E< 55ndk@؎2&ٵ Pq -hPj<ܒKeoipt_A)ꑿĵge0uSw~Avopv"SK坮)t۽:vmئF9c(n;;-u-5[ ˼m4wJPvl\wKƎkwlVSKj4nyNl\ݺ߭t/S.P =ANwo|3^}$x?9/yK`tӖLRDž%Z;|q P4|;cWroP|?xuʯO}kg?{^@M:{R/빗e\Y!*OOZ?u]w0{m'?I:7D7G@R]}\?2ǫ,o(-eOzғNyy;aϷ7N'C֠㾜͉2kx~>wgns4h3ooԧ>e@]y꺪;e~N;SG+BЇnS7u}{YFyޝ/jKy^w/.h Skwi?ݯ]5e_0hKe0X['7MQ=SNaW*Rz_; IDAT2adfalY}XN bf+ݥb3-!~u\PLkԾ}SITkԳ\׻޽ : Y9Z>An Rs|_Դa{f<2 ,쭲m Y`uf6jQ!0=y[ԱC1@>[`z{dp@ydfɌ}g`8ЋlGm0 /eV#g DzFP(H!W5#c̍Fd?D {TSilۡ%6Д2RdFcf9&c%oɧ|HxjٜN-})tlUZutI"lU'Hii2rJ=$S&,V(BNL o2o-6AQk*X)( ­7KD,QfVʀډRleKԻfBbn2UU\ %63kdiYb* E-g++nTh+c)qY^>ɎZ.Qm k b֠)v@[.6ӮY&3-Q>\SKĦ|} O  ]|Wԥ Ҕ|\xv3/47l2gs5+)ayޝ-:.dkKNH_8ҭͲ%0eR\ήpk6\ԲvlgQ.䦮VgroxvN˽A]qJmdgenϣr]3pveKp#,(d@v3<(q3Դn6 ,P7S2؛ 96-35n+IyeTa>i؝Z['Y%S;N;v2d}-qE#_X#_>m\ZFxgY[=dO9n 'W3o%-GD:>7TQO.@^WZn]}VbR{$7[=jll;iN[;vhR5nFsKroYnhyvj4.`w֎.?tXo*pCy:mvB=o牍r;m\>gOi ^>;>Y޶Q_%Uwםp7|^o j@1tLۿs?s'u\ܿ/Ogs|?=|uO}mZ#9Om]/{?;=f}q՟zsY-s:[}L\:gź|3I9l槆 uusm-߲\ޝOoz[7rOuTmݽ:929BvOu ѼlS/nYf^z^ߦijJn .j܃qq?r\Xx ʖe :)\>.X [@W]fS`k)OW_9zd(W"kv0X)}Mg3l|Q\A<8s;0z{޹WfQVఇZ?eNGy Kh壨B)O}_~h֮G}`|S)k 0@5r_}Dz~94%l}OYH0A.YBom](?n1|bdBSz(tJc/Eɬ5.6#~A^"Q a<>lX#`o왲 xʹŚt쬔ɞ$3w})qrqSˣF@֍ġ&r-ǣT8twJc2;{c[_9+߮,vK+Wk@5XhV- /zcpߝb`nfhζ(o-'LZlTf*@]fLDQg@\bfdߒUrHUf?rpi5wo>n,^??m'@*:B?㽎jѭ0f=*ZX;+pQ똿կ6[o }/r/:3:w9eBQwcK\ọSV /:wsj}\(2lQ5\cׯO:z1Q$eVbkBSXzcd9Љ}`}\?e1~܃>}]oj,+~ݎ{~[?<~he; vכ!_;\z#K.щ+n۟~$n&|ko}K7緩M lj`Sr r7O}L7ģ;p_t./P =~Կ~;[z'*~Lۯ{W/}koxlKt9 :;ﱘ?z~Gw:ޏ9m:`Юޟu^{:r~Yu{il;C^W;Ov?_\uugoS;ޮ _?=izw u;ih}ooSm`g\ȿmp6TdK $/gs:]m3I.?k TXޞs:pj}b߶mh?-{='>^ hN[֦Zy[CZ}[k[~1wu#d]N&s5V,{ {bژ ;=OSbi Wd?GLSsk~ۿ/CWk]ss߽u]PࢺbT~r߷s zyu|T%SoԍfFI3 1ϔ5@5쭔|g| kS -rJ@vVK]ruYsrTeyiFfzY0(hgiel\O#r".Sy{Ȣ*ƨu]`n Ʊٍbvukw 5vp~ 5PM$T(&X;v֨؜DPڢljUE]Kf6'd U6'&X)XdZ':٬X唼L)6M*9P,7mJBiNƧSwgMb˩fyiUV)e.L5Æl۬얱8@-UnѡW9?g[[w㊑ exc|<[Rr_g 4_/OV^G;gE{6G(i[NunwvNgݩ.gs:]m3sQޞ9#~G3yNoz[}w]3S]z~}N{uSwo k9e쓙j8Xs-0xKTsO~_(_(\]Q'je.֡.u*4[ ȮԷ`hFa(R EGCO@<ݑj@1 $ c"QFX$|dV(642A};R;V<2xtd4QGh&ӑY(m89,v)7YAz Vc'&,[2k֒ ('HT$*,3TSe-cs̶y,5C p-%C4YQݲ_yVEX d +Q6b\*)t6Sb32al99z+&c<-AZ*X/0ha0U鲚;KcYQZQ.rZ. JbLAG uVԹ(dM}쒁d D u giwhzU2 AYM4s";f@AAʟiԸ?;-W,箕֔dx߶|m Lְ(5hTNɌ]t5_8*cX+z5xNusoJXPQGQgX@2q,(6"(RBB _kg9''9׵*Y] ֑,۳K``m/Ӧ f%=3[/t{-6tSe.{p_Cr49o.{n^|6;z[ǟtxzz+l@oݬ?׺o_8/h=}?ş+oY>`z~g]ߕ⽺U'`?mݼOZ_ُܑ6wMF m,Ս饚:j?vWv7ޞfpng eh[6X~o65yo\Գh?~f_c||yO]p?=Ŧ/6 BǷ3Շi_/c³ uhu_sQ߆`;!j0_p|oۣtIV>Jj6Y2gˢŵ<;_|ll?h#X/n|[:c6;jSp?`*k_tόK.dt(x͚5ww|ջpwx33tp=ܥ)7ly> [`-68=qߒgWŧ6p,="G9*<>@Č򙸍O9i{}ߔMz3ə^9eeEgϘ~V/腧~C4LRWX}GguxыuE_e/d.k&,$i's7TrwI@Nںvy}r2%&լYbԖ3Ҙ#ű˸gsɬM`,5?rSJn.SK)X%QmX,.%6,`k1rNY,ay@qQ%c7oX0'|!a &+Ҕ% 9@ނ*,/{UUʥ咪dCY)c\1.RɔqJ^ ٷC䂁ڲX&[%;,k+@ފ,3[UUnDW)j* Sn45U޵lFɍUdrm4h U;MQ]ĭjuQͶf4dm`X]MTwjr,N[mSSEQzd /ᦩ,S-EE˺ԎN2a][ tP>ŮXSsuM0p TlP:kdqʘ4j~WAOӔǾ5ꔩONri[T6lk@n߬)Y#:`=Uׯ=Y?mAGKvؾ<w~'n=ΆW-wɀ*kTt;B}<ºe LީhlY^HL۹{jw6N\Gf̸Pnjz.Ù<&UﴭBT0nְ oF͆ZuTױIFmxM+G} ma̽( 9}keW_WUU֊*ʖ]+ɣB*nϟbb[r%={aX*Stt!7{z^.l3/=|޻.'1}ÞNLѡ*i6N)q&5NEH6H*O+DYR2W*Q$Pb9p"d4dlܨB"@[Ó.7 խ&QBZ +<DT+(<1i^p҉@z{!냓 p[}(Mc>-)VQ=vfHk ۹oL;=C_5=yϝڶ婧0_3|Z٣mԓܱO{C 7G7߹_:T}\({crݚfԮ2~Ol}=u6K%:eJq9P~p@Ͱ@+^tf.3 -񗭱< ESa\Ud"P\.U.QTiMcV:AG*,JJJ$3J+*28%P&-7:vCQk܈ mmĩlɽ69:W4S44)&# n\qB ]ɰB+B kdX'xVp(p-[,?H3c|6MMjө=VE!9owti-9FeKyhgk53T8v}lH}>`@}K6q'ͭx|K::P"}<@f`mZ;Ĵ6u\Z^թ%ZYOD)qġr\7ҁ pӊ>\V$nw̹lkx Z%,}ի^5z>[n_7чA7e7X/*^,w4p rz!/Np? DǨژ/Gd|`nP1O}jp g#X_jT6v;:O):QyP}<ޮi|s\Ū=xqǍ_`u|5np0߳zoٟW\1:~||gg;u-۽.]"|PK8n}xT2~?B\2 Nәf^prZ{3*N(rD:`N\kod\*6lm^әiNguΫ^9Z/|rwԽ[FMSd.(g:Kђ-c9 TSvyb^y؏*VV.X.Z(2@RrūU%HKmQ媳>*Wk߲жZ ;岩mkUk>ZjfJn6ɍZ}-^QZ-[xjd͚f 26ereY vQpQ6jfE)nNmgۭ:$0 bmݡ2:dԢla}Y1QXԵZu&v(82PĦׇef;MZg h ,mԸWSBAeԩ 2u) SD&wJֹ?pVd:en׶_rX:;e%eRSRJlPb fg4By ~Qɽņ`8cͼ) -dS Oo׎{@[( 6{ўs.X+ ^4a.66ͦd&7jv\ǀ]Sq'ǙoG4_W Ql۽3Q.N?rL7>{{)x_[kc!σ<*w6`? ;pwYw|pwg18yf|`{:?l3]ߝr纖۾;@2|h|:8B-/p}p} ep8LyjsC`/2J)Ȯͥ=en̦OT%KY$33s?w6ɴRtv՟k?|sɬلgKUԳO[:TikV@_I&#u(%5^rry%Mg :YT nF岄\̳} 8cIl3RόyY, bmW:R>W2@ZX\wQlޔdo"9bn-+zʛ]2Qs*Yʪ\(bO5[AylB %nQb&MV[m+JAUlQ˕*=6EQJNnUZAu VTTꪕ+*7ʪUk- ܚ +˪WbJmaʿV @TW[b |"mVjbJ|bwj ran4Fa۴Ғi.Tsh[ E1ij.u՝J,vv Z~eӢaܑ w(sꚕrԦXlvD5[aU`˒%=4{d.uPϢ5SZnp_FٲہKoWˮŢLS&-[eY )tɲ%/wjJS@i@Ph="˷7py+orER?z{fafq֏-2^7vʴmmor e)qgmS^?J^`|v~^m:pv,cK&3tջu+XcL3 FSQrO(ϛ%]rvw˕nYt 5.+5UNzM5SŗUUj-#V}_U&ڔeyTAv2qagTSoQ }YX?p=er J"gm.:dL޹,`?ou?r]'T*apȤ3(L+Mm28YD `"R|s㊦a)J77h cU8V,7XY'c!C1n$j\l!MuZ.'kyx“'cvJ9oG +3w7 sm[2 GB~02enQPw˫Epw/_-okסA#Z|m΁z~}t{O˾Mg=٥z[rlA5DKtyr-ӗK>PM~=T?`{adi!tІ1\sb|ζl\,g}Gs9O{yF|P ؇㖸 ~Oȍ7hu3z*X?M})/y y9u D^Pff2k׮|XΦB24s=փu֭['|Lc ugRlJw]?iS&/R9O 6A0 ^ykf-oGmm?ͼN} ۗÞ8kq]-y0:tѽ|ޱn۵3wsyf̶.Jo|6{KݻS\l| e0?Xc?\_7(pw~zjzT ɤٚ1h`vh7Bؔ{2MeI'4;v?Mo'-߰Y,*rvJvwq\ivtB\$kF%O;^rhuErc6(;j%KKkY,ن[{x9ƦDn.Xvn쨱f"l\@/*-wli3yϽ|7 IDAT-rSe)]>)3O)q /)Mn-\O)rm9"m:]2ٷ.Jj2YdV [Vb Ԣ)re-`.5QWQ2e^UzjZmVQ^[28˻ƵQQRV ׆( X%7ɵ^խu_V'wQ+6[jʚ]˾mB^[VK=PR-V5v=[ 3&Y-cUcSz,GJn_m2bɪu0e[\v*JX[+[n c˾ 1 Xg_JP%r;Ung5*}g쒱ag2eQݢHa? Xi%e5,YC5.9Kr֯?hY^?`Y8S4>C{gSO.LYrv`5\&kdSF2;9C)NmfVP><\gmSv}qݠef\n\׽t0hlY\\ͮكPb<:CrԶ:\AjmUm\7]Djj6J`^nX 2TGBu:dhe:QbX:]J "P&V,TGAӣYl}v y9uvAW_}/aK9A 6{|#B=H_& \@Ц`_v<˟k+_ʨ]]w׿3/}i|;aWR? hضY~@;|/u΅iY?ҙb_{Y!]ʵFϋ}{3-S;,y0:Q}ױ_\rB{V ;{g{ >?T.mr纖v;e;?^>Amcq)p_z8Ty>@mvj| <IJ#2Tn0 *p/A$vCUotUW )]8L:4$/RQׯݾiWAٌM Xl:a)%|lZiEEY(8X^ȣdެgscM@flY=@;<ʔ7HX&nE/8)O&/p72`ֳr Rf=Sۦ-Y%缔efaN1PO%9Xn٩q 앝2%. |A2s*YȫrSRnXP%_RH$Vɬ_JʜeR%X{e.8%. 0^2-jRzdʶ*vM[3UԷMr5kC%nVV @]l_WnCUa %O[hYmTF$ձ^)ԶnW3 5dnր0e$ JovԲTgLjt6!nߠ.䒝skZSuɏEmc)0/Om#F3,[@+j]%"wú_-pԴC5ˈ큡!H"yKެef': y?0PP lDwc9}#֯E-xX?Yֿ}"\~C,Aρr֚1j\;=|;fp-;OE}kj\l) hTNo5;8'8vG )۪h:-(Ĺv{t\ [eQ6ԩ¥(ڹjU\.mM-_sOak^Z2*tԬ4yn-{bJZrRg ")竪{kj\l -\p:`+spl .t@θ,;ŬIr <m cJN*21S %)qJ o Eʍ'dD\ JG#JcE⊐(:ɸ 6ed8Xx&!MLN* kPw2Է &Jwy(W/g0sz/Z({K ~^%wνõzӖkZ?4dܢr>ЃԌ?\򿺩x,ʼ'sSr7Z.M2~3Ԗpb9| tFiٷwdA>-}ׇwdRtXƗR}:T's!{U~ <=./Cc-?7f8Vg%(/vuL/T*ͨo!/1^@8(ہ%  !8eW\1*ۯۣ* ޠB^/d`; 1JR;d8ayry˞o|Zvp@Z;X?͵7a_wS.4ac6۷8g2rξ'uQzr^u6ߘ 2e^P}Oq-,8Cg>k>8$땗 u ۴F"vRf ԉ'n߿2Sz(y r g+ҳ^b;ZuTZI]>xh:2+_h+&`șnZf"!:,_^甲}L*@)pEIs- 8Fd:24e*?6)M9P`q*8zyY, κ1S- iԺ#/`~Ӷ)S.0o6 ֏x%/ouA4?Mzvqq6z.XR>լۙR3e,9B£*n(/cu.nеFK6۶jdZm:-ߠBMV jiɵzthԛכC[j |۲Y(ө{R*Ϻeo+* )j*U.;y?%SnU@ %6on/bWWt)=yo25lNyJܐK {'AgLZI̱"澑IfJĕH&OƕLE br,W2P,Pu-6$#IE" E!>9j6ɡ(p7YF&*nanc OdhB0v!ZMDX5bR'xV2p;i3lwe2^H迨fgޫn d>ױColÿֹ'WغE~_-٥ij >p2oRjߖe?K.Ջ=X~ (q{3lw-j}1?_O=o;n]U|t"yu;ϟuz=Cʕ|Y:@$lu33E)5mJ,N.`%=_ZoړO>yO2Vx[^xM{Qx/~1alGl<.V_7@{[2"!cļók|r:BuTMm`xN;q1;pmB䯻8~:; :J/E3 +jɹσ]}f=ȳ3h{50Vؙf!=/<6{x5ߘ'VOkPBO{VPzJ 9, \q+omp*p}˘L>=4FMdd'3sAllŎ8 4.풦 N}rqɅ5e*Y~C;~gS:|&nYNCzߡ~N=dT t 3=pσ̧> ?Iu3f3fQE=1fJ(p-6P٤Z^/ 螱(`HjUoyPRd;~{-\4y){倱{K./sd)e=+eC-!U/\QY CK;Nrn.yX+2*f%1"QCP *_):{lK(q)Jd sR+-T`yX+K=Ue+y-KfnT2 2Use4`[5m(e2yՊբɕ*Պ**pKjVj-QgjdSn.*m[a HEQج ۮhSnkܖ:mЖm7ja쬓R[2Gf1 \uJG %enrOQSuZcE]K)0,%T(HMqKmu\ru u516èHfQ2۝n%.pncbԳZXWq DJY O cs ]ms`e5Mv]oS[.;wjГvߥ~,_?m⸻\.&3s솊r9fy>57*]Ե]6uH IDAT/sQZvM `t`{)lĭ:햚gm\,±P=Pcڎu|h7JV %;-9ݏ]UoTNUϽ=znt.9URVZRWZT@nMR^"*ݼE*|Ų|ѓW"gO.xtqй׳,t7r sum=o_H3}&l|~n1(赿փ SպuuK\5{;=oC_Wz꾻wxmۦ=q~Kw6 rMy)؆.0~w;uǹg3IJn=;^w?m'-ܭ{^}ƛc@#9Uу_p~'s7?o{=yzjUm<~-f*p.u%JT_,y˗X6/:嘃5ya:"5w-O-032{;>wy3s|-֟1M{0vV"^Cݴ0,-5<~\ \_l_|z Yg!m\]:I싁soԍI/d{n\GYA\ca!\?Ϻ3cop;p֟nU>p<4yJ\+O>RʲȏM)DPse㢬%'T)rgZuI.RsqyfESӣux[߮v~Kf,7Q$@4pl:Ke4[ļ wKY`.M`ޖ3 ?<\W+Kg[%j,g2sYQbÌB)|XdbINY8aP0gPM2lQvY=(jQڐU&t*Z [mŲy)rr},ۘX1Kc,Q~]}nE}kj\3+ ( 44[0`YQR?@@3lnYߎ/[w1CW?c*\ʖaojxfӌ{06ZB-cozܙ dⲮv*\rke(Л"=TnۚSs7X".ExEߨo+@]ӝ2d *EEu[@N.=y-gM[N+%y^QE ES{fQ*w:`mOGon69+:J%sR)(T2oLRyQCH+N+O%SCnBD\TXp:Riq%1%bIEdcDcJ# Y6nT1oCIk@rEBs'hudDىPĜPN}p&&Xv {.Z(KvlMuޞ< vo75ȸv٣6|xzT=gܡGX>{yۂL:x^F9/'tɘu}V<ߵic]7+|l<*! ~$"E'#rpq(n%^! 2c ESI%iD\9'# 7V4Q*W,roQQۆ """a &>l ' )61䮈*Lnh&]1W@'ZP>C9D#Sw%'TK:iә5=uӵksbOqm/;^^{.({w eY=7qr+~{M~=۞x\º#6öQ 3e7-l0u|gEyN@EkW<[.ޜ=M?6vXs_kQ=maa?D=}~ޮ_;9EO4ĝq{Udc!&)/k]^;b|x0m哷 n{Q=yOvܓ|_/lq=[?[3Kuwv}7wc֢̽6=.ӗKepx=DţUC9@xS:1-?{el._)7, ۯ|+"}mna9>,?kg s^(:O9|B[(sg08o*\?{i\{Ӵ3-F@& (51]l9oҩIISi^>\r_ fԺ:H (Uȡu3ľ٩UիOW1p5 dE5s6\ۨ\WN{AlCYSge{K錒Y+ W6*,23NRQ-Enc@.d!R6ٸ%J6`c 8[0Et΀-j܌)n ݼ@_C \S E2ȞlD-*WTD}[DP2zla;iI'Sf-XF7[(]UrAX#Wd2)ɴ-2vŊrME[^K.\rzSWՔu{:\Tf ֒tv@)7;ϖjjL쉻 dJ/).lQV8uXjj\ S2Glwlʵ70i9dƚe-[ԱρdNz]{Pba<$O۶ӴOԏRkrt)7@1<XJpoԯtXw;Uo~1])z9'n9VXAch2q 6˾?wR-rer.8ޖy1wc 6)L~tV&k1Ew r ]}5d6q؂vvPPwg\]:CPwTofn6X7ղL\rJQWoG]_-unNU몒]ӈSW<_Ja\!綦"Yڅ=x{K27_ϵebz|ٍ2*[vtoƞr뼔Dž!G.!vrɽ%=N'4ی 6x"XenLDJrq%cݤbX'&9;pSMF"}á&!E'm֤F5T(4P(lya-gފAܓV?Izֳvv0g1/CLMxqhmlMuWJvݦx޳Ϻܤ +!YYY.YZ3Q=i]p_@Mc׆rZߍ kf胒5n?q/;Mv4m3x{p ;JI6LtSX9f'~SM rnLbmy}Bs*[g?cO;4.JG~Ks|_}6s}䷿-' cµv=vִnyaM3vݭ$7_m 7Xς֭z| U'τ%fS]ݭq{ˎ*=64;1mNk};b6n\زy۳kߩ;^挎\K;{}O^+=~g;_<_4AoEz^K9,{~stUrvs˟c3+@w[\_̑{!j<=tᇉܣ9Ei;m1^  uL:fz?V_{?(~z$gx;@\邆s-6;1%/^W@EMw^,$2ܛ >Ao1qٟ\}^dpdu[?L`k (L;8Kل<(P1r8T֩LM Y^@SVGԁa-v%73lp:%NxD֟Ϡ ԟI(h vYS Hvyl)2f9nd:kjZSfۜOMl9P92wΖzk++gYrmh@&nNiQb,6+Q>nٹlr^˩98 e} ˫+4Vj_YW(G|:.dQy*+s;SHn`*ޢT*;\B6nYUuղJSۖ6enzFUrzlZՆsה|nu-հ`7 ֛Un57Un;m&CMTPaLgju5nv`lg[^7Tz6n-nǬnQvZmSSv&RPa;]MYvUf,ɨ80h@:lێ(n9epQv^G~MiK/èg劚._sŞ481 )b_) -vR ~`()MwW峕eYM{Zִٛ=\:;]kFٯ϶ԏRשvG~>~Q϶og,϶(G;Nm`XhnM5δ5mkyt@O]TGFroqq 6Znq*vz;ۃcrxo*lqnsz| $ӆ?|K}ow$W}?m6f6(kwgs9Mό@bC#0 # &d2HZi%*K(mj;홝ViVB=SuﭺU=>yjUXsc܅j;k 24ǵ6=/ie-[߮+6X-<{{_5xAJlsdFST|ܡ]?nPuH~VҬŏզV1{x^Ɵj LfiBuxׯ^{5׮ƙڙ_5pY'/ъKxb-ZH/[^HRݛ\-{YtH iu+ڵújdXXW/ש}@D_l py1]VW֙g `_:ꪫ*y@/K]s5fU5xH~!X > a c<y: b:~ߎ۠?{i ~~`:=&x˺w>up7eɰè0 QY܁V¦!5l~ڱJ5l)P 9rl QZ.XXDX1o,)S(:7>GA˾!g+i06hVǞ53Y,?J@a{OG)Aee2b6Nur p78M2JXeWvu,ߔdus4rm)%QO%#F9V:Y2GQ8nISݦڲĈp &`I-utt^_ %Ӏ˵e7S2gVYb҉&qSMlrZyE:gj\"ͧ29h)3(zbTH9ɢ,F9mJڔٚf-6J[lysQe ar5mYETŜ*qQcLPv+ʓw[DmWp^/j,@Jے*pX&mC5QAA-R/(-5T.T؅ mb3X\Ԓe6X kYEi[V>Ú665ZV fι Yv(GQNf٬~LUz ·1>6(Vj6¦z˔qm:VyQ:pY{,iΉ(Oi1aʀdԏ:93je㚢h8~˸z꫟[l}؞Tu[ 1_Tʹ֬-r׎_wvuYtoNh UoBR}qclʜ늩q1QuhDž 1AZyUMUBzIrC5%u-U; 鼻***jʪduYTŪJYW\.9,)JŌ ْ2)o3E?.K)G&w6\.a*l+9yef&.;AZTi7^G26ᆉ8){P$QeXIK h'QEqE(m}rL`P5gAa`0XXИB /4&?`@!X' kT1}o'?vt'562ѱgZn}^zwtʖ֮ua~fᗵ#oՁm}V(pyW?1XkO; =Ԯ@nV.eOE 5gꏵz>|l|M}[6/ _ .T:j_#lrm9́՝qP2z0:{_ 3S8oz>{߽UC>%S˒&n+QŒL2J?9(QB3;{?N$Xu_so'*R`GԼdusw\uk.`.eVX ;-`vsJ 2`QNqgOjN4t-znJkǧu {-6mrsɲ%9f֔ˋ1yg4[f޾ 0O $cڕtf2 TÍ);uDFݱsɬ50jg51*:v>FmV׽߮-GEh;-ڄAjj 㨎8򆪵5Q X$T/XLkj5@[nTgb \g% , s,q CQgIud@U**J*n=W{ V.X3GY('s,N~1i%XgH-{j &ɤݽ<=1l?E40"i!A`9`6y֝=}^˗ e/9oV2VjM{}J}?>2~Ub?տT0;^s{ڀ.Xqn2dİ};lQ{޳]Ǻ[7 .d7Ot]_->}7ցߧ p[C^> /{wxSo͇, {<'ucZz@{y1.k輺OyxQvI20kl:{j[7k1؛KgMa-P*QfLQ}r64e@(Ru5'QVWo{S˾P${-Y(= '`{.]gW{wlj˺EU\l7oY-͚/ eiuct͎$7 n_pȎSrC c -VɍǫMjOmw@FEUk(Y`L>y'nN\-ZR1 s^PK]BPQRbJzJIU/ڮ{M''>OPjsRX0rܳ^Un/;+Q.U.3a&Wϒak =[&0Qƣoqe"Q -q6+!&*S0ۨрLj E  6\[>ٯ@`0\P(y=Sp$(Lc>c)0ZUi̷FkQZޏj9u e2arK_bV-_7Y@Y9M|:xm:#:otp~UBx/?[a[e>ԷxuSet3e| q~ p4a`,x^z=z5iY7^ڟ1?{B/R{Q]k1oi_u]{?W5)ڙ]Ć2]!e:srHY|\\,k-ҋNZ"-[w^<q̽7엯 _CEtH=:WX J=3rNB?7s10101pd xPc*^יޱ_\zx[o9z\鎦ӦI-[aQg)Q@@AS`3\&2t4a[ۗ(9g-Ԡ5*T3e0`8W?_gC-7G'9Wԏ)pIƸW)p=,_KIGidע"&CmLe\@9)ELL`T㨲dFLv""\ڄeN&fX:Mb$Gec(oie.9cٹtY#[SfӀdZtZ)SY%GiL[P,4/7cJ\drySѢM:R>6l ܬ ٌ[Sa T)`w%s*bϫ/UT,`\P e(r@Y- lVjs*jdJR* lI ]\*q˪D}[T(VU)5Z\+Ru\S5Uk 5*%7U5VZ .p^Sm` hپav5ԏu5}Cل}|܆ɴ5t`M2J )=vdM!5/䧶jb lM޷4UOV˹%QqQ! ǝԤfld%2ٽm,ΨbgISfgmرc'stJa?EܰzF]V&%/ʻR{n@/ʖܶ1˸sd@Em1mԺ%,ke1Q z͖@ E--K]U$ Wjm5'/{QyS pɿEiz?cL{qbNF9syOi%ys2HSgROks瘀낻Qtz1ehɍGPŠco +@YW8}rXp@pP`HC – +)+!?@rqX,f>%.%֧ёFOڱ5霁wN킍3Ug,F_{opr3q^~7Ԟkq{mx^w8 uzcXR?O[BkB,|hm,]3!]r"g}ҷT 蕹0en?r,]ל"wX,|KŢE2jR82dw}tH UkaklXc'ҩ'9[SV=O#0 ` ` ` </~pdⲜ[sk^WUV^Wϼ?sQ^[++B_~.척nQŁxTiԟtpH4i{@I gT(p#Urc?ĚUp,ᬙmp<ҫ?}yx ei5+^f<8 ^EEkЀa Q?V 瘃 )NI騩1#d9Nf 7ۤFFQzhkyX?ǔFuܴY3x`Y$d5erpc l0Y%[49{b4`yYpT dm+LRLZ(P&3I%2IeRyMhVignSosʣP收\l3)-vhDZm4]6vK6S&\&e,5,JIh u0 tYhMY]M޷l],nٙmjdԿO'zymغ IDAT.HBsMq5hLsPe6sVMa} 5M2l4@[q{2nP6Tk2Ke7*-v -S6QVuSU&CTflVղĭ:@TWZ_\VRfi^((_)u\(U"7iSP2\KJYr, u+̈́LQo9%sYOe O)*(m}og7{cMo IgW}Ґtd~S'n ̽=D±)a!E EBAbAQ#!AEq  M  ,6) gY(~Ƃ⎅ iH-ɣZ:w4hyk@[F|؈SGFM}IqƁ9򐕇ӑ2{]G)DAA=r z]oB7U,XT{ x~5߇Es`QzNAn-Gu]b]—yћ'c3}?my&>8xP~*G޵ WiՊ3'W[,ZM,s"]3dfԝa&:\Ca::7 kU=mOsSW\2sBwz7=Pa p@.0+ֲz[n=K.x+ r_ xҗԖĽKGG:ѹ-º8%c/qOJF b)b1 d$iIjHdQaNmه\FYP"r~Դ.H{"A^쎣J G1PKc@%P %O^6oɝK] ?a vT[dT3,JN53[>M=S"-V)lJ)@hSf |vM+#c1@Z %L% |)JΦ:JpKmƔưK"9r T,ɬrIklFI6j\D3iR.(kّ9mɗDFFnZY^Pb (ӹٛ7c6yUfYUʖTgMQa[`٤enʗ *.9m-ڶhP**eT|-[V. jZ kMuJhۺ)e*\ lb)pQw:ŚFaPYmeUm`g`0KTuUZz(FMav| &_Qu]w ۮOvH 8Musd\`"P8Eኊ;iVFQZ@Ƥ&ئSTfqnjv`S]V,Y2eӫokNP{{cn)MG!l]|\65͆eY@i=^X-_;]t;Xs`--ݳUY. P7ȌM&4mWj6j>٩rw] ۆjMJ{ nw ^Ş,5U*e-qUT-T+uSWM(gQڒW]̛z)_IL>E_sާsY)(r{fvT^dAY 2 7eLpg/k~PܢM$~ߟ0 "=Qj)pcX*kdX* FABaA.+Wu>ހưLrq6男c~[FR7ҳTilF}kL}[;#"w9gi'sa*GW-wBCz%j`xWꑯ]-,'u3(= Vz;_L:8 muvG' n( \vzdMOlҜ#ѻu,—BiOgY,`guI9}~.-z_ԝo& `)|={mC:a˅}d6}{_զc܅:sVmn̂íez[v1|8K]?η||/5㶗m#[H yzcs۶y"_3 I^s]󖋵Z? /FY+V/U F=;WY,\,+%.=P*eo}{a=iRԋXW/Wԕskúr0wp<c`0c`0c`0cޒc~+{B-({,5S:`auׄSt@22Գyt ^ND00 5[ȾʣhasI(rn)Gӊ&SJ_hL(b"&J\YGBt,m61KNn&S&Pfl}*Q,T:Ը)BJ6"Or7qn/(a0@a6e3qB9ӳdm}6W ˼55n ɜeGYr( 7}N|l!W:W6r((q,(c\H+gP.rBf+ɼ,Ym1_4d,RQyeTE O9j*JrT|jٲ&cL&nERYXe)PVKMa ږ[la T=m;ںSVj5UuUe-5{ֲ [H&ԒM2qfE sdq"װu٤@jK9T0v-[5mSݎ;PBs*ŪLqSNj5iugKLl]wW cmUB0Jks|B-%jQGb>%J:+ݘR=6m^5@; ^YCS)˴~Sb =Xo5ɹEQKclm3o,>FNQe2m:c,7HGi;d޺kmQPS2l?p[:[T.լZ.Rlb\ie9-cgc\SµQ2[:jwl|欕˨)dͱP&X븜)_dJeZ5*~U/([(ۤ׭]H23ye03dRrnJ*V>SAZ)O ֦939R^qSa'Mwo 䡧Xh9VoSkQF al۰*qaEq"1  ?q=ٶAc tMuo G-ſր((n4: 뱵56pG]^/X(?wPDX]Y-,/#Fy׆}oteOzKW뮿B׍gT9^xCizlM5~޸6OXfovfY _ ٦)Klpg!o Un?[|ͼs~gÇ-_w jO}-/mo*Sdx},Pw.=ǬG3=yd.eQKte|w!Uo5p6c.OD[٘g{voޠ=o\;"ڞa]zHgr @.˹0wВZ;X8}n䐮.\lJݟܟG˴=1lVҧCV_ W({S>V{ !!k`0c`0c`0-{p{npfAy 25T [ #jQ`AXXdTHZQS!@Za,i)y6cTl(r\XTQD'?(r y`DDPenO]M(bv(jQ,ꏳYi'J^TîV`?0ֲqBvV2*_Ok`/O=2 8A.mWF MTX<ǛHŔeL &6r"mيDEVXrQȵYiqQQ&PӢ*g*\-J].q˻'zeqJb)+L3 r^w $Cn$ [lQۦGT `U ,aϥ+dUʔg LI&7)o*iQbly,sEeGm`*Qppeg\9oyB]ElZI(K5EjYSߢ:5.JѠmrSj-|[5a'۪`) Ͳ*7j-CFj6PE渦*Z82UUFmYG EIT=`Yb;$0вqm)7Ŧ&ʒ6`o܃ %)IMB5ee(KQN5r.i;xR hmi^>-;Q%Tm;AY;7[S2,x)~S7Kew~lN2 v#.Y>Y-O孳`;.јrdcem6|@n3&jf5e*UjUo5gD1^% bPWmSdz](ojUHvĄke5 Q%\\۵G>523'v9F/2I"2z׿Z2oņ=_6%!U{o3}bdnYTL4I3It.-,/48`{,V'QݦpNH{s,4 -@,EvzTHb ƢD E ǰS+)b[ԹAłd2ft \?/ b`7m26AAcpƂ5,|~FG46olD~]kiݺ:PF?9υ=|>|vwRKUYD? -xi|[w?<x %,t{ߤ[^rc,WnY,rdsp3]Ǻal?H2#fۋ\{߾Yw}<w!UOty;m^7_X{?&:h98ZٳP>ع0wB=ye\Ho>G!ؐ16+v2 ` ` ` 1qiG?^υ~ӛԝޢb([!'N& b uٷd[ikXX'{_reyWW ,!ik $eW쑓Ѩ 5QbylG{S'ƨ r{4ڥ(ȚE_?%iN]˴Xcf} |,̞oQڒe.̖K-ggCWemzȴEL?3v)T]Q&P:eyT/{7 slTiSX.(lc$R՘N)uf&OFT E6U얱ErhlFTVLҬE3eFm٤b9rYVLѬLC>[{(eTBLKɯ,dj2`6W4[d=yŬJżE얱gͪR(R,\er[*\$ϊ*3elkZ>nm؋ΚA(ԷUT@2@0UW *VGyŊz:Jv(YlV;ۖ-:D-*iV@8%ԫV)lcxꬓQͦAچzuˎmNwrbL, VԲ@K"S0Y7uYg] uٳG?H ;E.P+9Iˬ%i`زofόz`2ctQbLDKc=ٵ#riWW?~OdZv{ms}O_xzoV 7eM4yf21b6;d,"curIvc,6Ƙ(@>m--&Tj` Xo01\֕U5UgR y{e;leJz+ЭTdFU"eֹƋ&nu*g6iͺ=|$&`ӎ+@I/*)mYűG MŕbM'iӛt$\+pi V,]ME GDBBlx,#Q1#EQ!ٶP@aoɾ ֆ| M+OmpT!_P!@A_XA> ,֧ب|(0~}>563vtT~q䎎hݺu:g9?<2  疊Χ\SW e5sp"=ŏmۤ8xPX+>7ig3lNz+=wδe\jYzoXݰfS*O .dتݿy^<G`iG ͭ^G'ޥ|nyQj^*d3o )V-g%X]Ս#XwwMSXQrDx現eQiZ1t.'2Ƽ<m~ #v_:3<`5Kv)j}<^ۿsr=xba%'-oNQ{wrloO 6{r =c:Z}*RkNr@\CPxP` ` ` s xpyx\On٬n\SQADq<)`%' :`2ny،*6ѰɰAI1*fr=夳LSx1EP E>pN.6b>~xi7'I$MdyfLqEbQcO]O)f yMb &6p*bƢIE &-77DM*Xi:. `xQcQ٢29U^)n2X%f~c)TȲ%Y*HEyrd.(M3&X.eHEK-\RYo39I6Q>PgB2E[.1`1Un6S6W4.lT<6g%[Dʹ2 Jk- *Y%nQ2TTX>&jAгT/tQ)Xתw({y_-OD[4}/v\/9Rú31$NI+B}A\VdzexW.FWe>5DC.XƆt2O[+m|X_ ip ENYiUϝOc:·Crp~c`0c`0c`0r x֫z{o=% p=x{^gΛ*wJVm}k# ֘GӊU1`e `cfM0@UԷl>SF Ěuq<'G6q*tԑ&6RdÊD1SR2>RAg+ͦF˶qSGg?'@c1.7M NY2h2F7FLq g`iw3|?QlQ, 5`-7 ;\4vͨt,{9fDJdZ9>",GTiM$]-vM<% eLU.iiYgvn#6|eK[Qȹyٲ҅rdݚ2ZfTVLq[Β\ 7bE]-sjB12XRPP Km E.e,UͪThX!OA\bRE2ZԄeUX'U6{jYaQ֫u\+j]UbQs[,qVRU-YrsUrSS{[M_ 3rg;-MֱeR(Ŋ넭OvT|gAL*(pP6 səEjֶym N e;fO}3 Gf0,sqkBgx{ WYh/Q/4L9lT@ kԺX&OTqlpVuBn2VFKVE2MXp*[r SV.QB4X[.T*6UT,mɰvjYc٣cLcn |&{po(z1e&`Af*eeJ36%*m2ٶpmJ:kt%[ietJ\2'4L\*k8nI - ٤"BBamTl"ApC} :Mq7?H0hȼ:9j!{ yc k?Q>Ey 7W`dTc#"?T(q2p9`{d<\\^L7ĆރӵkCR>^zgẀ,,}Q=?/.躓drVRdz(uo Dݯ? z?l|M7A§?|2>(]?tP7 KBe(|7Uuclo*p,Pw.E-L;qob 3~|h1|,]k;.s_LiU/Ѯ鼳OέԶİA\!]z< rVr,KiŒE:EudIT5ܛhń+EtCzH !}7 !EOYiY܂;x(=,ca0c`0c`0c{[z[pQεPthtc4To]X0m\Rj@[[(].bՠm2rh+*֭JJEEY.U+W@q[L9Jm*ʶRk%b+* FrmQ53Qֱ6&&rFТxY.9ȍZ2muָjZn.*Me_m,vkMSi9Wl @hfԺ)qQ}N'FH8 m%uB6ΆjYdئ` W綰AtZ>-m5ˮnQ=`)ƭ }r\*Z(sQb׬ۀqmMt9>]^6M9?74pOm7@ړWwۚ0mSmk3sרhvi,0m¶f8rT׀}[ur Uh[&0ɠXoe>LeްzUJSjY p%/7TUTVDt[E޻믊kJ\\{o zY,ً%e(Qf/fȑO i@{:9GmJLVLZq&{hRg3x@fep g˔pRk MbbV*w6HT6AEB!EC!G" D+r!||1}! C   6WhlL(ny4@q;Ql}Zɿ֧5c#Ȉ_kFustO.x>FhHuKA\{H^]յҶ}:ۊ>ԇf簞'oJ>v\n=Qf{uݪ#Wt[fy:_|Y6͗yg>C{vwQKW?=wϬ?Jm-?QVs~90}]9kw]uQyȳbߛ?c܅:s._}7B"gك~?|M pZ1o{oy"ս vmhg ~~Z)CZs ׃˗/(r.YeK/xr+k볾%Q ?F3vL ۡ!}!L(ruY^3ӗWujZn<ރr0c`0c`0c`0l_>Q;WtgR^ Jԣ]Qc$F:FP`mLgMm>OӃ2810101{2>яꪷEV[[ .۱Q|cAccH@#hO~:m\wByCxm=mGxΊtcԙ . pw~:|pCt{B[C3wB햣9]~ojUYԽ/Q>Ԟw^]S>L/o[TZY(?e\TҥK^ܥK+|^z"]p"W2w=~Y@ݯiGbX_ iZ{JjPq*%NYiʏvn0.c`0c`0c`0<8˒п5[s)p=-K[B3=tWXT˿EeoW汗wjv&oxM8 s~ b}-ޭo7,،}xrkJZkc8d c4Y}7[Q_~vN9ߍ.U!4+p~Y,{ keK/ВE/ߏ,ֵeڎ2ֳYut>4TzCwlH\;w+vJ{r]zL>)=EI;1010101ju,u,\O};ރX'{Ńs.ևdnybJkXXJ81NFJbo*X+Y@u۫j9oֹ'] Ն?%ȶ۹Ϝgm蕍/j6`vٸ :,hWtW6.j㲮6,hò26 wl\ՆmXƕm蕍xRWNXxrG(tԮ6цS;xZWOc;pzGh^h6-tqmWײhHWG;uhke#+6Rm u1Ա)pG#mt1&JM6;V6%:ژhSM6:ژhSMimt)ѦlGs]mѦ|_)tզbGJm.wܱզJG]mesM67:jseG[]mjs]u&]<ّ6Ou:/ZŽ:/rvGu]uC:/Ʈ:V:nCQwsWNGNWn&Dt;LwUgKGs畎wg]u/j®/r{QW݋;%n9}iWt4}YHiKr+Wt5-/Wt+ByUWڕ-rk}mW羮s]KycWiZ罩s{7wu:/:-:-,:类{+翭oG 5յr_wu]=]..xt WՅZӺ]]w]]i]A]]ӺCӺC]W>Յꢏtu?L`EEꢏuu?Ntˋ?>iZS9tuɿLbʧSӺ.zZ\3K>핮.̴.LW|vZ/+|+Ki]oӺzɿM%_֥_Kե_֥_9R..˾6K6˾>˾E}..֑rwLLMrlru?RGz鏧uO芟?~?;09z}W$3=@fzI  j,LԩpuAw*rq ( ʒCHd {9S5=1 PyNL?b!V[B]տ !V!?pV1Ě[#kkbǚX1nGuwEXwWu"9:7ξ;qo9pv}spy0pCGXōG"aö!EhFXs†#n†'"}2¹OEsqǐ#lawayϸ+g"w;y𾧖}7@{[ߊRa yuۃB!b1|b]NV.PBg sy/Br^~GhW_[>N:%Zr]3= gWa'~!ybHȘx@bڿg7h"I+3kp@~exnF=޷ZYs;GZ _9m籩or|6F9lvo+|g}{ki p=o`q_O砎FCp9ۛG}TrE<Qzt3`NlٵG3pzG=Xy{_ƽ[~*v7#~`c){${==6ʢs4ë0bɟ(bQ`>G ׇj2^Fm-dg 尵f h.Y?u&} !?i<5u{xqjNց¤ 8vxL{8\i/ٳg㤓Nk¿Hg=ld{ K|X;ڱB[jV4g4U7$BRsg˾*ȄUQ/zٹ*gJ/^!1o och+VdZ;z=?_kϡ0Wn7@B\c(ĭ˰ >V nkzy-@ X;!@ IF nA5蟪?*G#>v ^2p z\[n-%ȭW5## q-uWK;p<;78`$:x;prr \[S pA\@@l41Ȉ!o-5>ĵW@`!.m`An`q\).40 E[,`;rQ pJ p qUF:p o z p q[[ p7:`}ZKkAᭀ[[^` %%] o?b n]tQ AKPA%/ .uAşׇ5XYC% !A\/qXT! |%%%]5Z+ c!.\e41]˯B\W pbgd IDAT .n q u!V?eԀׄXy+ oFXkP"FX+ pao9۱["%*C oo% k noܿFX\w!8,vog.!n r%Ps =LJ[-ĵ >Np;$W@q*\ u@ۍn wv[{!4s?xvwwU]=(vu%1]cc9?/P~UvNhǗ B^~1b&x7;1~S![*>ȃyPw\C-M }/EPATKodvʹ?)m~4sx`;1Ҵo|\-#3w5:?1٩pA3/F23ސX"}0 ?#܍/H<'xHpyKpgW#[MG*c͖Hks8{j;ͮƎŐѾ6ԧ0i rU$d0wB8tEgn,Ml7 cm@Wg+' 9|4]m{T;.*61r<#Ǵ'>TVnp_ مl=ld{ xk~=֙+ٷpr&Mha gҋ5F#B_ZWL[ڷɭViVWĝE s6az 7mz@ׂXq|kc4qS歅:+&nKҾ 6hط&pi %Mq'.[#n(\ qGĵ[iV .[n99F Uvoiᖍo o+kk­{&@ؾ%u7p=x+A}&c ܓpG}6qվ}A#;oWwƠKj6 .Anl,\F--ܡmfµbk ٷ qiZзo=K wٷ qiኁ} . ξL+C \\jު} ܅ZV Y4q ܅w!ۏ,`x: ٷbb& B,RV@p? ]%5XoC,U{YڷKKk! K۷4pc a %ȽʌξyK m KA\oe(U6eޞ\po⪁!Vݠ.pĽ)BlMط4pc ]pٷ qe+5pmj.-퐵oa됳p}4p r==e>AZ pu޸#¹j\oiƃm7qn"J:%t;ѕg1(Ѝb>bBs`M\L_X}%Eią/+.G2=ڌq򁕸8Oh,|µZ<=ػIwSxn3vf<wL1?Ē}nCMF&}J O\e<L,/ h@%%}¿] ؗ=DrΉ N=nw}=5,>u!oѯ#s[ڇSКA&<?Mߥg3?Mp{}.ö!%vov6=ގٯ˺# џVwJs=w$C<]=}V"FR+w?H\ɑz{l::96c}wUrŌV̛Ô3檑˺+7rk3 c`{џ siwUs;Jp_ ;#Os8iJ:'N P4q̤ GsRp lOd{ @^{ 6Ж_0WgLV\* F&B˘%v-MfUg<띅r_59^e/o޾6o5;6۶r܀+E){b:kazQʩej}E(.BY-\(wbo]ڷPdڷ"cndeQV'KIطmRe[1pվe'e P#l#[.ʴoidoiJ4qTKV .㓭}K WF(k| W 5pžm'}kl2]rl mXaɴom|2-\:wVbuQq8B9aઅ>](TrL[ qrfr"B7päʄ:hejZ7lc\q]r Ҿm1uA\1eOqKVo߆doC(ePv.[l-܄}{uejJ 3p`j|D''"+~־-BهμM۷¥} ʇ7G6BY8B\R#CLO: 7o]4q]@\6>Y \B\%ĕAWL(+u wH"j'&Oegn!PpE(K|ba#%Fqindr¾uɍeڷ2kλ@Qʜ[{$6|BR.B\r,a~̝"Y#ӿ{(Ǽ@̋*|®^~tWr-oƃ+1 HpOWmT9ɘlτl><\B؃/{O M ۚ`_{O?6 0c=xߕ}Fyoޛ"){+֭;&3zw {k/_wτQ}/IKp~$8=6ʲ/as=|"g1uĠV)P~~+07ˁF̞ܣZ[fY!&bQ`m7 %iv/X@tD3P3Ot#oyX./Z_ž'faB^W㮞0h0PPnʿ%"G>_qWOX<[efc>$~xK6z|}`Su"̇^v$I.KOo =qk ~K7oSo~AV_ޑz֡lpϡf/?dn\>~mqvo~4UMrv;X3 ޕo[{ӒKAXэxGFqD. qH29?wM.1;̵Gô6 )%hq aq-8EK;[xe|2Q~_׆{3S9sNb+:5Ѯ͑UnvV/fs=ld{ j~4%mp}V[T*! Z/zkU̪xd{r/*5F&[Rc^5qȾUmS0+_?i+F'9g[ܖdm"BE' juٷImZV,\\ʉQ Yo}{8FًPf|wUQe}(/ ]d,n:>Y .C,1]ׁS!eLjߦ:pG5pykF(7CO^vE(Wf5o}V!jZKWc(u.[#Go o9ʿ #:pøvQnP:p%FYo5B9߁:we2;p,L6ف+.pc].n¾ڷ\.!C\(WEwF\[6BYeg>> >۷[/BM!F',=(ktp5:y ҾM]"X,],u)`|W7:yJ(v?w". pi;jSg]y V`e_+~\6.6cg@}{R6(S2F"Y MxlB>' ϺiF,tFUv mx1\o;sKp]鸩ԙxuoпP_~O!@Y%ڙ._\wvצzpyO_#}J1-M^b˛~w<#oP؁VHker3v>;p q?0}:\+VWAnmۂ:릵=pKo+nmƙ[~!.)ٷqomm ;7hX pndc@ 0P2Aנ>#^ p qieg2>E(kطj2>Y#_O Q~C'HI,5<.FY-A(6>Y \ۃ `TB\[vdMY q}'[ wp..[k*nnIWp [QN<YKmn(ep4ϴ=n5>J\ڷ4q mFD(GWo5BYu>`C1㓽, Y4p8qnځlP-;pC,\ځ'5=np\oi,#Y-ܥoeK 7m儅\X6>=˿cb4q}{ $u4pZ4pfZgrh5 Z!V*_9x+h߮tWJ|!V uڷ7h o7 \ @•dro ު}:-pC$ock{pcKKu6ZK{od}.!.o6>n q#+)jlFq%JYك+ rF8Ob~wb.&X(ϣ9ty ӑgmgtL*b30oNp_ 9\V2v}|=M`?^-[!]?JlZBU.1p'#Y+}fM9~Cn;om^7zN6S 坅q{g~,юMN=(ፋ_pICCC_9vo|,8w\k]݌n ?ukN]kl>w)/~{Do6c\yF3W#X2m%&{}hP_c0!cSeX~ ޻O.J4y>xW߽ }᣸wqp3jQ>pwxUb q0>m~@(d_Ono{w&}}?|kmysCcK>7\zߞ-ۊ'I:?Roanx嶱cύAgk ƏkA9eA.!6ã}mcpܔxxڸWx1 ྺ/hl/d{ @=OӳB\նgyqr;L2nUTzQ)Wź%PWV`fFnjo|!76pAlA[G+IڷQ~mۤ[ p%>9@<65p wgWmI@\5pZ.F3p[Z9Lx1uڃ[pQV Dpkg}K AgeMٷo{AA'# oZxk0xSKx5p}Wo߮5B98(fм Hz&7@o`\ qF);о5\ܤW!.[O^27a uYξ]a9n܃5F@\o!Z.>9p}[vઁ+L!b7 Wo/y뢓K[ⓝmX.ouV%I׀=>m4q 3: k,ItX" pKxuKRP IDAT˵Bܥ_('zp ]"e qXߥ]}P`.![&'㓵W[4ožu1Fol# pɫV:pQQ%ªC{p[b"%>!֤ &:ׁPf|]H7e2FYeNvb#6Fy!6;>1*-\ q}R \ׁ,\uߺvX!U 7уK p(em1߃JEtqK"-м- ХpƜ9;/P~U\^J[ڠr6x{8hv7}떠 wdoނWץO\eNuҸ|Fz`Y˱僫S@_?H{Sw~.߃ǿr ɷuSҥݽ{[O7a ?Λe KRn v\#l+M?~GT.G|Oo voKv2fxS5wLyy\ rYXnii1ccfLPˑe[~Fjmzw;pEwɡ2y<0oځt`r3]/f~@=ld{ ~=g}pc[. 2j5m{\hVUfR)ද܇J*}IK@k ^հYAlX}o Wc= uf~JtRF){.AnlY \An;i=)o $BYⓛq[g:x0pp4Y߁.[kbbߚKZ#;p 5ps# 7YnЈO{p˭}+YbZ 7m0B܈z;\5oD(3FW߫ɍ8JY \,bi6 \\(7‹LYo>5Xik% c4pFڷ{p*p $:u؁qeot=J&-\u { !=g)M\/ByO#M\get+}~r(d1pվm:6߇b2>Y.[Cka(ڷkb-!anܰ:?B;mtu#Qacz5 \?B'tZi窅;ڷC۝Q};;ف/](X( _* y b K/n079g+By```ć6AjGZj.-gox\'Ϟ@ d+? f'/sq$q Jq*_^ܢ0r r\vcZp[*H_Nq~\܇j#7 ypewUsvOO@~S&Lx ^ϏgI'$|鋅r=ld{ 8{@a,ךǺ~MKXc1- j7Ϡ~Z[1jj*jI.W2>}s+R.{7yZZ&bAy}kF(eko!tbLxlTPx,܄};3zp;'\mZԏdMIk\p.cׁk =o&`ھHr ɌPbd1qO .Px\Ͼ%[Ơo r-\\O,g}0Y迥khe@ . \F(Wp1ʌPvÏP}KB\;pV"mU۸F(- \g.$[ۏxE!qL'۷iF'4zpvB,qKnվ ݃+7Zxzp5Bsl=a¥Kj#q.ׁ[L 76p p¥}epCZxo7ro5>9oe|}U.Fe|M(BׇF|ren5q#O}g&zpi>u-#Mtv ;'[gn\u1>d5ot};$cxٷr,.JYC8W^y.v|RB )P(MGgRg7 ]L/wՉ?gPG z/ՅC{ t^l=ld{ 8=WmY-g[fnhBDaJ JJ}3붷VFjr*vD,W˨Vm^UΞMjIVgqy@[o5>ЖsVhmo=x+4qǹeF'ߺeۃoeK|qsЀS9[uFtK-M\7b歋Q]3pvӾu\ĭ 0Ч1J.[U Wci@bp oQ~3;po qm%u1\Qmpoܺ[Uv~ Woϰ1ʍ\OUx1־+VpmqYXme[kjjۅKx+1k|C\7"M[4oe~Cj߲ujB⪁+ځTUwC,tʶI?i@Z4qi6־e\]rRୁ'_f %ܯH(7Aw7B,d%u˾p۷ q o⓿c1em2FH|F(1? qf [7˱[PnXP q1ڃ7 ݷe[q+=ҁ4pc Vk om[׃/b uண{{(vw!Mx)) 7eqeWoivV q oG(?8w{$do-U6>yȚ;,etaws\n[ׁ('0с[*n؍R1b="]=(:%FD3/DžݘKw^p_!rKK#uGÝ]sx<`שxvW d+@/ط!}\N8#pPä/k&I\r_ׁ=S[[>v :~ nي氽y2!nm-a6zf?J99JGnp r!7{l_=ld{ =[}c[nr}p p9[bQ:p fpOUzngrCZŬjJ|wfUgq7Evƭڲ96j1[ s7wywj'n1N\QmF( dQfl6:oeF(2&\ho,;'$:p(kj [g\k,נNx+=.ByH|r6ۑ7 bفKx'8>Y[F(K o5Bڷveׁ6 xA8 wPM pµq+6\ۃۈQ6o+ep'h኉ho. ;JD){o ԾxW \[Z m|r"B9tPnf\ qفU !w 㡍NNE(dOzjߊk`m-{p oDn%^//cOn!ltߊb q%>ξe=%Ux}[gugygyg?  rW:pW^:p5FPWͿvʜ}adndAQ^MKpodO5(am Axk ܆}kᭋR7{dZ|_p0p:p{;p3FyP \Pb>nM 쾕c6Bܧպmtj[9f3B\_/vЅ|%tѺ-I7_m Ů" ?o}:pf71/N߁ Ǵ%8"j߽eqa>;lV [lr7=w˵6Ǐ0p=MI0>GI\q5ZYr sǏ࿻Zpm8SE@Heou﫶rᓅV`Fa4a8I9)z5:@=f{@lkz?fC--[=N4.c%B9J}(Pbf,Z2n]Vj~=Fni˯؃y~yn[ۃ۬7pلD8 os8{G#[ ocw{O A-ܧ(ekߪ+- 8FY;p9;pE([1bb7 z =([@G؉bWAq]]wD<Θ??d>>P>R^Ëʼn~fN.>2lvó;V [lxYamx`E`N~Yb߲W-[5p?h^ 5>=VG=.bn(;p+6b='[Q&ʴoe|! \D. I ׏O'U jJ|2{o 5mb u6o"O_^OK}ˑl \/>P-\uujஎ;p-][ாuqaPomq8{"hteoj%]# pC\Zmnx|Hb\P\gҾpY p+ɴnuܝ䪅[w\_*@w1b)|KzĶʗP*"YBsܹYrӋ.(RSsVO~"e /:^}feq}>;lV [l޽x?wG~{;^o㓷a6£^YrܱcB܎mi-QXTZk;wɔڂ{֟ wo,JɡwxO8s u fh@=ld{@{}joAf pi !5Uj26}}}Kp[=}>zW/iG+هbzm}:' vbJ唁dM@~p[(ez pm{p q4[F(eׅ{T \Zu3N.[7}ʱ۝2pge4p o sX['[6ĭKn1U'K2-ܓl-[ q]re[ |Kp+7;pa06B3pg#zpA[B\ׁ.;pځk؁`r \4oW \<,<H[Qݷ Pn@ q oUVzp 7o-.\q oq.=V{;Y 7q/ cln+nw[~|2-O$;p]bR rwBVzpPnqnC\Qvjt~8׳o (} g61p]p6e|Ofr,iط.B9e΄# g9,mqnd#W= +7YV,\l{pCN۷҃A\۸܈QnD([ҁ%:pc{gj.=x({j•Pw![oin6d;per]O k[Onށ+;\}kp&n\ׅo4p(Q*-\kvA)J*`302pɁ.T_;0{rWaP>;N%oƳ=ط5lV [l^+W\N𛏒e=u&:p\>U+Z19u jclQˁVocB?sM6Ym53stOځ-ĥO!cw$gϞN: h}-ld{ @PV׸4c\jݦg߾Ntp IDAT:knHKphr/-WQUQVWDVFRFZCuU-ASu@7a>\y=ZE(+ut%չŚڷ6BY ߃36BYpSvHnMzpnvKp+Hr];p;k=d}k{pفkV6bjnҾde[ONE(zpٷ'5zphodCAOvbԙ1)7уKNqi}s`p+.F=g3Yo넷['0pمD(+tdcG7l < Z3p}x+=jq1Axc{3pܾ'd\Qnt߆־-\H߃+1ʴoga׎kocp\E2!K.UP{pR(6B9 qD(\ oC4oC0p\F(+5qڷmփ0p]nޞoW,\ pl!. +Pxb߃H"^nd-5Buqm]#'+6š?AwP^FP={p&nZV \pmnh!q-A.>YCܪJt2[g*ĥ}mH"cRoi2F}ʳoc7mso(e=C \ڶB](KH:KEwKm!߉|>bg}"_nߤv\o*F1|F;7๿܌y9\1[lV [+sx3wb88o8;^s䶵IOnkk+|˞\[X0c Ngk[fw*9YbC[#1jiઅ;ZnLp'5 T.B9pi6FB[vQazpri\M({.ݥ"tiv/!_B>";qϘw9#=njOjõ3[^;4r Ws =0|:3plV [ {1< b2uT p~Q+{rsXtؖ2VOm)9A+rup1m8qJl' m^|mEz8nvAP/(gL=ld{iPkzmzVppLַpC@Ju&ʕ5kҰUC_Pjo UjY@n_yV܅i@K׷pHPTN+ n2R쿥q+^|B\ۃk י qi m ܸW[FF(KV \ p ľ\F(4zpD(k.oi኉{o6o p}klo[WBܲq.oA܁u%HgegpKor`W⾹ہqYe2NQ̞G"J9/Xٚf{ @=p{ jSX۾}*m UxY:p hVgaK#REo_/*՚X}ՙZC:hf w}wc=C[XUW!(M[ڷ,3o rی4B\Zq.!neQE(O eB\P\F(er'ʶנ:p%>nCܙ};F(Wb+ځ;zp%B9p}{bUM'sXx;w@[5۷ҁe,Qʳk @oeQw`7`nUKec,\+lq|rlZx+D(=2F Pm:Fl qW[,uJ-!.Pm,PD(KB,ݷ3X$Ov=p}=n\RV6,!ݷ!vj/,Nط!ٷKKܯ\vjކXM7RPb r~'[ON.'ĕ\7#]e?FڷV\⓯,΃ξ]y}Q^uR[F(k(G7PcooQ cVo,1e|2[QfD(KGynsjj|}o}F)7:pm#>y!ؠ= vB\Ͼ"WM\';1ʍuzyiFbRB=R&ʣ/Hr{r;:مy0wnf"Lc'ẙx g56b<\V [lV'عmEع) xg5OyuG(V=i\+=pgU\[ɸM=<N̞y]=Fnp lOd{ @^=>Vp_:+Up w4x}w0\0Ĵe<2;piVļUEF(|l:%B]$BxU;pR7e5ouf| ڷem܁.tr n 7xoe0:9 @[qߞApۈP\P}L\pAljLqxkҾ5nbdgbߊ+ɶ7\}kgઅ𖳳p#׃K+c[7pj.gZqC᭛?6 -U˙P}K+ oۏPP& .E;ev2>9A\1ev7c}$ܯX*`il߆nk[ۃ[pD(/PbGطUVbq{2o طVNF(['P3o q۷F([ e.#o( p%JُP!V;uܵq1pWoyk>dM\B\w#iZw>]qIE(; ڃK7F(=†FeQn@\v6oF2[Q:ݷMvQh݅bB% tՕ仺Q^¼¼9Y E6ۤ !<3/Yf+@ d+0 o`8zkNL\Z; +^f#] rnj:~ Uqbnk\/PW;7)w3:T,q3+Ks60{=ld{ cZV}C\߾^Ax[,mn8( QʨVf̮**f)ȭJOn_\p}{6>V; uqčaM6R9mf~r}=QV/1c5B>!trdld#obԧhD' 5{A?[ZOO[Bܢ};o{Peg*:[&[oln܃0p-=erG1pONm:Vb]7@lߞ6 #۸v~#F۠ \)xpCq#c{p,&nedpB\\߾cDַoepmoߪKFhDr.xo( Q J.[p?bA q 4Q}Kk ߆X E(;Woe@܋C${p nSI(/V9%_!؃ҾR׃wJD(X* ѼemҾe26:ˮ2X"ʮX W 9sM \[ޞeOI4p rL+i^b%㓯s&"FrF%=2'bCJJtriF(ni஽ScCMa=UVo(epeF)}?1omo\N~:\ow4oվ#]2\Mo  *PUR'J4rr;YbO." ]y̛ϝD( HGaOǫ^xhog)wv'Mع4DZGFݝ@ d+c*\9çvam|BB d~z'ewB؎B\VniiA.\[[p|hzD(36Y?{lgxցgD,9 {;ETfc{^ϝ.v8?/=0Cӹg[{5=g~Vps*Ux1:Vkcm_LjeR&nfor^o0Zbx2[ުgd2A[('"idPNwn&n |%>ͫ11{ \1q5>d nmD(0FYogY \F' m[?B9m.-\F(K.)oSW 4 \F(m!no}ugby"žeD(\%]ݷ W@b,=K u&# ܰp "B\/B9\eP4F֭vnpW[ZjOvҁ>B\Lp].Fyw!P[?>Y#?bG 97qP:p.jbJgE(:pG5p6-oGtj!^0p:p W,F\F'[PwDn"B!65BY{pKgҾUAdne(KF(';p׃u2Fy'}dqmξ؅J|(\Ʉ$o"4'GM>ivK(1JP@O]F*^Ds -YDW>9s= ]|ݯ[ewEqVnŶ6QE`xX<{ s/+Yf+@ d+daӱiql{d9L!s<_vttiK;vl r-0GC8'fagnk au\3G]Gn7f/Bnp_G`ݟ= B :>B Ov~ٿld{{@f; q9 p~vTk^!0jUږ11eڸ5TUVe˶ Rrp ]u0 i}0֭~]iyYp[qm:*er*Fq|xcn`plc;F([ ʄr +=b pubK.- \Ҿ-ׁk#\#.;pվdeo"V[\o\(!N2҃d p-xS ~|Zr o5=o O%ĵ;\|:pF'7 pΧ@puZҁbk([ W[E)/6HXRV L[ۃ+V Wk[ہO@ ܳ]|2M\(C eQ~n oVg_`F(>p?j2ByE+ ޲6=.By!|ki*c \QX we6FyWB,ID([warUusg7;{I֝:@6}ϭ,**( "lア$A!y|O] 1yNm֭S} qi& 1lb}^oك8^c[ rW#,oӾ: p[ b*NlD IDATu1>ڷ,=uڷM1VJn qX p:p '}p-Wnl;pC\ۃB\[\(IQ[\oz@\^d qV:p-#վقۓĥ{ μ}aE(+U[)/ƭKt6[Ȣ#Hig2(L.\&\\ۏ;o<̙ Z]uN ]:yOk~=RN~l:2'>=ز-N7+@ +{K7OYqf (1K ;?\F#F@ܑ#{`^o@(>6vwz鱦6g \m3MWp g o[&B؍ mJ^ZZ.\+=KW[cw &nKleA-6[y۸[,&.p룓GDt!%%u= qkc"4p\׃+ľ5elcUx=9g $F9ueu 1pmtr?mҾx \uLڷZWۃ#xx{A?M\oޫ=Xx{GF`'ahܦ\.BY =N{p;p qmQ\gڷCzpl[2"%>F2m+Y˝}€2VWC .ڷ'Y'etrjiּeoo|3bL;w\t3pmq nok!Bl[B&׀=!m4q 1:3 k2>9"]￵n:p' ܆k!F)_M6a# oPE( FZe_s1oc o]n,ɴou=j*e2 \oوO^yWzV-[ߺ\F):V(*߃ n`* 7,C1V' j߆bC \B[AD)?,\5oݼu}Q^(7 \wßu% 1ʍinRkome|Q>U_+ng ].k%R\&n|,Ytdrf;w)}L^\e#kO9a,6.8I:p_^=ЧG@ +@xOc7q1M'c|i~^]j$%a.1{C3WF8rɎ=1]”&CoYӻ&J;KG~<VG88w'>hqO~|;L}^w}1{lr+WCޓz^!A3<7ty=|A<2x1|,`iײ+Bقܾu ҁkҾ 7pۃIwRtFl \ڷK àFx+נqZuOۂokj B ٷb\jZX_ \n?˙D`t$B'q-u=Fh2p="BtxW#CbiFҁkn$=(ӾW㓽.o\@;p#b߶6p2kߊ;p#PfD)' ܭF(ܺ7p- \j޶Pli6zp}wYpXPfPpM.ao5BYoYoA܅܁k"k.btZv8wQ؁Fbׁ'K@\%҃@m]z5-\ni~^܃f 74pe3p"co4w."W|.OjZߪt+]ú[ nhD(ξc}طOXX3Gb!}l 'm-O|ڷ7MR&U \oi1u~:ul ;[ҁkۖڃL[պu/ K6فIX[hЕqKHC6ׅL6|G:e"ay8y;7)cH|c,b;O8Wn7+@ >+#l:"5 =#q_H{$M i W\{{#ލr8fq=pwx<;$Qf/smR@\o;~Vmǯ{2vǕѸ4.N>]U꒘mq.wÆ Y Z> x2qP/3<#'@Rwbpv%\'|ҿ},X>]7)am|,ms[ H띮Gg` *|o2g5n[YAp3/~WTF(7Q EvV[ )C`[FZDotiQIldlrmMZ6z[Wo]r5\uĥyH܃mYArmC[ڄo'h2oKx߲U p־M([zpJ2A|n'sf-Gqv֤.omكkc}renBxk0ľK!:`'{tF(ڷj=k`᭝MҾ%e2 %dl.܅5 ־ :p5F)Bv pGV:p=eaߪ˙WoWo%Bv>c\u߆ʡ}{Z qFF( h1ʄ!unhJE5Xtqo/E(/&bڷ2,&xzp5B7pC wH|rljW ]x׃[߁ɜ].Bxanh2BY{poAVK]WodۻbvQnXl*ĵo]Pn'7 aaGco6pE(6с+-[uzx;ذo3F|uzp%nV[',\\k9LnS_j:s`2|6\|.Sttt!cΜ# \[ZEgW#yr'UЎzrIx5ؼXteزOYHHW ]tHl66 ¦xDo1e?SGI+?H~an{{80^Y5^f.{r?O7NGmiJ޶ʥyYmE 6*Mr8xZ 3|]vЇ޺u~ _hv޼y~s9w۷[9]}8裏AmrOSO=uG;rMb/[/a[|Pb֬Y8m[]nK}qpϛ޾Hߋ@q!IVоU:*Tbޖ+P-ږP.VQQ뮗*_җdyk*bѺUxVwV!n@[L`VgNVG(="(e{eF'Pe[2<čЀ37. k\iD(KA:Wc}QɮpiNsӬ}k Ec!nɸ\Z)BM .m¥y+oM 7 qiΈ 13#t=X W:p7p,'ʶue q-Qvv܈uJڷWo1ʍ\ \[pEC# oioe.lt"7/e[ceervJ6:pLvYI+歋O+UUrЁ+wTXξ]pv oM߲|n/ycP-b.ciංD(3FY.B½4vvJ1ľ+c4(7'/%]z5q^oԁӈQܯhQ6p \|S ߁K:pW\xKh qi6b•[vI[Oq }Zodxzp.\1pDZŰvy"ܵOX+n• FC0B9aJ6B9i߮Cb[piߺdo-U6>yw8̓!'ف Fܠ7Ag6\'  WmǯVy,>Y'SIXӁV!zf<@003f̐|3R#N"ǵ+cܹCޟo >cMG?mzw'G{xg=xB[wqYgM`D"o6+sܷf>RИ~ (MYmx9[3p\Q=BdQQ[J,rطU}r/-+Z[iy`s iZ}LhmF.-\eOֹl gO֍ZݷA2#־erxx qW[OV֠6F(}k{p%FyAV.[gߺ_:p p%FYځ nh኉"K'7 \ omn};Z3\2;p ogFeo,1"\ڷv4u"ڃ\F(3>YcjZۀxAۚATk(ڷUxk4BQ:x:pe%Ux ^]1-a:pi&#o,V De5pفel2-cW1 WZ n5Bbd1q n5>jcy1GB\[NND(dE :pվ "}߲vڷM=Khj|e/!1%ҁk ݷb/\\OKݶ\zVocO^t]| (Htp;bO.B]o8An؁[ (3BYvV;p}*'?P(?\فv#.>[L,\ܵ?'u2ϸ0Bفۓ~ݺwc"CW,\ہ+m, Byuk-\b\Qv]d6:.gíc;͂ ] 2r:rO%Н9s9;n@\@͌m5x2 <'=9咳m7<,}z +@ XZ̙tԦww=q؄Q7z$T[}Cj*A7qD=i"6\Վ_nC74r˿mï Ǫx21ӲM6.$vO!j_z;yϸjx/jժ! wz w)}s Bs=Wzm 6U CvLzo3[no@g'_[^mQA܍J$ wz(XBoRq:+=(L'rrVળFכ]޾-+ V W#y]AZKPs1#t(%%UveXgߎ Mc#MkxIr>1pmD(rn} \An4߶PKZP\kpk l Fm,Zľ #id8Z4p,\O&mF({qQʴpxk#HX\FnZڃw歳o"-miP;pyE6FY#3p͒JrF(PoL7^ ĵ3p6\p[ٷaiN~5ojJtٶW \[oފ}{ bOe\F'k2oE'7^d 1ʄʼ]rҾ]|)F(.\cM\\1Kb2>G(u]eg~[[v\p%Fx5 xbWM2BY \o֭}+1ʌRvP='QNJ;b+kʻC\Zwh2!{5F9PKp-#}+u oRǐ\vu4 ONڷJnugڷq]m#F[B\Oޮ:µ?[V ܓ ob[g2FF)Wc oqQ㔗Yљ|NOqG!A6G#ܿzҴcL;fOۦ N/|l{eӛHW ]t}VgwߌM 49̌Bn\ pww"qu{k0i$qД ,j~Z6mEi ޸M~g2VtOAԝA30}Z'zv^zV!!cjŋcɒ% (ԓӧOprN: 4@O;4HLJpc=Xy.>/[ GϚ5k?(lgΜ)nx?&C\pUg!Mʵ `[.MZCQϗcW^-&pǔ|O\z&zy}\%;zXh}^=->}_e~.$q^p^C9D;jgߊ'x[o9\okH3~3H^Vh+Yέ.M\Q夁;`Hlb*=%Э+VS)Ra,}4tK2h窉#U0iCa+Ӷmen֭&pkd&p:>>9ve1pF, PnطL;9>ڷglp nsNpmm6:pkp nKFm:lNඟ> {piኁk-\eܟ4p6P{(-cm'NW# h8xwH|2#]'& &pk`z:p o5>'.:p e2F9=u][D|r}߆W{pi!ݷ4q r\F'ʓF IDATpɾE( e|2ف' 6AQvVmE4p?ndOmrS2P}+80p :pizK״0pCpci\O.%.b,ctqm[\1oվ%eڷ.BY'+UW#}m+n\kerh. X U1VuUpvekܺɏŶ:NoK W:,ɴqكKxߺ\Bu=>B %%emv>F}+6pOf뾵3[0 Wܺ˴p~.GgN" / ϡ#_@ط3Y9d: <{޼4Byg[?ܶ6tG99xWs>=tHW ]t+e ^{Y|7Vm| OGԩ)[~?QQ?pEGGL" wkdt5 qqʌQ}myѣv\Uy2X3{b^w(=8#q[޽O2iY5E`-Czg?Yyv>׾5]oSpcxnX`d3c*!-_c||}5f`YG^^v VB[n?NgFLܖ+79d&o}sqظ|=!駇)', >Wm K.Y{ g#<Ҵ_~y'Z>N>qĺ Y+os9w#g@A9^YK"Wp(0p}n¾e5pU{V,҃;ph2pu .!.[ i~w>nA"߁Kطpbp=>F94p:p\龕6"hڷ]~H'3B oL >FnqمLK6ٷž&l6 O0B߃ۀCkߊWL7aJnq o}n#>܈P}F:pm|mO(\P~BA\tઁ+: %J6b}}rumu 6)/N \l|vfgё J9o}:'I'nGq^ +@ ^+xk\}4 ?bQ0&5pwwyl7AԩS̝X>'acv/cs:cK.߮ٙ>*s9ۥ/ 3p3#yVg^V`[jrVW-g܁z R ݕ2*2*XM۲ߖezRDTnVVv*uqb˶78k}Xu &p nuft2PadhrO=P.ܠvHnb6}nmNC \[޺[\Qf|Aw0JW-Anwzx+6۷k`# nA¾\u-?JA w@]tfrm%=2@\nuv=[5Q&=p Wm>w0d hp%BYfcҾme6' 7Bܠ Pvw}{b$w$Y CSl-oi?ઁ1a "}trЃ+1ʡ{n`b׎fvzpEeEX$W 0B~.:{i%ّ҅=zpi^e 11_jPVKvuZǰ-5p['/wIx+.moW\G2>B+n +Un-;8A[B\{pcOeξn ,m] .{pmOWmڷ6BY]j}.=P^LK|2#u4zpc q^Iμ%7VMܰs4o}dF(7 :$F9uLuOnF)mlD'Qʡ p_=j]((s|.Nf k ٬\55\6L.yssqwݖ'Ggo#(9ɓ4l^ׇW~|'eu>=tHW ]tزO3a㾣qz\L]HLL.v5G}484.{d%ȥ˞ܽ&MI1eD;e&=c%̽ghrtٙ\_ 7Nq@e{:V7 ?P.ۼK@C{Z=mk\$׿.QΌYskؑGũ*&ama=4T 3i uh5m-6F[?|Uڪ~+V1#p1BXOAH:HLwy|+p}sMw}ߧO178e=}Wl}ݜW>LA_N|.>7{v)K?g`G|#Mj&.+etIb Gtޖ=)TFXFnU+^^eTAM0V+gXv?ֶ9VPF&;ۖ6M=.::wDv1p[ec"jኁK'46F6Fzpdڷ.>m+Wzpnd#ݷk \F۰_ \Q0 m -.p #Y{X+Fmk0 =c 渙nK!30}k" XwܸqU=X՝+m*e\pb5K] xK+(҃V=j2BWAn >Y \K2 ܡnE(/ İ4[= }ko P1.\B\ll \şuVlˬyD( 1½2Ru.FYoLV-/X*`D(,uʾ6Qʴo]|P^5 ne qo Ľ.ݷҾ \\up{pc` riƠ}|nqcޮ1X (V \\ZA[Lx[oO(ut"B7:8Nee[<(V D\om'+%[;eer"::NKU[u3l \<{qy9L\l2Nw0{<̙{\j*',wqƵ3Ue6U2^8xrm)b +@ lقW>^xڋMu`㌱w!ޚGb1ǝ8}K8Z s ri' Wr tLS&e?.#C`;YY;LJW2Q.\m6|Њ?Um|[Xa˗yB+r}mn&qСK`v>ަUoQg?ِn_vsrNOةǴӺ 3:mK-;yxx㡓^]_pQW^yD ';wy]㶹^|~~NC+?gy'{[1}L @YwY]^'YIx;8TFTZ*r"as"ݷ=Lq)P.u;PVwu=pPP]}-޺UvJ|3pi qm WM\QvQʡ{pվ<e5piߪkݷفeo jD(k.oi኉;%4p[ٷ! :pi\a|r؃KV#=-G7 qmҁdt-o1A|2;p}[3Ծ% or7#[-l#<.c# =b}!zx;) 'W_}5s븾n7o= ʑ[2BY,ݷڃK AFPk@U &"żuui߆vžVL[B\߃K Wo킳b,h=>:b,Qft򅱏Op2Ӽ(F#BY \ZCܡ-oCzpվF(Ӿe@\[K1ZWk 8 %mF3W{pevzxe|re5p qW mXM߯'u.;p rTmm6>歵oWӾU:p҅M! oh 1pi>\ V \nOLF(3N'<\:&uD(ưuׁۈOpK2o­cß U{Ahɮt2F[&4HnosytftLCLVo3v0g̛;'o'Q=jqBsx`˦?O7]tHW ]}Apj+Y=!܉#1vt| ZilVl\\L5e/1 ev}\o;ٕ):V2X^ɣ҅!|ɒD+·zH]c̸``4UmI>i>u(ʲѩ?Zzfn!`>3Z2y|}IFn~zn a+I``wg/74L;~<Νny|7zS~ &ey[ny[3M[wN%&6u8ZAw2[s3{{[*TEfn9PnYmrܖF!pK;7*ȍ0l q5F9PVpKV#ev-pkm}mZ{>%MlM\uʓ#L+ځ;Ձ\F(wDv$"žͱv*.J+[\Q.Krhhn5B#FJr~PN(H.m?YPqDվ[B[n76FYv}1ҁ;O[;s17Iwo}[R81`)F9־e5p-W" e\P|jZ o׸(eqdNV \petq5BD)6eήvhr2MʌR&kE(K5.>3m,w؃ƅQj.$]tXt1W;p_bɾξ]]v^icV#6kH6B9Q&Uط]6QfڷWuf3pWڃk!P^qOne|D(m]1V~E)K-#Vc{i9B۷(ek޼[F(K@\ۃ{2Jq7ľ;s F'Ӽ=kZjj|/ \Z:pW#q o DŽ}Kd\o|ƺ*erpݷe-!7py]DG\lbvd;d%Byޜy)UNX 3f3冁+6ʌx=,RHW ]tmW66?Oc{&ʣpwH<~$FN ܝ=g8'H;5r s5^@16jDKm^ڎ{+cpgu,֔|7~;7T'bV}+%Su.F`tAU<d,On;%Q]mk ۆ}zpݺ1>ny f'?I\~e<6|F.ׯ_C=Կl+Mn ꪝp\[@:5H?g`gs93Fg^>ꨣkt>#?8X'~NDnP.[iۃJnTUXejKEb=EEzDn#فVZ dQ믇y{W@1ӸAV 6N(;B}\=%i@xo]|jj5p#طOC#FM%uWn&B-}Bܠ3B oż%ĕe;KrɠF[ZO2OPc|D( 7BD([wY3} ?B4BY[ޣ=]AH n$pc dk3qك č$F&"`6v/~o p9omĞ#pcelо5nDkmٷbJ|%WDbW& U\B\W:nb&mP ҅]uub6q16E(' .ۅ;eOݷ:\Pf.5BC\#[p5By'}k{p+$>9!-{pվ%eo [[ߌA-jvp޶P3o]o].[P.ox\F(ߣf{_2B9Y pװuQqi[1p qtuJ' mʴp;( o=;\n3 "k \⃝w IDAT[F(kzqX'ZoɌRh;p}[־Q/eWm-pC˾\~&Ytut"B&/əklnGsaΜp[鉵]}/uwx?ѣֆ{Kwagn{>=tHW ]tt^xKi^[}: I#1.5pwhz'CK+Ban.;Wc/kX#}[Xfbɯz^۟@P+wj>^E4,lI1V9];Fp6|armI}n:7'C{|G[#4XC8V Ǽ;<񞄱N<' ֓uuK4[nIdgÛR`~@^VV.Qp[`}FQ}"ضEׅ[KR=TK(Эj)U*`Van`φ/ܯݷH変b[ٷ{0B(FӁ[ rGqi᪁(krml< F:pijnAd#C#%:Yୁ@)};5B@5lci=o\]twdF(K3pĭXWڷUۅ{p \ pmns@\56:Vzp]mЃҾ=:nЃvG7e#■E(AӖ)<3]0JyjT̫̓( 7!fe|2.(Knho5BB\ ^A@n\\{A}H5pDm܈RmLVLܳt6|0pV \(h%Mط76>1,1b~J#p?mb^\[pZw ;p %cطKp2`(J..[(~F'w ,67\1pCf~ߪ}=>O) ߎڷnbڷ8w8uF bqW+(_ԁkomrIWo}1, Q}m=U7U7QfطA. ĺiV୍Q\[p!-an2FY#\҃b6iNe[| 6/y6NNőp'I#w+ pC0ssU;u$&OĴ5r2 GW+-%Yh:U&x:LsSqHտqr+˓%b,.@ zhܲX6ap ZA_[w}3Yg͚594kݱ>B֭=fG\g~u=8nv91keFr?q?\p5gmf>'&)LKaZH?;30z^ oy] oeܽ\o⪁˿` 1(U詖[Eom2zʨ(U*`OXr 0IH=Uke뀯Z>jݺ}l!n# rܺ۷{FּMۤ[bDdnh [kߊK,a0.[1p:69[늆r5>d nmD(0FYo{,.u6m<0p B\vlc؁~7 pV## $:peڷLɼ ۠7"maqؑW,Z\^f`30X;_o\ڷqm|9Bـ נND(3>Yo}eLV;p׻[P&UxK 7PeP\]3c q]'e'ky1g[t*]%\ArwXי޾1q}U1[B\\ppogt2/7u6E(OV;p}0ߩ+hC:p5B9 weoVcV#;p ByՏcE'K2['ovmhJn ,moi>U1ʌP[, 5pgt=V୍Px+BqXA4ܰ6Ps-!F',=uQdk2>y0lAnhf( ga|r>|l<.-D#91{^';)!`qiSW[^yy;Yp +@]=a>C~]]cF=PYC^y\heIXevN4 'NĤ1eDtL=7w δ m.0rR+6;NA\DQ^{UK._쯟r)X=\U\fWVȓ_z<1} 7`>kaޞ|Ay>58cveܱœO>?~HWcKΌ#S?! ^Lx>WyK?d&zr:+UY'W[\[OV1&Fi+TJ4k--+TP02&.n R^TʽC#zX@ZZC[^Vra="1.BY(v\v lc;F([ ʄ 7҃'>vJ|o}2ہ5[ӌXa-ci\Z܈P[o pվe|F(Krp<3],5`$a|Zr o57B$aF-;p#Mt* ܁4p;9inf\?$$]=ɾY袔Rvߺq<p'DbvҾ{Z0B.eo:o qN&V;pLxpiwW[p?cAqύP^xA`J|쿍mP^!m qeŮWci.7v=j]|Q^BxK6{-ܤ75Xv] o[,&"}k$NYO& E.㓗[{[U-qط p]m1$>Yzpم,\o"]Ơx+ׁ܇cNVVֱb %Fzk{pކ'nhuUd7/p5BY[-ۉB6Ύnr`\m\G|f 38̝}\jމķƎH"فۆMgxkW` x:+@ +ۭ/\}F7A 3{sL nwף'm$eOnGGL" wN0=kc0L ;rۆQ!ˌWcx}1: k*9\"0c'.p|1:o?OK/;va<pCc?묳ZkncK.>cΦl so1 p [[V~>צ6X}9Z=7ီ -\G?rf2Sxg[Np۰nmm: \с+6n2:P7W!QNv\o }kPۛ#r6>(Arٷ9Qfo5F94pk"1҃ !.cF'&[\g4 }kAs8 :p75B- g"6=F L-;::9 p5JyI6JY{p1}+ɌP^܈P&m2p: woW0BYt=N^4pwA]-\F''!vߞf@1j }ψ1 ܡ >䢓@" l2c]ځۆk!Bl[B&׀=!]D Wo9,btgbe|rD(1J|1h:p\ڷ:k!F)_M6a# oPE( &ZQQv [˵Vg'\ \N:=Nv[o }[ׁ(evSX{pxk[P^M7,C1V' 퉮)BOC X8 W[7nAk>gc׳y;y1 Wo8ہeߪ:p{AFtD(ӾݤvߪY#y{_,=U_iЕ'ۨB;!femnl͞9sww<=GLl:Gj')-)ش@[v+@ ++/K7^ͧbS_gQF(2ZOoj?.A.\\+̝dLIU wαx*j;>[pGu*OG*SpWu>Zc.aw!ªOV!p}+{p6l.vZ(ax]&1ݴі ?>>|>xߪU}tAc._=y;^dIӾ_o[}[om!W\ៃ'}rI}]_v;N}87x#>K޾=3]y;Ғ!Hz @ٟ|^V~lpi U˹ j2BQ %и-zlt2nE^)Rbtr"*zKU"WlŢ/^ YmҶu Wc ]F1ʌOv%:F)y@nh2Jl\#mp;tN2edc \PVm`0Ѽ8e-X=.Bކnh\jZX_ \ng5:p$:όO>H㓍R#}m@OhAf<L6B4̳arWR~;ށ};ppF|r؃2Bڷb2JY lD)e5pX.B74py"BQj\ڷ eZan,tj.pi.b /4Pw'Bxk"o3pu1ʋ]n,IJc#m]z5-\ni~^܃f Jx:)B1+F Z+][776A\'eڷ}j2Bَ0ByukJ5pW.ւ:1V}[Ǫbo, B5j߮y$BǶ%}o}nr ALx ҼcXunSmwZ-#7ֱA-MuXv'}+ZJr`XGu3Wx-䑓9 g(`jCzq9>ne"jm@y[c&½Q`őx8 a{Sx௏?-/9]tHW ]n{앟W3b] G(LLwœ\U3W. 87+v-A-;1*Y;sQˌaf7Cn|:%VyV{Z=!JqR)po8: 9c'}=Xf.v>CG>&k+\sE]y]wN?tzI|W?ȶW]u~a!&Ohۿ{n1<^=g?uڶzsh3!;pu:>9s&vm`39眃G}qN>緿m| õ# M&ִ;k~ǝnXtk~g ^e-{Tۺ˜ug~g??E(3Wf4r"-"Ve+e葹~2[4<%u Wعj쀭\2o NYo]҇v(H#]Ix[kwn\c|| [ڄo'h[[vVn#Bڷ.BYc]m[׃dvGn1=lOokܰ5%[c;p[Zx;ea2Fف[4p}+7H(bI.o5BY {p pֈ}K6wmStr'wcD4 ĕ6>Yo}k;p5F)Bv pGqi*D7pFj*%ȕ[S g#e;pվuߞIx"Cp0FYoϵW[p/A+ A(Y}+pc,qnX"~Xx+AW"m%jeF){7p'F(`1wkC#=Kx [F(k \pou4qم:pij|2 \O1.>XbW~:p nUk \gߺ\܈Onڃ+&n'Ӿ]C7p}2-\]m\U$඄ 7h'[gxK[b=om:xKg5oeo= [=A4ٷڃ틃o%;s:tPљDq rtd(tt!cj:toNN;pw; ގ=LGHHl^u,sN_enw>=tHW ]tt^sxyx$l:`!,'7 R|? O r\sirb/4t LKm80u o3!{W,pHUzT~+ܭYf5A,¯ ֿH$UG0oW|Cs2hl}OY:XN:ɯkod|,}퓗>[܎6s?wuNΘ1z<i{f tޞcOM]H?;30Wm9 n9C-~gTK8dyr=]hVz*((V[?(j"=} hUHKVl[s uٸatrڷV-[1q92:YcijQ=Aq}[o nz ׸\ӈP\>uzٌ IDATK(dco+N@Bܒ\ՆKV:p nޚFnAbgF-\¥{to~Kۯ ݷ.FB\'7b218qe6n]t};/ks#tLɈI ~/LBڭ](bnmh`|B uYYoc#o]xed;p](amWozLxn]bpc }[ׁ h:D(knuઁ#1eہ"FY \kĥK6 ocPf\]r{i+b}WhQfn,cO^E#Kk.: W!.-!. _O( n-ܛb\\ׁXb9eξunkKl6B9XvNB\J|0mpQfxzpoi> ]]D kXp}nkPNڷk!.V,\ڷn0>Y[ oվetOF n,1=qʛZF(;7Qf>Cg--\vPѕ#B.B6BGVsS0ܹis(=v([ֆhL?gFO39-C>^/xf3?wY Ni5v3D󳴳[>Ͻ=Ǟn»3~vg 2vz+k.w02ZeRDB=-ONr$ߩq[Y  XZ/[۞wZnd1vjrhގ2ܺQk36Qf2o5>ڷPnm}bj|ASĥ}k{p%FyAV.[gߺ_Z`5arGE("Onfv(pgevΌ00 iMt"ڃ 5ʌOcjZۀPqf7 O7Rw{\ ҺUwivƴp(­zxkj&:pD( p}K X:pك;n %աW\,8'U .qF; \S \SߞQ6x',eNu^[(pk9ʗ~~'ܜiӾ9uRѹV֛=p[:jKu(Pn~z&>\M}CޘQ75@SM 45Oz/Tʋ ]R. pmx&yBb:ar rZGܮᝥSWm?ݵI,:mZx~ׇw?E;sd~>ug3SU2x:R?d#~^ߔO ?lKH%T}cT~s,o39{E5>?hi6dϟz9'jx˺Z}˲~/y[fe]PF^hiEáxiHz:/L#}^f 4miMh3 0`%/y(n-r{:j'}AVK=uwN{g{եӦ nSgoҟ7ŝwmS~7M]45@SM 45pC'_zJ|ܬoQ~!A>2scIersGg{^ں],z~rxFҟNHGjtݪ;KS?2{M06h,L}xS7V,uReQfNnv\z})}"˲n n9[>TWO5^~e]#y@̣` @A86;;Cf66׵iMh^ Z*[}]uujwZQVggj۽:s[y/bpo gnS,Mu+z73M'Idy6|Z$W6)5* M楲ytdtl,/2-K峅͋,lVi1/`ټ-#UŁPPruqޖoCU偶Veu^Pr*ΫZn,kbG{YiUi˶Z/Z[V^zڔGV./hU׶Ԫj~PUjoTTZVe~^U~eI:Ԫ*UZ+UjnXW*eW*[JVZn1Z,*UYY_'h0gIp{Ix{*:^$)O7nd8 ‘B૝ʎbjSGa 9FCEMԥM X b;4 w6Im]D4U2ĉxxjwwcǙ4t244N'3MҩVceBt)e2|idgsMB\tl2|M~QY;jъWZZ:*ו<_QA_+rB,+?z1~h_; \n]m^V\VW[ʍגkAy|uN]|m ]_Uprm*T~ X׮-Kn5[WZkm ZҀn5gB|ӖWZ,*mCbV؀qs'G=3xa(` 7Q³gi+#{fAD  =W7{#؛hjcm{[^+W'6I۟3N5ioQ>nyXw2E>:3tWf;3zwpJw[{»Vߞr/w;+mN|xۃ=r]g] ]_f޴grs|׾s>7e8дgr{jέi7bTg^OOpyw;9'"L(]Bw 8bZSӚ2XIr)uGXYQ:zEQk@tW>Va Ddҷk:(OPC`gg9|-jx^-?I^]u) ʚm:rc5=☩ PFOJ9ׁ-*)~(vM ;`p75obpJ(Bawl7e(Q!RQ NƉbIcñ4Q3MƉ8Rbj\DQo'bkM*7SoSqj 7O$s%2֧qi*&3ex+Q%3EeMs-&BBilxbgԸKe TZ7 e% 4]X4rS- Uԝe( r5r, vQUU7b XR[ԸMZ<&?rY7,je Z.8pwlMZ6sfl{lpԹ%j\`0By*eS-W]` hyԴ(~@Tl=w9fo+v]֮- _W9'hP(Qeyʖ邃K @\mq䔻V̭h m hCl(r7*ʍjqrzုSnwZ, [F[W-]T}JUlceVi1c@ۥULvͦӅ s_gs'(Sܞ1BrMөTdd49T-9s/=W?W_e_Tk?_Lu~}^w ~N _7'2>ߤ^y>Jo_d@SM 45ZG>G~w׬`z->zs4Om{} ;8OvXwj ܹsfgi mOB\>7:_ n՟~/:_ o59,hi`1癵2r m:ogV~.}oh34׳7Z]뉎;9ϰ'N5 Ыzp+ f; yىH#egbp*9rQ͒; ^;_Լ pEɷT>-L7l llYB[9- f\jp " cTrQΗ]n Z*PX+T ܪұ/@Qiց]S10@_eyS̮P.~b{-w +~XjUZ;)f_|,꼭=(@ʭcxDI>6>&`v-5]FaAuls>`*QWwjZW>vĨ|;jٕ)ZB{usX@S6U/ۣnz[dk-0!Z; pZ~Ǝ8m_6յ)uoeVkm `.i@;ɫbU1kf}oSnY>)қ, l!QB| kYJ&w)RM,1w0:.y<7tip_Oiƺ0d8U.Ϙ %?ϮhfNRlڣ$q(f WOSn{l= QcN}Q7t6_ 75@7h02݁sAuCu<}umjzvz{꠺R=Ⱦw6}ou}Zo.{/?Ux }:A٧r,5={iHYz5ʷzF}WcoA=ܨ}q75@SM 45O-zݿG?>==6pW7Tc(pDLP; N“u` q퟽Gów+>w^չU OBsQi|G[/^xFߥy~Ը/ f\C1tlM}Ymg`K_RMoq-`_ }foןKVoWs> =VƫNz`^ p/By 8%$֡Ey ~ɱź꓏ e [_,xhc`Hm8DŽt2JUW>6Ĭ 4|S%2rd>OWGʧ}S%s\ԭ82,Q]G@X%u,@:xiki ͖keISr }21ϒQF62(_q0V<4*9[TX+c:ƊQ؆ƀaT)˱UF(IQ 'zc%)2ccL.pqbpJ>gcԵRy4\fS㹲4lj ,QvPeq[ЛeZ;vP6f3-,_́%g R0e, B= @ .UƝ-( Q&t-m~\r"jT˗Z+j䐢EfjP|5a}Vw&GM ]lt kݵ\Sh+8R[]Sb!L-c8Ndϒj*Y,%|2-uW2Z&sy@_ ƺl[S@N+6·Z*_DZ@c򢕿rW>nW~-J`+.V[SEX^rUͮ ,+呭b|@[- e526r(^kvޢ^b|dڲ8PYa|;2krijX}+`ʩKYV.*\}NUUfkM^i;Y+/잛%#g ޼2u}>f+>tρ kc`O5f6X % %Pަ=b5<ϰ~O܎ cMF>1)wD)D1 BQy,-gTx©oQڀ%/Pd1gN@'u.'f`ӨW;RUq6]OP^[PnWv_^]nK]IٳϝNKVG=p[%wC}2;^[-֝~Νs/ݫFqT@tvEY]f>awz7M 45@SM ܰ5'~tE7ϹYwz˗= 񻧻NDu!t֐\`nޥgk[M3>(p/x/|eCr]5PU2*ܘ=bD_d aH(?5 rn_W9L:Á|lؔf-ݲ~#E@T%zX,,=w[dJxFNQlO-G5,Ե8Ro6b9vbs#9w{2l%oyNm"-򢱕e(Vo>F-jT@uXh8eنSx ơ(1m©Y+Z:^y0qTnPN, %ӱ&)6X+Og67[$E};5unMJgMU^wԵdb7w \͖*J,tڠQ`= ۥeb h:krR1RX-/*S.P% vVZK؁֋CZb2p͎6_VmrkX,:)Ŏx]U`ӻ8z;t˨OQ,2CMh~B;lUȲF"u|G{˚=10ج!-.:TXW[\2h\]FS׺ZS3ej Wu\S,w cj*XX4K[_^Ҧ8O6{|Q^οlS\@7dRWT[m+E.@KS2=voYf (sQT/K FZ 56ցϺ6c>\lB9/Jő*X[YykZ؆W Erݨ$z%'zAX**f"_f+esl̹2ym2j[ Ml2QۖfInJ`Y69X*ϒ&B=k⹢Ke~sX' bIMf0 ȩDJĬ8m(F(;}%7׋h)&w䇑#OQ![mCi;ugٸnSM;AG=SvdJno ~g>9펺ZtG.v`{}juMv\{mm߶vt xd~Iuwp)exӧtr??OM] ixSM 45@SkAWtSz{n]zBؿi7"=YZwaH'!92ܻ[wֳV`rQz߉c0<:Dg}_p~$|~,|&VVn:O3=99P x@~c?c_E-o,c۰meiόv\:>SWyU/;ϳzS oy qyW; oC\{|"'ewB-¾ N52rEkā~??^{3?xo(dԴ!vjV/Uɺ Q FLQrhj-'gS:_=OS>ePM-- l/SuvŻ]l E3Nų)v-706~ُ ch#P =@0 $R`s2,2Ud,00n7[kݦΆ%pkiWqpXA `KmƩD8U:F};V:FEh$؏&SE,L&srRL ,k*tl:xA} ę;3YhMwdL`ssĊyZ=rg25J, l\JV斨Q.Q3o+6dp6un|Zs.fl;ڵV3lPfd.PhQ–,ʠ 4Xb@wԖ2u%uVU@.VGڭCm$,y;0/PY*]`p,ebG\l>/2kW|mt_fj>QL`j}#`3ٻKwԶNw/;%vdZ([~&OlXry]X"D6Z;Զflڭ)rQbE -W睅2jbԸfq[Ժ=2+ʩɷ-W(uX>ĺE6?Զf2GM*kU~`e-.TFb^|\ -'ZTf7(KN^Ζʹofw+S{T1!7l~:瞝g4}j)9Pl@a;,b!ض'dlIjϪ!#r{kʱ=o8l-svg,{6E po(~ LCu; d?ꏆrS@']׷cN2yN=5 垺q[nwijRgcyg;{5n -=Էmuދ#^pv,ȿ)ফ9[׿f=W'F{u@SM 45p##M=m%r<Ѓ;,.F.ew߬zQ~(i_wB3u֝? .+ Un sϝUw^ܺCԾ]ݻUoN)'xZO{}[wgBxapVP*Vn2r?5k7Fk5A. 112ֱ Ϣܲmզ <{.\W>9罋'5=NV[\:fgf=p/_OY>u)YC; J0%G*QǺUalyAw33^J!4 5`V>[v;\;$ɽ|wLX? 'ȸ͒raSq;e/>-l970P%4 ] ep;8[hV?ّ7[ t܈ K=E\ 5/ biq֯q@BK&nSyXclYMXGlE(`.V;eۗ}O5 PT>9Uƻ|\/9ۉ@]r(4*o2M4Mcy dI3M `&3;y:w|̴H暤2ttN;Oۅeh.&ߖgʹ52yP]f;;d25;4kWgT1[2M7$KK$\.RFyv*bbe^"7ebjV22Kdg\cV[ jyk٤E.ZTUga&0U;rcSkrYQղ_pq)tNլۇ`;k@%j` )p씵ΒEH0 rȸ-%>pvKrlmJ2kwQRJ%@g fgMƵiESVZ4eMY{%TWZEeK79Z3|.T @NFnŬAofm^LKeu4WinІ˽90[j@0exu2ce S ,!;OOmII8Qȳq7M<6Hx{~@/QdP7vDC?1 'h-=4En okdhi4)FG :(k 5;rgA݁:}w;fޢmwkp;{{ j^6~[뫵}rK瀹:xI6 [75ݻ~,y:2tJ+zI|Bzl@SM 45Ӷ>>S?_CO₮TgMG%pΛu- } P{ܺsNĺ#ĺz{9{{ZܭWo׻m-ww~`x>=n_DB υwk.}Ǖ16gvGxs}ɞ1'(xF6m5Ϸ?g]=伆5=}"}=r#'p1bE e:b [g쁇X&#moR}ԇ/>e9 YpItXiH#+?0bnGore>^Pu .;0mL$D9e:8i,Ք@W*`P;+dQu~b`f'e_^D^1֜q\c(kQJLU*Y|FFRrq-;7VAu `"-1L$Qb+LbI$ZNnHm[k3P\ʁY96y5*yqh@@%a\-ΫZ`i D;4K[f[`6GU ={hISZ} jK+K̪ZrM݋ꓜ[l| 2bl(C=Ҫ8,؊rW;Q׋ZT6E[=`b-:쟝LXr_mk O}2Y[[\G;[?úZ Ѝʖc f&#s^QwQ>ǨvmA-oWצ5K&^/TV]lY$yb|bR@,Qnu:Yuv|T`-3-eɖsYyy,W6[hc9o'rQo=4]h.K/:]?b:ħcQ<9}Z߻,qp5vW^X# G%Y@SM 45R}!=롗_ЕzutJ `oTqn=/ȧ+~ObK~ugc=?Hgb݁Hg!s IDATrkE.ʣs腭gl&qxZ;ܦ8 n?ݩoӟD.vt4:ޡou5p)̛ <3@z}s׻u|UOvnOc9ϼzϿz ܞ2շM{} oF T['hխ`%jp)ݑy_]W_W.-ux76ypҕoλ,!86s XM15H``9y]va{`.ZQcB qɸٵ.,+J k1B;eaÖ@[R >QpwbemR%Z n \[]P9@{O6.jrevkw-Uhz6g::m,k]MFI>k *::נ`XcSlŀXT@` lY/$MY ,E dt@VgL- + eI=XhZe{(lX3Yo,-o#y `.GDfוosח("+j;Vm& rP {frlEr+rԼ1lʖmɮ]k@i<Ʈ}`>j Kn_. d캝E2@9`ӎ@jc.`Tn0˱U;l^my!ԶO*TF%o xe0X ,9ػs(n9(nG=$mdsc& Jd=+xb1Gqh;8[y8+Xr cVepmhmBy\lO5 4\:}Sڒ52wQ@gxoevzye6&wLk[M2,;jE}N}Jm]tQ~. 15=u:}~,}h}0]?6cT=a铏\|ijhjFtyTmz0>}5B/S{nݷn, e';"źĺðWF{Y7wn׻7[ΝsPm?u낻)X^{'Hf {m%=O_ү@ Kz^ŋZs`J{/G~XMh)3Eb[iv(|? ל?6/}%_ջs /y~O{/ZˋLvS(v˼3Y#X+ʊP3n9&-ǏDlh&YNRשfRqjQ95.׏ǡ8"6 c_i4V[~S&1ُ;emX.Pwf 6uP6DGqltlvQ&58l[J1\ wje2Y'Otj@&__eg]歩q -\֪X:rbTwVz/m2j -㚥lq"wVɹ ԇJJsSb)5;_+KgO;(z~PA:Xґ\k gαE>o0n-ٸ@Qr.rm`PEjY\ܐqҳΚp6A EZ-]XQVYW@O@1 0 : X]X;؋zy-.ZQmOn|,pbҕ|S>A)f?OSQr~SXSݺb+d˷]~AZ,JΖk c2^.ԉSf{T%m`K3 ˫ri ,Sb`?J[R N/@];l/rYFu;g ~*of0 ԝ,ϳ`|ԄrZha]h,42 L<;lJgJ&f2#d6A't0(5rĠrq qCA9 840Ekp,s0w @-`i0*x Gy;54tGP~_nO.۾ڽ,m d(t{jΠ=;oBq mi~[s=kwo:.]Wm,o *OuS7\o+xQG/'zo5/͗hjn~z[/ʶ3f&unmS}|mLU>Y(Vu" V U. xmw뫻w~ .gzUpVk`ʅcuYӁd׫Y޴ 4miMh Dװ'jI{R}[;z/˗/oc8TBkaާu:%1`؈Fo}7^-s;G1^k`ˏEQo~~&`w>WUNSPPk_w+˰SzO5zC;vu¸^G \&3L^| 4S {cCgImxKR}ewx)w(rRD~rEq+񁼣]&.ۓegd0_QoPb E M,7Q`y`jˬOq&9V:mbjݱ$4A*QMPΘ\g &ܙ2SpfoSLdT N-w4k<4`:d*Tr3u . [lQ -T*&BS/p7-r2VbF>n,lb2WrX%-2FlA{h@G.jݑ]Tv&ih?~gBm{_6?k@szk" .[T}^w ~:Un֫rۻY Oc^ =oc=XW5hjnxףؿ]84[_ߤwOpN.{} ;T 57 Z{'oS2f)yu'OUmvI>x x|{K 5O_Ƞ 'W<Զ:#Sr};{j,we`MSF:NRd߲/sEK)swp Jp7WHmo *g9d,NfQE3]n.J얁c cSNTIE}*;KjMf%r ,rvm:d@.@|: vLS2ocg::[&Y*J9jR@%2e l%խA@_rn(]g,+w jE͈}m5o-;+eԱX)Be% 7?45.l5SO7Z]J@y}XD͉HT@B8c|쀁 -uM^,Ɣ{w}Y =vf쾯W ;E!=$e$>fkжr{YFQ =fκfo>ה`[@~_^cR|..h"wc*U 0:X>10{rj֒ 7EZc\Pdb%.656VX#o š26|fF@\]-h\.!/ErV=VZTvaw)tQ_dʽ{}i,u,6$K R:9N&dqcY߉9 0y d <;]9zbb UDw8 X-(pl O Шik0Pv= PߚSZ_H^G]uu{-۬Zɻjcl=ZJS{v %nW:۞޾e_{/>߲uSuxuѩ-ryG?AO^V|kjhj_wO}}GuܬwksMP~)ܺ3ZB"1\o6Q}ҟ_E + wg-}k7w-zcx^t I}ͼMh@6д |1峜'3(kh{I*\2p_}z_a¾chA$a},f `* 4l$O e^[qXʣHH&Sߡ Z_ OK_2Y6jy?}|i*&^|5~_+"׬+ jXo_w.}|)k¯opY%F"č zg+ceХ2gىdF!y<t􇡒(ZJ6EmdbOZF˾Rk2rShFiEh0TbTcT(peN`Lm`FNd*I]dߪܲQrp/vkS=-T2X?pZ/4>[RٸBt?k/l=''%kvT)RPƩ8$& YX uV&gnݣk*ygZq .7iց}U҃z'_>@k^7/M 45@S7Z <:/Е;M&vLd~2pOv:>l<Us=u]w9{iN}{}BiVt[x~/:wGgsVAtF?>GzzyV@bb-m7miMh ԀuT rr5{/IλNG#f[RWUKVV&YE6c`_v|u[/ 0306̀1/,cj-^d}yoFuuj>NdeFfdVv<|> V%߯/с;@R~8XLģ7:ĢumXJuٽ<ltx^_/|xzї@JX}5ox"Գ1FW+ēb}]ޣo>׿?st~sL7o׼={ttG>1~j?#G[~О\<#^_ezp1tXWK(ׁ^LYE< iHofD*cK `N15}>]TyLݷ-M܈HHa)бe:q b7.FZc뎔itƊ-h}Kd8Hiv]30BQ(I2%T汲i)c.>Wn/B4S*F|D'Ooam;iy;$jb-5ED1/5<7Kp6^q;3+ 4Ҍ\ⓉWHldi@`U,_ie`.QlFbjz C% w_Pe`AZnbbKf}-1h TpF_38KbL_.Ƭ롥AS' D\cZ| 5p=t2ށu^08h\l3,=w6&"/z{g-vxmܶz5{l-:⩱np@K <1ΆzJq IDATL sځy ŸǸcmng]E>c'XGnqr1I`ܵV!Q 3ƗąAr3-&ԜqNNW:#>}{a"&O֚W{mWPOtiŘ(ug'Kέ?3?nˮs:o uA0DGc)S%$pbLI/ԏz#;-q>CKeIN"29$6kUHA_v(eu3wZtr=PWaUS:p[;V[VϺqmoGFGFGF`mQcVznطͶ-wjmFS]Nݱ p?ok9a6+9:G"FO~ U}zgm=}J|}|S[ǿd:0y|y`du[E+ӓ@wzq??O诂W_ɣr?~w`7zXݕ\wsԗ9zzz/\{SܪJ>6F{uҗ H8Ca<۾B &{0ϏB[\0_.[KáxzG`;s;~uU̳g{z _pOďkþuz:Z'2OgGH +knwf+?Rh>聣o7@k&)21e1\|2a Q rȠmbn@ע3#F95y,,]_D">QH~ \|2f Ȳ#,[h#{Lqȱ$e}(#I{Ie cX'.66 4јdoġbY)q%N $d*Ŷ#3jMN2׃;L4 \㬰(e┋q8ddgel&Bs[N(b;7㰘.gٙA0۲Dδ Ĩ]jA- zDŊn\"jXJN^}9/Ye;hFDn6HbzpzfZ뽵Twt8he65X;sEl+g]|0)V.&nX6|N b鞵YbȀPƱhb6xq9vJ1ꁁZ(@xeX7F2>buNW9X mͫmYD/LϮA3Z,-J٢1)uĒw_3^ooטy%j軲ב[Ɲ/ ;%?NָӖ}4ۚBK*yiR)^\9!K9=@]|zS_D@'qD+k{rW?ۮ]"Vv@Vӷvwk۶6{j 6VK-mmuM50ntM{ml4}Z{ npn<#?[vB?պAл|?~cG_ 3P@= \o3G^q^{8>eV'1~5o>Y2p=P]dȭG+cvOs)ypL܏'J oG\'ع߬[MnNw5[{s@@@|1ߋX^W Vm}Z Zx[.]/ޯSR:8 8hL+1XC,bL!`'Gz_!op`}䩏˽`xGw0P,G+ \Xnz{ߣ!=GW~qjw<`h`7 <.8y_f,buض^(Ģ  /e}C8><_nR`} 冁/q1e}@ml.pwQ,/vwƠGv=. #ncţXILXa鮍"%֕ ks]jI2QmOf֋'f7(чiL˒.\ h ędJ'0pǹzi"qPHwJ~aҳ -:n11}K.@  5S> eV8ZX'ݶ\431`́f+پbrD1qk͉-%2wiPw>זn3lX*7 zRJzaݝhAtc`vM|mYZ~X-reV,\~K:qtϚ .سӷX] 9OPZ-I켬ȉE)Kjceam^7Yl˱鱽j|Pval.t<[~kgǷߙžViǼlim}ka^:мn.Bz_s[?'[m^w^gzy8`/lTbegص۾ۂ]GožIBN@MZ3 [Inf:]o%]ԼR" ׃)O-xb+'-M8#Wabk:s6WI'ql$SpOfJT(:3zowQFt(HzNܡ7Bjɱ"IA> }RBЧנ3P^3ۧ hi'.y^SSUӵ>.ݸD$w8~^k1="[]]GGnnۮtܶjv[ 5q{tҁUpwvXև{=< bߞ:uJ:Yzƫ]^#[~-J|B= 3P@= <#/]Gz77c }<8oٹA3VA"kiwojݢ׷o/ N  wR'?֙{m_']D6^ߵx3bY/빨zzzBЖ1~ߓ*h{|\}._^u \ǭOstpS֚kfn(77[ } tu l#b`&t}O~O3 a,"$F ȏD؋Iš-,&ˡ 40Tj1i&qDZjWin1D#l2xLl2cgXptPbՎψ˩E#'#,:.]l4.Ɠ̖fzt rmiX[Z\t\ȉV)\ *yfB4k/LU؝ti 7%fZom-kWKt-p d[Yl2Kglpwi{MFZv-Byc],FL3ֹ9}0dLY`YB.]JaAFkحtuWz⑗< ܎o2?r f|9 lZ&vmZm̜3YL5e;4H{P1cҵ /ym.Pw1sOMftˋJ3Hfzr^}ɀֺ,/ZOV\ 3ħr\n_X4'BҜI>iNGȱlScN }1}֩&|*㩝q )tbb#!&yajd9f)X0V >_Gl#C"IG 1E(@b'؉QC70AX<C %Jyei 44 it5r3#NZݞڬeꚍjmvmth5NNͶ{]q}Ps=gwv[nZNcWw?_G(?"R;o:mݠx7Z|с&={_}?>}/3P@= 3p^G^P}׹1Y^ p?:p>_D(_x5(XD9v@/'܆knrXC}\߶_kE2 C?~|r±,Rp(spG ԍ;J?RD2Al'+ O!CysN??5v`I} r{}->9Pz]_@^Gvzv%>A ۖx$7ZM3oOjm6[괁=5ͦZڍm|2=qƎZ pwnSΝK/]O8}Q:67čN^}ѓOzgzv=]^ pk{kb?JHqUG.=nOozw.c:CE,>!^zzs?n;֕[TmsP>P>P>ڧ\A ;iq8[Oe^zx~ þAR[HX }_ b_K !;<_^oA}7Ah`_ŕP0Zdd y-n؍OoV/zl=!Gp砧9ڳ117 o{qz;,y8m~Ƽe7>>?@q] [[Zo"\5(boݷ~84DAp msK7nl1H,(a4\k7VbRD a:"GkdlE'ImO1D-aюX(Sjˑŵ,`L?]ҸT6*aUNyKmF7h&8+OKԺ2 S{lR*7S%QɥŴsl%}\)&\"`Zz:- kvaκkjKͳ.򅙷3ZKbak^s39v-.Q.NyUp 3غ}]<î\]ζ\qѝb] s-܌O:Sk]MKt3׌Qeq^S'M$إmLlQ&-)Ь_lT@xi}3GGW%&& b2>c7m%c M21=37f]1ED`6pw6hu=6c˵W[/s4hk _`LuDev.">[^Eg/Kfme'pdw=ЌeVZDUfZpP5^rJ|2')'*`;}5 8˥|iPaV{ di23#w2:So>-T$sǓ\ q6^}IgݷQnhhe۱}} 'IL ' 3EtZ@i=Ɗm<V%#;A9h9iK&W@}u`r;}O@^k߻m_~NnN^nkmiF.n][5[ض\&:hUvD$wmY^ގAFݝ;m5vK?nv:y]pt< 8qBnл7\ pSzmo|쑣/SzgzxSГNětH'.gsoܧ{3ƙ3ghO僃eYv]hXV%9IwFT? 3n=%Jxi-{sHf◭ǖa*Fn8MӥKre= cy3"uĚ>b+@:o ],csGFH!@6YD hR tܦ1]D-rS81E܉PNYt'I8͕]dlj&5- IDATlBthsM&S%ub&Q yF&TeBfl4Pktln;ot藍sO \YXs3  ׁ)`X)PbN*nEYXj-֚v+.wZbbAZ*鈵[,Q\oaq[[]f}źhC/s63k=Vvh,x ,F^A]2`|~=oP+KW{VY|) : h&Fyiֳ s.[3{{ln-;ou1ۿ8c0kKAA%0<6^ٜyemF:_Bf\?2۶cMtޮ g*a.*cyyX㜌@7gRe)v-`wfQ>| Ŭ]Yr ȥen̕NXrDل之G_?N ƩuNF":&Xi*S[RBzb\8\>W!'1v.. (6c>$$N]SuK/Ҁ װ?Ԡ;v(UװVUiO^ݶڭZNjm-FMTr.\n uIإˍZN7[j7v=mV^[=5vmZ]s0:@ܛO+Ag﵎Ƿ\~, 6pk{@gu@:hy-? v{s)}4<0%nKh o;6;fqyȾ9^>P>t|v;Nu}ese\A`S/>K.JG@pk`vtZ0ˑ|Zo Wszkk_ީyɖ-߶5mg?saZ$1s@Т$]?{c~Fo铏=~tۻ=f4<]υ|}zwߢyEPf7}K^$Y>^G}C-l1C 42mo֓q=EC.ź%.ٳ+鿵׎42K|I_n~[?n[((̪eʢ7P|֭ @O-ص(eFGEq$[-κ%X(s#ńHTi9VNDy:-SٺII-gJ1p1Mr96S:vi:3T$ @`*yr.:Pu:K<[*6[̖wVQU`f+Y)#|R69#iLyc?b\%F}6.)3ױG3cb1ŝXm,s&WDzX(g}h$D#?t8ϸHG"Ajɤq,)( '"3otG(/R߹~>z@`C}%6ߓw^ON_uආjwjwXN~Nf^n^_cTݮV.]wZkmZD'cq}[zΝ?{2SYrew{Il;vܪ|OG㕺|D-ܣzgu|a}EΝCS7.\|bh^{J; t t[]-w P~~p q#ݏ'}.Mf=kj,^y?Z\yz.}}}>>PYr?;W}XVZVC<q9KKtKK( $6ف6zP=|֑[/@5uг^[4;0ү[0b}՝?.@p?tQ{߽\sd4=/vw .·G/Z} ]V+2$6S@0Coh׶blοEWc GtG!pdn ]^$?[3u#_<Eb^kD}L䲋Q&.9GJ56RdPdnK̮57(Lb%5T Ow)b};R4tƭzqQxYLr!'Tzgk|RO|؛Q;p,n?鼽_جfN8Pi>֗sꝾC=[?;eݸP>~B ܤ7;;Ploi ҕxC3s9WsP>P>P>ǿTZx TTA V%'_K/i^_D\# H1B{ٯ~\׷0o]oo<.?5_zZ=Uy{w \'з^Q߿mz>Y_S^ZLeկz~=WG8~q}k_kFJ@`;[[?Q@l̎nm0f&%2pa0u:m}g?+!1؁k=: #82t &9n#1sC3j(GFˑ<먍noG#8T#eزpb#b#b# 7$vd $JQQ κH(6hd6H#5X$(-\eR*oJfNdSBSu];UJR#/#Y0fl80-&muKodJ dyVZTrN_턈YLwۋreriu fXk 0+ݲ\j 3Krٴĭ%:Y֚ETx2 qX5gѽsVf g50c7D/.x؈ED$Ū} kQD;խj0nhEW-u,'w_<񗘸Wݘ) de5 TFz X+o-yK\<ވDo Den1|-~E_ϱvqk o6vnsln ʖ zXؕdә5.EKl>]bg˹ve-ɳY|L%\0|JwZL|l#}2KėOƦ}X'@_rNHVƬ)O8cdv<ֈ>0ruf|&G?B;6xؖ}D H9H<$ Ĭd>S} N̉ |K,77PbmvӰ v-^&j{wtV{tjj{ݶݮzzz: mWvKٷV.ɭ=l7wۤwW{j5Rsvtwj4t:{W|݀/S׃{R?ظAܠn.r\=c?oO{uP@= 3p]gЧO~K\G ǚϒ:uꔬb焬/gՁLbrD*;;}}yUk!/I]=ܦ nۃg~gG$Vf縞zzg>P}g9ܸ߫ێ/B ಬkOp+x[K߯K.Y,5x1#ط|X+p7?Ef S(fʗ}_|u_Z={bWwvlKznf|3Xت!^iq(yVib)=g._w.=, h|>Ǡ_m|"0m}yv>l|3 ,ٻt-dYn矎[h x@B]),kbFPA <Fކµlu䆡E/a+,'؍wzrXdD)HI0QX7(Ć ގ±lIHR:s"ҙkvlsi T)̤-ceqiqIjffFii-;L:rsVd9.U$Ya=b2"]j- )͹tP981o*TYrBҌ)Lsbg1o@0ݕ3Q 0{`0 K߱khA-sYu. Lbtcqۺ8"xt3&^XK,- , gQ{F?bϺ߭E.;s.xL-)[3Rd=*ω~mŔ(8:C.^]_ٿe'y|kg nk vp] ZLZk >gǬcm+{=DO/HrwkJz0Z^kZ -f7'`\Ol633@/H0׌[:n˙0)O8N虜}:$ 皦_L~~ى6˞۔h\D>F@]b;YodA4&B;w?h8s.Ve8P>|Fݑ'ɉ;C[_o֭azo} U {qt<{oۡz-޶fv'wzfbv5+o6jK-rͮZhtԤ۝j6vRcݹ w¹kv|*{7ꪃmƧty~C}}p]t= 3P@= <yRlG^}./Nx7yϹQT/k@>~NbV6q{wΝkÓzK&j')&exRԇÓvݷuWMyCSG,?}z}}@݅X]v?ՉjǗ.{8Zp\hOtEtfFU?VfT. -Yg};( p(1|Wb}/$+@úu(^ %=f`'ιn\u4>;6~_Coc]q߯'8vlkgo\Vl,=<6m:l=4kp37eznO&4ŬҎ}DN,>΢cq6߮Grf1ʥP:ptdf]#.@Np0+p6j:q 0*v~OWrݸ4Kt2!liY9)KO&&yRAm C\$vŝE|2pHyԢnWZkN6Fsҹx_3g`l\ ft%ymVٹ؋C\ݚf~.$p5Stkbd^1F11ؼ8caryN^j^K|T6u d∉&Fy;>@w߼^2WW'1׋}g26Vz5ko^@vk@w1D;c .1e]T4ϏHi,vM 13f4cQl6t2/DeW]99d:]|rr0׮;bžQ-ƛ\ [4s|>[[E~< f* Cd\]8$d kL,(&vKs3N!ut! G9aN }pQ(o;h0t5 A_n KT`nhХw^v.tm 6=q[Ym5Z=5ޮvC0垚{ 5$7hⶵhyRqږ{{ u_8_?-''&y%=3p\zY@= 3p]c}ޭ ٭zx"_9O;n7=tr-?ƮiݡoުvЃ[/Wi6;ⷃ{&@~ ]ܮ{|ՁzYGN@@}T IDATs|aYjY(W?ISՁ?zNyZ6m$4SY5s_}A_!<6P>s ,f)aze<4K,_+s(L]@{l{.c{AUƺj|gہǶ D[ŔeLn~{0j1mvy#׍kq5K7dYmFC$҆hdq nc"cE7 Ie*F)EZnbPi4vZ(LbŘtLЋ( ǚĩFvho-Qn&J"PΤb&&㱲Q$UirӥOLͬRH26Bet\s2S7)E7nȥ7gbCnTMٵf9fRJ˜eZD&iKlrLZ,bcǜ%^)^@n9[qvь]K-:K.Řfmb#qs 䱈Zߪd]$xmznTl[C-F71u\4&k֢!&nX`bv1uf.\,4s3?}{~g\= uX5>FW0ێxX4[rڶleD'w[lJUcX}L ~ϗf. D&/Ȉ>ćJPȀ-TTU1ŧOT; AǵSM 0E'[<{Dn45-I43;dL,|p&.DtaKYxb|.On Nt @^E'[.oi'a( $UQݷvE'7tvE\rsT-u]hh\M:qNK;f6v .|"S}y-ϔOpɧԹ~{>ߨF(W1w[HO~I3P@= 3P'#}7oKn=Ksn3RO@Y=(Z|bTF8r+;wws~npJ8a߅'G)ͻEŻދI=ߪz oz/m`Wm3? 's_3j]ps|~r8{N]y;q{uKfFu-lS[bb yk}~Y`E0cz- 9 IZ/u%>،ݡ͍},^Tg5%D-x 3[ާ ޯszn&^ʓuN+?%v=&SNƸn",ˬ6G9&D#'vb ig*'#":9A:1qk9!(yϋ&]~~z4腢h}3r{v<]8Ww>cX> 8coz>_ozgຝ'? }ݿOGun*߽ԽA{Cm>k8 [ ?A*b ӧ+?}^׺Yԟ|X{gy?S&bp~'I?ܪowJ5}f#zY>P>PO>:={K@2Xo7 5(\}o0"{-^E-8` R3|/"#b B|Q=wVPzxy| 0ulvcRFfz-hfƷ(K_}֎퇌YT? yoq.ںi%jߎTkk^(Gncv?qF6pzj1q\7Rba0/ 1b3s㡻``aqC#mĥ &n+53w-RŀLaVJHrid%D# Č  lv<4M5N"F9Oʁxd2$͔%]%:34Jgՙ&Yi}"3'qZ/xn.%3́(Wjr|"4|,H<XZZ3,}3WzcZk:ڥf@[bls9nR|v3KB- l9 % ltɅEzNKH_Cy-C3OLŠ/W ы ]|=t ?v [ e X/ foپqʥul xFl31͌A kw%/Km1Ξ=n湻cNYc v5L.`\^g5_u[֗f pxm.]pK,]gᲟ-KX@@eUԔ&3rKu?dBܖMN}hSzf5w;qwWMyΕ1fgL|Fk}(S<g .me}6Y77S]ܮh"K-Հ:׋KHtH>T^ȉ; M!OޒVa'<h8 i" OZU*1Ԁ^\,P=/?hu1ʘ#kyθt4!]5 u5:mu"NIrF.ܦZln[-LfS5UkgO;Nw{BtgY :UG(?SwQV0K2T*;TzQ6w_­opxB N^uӓK_/_{w-^]s8ϼ~Mפ}merre~. "%] 1T bT%qbbgm=?p€GUYҵD3['׮coDp9-_;ws6.-i-}뵭3|{Y |%y"Wӡظ,Cm[ 2>گl~3&(8jcOllZLa1K2m$Ϻyt!_Bzm뛡 5^DE%Cp2FEmC0(J8L  v.MR%tэ !>X4+kb'pQ&<6!^L0q2v.m1gҍ wSBӄ(֙ArB4+SMIdqG؂ضs|KMR8eqL}Jbe1D.2ؙfZllɅ9V%ĠvNõ6aߦ!o bhέ+ՙضt!Zh%[1H πCͶqU,F)cq Ƃ5@y= >le=q<':ay q+.,-d3k'2 ,ݟ%x1ׁj ZAY<_9;l}l@/f%ț)KllApZz+֯b{+u

]I+3qb^ăbnj/ />暏*3NkmcɳRe)ε-'Kdf%uk?'>_@= 3Pu;Oş鑯=GP7 =_E|?{ggGUo}}t$!g>CUy>}zUgHTqpVDTEEY@PDATpD@eY0KzLz۵ϩn⻈V>3ԩ]kWueZ_+}{<倨 ׫eF.ոD- ❑ 0U^׏X}X3GLc-.5,sl2eNvϏ~>} d?#Ks>hUKO$Eʝڭ(li|@V\1+s[ef2MdDCM*Vj#>X u6a/UJdC qUR 0%VK%*R s~ԕ9Dq~fOXH1~iL`bN!ᩢRd:~K,7Dh*ٿT-{?,2ۂ&iEL8bEfv0)V:*\KY%Sy@/E-)dҦR2J!m%C׌l9RyvKɦa}r^o"gY[9ɽfT-Ns< X,SiKn- %P1RЖ&3KxEyˌ\ٺpwKd$fo2B(ʨ.IgUr<+E*a@Y%*e<\CH PzQaˌP%P .yT㎉bwA庍RGRI{V.fyʄ(se;Vވz0sTY.23 +TunDɒ=KQԻb\UPQR*JSݍ50A푩Ci+`#$$&d%e>,iԹb;<<&b]δdV^O'-hH̉\K0U7U?땼:1*lWe l 'Лk}uOuF8&w$0ʼZZa˱RyͶ*b 8*Pg&1m t k;mvU!ٸk0 zK}~L2#(. FQ.RP j(ꨔ8jauS+DBrJ y[bP_F>SFٹٲK<]A&]F.E*SERy՝#{Sj 2TJw)30;<<\RXZVV2+z:Cp2L#u%VR4}gXCTR'S=PqKh304GrD [JBTcTF**6<`L2o\7C82? D ED>9D(E(DHE8 "A{;R 10Џ}QغŷP>`,_ }}}xCpk|!jk1ͳo퀽~ -ව~ >wg1wYܪEjˣq2^+p_Sp]` ^[e*r׭[':p0'p~&.O-3r!Oqcg̵pN1ׇ~N>>zZ?襆\jp|~1jd/ĥlݲEH%ApLZqTi2@P!3ńIh@RjS RYB!)6DŽ1G3o׊!AH,-'W+ֿ*;GJIkRrh fT6~*fN.ɢ {edϚoH<~>Y 趿Kr Q:ֲ3JKխRE@V9G̸߳],lL'a7+3tD \DŽ9WKQ)Z%gj3Hgn-msr}fȧHg  %ME[H4|*'K*n\qL60ha@)$(?V _TDеX~\. Zfi2'>aOXq'$p7ؘıFd d98Վ6_~>"dV\ o5%eY pKv$ *dSJKkW BwqԐ(92ZF{*t Wj5a ФX$;ƗjX ZƥȲ@evT's*XѸnHKPDE ~Erl~wní?PnTE=^]?!Gie,WcU{@'˜lYUmH0:f  53k:YJkHU2;sq ~SHZ 2-f&i~NPEen9Y3 =܌ ШRe&.KjնMn#eC*1{2/7*#CK,meI"Vgv˴Nn) [J&n._@*\7붘+*\*m |\<yB,jV kE!X,܊X'ҕJ2h [.V**E lՇ 4 (U}KaTP%nv!KrN HQkfR]I]7Y W[EAKa`ǘJRLU g+*X h4F~*h6Y+ҘY/QV7x ~*]T?-&{g>Kfچ:~̮-e-SALfZVzybM4¹B5TaQnrc"A&~Qb.ԥ2 UQV][pN>^ouP.1be%nL -pDwD1_C1WE1h}Lk)eyyi\UV)o]A6%ded2E͕$F2VTIM4k!|nzAV^icG6s$'F?NL s~hƩf?6b|_g?ϛ>8}޶{ﳇ~ r oW3p[&G--J[b&:D T+B^WBY)BR-uemZ $SJEKj0G7XSA]KAj~ vbl1WLavj(Kud'4R8-CřqˬY֯ +'TuUЕM U?Y{DU6.A*[;CMR SL +di`T pYTÄ Xn.y%'mU6n0et`9̫~zil\խa K5n: ò$9i6i$-4?' ͈J ٸVNi4*:!I[QZfDKɸ[[$+;eZ,gQ17I#˂YfWl ZfNRrL|"*\fsE2Z&)PKn5< yfh2j]ZV/Q.Y!Qڏj!ٜB u%樲%xJm˥&WImFQA/]fJQAâ{Y+i<`@G1V 8yQK,UuzG1N5n]2QHESkiILPZiKdR-uiKqrh=\ *W3Xy7Zvܦ++|%d3i~ _4&&ke%vjC~/^ g?NF9Q6zj\:j<,e(Su^up!TWy %ږQ-=˫`XA1_F\N2 2rHOQQi_@*\}g- 62'䘡M?/9yH&$;mhAo He{Z*yRm>mӴlvD2n 2BB&ѵj[N^21I<' cdnH-նH}rlٸ ~0d$' Rf ׉ " #B;Ed(H8xhAM Gam(,9pHP`PDrn! Pql\5="D?_+`; `MؼշP>`,_ U_oG]exʣtμ`vo[os_01vT!c ;~2t(_{(-!8A5Q9XUp`9#_lx[0Yルquzyj5ɕ4yLĸZ}s5kssoV.k2![+/ϵzϡ>hHWRD/֫ \ q*p[&VGY覒b%LK;^&,XBIK/ilR=Km ^fv, TI6+sr U^8*yF̵U@C^Ը.9̌R1HNV TA[ Q(Pavf6UPWWE<3q r̺evn BCoXAسKfg5@`ErG%Van]@.AV8 ᘨrG%VM*QШ%+*Zcmy@_s%dJmiuק"u_f݄֨:m{p*j*Q*v H;uBVGQr[k:!*"a|%`2XfE [$JUMM=kY5VU- LY(z[?sx*2U\2 W씩 ocQ֔UnBA( 㧲veB\zlW$ vT%c&d O2e? OT*&je 6>Q{J[eN`"HQT&84ȎZWvTr@eT?.k^3W+$a!#(b\*r"CMTB bM&=JP6xuQEIT2] . 3m%an^C%"g jr*0ۖ,m9q 71 \0{KztȊ3'𞜦}"# Y~kH>{*NܦO&`$Cn&n7 nh8,1ĨL`pnr8B8"qD#\FE-r9T1Jm4JhfÈP" !2PKm 0z~[Qe=Xxtz`Z]هKb_ }yw[o1sIj0~^ \o8C` V3~NK=KNLLX,Ke@*^^y&UboN) rU86 hPH&P0(T|P!\z_m}~>;m~}Я3ҥzZ}p vNs;L&M>H3U>/ɜմT qJ+!hڵ_ړ@ _*:iG*.ONYtfS A`*Yi=LU-m)e3I寂Ⱥ9X.YJ꧅3թTSEZT?-Y?y KUn\iEW\)U; ڟldJ9Ot9T++[fmyҮxTU SyKK+.8[& LW-Ubm0Gkn X*K~RL\QQR9J,YֿTV0햩 S9WYRɻbL*zU7T *bU*y6TҖ8xՒe+{0܅TK1AA*ϋ{΄TRKJU(jbEMju*pVFЎi[ln%זڴ>H9T[4s3qخP]U0q92 '(k4.IrJ}KUTk(ĉjF+WZU *ݩRE_B!W:W*{*i\T%;;NL [k )Ϛt¼C,ږmS[+69E9YtBMrp7,ȪL'e,c)1]#H %K$AKԶ1-%9Dl8XrٷC#6Ex !`(2X8(U069UPh(¡(BnmTrp};@H2qytf`}0G[6@SCaáC%wl> ®~wC~ -ව~ -g7-QL <2Ac>غ[+|+pYXr@)b[{YÉ59هGLهGgC]Z+Sy;(יly$FdW{p`sOoW}RPt= kz=1ڻk mk>wwvB9PjZTBCh,x1$s["u„ L$Hp?WvT2X i"M꣤\8IC'|2bl~Ɛ lSKSyi,L`O<*n2sg Z9[1$i3y\T. bPYJTYRRϙOdRLhͺSi9~i fR038e^K1JYBBsf-3#<$EAMmF: "CeXY̻50҆(˘IbL`I%EAKkef1,2 SQ36Co0#<ʦQ0 d vHIm\FlMS< RQȦQ`F.mQ%MnP5jElQXE\B"!o Ln y/((晇[AVT Ε@d*hYU5Rr_eZ(WȏJzEBTueLFE(Fd&*\Z#ԨZVpd#)m@<UYeLY"HHy#j5e&*`y#eju#Fk#Y B(Jf7`bu>y`DlJRK*- ?k1Q&\Xe0%|܄JS`쨲:&eVֳQO`Ⱦn0-i/L,]Z)n(׶2JԍwuvG[?'-:SK2rlު~ia< r12<*:۪JaY9ۃ0QflS*j7 d 5ۋH.]jzC('ܥW* v&>՚@^*tE]2IcSE[D:i ^bnỉTQS^btrqE^KŒ\sR,믨dQVQ& fTSmK;LI&rȽ׿搥2K,2tH#q\rӒ3sHKm|Qwn>}>7{~]!^jDCܗ%nv$Õ**PBЌX%SɁiLQ <4 4~YYRL[CrkG ~iGE l c 7UJQJe0hl$i8)/S6_K;f7V@UQN8) \Z,$L Ō[OUsLTTݦaH.Uj{ 01=~WQ"w۟;)o%d(i EpF9Alyu2l Ig򳬲Qu{Sf90X0R&Um$XHYYd *x+j]B4)6Ɉ*7-YPFhK G&cI.Zj3需ۼ(orZ&SfVnRVOΫ\osG͖@dZ&*֩BlBLEOUsTΖEW1 wRIY懑2 r#-b[*Q,\~_G\%F\bi |aW&QN;*3q1Rʕ1Q@֊ĎRs-kkȴC땕vQ(.Vy'umui09 IDATxGnujb ǒ-AosgHSqOmq3Q'ST徔MO`s0N#m7-RΊ)j[:L ȉuɉE4F&3i7]gf\Y*[C $c̘xq1AK m41`\"whqDcF%w0mb&0(*EE(`xa"1 !! !0wCAG p !Sv@Tn–~3`b@^ p/_u=TB}[oDO=ʳ.xyuzp;R2y/T^9~6^DWHűxn$>f-o\~2! Z9P&z_E~L?Kx?k>[~K oR?{z-EBP(fFh,-F55-,lڸ }i8spo}~_I8pP E D0"`nC:4F0 "!8֣Q[0w<y@_zb9m0w'}悔~ -ව-G[0}(vÜ8eXr%7oz,9/,[(xW=AU=R ruV.n~`\ۍĥҖj܇xZ.07?6ϾkƉ >fc[Adpf䊕*|]~[m-><{ӯK/|~^.̽Eo$m[h0$J,\82dž.ɯ<w?PW2Px>{8##$6p%(6 B, CG >9~Z(ؼe+e1Ъnyr\=TZ;+1a ?' ව~ -p5}Ø>q;ˇcgO2M.ãrn^jpeZs;UrДʄ JGH<?+Keܻ l1 |7W *t{o7RZmD1`$9J2&`7O%m}~ gX ljK@T}!ߣiu`ZhV&-0{֠1m{dI+कĆ͛ޞ{Wwe7l?_{.3lTxm#eöa,6Þ?ji_s˿öUqC`ۇ.\^^[Jl{mc{QY {r5l{ pRض.GY±Iu#=e=v n ¶YBp0; ["m(gl%8l;Iŀmp c`wK͒dvmK)Ypl8v *ŶPfqa۪8N="qFa,cpq)=Ǟ-eg#l[f "K 9  >} X)qRl{3 ۶8, VqZ Hm.yv88/B8'qN8r2Uj8kzZ887qXވfMpX7{)h6ay+848*㰼{84qޫJ48ipCy9RNh6? 34?$0l~G8͏qcp8OHqdI4,g[>f3h6UqdyYh6?fsh6u9&9h6?+/"M]fhf-dsl+VQRwQ\;TV O|.ՠTWT.UpBp Nq5:އKc+XZ<g ;EJ\$>}яK5b|@шY>@ }=K jwaw {/zwUjD(pM p 槺d^*IFZ^'hb0_5)YViOmܾąޢ \B\{aۄ.%ĕ҃φv .vמ W[$%탳*KkOB\VWq.%UWuMp;V/{ W\ǎp o: :* :6q'Mq2p q o98N^8NQ\ ǩ{ qn P qX6qn7 B\ B\U[=Kp{U׶⪢RmomkxK2ض ⅸr-ɰ.]x:4K⪢my -h6*I끸;Ji*plܾ[|={hl+Nh G\n@!)!(8͏q4p<W\3EC\ihlVC9hk qfq[_Bet!n5py,j}h6/Xq p6 r qA\V\jjj]ZEShP=۾ M.m]V4 oۄ.mk1Z-o p49_HQ zۿDK;7x hwnB !FmsKvnEhV;nkKx?{\B\Ul{p o;B:!ng *pFp> ovBCKx{Y:jpKx. :5u%ĕ"w7m#}۶/ĥ2p @0am(H0fBE}efl9O@4 ܾ>CpkbX07abݷفh{8.v _7A]_3|-jkc2lW/ijt>w֫\rȥu ?xGd5ΏFX(sFyJj0 Rs 48#j2t2T6>>}E|&^YaR\ m}K.'iR3pv N + +TIDvVi\Qݦ`$hl[*uMy]^x\QwңWR \ p {qWo*ܮWZo'{%ĥ[Wo{*\GmO+w9 .[\ q5]U \G :n{VAܞ*\!8NOt-!V*,ZxշR}(ppDy .ԷMNW}K5RjKnڄJ}˥(KnW(TjUPW\B[V%p+p۰WAܥ[[]\\`/Rjxϥ[uU͞ijxU𶫾uT:oCoTjxQvAnO}T8q= M)p*p r q[GC\*ou!UVZ}tշ *Kp끷KG}ۅG[ۮhR!nhjmhJ9T6<[+ rU \Uۦ(pT*\U qm+.᭨o[ RU඿/*ܦG ~ԷTOۺ-*q]n[Z}KKxKOS .R߶T*C*!.VRpۿE[^x{mp[U[o pU!U[.5ĥ W)p*pVoWp;\p]K[W݅]-ոJK+w?qZ&m172Ye,` @m(&]ׇoFŝex\<5e11{~+,N})`^웛}w`ݷ`{Aس{z gQ0x^`ٖf 7XXտ{yZ(&`̔/y zaAyvc\{BRJ{{X $|ZmEo:&ׂчe_Xfo6Ջ`>5 m8ö#A,<;}bv< ${;‚j}dyx\_}SnjxnWӂ҆s`=˅=r_Ic{,Nxm?#rny~T}eu ԹUgf\\] H_\x^yL?}'Iy)u9u}/:? kWiu>\_<+{:}{н ` Ǿ{qO;=#^/=$D~{/>)owg^SaM/lJ識7&$}f{˾:0eϻ\swꞻGk y NVmjtU]r_=r`b<>Z9wqu.yx{{vMC~^ gxvVXph|_r^P[[( N">zՃZ rX8%z8.UxZxs{>\jJ\cƻ~\gQ5bM!\~>?W?k.\; p[B\nvB$M#MdWڄi20R .<{uDyS:BY/Vu[e,P'ؓTaOj/ \ Yd'=6ʢu!uo[(V+aOzTڇAo}:Y[kLKJK%Q[eb eG58z7 o}b eGsX( uC emL p].b e[OX(kkFdmB\'S}Z(R}dmQ*pu-r>88] e\q{ \ouY n== \ݿmk+awUNӫ}-E^edpMmշ+eQ^lTR';'BٵQʎP%X):Y'kO>lE}FY :AO(wwrK\,]] e pZKf,ɮ fS( ʢm_* ܞ}Vz,[շbBYY)kUhFTjxm[[(˒[m oY(_vʴOV*\m r2۴OBJ\>ٵP&m]%.m;TZ'k+e W'{n[+q*ߡgP*\ q}rBgRj ee$Kx][(km{[P%ͻD  epaZ'KlT q!la % W?K=0U ˗CpOңMag0Lc`~$:%| ~R0~E  q̝w&v{Xq@# sj݅t3^_Aù}azQ7~ms-Nv]]{gw0/`ϯ_{Y?MĞ{o_=߈ ?~L`_\#K)Uuͷ>s ݿ!v]}#?9{YST}QH'݋|E7y-q$>Eжy~ݘ҇W}{snva4A½_W\ F'v01w'|~9하L]k<'l#Nv^دyM_a~Ł\! IDATRϓ(/}zv)ՃTP2 @=gIԸT>i>ki˓A,I oیf2 ɿXu}~> hp@/B\ oҫkϟZ퓹 嶍fvfI*k-- f2 2l\\'ȥr´*VC\B[W,[u Ö\nUznVTRp]eq3puV*eo#vi.o r}^zmUOf7wp8 \'3gX,uP},\[\K7Wlgu\Kem \rW+[\goiQzlVpW(+ e(OPf*xK+c$[m:V[շ\2VʄZ}@[elۋ3prp],(k.MVrp r]+6b@oQVVo{9̿kJy6T>Y->aʿs*pu.{9T.οU6ϩm:Y*wQmTߺ6n~n e+*\B[fm~ nn/Wn6>Y(o{ʽ \(3 W)oenFٛVɢ \f2 Pfo]uG.᭶Q\n]GlUm['{2pےl23p5U6ʮףe@\d>׵P[oͿ(+xZ'߇N7gL ^euRjο}Wj ;Q&֓m4o¥  D  D 0 [fn޲Gm>?-%%}Cp[b8@A,ZKNrYyέTmv_/D̩cz'g-1Lm0c&̩'t!/oOWokkD_~@ُU@!@J?;y=}w'"ۺ@lCH?b ~qN 4+_ &4i;S~[[O=*pejc3,=ꍘy@py+0sk8fjL=< %D8; 7>' 1詑|.܏o|~~`^ @gw7ٳO`uE^󷳸3~#|B%rٖssCX몋ՏJ |5R?(C(47`洓PjeLgqpLM!50yjcD>cMyRk6DR C& ̞uu6Wԥ>_*Py>lwH#'d;ѥ+~8E"tWnB2^-sξ H.b!*]wOn+Ƃ~&ӧLzѺ\}cSvV''ؗ R#=tT)v޹][ EAkgWrX ӯ6~ObcB9ǜA0<{;L DHroVroc~q'-Nʸ yT9^ߩ|$N_V/뎒 $@ȩWM`O˾ <|a̝L&$=|M&f{ r_y]~r 6{s_^k}N6'PUMSl9? rY|_̼e6SsYwٮ_?,}O;x`J;mvt@nx s}n˶u?D Nr> Na_=}/dg'b[`o=xUF5ɉ L hn^Aܛ~,mܗ?n鯒kr]~,3!i^WރсC] G_m|a2zc,^"aZDXODWs97 h)k9vJf;>cNk5W!X+.Q8FA$`%tύ5}>sݾ~/>+x_{R b6;M4[Eqki4RHX%fFeZ,#!ʦ\ o(g]omK3p]KU'V,6:W[*qUnRy-om oqsp{wr/Wou2V*Rj۞FYp5omQͿo{ \O6[eTMz2p] eR \B\ \By? \3p}̿]!n/M \ǡ򶧾fڄK \.NV[qun/VpUV/iKK2spo_Go]tsp q߈^beK erBy'u2_n`O Vg nA8͞9:V(2@\ByWg[eF٣dz,oK2p7[Kxr-dI%~b/V*g[(w2 \.U---%W VFJWm .*֏%m_n-spEP6ʴO^ oro(oBY+p[f.Pօ \:ף܃B\}Է6k,\eS> f*䞅2ĥV-Fy \PfnB[]t4:۵כ;v7W[(ww .풃|?apb<`>PHlz4l~2p-r 39P=݉exYx3yHFp vg2r|coָٕ J`gf{NS/7(`MX'`Lߐz~OS)!; !l}1\ܧvATS[>!T~ kSJxBC@(㮸@` ! tx Jegv%FM`|m-QMs_ )* Hx[_'FFE ېJW*I  0]X"01i;+ `Ic~#$zs_e7#M{JL(s'lIBSO>1SdZOյs}KkTNQf_TW*1{bHBvc칋Vjo!a?%).@ֹ k7Y:\􉣘~x(&Tܗ>,}jC2W[^Kp"ı:T սxHcd?uwza;vXG0{;E-J|[~6e乗{$z^/NHXkؾ;3+9@k7K_P>mj}VoTrOG;[^W\/}BM54IL-I"'chC#aȀRTV{+S{1+.rPql#Nn%xcxH+W9s_L}ޟxK8!9D"}h-gOZ4_;~6=!< ~3juO'ҰL0NSO}$({x/;W/xZgxlGSluxVj 3죮rK?NKc=';:rz"ս LNvx rp%^Pmp%'dū7&'y,S pheXbp} eqנZ=84x*WChx)ځ5s~s9O:wDU< ^kpFP.-0>}@Zv޿5ӯKZt-$Rܚ2mS0R)̾5I0,⩤d2l;,mTآ8NRo'V \RW['O_']eI?pirpٷk'uuX q{o&IU}937;;VVUwFwݕKUw]T7Pq""WDE@Up DYMPdSAEDgsyq2*AtPsȌ'N8{.p]h@o 7b +A'6e]Of*5YnɴPֲ¥Wm \˿my.A.oM}rdMW-Yv}eRvY^Fb'knhLA\76Evynp5QЫ¥6P[UpCE@Uf7ro߁X2spssGe̾\Qz뜪og'F}c'Njn1T:Q2Է q; o(3ŖI.U֫p \B\N(kYS}K+bUq|fߞ8'up o JT1-jpBYT1!5o>9N8 p[>6Nh7 \QN7[OV G $7 ԷoU&T& pM}koiloC eQoEy[*qfw aKeo}meB'}Bt*\B\Q )nYBV?t2pA}\'+M}6p;4spM}} Sn/QZtmCԫcVc>n Q6Pm`t-[`6pk !ܴfG\o+~{`%b y+M"{|}>-6{.?M3WAovkwF};G>ԧɢ$tzrDG(ױq 70}{k"0XlSǯ Y7.;o; x,Q|&Bm~Uҷ17BEk55vPFu'.m Y_TB_#-k'he$X%ržy }EZv 2/z3Pi}s*ã XIp):9"5UJ^A﯌e ed}up:Ɨj8Ǯssk2w{XIO_f5b v<ώ3?W#uZPt<\3Ck ܅\3s_5]sY33~yN% ]t=^ R9(뙠د_?֮f&Ŀg|[ukg~(mc|]gowͼ*kS 7~k_2Nfzls}eda p~WKi4˺= leNʕ+b V패.[K]"\sͥfZ,C[k/Upgkskbpi\ޛr5Pr k\0@y,n Z[A\Sm+qifhu:XV{dv.y;MRnfNs"n}- ۾ \B[*rB9o Nin[A)p_HTQk 7S6Z!9SIp-Է 6qh\qw(}Ry[}K۴kٷU e$ no[Qf'ѝuroU^dE* \&[VfLh 7PN_fQ+e߀[bnhx}cNW`[ ]h`LԷUԫUb ln--W _]62eظ|*z }[ԫ3y`KXy|_x@ &ÏޝTZ!/-swOWN~?SlTL}yT_iIIKoxA0n9U8}{C|։o\m-CzZ8&c&!.9Oik^yoyx{55:G8>7..cQ p_0?h+̇|+);04g FdMKj*U+_YO^(>,Sߓi/״]~We[a. V<^qarN9)@րfV koͱ 2pI:k;֣lv:MQN[`n)=F>PDܺ֗ NOn߈ A\%577uQ[}IF+pEk6ʪ *uշ^K%X(7%Up6ʦe]P6p\7h6F9W߮[osnY@njʪrnDխ.շNVn}'@no'{eQ[ 2p 6Tfnkqh ׋[fL*p nc\p5WUUQ[97"rP6n \q9,+VϿRuKL.Qp17J[-q~QR}+*\G%\NdͿ5%\\ozr헁W:Y!np%7P2շ7U}9JnhLn$",m^ IDAT0 LJ^n| D}K\W OW3pE^)퓋*\()p{T IoE" \*o3y'SK eoE۝]pM Ck #ͲoAo'QN \n BYnɪڬg t-i*p p -*p w[Fx2!n1G1zOchVQQ֠]r8FU6FQV%w-xM=--p p,X 9CCCT*K^nexV(@7E>ڑa*zN@7~Z?O͊gP0GEsyM#ؑ 18/ŶMR|}]#YA\66fE>s\,>11 eٶi _-@mBp?k\[7[ C2V19f\պ<{Mm s{`kَۛ}rb|=2|G);p 2|KefmL|ߺqm\lùݶvZ;^ zG5Cr}ۛc^G?Psykz6xNos_=1bv\w.xՒ!,/ӸJ&8xx'ktP {C\>55.Adj%̭J$o3k%kO/!;[ qR^4W ެJ{o~~x=oo>%*@5dz:kװ6a6`[\Է)nvu6ڭ6T&Llcr6&wMLZ-(p JMhk%sDo¥uoM!d%\nhlBٔ9oV+p5d*p- o^m \B[-Nmh^}ɴP2 R}kuo5Ea\u2>YU[[xp% Jɞ[Z(6ʮ'w8Q-[ Tߊי}2mo3Y(VmhL[ު r1׹baʚ}k@*UZZ(3֊)pYoCon--k'% pYY; 8&ɴPmcލ<=-߫[w45nܓ,@xk7Ƅ(Ro23p>9[cS \I1ۙ \bLĦMΆ3\B+pC<$ToGշ_TmB.$Em|1Dsp^*qB{9r$ շW@m \Pf-79շjuHRfz%nzbf&A)p%[(S 'g>Wշk0N$`mmӮf zx MJY-F9-*pE}k \SZ.G oU}k9ԷiJ! WjܝV eS9eo{U}/7Y-շpVi({v@Aq45P%խZ,V_UGVh7/vp;o< ݴkWs >'h~ LAlA .'dw Ȳ|NXq!|sP$`w@&gWT|{(ۘ=!x:lw ޷"<|<9MߎnfGy'|'4AL!yG,+HM"ٞs5r_s^X7)xwb6؜3|`UǎeMyw8ujk/lqr||tVVNPac6|/n8øg0޾( <طcڼhwWs%wv,?<|pyyx_y {q 6 KGe}69y}x<֘v,_9=%9 y˾c8b}ygTU<^cmr6KrOxZeG\16'zj8OU+gs~g;&<~{ۜE{wuyg5 ʱA m~yy.[|}p[{@ˇ|SO}\|[w]o97{~{|DM\G p~s)>˭sbWU-#J`쭓5 *\oFٷ  2p lͿr \Gxm%7S* \P!\F.3psk[[ܙo}d\*oi \o:WFbYo Z.Wf*ܯ#rb<6!+pMo@\ q{mjTԷFq 6̿ 7})-b, p*ܙ6iઍ\ch? Q6S%5k4q̾۴K<W-MKeS2gJ6bnʴQKeb^C}Z}5n2ꩁ@ZmW6PæM[y=Ο??K Ջ+MkQYwZq|pOCB(I!wC’<8Z:WLJExܵVA'en^3$=qL9TmRpc ew2ܣ~BC> N]6/6@,Yx%<[ؖo8NLmP[ĻWDɹ#6jr؞`AܰzHZEy U8N!L/Af^79k^D)q.8VkdlBMn'8x?X<++h MKd8V^qz(G\{eؖcq׼7.us2k%^?s>Xx |r, ҆q9y_xn^}rL\_|mk{jE>g*2ym~?P.?ɿ6/յx~؆c)DH$?lG5=#v|7ς}:}tPwaS p|/vjpu g! 7׽!o\>н p7k_կ Ƚp/g|kˍˍ 񓽫xbux_hhL{ plsML5W2an[{Vr>5Pr kր6p\n6# 4ن$FVm[jEelwj:VVVk=w \oL[TfmgpU[Kol o1>ٔa@!nnl0y 2p5w>E̾ɹv\dʬ ok\Kx[sy.!n52\KxyoYsjm^퓽2p -\}fKުr)pJ9U>U\-fjg UpF77W \OW-U} pC-msKd-n >J>y&U9 C3֊p #FԷGŁ[P W^Ǫu}Q&5KxDKdOV+<[ubLp{ps%.շ 2p 6,D~ (J*\'+ Uql[j)pf UR+I u2o/B1Wsp>9N.dZ(Sk*\N6' 2p >o \p}r}k oS$-H=+ePԔ 3p3mKKnWZn w\M]x[T*v-*p p>T@T2VspnpFY r˿Up-~ \)}t۝V ipil>rp3[[ncb\70^E}!Ѩw^h}%j5l޲[l.\XZ2ոT +*L=;+.!(@as/|h~~}ɒ|lWUPeǭȃršpNm 27QkY*o/lVpKǂTeh_j |_ =*PE{NB h>'Z; `PEԧ>gDm~Dvؐ #냜y|>pAJ?"sC~YsJHHU501NHy=ZcOEyzx#(#|c__+x Aro Rsp^_9>$KD@+-Ǖ:NBz ׍yz_9ׄhe[ :#챠"kc؏޹"kkxP%I8I~}tߺvGěWpn\3$yXZ2o~r]qNxx￾fgeI* v{+>V z^Hs9{κ6x/879p~1(a~.8'+-*kG Pc Ny |W9&YꙟV;Hמ hp@˨zw#E%cCa0޼ߗY|sw,k 6<%C9DŽ\7:p>9',{U>oy8t[ޯOT+:zɹZ?_Ḏ]&sU=7w.UcwyCӀ\;?$\L2qq}B~ *?lZ? PD5ɽz~q}e=oOExZ0#VxMcv]/v{?pW/8mk8z_>=c{ŝwޙ\i;arq![pG?>|o"aGRYÁ\4س/o|zw{Wr~5Pr .gmj[o~[BPykw||,5 8MLolnDĺN -n7[hwblJP v> 7E3DS7%ɦR e-)qrQΔuserpJ\R"FFYT2p5WTFy w*}B\u3Է2aB9T+j.ף¥ WmMB ȫo'*pHm;Bp3ԷQV.퓝3>pQBYUNoU\Kp!zշOg,ܢ 9Q>`jL0,5T̾r. r@.m 7!P\Ň9+9*qX(J9q\T߆¥u`Y(S}Ee:[(S[TjSyo}Om qC e*pc[gʧ#OG/uǑgR}Y7Pf( V7>I ϋ}2-E Wsp3VIK},cZ)9I('[7Iշ\oBܸrl ׫pSo%ȥ7Ͽm+p qӮogB\enڽQWU[iQ6}>DToer>rptv --퓵 \O#,M}Z(SuK%oio6p-% _Z(1QXccU} *FkuW^bUf6By%C{| .RyxpW +`PWp V W$3wxPaAm7tl],ؼ &Fxl>HHkϚioX j~ctjE`k+#$9 *`>W09RChy97Ul"5 V\0 bA9NÃrݕ8ɑ,(\dz`%QhMHxG+2K5=9vN3fdx(sr+T^8نXDr=-f{;2-y/x޲LmP7,{Z\A3y7k\8끵AL,. `x+uB;x@޸@# mshcšCX6oC74C j*fx mlv=8<\uɵCPNH͵u{2_wrr= 8{狭=l8묳f[|0ʵw+gﶟ5!;z1ww;N%ܴ_җg믿wu /P޸qcOX^;%7p%ਣnXZװ^{c?,Jf=о;[B~X~ײrk?p."=h|p@'ksΈOx:Nm)Uxk7p=Ζ xUWnߎgy&<\kzzZ _o}[;<汬Jy{\r Al!>{s&5 6nq p6f b$&iNb}{ ЦrDSdfFgNye߆ ܙ*\R[DST-M}/,YO<Z4(GoM}rpEw}rrn[(pFY*5dU⚅s5x;WRK.mn57 g'rTE*\d:77W߾.\nU..շZ[.16T9=n}rpspil%֊B\o>Y!.PKkɡn1V9 7Pz ,׫p{}@\!.qLd'7\G+eo)pOFBYUp?$6Nrp{̾ Kx\Q[ooWTgy{6pr?[MVJ.n7I:K}շPlcpUxk \UIJd+ q{ D:'!Ik[ol7*\3p3MH3B9OEKTTT=Z \SBWΰO.o-#H,AnW3pU}k*B+ٷO--oL..?շ۝M>9PNFVmӄ}oMf9KKp ByoOt5xVkhPkT1>:Zc zcպdRy[J.-6o.?KzmˇU!ĵ}V}k{ou϶J(lVXq}!65s[}Y_|ݯ߰x_>gkSΎgͶ:lgq?Rh0 =8ñ5omڄY~vV7ٸ5Y~uX;vLxp[m^v\^cnZp5iڮ-+n[[Ƕ&<~>s>m_֗vmkguq 6^Ϻۄfy{ 0xH`\xvGx!?׾c=f<,,><]~ӛޔA;G[1<=!*O}g_>N8ᄞ6T~uQqjc`M0x 7}w3cߏ[fر4\}3p{-UK?n#2k[ofrpz8c*Fm:c?FQea˖Mغߖޖ<%5;e*῁6#,q7߷c6cg}0\ux~cgֶua>cmدm\x`2Kq8^</:l_p,v(ޓp,~cض=mmc PlS_Ϻ_?*>1k\\ccX۰]󳝵~W9bc98N;O8^xnkY?_m8.[q8vd vGj;'- οc^ X$ɬp젃Gh>|nk`檩lu]k6պsc{ウcy"a=;%)uPs^{-R\ٳ:_3h, p뚸է~O/-Z-?/oOu\֮d'KME7-9OV|s9;t_8sع:r.ʹ(@5ڜ-sM}[oY韂ےT&[vm6:&:̾ ['OڙW/EnhlGKm?. Qf7yn!L[+U6"%ᭋ[# .D;C\yn/J.g*%mB\U_jpQ]Z(쓝S \NJ6fJnT]%nuܤoCP[{5d2W,-w/0 %QKxf&UK)pM}kup oU2pJp`:9L.ps\B2pCxʪ j!`"֦5p[T2ufZ[PV8S{Qco zn+ \p]b*o57+0dW+ \o>יr(U~  \Q , \= NlFZO{.b Ub![Mh'7f1p/m nƬ n{sp8\ɿM*G[MzĄ n ۢpӛ$Ux+[Z(' sp5TߪV!.m>9VrpCoR}Rۡg`} K e}rw:T*5nڥufW럂ٷZ~N[3N[/v@k*\[o[!J@TUpzձ1m(15X m`UmLj5Fa͛B9[=HB?&|>P/nsg5.׶jkc:&a⸋X;s;r\6|smgXm[]ޟ7b[Jx5Vm_[am}Xqzގڎkֶ߾綽;҆x:<ö6[l}mv:QlcW6ްsmS,e om}H\(^_,{1\:CHHGka{@l8Z*V(|ɠ7&nr!5]ve3_ZҸx7ߌV#@SNs6Pڃ^\>/dWZ+WbŊZO6pqSO p;#䂞iǷZp'NO\wӧ5Ѭ?hP<o{v;:_~=N'?I0+87_׳s\Xc5b[w8n׶/qo8kS[NO#Mhh5p*:Onĥ2qhOl@!uem[+[Qs"WN_[UBy(6TW3[!R5 \2FyJ-]Dhke2VH !9j[*p5֊)p5WT߮6 'GQ mEO2 (G8QJKK%n\fRHQ28Gx[+WxB>2p]ZPE9P6(/˿Uxړ+ p6W*%2µ[o pMKp og(VspF-C[Rfpߎ<LnB.an>(BYfH({n \}r W!n!ߚ7:*pVʄTߪ7Nn sp0W, zn?n|o,*\Q[Qjn*p$P㋐P}+6ʦUxk[OqosxKKQNfƙ2fll>C\)p n{-n7M ok p*\OVn'w rp q\SᦁRq2\%퓃+iOnnLeZ'fl6ʪU efZߊ}/ շBmbY( \QnB@Z(Fc:q4R^-9 fߎA>*Vʬ̾]@ +cؼelٴ}<sÇvl}v61v쳩}b~X_mޑvcGZ;fGj;9f{m1=y׳z{\c6VzlbWocm};7~ vvّ~g{G)ѿeߏJ p6 X>}GAEM$v}17y̼ z6׼8AdS29a޶m[? IE/å:x;2ŇTa/ZF.i;l`B᫾|1n9=^+|<3r?z?ڣ"޸/~óNmpyk'|Jɛo=&l528_T 5|75-~ŶKTr k\5`ٿmkV6C˿afo N')i$:6&h .3pUϰP6Ձ7PZmL@8>ZocO7W06y $an[ ~58V^c<6Qv'b7n=pEy;K\Z'*078k f, 7!^SfʒKpk7WƖ0ZrpJn5dfP;WB V}ԉ[!WoB9T}2!n ܮ'dԷʪT-UxߦkTE-y`4շmf[boۮ()K@.BշblrwU; BBpc54j1^Q.@w U7Ш1zmȭձu&l޼ k9]i}1{!,QVlxe<8m_8^{~!]׎%l}Bk9B3% UW]~}ssc=8^;kЗ끊p^>Odm@ 2~g;جpo}@g*R|ݵנqHc';#E@?mXn<5x={ œ}};V/91ĄԼ.p8ܷŬn8.aM5Pr >׀-9m; ޲.\{niwI TNBl ̝lMnݢuML6 s[lM3o/VS UWnʙ/Msp ܪ7 QS Kp>يB\>95xk6Q (2p]QVmp Z(Z(E DR,L eu.Wຈ֊Z( nnZ(EE >9P[Q~\U+eRf+༅Z'}rosuN-CA\m efj7%.-B.ͿU䦢U5Y(5dיzflB%b6ʇAml6T2Hh(Z(61pX 2֗k.Q>5nkA\Nlq!h[q? o j!6ʙ74\Q}Kk*' RP{>bɾ= !U>Yo 7QV'MB\-MBW2pӫe]P̿6iqk6Xn \QiJxWM}kWH=5 $6;Mr-M}K eQNR -.^ \˿mFYrpilpC-m s#2շj7Wઍ\Uޚ6- p ]Q߲& Anq++p>[(V Bwgq&^Guw T Ԫ|*9$>J[Ǧ7c˖B?v^`ޕ\(@5wԿ#!{d01fT6>?vTω'3x׾5|Elx駟sv{9뮞v!~@};Z?yb{@li1L+cobyl P[8lra!etibE;g^YS3Oc7݀s\m1 8w'z~'E |gk:.ە\& IDAT(@ Ʋ}m-&s65N5A6[O6xfu]0vCV{:ڭ:6ZmIn܀An4ʚ \' o]n=rp70+p]DխF9$C\oU} \Z(9^R;ʽ9QO*pPVd.Z Of \S*p[BpN5hL9ĝշpC e5dցruNVdUPk9ZB \Z(3V2p%wEj"ͿUWF>[(R}"ublʛJ2psߊ-z+[Z(7WZ-"6 D)p n̴PB9a6{hB9Q X'+cU uF{ejnBى : pMA@Z(v1spOqLxnA8Bٝ&[^npUyKǤ9*Y,q,Ab6fn`'zZlsnBx^\iro.&)so-[STߊ}rQ}ܘwF775 eoAʙ oUyշݙZqQ[5v-߅@\(wU݇ \Z)*\o0H>tnvB\S-Z(SKk9iɹ2UܴKU= n3 e9ӹr72wzmox}:j14 PemQhG*B(Qزyp@ p=?.9Nĥ_\nM}!}k*\*oM}˚ۿC$ \3puFy*PNTmyDSQ6ա*p]`0׉7T U e稾U"U> \K^}+ʪujշ%%5՚6 os <yZ( \Z(;Vշ6\稼(penUk3շT*e)pC PK e'oj'+e-m oM} 7K孕GFQD.EZ;(pi\P8PJ.AqfL5.!*pFYoU}mnfL(8}֖ۣOs,Eܞ֣QU:9ɿMBŬ qƙlĉA" \u2R>L}I ZH Է+9˺Keo5Jhߦ_E \*p%o됤Km5~(KMHқP}(pFYMo-7MoG 7WݻafLmqCeEospKT#ɔ n` 'Ae\-UeͿU e*qކZ.gJ. ˿5RR[Q.mB6ӽXmLT8i VWVXƪF]5M[7c-iy%(@5Pr k^4 ʦfc//Eώ`c=X=zvm>kքr a}{Ep<E8|饗f@Ck. 6gqީ<~qwȏ\jK/}I,O<(wl1l5?uFb3L.OK=W;b.l-'| ~-x֯ jؖslME랔JSr k\nu?.E41x8j j'2Ns#&l1#\ uHpY(3p=%͔̾-ߊr \o[)N6d/-\[Z\oB9EVB_'JB9TʄfZ({U:o \>6RKpkQ,\B An-+p5E{,U}oM(piyer bn1 WEkֹbܓmB\uoʹ6dQd \SRy%WV-Uk)o- RX(!\Q\K6ɄRfnA3pB[G퉢 !.շ.P8Vx+bɡrQK06d1շ^+LĉbBqUۓ+>6ʅ \P&M'Anr1FY-o7UHDZo[q3pcQFzHmBאHm7 -Anބ,65nhoF9\Q* -%73pE+^n \Q̿VG*2pPշfnQjVspig>tZp-l5w}pw)p}(g<,3nk ꫱^E@>jFkc1Zʱp7?rO&5Pr k\xk p̀dp>_W +\BЊ8q 7mڄw8sA(O> ZT& g?Ag $߰~>Y\bTКk¹ ~߻ށƖ]'_O?})~aQoVk~Zbr~ޞGp_k!k.5}wo7߀'nx{x{?'k ݃>va&qe]r k\x.klX{ub6[.0pmMl3e# hM6AnFm0+)\ۋ%<*BY X'?G4EշbLl5)HNVx[An9 QvNspC*ܢWշzUTߚ)pPm>Ysp{U!"SVFn{;VAnKpE!( @}+}O p= eQN!s'u2qAAku[ \B\F(B>Yo? ,7Tze'upi-E|qf3Uf,*ܘJ܋y'TT['[mBY!npEKm<6&[OV G[6IoF+ qT pBmޅkVI \Q'ܶ \qgpQ6Ux::O+95< Ǡ9Z ^SN3Wm3N*\([:A7PvF9Uo$'6pz}Z5hjkh4hL[GZEmtL,GWհ֭زPFpny{Vr k\\/fK#m YM["|ڰe=G7d Yc9|Vc2n~6F|dF>:kS}>=&B\Zd O8ȥ-M7ZtAbvt%<}߃]/|eB|y:#٫xO#. >Z7wO<6_[n'-!-ք{Wl/KSr k\.qݵڠ-kVVpd4mvr&64;6ݚdk tMtZm 7n}- ۾ \B[*qCn` N-o q5jS-!u̿U\ET.⭓gUnqSsT:9V 7PVdZ'Fsp5p:T߆ ܷ9+}r%V+O<qŴN>.>F^ǂ9uq5VUU*\[&3 [}. o>Ys(\fLpkc3p r}Wᚅrg \5 e b*p3.oY6ʒYM.(3 7W*܄p n/kWmiV3p5W n6ʢMV BnGX(_GBn&YQ9(6TZ.>75%Ti>W!no=MT:9KJ.-CpVm>'{[o*> '?'Y5diqi\PNo b,*\߀[OP iwp5kPoQkQk6 nGKxJ[XM[6asi|]r k\(@A䩧:TmoᆾmN< W\Z?K\T^}w}%.=E[3xM?в0b~t?if|Es?[<sY׍t}pϻ}G_nOǎzw-~#ތK[Kqo{!~o|_@ly?#G?ڳXTO?>JSr k\\pCxko TZM1nC5$ZTRlaLLl:Mom@grڭA*p."%k*\o3F.Tfrp p M5Kp֫o{-CeUjn?\(em W=9roZ(7PQDnBJ\j.퓝g[*pR}+pLۂ }Z(FYLW.շNVnuoL;3W퓽(pU \Ϳ@n!p2շ)pU{WFy fL*p}-spB9L;ݣ"U:WUn Q%U-շ^aLO} j֗X3pBY s52p-ń6VTJ\B$o@,J\n; ~rMh ƟVmfL+}Mzrpzx+7 lc*p/3p-,3nL{q 7& \։^o o/Udo q5W5>Wp\5[(S}=n $HDKfZLnAn[Qv_pM "M<fL#H3A\[܂wԷV}2iV.Ui*oV;knJ_ 27 ,+˵q@;5\U1efef)"##2#kǎ̖Iqb (UI# ⱙQDPI@;G=zy~^M7~kEfFպ~kK[D(rWkKweۃ;فj6Ь͡ޚC8[k$NVn^GyZ5^ g \gsgπ?~^3po.=7`}Cۺ$h~U~Ap?ۅn\Bh'O|?ndoo={7>sm^k?hg?x{"^#>{>?wo]| }8Zg~YO\y[:񸸏ዟ?~  u样!.?4u-\ܺ]xceEj0A$҅GmqqC0;e*[a㓹kma %ȥ}RVA0empV#ռ۪owkV\-"w,o5Fy:>RF(ˤ־ɌP歵omKV#omI[yط&"e5p0e|%ĝp &n2B\3уۇe7B5:h܃1SU5peEmJxk#zp-ĽiA#QKx{Lkd|1\p0فp/ԁZߏTL܃ \j qoD(g7 nTO[t:1e3},ʄمy[\@ܬ4q]Pf'g}Wcفe?묟CU \UKe/A&nс; Fٯ" ׍O~}ˑe[B\pl{pWی]V ߁ڷ#oZ9<ʋܑZ̝en*2pPf쿭,\PYvK}FۼQ!(/q\ٷUn.Q@>&`zl g^3|Pupgπ?~3po<|dg*;R\.\Hԧx7w|L?^/5~F_ww~[M r?(i?>'N eB([طtRE[ n-%=Zk Y}[A\oPx[UF IDATO&ȥyKk \c¢ {eߦE) 2FZUre2FYoeCx(O\V!)2F56B pަ#B\c[ہkoӔ&2:vevߪ+ʩB\erՁ;݃d qT!oeہ;<݁eO@jn+BaA\F'k2!c2Fu!(}Kx>Q6b@ \F(R` EطF(eStCk#%e.MP.:pG4o pYVف+Q7!SxjV \۬P;zP^U(-!oKnL W[ oվ}hZE.wܢWo>l.`Ӿ巡eoQ.-[tZ[\ osvNCQȹ4Fy0BY-ܜvaY­ \Pd pG\|V*FY!ne߲v*ȵbߎmveQV]\Q. \QdkJ2cw5Fnn>cjZ}%ЭPP0~:={-Ο} {cgπ?~3NF[ꫯկZF3[n }{ރ=iv:˜^"w.cWOyS&=vF/>0c>1. iVi}kס_sku:mg<3=F*j̘<^{9=O es/o&M,OsG= I{q{`+2V~dIg[<3gπf`L_;]m].UVwwZ qb/њq H"DQ /D$nQ #qڷIq \N۷e}&%e \Ͼ \I n'K~*B*>Y[U|)++ɶ2p o/p'c'`crw \dݛe|reܪ W[0'CZ1p;piʶv}k;p e5p7M7a}UJ6>F)W\ u"-neVwW!."y˝1e|] nm|dB\QV`[F(;U'a.'`'4p;p"Ev[vҾMQʌQ<_L{p/ɸ\ہ[w/^\U;{p n/Ё-.!. \OekfL=\ڷU UnqiY}+FQ.i['ݷ o}=W,*>vo\O.#VVzp pDž}+Vcߎ?D'3>PZwRzdYG=Qe;;;scpԩԟB?םuߑۤzVy̘%.wQuxY2ZtSCt_F>?E0~/?} V x#;NA ż :8A;mVqܩ 7-୑d5q/ԁK['c# -\1qOY(&p PNTb+ߋt0pw,5ia> q"F9M\.X4qei./lUnLko[56BZMvf­b'-\keV# qҁ/ByϾe$U֤5)᭵p}[E( k1U2㓵(оeV.o\uCKׂ4UhsPc#S3iPfD.{p,5OͲi֍P~j2o[W-#eM@\F(}UVo3}+? (4plF(OڷҾ}1_@٥n[ Vm,.-un2Fl_nH-WZWL\er(J,; B9crՃ;ʴp(<*"­ ̱p1bfD(g rGEh_.A. ܪVKm(krq%B9r_vU=};ʋCe b?X o]V;p5Fy:>PVvZ[vN۷p+wھt2헑-y[Ӂ+ ([Voܪ~DE@|F}&Z|?\ZshPkbffמ='=y yKhe2fr%/@to.ƣ& 跗!03gϕ^vw[] qu?A\3>{lc(DZbFbvqE7Vn;frRj򴁛jk)oܝ"FY!n[\ucNj|ڷ[02pe]jp p[N'µ1Zd pij12>Yׅ:p&. \F(WNv2F+ˤ+{0 pMځk-\t nB \B\,4R6B]U'sF\V5B:O6)c V0pi*%}[- qij|j}˝x歮\¾- ru "By5F㓟#=f3 P2 p',&5pM..!pi*}2p%B1pmt'WWcmm}[E(gWokA¾OW:pifʅk{pierF ouY=(gt. qف u;p\eڷEQaoh4pكUrLk- ܼoJ|er^ߺbkl eU;0&ev1פ[ٷjVc1p'#ǻ[x[u~sV쾵%FKKx+WvBۃ \u"\- UѬQ_@#є˵zSgk5ۃ[cϝg\߁;p 3gπ?wZA']s qkfff?~X=dx><ы8e5ty a|*:G0^\Gн6XgϦ?~ ܵ3|eVw.7Bl8.B"ǡD''!nQ##X ܩ\]\1p)!Nс+6.-M\Nc}ҾUxU ݷĵ{ W ܇F(kBCݷ4qe pd\PBI P>4@\6FYS nS٫4m”vV=Mr'ȵmv=oo=eF(\[F)܁KɄknmN>]ڷPv ܉) [Zga [ pվeUv2BQNXY;iZ[(e q o TnNF(s!.\j|cfj:pm2!ne2>&o%>iX.A.!.-=et]bjtҾ}~iߚ-;p3ہk㓭=ځK o /bqo5BY;p\Z! O&ee._>,=ul2 rzpiVPvI"5pž%u n\\\c4p:m qGgnommȅNkj|tJoiZÐqՁu ܪױoPWO &.r'ek \Ovv# rPߓ=bj.mow4B= pMZf[ 4MͶ0ӜˍӶf0l`6&uP>ܝ| 7ܻ7F\gπ?~n{٤iØĮ޺!M{}k%\J[#Vbw \kEk#js R5pi. ܴ4qwsAz{U#锅Cn.F[׾7MKVA+1e ou""h*- \V \` dτ&ct-{p%JmelPɌO1pmہ[\era=4p0-\}2d!s.-\1p} }=#:w$] ( ͸NN\ڷڃ+O0pem p߇D(hmGi pw`4zFbb2Byۃ[2>ٚ6.E|ط҃~ecP\.[o\1ps(zp6>yڷઁkm q[o,ܪnՁ{Z\__x;\m6M4-̲NLyk5˝`^Ùgq}[}gπ?~ kfܻTǍ4a3;tskجÓZKHpHp tି uhe=FR<A`v䶗+۹w9_3pozYok5Pws" F=I$Vm1a0  qEܐ]1oQV"iުطv5e|+vG# x)ciZפMw V[׾%̭}鎅U[P IQޱ&[\ۃKvKw{p­ \cZP6VLxKdv6IiJ4, riہ+OMuCx[]5j[k[5pMz5h\F(k2!lAK+nZD( w_|":t\C iʌO#M/7M}V]WT=O,zo-b͏@̉Pv,ܪ)0S2B.ہ{{zp--,ځKx+'a;ՃdQftvZxkhFRf.[kf#[KͲ_F&ٯ ܃ 1*"evXFݷema eڷު}e\l 侱¥;\oڷ`(;R1\@ܢ4p n'F)9-#\7BOnQ1\Q.\ qsA!nNx[t2>Yzp pe*wdP.\.|LF(%?#u-\څ-c+W[P&ݵ.!e5p-Mԛ Ԛu4kh`VzZl ڷ&:Ν9$7p}?~ 3gp@θzpj@Z#ierc8gxmx^<_:7V!.w0>Ǣ#ҏbaxt>) AC\o;csg; j}C>7H^v\}![3py]\F4n;ۉcDA^8DbA7p޲ \ݷP.c_J; q#I84p~LZhn(d%= Stjn:'܃{pi+'P6 ou .cFom|).{pie cvp} ߪ[h};݁k#MW:p[&.ou q[2BYcmہk!k2B9B|w|^o7pgNC\erZ '[ V,t_|B*B9X:7~߲Wzpm|2 ­[F(1[S-OIہ{P1µ&c eځ;m߾YEpkoeF(Krq31p] &kNwYudnf.e ҾeOUv}NV!nej|ri}; q7<{kND(,Hzp߅<-#m.!.- %e|2 \[ߖ[yn#G҃km[Pzpj2BٍQdB\ rm|tطn q ok }+nn\V-\NfVVmsy44mLXK zc{sZ={ Μ?G(3>ܻJ 3gπo{`;}߾zjDZm\'9sqo\_<_Ϟ/ZK!| #aգ\F,1:G"|<:c=/6nTXq}gπgoot{YaB[4Ux4n.c- 0N9iu6pq$jH\N.[-:p4pn\B \Zj^'owԾu \%u pB\2>)[]eV[*%[QW#5>(OG([hk \c*פe#}QN%FF(Wmp5bUt2BYom:Li(g IDATeځkľ݆I+([vc \clk*5Pf]klr*&.#o G} hnVٷ&Sx}l(OF(}ѾUxt LA.o=Kzp5Bٔ1ρZjfH-ooe[ o- .{peV! 7d5q7{ ̴}e\o o>t߾#B\Y־e|r6bmFN,ErV(k|r.--\e(niߎތ)7=p%F0q-e(K;p?"B9V*By j}%͋ej2BYcPnaWoKx;|@}d\vjϡ2p]ּU6[׍PV;5pǻ.ȥ;\{O."žeT. ܽ*B,&j:؅[o.vz94P'%es8zmgπ?~K;zCk%+z#@w6xQ<}t"|&ʟ2q]+?G#Rd; O jxbP <>h\y~ 3g@g@>z;.\p\B[LPw?GżMh]t%M$V9 D`.wF(.\k[פEekRZ#։Q¾nk[#uzpS1qi~/oiddn:k ܪG()&etONY'BY.wjNvVW#mt2A*k[ndNrE opm2[.كKkPeZ&RMSlӨ" E2.[\#|F2pmD(*Bkgz>tHmWB-.ЇIZOݷ4owϱpiG(i\L0CKGek2B=b#+):pܲpztߊ[tJrсeσ]χ,-#5p p' B5oi߲y[ qK%;RN'OAܑۢPVK+7K#rUҁ+=Qf|2M\<فɅ}dU-M\\ZoFinuU6JY[ۃkȉP.-*>2o.6>PWۿD'?F(7ϋ\(?;݃KVoӃ;K0ޭ0޵W-|L?BRV*B' .ĭo \u"-(KxK #@^&Ξ9eZ 9 3gπ;oԿ'j}X嗢d!H3&]v.6j5fOQGK\wce2߄GR* 7K{\{΃πeƯsw^v4Ux=s.F{hFII#"aW@mFn! ~n pV!."Fygھ-pKxKeݡKVumݷjVo\QN j¤4oojI mmrՃ{ (ʕkRv['OwN(3BYbechZkҖD(3>mlc5v5-pL ([x[E(WnrV.#ڷub!= joiZ[5peyT \"[wii~%: ox^{-ڷӃ5pӔ1 o힦p 61څK{[⊅[l ̱o YL5pm-/\ pe\sPa#m\EڃKp[Ͳkަ;btrՃ;;&ߖMFڃt e#y+7JoW`4ځ+7{F4oVnZ0BYb  w$:Y[kpGnm&doمVۃڷEy p?HcoLjceoy6Fr'bmF(Ӿ܉e½[VvN5F[\;k~]Zqkc? k2:ZjVu #l.?Q/N[,=_2ByQʓѨI\r>&mMk-1r qg qu rk59{ PP?~ 3gf\9xn0[ij趚 5H'xa1r s]pE᷃K'x|pyA{6E?~ f@Ӹq>m m.5W'\IoDDpwrb$D'dlrP>Ǔ0@&ĉPVxKp;Ձ[B)W{pS[} ts¥};\ImnZ ަrUxKP{PeW㓹k|ڷ1ڃk"e qS]@.}V-cmEmj.F()p q;NӁ[D( g\B\A#};V-\7pn2{p4e5p[cJ|DnJx{-& ܫ:<dougcg'[ nmUx][վkߺa2'B4pʮ};=<\YB\(?݉N&e2p 'eIkJO}Xe@:pe\E򴁫[7BٍQ}[ok \2ByB\V" vTD(Ou=['[xKpk-!.᭵pV5o߄QNZ;zKq1ʿNѼd?[\em1(W[vDn>4pd2>yt ܃zp?1Kڷ)}.\*B9QKpkZk-\%U2[]- =׾Wn }0 yk#jN9?>ZZFZ 3Y4n-fi0h1SGqg]+}s;<>BA?~ 3g΀8_Cm=v#=\+_]Ok]_]8w/[#!>/`' wy a#Ojp.΀nn#/# cD{g7 (>e~L/9OAI!\oޘaow G18A7 %R9L麍aƈP@n;1p%RHž?/H%>#a>BD*ɷp0qFn0;EX}ߊ{&=5pKc/܁{־U 7cnl!IVmLpkZֵp-%om|2#R -1{ՁOU(>heQftt|Qe|1j[O )w'B9M+;mJ|rzlu7p-ILtt[]xڷY MO7MP.bd\p- Q.:pVQx` k̳W"Hdeʴpl;p-5ou:p qcYՁ+pi=[("BY 5p}ep3EUVif.p['k--pRE(V@om|P&,)ط(o%>BH-\ py{ ގ {><" /!W#-/%g~%-mns1p?0.nodPeZ\}'W;Avw:>%7/;:p}[@Gi_p5y֬V#eVKznfѨ07[GTZYk 1qg;p=gπ?~  xyrj2b=~8;jc!d(c?*Wlt௢)83<.hHWud@]=?.ގ m nuw/d/nR:4n;@.܀ncP@o脡phȵʕKx@; q {pwھu{pw؁k{p'#i>X ni!=;=MUxQe\@zpwnW!1e\ڷWok0N~wUFV٦*;{geٿ!?`3gπ?~ u3?`0ߓ~0j*ȭGcG/;K|'C\уvz(^ODG!: /{cBȍی] Y?W?~/yzYw W[}λ6p1Ю:H6(o','qctZa$q#N2BH pkRb[Ё[( \F(W{pp \#E ow:BWc-ȵ= p\ o'zpS pӲ Ӂ+D.-wہ[E(W1ʥkl6Bv޺1ʕ}#6BY ܴOnRl#lك"4pSZv-koF'aR5p71݁k㓋Ԃ\OWaӁ;pi2B ܭ!jt[=Id\ pڷ=MG#>\5p-"[P6jN\CYibҼ}2Lf;p%BY smvjoQ[X&ZxW#/؁k~Z.Am&9o/hL K}[F(Tאeu \/ \#'F\P. ܌Qʿ9ifoi eteۅeڷo.-\1qsF'pa-\(;mb#1pi\o yido`w$Qt c$UݷC^ڷ q o s ]P֝ݷvN8:p( 7'Tʄ qjTe(ݫ" q;pLK<M%Ӻl,jYpϞ;Ξ|rﺃ\_π?~ {f\|WynqA.a.+pK^x+Hpx_GKR7< v~":p|}0'ulmr{gπۺs|Х4vw1KTrF&IGp$D"07AA$BŸ馛p%:඀b[ZUX.A0K;\j}['?}N(ܪPޱvҾ t ޚTe0)[ہk[U w?ĭoijr(0Ʊo i.˜*>ZmhݵV-#DmZX qDnFbʶ`xkڷ|ּe함biK wھ ܪB\:\9ƉPľ-Ma**[>UӬ}khNpمLdb> e2yvaD'W-eطE2;p5>9[ۃK W;piV඲oMfc \UKe/A&nanQ;rn}-a+0*zp3ڷ#ZNk4mfUjN.i߾]n[koGowTX]#W \-"ك+.o+ W"GjҾu{p߅Q.Vn>~FbmqUx+;?|V \oVǑZo.\p~J:p p+x[Y]n[[F(K-ۃ:p n x[ߺʅ}Kx[B#xcCw1sg왳C{ϡcgπ?~3?CZcfA/M |?ߧ.yY oB\oK|Λ|79¸8 LDq(Ltb$a ?H:4r1)?9?)x:ckWjZ W[׾O~ځF(ޖvjmlp}RQ~$Bp"B%ȵnl!nZtVcЁkh1i p n-\2Fk­nW[K?BYm}k$> -m1ׁ50pekV1ʕe-c5ftʾ5PNe'=U(ev*u#ԱpSu\[(_4ڌ':Y|EYF)*%ȥd qӔQځh1ʶkNw H]+t샸NeB-:p5OE& q5FY[[`(\oe)5υҼ-[3فe1ʄ6BY-\\P\l lDe|2- Ҿeo ˊUDR+Y IDAT(g4p o"BUf \ke=dtFF6B&. \k߾E. eB\Ǿ%[ZoCف+1 p><"%- \Z;! %ĵ=b.ik;per\\eY 2p%BY-hQDŽ(Vn>t[(+*[F(;ޥy[طce5pL_1eOD(3Fg>g>Z:-vΣ^^z1f3%؝m15g̹;!B}gπ?~ f\H<}@̄ wpgV cN߇IJ`_G2\ f |&:EG10V9?π?[ں }>Sx]ڷ\IF=D('H²cq0I!I(=@; qq/3q;eߖʄlI nuYװw¾\\ܺ;OVW^eetrl j|ߊʴnZU.MnKx[1 V S'T \-:pU2V0>5Speʾl@.᭍QPVF)W־BeҾdpl5BY14`oejjr(ooC^u*Bׂ[Ohט"B4pV-\7>e? ctd W'dOFiNwNE(5pe[ٷ¥}['L# yp;p+e.5 a6Fݷd#_o˽=ҁ-w: qdͲW#dv߾'Wݷ=WZ- \F(;4qܜ pVmсv[\\'[֮nv2Fy"B9'N۷ 7|\طo \ o*Bykxlob;[ۃ+16J [kߪvj.['k2-u*dg;pݯя_xֳ>o~Bw^ gsgπ?8c΀{H<W;|qãˇw! + w2ra"} N&^@a'Gq:s'34|=|e>})][ׅp=Ŭ]AXwI!Da= pEnLEx<^ti?~ 39|#(MO1|F ,f 'Po0SoQQk^k38wzgπ?~ ̀zֿ} =q5xح wvv'N@knh\_[8W<\<0W{q?Ctto .,~x\Д~\Z=w3gΜ>L?}.0Ww q]>鋓#߈ݽ1(FGAA' h'$D)7C$n("qלyg?q3goyg>6h6UCfZ5[,--,fgZ8s:9{'7pPzgπ?~yg\~΂Oj\ǎqG!|) s/9:܏FG\~ex94䠆``Q?6~ |=3;ķ9[j|B\>xw #IW1}v'FHCWct6F/0DMbA(S' lApEh]$0ЎbQ0FH7\F;Lc,'!8Me1v6??h# b,!6ea(߇7BQq;@;&pAh.Xr!^(@EAv;r"`={9"Poc9a;}\2_p mlaPo8}"nDa[nwD Q6oLj;o  $h'B>b_"> b\QW>t8A''4;H:1Q&:=$IQEItkz :.t;+XMb$*z*:Ide~n.V:V:Iz+ [aee++XYYZg ~VzcՕ!z@ {} Vױ`bm!wu-l?Z~k5Xl`A -7M6%` 뫧aSX[)l :60\pMl 0\ob}46ֶv M7O׭v461nccx pJ~+ͯ\46׶v=7s[Z;mZ;~j^%'cilob~N )lli\ C^*^il 7.J9뷷^OAno)r1,CfF|N47`p|1iolckpk, 8oqOyXƺ6뜑u Nap\~~u ؐƀs_ǰ>筷`  1 1\iV>V{~CwX{ku V,wj~ HV]jC'YAuw+&I]V}/f߱.~#> jw`w;</ymrR2#,/`iiLhci$N.XX^I>˿^2pr~'qr~K;y%,ͷ09/a9lͣ57"N6ZhΝD5jќ[:yPkjj5m5hΡhi۬0l9D6z=q%>5gq玮/߼?~ 3g]9ޯ];?<W{333bfN 3}å}(eHe/.>ﯣ#xkx A gAS:rmWr]okf}}4A oˍP&ĥ}n6c/E؉D܂N!BI( >-ˇׁ%=(~t^\GG2hP+;r<` ̽n>wπ?w s{}|[?|]]!}ݽ={b`vDga%A]#Jj$&aEDRcQܶQi&0;ic9*L]~ /S1gb݆h|huJJi(.Q|_E.* \X;~ -^~6m2hҬU6Z,6p vli {e~Lyk-p~^26oa4Gbm7,Sб|/{mY`{DW1e1)f; y?׉u>޴xmrLQ<쑀-6:Aq O o-C& @]oZ.n&nACKJ*:.zV g=ށl B Utvޮ_շAo.XmO`*vu\B-ֲ]iK5`uİ>X'=%0l}m[LuMbNҔXؐ4ilikҞ$-N-s'ºذ|6UZJ`X}ڻWYlb|&^[);zZlQ4wi,VFel.\=[+G6pSLU~~&Q^U5ry[8Iz^i~rYo?M! Xf'T6*l6Rc/0Clx^ {4Ӹ=pOzMmk݊kڦU>ޜ7^8G}|QAXmbmm_x0& ;2Xk};Zw]^o }>i`w U 4WevXX"t;اNX| />7y*$`ZAW0" yГ$w/M, i&Xm&O,X@e6@{nD8H@K s8~!ZN.E:4m1G$]#՚\yr[}kۺX-4 gVmZuk6g ڷ3afbKm[wwW{'3e%P6E0b59uIͮ5 &^@<51<@&f.E c@l 0V-Ŋ 42pD^ f<ƏB>[q&dP`fʀq~2Ǒ|~g8o .{ĸ$_ uh'-{37lL\bS3f&؁yⓙ7A, 7w#o3,>9öb.9` \4#K_H1n[Δ兒';#Ry@N^.F %skap(*M Y'fiKk,,:y5VUMUĝ/܉IU*V3MsQZ2v2>y%0i+h]8f9f)@m5q.ƙgZ;gpfjf-lmMMk['d"oy4ggX΀\4U3g><'fy:Y@ZYP]‰ө^ Ӆ*#ߜp^k%sy(cb-Nl>GS˙E( E J3mʜhd>2`a݇Kd[T(crHa߁:x~"Nf ;N;)>~ Fh+|!>( = ǁE(X1@þ/냡J ,>cޒ(ձ>qʝz=.ظu=uz= ]};޾ܵnK.0vg]V_=@md;Zk]%foOVKۧ6h@39́fҁ7Q)p-?fg abғ|nK|=V6HEK|3 7q&} ND HԲ[kbHd`fbAv",ضˌ]@-_1q'6-;~nk* eݼ;ߌbX^l;JCn(WJ_n\*!R;KUĥA")]7. IDATd@n1hYn\$*ںr%UպGs |t|r[ 3c?@m?,Әɫ#(e"]_E-kbօKIJ=R= ?//fOZ%{N.`NE rXԚ/ZNXĝg[Tr伮UrKwK'U,ml Zu&.ɮ-R^܂@tiG\OgϔD)w&.q&">( ,AP@\Kg@88w ) twQݸ06P8"BܑۖCP׮44 >yװ;Rgհ?֠ 3= "y`жvɭ>qT.mRVπmG=:q]uIdfE&jwZu::KֵҾiG=3y^_l̛ǦyӼ/́f4sx΁տyI'yX:Oۏs>]uݧ੺sٍwZ@/F%.<^;Q{kz}:t^վ``滮hcr~;VvVr}']]緇 >8>ߧveOs$VEp%M]|rj9`]fݷ@n,7vض{nDRbTŘ!6Xyp(ՙg_|s泭xg Q v"a"C{ +Ďfʑ1@`"Gt Jb[  8%(c`=Fؼq9>9 4wW_ ƕ@cIno붟h~KL2}fB󚁿,1=*9`mӃ 023fl~L(W{:82,Je$Y*g(q@j)Kя<ʍ l] \EZ쵨ekPefVs>L@m:NUK|ƵMr6Y-ݺu1QV@eQ56Tl)Q<ɹmfj P,֕[5@Fu |ňĸ]JiI-}S)57U\5s~ظt$&,\@/~Xnň_U¬;6uʓ90a@. uPXek*@@L]1V*0 ={ 6/0R-.֭\-`2O4/vpۿm%pK1:c oe'֚xi?li`(l em Rm'/&9Ả얛6/7TY,7ܝ DǛ\nDoh51k'D3"˅^.Z'󙩉G.&*%]<֕<͕|_T*㉊[N=RXl2fADrR)#F6,MxoI((󖓋8#mN|C mТ>t~3BϷ߄`q L?1@#'tWy;Xc72s}]ߴLD1r}F= 9I`#]c&+61Qar#k1;GM r ]b2%YO3gO?qY6~l۽?\϶:lF~Kj2m%r={hgbގͨP]FbO1f1/v5km$R0ö48n ,!1ѝ)Bwf)Qض.4d"P f$UD.J--&Wt'J n4JDrnM&K@Ktkm]\j^1nZy91f%1ǵ̭ ' rzN,bR MZzم[O i ]ZtgyE.}  132<׺n7-&3+O %@p3kpp1⥅ h`넮م=_☁$M&v-b$gj1z 4c_D[] &+$5Ld'iv{ր3im3h7ox8cғc[T-K-}ľ۴m5E3/m;6'1gͼ6NشycV-fu*ejfT$MbgL,*'ډ؀[ЃN\y]g!j" ̉Q>-KM>ݖ\X_vMON-%ҘBr' xd.\M|'+%;nt~{qh (8 k}/А1mA0hh< 4o}\pkFP^iY;jD\2OAj;0#Ŷ5hmi8{pA[,Vܖ&jjߝ֚:-ZubONݧMcesPy_9́f4sx2΁6|ͺ  j=]x3 ]yi:ynpuw tӍUD859Mb3#3g49oy_9zWۗ;..@.0wrr[.+x{''uC:f@9`[ggu@,{GT$-=uO}ֳ >yK.5AC6t{hkE`ZL13pIW \'!Pޥizqu57K.Ŭ 06F-i:Yll_g ;w>3w{b#֓._?P|/GɈ%lOWod}Xc:nglܥMz͒1ceX(brtMvJ|r9Qcuۦ+a4dm#n#%dJZHm1UΔzT:;k6nY2UD\pN܉d6 p(ML,5Dz-Wv2׀wj3zm4 bChnз2`Kw.s}X<~jbSrfUX]o Y_Ko.ѿjwC5tBBD7NٰK\/}♦Dy@!׀1@Iɖ^s ܲ/ \uٸDH-[x螤-}Y K/ 0۰{1q7fMw^c k@o鑍],YZ[6jfbEY ̵ h?փG޲9>'z+1@o2?%ޠCZMrmc`sO@-Y̔Ou󴚨*I4ҕNHNTg2;VZEwG\˦?@fq&J> :X2N`|~#]dNI|/&,偈e=KRWmxFy Iё;44G} 8LЗ7oslH[oG:֕KdrO#nn\t5 &3P۳]X5];m3k=kZozKVG1'v&R֩&B9dc/\~e#k^{3Oڭ3O>׾o^3ȶ69y_9~ǼǷ mחM[o?v/럽~}{bo󈮹F}Oޏ}J#{}Tzп罺uOӳ=CYE(WeТq$1Ǽ%*.1atD>3 ~̥/́Z@d{b=oF P gbqD0ac@We l;LSil 1HY;*6k KxbOc[7&m1}a /Xٰ!ˑ<퀽3{}zk#ꝩW{f"C7 ,@G8;s#L2tk 6ߖXe|2Q.* 6n\ >IBTv:$e~֑nNG"mm@_3otK3ju`a@o8u܁5[gIap'oJX{u:QFr+/9'mDcs2H\MRa^?bG~!J||?@ĵz:Srw8I?CDwqј@0hia=Ǿ6.á_#}_@P}o]v[~o^n݁և#avz} 3R3Tzcn[6nKm"vj꫽}uۻ ض[-״.jjGP~t^6́f4shq490K@v~+ r+[~uß\qz>wZvtu>8:{E"[$"7TEJb:Ofw(JB=㬣n(g?7m^k(HA(WbcD.={KO-/qc 1֭a D&fDQ+NCY<%4V0pp1D%)cc;b7hekJn)ԀOVʊT\I*rqP - \plKe0"5IKLr dgR}9be6beqDIYk^C;ѬjVܺŒIJjB(pۦs͈>&yiN+l]l1FxfYƴ Xg̈ۥ H_* hЈ ĜksD8;и[볥w9'tv:[+]X> Xqm}9='|Xva1'ɟ*7,M' K҈\lۈewe18tDcp@jclP>{_#j |yHкp=o(o87L G# N5yspwG51 v]umu ZXCumku` ܶ}ujuZZbRgzKku;ow-ng}]Mnspxpf7sh@3ś''ʶ'Ibv)' vPw.zkoX_yt?Pw^t˟O!}l}ugWw粅n6~Qן-\_Gϋu%3]sn8] f߮ 8ݻw[G{B_>)a=}ζl+1q'َf.?qtP1oWy\[[m_?u\.. - ߯z-A>tm1},s$ph?=H ;팳'A6^X~ W0k-7Lt#vܞKq>OBmydd)K g>s^x:s H%-8[,p:y/Z^z"44b[7/NmicK^߷f@m ?)[,\"ǀppr IDAT,b7YGl\o5>8O"ЖuX^>@Hf~:^^]-~T~fFJ13X]I5沋E&64hkv7wd',6Ťhsѥ1v[0+e,qT+ڦT_/A =u@c dĬ⺮[K?nmcܟBiWӹA[E*eD-e3p䶉qBno,\<-vz@z'D)cn&Rf"abC5\%Y"otQ[Y?FP5m}Xj!»O 쥣_@F%-ev]Ύ@/6Ovϝ%j1']:rǺdwk6b%j3;^>㟴c|j fk|WkۿZ,3V>_~\9q1@YncT/0m=1'f&cb3}`6ٖj,2K7 ˎfN40uyT儹Wf2|v343Y͕WSypж(f<7u&nZ$*N q)! u[ 9֭u@߮gF6`b?R\N$/%%y^$R|- 7KnX}?4GC^WC< zc0kcÎFz}@,@v~ߙqI?P XKlz]z궱kZt2XKmW.KKkYoz[)Oy]}m<nޗf4sh@3Os5_ys?^sxթzܯ>WO/u{Xם3't8m[{O^ӑ\>}N;Sz䲭l3̟G6f4s` e_2nWxemܕ že%Fy|7sϱxS2ĥ82K" KzpJVFƉuwF@356G\7 n-28 ~Wځ@Kl+x ۏIwt>{N{ϙZ^-׫( %ظqd]DO.#FXwtTXLV{=z*+Yc)l]g\fe|s@7 vۏEll;zK2boKؾƠy˾J-N4^[*"8 g wwf_+ΈWU`.N9-},K%AġULZ ]:o,S\1qQm6^4m7btL&2VB_Fl򪗓~\1y)TU0[i;$b&&ظE(c(,vhJl5WYUak PZdg1s+_KkQ͵ L213bn405K0ے]L$fDӉK/]ZLE-ohH y,9[@b m[Δf{wzyt:(91˨aHwqe| ظ muQD<gm|@1L|r|XwۿecXGwoXs~.v15V,жߏwkFLAsgn2W魭y?.^}vW&B %['!Xc}Ni<+a=cOHhd1@cv8r0U;a;ruHxl]J&x@~OAGNWÎ~.ikm}]mуZQRwZK6.ۥuwh߁G 66h@39؜ m6s`yPܝc u?\;B[_gyzizϫNy]^ݓ?Mdp@HGNWg67k\Ï9PC ӣ<=yV^d>sAܕ r ]\[3pQ&>eK- wpw҅KCߤ٧sts'43N-N0N@78 ؘilg<{v.J􊗽r1',7J0m},7,&㯾*tD)'b?ͷܴUT|ͷj1trݏ88cuձuw,##"نD^|u1:C(֥C.g7>l?.]79}wzȍ Ak3zq;?ʺYr{ٽ̥߆D뺖SqK)Hť3o31hvբ麌 }Klre~\1y^\(+|ZERsRP^ܼ(SeEa`VlA2iKTyEU^frIme歋K΁@*Xظ(ي;ќJpf]RvL'.nRnՖ{<=7] XңJ23bv;>9pb8fM0h9ҕg i\"خ=Dd\w wf}{5miQs1u3-"wkcf]ĻmXe, \" 35q!L43t.KxâߍGUؽٺtkqK+zwFMgX^^7swn[?2ݾדu[m?n\n̺p'Sw %NO9iu=v,*1+w')KE&sBAtطftVSDy>WNtuM^dĔ׮)r2ٹڙ矓<8#Ke uP œ:@,=.}Nzm&Pˉ6$*إPƤ-q#^ӈ17c c"{C ܑo7pi<7}C{Fzz}O]p= SO2Ȭa;TU.] Ejj:zjwz֟6붣ЗֻmuXʺim5ZsѮVK]ҩOӁy9ܼ/h@39́f<@pAXErr1rWOx>{@םeˇ^,]ozAӟظ 砧{u{冾gXz^mw3sv;0:<'ky9nA[`- w;:y nOfYu~,BOxu %>yp1pws3sې[2&RjQXN̆4 soE`gy6)[t‹./D׫~CW\}\9f%orl8󞫯$H̀%pyG \Q'>W]rz+_};Wo%*kE X>1gņŤ%ٓo07Ql˾YG߬-G΂Ʋ v:<>``5>6pl] ^ncbfz=r2e֕8Ўlf-=D.N`3p7 ~30D |tb^6"`<*̪=&4XJA,2p[( rЖ\+C7sfJL\i -X\LݴTb˜)#~q4xTwDXvIJ'8˒n\`Ui9}Emv!yk]35ʕt$Wt>o'%&"s$_hbׁyiϛTl'Q`UQ[Wyzn/ZZ:m+M7܇yKG,&k&Enjn st2gl. YcptρnُXDX]Щ~af h`'p1l;K1Ā( .gRϭ+d@?&7:1ͺ-皗f6(;.g8/S;9IU㳣?_2+TQ\4=EI>SmW*ӉŝXY:YwuMmz[yzo=KWI#}qs7>Ζ#\&/?;msF_j:H9╿wXw/w}=v~޽:x^.{D `]þyOܹdzowܝʾ%Ny|׿}zp{nü6}u7Zt2Զ en}oWOp~Сste@BQ)Qte , ,ZK ofqǀ@>)3U')_7Yl{5W]uP1݂o~ @Ѭ8<}[mLrN ֳ}s>%pB@*}}ucUƴ‘ cr> VcA}z"["9[Gb`c$Jخ;Ǐ;2 S3{~^.>^[WJ'/!+|6nc:Vf?S \,2P$ߘR2' XdCEib-Reps+#d2mBlr!A8Udfr;ݶ9 'QfަJ kTۚe27@bE%XdβJ [֓XX-a^,Fn+Lm ][lZuPQI2&VfCNímXD)/,vRn0,-y:f}tөQئS+M"gK5WlK`$=ٹ)cӊٻ\[ ҹE,oh6cDc !;הambZ{4j9và'/0vf`@0ccqڰ]vZ|ϧ{cǟ 2bwpDIe1`74ΝbJ~{QUπte7bEX@\mƶe_olvd6~EX[Y*>㜌峞\w}NDD1/,q"('6!w0mS6DS 8ŋy$~Hg``r2iD28R85H74? ƣ]8r$?֠O\-`YAcP>!$`_gu?|\?3ugP e\uh n[D}x\Wط;c@[.\-\ }ϵ3pP޲"s<:x[Lj9m-`6R *52Ķ @g=t =}4:uHw ovHJbYiff0paw e ͜>;C0,AV"=~b @9VGS^q ,~#b-͢әH(c6E,y(}~jQDFC,Z7~qLdsk=@#ĈsvU|fOB1xo#Tn bGDb1qܑbY2RسavԮc96WFlwNRuZaqRA\+#f9wi.2׃ !F9O'l|\rJ DU5,WiQkPRAq*@]ĿA%@Ip1Uafbg!xU.4;ѤTi톙f0 dbˠY9%>#xzbmkЖlWn5uZփ (vcQxjAzNdD u$Ksg\غ@bf,`..2OP{5eK33'4kv-ЖׇQbZt|ftt(["m|{=nfuһ)?l3`_kXgo\MhVŌ6PN=mm&u Wcj>5kcQcc: {?&Zy9g*:D[rfn:9ob5>S[aUTضD%oXrUfgBYs7^l1yg[:+^g3EV|f$VtMNȀ|1D&]}[lrTr>fv $Nٝ ]R\~ >$ ܾ]r&fz~qi 'aL$b^,oh<4+w\@ֺkCLrܵE':pڷ{y^sph@39́fΞ},袋{'$lz| u^3E:鮿gc}{~?/ۭm}lAx kd$ IDAT@\O5{utבտ~.ߪ=3͂3lar`1~$ f i!>f]i"W}Z?~gr焙ћ?}ծ_{-: /߻tǝKӟ-y}~VV[߻OCgÊmn?.Mee"rnDơ(}kt҅:M7ޢwH\=zK.^Z} _~ W:G4u=~Ҙݐ8dW^uE[p0%9 ܸ`&m F.oFr4jzQ,a,.iEK:g]طtbCϺ-9Sqv]$sl0OD:'l\+6\|rH2.";v ~M zk@Gicط@ &Tl~%U1t1y#%1-s[o"S8\Ob%ijYuI8#5WI j8`a%E*ܭT`RydҡK2v.ݙ܄ڌH[3繈qS,@b_鶝1e;ɦJB56'P^O4*3Ru9.\p1z]/hNt\Z[L|C ZlrDbN&ԝNjUX+s;8 Ŷ4pGO.Puj,>ؒWLN,Nl\3K1rf뮢y^1F=H+TWL9*@pki(ޙϵacan@.ﲫੋpgH tu`'`-bS[˸aw~t|6LgXgu>7*f|[؍϶ZE"ocnkc.sM'cvۏ)Bo:omKw ‰Þٱu1x'&;oa+KD2sy底y -v1S q9sݶ̕Ϳ8'/]?{N*XO.0i+<*|"B/o6T%Kٞ3]&"\W|_aҧ]I"ije$@.i JNh\Aw^̾%vNq1 Gإ'wE vk4h8b=3mÁ({>Fj{GF: tXݞݎ-N{WZ`K,21=m[ju:znNKup;:KbװxOԮNKݵ]څ%~q 6\lg39́f4st_ʓN::O7jOD7pnczh[?~ pW wu.buꎿyn}yч^w~zor_otS}viC]nNБxy`@'C,hzM|y<7O?]zta bþi^#lp eW\W7޶ r?t} ½wr, .[ oOߢ~F}:+N 63m3*K>Lp@8K|ޥ0]dBr`(mmg~#7,n7&cJD1n(n׷ʕ^|hŦ r=̀N $xز.0x| ݀dZ=GrH2nd$mO.ؙn،Z]U?.P'p dB`U"x/}lcBMƶ w'ҟLT3sS"w2UdfFYO#ggtKp& efm-.e _b\y E-煒U?n s0'MZ @('N[ /+77TA*uUF+Ke85N:>+X%1\붲[:Fg*'s倯xZƙʙ5qS3.-Fd-Pbl7̸eK,2zqX֍KT1]@-U;[`-oAX`b5+$\еXP?F:aE+ӥqͻ`G₉pcՠ1Pumhm)-FC8;ÌuxtbfuV00u{|-pv9>:s]0o{ ƌ&wl? nUf ϴXFSk̮/k d'V`}˶~d4y[g>bU'N];6-^zq5'&X-`J{yUt5O/繚<ܒu%]͔^*] yQY96/Uu9ɂ(C멦Ϻ~ۜ?Bee$$mǞ[${ѿ](͍Lb'3HDGK*໋O \K0;>q,i`"%ff"8QiLif@C?TCOXHpxu@;p0p0Ը?Vw@׭[Ɲz]O~O@~W~_nmݾֻz-zutvnwkvn{ "Fy^;]=״jiWkZ:e~zʩM#=<9X́f4sh@39cb6uE];]A\ \[?~u:a%ilV-t=Ŭ%5Q[7 =~ +5:Yfxv NI N~un٭@ZW_~Aj(_VC _;}WO/r\K/L^z^r쥗%/UsX"3Ŵ  B#ŵ 0@^o#GL_;ٯ9>^ǎ}qXf81k91+ ^O:{}@\'R"{K1'.E<(v)ubnib3g@g(pta0ql#)=pbn[_l._{mݹ:yw?1>1yfDy]o7Ngm?u.?0_ѕ;TMw{H1Iސ]gb́7xwuScc^mIe[( N Ny':=)[0 ֝B}d鳵$  Nmn)ADhxFk*܋,n0y.fy ƾڎFC_x0Ѐ܁'p-qHP@a_AΨ~~w~#wa^^ngۮݮٹtv:}u[=ݶtv;zZjuZZ(e,۶-jWkmM:kjw ضZjm[?}6\~lc39́f4st4{z@nN;կ~-oxtusk^}ἦ'c l\./t/\}O{>3>zr=ԙ}~>}k8; v{wT}6:No N{ 袠#4s:x,` A /1we_]r%z׻ޥo[oW\׾P<C#0{rim?OOs8?+[-qK.+X ]({\-ɘ\bo'c~W\3?CJwfWff;f@ZTDx\ H:J-6A9f'$3F(]TH죃5s Wof3XGۿ- \ }~Vaa?o B<W].s,$PicX\N[ \3}e%697X"/VagyKcIwK]b>x|^۠jd9>.YA9qm9>e̤f{0`x]NK %B9}C?$K*"y!pBS-'4Vk6q'ܬ[a%f扛1Ǚ]Q"*cfXy\6.ݸسt\r;y4ۖR՛ҡI&--ʵ0\ t:9kFnNg,T9([ `ł}X ۩&Wt҅[ͬWފs3pc.̐`My[kbؼ G\ޛ[vuj*I Ӟ3ݡx:ITUdPllqnfAF"$!BH $fh&ZV>]gREU~s^{=Ͻ>)8M 梶E SrMv96r;m,Mk Qwg)OfkYp 4ԽHdy1.9uɱu¨\gڹ1JSE{bwO- [wx1Pn95/^0<\[2 oXNQ:31j{p\1ךDj pj[jmgtَ{2QzsǠmg2Ke`-ʽz],{;kݾڽNt eytha2E.-uPࢾe쪃rfNf%nCֆ͆Zlh#}29-?*ӭw izu' 6N;ݿVlwK8 xSrÇ~wܱ>ޏ C\2roz'ZF~+O|G/z#+]+3qҷCwfr?g¡uu<ҨGE!Jgwvgn+ؽ9Q*:$}wikk.촥ӹ/| Ci߯dzV3p2sϽzW.-?mB F9\-\o{3pP~qtlN\(\Nn77-IZn`n&_P~`J&l~2 $&ө._*S~kpsX,9dt+_:>RdwZ/IO~M:ɪl+蔻3m#I-.4Eeb{ $#(NPYĶdY}8[b<\Ab:,m->=?k돔qs\I+HsV9jbg&.<05Tg(c|bGzpkiv\ii6CF2`.*,Wd [vJ V j9,yn eS&euV:;p@/;M:QZN,3VNkee)lmrTN9פ dMBD.%ׅeuTFU 'yl6@T s3SVZ(g\+ڙ&)mQN6%f ,lgE;v5w:%+0vb(y NM2Qd;:E)¦,E ikuKkj 5_rd3 dEE:5,p5)uj:Y-Va2jW,-b3Ժe;E khԳi kbu;ԫ/&~6\?/ߎuf`f 0ht֟VQ^@ZSPsO(2Sw|ϭ (xMɽ%rmӉ9dm)+mU^XwePTa N;F5N~sr=+*cn)-S6N>5=`/3)xrEd{+y>u6Rk@Re\)r"qb1%ٽ]s{(. w^̥ xק XY|~rBho#E, ,HQ0T? [e #-w!JP^_#= -S`@HpԷ}[}z]LzNm/T]VoVTVT@چͮ6(o`Fpd^zdmt=빾6n6n6ng$^(}_%E{2e- ^eyUUzckx<^._^(|d,~:K/ooteYGnd2?~ݪ|d_aoԧtow*G ʨrWd0X}]_/ըr}o3-4җvp2k9%>W!ݔ'=쨡 ÁvuuI>^gߛM{oNp_-aP] +U{7[ܳmL/)/zы!8}W. \ .[o[o6,#x맛lgumwE.[]O@ܛ>r3 ܣױʶ@YEthcl6V'*\ qR(;OlB}~_MWzUW骫^C7-~QeB\&[oH?or`e* cW|^y+o[?zĦuVP&˿MCeA`[k*(U`)jr\j57O B7ɥ%U˗^9زlޓן)Lvl0뿻,7`ZrlکWcWjc!g`l잍3mUM@% oTX'7;j[jiU6;em56lb6 QcK/TG.;Kt2-=1x&mם6n6n6n6pۀ;{?٧yM+r do:N__]꫗LoXzf /C_Ng^r,M}Y@ﭷzz_/|Yo;na⬖m+jܽ0{e;-*Ƚ\7/C]{R]ϺPz΃uCSZrH@{mzm zM|rU @E輸o=?.ޜN>q;b rT /}麝݇wh e-WϽe \,Q~1xK $;߰?Wž7>${9q]+ ֏vb}9rMFKak)EٺNv-vǨrQTaʢ :cay&E ȋz d6J+ɱYv^ɣ6Rkk "%3d3r|Q-)l;_lrc7AYn. 8vloQF ؚ 3ʀZ-vȑ),Ly.3(2^PZmZ5X65.` ].[.(>E U˼Tgnb<NF[+>QZgH6|&sl Aruzہб;:}dn.w x$w]ݞaM]u.snYO b/<ǖ٬]ɔ5) bC2b(PH^RṁW=L3YD;<VWN7;E/*a@-c 5:̹r۹M?*Ylɣ/?tsɬ{|&֩kSO;kyO&{lslcSb<5&e7w2umsE@F-Ś٩Q/oyȄ&Gl) 4-\/֕Fgy(T絪)Qk +Fr\9+% I2lQ^b]Kxm7D~c%'⫃j8V~_gr]96ްOo?GSgp*T;B<xSo<&{Ker|6psp e-B)p~?gciZeNUE1t\;딕!S.GO\/U|6YLR}_?(GC=)tW׿"&Q/YfXowu}9(xQ LO)c,Cf ))@g:< PMeʍV+G5Z?p9yaH}(?6v$tSS$Ȯ'הqaXr?LQ%3\Xecrkel-,TJ<6𑦅A_JZrph[)Qyi)L1Q28uYpLmXAXlZ*-Fy[ro DqceemܺLMi[䕲 ʜ܉Gl+@R27,J&0hT&D{J۱Aܪ0ES[e0`*-g9[ۉff$vۢPc,knbL\[(=%ԬkY;ݹfyw g@[@VԜZQ_Guy@Fj1vgIV KvPm pzpFkw{>5h ֔ 2a ^, Vgղ_M- uYmT@Q'o@ s;ڙmt^?pٵw`uJ[W?ՏroQu9phc8u%6Xpsh1Zc T.@;(O6H&d<6,vK(]\f2rMuN2dռeoYƒe81!3q]EMrʽdPd peYYU)=kt%>5ʒZI1VZ*Re*e9"SRn.5{*7'nA]q)m`D%0 ˻yha(3>ԈQAe2\T#*G#}# =@Á]ݞFX"y{Cu;Cu:VvgNn_N>7;ڶZu4YvNvS dn6*ܦͶ67ZjP ]rCu%gI)~ܖN9a s~\+p;U yȑevHM }+^aso}yykCzy񖷼e^{q3I'rW~,++e}>'6U#,+߾TuIs萾cӷVTŇ~=>d!]zt1:Y6={.{eNcֽ5Q'u^ bQw_,o e (zu-|u0 *g9\~V(EV93~__uϙ\W/r~߀Ze1ʯr1]ӏ|#}lSze%[>9+pLoɿe/~U>.pnCw3?s:~Rbfl,Y;r!V{Xj0ꢜ$;=:pʋ_D(K@0:|]@G<*dܢuvۅ`,IYEiKrl,U%\1vUBnH ֤fj6 -- JErb%-6̨j--m^檰].jMv@ Jbb:S^;h4."N,-rbvai5-*KԋL(pwT[SvJ_T(djWS@] ̩rE)9.dRnuYv ^ªwS&0j %|mmO˓]MM񉊗; SNwk`zW9VgCO.b0bTM3 D6~Be Ե9^֏0_ߕ{k:Q@s}`/?wVɓ{AZX%sڪEv~P6-r+֑}Pgs/ɭɺe=mB1jʀ2wUM&f/w44&-y5۹}K,ħf\ 3Q\rxƚm󹲅Ur͔#*Scd[OUdcdbs)q(E2db [{L2Z>A(,$X!3wS&A(H6T ȹiQբ .9 h8pY6u Ocwg=nThl~31e{Lg T{U/e(\-?n^_[Pn~VU{qt>\ ~ fd} O4U^8+On{K\B]98O޾n!\(.># 5Ws~hS=zX[;܏u3^?8N^,ls&qcY{ˠu|e[nYm.AosMozIg*,=zw}N_AcsAYB{ՉT=QBp˴ܗ[&{ ]E C}2pQz. \oQoǎ˕Z-$ra`2QAbsl)BdjԲL`y" o@3L锝|ƞi`NQ0MZ6`/6Pm(EuF8KD-2/[@29A2R%fEql xQ/]q$9d׎86cళAC0+\]?c bO&\?uc+L)1q8?L]uv(r9W;'S|u9a(2X"=>Z-ӀW2l@FJU?69,eSǦsqRv9 @a++)mR:\L{fZhk0\EY++&*PصNǾn9(ld NV}c\n a˱f:1hJ+ٙl Bݲ \fL~-6(Rɣ-ܲkXwj 6Pʕul"[.vw4V?ˀZ2YOXL;bs9o!4a#kY`'֠]N(jMmD={ƠzN=5Bۙ)vn.Ps -rKLxtU8N49d֖=` 7uVU+_Jf\Wa\ד\j\'>vլcʭU5\c fiT~vgc9շ u/]Uz eq-wE*\-*O|+ f|"رfU"źkj$S-mj)U|J)+K%WuVtu3Sw50p8j:bX JNP=a?dZ8\@^ɦ@F ua\cL)kC˯%7DUFip.:,tQjŜewI/[9e?tqϜ : с2OD7qkc`! J,osNM"Z #[~mNo@`@?T䧢e.5A [*c EdEIX(E)EYkWƦRE] pR8UdG,. 2f Ţ8ptܓU"6Jf3:ud'"7r]l9ez+Y9NJW?R%X¢ڮ?l PZ:d13Sa L8{j*mB ]fd钝ܦ.֥؜ 쑓j7gK&R9dԹ)ə*Yb:NArlQQZ Q^glĎ Eq^m*rnuPaԁ&9)*JԆ|ܩ9ñ* jŲv9ܿ^ Dr,z54JX[+#\YT.=L@*=HOgݪ*/|));_,\`P]]w*E v}{V]}^=&@?V~ /w_{z \o@NsVʀUe-%ԗ \K. \.[2p{3{cQtx'db%Zle]EIXRzɣ-H`fZ8n\,YFjQ9aaPeb] !JHi1Fmnlg̀h @&G60*R$Ro ǁFu h$&zl9FT'{ẖrH5Be8\\FM;ZQޥ`0,9>'l_@E=DykV1߱ڡ"v6ϩAZ 4ua}5#2e,ˀVg<cMɭ=YY@-J\)h9J\r -io+(pNkX2ؠm2SfYmiXʲ [h  P`*>,r(U[l[T]0,UAۺ X.M8zUN5)ml]5G[=춳Ur{czb1@Ť)w4Òrqdޢ~’;֜ [akl(qgSS ̍;[9 TM:7u嫢Ƶ|יO+cVSm)6wG[ÚQجw 'jf*<jy`)nĖ {@&6E,ШW,X?J{`,s]M̶yfemk݋5rgv\>֝Et2quEA~? ]Mꦽ+@9mr o2n@Mkmk(o=Y[4@k* oQb9*XOU2ePW Ԙ8}A..+:ceb{&S,~3*%y `ޅsh`O\(f06,} @: QQ4Aa8K..6d2()d 5l#F,sr{=d"?hkXP'w4hwj4vf`7u.JNXSˬj5{j7jɺlڒFsny-l_K\V};m`m`m`m sNTR? 1yP֢6t?O^Ǫv>/}jW˻]{o^Y,[?袋4 ltFCKke>onl衭#!}{1yܗRrH7(mɩ5`SbSe&`Hg:@فF4H'z EQdQ5kdLa+E%EF-`3qɑϳE5MG%freQX, e4rQes20{Z-;dԵfte:9pܦگ~T) 8^tkh\}̥((pl܇t7E-̵wy8o6d QNg:gX`Ԕb԰H bdn:Zq[? 2\i}` /X.`u궟O~=~|p\+_.GZH,TFA lکQu;1W.݇;? 9)9[crʘk8֘m{tlj[g5o˔8ԲmW&wAaiSksUŶ&% إӮOY@QM>1% (Qٺ*+JU)dZWđJYU2 ~S;p7,q`0 \-n@(3[m0$eTah*10((69r``k6".j\H!5=u=]@ng^na^g`;@}ufm i5mLZݎmnRϭZ(omrm{wljkRF}誵Qss(7/PcK\#G.Yuw m` plv '*Ի7//m?eUK~~׵XaA)J??~}*|{ ~7l>,Z?q~ @/9yCl1|4FwZX+iӺ?}*:GO. yzrCP zua|vЍeݛө\N=COU xq3gp 3X=fT\xorǎ[c䓞>w??>pUл KpQs?<`_nV_8y:y(e2,A.v_k/{bwͦ/}ϿȽ;[?~>k?r[o7ܤw_]Awtퟲ ˏձW(*bD!jF>cL(F^"O?H?"7W,]jet[SںTA O JP|b3ਰ*(AE4^cLTJ Z;*T&@Un5)kQ E ffl#WoqAk V 6pXV?(00,[?ڝA^TV?ҕ?%j(20<^Gf)n2sٿ7@]g6mjl96؀{,`Q $hQ [m\"TߖK 6]ӮiԐ fJ.ٗdV9-TjSd39zLq;QEnblM[Td*TqP$UiveuNUR0.LU[`; e>zR[nlEDcVЩS5d@T"Zl9º'ikuWlrt_:@a@TۥvRBU+@YEm d).H*-k23fcc Ȥm0L `.쇷;6*ٱͱ{^EK=9\dZskqQ?6ߧ~arXTpF볆'o 縰,Glrk3@j]MT-3jv\Lsj6fgL#ߖlqfύ:J/´犌hTiQ.G@R^ zFbEA.5*Ǡ =ϳpYVvq`~o[#N |$ x*޽:SEa)s{|dC*7%L V*" @ R?h8 #y04EASb?Tn)hhERv]}u}:m:}qXn mϭQnmWMen3fG47@{M]hǖ\z\zd p>ם6n6n6n6pm` pt:x,jUU/8iG4j$_Of_WbܯgG{DLA}o)G,ˬڛ+p\L@ܡM@ke&n4;ڼ@5l 7힯Ej\`s=8Ѧ>;v+rVܮ>}+н9 ]U~^?9 h\-e0 |\;U'=I˚zmVa<9ޟ2 Z# hMVnX.7=yI~[s5h{+/|Ŕ|zp ?O"&?o/.ޮror@w\sMħscW8Ijy۰"KEfQ8́xfmKuNJXyD^.\VjD.P&5EZX ŖjB3K QІfL+]OACg4 ʔC ͜)).$tʣL Q΢b ,6GJDp8TB,+FyE,JЩwDQK՟+N͊Bstٺ/?$;h,̩S΢%.ˀjS=K%2/Z=zHy ? `3춹5VȺȱĕ+JI5ePQUeҬ2Л*QoekfJF&c++ܬXKSe}.rS&-K3li?-֮UIFSNJ|.ȝiBm91*M@Yɰ\Y2[`#Y`-<\`^2OW;-'u%߶iTSՀ ܼ%0P-3f*ujm2QgN5FAks=[6rajWӳMVGzDoF q=w{s:˻C:'2wwOZ~[jCP+ ?o S~߫.X}uO2p-g.sհu??G˭3K/tY;}}P:Kt~s7%Ky-^x \ nM[nQ2oQÇ>b߿CbB{?iGӣ_{HeƨMek87穒<3{lybb*[0R9A/*Zlw]P>eQ&e?,OmkֿXE,|C!ǀ]ˬ:8f #Y 1ٻtr6eH 1묈]a-Q+d @ZgmL@^ ,$ PɒQqX?,O%[:0J9zM)ā@q 'vܩrOFmFfX1 w Ri#) 8EQ}Ȕe P 최[:PyӶb-ɞ,2yn5rU]ȼdܖT-bp6dVYi9Y1Q )Ɩs -Qdh(n+9( tU`Jm>1E!]` s@cӭ+PN-vl0wZ`tґ#G}fk<{+_|Oދw_~;qw.~V]򃔠 2{!\Ο^dX5ۖeV\׃.גw=twȼz={}>/yK-3HYW.fȾ֒ WoKhk;[*o%F 1SpQ7}u4 sG;+.?HӸfp԰"]e 6|\ͥ<#[[:K, Szpª\k+ XY=1_TCNA+@FsIB1 (W`X hb鬙ÔmX`*}9-Pݢ%?KS~a@)x E雚2ZWS3F~jCGL?2zO&~;ϟk vϵyHph ̵K1vXHV'7%5 wٷ|b:\dJn<Ċr|KYʈ|Lq^Ls\ȝӴv6l-@/&ɝj-3jtEm^JMD4̲<+UM^Bu[X&JRErN rb[.*I95ZwVLTuҬzy[Oz,RPxa]ZE>x,5kmX,WSԹsmЦ:^v fTcM݋vJ.7/j`TLYte;dnMLHg;6LT@5XmS>2جɄ~.yONxck ww/'?,o*OUQ˒; n@T朱-u5^{ꉛOf Z^ /%3k@~i'.MU'Zxl*s,#hRVS*jgL4V@`írgGr>,/anwyx1P#j60dI-َr~rf NaQeUͲf=<07}X84h`N dFQh* Njz, cFÑ>ivh M}r7Tg0Poе&Q5#v>JHmT)m=kmr{`Vvg8TQR3-Ͷ6q_"l7l2]rS```o2pm6ҋ_.[[(k!!n6n6n?m` p џ}҉ H= ourQwƎy/][o]ҽp×;np?T?5\sz:/uQ *o p=텹^ Z "yUn>@OhOד[+:nגC? :vtEn4ЯEM(ڰvn|٠t_8ݛөܧ=iK {fo}tno~=ˀ_v?)w_~;n .~9>cpXt]u`o|xcE&dx߿\13\ꫯ^ {i5M JXwD@+&p2+pփ[rp W2'[omQp[o/uq%a,5%%٤jME :ujgRS_JXgR xEq&0 [|'_)gTngcCdyNq41q`kd |HiP%)H#X?2 _!^(gTM,<]rqQb݌=&JLIPΑzG YiZ ukeEk]a֝ZW-u8S[MRS ;;2wSS:g֥h'C7 +.rfsZ-k>R76/Vd*gluf{2l}+aͧ.'kl#/4[gaө#S~sov32ҾՏRoQr?(gҜ?Q(cY}?\[wmgW5Emvu줹]ۚTeԺSS[@U;!gفX2oǖm_5m2k-˸e @/sP.%Ȑʁ nX^4ϡ$$wխqs3HmNUSS:9+7`ЛZV6b RY\  /~Kxa7%}[X$Ge[-9P4vyPQ!+H#N  L;\oHFu;j 6;S6ye4hQ޶kSfg`V_nO]]uZ-uMV`\T5UFq\6;jon6;)mRnm[MyK=hK.LG.l]ww OGX5::Ug)*__;iG5믽@+J(3;~-I??joFe/K'V(PjW3p/s\~S{+e}i"wm4 AzyFԸX+-9G_k$l"#O_Lp@G(h¾ua{` 7S7*jG79_{ Qg2W\2ذ.~gh74ˀo>e} jn,\ᇽ'_}(a~=7 m?Oo|-[UtQޏ{c \RܗL} g2ڴO7c(po6q}- jF[_-T6KY,Q3p۾nt(iQۚ.P'|Pq Ş'o/@d]rqQ ^5eS >by=2R9Gm C9PK-f¶5eT]H}S+{VZ׵KFvl7ovΗ6jaO/gP;35?X*N-qW6w,`cnj\w)75Y`^zNō2FeoËd?형x۲noA½ږ$xekM*ZN^-HkpRdXc̋ ˾7e]PU&SP6W!S:W4G*RVm-ʆcY%@ܜ2d&J6;xBTRxRONYHZS'J&PxSJHDKEe(M)*>v^{Hj"j7H$Xl"n1> >s @89p@pC{,ۧmI֒b^76~-LOO[[5.e?z@Zb };K An`FԊ]mOLrr|^*]nP¬/XZ)$ZJ1>_RRWj(os?(cxڢM~+cKB]ξQl2pF+ pٺTFk^8px} ]hb\ꙟd61ޘ|!,}.=x~~3 eʢE }aۼ$2,[ԷYpX(s .yd߲rM6TA.k .Kq=z+>{rb)q:mwԜ:*IFmO͒$b] pp]Z쑝³b&j[Pm:%nԘjhJfr'`[.CxdJ|`@Z @J!g}3 M1VƀJP X4]\9 N f]@\ 4иRޔe;M^ nolsF9_kA_???,8?ge)d W>xӵj(iQˢdnhK6 kv-9uj(@Z!u[fM%6Xh_Q{6jVPԬ6U:e Uk4mpЧ&*Yz=6U3Kjٺ6,߶Q5ժUYzڢ0Ը>$a2P1Zۇ nk v@89΁ps ooNe{~+ö;A `Fa`r#jD>/>'w|X{#ۍ0߫\@.+__?*W*\ow{ż) IDAT5dnb:VB[v/|A>97Ak2zBM_p*,A9\? ]A`f.v>x^x.JT\rof <, .q$z^Lm<ƾ2ښw)p xX(?62K`L.6XWᾁ}20. 26P(pVf Ԛ<٥u`,E@ +el"a[7pZ PJ,gghVkgQ@akV huNS%@,fIlٶckdQf\Q0VNfQf̃bE9,K@ZԸ!c\cF(\mK!"uUL86Kռ=ȯ6&/M`p 4p8W!*Nr`` T~}] w]+C}Kh\Vy./aXN-wP#̥يrW; c0uU52@], `=rU vp+zkoRFn.ce2Û5$϶t%9X55J v@mȯ6 [E,YXmDn . ^M~ìa[|`n9cۇu2*ݖ:X66Oƞ70d}5[@rMlq[Q[ju(Ue+\ٶAU,c ]_dԖ(rD|{AwL5 8s.Ugu/6#ZTX*(K5*ˆM_ [乲v~( q{l2diK?ڷ\ wa~OikUelQnem/}1juFm;iew̾@ QZc&rLn3̻d6vNcx TT,ӕ" "ڶ][Cn`5|W89΁ps jókVxh B~Fcv5 7˝Wr"ykO~M\ɏ٢SrPL!n+uc>6c3B1^!Ŕc)RR3⢊ԡ|/ڢͷ3os47\+8e`֭fvY7|3!(j7:}b\yԂo e/T?Y?(pYP(mQ^eo[oQbw wr`  e ,Mf vl$( 2Vckv55~_^EeI*JJYԫ Z!_7.R1f\D %+I>+\< cXʹfW<._kR=@Ws6jZ2r <)VX ~EaA>uF~.`T(v{]Y|P4FrYrurʢHF 6u2ja|m dGkpc2Off`A eXb\%` k˶-UQ:[RhyX%˨_( pBڶa*\kɸmȫaiXUmքqXDnSի}(pE![G!lŭoe*ܶkx7EFnKm-ٝX{je ޶0cTvԮXն %u0u2f .Y6C=]s(dzy C離--Y:.qkHԼȖYGB n ;Y @Li{U2CtnuPzɶu@8 5+sL%(W1s}}S$g_(67;3(z7M"]=*XrcSU5>إWLb2͡NMMT>Y^,E-)mE%nepF87pKX{BNVETG]KH'-2*u;V:o?l%.-nyf|W4zK5~P|wFJ|;%,˜Ve[x]yPQe5yp].bQlUYSvBh6ɹjۂ҅Kc\P:7k47QfkS2ݴrd^t(cL-x^qrqNuJMTۺ4-w`{a~_y e&fMF&9GuS#/wn ,%3+̎+GuC!ϗ&ʇuwwuu1m܋ٿ_{`:їF]|WuξU \oM;^@6ɀYpY-^9o -|wn6ש!Y7Mqol2ɞa8Я*cPKy՚ښrB-̫B.2AɃqgRPl˪Q`M PZvT;*Y,Tf<*d,VJ*TQ(,kZp <0*,g)%h53X x&l~'7wc\k|_>`aG}@1@Կv]Yk^;i`G0\{HVm;]hQwN~7ǜ"Sh˹ 'd(nUjBeVbZR;{q ۲nU6 Q`LegT.PV}\n4O:VT`S㒑-P [eTy PYg˩sQ),ЦXТе\Ը0-\Qƥ<9>G\@UY*wR: 葙1kK)ul8)w[ɻ<$fE/ P(k*yReQΒKyu)[+JT>j*`kj8f? {#<,QZ'kq9b?Ӿ@]W aEE!˽z#l)u[)oyɬ@OM9 f=j1~S|!?/ҽ(v3\j{[-T^rmr(ߔ6P87BO.A[,Y ;,3kd^(5ECfTظREP J-v^Hk[n^N[W X⾛ d nP e %e(Cn,/@݂rPy gs*b%6B6,6U.UT>TԸSoa("7EnVtV;'FV.9ioP7W*2oxB(yIqrqJF2J'%l;A}T26(rQţqmFXb\rp#1mŴu˼,\$nh>l ?lps ř!4@~ȼp߷~_QdANn4Q62jE>^.ӋO/e7Zr[ i}1?(ET*^[P]qy/esO8p,MEE6~g?alH}+?kp [`)p7Nި5x\roQndrpYOwO<{F_e.٣*du *HN)+l@]]TnZSŢUa)+M5[7,%ug A奖*׊ʛ}2XNl-QIه`(QղgQ5kYcOlV専[{Kang7-VUX!  4-Ƕ<.H+XkQT,k7ɡ-U_cu\dAE ʽI*z.0TE`z`p l;{e+0pQ,3ƙsƟJe| 4}`n :P&BbdVV2'FͿ*̀~LD]_!  q7,uɾlTL %Y%Py"ٯUeg[25Q:4 jܖgjYԾMSzz,:U#;1e.0쩉\P`/c]r E-(&Q㢚%Z@l5.*KT9>G{uS[j퓁@?!Pb lZd 䔺(@QZ-e[5C#Z#uyȉ5hj[sv؎e:@2 aXaK.oۀ0yX2;ek74k^on'Na{}ihE9iAx1o.?wPrmT[.2Jj msYm{<EpKX#e,I2^:@rj*r9:zEe6ڪ,JR ˺uysT5OUSz\bl/mByu^@2~]urqH\m4?uPj\7gN9=_ ^J`{T( v%ljɿ*ٷT̔ɖg>Un&d.oɩtAiq3@ڼMJKI"7R:0d^69*D9RDZ /ٷ roSJ2nS1EqXBS&KG+nhԲqш"7EcfපIڶu,l ׋5p9΁ps xs [y0| R-P%Phb 0w*+TlJ&?v?Sُ`O*u UJ-fTJWi[)m\Ɯqfɑ%n,)~ uPuR7m֥Gao7b7~&v׮]}/u` E}Q 2pX'E e\,S|WO߲FK#ϼzl})=L[k+|,7*cm\QF#eSM4T[7ަj<j8iT tT 5gPc 5T8A;l Cj8|ڳwu>'\'|} լ,x\uʰkݎլźcqk{jԻ]Y>>vwohv୷O/l>ӆ_{0M?dƏu}v?e?ibng~ٕ̑GmwtBCwsQS9)5)НݩguߩI[ZV'eOZ9>hiyN?tF;)oOuZN;tZ-:c[O9\ǂ>%n۱jR{ڇYPZg察QY;F3vk}ϪN=g>3i^iwZGN[9;֡#us :p\v(XM!0 s2{cl絜]d"KknG}olj[n۱ZK(sɬȲb޾:f}LmϬm>"qҾ]5qt`ߕovdwd h@|&%3Jk7@vG.gc( SR.V>SP.VktSSf2X,kJTdAٸ@ڬ⩔{țH L R T\(ڌRɘ}9r4T" (ucfF5aVqE&P}cJDZ2MQԐ_%x0n0Ç@89΁ps΁iO5Rp?* @2/ǥrQ}Wru#tc B,r.D/E4W q:h¼/ ڜ8@s@( 8R0jQi;q贼u,\!cax@*B)PQsJ3jFש3SGN:jЖgogm9-ȝj?TCX@*Ơ}ZS)q0k;֑/GOs~cg9X8?zZGϹVR]=muPo9O-+gԿN-rju}w5)GQ:ul׬XcL>;R)hp%20w2r(Fc6HLٖz(͢"sQ]> W}}[BGPveQ y Ŗndcլ񄥶HFԷf dz=5MS[mT1rlcܒ¼k "'Gr۬Mfe;yk U^Tծ굖j*t+uV8ExnK]Fٔ8HT*bbnNˋJ%uJ&T+p1d=q'(I"ABr[8eQr}rهr_+_*ʇuKJaGgZ(e4]ZnF;Y g?a{o;^k۶m _z{vk9zg-@@q\-y@[ @~ .@} EB-`!˯UY1Kfn9e=mkuk%P^}ā9TRt@@SAn%w1VK6PIg Q)0Q\R9VV@q;וuPդ,Jq90J Ԡ¦ 6!uaρUfzj%AR[9J\y0Ksm Sm/l|g\[?7{残3oXTvm_iryb*Wz+f ꮻiJY PT\`ͩu{ X|u=S=aw*Y ,J[@)y]{=|`o*Sޮ)cVs"-֩lQzGh,oѮ}>,Pvݩ^ Tck5:>%-Aسjߥ6n?*[@nY(p50K{Vp|Fgզ<ǎܥg bo D2թY5$3oP x"QʒcC ٵ},Fݹ\j\8+ݖ;\Vl߬6vϷ@eT"c,{jb!벊B$=6JR57vMl]-:wjg~Ǘ5m.jgm-chwwk۱fKzKulkq^ܯ7<5Y(7= -v#ն ~͆ul9%װG}:ju5INJTeYWJE2/-^]Q LurY ^SU}[rpٴrrs2drJcl)eS>9:X*c*+M% ⦱C9V"T"L` ˅9΁ps ŝ!D~90 f~`.}w2f\ `u' @7PfZ\M|T? [N.Y?Or?U.*W`cfzarT3/m<.ƘYn7k/~P5\c=uk,_ۿ+?϶7W~cfy{? ˾%.?Ėÿly?K#˾};7_=5Zm]Z,JӦ)#[p8gjU*[(&0To075bwCY 70Lz~`cܧFlv\3^m]}N߀ycY܁@6A^ʏ*Qإlu֬MKRrxm)w(sͶؔc+îZ7Dv@e-\X;[cd u 0Eis)mMk`ru`bA`W5/[T#u5{)n;v9uupPO_-TB Z.SU9[dvQ̢(L-;a[}u U-V],Z-s8'QA;ݷ~Y#ohfoao*{';L} h%XQv=ƯkEE瓝fq hudƸemc[6ۀ`p gթfO LVsvMO&yn]CmeeBwsp"˶ lȫ}5U_͚JFm[V5F+n}TZ&nyre库kNxRSP,"Q5^UXQL6xEłm͚]2t*$ɜ2YԹnJ2um*d:T eTO)@q/YMMcl6ŒqbI{%4 K7X4H"Dۤ&'h4nyh,q-#k;ps @8noj|?+q}eYjQU7r72&'>ز/1V|:\\,\oW>\\*Qb^bAb}e4 C6>9}W~T?ɿ}A؀-O[~o}G筓+`~Q?}oN}?F{u\j J$,U˾EԨb\SZQ}mP:A-JMd{>˦uВzvLlu= ACvPRX!KYC9Lʸt:U01=z,U@\?VؚY=;:ֶ?>j[2z_?}z-6.iJ6ɏpυ6 3gm7_,Զj)VvV[kl-%eRESߚe2ǜTi EyK-Y@ n Ը-˦iE TZrhz9fQZX YSjkA˻uٷ:[+gNIrMk.N;BV3jɊu뜇fq`k`l\\, TԺ(iuj6_們!8=u-Kۑzf5yZEW'{7G=Nw9(e\@Ѝ51`ӵ[#˫EKԷԋ"U3Q:˛ۦelVKvO^|ܖڜ*;d׬otvnL}y=5UjKe+Ͷtk@^rpMM]5m4Tk`AVm)kenkjT=QU=yՖxTj[SY*kb\ŊRc W6^T)T6rɩrkd*ȲTX.XR-V/}[P!:|PȾ/%-) f9rrserclFlNLQ `7L*L:t6t*কJ45.vYe2)%3%(oSJ&RJQR.Xci%)nɘbbrd&Z948$&MiP22%% 7LH< `/Ec;'ЦX\ [jaa>Tྛa!u89΁ps xs Cm vۀf ~_کn.ֽ2rsgB2R-  ?;jczIJIyJ)}S;g¿_Ŕon*\pYgmv3}֟O}S%#Gl}ar!5-|v{XǾ%>vxo_Mh懵״i릇x״㖯i-_+vU-}!8vvuZZ>!-ifڸO;o]xvƱ懴sC;ijDZozXvߤ g,hV}}4/ާZy[͏hO-_֎cks6+6h״|A-ro~P͏hrc1?ė^27=vnc=mkGmN,~-o{Xk>Usiv#Z!B}_GZ~Qla-Vo}\k=kockohGrݱ/=5_zX{V ]sCkjvslߞ;ku>nǴv1>񤮿 9ғZ;vM>AOh7utОOԵ'5ǿxB񔮻 ]v޵'xBJ ]{qrǟu'מ;5w~CמxF7sOkoO==' ''hipE|V]@ꐅ9[dT=T;YMe wZSn kb2u*Rp)ۖՖXY-wPԷl١QJv{hU /*[k-39kCS6tD},-q6aa>jcglۖTf m&P~2nsdvʖ\j}y,~_3Kd r䓉ku6 lͶSb\o dloofWͺ֓Er&k7lۯhլUmcڬerYaٶA^^4E֭4&mڶa \l+Y$*QA %rSB]jIbCJYRMjJURѬ Śʥf\TXVPQPU1WV hgQ\IyrrsX$F9\VBFY\YtQ|ZLQ\֔|Zils9)eq"ʠM7fKJmOski e"9T2x*x:D"t[娒&IESQ)E %c1EO(FMiFMFƣc䄢EbڴiB۶l¶]/Cp,ñ @89΁pś/_μ!A&7}+|# [X,f6mRtbr+;1=\?\.c7Ry_(]?/|TVЉ+m*\U&U[p9Er 7@]-ЖK`pY6[e -5Z[mJVU^zjF:n!r̷3{{9;nzZGAgtx}G}g_/?羥s/j]i]/h]ٗlNpu//]yio/йugtois/-y|yy/=ݯZ}^_~Q~ϋ>y_my:}˯W^᯼COm}ꞗu䞗{^/?{IGm}+9}UG%;:J?E+:UG諾W+/~[G>uk:j~[컶|G3>sw{]W>uw{v|j{5jҚWG+juqVV[Vn.^ZY^֖VW{iEKjqmEhZ\Y-jy:,Z^e?miiyWvkiyuuVh eۧ v/ju:-ju_VhwMdQdϒ_] 5jf{]k5Z]ZZ~;kyU;֕e--^]ڹdU1k[ZYv,]]kVsykIKhʒw۱K+AKKڵ-XˋZܵԱ]c׊fsQK;Wsv^VRU2`Td颼"U;cڵ.^;viێ%]cھԶWvڱWUWжviU;mպz.m߾iZؾ[v読;}ڶ*-\uznݮlӶ߾M[9wm޺M^[0C[6oܶ-,lm_ئ-s[4=]gh~v7/hn7iYg\dM̓}[P>]P"U"S*UrQdFV%XFf:9L9d(cJ&Y%c)/R"M(O+w5XLXF`/Қ5FҊMĴ)Q,S$m2*ݨ&1m4(+I -[7X}Cz \}b-_%x0n.eÇ@89΁psρiS} kes #UW^jɏ/sWe_^ aiBB^SŬv^~u΁@u]}>c7ʥΡٰl煖 wbȋ.յ%^m$,ղ(*uU5X(],VlɊ" ]ԷםzJ=2+= :}zZ(:}ȌXU\n:-t'%ٮv]_v]Yzz!wkkf-iv3{WTo|CUGf$ vG^O6 }]w{ڃݶ:͑^nRрy5j= s IDAT^W~_H~O5 5 4v544v 5ŹI C FSGzP~$ FNNik4}@HSiFC GSN?9`R)&Mkr0ɁS5عSPS)FMjj4pJM5hZSMf5&5;ԔkfrViLhv4̤flGfΝԌg6ySSb䬦'{VyQ-59}Ep.f2vQ⮟Qi=rkfrj^Ss]fNivkefzZsSYsk4p6kmlmw|y|GZNj ni֫mOkvrNS5=57ƃ1جI jzV#qFfffl̎41ܬIfg579urFS35=9IMM|53birrF} ǹY 969䌦3!0縮!g՛ٜj49TjZÑzi;Zr)t^}l4 F>LU{*7[2>ǽIz;eIu4LN03}t#;u[f76*|[q61YŨ\b,;4;b;f9jo6Fo15Q(VlȖzMZCHLN|AL֬RiTi2Yd㦕b9S"V&Q6U,P&55n*WŨvSrZXN_ʫ^*R|=2o~ñ :^zm<|޸pvm ֖6|pw*[[Sj]FCZCZYze딸8DvIyd<)7|R= [kcPgG<$!:nS{۽~> = tt] bj 4vz]=L;m6Э>@–za ,r>֦mN 4ni|uoVӖ.NkP{jhsڧ{:0g>]+cF]G?^[~Ǡ{oc>r?{@ځ/ר=P3vt\gvp`ᠫ: ,} =فÞ[ p0T5j4j cHQ_dh Ttv0ex 459ȎM:`;j4 dSI g4T4;hnF]Mf-V+&SmC^ޘp2doJH^4ٙT;c#|oM^2bHohH~w/;k/t]1n0u{-kUܒj4kZ 2=5RGܲ|>,p6S`JQRmyi%l2goөr񌒉RӊJ̦J&@yr~flِ5p,g3s#a XВ[4 4 uG){0lZ,-ڰcڋcA-8få؁\4M_4`MGmuSZB96!&T&Cq=؞+g7YBKZ4H ;.+ 0$\A0J cx2p4Zز\zt mNVB)u0~Xn#phux~]q&Y/@CX!Ӏ-~]#k߀p@1CMU96Xg|<9֏G%Ml˄}B? [@=c6 `&%gMxNC.O[ű =OL[Ok\!msǍf!'`]ۆiϢyۮg ;LDžo]{^0y\lL\>L.B%E3ԛ Nb0tOךI݆fB@WL毮<5Z6LyƘx ~yZِc32Or)rMlJ DXTʉ;Fh>r?>bՇ[*"W,\(#A7lи;$0X~IZ+?8}Vml! $@F /Av1}a/! 6O(-YvG@7@/*qɽ}LcTrHD"8zcÍ!ګx$feo @89΁ps:B{j~.xó.y3ۍVD"K.?~cis5TMZu~]k5f 0+%4YenUk۪q|t+`Mm_hꛏ_)0J*dUޟz*X3jcߔQ3 FyapU#uX#54~af͖slu`LIn 5Lث`6%+!)s$p,h@fD1- ݅k0TEhDjr _-1_ Ek VqTU/cjmN¤@a:CۓaڬMښ#+c ELۑP\p:ڣ+'8%xu:uO(˔ϯ;M4'} ! \ !i~Д^4@g' tq2V h:In>(ݷ3bVΡuZt3v ֭q:-u6]14&Z\' :AKghݡ>0/hzhu1$ǂzk9IoᎡ>;%:ژFWP)Tg/-y;F+0Qڀm!~'ۄmw9osO P/3O x#iPum~hb6[-d -!"ߚr9ޗG6n-9QCY-J8cmݗHgƋd9’?4Æhrw]]7L3%Y˓WFvƻ3A@N 1ezY% ThVuLA`J$\jZeUZJJ"*Ţ?1ۡaܦ;m[F$'0 㑇$J9O ПH` ޏ8mb}>H  #UQʼxm\&#G_/oc("Dz"Dh6Po5ʌOnC{}s?@89́7 ?=X A>:hBc$anG{1;bgc\\3r] Al}kޮW>2zqt|)u66>2(w>!5s9U8w#s${{:yIXv%Z'\ہ{śp#\ɴ2qS ٤PTI[JE(+{;.aE@#liB |eT%Lǎ=cr&c"&疰kz ;cn;fajv3|vכ]v,abvj;1^hĎC1Ӈ}sn?& 9݋>{P]f09wPoo/`~L0{۹vΙnv}zSElyٹD{QYƱ䲄Ivvg|iel1!thaVèPJYz"'^HUp6kU5d40݋Ysդ MNX0yn_`FkQ„+5#f+XM߹Z{6f'_#Vvm&<ӔX>~a$ } 4ztW5]SP)KPYMUbzر0%etuUJ#W,I%җk` 9D]-m@@._AMJ8L$${4РFcڀW@4 Χ[TtӠKeKbE^J: 3B9C@P n^oIq14\6@~^G{\@Q 1h J چ+魃G=h cr?iS|J.t+:JQ%[E%_C\ p|=ڽnG@pZ}{f,018v}l09>oGEk! w!۲-GLalFHOvԌfқq%uɕRh.#1` he0gf/mHl3m{BbZn '|h>4>p`Z<㚺Ϛ*^Y 64yrL5ۚNfCbP]G'Hzmޒb1l/Isk d/$b  uZ#v``Ael qi /1 P7mj}0|^ ؇/ݷ &qʌTD"чZLG?"1˴n}gI-qUl2ԋH,H4~j!ӏ>c屆D(6o @89΁ps:B#hCs9΁:P A> B,c3crv q0I@J^®1{o,..[>$o`wfAEk4ai`̥ Fck1Zc섭J3ٖnH1iK&cF{ Pf/]sPe훴 mӪxb҄Uk4'E+ VYp6?ue5kf4metEhl eԱN1~YK[.i¥kϖKIvz$ؖNV=cm>-\\UȶȞ-e<-Apݥ#Gp=Х+ĄM r:};G]URر*-NO,[FzuK ͆t39]*iXǸ$ K6 [h=U1^-wcO[Q:Y W.q%R B֏+Gk.VlK`$AaSlq1ϫ6AJGШE[{"mc4zY%PR-oXb pW~FK%T .TԂR4q+(kX|pi{ vASyVFChrӲe촼\:?+ҖHl#^5_Ks4qyD gO `W9-^ugLE23jsX}<A[c蝮f~_SS,fcrieҼ-dsHgmsFs9,:6<.qn3✐6 -/<>Ctyt& L e\VcnI./]݌r8,V#te2 e<!/3$@=E5e٩[9Kɜ-1FbM`pxk#toi3cuMu"cM i%TREU3֯VF6 JЖ 0ڶ'[_k*]XA鲥5k3>YvҎ>>GYzq]ۆ%Q̦ f XE&%XJJ-..c=ضVb抩(fvTr; <1jQ`KQY4yݧl*:0 ,+Ѹ6!+h'חXaF22qb]+,  .@ѼuF-2أ[=O[Pb-58XK5e<l &TdLoKOʈN/-aE&$%$̤yꍉKHKkFnH 3!gU26rcs[ouƟ<>,[trPbiB;QK(`w>~cjs-6;ߦ@T',#9@2\Kϱo̾aBc} }d~4HgGc6c;ئg,}2˹G.SB>A&WB.C.E9vM$nٱ\?n*Jq) $&ǁ?:ݷ&O6A J40<@?o!I&edrTF5r7/M\8ɨ& y:YjIs}68}C<AD"1tcD:m4HXHoH,:cuF(??+@89΁wnΗpρ.(!B\n_d7bf./(ŧޏO# v[ӱz??z:K3[Fbh&QYJr qpNωpbt=\{{<>v8c+T.q‹/….6 M3>9EUWނշ.ܫn>܋n/}^W]u*&;+K=ss%xF;gI2Ĵ"D% 9yL*Sʴtf Ptfp_%^ĶK:5d&ǎ6`Win0i>މcn3̄geJ4LMs|a%ͨ%l &gxeCk֭* ;èѶikVY+@1&Z:Ze*.A~vBӤkI0{pk\Zf:r 7hJ'/D5ւe/B6{$ jϟۭqie1-A ͦKk.:.y :{9+ƯAߒ@64p Q5I%@2\'F-\NF) @@D$;Mq:o f=Lɴr $32mCz\qȪߕbU3cPMK ~rzW~yQ"+ѶeTOTK ]h61zPLc_c97jp݆êe$vӄ0F)`p8Zc2wJwzYlv mu>#ybBvaȵ[Ely< d\u[A6S- nm,r,L;[v% AmeӬ7LTmZ<ą91Zk, e[3y БW屖\GmD-WG Ձ9uNل͟2xY~سrǻyLu.y]U۵o.ś7#I!3ʨ rmsHшd0I#5FJF'O#6+q=v/DF3hk&g} 9I](Kh]{;IљE|\:fa.g 5qvȶ9F'Wt.S$3 .`Ky>Yg0w7#1nLΨӇq,M]vƶNWzmնvVҙKSǨ ґ;_zovA0aY饭j6*F5ڷm[Eu tUz̀Uc.dC(N[ZvXFnM ڌm5) f2n_iӘ>pb˱hȱV%1\i\.lme5l5Z D$,Z\˄>]-%5ɪL[ _:v)Hv@ o۱o-}楁.?}Kr}]v:p im]q1Iw`m2q} d v@Vv ZBuZ[ eC'<]7D'{{M^SLWJbBq8u[||״Q u UTe%lp> i;v(MaM&;_ↀ\؀,#{qZ4Rq iںLW" ٭;.0}F369>!u'6q .@Tq-ľB|?_UoMڱ||d+~~**uXQʸ%g̱D2dBVНPju4\ zoeqVm V'*ٱ[$ʦԠja;jIK+#ه{;,a!(&1{bҾ= UAL60M[6c1̪;wm]_%:%(f.c'f[nc{k?hV0u,yGW@+ǥ;׳(w܁,bvڷ|μD=smZƋ6M8}@aCK j&*F :/z zcl5 vJܱ !iՐ~F>njW&`2{s ϕmҸ%\e.Z,!0o4jmKˎcB[^ hOhj9ku6akbhkbb:ҷ+]e\ں<m .#y\'չ-Z\LZ{tJm3ՄG`߭/֕.[[q{w@Gs]KhJt+6ce-Y \VtѮ%U@KsбgفҮyNҺZ>4WiYz3pXV4k}YQf,y $JY]ձt E:pFTETFD[ K$d3w`,p n]c+]<&)%j ې@&N06-P%(/ Bt5 !W ͕J* bYV/W+wbL[Cm1}3M}| V@\ԴY>QKs Pr26h||94a x6a.o3ޙ6c ir|.,1 T`|y‚KNz0ڀLl lY2F3%ȧ7\0-c̾[,|I}ˎmS'C%f$ wEۖ5 zE3+<,my 0F:4F'UviVk(5+T˪TRʕ2!_TPCRt[ǚJ bp`-1  a`hC ! 2:y(DBxk ^k\ xòq 82Ñ98; Tx%8;/]7]PkX&}1Q r%ȍ/G<C/H8"(Vbı:+HqD#bUߎ0BhvYs @89p*ρ/w΁ps OKF+3R9zj{]}=Ǥm.?KO6.Mé۩ᗣU2RgcHSy-~ś1~^.vO]x5p7mڄ.T,If6طLُކջʷ%|4Ĝ$3 c<سww?~7/7 f=L8mmۋE(;}*5-xZk qŘt^/ s/?x҃kZh/a,;qۏI_y?: 5`ݾ{I@,wv '7~)`yb2+wF_G{RƗ3QCZ5jҌ%U}z*]4Vd`VPSxM[aGâ[3aj5vЪ\f#f-{%@cIJ͈eFptt| {[ks[`C Wgϭ)Qhc],]B\ิj=،^f:b횎%Jo\-ƺ z|mv.-^v4hMFZbۓ]eDži3%ॅ@{p-F?|n,FҰ|16 9a-l kuK ]27@q|hcZ4Y]Vہf4%BG3(e Ee%TJlXw2eU@fo>vzM=^UFr{t;}uۿ ->-<1ן{ї_+Gcѿ.֬r[Oط<^<^<#xp>O_}}}}__}J:AmY3Ÿ2.}ZjUUvKJ*2bPTP#/WP+vb נoxP!$k ``me2͛qNt^p; V,k-Ț>Y˙sprgYx3qdәx?UEc##A8"pFuҺGO,x/z#m4odF(?|-a>@89΁w[27O>VBBF҅HFVSg#$Z/u[ڕ@١U`2_HIM lH ;FHx8Տu+\rݕK^'.y lO^]i p/ܼnބhkG3HgrMӄb2ant 9[vߊo[9ZMt4$iqZڶ3pp|/1&afܼصڋ/ +?QkV.mF3c?>{0&4bq3oke%)~UOO/s4iӟ;am[ON%LFW%NZSQCQ5S4s e2r?אxO~[ 5*BjbХktzlsj[쭭l@hHS"QȌIV?q.Ctx%CƎN-iڵt]-,_ e暰$"ـCCK4JH@H`uNeBRk:v]x QKm6'"rڼ(djNvdϭ.AOх%oh 9uK#QʌQtzHuF!Ӵ&0-Jr8A]*o!fm7%OnQ[..e(]V^2JBಈJ7 $n1@XFG3Ʒǟ|oÉ7 dN\ܺA]/U^_#ٛK3L2kVZ&%@0n# |2 **j*J 咀b\u/5YQf Gv}O|=_hlp*?dŗ_!'}.o<L1b e-OTP'(a uٌX60|0Rr];]d#SKڸL\Fbl.t~ٙ[~uVl IDATO[.->q:ܭwn'wmN[tpmXYל_T2{q v:=C-.*1rKd͑\Lc(J#kYdB΁wCN>~}{.̼] rǣ qOOI'Pt&\rEHHHI1Nb6F:C&E[ĺ]9 ^7LS"w-?G?sϳ/Ū[DG}[gƯq>{SґYv^׷ױ$=  +[`_2O/ޅ~%lk9FqU @aTihҸ5j'> [סkT$X+*"F.GU`4-bPy+5K"HI#pVKuuyZhd`f\);'L +&.{lmH-.KՙӘeI΀m3&ضSLGl$nհ kL.Ӄ cm >m]˓[>װhbޚ4MZX LX+-c=^vrGj1gkIW)aG#hͺ X#p=[[n `'"ُK,[p yI>n]Թ 1|F. }4i K2o0`~ՖB7@"[TJehy|o>'owC,W'ֿ_LGP=[֌}FL뎁Pgpuezq1X _*\bn&`=y^JU%l0?&K%vZx7ǐ;K=?'C(`-Y֢mo!'6Kh4v-ynw,sF sp: HJr(sl" R,iBBD,@,ڇ8m4x4҉OG$A4Aoh =Y/Ao1D{PoBg~9΁ps x΁ླ?/}sdȲvAn4t\4><< ]CkWik}2q6ORc_L#gx>u:fbl<2z&nLF An01}ދ<]px5rර<!wӅࢋ.F*Df4+nf4-h:d:T&t ٫np6䮺٫o7| j/dNS -ӏc8^c~f==GbY\qc_6ރܽ(=' ;={"y$oV #W٭mF9Ow"yg_8bjz?<"N~gٙ^8ҽo=yeJ1ht+,eA^FVmH`оUɚNcp`VA[̈d 4seYHfƑ>^BXS:qm*ٰX!b6%$e|2_+-:[ebi.]Kˎ]gd.!MUTf2tݬ+C}84ż5m]`p؍+8beW.[f&#ie1&L.{limO6:\Q1ʞ%0}+"p-J.CXxktsgdI2{t9fuԶkGS1ʁ#}^e8b{^]i*Lۗ=4yױ'Vp״Qޢ4p .IXi8o\g?,mxgGr _;fu|Nx iv֥U Yݸ@+>| knW0֯6f1ci7e4@^ڻ4댃OS~UeQ,TP(1>b#ۇ(kfF7FV3P ?rS_w8w9΁ps6BŸfN6»5^߭ꂗ.h!\!Dvrr,ҋzV㊾39gbf'+=<_zq_]'R|JU7z&>ꁗ ?s 14Gp-w}y ~s P% 77M4}c۝i~ hP:PA7gomoX|QbNiXEIoinFrr_[yu>&s?';e6A0k߇E🠙'|v$uv=s.܀惡xf08Ó>oj-ʳwJT<xr +<@4^sphб|m0hVukw5Ti֪uM/8]-TV-Rxrr 2-\-WQ,j-`%Fypvk pمV.pip1nX ܖ *}m<܍ .^X+liX6/1kMWů/믖CJ w 8;pyC/MX1XqF%GVC'FؗCQJ۷p;}Xs @89p*́l9*M<=O+aKWFzrS՘L;߇&KlN|='~et}`|$Ț3;]=ӿG}{߽rمeBܮ}]v.ݼl|FSȎfŴdM'I0ѓ9dҁK6% ېr7.a|hqՉjjj4ӂNXpga;,]CSݳ==cf`}}9_=#O&K{߀; b^F{@7;S䲟ۘl[}=>'_C"Jt]mpw?Q[^#gnᓟ‹?kێׄM +ܝ;M\UM[5m5YMg\ EӜ'D4d2:mh;$1D[;s ahEr9d93nHeeȍ 6@cW5&#-Y's?c˯c {-jɩO[?xUA5ƾIO>xcͦ}kRA'P)3@jr\Q&-$6n[*2E.]b JBI"r*KZpZaX(2ѷ!$G2ծCߎ\[s7-5ciW˾\ r~p G׏2^__hf/oh^ yomwlfZD{܇H4!6E_Oh zqDك#dwV;O)X΁ps @8ρoda?\d2o9rw\{{{#4q _ |3c1D">9x&OUNGn?:_J1v-R#꒖2##Ȏoǂgp߽]s{|x޿rcowm҅]=aж{Y+!.mތ 7_ljL*69T:(i&GGnCvmeQ nx>$f9+u5S}|~?`bL:!qË8ܫ'}f SKǣyvəEŠ};~;ٟ+xyl+wj`ع|i'$ڙ09s3{G=MIhe.[%5l [tUZ&/@`Xbz>Mze.;G XMKW^e42!Q\1>3 $9ḥ̂u7[gsi(,8:hWb C }'0X@*A"{>cߑ|muKfo비\?>w#f*7K <6߇l&~~v+-ƫ*5~lා_;yA|w6oڀj&m>ģqD{1GKr${p#F(anM}ps @87@p{߮{%F$|||Ͻ!Lta.rƣ"qt̯]׬Spd4WFOO;{3qs\#؜d(6&X2SeYY#7XykWw21n q oI$ 6mnB*3l^9ML4 qsʴ3sYvcHJlmJfHкM!Pܦ DĒiұT"q*⺜"&ƦvDӪ5;?ou|LOD6݊ sVtLKU [v-h&-_\ ,I3/4 5$ܖ)c*he\haE>I4ᠣ xh XXH `HXHV].t kM {|p_ZOVʿ4m3<<̙1Ld _tMٝvSc>36m"(PU*n3Hb%%WUHd2*."ґP2H4() lEAz&sYd)Ȥ~B,ljFsC#v64 N 9g]лR\WEd %a;B+{_/9 \v pRqReӓ]ӳ+ K++q7K_H'weu*ju>\&W*TWנ5ܪZTVTDG$m$?1 c>w"ӟhټ>[{%{?e!|-P`.܊ |F]|E'cwWТym q ơNy9m\zwXٵ P`anCe6H Hpue|n ~+kB}(][jL]*Fܿ3|tp?63xxR,։_N·f>)scf|󤘸rwx6›K;!`G^]?cϾDK3۟xzxg.0Es;p4YנULQ9KUMf ˘ ]i7S>f0:4ʚ x١Ks2r]hNur~J%g3Gz>߲VumZcSCv\ٰeD,kbrsF/"l5}L{/Q.['%&m^„FVKlòuhf{v-xVweϲr6 ZZ-ΥYȾ#j8rk-Fɖ 1,&mMmKBS#]6וs+J3rhYr>vӬPe/MYn9B7BaڤD2^YgmEÓpVe/nAKh7'֍b8N۹܁;ԹoG:wH]ӱ,8dq Ŝ:eo];gy -%ᅳ^KVoscY2s+^t0YOXwL. c7+Njfl6Sk}]8P4("ف Ҝf<3,jiP_u3F^>_F(qݳ^eWKD6?7Ft1^Ͽ45c^gnہ)^q*㍽nܢVXexC^: ,Զ;pqbFh0|[x!ޔM{#hsۮz?fj^~;alyJ틑ULIf I8P^bZ݀4aAQؓB6mBU E"F'gtd2tݪIL im 4mU$,MH3H2HH&HF&/hXzڶ M>܆f4-BSB47\5ae݅X؇ .wZ.COh._cwi?9퇘Cx[%n6_77O_>X/FXBmMjQUSJF)ף=쾭hp׼TǷjQjmCkON4,1 c8c>|yֿ92y;޷?nq;x=*4rhe磺b>+#Y-\U<΀u:B<<:Q}aqKVcIA o~gϝ[o:z't|Wta.6 %A(D A0F4n]߅Ȇ$F9,^xFjU'ĵ3r:|#dd?~wջp' ܡIl9F(/aO%m/ٽ o91gG_ o'>@7A~ۥ{ӝ |܇?ŭYma<^ жOw^ߟ?LJ̱"ݷ4i gHt%ԝD6$8-wD|Q6rUW%hՠ+>vli떦.EjPuC@3 `3D'eL le3?ɱAkp:2NYdSb]3ɆίV3˖nj<6 nكɼ]\[.#Aki0 #Jɶi'1̌Lel,\ M0'pz`q&j  ,7ն]yȶD';4u%/Ov`ц͹=fF. 'o!-Z^%4hKy y#::c t~i3HeFu$cفz^6 "q鍜!y HdK/2Y OZ<.lY>7w??8;ܛqي..8&\>xȴPjGQzo[%Bں) GXF0 Kb2景IL2!n-;|y+vR;aJ&8D\m*@]܃<ĒSK|2׶ql^"|(g׮帓he6_/"g;.w{o n98 $x; tM 9^lE8C<CѤ# ΍bȷv# KL}4wQmK?q ]ػtڠwHR/ѱi{/ݴjH2; yYUqᬘ:T tHf!Q7E:iqʉ$طiڸidONfp`aC3qmn@CS9GGG'ڴ(]Άn,oǚe8; ƷB:\R܍܊[/~~xֻ>.㷮w88y8898Z~5.bttt 4mQ[MP[ F%Wղ5ane 磲UhG($Dtryvo[Z#c:;p6Cbn>F 1?x76}Z>8\:lOzo*f4Čz{j#ĶeD20U@U]lD,'6+4p#WlZe'A-!-rŞe1;r jiVa,@@5kˈee(j_KV1U4vL LHkf|֢KPbvf*!K2agr5֖!AV.m`lKZ%5 w-1ˠIkeD)1˴eL1s 5sIKQۜn--FBXe,A[.'f[Zu!-Q|N<] .;l ̞\N m-)!- iŶ8aubalrtBR9Z.Z'pI$vlIHHI4L`I) 9gfWp$flg;gw=`r|^~i94@UO<}R-"W~Cf2LۘF.6B|rbJk-s_:,uTXTTmP7uSTmq%)aF2Jil3] M M \M MhnXچftvtp!rMQZbIxƶcyZ6YCĥw;_`JV|Q7>|ys>\?|KvXΎUKDrmU@jT UUW50_dɒOcGϱ6N 'KO?ǀ?1  cw#/J>?1<9}A xPփ,kϘ 0fnSu%Jĵ_3rt;r\}|۝RD:OƦ@5.T=Ј, 4"ҲH@o~ƀZo>>^oτ}>;x ᔿ#oO/mwʕp (a#A!D!qDwV\NK8,}Uh"?O|/@?,F+{hs;<n-}'o1Óxwv3;:C8(%_MAq1}7'BrUOGlr]WqH3ng z:7F&d}C2Hp<'0|<~miJ,2i C`0X|lVA:i.BR]:teZJd4 0ÂBkY3VeX Ihbyv24Kir]MMU"l@'6tX5cVn֦kr|lpݴsػF{ςFk=!6cYKh:hh<¥L֒8e֡n3قc90|l_&laܲGe, 2$5g`dz&^x~Y4n5DpLod&"Ë^xhr?1VenVLmiڶ4RjkStަ)иU8OBA,dēHT343*Q\ߌF^YPoЌbn( {/fb;p ѺF,[Cwp՞gno¡7˷/mī7>:o~t x.|t\Emkك[WTWҶ{n*QU;UըTՕh+K^`α>N  ')}Ocǀ?11;h{'x@S폛>n[\8RtkkkoOq w$6x.f Nޞ[deXޖ3$Xqe1YZ`ZVe(_B!3[`dcfXP ECbF'fZZa&%jtir]n p~! `Q#˘c6+6.uyH2 \Z4seN Z4olҚ52cN` MJ`i:LӄEPXdZ&/[MqiegM[Ɍb6XvК.\]\6 kdb50 4j v%5X[ɵ li:nG:\̈́A[Kؚ YBR V+Z]ڹVȨ vpXAv.MwU7Wݳ>>LvdÓ:Nq͏˺e0v[K;䚸qj=Oehw>> p8S7-ƓFvǥ7:Hhxe}l٠Ж1};3e[DN]{~X4tٳ7<}ǟǛ PvmI 2& ڴMNF%KpZc4q oMX˿E zuf3 Z`&qU N\qӖF(sl@ao-{p4}q*LӖ׵q]0KhkcY. {aW.m\ȥ-v/3BQ4& z94v20uSY6ZSvҪ5h bCkѦev!pʆYv纑9Ӗƭ%@e3^\gQƄF"rț4CMbk ݵjb܊KcSb]KԢM(MXH+N-7>P-{jEɱ_`1$iJX|'XXڷ4Ow,K,;doW܋.caCWd3ٍ4. x#-yTڢN+6϶oK6L8Y$_hevrsЖMڢM ݷDž}VvVb p.J(Md&)DIM&҈&؋D:FGgJ΋MW9_6cϞ-(utӚ}hϞsI|+ 8w>sѲU.c_槍ˋJjy-/D.9G,\Cl]Kt>6.C,{siĵX6#ĮHHTn$E,G8@([So -lT7ܴs7]w{?6m=C n֒D;w;wUz%Mgfld "#`DVI#-6.cU2:TZōPuɨHMs15 Z8!n:%P7J H|#'R&765cA[؈EXXF5߂ŋOA,ً(~ecq:;}7-Fx\x+~7gs;z&Տuc*V_ckE<6zOՁiï>hš:re*:ָUU|ڸU5Ʒٕܪjgn ~9[4ǀ?1 cueٲeX~=VXX,6+;OhȜW> [WИ"o7l3r\Z ՕX]M62>yɍHoAj4Nq^.\"&/a".,b Sw:;)|f $aԱذ%woLͳ{`PA!ϸh#=BQܾ%>.A-anv0MhsXҗ*}\h@wv"Y~${M3R4)E"ݨgnmZzoӱxY֗޼en<q?k߽yv^?'-F&Ӟ[-rlFv#]uqyA1Mq&^i;\7n0bzmmh@0G,[P( "Fb(۠Ҍg\6t߻~#;k;_8kAL$ש+NͳP4lV. $[5T@ZՑK+VC*Ig 0.)JHH&2rI #$d|\E| 94CS-m Ldw8Q7:N}]wds<4 ^~7w@l?{74&vql N };.3c/;~wxK؏n#2ĸ1x捩 @VH<ج]ZE?•aYF'Ӏ1FxNˊ+..IsWˈ2UCjd)\"]:aҤU, 4h'lv?Usl RLk1Yh(&l֡dw;n\Ff%ٴ0 MzpiV,\B[SdF'Km$6{qu[ asa6u`tZ}6s 5h _͜#Ϝ@AU9:ٝ׆cCԅYe+[kv.#>>GK1eZ0ٍ[Dˌfv,8E`v%cir4@iǕDŽzbYr~B=Z4jm=0M[fv>\xXU,"m|N ,in=;9 LHtrV۱+4cKet h<5.-Z4T#X]KN-0*~փo\[35\-6 h-iYD7RV5/Hcy vt{-îlvk@o=pw&p=x;pWuabCw@"QD∞ 7 ~ #Xf]BiiŚq ǟ_I:k N{6vzA򽩵<{u{uh!S~_Q[v2x3#'e*6YlxX b<ǦY3yp\wh=C;(}|%x]xۿhdʪP ط 2*!yJqŬUh; LZYYᚖn\1k#~Zrv?%Ր5Oi=Gpcڸ4s zn -k&]H7.g&m*pؠQ},,Yep]n&#ҕeZΑ[[zw nfe9W1 Z)˞Pl<-IJH[VYG#mػg-# ZaӾ'֤\6cyʎ\JonD!hvv \N _F(;0 ^6mJso9S=1ʛ$N. Z%ѱ EF+aD/;c N \c;iw]+`ZQ`OD";x@n5էK(K.(JD4^`F"ܲǖuA/DzHY`Wkv,kӂε"_8/ c'QN K+X*TֱLR$I[^_C [֭[  ioiPId ҐR5RY( OA2ARIϧHH6EpoH'iݲ7#x2--X$ݷM oA6,Dcs i6YFvJ̷BeP}ԟzƢc놐ci??BDpCEqn:?=a,uuM)fmm-*ه˞ڲ뚸FD-WVU}Z쟸Nǒ?1 c>='ToYgŮ]p%n>8\:+rcl|O;)ϼOBڱ_6m̄<3A\`CСg%10!M1<5X7@2}#p?~aC~tt<9]|ףogSŜwxOI 3{ aDZupR3jl1 dW$z'pOV{e?<;}SCSlH1/Qɴt&.,cBhم, Y֭u5hTBV7N]<,E{WHRBW"JfiҺUUԲ7uˊbӺղّ+1n2{oM%Hd$%4_LZ@0c?.Xp5M,Ґ5a\!ʄ\{p-@ֆfs,%n2#i,WצaHkֲQ v:mJ떯;b"3 kӺ5-кuc݈eĚ9Kju<[GJHnSG ,`$d0_w_suM\BΡH#~~ܮZuW\9kB6/D ^(JHͮ[v"Tzo֭퀽NލKd4/?ةO#ݾ i'3]ڱhT(mdBd,h"({ /lιW l]^AobhZA\^TrKPh-Ilr(E(ƎD(qQD1BXSg:#). -:ߗG>ŝrdUd/:>gM[ی#dɤ3դQʩLJZwa,{o3TNfPT2$R 24$xF@l<~nnWM PXf>nF}C#(@ ®b*Tۗ[mhߎC;дq'B݈ eX?w\{۰u+'|$z(3ַ6iւ*齭,'WUWuUϞup*P~܊JJyZe'ߓgǀ?1ck ܜybς{Xksׇ_|qjkvIֹ?/'dN_qr{gr<,Ox/jʾN;MގNn;:bZ٫;!e1TnE}Z ]Kwۊom6X$HDb&'Ohk?Ec٧dvf5[XօK؆/ۆ^eVJ6Io@^LBZ~+!-1[v֊%[+]\a`8eCb1@;0t!-t%,:Ymňi 2"X0.ݷ`HvcӸW$E" U3޹[/Ŗ[ӻZ&NdI pifgx jMyKZC),bݲ7 EcIUҠ0G[͍KNNH`m >&%e-uN sih'g$n#Q،&nP؄&/@mSjʨٶ߶ U˷nxz؉؎>\_wS; t₽SDWNڃ p RK Q[]02ըEM-jTVաqUAe5_]TUUԆR>=:qH? c;|{N=t萜yt? >I{uBBOigg3*=SdY^vZ\yضm/3EଳW\. 0s#'ٴi,uwwwMXyk6y—ʋcޖ/_~ Xz5}vlٲE6~{ӛ/OC }-Ki#}Q7~;<}G\/!͑{xrJnw!'bQi V %Ozprr''aw8* }/N3Ќ@,;He?Z}y?cy~ǹ{ݙS{M=Oݞi{mx֛Һ.{+_ VvĪ5BDB} %2 ! v6o Qvҫf}Yd na %a@~vՎ@?[F08ؙd֡BەṉX2xP,yF^q1s7/쓎\{Ą4cٵ}<4C=21AqD!19-^U~[F$?}.Cbl`l mٺU0ؿHC7 j7FYWf](Y~6tkPif5B5ھkjYܪn:Lt?h8OY^\ڹ&!aJ424\ˋB5hȚt2L^]7vY[̈́ K/0[治֠g5؇k,Y%T%85,v6}뚵l |lڦ\=lڶ!;ĕc,"!.JK@)fnd|-2pb{,׊e*{ow7bBAd7v9縠8ϾR\].}# }cfna R.VںEХ՛PٱK ~q оMnBb{ RɸXxG I ܯ>暿#e={G:N<6sR\{HS[˲ h}Q: {n3:@qmަ?q:.6l;\~t%"!q KpjFV&(&.\֦۟<ſK4ۃ6v M,}o`&Éc J}"_ߵ#Yp9.wǸY^ÛoM-unqx8'|oq],b)sr\ϻ}g 4{;f=r|nߒ2a=ܿsu>:/!;ǟz}=i duxY3gey ;x9ϒka|(\_sGY ^{>}<鋦"SM <} 6kT3u,X//<Ff),Q|} lY[ڞ~mFIk}ݢMؚ%5ן^;agMaj9l{=`c\%-^*ڬm>ߌ_,-so/QO׀)YO[48eE)w޵ Rr-g@]S b\ 3ԹOu!-\蟓MgJa?'%[w}ZA'["DAQ*ܤnX~re^Na뎱nNF{8WK;mwz.I]칆jϕ!W{9smm4k]Ei \<s͘s5.ߕ-mw3˕ޥ%p-CQ||.)5T}[ pR>|/YWl6CT;bb位'Te7x\]9m ԓ*0p?0h2// /h>r VMa[ (PPj*~=0`> ˓[*UV@}B񛰹囯-my @y @y Ywگ7%7׫anw/y50HNO2{pz@J6pe㦬;=xq{e37ݹRQ\L}뭷.-O_G-*77keԦ 7]v]x Mi{>/'p۵aq}DP\ڥ|طkN.C$&JAS0D 7 :DST=<Ƚ* -z=؃z4]:85邾o`sPJnkp׃Bw޵[FKWNk%@n}[_i[~rڕ黎}Ԟ]Y'm Q,eܨq\(?R܍~=sQ8ח#Jk%{kNyu uB=6I)3 e.@\@\~ZIMMO %TH)*%<;a߰|(pjZQUzy_3}uO |] k ׃ǵܱ}G.X]1Kdɋ ,c e#g-VǖwO}SRO_{rآܴҿ5k7tU2pϢzyo{^Q]|u_5/)i[ԆgZmjk&n_ mWs:em&?n[lGy T%-`@ہ%,`Լmk&rvl](95l̵J':LA׉UrgQQ]m{mVϬ6m*֩M]vS]^mXc Ham)M] e;yd<@u%r(-7XFbnW6ux9q=(&S_qióo0p@c7tz@M=ҵԹ=>rvPwb\cބM&mFyk[,*i;ɕ ތֳŊws6Mz~m'mgg:97440n9e{P@gZnͲfҸWޒso#0u3͖/k^ 3|7׬~ɱ.۹y7h7X5c <5=pK_̖9RެS 7N7+)+()+FЈ 6cܫvG6G .jZlk%皘E2\-b }Q YlcӍUY lrײֈ=TTֲQrP zƃC{W٠uvis߀RRn37)*L(J)Oksٻ  ;.XwJ\s+hTss=Bn ȃ*i[[f7CXnͭErS[6(p-jjlVKC)nQⲵdϵ&e5Q (oLkhVCIfMhSMmؠm(\䯯qk ֢=Pj5sm5r&W3Խk6V _{``P|Vn}|>*~>5dZ9XPgJ\Ը *={HUׯށ;Qܮ/SV~:5P^5P^5P^5p5P__>HMӻ}}.[.(RQݪ\1n¿{6GTPw^knԯx(X g-U&_(qKA&u>;vGL_ПM9m+MR^atS;= 2vswV)agAKaj,Qz8@ܔw>jM/@9gJ^\O\w5eN# g9_R/uKKG)26>3dyϚx2s8E.mg11̺yc>Cs?*[[ԌɸRⱘbⱤbɨHO=5eR;cO)*,_g}ݠ@Z=`2`Pmfsi ) 6϶ܩ6Oيepkgˋe9Y;XOHY.c1BO{[.\p%g.[nu2`@mmo7u/pL\p-j6K|nh@WyjVma`f6ǖ /@:ɑKvucGRuwurWtdn>w;=-Hqz b PG79r=Y_ƒC(_ MUv ҀcljFfS>baAZr⢺- QrȍV9R#e*n5.zQҎ6EC f7M;kP_{p{i _pAOz/9\w;Ǟ_ʔ*x;seKoi_.-p]n .q.>Vd$[ p7ꗋѾ4nι~|ḻk*XZ6I6pozgcN݃mMONZD H6e1R =p#2\fuSG4?~ kxpHP4?A;?0ԯ iO7اP`5D> k@dPu?8@}źqpP1ԯ~! jO>O5-}d@57yz} Pŧܴ4~p`@^4W_0?P(po1CAx?u~ p iD#~  kk08A iphP#{ԉC hx߮3vC0gTFFАF5:XPaA 0:ёQjQ jx¸(۸F562ё 4aw*Nh0a4^W@ilt\#lب c([;X061p|lRFlj6YGAc114VظF4N1{ \Է=OYT9mV0:QOjl|L7I3˜ S{''42{u +07e& $q >~bl]|`(cf~Jcğ9?Wrtl\Ę='F>f9())+kP&Uc>U-Ҙ] rF 37\¤ޏc͌Li|dJcFm>'4ʺ*W˘Ɔ44:¤F  (k=<գhA##*ku;:ȸ>3c`?:4ФFGF4u0Gs6ipT ijfF4-D7a_؀F hS_G}ۧڲ_lշiH[boK6c?e6nҦ-w&?y/lAFڝ̛6\uMrքkW{6Z`X`ؔՁZu- Q+ )) +  *`VSZ@@~rEd!Wd *P{eTK*U2RUVʯ^<\d##؞bNfty @y @y @y րVP rKs t^z7@ʞ:ujq3׵E\ޮ_F?~n^u^KeJ|TJk2ӧ``~C)o>ct}r {/sw p.|69XV9V@.@"y3}>*++ +wS>٬'"z3if[)zGJZwdA}!3])6lFhԶR}ԺV`ՁO`ov#K^(:KgН oԗk l96)VpϽpd_:\[[ p7wp Q73>ԭ^ܱwk͜o9Nkǩo9G9;cߞ!.q }&f69pQ⢼$#JSJFIkmۿoX܉K'}m;}];O_~Ws///o}/l/~~Vw75[}-Ͻc- -fC//o}/cu){7u75775Vw oj[s[/1{g?^xC_[hߋ^/ny1"_$>x[Z`^mo, j56os//yoko o׉k›:{v|4{-SϿٗҁi=|[z  j5һ{m+ohem.mͿW4:{::iw4껚>mi[+Kkuwu:W߷oiʻ+e,?ϴpg::|z}>Z8N?Ͼ=W>3z^Pμ/kwt󯾯PO3uu+??L_:ȱ3˯L~Cgit ۇ:tg:t]}ϭxg:|}ϴuSwj٬2ԧMJg=مÚ;YX|q;y-hvaViavAu`v4?Y_9ܼӁÚa ~s4Ɓ??kau`?PgR1W:ۤT6lI|2esieT7wHsw`?}Z8pXsjA,}ayd/7;g8}:svknY3lڻs5PnvAiy+3;;}>?=fu`ߜv?f=hߞM}s7W{BaByV43dEiEEqY޷{V=ݻkYڻO{jڻgۥ]{{o~ܽWګw{ڵgvګ]jώ}ڱ{YۻڱmߵSwӮ{{c.]ڹsvmoc;w;k.=c~l=qmtpnmGcSl߮G#qny1=v=kC כ65X".^RrV TT  jkV+试z\ .pU-AUq.PU -ǪWUAi뗿hlqUYU`_@[ۂWCU*blM_Mܖ綼kkkn@&(V{8;-ޏb (fҒ{%S.=kez꩛bUkT{7*mo돂n^׵zۭT%bc\ \9>rww Sm׆}7si-ppZ]ڝccǎsFol9W'+DY 0% xk|uF065?>L}F_' +ec:Zvki훙2uSsCZXm*(ܹyunUʭTʕB[ycEWުFu)?G$;YZo)ݨ_ֿ.3s޳8]co^dQ1 \>ɣ!Wt,ZZ//kl>:E6;u8 _UM0i󿪩EcstAK4r^ӋWTX>omL,3b \m|]qyMsjbEM[2~Uˬ+Y[q\}=qQ3K4v&/k8m_UM5q|US5rES+5|YSkr岦V.i|VjryUS'yUSVf_kںrMǯhMرUM Mͫ>4q&Oj$m^vٟ+W5s⒦Ow4s⺦_̩ںr]3'}]ɓ7 m=yMSi$ǮjUyE۬ܪUMxM[Oz}5=L,sCN^çnh>uMӧSWkWߵX[O^O^Sn޶i'gw(&nlay4)iP&S6*A\ގYj4Zt.o08e9ujL7+Ú9o3F3*ϚY]m3YKƶAg,FCYګO} >ǁj`*+MdJɐ%nNTwydb9h'7erSJ2OԷL7ZR6yeRs^tFTNLJtNtFdҩRIgNF%{`8U:VyM4)()eOȤϤHL0P0M(X0bO^'/kkFǿm'k'còΧ,;Qnj% h6@e:o@7m=4R`g@/l.e76*ssa-LZgXa`if^|EKx,7 %~ҙY#ۖ12n'3YsTe,'n~gZlZƂr:R6r7LQ6WM5ژINe.3)8m_7*1m:t*AtփRҼfR)PgI 䦒 J8V:ڋ*ZSM=P6hDuNQTSQmmTյu^0kV8]uߨO{2?1 kN^!.9qܪFu׍gMMMy{Ӂ4փSu+?ߛ(ry_U@C|PkHh[Z4u>e awϩ/?f>}?/ҕpzlVhƲ~.c\߶{_+x/U*[:@5w9m; uePz2.Yi_Kvt(o/hr񬆖ԻԬȋ?D<±K*,Y.`/LJ]ȱEv`-ǎMQ9&)wgMǏzS53G'nHn=~Yfj[۩'h8kvbUOku)j[mO^)T׼z'_5k_@Umc'i.*`Ը'V-'oՀ ΧWC&d>,JYQRml>Lb:TpsJLъ*r.Lܺi9p)`32׋1>>yh?YS? "ͧQ|q.Ќz؋ʣHyQQ{&sd Z+(i2FI Em0m6MMJNQ(pQf=+lVISKϥMa4(+I%3 J`%¦mP5.6W"Q,P6hYTimz^-x"me3f3I%S"7*)4JO TA[U{P}rj]sວ~]761x77e7kkkkWﴻ}w`綾^ R&믿VM7b}ٵs+++7;*~[Z_n_bEQ뎟9sf-.oyW[^RBQM/ue򕯬裏я~dVi(]YVy ?Ooww 7~q\}Z~>#kj[u{mj7:~'(>l28XkY {殯{ rmmm5Et>cވ߯Hg-9|xZz5 2  \n_ foW52m*gouqK|qܜ{Ե.o~=0Q}g7*huso'O p"v/{]z-T,μ2B1\ k:<01wϓ3ӚT41JJ86J'SEn2+9K6\D`FN"u=, \,|Qb =%-p u'0.@5E{GW4Y= 8rԵG=*Pw[cAGϫ` 8rn>)Y$ vSdI5F\Y [|488ǏAgY5o;fJYx8=H (<䳞6~4\뱣)3FE.Q&/[y˗ Qݚ3.jz,ɞwrf̲y`- 8ޫ*E}{Ǝ/y@wŃ3KW5KyfT^2_ &SrPZ'>^^_awjv:j0޺|C(n)?}U-] 1`v^F=M2JajA[+fl9w4qj԰S+)-da|WQ6 *gkF99qC3O^Vv>4Uה} ol͛Mq^ ?Q0$G. |*,4-SfjĂe(f395b!,ŀ&9Y^{6ɷjXlN)[^ PĦ O)씽X%۱L^@A7NfJff#KsJb3MOczrJ{TAW@n*djXg"7l&9IJr8ɩgsBE5m&U"6k6k[d$Ye(f+Z%'y'4LQ:ޠY!M sԷYJ6Hk ܴM6Pm"4{ˍO~@,XNI@mZhN ԴISQ$T"56јG - >X]BhQbGi[6j`6f ۤzբȭI*\_pmT'l D!-5uǹ&b0Zuf\WSPMj ^:U(jkTkk<`^p܆-m:5 B$Vu0)m=Hk ܠBA> %dq|ŭ ( "PժW߃U>*Bf6R>Wҧ 2x{,Asnq77a7as\(((YwگF.7?({+ 7X{+W+eBKgw~:UcԷ<*gyFglǎ +[}ݻo>bC >|?,z=Z_;nI\;;oXnw:OrToo5bnnWV=  vȁN])uPE{@n 05 pኊ EҮdH}z;_=\`˕@/*LޯUg{z%XP# b (yC#e|nKs;K`gC6.F5Z~)[؁LG룃 gs2yxo5|r]l{^ ?~RK+wp`խ?S:{mok@+m1wgS:pv)u|~[㓨v'gY)DO(07H2fVDLJ}8VP3++dQbGnP /0 A kp;fO%wYLӊsfɃKeɌv,ige`6H2ᕣ,DJɢ6KٱH2H4k br6S0M>RoIœ`Q=[n5F"ԩNalVGUm V{zy}2 jv,XRmP} IDATug\]@MժF2&&@0(?6ʡ *:25ܷjBjHYܪ@6P/@_>_Hl~|U~\!M_~_@~OJTFi[҃z+TQWEUN߬u?6o1x77e7kkkkW_GnsH:(~hY?GD/^:q.7K=;}.[qǾoR{pK~rC ڕy׎s.0ePzOaw׍N^N.\qp+@Qࢼu شX{nrMR<蛃Gy02U.෿CGT]TwEy2NOOirjnsc<WѸ)'Mx7Wأ ]<#m#,cfgj ODEJų~U9gQ-9'k3~yZG='isf\8zZ#\O*h|GΨ9я'^UkwgDG^geiY  ~kſ-(vOo)9 -Cݯ|qLqzr2J4~}QOvϘ#U:%rQL~d엏`Glkk@ݣ4I_E 8/{yk(k͊Ϩ-2*c\`5SX>{vc==xf7<~lUtAҝ\rw?~Ec'.ij^*,ͦ|l3+5s O/q/6 yWm/kZ0M ]zU+\|Yrv@D 2y]^N4`4^,jլjPkeh^L,ͺ8Y caG M@",jx-> ZEOk,7e0A\{J7 ,X6GZ/7/][S gM9)o:tڔ"((aGfg3*n0?W<dbކ}i<@Rw,L$d"Ygu %);T2KUS֒{o.IY| 65:VTUw303êQDAATI4.$&.߸leD] JB%$&{OW>Ps]}UumzzLoX-J΁z} 28ܔ~\eN3Jj9TeϪ{V>E5S:*[V EXtUY|srA]qRABjRJQs/ "tr\LҿY* рae\Xɘy +Q *5S˚f(E 6 co+=1ǵOq{Д̏Zzײ\+ak6Պ6X"Otfa\fgu}}Z}-p|غ>r>`F G1k^쑭ca\mƢ쒧\%ټ3u,cdɮ؟U@0vbJZTRрYlW:,HkvTeA \lQbbc*Ŋ99crN(`m o, %Wb"|nM泋sf@i)γJ \>d~fL-J8i]g)6绒6ʳRQZjQ&\PSg$4;er$ʔ@XQ5Un6l<)̆#2nC#o<%JRyAiE[Իڎb˼Eq*JL[```~vnohkc ȶjr jcS+ʽ^_n=m;0m=k[m6V-u=-]VrkMD}QnӶ-?xoh{ufbmsh@31Ќf *]5N3o\*m;$ᩙ>>]7c[̬Sn q̏%t~ӹY>uT]49r@ h;\p LH@s:3Y^Ha47e1\V,홯a#.m\ N#p9cy|7R٦qrؾu%./5~׏6S1gnh9V ǖΠ\*"7G+\(-%Y9@[U<6XVJlzyl)2|%$S4MKi>M<,xI Y"qElTW1mL&vwc `Yԏ곞Nԯ+}W+ߧz?]uxzUW:9vbk6oaT|n~?W~?͟?Վ[|lI |z}zUWʫ>RW*{ZxڶerWyneAHl\0&6/`W^ut3Ec-«K_|}zǻBΥr_Tf .39[Be2|erUf6e]5P0 p,Hr g_Ԍ4+Y΢xLX , U@9ؙdٸjHeN,r+0JIՒVR+(!5Wșna0LPhRka-RՔcx;^.R K_9/`rjcbkUdDZM0V)Q\n֔Tl&wd˖3R \V 2y?JX洤mF '_}:VȇmFȇַEdWeN>s㽭1 [ׯ||8'okaԸv]ieۚe_W M+;vo(8ަjz2fS m7NaVq5΢hjYՎkow4Ʒ 2m*?1@`@K-h1ڂmJSh *ǒ9Mr@v&[2mYvew.7IWAndn/w}'ءZ&O7̎һ'OwzIc}ܤ{gV~[cumDkvx.,z]|n 9[ <5|CZy/@/)}qYs7<ע>n{H Jćp5@LqS/-X>/nS>>2Gz^6Eͺp3n҇Ǣ<@N<[̳O|x[C(|;e@ow"6H (&)?Gݠ赱U*\j0ס-w}Q!(ZU`%Jޱ@ҶqgU@#pj630[T```2:*[,r?`.;v)x-L[iRf5[9VW, qEloQe:^Ui#o 6D+v\T+>; Էe]ixºjaҩ^"}+0娷?p>.^,e"lSLcN΍G:ן>L]߳w| ^ռ>pGJN,YSҟ'+dz{Ͷͤ`ٿ4 . @E1T/>5Оͦf&c ثs@}Y6Kǹȹͪ c=w85^ǼSFYeۀc1Uqa}++o劲XqoFJR;RoϿPa6 XT0QbyX>`+f CSCT'5$b BԶFHȦl %\nɺyFvC#Svv vنP@`y t :X+{:ݎj۴^2 w[m;궗}@--uPnRk۷h-푏}cPnD6671Ќf 4ch&G{97g}6<jY2݌u&&_ƋZԬ?)>)𶨸}(y8j U'`n%O֒֒%=7xnJ>/X}"Y­An=gwϟ+߸;ڗ TXz5Ci7N בK_sq8&<67<|>ܾ\ߑ.㸜5t;}(|(R1oǪ=ׂPޮ~_5eZ? | n5>yߙg*FA6ORngf#PU%ִĹ3n"lpQsg TnfJ[t:#)kmFe6U`ub2,rf塇@Bb5Q cīYÜC+e;Wb:m~$N}HN{MY|$};Tڏ\kjbLvdBwMXs PQ3-Bs*]?f6ɬG=[\21=MTܽ DqWi%pX%2J| .*TE6U2`tz+Bq;URQ6ni~rPjV,'[_ E#Ѝ (mQ2:bW>[wQn\o 2TSN'gQr^$O5A͋U QNQXZ+(N96v(ugֿWNN淌 MV30wRr1AE;db̴rB-ռn [}g3` ^߯#OlP6uObWvδm`}f<* Пj:) ّk*kl| Ҟy@w .PVE 4qWbi/~uɿOyƕgqY|3 {<`UX7 dlyH &J oxE%g53j,by]66̛̙|vၑtX(ٯۣ;R2JuLwy{8Ul +HQ( }^n?B; GW IDATP}GQ/˿5 wBwn6h06ʃrnGX$ 7C]2p#C =u>V#{p(pu :v AOvYErWljw{:X"wv~SngYKmt7iiٸڭZoݢm۶ ݸMpGv駦1Ќf 4cx(c?|lټoWm AG\YWz*O XPZNҋu_ž8sϿT<Pe---k^֩ᱺe[kX`ӯc;N/::r}8 Hl-{C~8?+0qkpwGnr,AXEZ%XYٴZ&.lKNLU[Պ52W )  qԪ[#9R@AM>.|4Ǝ P]sjW}grC,.P脇9(m>y|}Rl} >ϵt@2ip@;r}}byn?_Gm~lY?gc?6_K/|Ӟ~nuۜvY{m2_S7[s}K/7}r'b1%.yyC7ze@0q \eەfai\|3U5Y+c.9\- ߖ11p╻X0W{se1%j|E1ִNctY.9ziЩ4ʉ)t\(m+1^]B[֓I:0uΙ0yŨK&# K[¦"}0flc-*\ؕq)9H b審 0+WPNQbpҔZ᥺> ^Vۼ>frW{+sƁMZWN/z?oӟ t}}ퟎb) T6:mvjﭓQ8FM땸\[,4!E3cgךE1kS*rPme(ȱrE}mgsNkXRٞcawԀ.l)9>6}:ELwJ3-=WW";ɰWyyT*&O q=m=T y0{x׼^wFSGJBS[kFds˻E(0R T0V4BYjzHk\a)p `8Tok4kԏCꍆ C@A/[M zvoߢv ΎԱ\\DmnG^_Ar^ke,=˺jaXm Uk]R.p&eNmy$`Wh+"7fs31Ќf 4cx@w#wC=Nmn7 5Ȝq2S;G6v(M˱Aujo A@.\`./L^[{O O51|##q;ZWOܿȟlyygʇ},\ G9zZ/_my_[|V_5.n\do߯3PyRM28tǙ(D!iRaRrN}>,*V )J[UD16e+j\. F7Pf)Mb-ژWV@;8R+ Z rbqX9o PzfTǾ>YX;!쿯7?m_z;~\MOX9y7͋t/6/S\'nqƊ㧹,'?6y%ӧ(o}mg( ܽ-6w&TZ`nfkWyg?iz^zӛޤ;uرX*29g瞭[wj2[.u9uYhsf rL˙plp[i PC)96Ů3,rvNU t-uܦf V@ee Y~.6ɦOEmsF9F- xڸzKeԴcrhh2XwMM/0؎e͜ŊBvNQZMԟQ/+Z|+5}>/iJRAaˤ5E*P W90j`}qO|O<6̜gkclze3p(hQf-h#r 2aDm_d֢P6͵|iix1u.*1 dzŭOPƁŒ-lD*X(G]kwg8^YJN߷n-vҖ'ȯȮlmܛ9۱=WO9Pu2آ^*Lt7&cw)ߤGRTCB~bsk@U[*Θ\DfAqE{:UgL[wY_{ Ź8(f;%a(R #QT1vyPC?BeGBDf<iC6ʽPP 5 zm;Fڴ~oݡX%e-W/vo~6]K6.A+rQǫUe˶jzZ0mi뭕%ZP޶U۷lݨ=mf 4cho 4{C_ͫGz sLG?T+بx≖o*qcZ~UZ @A?P)aIMf(/`-tUT~ޟ=I@Ҿޓ?EwO%MRH"M focn|~q^\LF=]|!n pkx[j 3ӁTq-U$\+Ƣ2Tj9 a{(S@'02 Tia֑)뀜fJ(1 ȗYnMPrT_QX#.őW!`֣Bk[)smĚ9& ڱi.q\\SreraqdvvXikգӢ(d'obT߻wM5>Nz|[f ߡ/:_N@z;1 o|ϤroSjqRDqS׬IR/3J%)jA}k`Î1Pzal5{"Wugn׿g?$['"6zTDq7d- 畲{د'H9Y"uQFO8.Z3ɨ.lȏ-Q1Pm ?cQcmm (jdآ^qRy%3W%;`@5dS@YTVm:) 4{{aԤ陊Bsr銝 cOYYXE럱wzt'5}.hڰ)FU˲lJl[O, ;չY#\5p4V˦.&*le Of=c$8njy(]9UuXi9@]xѥ63glUUx ʖʪ]o{ןtڱhS2oZ-8X(r]eP֬>S0g=c{hLQig>5-Q9Ni2K -6QD,((my(N*Sqi8.2Qi׶5 ݤtDn! Q8myH[ `65ġpQچXa~i8L#Eá(VԆCȱ&  oԹD^L]wv3On jnJZ90n 4`U+ []ȯ ݞzڽzݎ:oQ.ZvLu,iif h`r+ЦNK:m˿}Gl7nrs͛kތf 4cx@pr9?k|fRjRÓ_t {<M >չ*wY[ңuGvQ^~\fw1ŽfV>5Y[tbi0rרiӑ'lz|/.?i9`Y=_\|/@N?w߾}fMr%-y^}䰫$xkLs 7Թ:oW"*Pbb\)";V;,Q}Lk6aW~ž979,}aǜ_SԀiYd,i[dPBeY^V<,ӆR5Y)S'뇳Y)Z] 7?SO3?9^x O:_ v 6\'褓m,8u-͏m^{ŕ= pSw [mLQKmoui;=t&\XX h&3˝n^5:hr6Q}ozp҉'0_rs X`2SM+o)qQe9>'הؾ^1nEeBA tҙL12wpզcMh)~QZvZ,pTdbAMr ެVL N4Nj1`+\ mtsZæ%wE,–N XӦ;YVl9{{d ,'@IsQrN1Wٻ?it}kK.^a շ^Evy|NVg׀vYZk bڌuʃ(u>xd2Pb x,zƗ)fd6 oԿXF]Um_y @jSKMu1Vkשiӵ4 J>u/C٪)~ ~x (\ľXKl䡝Rq:6țg(nKe|?dXcշ +DZ*ʲmc\Y.YY4]psߝDPD<@͵c{k)Jҹ6e&.xE~oU4r\8S869Sh6R4pCǵ)TC  #.PhGy 0ȿaơgk0P P9@n^U?Sb7"yN0{z%.Y6zj{qi{'Ng cv=j][]^V%-j-{VW[ж- Us3ѿqh@31Ќf hÿɹxsos |ɦ~0c}pif:^-*c:=Á,8E.˽N[Kzlxs5rQݐ?Qo6?͗,0(rߤ;7Wq翞dࡑzZ?@g'.@x5+WUccWzgPԵXCKi ֐e-*]zEu<2Q7Am}2.f]` ⳇ vaTcY6mUeע޴HF-6Gٜ:=Fnv[]u4̳czfΛ>,絇n\-O+6Kc}bٷPɷE-k;:L>}e(]3} Iwkێ:ݺc֭#fn_O~뮵<[&W4D<ĖbM]R[EYo0f TQs|`(s lsN5+]ԙޞ%[(Ej׬5eW58e)-OhIbKGnYL&yB۰aFu;d^hv^ًז HA[c1$xZ SeQl v#=gί?qS,^mAe;m@yV75B}l&/(s%Ԯ#Dm@UiQZ^2ƕ,'ymvEƬ_,nbNɵ2?*_qo^?s/c2pkQCvg{umYZ5y4`@wO6QbLl`-߁ %k=eVP^)v9<`d ;:I7 9DdPV^\,>GYMT;yY=_պ5:si4cgQڎ2fd@v'@\nCVaQ8pm<9i4>96xvCGY+Pa߲p{ԷA s AM!v

I_Ɏj;tkPwѺyml@yK'\|7|^xⴆL7Ex< 5Ew3>%:\X$ pJlaydcMkMĵ}Efl]@-XkJ\=xLl rXfLvL:Ed,[,F?f3em]+qS%QX(y8%IdV9ԄpwZ]{={-Oo}i_ۿe.K|:::3usts(sB-X(z/~*)dآ6X>1vN}٢ T,B;oSW*sgX0oš5K_z_^~1K^>_oMVccY,֕)ue(w4lDžYcv_(iQ,\>禮d[5e) (rM e~Q撱Z0Dj*[ٚZ Y*eb[h:ֶy P7:vsYw ~)ɵre)@;_Ӂts3<_o;뙹{mTic]Rgk*k4Voٵ[}2gT3[i=kQ7Zٖ,7%Oٸq\_@1vsԪP*9'[cο?4H (m=|<o?j[E-V|l LIݜf;Z/44kd (Ow3ssW<0 L # bmhi :=+Jܶ:Z햩q{l;-:.u2K.9-uzJgrq--zںmF{#y{S6o >f]ssh@31Ќf @wߏzֳ`|nT6yn6}eUUD)`ĥmfތG5}|}\CdՠVbjĿֲvtW I'ݣc,P(};?J?u\w[︣%wޘ-Yq7Vxr;v4W3__z]-cEx[qg3ϴ~pVoZԘXYrQɡ%5*Sa/\@dg5uWƅ`2n }.5Y"b40 Wz-*IJk QaaU̍{2WyQWaŮ-Pf 8D9Q㢪`MƵYSԦTS`=|X @H gZyV? Bڱp -XeQ_|ZM]#ځ .[[@7w >햵 mJOV2P.Kt51dp˱"׿.Xyey|]+ D<*g?řs2Љc+[\q(ly/,O+Bb|ՌnX%w\ns˭lSԔ(oQNPzqxS <]jxc(} rav,3u岲O!,ڀ$ȕVL땰F(LQ{ |EM[X+ U(JجQO Ferς%s`M=b% J_{ӫ}쿴wO ꣪E%볈lEm ~7J,*z`jٲnSbWu^5N-Y…ϰEU 6e3Qere:\sXtS6[_8gE-[aOo3_+Mi H桉Y)@? IZ|2*9e%jJ.gL[ɯEk.yߍ|╶)eOߤ'[- {Bǃ4g۲j[D!njN,7muK%QAP{ᅗX-QDDeޫlGCGA0Vl,j@] oUmO}2)QZh۶RvG厺(vSn-]RR`6u]V{yY۷Զ-mMϛ1Ќf 4cx>n7dco޼ـf X6=w}ڿ)%6.NMKN*;xbUVWw,{;dԹ,/86_,7nosEGS3g\hEKn-@jMz)p4ԿUi<Ǝ9SfCjKvT`EPϹM}xX;w>+W&g=wme(3]~ٚt;MKvitAuz^\už-|Q"m GMvew]{蕗^zҥT]v^~+􊗿Bmq+pQ>w|+f:c}*+-P Vf0Gcx(尬-}.\@n"pQЀvX#iz҉}'@`€a3EY^s(pyQˬ-scج'Nby:e(|Ŧ,F Ī1P>rTaF-t[K8F <1AJ,~>,b)m\O7w~īq߿w}Ƈ[potf˯}{DXgs -wL?,rזm6(s]#k1#PS{m`m0vŎ)k՞gv\#\oj tWo{]x90gn+Z2jsCK.\>6zf*lܸljJJ[*A]me)YY@HY@\|.yi:N1ٸ%>@2+}ly! +SFĹX"WԞўgϽP}XԦN߳WЖW w H(V f#olvɡaa?3E`82X &y@ T7 ĺhA/T-yZ@A ONnNa ]r`H>v]˼z}u>vnumv=mu{jwjwvPؒyvdmk,]rV{ly6k֦@޾E[n=mmnsviO31Ќf 4c1FCl=^ipX66_|W]xpX8_je. en^YtVItQoJ)r:o-w>c lԸeh5M4ig0n:5cv}_,ۺo-3y8n5.0|.P>w3˿;`Yy(%4!0X}zP 8PTpf̱#e֦zQ& \~(y WԱbv^Xa5Jȵ9L!?5bIbIw&rKe,S7S?*ґ%P1嗢Xez%.߹s眙eL]r?ȇ>4ƾE:ߗ51[O//x^ @55޳Nysfֵ\OxA Kmp03vX[>na͡E-Kry1+qU٨~]/z^c7@-q>G"Ca+.N)?cr^)ܱWqH7HNvmrV%MJ ߙ<[wҖߚmi|߳<;?u BY'@R Bvl#RJG)ą!NFϷ{(5pDeMa(V2X*4Vyp0RH V@F.``aܮz&HC`k =pjc۴}aӠk+jjw{fl;}{Mn2kyZh^6.wVMFS%ѦvG۶n֭6#yX(op67>o@31Ќf 4c6e}6Ҍf 4cpկ\]Xn-/Stm|ʏgqzomL{;Z_wG^wOӮf==t) kVz$Sٍ׮^^ݍ޲V.épk[asJ}n|ڿoW ,p D9Ed,sZI%Љ Ћ6QGފ؀ Ĭ6DeeٳPͺM4泜\n67sn棂Y%sQb2c>Yeۙ11 8]XDN3Rmj( { 2~;`Vkegv\S~]w ?9,`-[-6K֭?̖{jXNZ,_7L[ ω?ݮbK l}y/޲5~Ym;dbzrik `|^wY.PN߿)rr˘yEꢗ\.H_|^2^tźO7К2ӖgmY?oίJ%@7 d,\ͪ6WjLH'JK@3xU2Kvk6a\oUQ<#'t`QMya t>FCAGX%{u.wpW-k, b 0F*Ʀ*:}ثs !^arՠ s- YDY*(96ce(tQ+aƉ,y,Xko6runxĔo{|U{&@ [i3G:`n_n_Kdv^:uzcݮ}Zpg[-V_VK6Pvgɬ;+4jyyIKKmm߶C[8`qF@~@nӌf 4ch/ 4&ƛ6c]VrQ咕tZ[Zm?Yuw;F-ik2Y+qOIC^g^}ٌGz1VNjÁE}.B\د{j2!JTls<Hg9> +ne_3rig)bE,$6c[ gIdٻY۹`Ìqb(ƊΨrUTJb)}cjbluB|c6už32{ffLnlj.Al5oVf NL ]WEڹ{ [$gOu4)} ކ߉?q|_UN??x5u- ܧ;lXEZ5?19|e3j㒶n,Oٲ^Cy}Nrb*}{܂f)^(ϧJnjJ(.ϱYF5 -ckӱbQ`y m~G]KJem΃A $ ,5~Ee\كBpSʉ j}Svھ}A{5>Jm]FJB\"{m(F^a;"~ HA`ԍBa?p7PCގT!Q54.xkCH>y8Πz '׶㕹~mGo;}mvӠS=PVkiU2Srp[m"JtZjuZZjQ>jk-[K]mjaQ֖mX(7jno6}y31Ќf 4c }to|67m@31ЌV:'73+el3z˺;ڦOKޘ/S :+믳n=y7_SӍS- 5ݨ.Z>w֒B,XgP&7- 7J"'[rdɨڜs%nsc>UEH[+Ȥn\u(r3sYnduM{hb066hj@0n`6]T_(QcMKޭY8S?7(7ϺY|8Rn9X}k?z>ߵs\w!Pg3ss FIGz΁_}U?u۽W(#'0/?v)YK/}|f2`dSRsjEm]ܛݨ ɝ)S.Yd_5*Tse(޿;Gw9 +ӛO7ͬ ɛ<_}]gfPdP%- `5V,tN.T)q"(d93jvX*f3on67ܛ݌f 4cWs ` APk*w]h.?A7GQzXDJ7 ]~_p3ke2rEZir7pl8[z/zV65u{wY,H'7%6VnI< IDAT 2+H 2m18W&b{ #762KtacEieCxK䜜Y}vsT\/ 6-^Zn-6;Lf-m|2_,sUklQY{P/ٴX([nY}-*ܨaH ]|/^e׿P!(,neogj[,y323(R19ly#eߴsb@eb@J8;gYuӲɋ=ד[2ؽCepQj8WںkM?w;߭wwSO}v]fi{4 cSGۑeCTb,̬A\2m@0Rp~!oo09}PA`YH`?[ P?& \z} z푷L&|NO^[m]umB u}HnN엻gin &UnRR[6:jjҳ>[[5ʍClیf 4ch7y#&j3\f 4c1P15A*E;hm,#wiޤO0r]\2 ښ tHBڗ Tirע̭&}d~8]tQFy[P޻ {e8j+`$eDyP5'JTn>X܈1P p3gɳņ9ɦ؀cܔM>WdŹr?>pY." "v.cZ^P^JsY}ScT;lY^ڵcMz D/ɾgxL^KO}y7w{6O7XjV@4}}-PZd*l\@ٷ:tWz0ۓyςrVƎ\ίO\e(`Xvz;\ej̼oQ|P}2Yz;e2r+`CqZ*LY~ cMl٧Lk5/T X(g hNwRa E0jV NÀ*Z5/[*%)O&2[ǥpFQ:T 3*m@} FvPf)B<]c Tf-l}Ft>,t>שv3?{uIz3g43]\Oo7qgsA0$"0 6&`9`'Y-#8FX$t 2Gq+w?Uo~ghMQ|ثz~UzY}7"+nۖPx=x _ՀBs}Tu U,Xf AX`W^Y&E@*ro{F= pSْKpӳ=̍];zwل2LfGN-Ec&JK6ۣ%S|QӒ^[-=bm`ŲYIx[v2d.y5[(cl5ʃe^qG{x[-ֶ&UY:MTdߢuڔL]m2ɼU歊Ѷ(x[(e[ʶ"WyeF9q)J9-L7٠e2ԸҬP297yyKn&6W%ʢLQ>RSݦsTIit)IQ&ZGKⵢ\:jɺy'kfYWYG:6^]74wggL^|}Γ倒I.YZc<e4 >c}Eu6j=,]2IQe_(O$>Ԕ1>;F@bWbvDZhYgv{;Pw(osG*ǃ3v{@WFԳwT@Kw?zc$tF :ujr{z'@$rl^Ɋe4fzȑ_z5/z?ut#?g?~[~|_45C͞z_W1J\, f3&WSӒa y'(L.;,lgM xMߌK>kdo w%֟+TU4ٶvC¤Y?sGm6??׷?SMӮ?{%-70Fw*Էnث55.7o0A8!KerʇlQn 4if{BvYkesy8ۍf֬[ȭmڻ:`oq x/=?'_?}W<Um٪)zSUDrcyh[9TJEEm0[6ȅ&Nc&oykeԶJmQآ YmlS*ʶҔV Vؒ*71MR(M3Ŗ;&c`{mREjTY5[(δ25Zub$*FysFn]$Nt,>,un[(c?8ra0g^=L0B=z +OO<^jjϬ |z @OPH|EE#cMYYQ._GK* %`ߝG .շԸCVzq~\rY.=J.ρ>qpxW;`<bI0ې72y6[eu`]6% 8)bc[ic}<\A&h ,\3mg*Uv2t9(8W *s`9Gi JM_V6Vm~^<?w]yl&wԦz^W*f- z[z;Uowuz8>D۶>2Cm` ͩ7<jl{C);X-}0rF%<8] *&{X)(cɺkޒe/:Ҹ5z 7ԩ.`u ޫN"0FJ'6XS~NiF&~ ۍM,3Ј2 zT=QPb-j`؇2y5尩|9YرP汻S  dD3\Fej8EXl&CW9O>QTE{T X!f(9?xTˀ^2lrTϖKdQp<>ۑgfD_-gprwbD!k6d7s>/FB}[I=~_7ޥgn>qwN ¢}j9;jyN(=ypdه njG~wஷDF;Y&:v:7-}:Im=Mr3;7tuoM mUV}^JU@[`\zM#mvb_ZE.TU[ԶUrިWɻT02[EΪ\lVeVQZeKeVm(o3wMM&*BYViMaMQݖʒL&U "D&V2 XiPK-v JTYVd'N#Sf]@p+Y|ȍW:Y~=(pQܼaB=z gV_L0B=jEZ.07#J߰y~]/ sc%WGLGE}dQåz˴wͺu@8Q=ˡm5d̎r)r*ӖN cG]˾ΘZgmJ]Kh*)Mz KרrQ6Qu2Z,4[Um6ںhV(|\J1 E)V4>3qwV +ε:Wjg>UjwZ/--M<[;OP_ݣbTm~.~\695Kl@ؼk5;QGஓY,[U i9 {3ijmzucot>wڑ y-;7f EQ'h0 +Xԃ{\SFQnL8`5Jq;˒f+e*l֠sө&Ƅ78?0c dz'v3{e(Uj8` }QZ-9m'Ծ72p΃r읙/`0`oPk;|a/655FU3mQvsFrQNuv7]\Y{krfŲt+rbib*Gu{CR?J:%qx/ܜ^#a8}COcl xί6j7Ϧ};3E.PenӓkN;ȵlA];{l:~繱g'`7{U^٩tJ~lj^%7*jm I(^@Qujgܠ"naAyMRNMk¶TԀ) 䢾 梲m:yrQҢSoKd؛l5˲VlsFY(Ksɹmtu]rV4X܍` *"9IL\,Vo[D'&V:IUrl+eWQ"W+c|k~ybgp> =z @F_\x9=z @Wf ]ia(sQkmD__{nA0\^d\y`C6絕 ӥz+S^P-Wrnm3x>rcxз Fnߺmy-u*ի휪$Ѯ"[b3KbԲg9NQb?{[ǺT*SmmݖضSiu9gٶjUZ(;gʾ2 &58E}˺X*g?`Qb]K}oϱSg0*#۵s c3~`R[H3v8[/Jf#0u;VlK8Г/Ja%ك5csQ\ZXTcLe7rnpoTE=Y `P/T{[Ƭ"o}gO@Uh;&@JU P=D 2;/2|`L-=1POD;j>׿WX;-)3mzd,xs(oYM &ה(r'zrX539(VX(Qbk<^\Mky|ޝ`A tBILaVA0>t8E zBmc` dp:HcYrl>N}O6Xm\j}}: ]QHsPv3lݠBdKSocd`q+7<~v9u347Kz l(a= &縡^ 32k'9G;$\ޫJ*z[emQXf۠ @o%-Y%m}-ycj,Gob=0}rnm :緱%FIմMmQn1UjJ.+,չSijVui F2ԹenQrU^hהdV^m}} w-ݖ-7ٷMi`vS!0{8j&m ܔ D|l&CgDqL,NdZeX(JiB68AUI)x?t$N=щtwSO$Ͼ.Gl0.>jy!@BXz`?mxZ/r ]1@S,@mYP-ʀ\,x]|Y2{T<^+REV?>6<]q'S#W#e'.7syIuvR}xy pyApy~]n28 ]b-om.`W3nŞVez%ld$UI^Es[sQ}2c˝֬ZbRT=م(j9Svv#ULK}Կ~~[ d9j:ٶjj@>=vϋuC2N5Q辸a|?؛f5r?-xyGF<5լ?@Tdv(mؑ˴{%@Py1Q9ԱNykg6۱OtSv2rǡEٶgɨE&?.ۡgeT=j% IDAT_SZ`@/P 4ng eԵ eioxx ]S}P E |$^9EsfKLn0^$SBEcz}.ֺX-Iqpٽ $0Qlݥ>[DWtD}n~jzJ}>%c|j53QZ}2,ɸo6~?Fy`ͺn;)^Ϭ%ֿdg|eˎî^;Pe` zd`>;j9 (Z rN{˭⭎'z{U jPүY ĵ(`K=BY{}'嵭ԶrEs X{en| 17ts ,%瓋:vͨ 堪کn:a_lgJZ+r*^[~ÛJ5o[`-U ֢ oU@ג(ZͦQu*RyYkSڔ2,Q@]oɺ%Qʋ+oɿ l[e^-@7JycvQ mxUxͶ\IR)% dC.n8^IelmZ[i,K blj8VlpSsnhLT+,Y7$Z6qxU7TP Ӱ z @B|{ ZX~B<=Y3@qJE7nިv^Gn%}@.T.ׇs%}[{Ȕ &k-ϗ8]n,8 e7A7oo6X䂹e.v00hJfЋgY`XIק7։[gl~;eQFޙ ` 8ҨF 5eWQT\| st9``s`( g햱oȶ%vpuQߢfqsg֛3 2ke /4b_[/@Wu0}dy-X9퉍,[3XG~bC;MB;LX7 #+ԑk L|[@>$w=0,XOrs~, bM kl +m>ݱc-wG˓>w&y^s~-?*Jڝg ,3cMjg?OZR}pԀ-c&Hò gٹ;9;cqS6+o pjV,GK?iT 3,(m-vX{pPgpޞEi]f;@1Pvgvb0žsޞ}9.7Luڣ)fu2r}wa'G]ߘݩ⸚іMmSb_v f27xqj,@UVɵ3JmUv+BW^ >6+{;弪*eUp*RY]*7[o}>n--Q g5TJ [+ Yzt[(αM*nr +NPt_ B=z3}}]X].e8oB=R=h;i (a| s8җGUQwQ?]' g\c#$`/@OƋ%p~KFX*_w`KXh{ǖϗ~[/=M MPF]j W,jMT>``lt8BmQ6+YYXDY ,gҊ ^)X[_Mսz{jPbm,\ <*ZMKG-C[˯Unh\ȒM۩3쬠Դdzp4PbϪ]Xcԡ:Da6ޢڏ)w'mZl2ƪMi{X`/Coj} M-Gn ꡪf EE>V2wM9]BKh`4JZ4F;vxD575'{ 땫e&/0+^zoyԟstͶ5M;lT(q'{0S+jq?y9@W>_=}T2mQ[+^%Ȼ cnV K֭5Pa.:j;s 瑺/éـ4m?/ԱL9Ik{jfҝAm)ervraYTw(fBfq#¬{w 0Mp`ʎc۩^پS(ryd4,6(gn;'@/ydOe}nBAyK.. |}qon!pKsJ7WrC*+n@YoC.ݭP:UdⶭJ˺yuUPkCy[6{d,UehL[坷T.KU٨(PnTYmrh[BE΃ ܭ܀n\^jyω@ؐ{m$o ʖRyKe2mT&9Qm\`ɔ%T(cQcc\-ՙ10`mJX`."4h3 {<UBgսvENƬm[lEA{ NۼB=5\GAsJ9E5[$[./pWg,d2YdDuf̼3cC͜W3ӌs%~Q/kb^kֈjTArQۢejSr<@R߮Uhc۠%C0ۡuD;F;mK.X>PGyrD ²lܓ CIH~+5&rvQ8:Wޚ- Zc6ͣy{b4yXl8{WZ3*Jɽ%VΠYPINjXc[ԾlL}D?<~c#pMv?T;v[⥾)R+*[c<SlQڶfYޘ^:rE͎8z~GQp3sQNkq;Eyk[Z-7-]BEZ־;~[6%dJ~TijA5-7ό~fR nLۙAFs[,w 4(nDFa;7TtjsQ y[b¶SQ֭rnlSQ4*V9Yr UmQ.H m;mx\2pJRVʊRY(/ Sfyi۴ؘ24aL6v[(SEQͶ-riϳTv@]`.ٷh;e)*niEpQ&gc pBVnj\MWZljVQ4Jtiʹ2$"\>z nPUkwQ:uB==B*#ABX@۱:rh*^yM7ZFWgo/v_~ToٸO?u뻚S>><v=Z;?׻զ{%ۼO0K?罥\@.v p p+po=[o2+]2n;`< \ԆBk-\C|E%Ulc**sۨnuf]A$W2^QO&e z fg hj`Os}3.V;>۠҃>O!k `^۵Ջc qܩo0>eV65<]hƚMugJXʵ)vȫEI U3l2K^$ Z ]=JZmz({jƢEesN@,LF5.@<]ߢC 0\A#B5e,|^l']b_@RM.˷5NF;ZT-e?lGX_ŞGkN=SZљ1ZmQIzduz˘Q{ϗv8UThzw:R 1bG5`i x-vE=L-YE*QTdG 4{(O?t:1Z,6ET6%"{KiG}|z:uz;QAo{ ׏-M d>JspZr?jsU;/T]Oa(gGSHX/=+ c 8هWk7 6Pl}7`Ps_o d;TèΝcemRbl܌RVuqu䣣Ei v\gܐQ_EF9𖛌*2oV[[o-*uڢT׽:%JNU BzP[N9l5Gf4bj\@. -Vbl[n-Taly@[k;yuKF΋쒋m4oTnjmrs%B[nܭ J\,씱PF}}2ɸl\ag()nf(nҖLܠm 5=r4g6Z%nhz 5[/Gk%X'G'ot]vCןq~^B΃\. /5OB=zOO<^dB=z5ı\, hq[NnON_}߯[/ڇ, %dpIq+=ѕg`=}%sN,vY.Ey,p9=bl<(\zd?ߨd=%_ť:`b+ly,l~+3Ű+MfYrݶ3u`+SZ}XGZs̳؋]/o+oig&['3, RG27whx)Q&bQ/5۵mmv=(k7p `E6XLV+x'c-gvG}?łـ1cޮ_`qg@/TK}6s6,oc h_ߖkTc|>Jq72SN6g`xMn2V("돍|[SeȻSXy`~MSG 6 Wl[q|Ɩf0u-WT@[Wh;[u)UUYخj 䖅SrYi[avV֖{Ե6JERTeenr,EfY96"37b9#3FɦPefJ˷60Enҍ@n6dwc̍MuƩ5o,LeGEi@ڈ׋B7zںQU.+Ek]ן`{~nPw_닻^B=>. apnC=zz`o  [*wDl/ߜۋG>.g{/ovkźb[@˝sk8Gݫ1ǐxDO޽)p en(B_9gbM9OQK92ZQ.v Pbv*HjS$wլ|T9xe;SZfmoVȼrwq2h%pmKffmTN"b=yWV qyK}t,ުk<^85~'r}n<5_ 2%9Qwڔd֪zΪe{)%w0<07n -e.^kdҋfJ-^쌁>CPעuPMd:.nԨ٫QbYYԶ^i X5J=FaEkBlbNfӋ[2{)ρ=`wQrh hkN.n4bT> aO^Y,`* ZRKdꛚ{xO.-se]s w>LqOb|2{i3(aK}3S[X ɋQkg[-*cz`8X-眵{=Xe{4>5+eƀ+%-sլGM t=S?{b!~P\q96S^;T`n7qcܝ3rU&elBN,`Lwwjڝ~ܠƪ}g;&9k \ѹIQ&7߫fPAYmk~g0Pj*~*`*ۢkTԣ)rdڃ[5ʫ^9ٷu(U(p[+nV]JBDm(+mZwKeelj-g+m9Z2oJ6/UNE mRh([-)ˎ9$o;g/f] z 6TWfa8gbJeo>_Tɨa9fͳ::vYIs:y˶ܣ_1h7yŲ틙Ϟ9Jm Z_C_Q;q6Wԍ|O'SsIP̛o{[cɍFvk7=b&Mdv&6ȧjn:!zeM2ݨ͂e7--]%TCJҖiNÍSR'Vf<&iUeʬgHkSSlG5Vd:Si-lԐa[ksԷyMUj[Z֩U$R2MuV慩j-B \J.Unrٸ EmlŹJNZ5V[˰-dI4-&{lMEukLh Vi,S&q86jM=r0ijDZc%(Q(ZJWhu ]Ym] kϫkuP+\8=z @>[z  az!@=8 [ * T\4ѕtgaT{Q.:fh~h8\GKN_2=Fm.Oq~]iЗ\z?| ]_Xxs0ά}mݺA(b`*aխ\)0 bL~*Y+ڨb CQ\ZH땥mL SWy 'FQIx~%_@PꀵV"F:U-c 5hsp> z~q}_n1PSGqO[^Q6vvհ7 ԡvf` u)(9?P%~OƞA;j*[L7`l (F(}9pr%/VfgZ.j9xmxR;M^O+jdTV wZf稖c{^٬Yg"s0t5f\ZU W2b x[Y2pke3ggj&q,DըHԙ(j'l(ale+ВN U6&u8&2w^,ǽQ>×{z9۝4]'9xgf2sMq hy>˗`.(9QFQT^MA|ػ{|<~O}wH&,Qʚ<h5Ų#}ijiRǼ:md(ϽOv>fT~yE9p,ې{9ژ}Dź0;:d<{ ȒMX z2l;1o~;P [ހmscǠ f2T=ݙ@vUu]Bq۱/ئ54–Z<>iM)$״*Qn;_XvPoݫPb\l󢭽ڶF٩[2o˪RI-E>Zۺ9nJ0wS+#>/UkmP浲2e-mM9mM5JI&ߊMryvShMrNmfJdzk犲rq7Fq+36[,c%v8#vuZ0 %KbQb6ʩ('JZӵY*xG'JNDkk#VVqoɿ `.*\T z @^sQ4\z @b,@rQN. +kV+أNt+X.O^BK^ }hxX:<>6\2TWnԸ/xNo.E}F<ϰPun|A=q-'8 t*-/c,{dr,)Dز\mV_TXkKuG}ɀ"ꬹ>o((ƞ(cre~d{'A \u5Wr/P:S{2pPSsl7CԆY^Y=@alk@L-p lvT{\ 2Y>dtjɛÆe46vAmà@q;ãe%8 "Mn h'?epMemkʦ'X1Pj"9נ9MYʢak  |^1@1Ub5Gc6+^` EJYWQdNN6(7{ݔe'*>Z57. 2sL|jwT5 xB;,siJe2uQ)P\ R̞շcq D]<'tf|>|cGmkybrGf.Sޛ*vfs6}Q*8~g?Nfg (if}qvdbK '%Z[NΝZn-](:E{5^6쓛"pS͍{5з{k{*ޜF|7.+o'YvMuF7[z4[`L-[Ϋky,\toG]+쒽S;+ [pVeTWXQ֝6M$Qw*ZS/lW&[t*B]5nV-W[roBUl m7mmsɍ+JmmMvJSosedflt]ViR*drpd&ޢ*3QDLYXN.q*Kȶ͔DVX'Z+,DњlX$22NTkEXo\ח_v?nx^ 7@B|v@ <!SB|{`t \[89 ͣyY&"ke. ] .?.tuIإ S-^덥-}z ].7,ݾo4,Y+V]Ƀ%C6ȉbZ,JٮegЛVob^5"e}fC^6*fE앹*km1e@]fi1seR@1F-6ߥ>`S2~6%70]ϱxGGA{nF9 $.2e"׎\h~=V-JZSA3N-ٲr`*^ %Vǽo@-J=-Cm*h5Z~FawsQ !;VSv,>^G{n&+s'LFؑ:Ţݷ^.SbB1١=g*Q@Xf(7d@/l;Mm]/P 3ԡLslfxm)~,u.:asa4Q-Q~t  4E,ch%[Y4ze+˼+peE ` {],M5C9˼갌}= EΏGQxFa* ӏ߿>8?W\ p%T9ƃA]2#n5d)p L͎y ,'2&sXwoΔ`/s?fd;˨ɫe,ÍoZ+{n]sZ+@cqj 彰U懁lZ=أsC`Հ}ƍ;;3g2kn0 dk' 5B<n~߻ m}p ,:,kT}>7{܄Sc_V3EnU4XV3 岮Tm&;qFml+(Zht XZu-7%@`[*&+䭔m+mPn7r, ii[#tqsb9WʣM & gX%P&|Rw8V9R߮T)VI,z#Sי$JZZWJ֑Vɉuu]v<ʟy=@B=kw40סB=zcX+rWF)AN.0MEaLF./_vg`|\ .pQpGCzE֛\/pr_r*9@q,dzo7g]®2Ukmp%J)lQV5 rlrѽPruTdbe%&JX`,p5߰>٩_gQV5,=ٶږs}=jrdmeaojcԼs^+>C;]2UfޗGY53P [%yi#/XQ_%dֶ Y"`go*^r(fžٱ7> n%*Y}CiZجy FMȾСb@v̀&T)4-(*+e`ڡ٣([m(UN{o"}|w~wx9=z QoW}՛xmr8*!6]km"EF8ID+U'='o;㯽( cl3t_<~2wrYk@^m@Ӏ4drmQ}3,Qa쭙g0>.v,=sm clؙZ9pnQk;ɭelsCcX#0]2{M9򖱌8{jTdrޮu;f ;.aUxFz׻95bz z'|B'-7ZűVQ4Z)Z%B:(^ey\zSOFP8.z @B<=s~>Bx8Ab"5Wq%H}I߼}T}޼y\L~Vʋ׆/G{EpI{p/6%?g~9=e{>X _T޾>۪\u&-*}n-[rZM% ^I[Ju*;@JRTBQ=)mQz~We_2v+kyXrE:'>W̱`v~[wϭY}j޶Q9~KS EekK~/?7m[D5A,[>sS倰3y:b< ρ֔cw*ly3 Dn5ǒ[eZH-ikMO~-ԫyjLlA n@ #ϝ1`4Y.jd,Cnw}m̺002}oh]f_h(u_u}n$:<=z`~䷒nJ8Ql.ljx(V_Vueבe咗{7X(Ax)\T=z @>{ O" u,COlꁥY뀸)\@KVnEqC.}%˿_4Ke@.y.#?9^ ?[FOwt>ϑz v]_^/,h@.>yYTujƲUɐ 9 S}ɿmT@Q.k%WS!g5(gg(5y][l䪹> 8Ys}mWm*]W[,vq2;m~?1~x{<TcKlY64vɖQgJk){In 7nVŮm5Xn-Jaak `Q6%/y@a7n.ylPbr[r-ŽZ@QrXpYu۪nvR;}Q+yy+d,[MXJ[V-J^FVă#L'6͝})o B=peD:]k'V+Yf|vMF. +R]񴞼y{y}>gyFX{P_/?/1z @B<=?'իW_tpHtb.@q=8pLj;XᚭrI&Q}[nn.KvP~o%[Öz`w~-vm\s[y1ĥg7歛zmZ,LB-UNekg(튫(*-M[4f٠ R^o ZRU$4[}֯VUTFJ.JWPᗬ1ԷzZX{e1t~p.٪sD]}f\ؔMaVc{3 ̟sΝvn@]z KWKQ#ٽ(sQ59T_`2/JQ6Kr'ןeaMXa^B8~+oەE+Í|*N.ܓ$VJO|6nҚW߸׮=xn _ 3@B>z p?\=z{.Wx򖷼E߫}?|#9p m\\zP~_7R IDAT^t? 5.p蛺Dsb!@+9w=rs,<]oY.99gonq*p^}lUm x4QzԀ`cPZɀ>tT[X7@-5T;Uf u3߾^xQbUmu>*RӓJ^nU1o_Ea2JZPF5ь6dԴHf:5k;?]al^uk*Y933 fv.$0x;[k0q7U3X>ݷk=Fuv=}Sz-(iQ6ܡU7`VmnFvPIۉLi<˽=yVBxXqOԷ$QvOb]Zg:#WU?'z<<z @^_=r!AX3s Uo}[%_%b0p {q ;C}̀?a/~<=..۰-`_^L|yE{ P[r41UP]O4pA_П _Ϲ9vʿ=\ԏꋻrqJoq[M7l3mƳ-YgK-[/%^ű<]-K[t[r ]ZƭY&q!;'cܠuj.n{5fܨFmƔuZWlFڴ/> {GA;.c̾jX}l>sW㢞+~>ygFw}xQ(rM;vv~9+ʠ6רh pa/םjS/~9lԒRڠhuQ[N~t;O㭎Ħ0:{2m,O/@kFn<;oAM227 WqQY.dIC?%c,;wlV2  $7:^R sz=\rm1P+LQZmrUhq:$Vuk7k ܇__vÅpB=z gnEO9@}>]~Q=V}}Cb P__SOY ׷mqڟٟsٖ}~w_I15-J\rr7Z_6'l6o?2{/?..wHL_*}^ Z_ guy^_c_v9?!^KC~yݺ)g;0}7 u(\x@FJO%Y(RQŢHZ_J`qky5@>sV5@`qW82g ע |Q15k @XR g=dyGςw{"@???鸆~߭7AlЏ0*q[V_mW Xc_̹m2^k_~@6E2ۺݮ̦]YF>{箔ב=`[~8RqR_!/3zד{>TPrg ׍<\Omp$w`T(pSX^B-ɾŦlY,|K1\!!%XX V-,\:4*>cxG+ 0\kT+VW-G5QQ5,v>JU }kJ+gj9&ԡ}*š[#EAGДG/cZ ^k/X3]Ev2cϲ: xKl c}ӑ/ٶ@Vu[\1ȟRd7kuB)zh]t#eSj.-Y[5Y +4{8X͵mq,sL,\mmr(m!]Ub6DTb5kNڗ~S( %I}H;.07.ұcpv-U_o\Xb 5k 5Y##]y vm fDd}ND緾 a!A~򓟔0c?b 5k @"?1lWy^v:r| _oL5Bgvb<9P^?b,.mo3]Ja+Uо6RBU:vƨ6J@2]ȌXu" Ơ^Xw7zoY76F5 y߮ηoX!9|x\fL{SC{+_J{ӧOV{Ct uC;Q@W ĥ ڨ~v=t R YsLwny;'FSP!*yR2[.#'@^Uj7-Wft>kAy{9\: y܆ei'3w.S#[*jT,ymDigqRHfz)_*1 @}*v*g> &B [>ajLQ_b@zNނyGY9yƊpgX$3NZi^^8-Y Th,9(5K{fެc<TgΛsi6RYhpҐ u+ Ɩ w/޲.0v|]ruͼ U`Բ!un݈Qn2m[+@D35k`m5dvij{Bۗ)Ը+'=3MV.P'SiOp['5k @Xb \| D ?c~I$//~cP^\ R}}a;s(_;o~g_^s _oܥ-\~xlA>/|i\‘kҎn )Z;4;TUshv+sUr촜tɒe/J 87[a ‰)Qjٱ[Neʉ1JVEJZU{EWq Aͫ)p}U-QZlЊ*|]q!Ĭ#WWso+KՊW? E(c 8dl*yh9_Tov6ґNj-Y>;D]J Y 'NU[J1F1;U*p<˾5]y(gK6~nPZ1(fWr\@icḼp ` cEK-0wdL[yơņy(a- x+q ܘ3pc Xu%%{mO2x;uS駉,;*1w-|Q@9@Xb 5̬pz+>n,vm= p/Z#[6LG yenp7%2'?9~u-jj1ZX6[->*yVѨR{1=es8ѡ?ɋ_bA P%7Onۊ޽{[n1 NuL^{ >sr}^ePӟ\ڢH֫/8ׅ$, k*ynpjs@[lv*Ey/4)tWovU.c@\kTu3%'=e-eކa9n'- v p,wJUU+bWekZ+XM!yr XFJlb'-Qr[Ҕ^^+c؅9g֍,/sۯhU,yX*f3?w^QbڧW朷o߬WUBB˥ϕiONC 0ЍЋ[C:U- \ 0p-G/ ÿ{Ud+>wXJ(wKӈ#'׬(pQr/BXo4^kȭE[ȇR q@~4@|Ե iNx(NռZ9[Qűck j 7{i" ~_.ytNIO 'Kdi.,gxu5k @X.5Xo~k9LrD'*@9_A  ldz6~ $]\\ )~'s8ra7^ל>Ǽ>`>pn[CSs/}vVr{mRݨ9m{S5 WVE.y4c{Ny2q/o{m؋.VxG\|7ܜ*d\}Xu{ܷXf>9kӆa;maN1geSRp̨0[oILm>Ryr&[6@Y VlQ42U-jclGs^[VR@/&ڧ^}ɫ=UO[qj529@XگUJ{e`+t Uiye*EkԄ'웇C>}2 @WjL,cz֎ɻEJEqM-<^ɪW^*:%\Iͳszs,^obd81Zj35Ji̍4b Xv]%3$]IҞ$i"$N*S$SӚ}&rt,D 5#rXb 5p5?n?`e@]{_z{^V=@kȈWUWݶ}w߸oxVo[3_=k6E>Z p_P})}`6|&7«^*Ss}-Tz.Z(pڡM^Ͼcmk^PX}bLNtMڹ+V9b el4;#yYYl\(.= l ^qgaݹў I.׭m˧b!<UB, (h&- "We0\!gJ/ 1Q,[l smd3Ѿ|Av]i &> go Db kQz5pck>p?V!w- IDATWl(K% d g<$ay*;dh~>Uk2k!dEy[ 8Eq 4FkDkW[]>6dTQ0FQZGmdRHc8F8f:k*\Xi n*N nQ^.ʴ~C7"Vq]Wb 8}3I}S餩tKNҮ$ jܮtLT{l6YZQ9Ň7k(@Xb <=j ܋`nchկni|}jfmgmwK„r#|?_z)}rΏuvkn{c pw>QzH-DXZZ&^>WF9yv䟆Ww/WT~x,rGÝkp`~|Yʛ\/{?qVt rr|iq|vͅa\W{:;L=q„>$Ld9rD'"5OY^;Nߩjڢ7dRUke~!UNf-6X7j_U/o\KF/}b h/BBc]Y+_E&_Yg[4r RJn9r_ukͺjè}=&YkɓSs e bFm0(iÔ|q0/3wT$"C`!`{⵵,a*oY*ydxXy.?ޗ:N}{78'_>_{%]m55,f sͻ$@ZS[eR>T'Q{Wv yۨyYVgo N[R֙\cV/CC9p*:(gۃ7ʡ5@,($ 퓥]4*g͵E 4g|QP(X%5 s8ov:% d2?lĉ <5֖@R6\ȑ=lvTu!kX({iKFmm ٖ5΍ a X-i*o\;i\)(kBj `F朆RZ1 wC^nPXvn(D)b 5pn f/I2En ܦ2-I7nڑNW-,z#}>Ԍc 5k @s D{ykj9*h| .^ os}ömea}co_a0)u/f9VXx2~nԜ6lU GӵoCmK>9 w޽:|Z'NuOZmrN =y͑T%ɥE9(;Vp sqr9+qr1 ԷaԷa~N9sYecu 9 qq '- _W:ɪR2'FuZKYn 7j>>Vd2y0c㜩Zv?uA2.Pp{!|O9t`Pmax +Ffufj3R{cC2^+bp(G(D;Rvm Cm_OHnSǨԮXc\)U m¹+iꥨK \(oHmR5ا72Co\{QΫj|FkuV+l\潍rSmsҜ i15k`x۝Dn;$t{$rOT]r;}Y1ñ{oww9nj7ܭ9m`cP0̱^ eڿo~]ehyNxÝo/_{o4ۇjy[< 6Ih#Yf;^2opaBu,=s(&-( Vm{*V˥XԢdVQ ܌m`x9K,A &R.JY。#p{Pշ72f~u׫o= UK/8w(s)ElɓŶ``3Vds3g%V4c^m&c-Yjl%wY!@0jlR&Zj޶XmZ>jLvr k(|+Cm0l֨e:'?RlR4X(K-Y|4 gj\rqkj3dlJ%3t2?hJ=j*uk5.nڗD$~'{zI/IoJTxVYZ\ \X\ñm|k @Xb 5j p۠ 70}l /x>v\y@V<nC昵ڟmK>ӧOm+_f#.*pOn?㪔j=,͋_b:]Wx;V0.z,w|5 02\ bP~hضX9<6B>6ߑ)쐠'GG]MGЁR!n9uشϡ:,c,pAy . 1sԷ?s}a 3?3rf,/|V桨EJ!, J*`n:Hnn)cT+]dY%E^9sy)|RL$,`YoVA}-*]Nd}P5= ޠrF \\3Q`fzb $S%l.Vyϫϭl%MSхKWk*QšJ=cݷ9r-c(Eq6̀[@2JPZK q%FS"o+]M|_Gh%VTpɏPs<@;FJ.O~:ЋW((W[xQE[KnRRűck`.)V)[驞t:3$]M;I9$Ǣ7>8jNĚ5k @X6"~ , g;65~ 1?~60} X \,*}cιOɌ m?ye؆_|<@vm[|}g?;ųƌ[גOuٷ /5τ"S|CR֯{? %.o]6@P^wuj|pP^3?{>: s4ܩym.W˿:'K_^%tXZ[Ǐ-ɭ]gʆvyrXߞp۞mr ermx2 ӧȩg0eoWb :b\BdB@IY䒑2X#`y0o^elZZ_IY8¦`3M.GU8ިo`\@ .ӥ_KzYWB{+[`)i\tf o]/-UK-oys̢[tP\KԷZkF*W0"3PhoQ*%8U-ڒ]3X0Je*MEi x*5al\6ш6:*`nԬjq5k`}>ɩtzu%Hʞ>9} 9(7%Y\Z0N5k @XV D.lyyYx1~MsZ_[-'r} @6e<|GAʾL.~ }{y{=|;ڧ|#o|cm~Ϛ>Oȗ9 cuwuQM[-{)cN^VOT~~M-8_~8{g{k9sUaeFQMz#g{[u۸J/LXĪMlY%̌}z$N^*GS.Q핶Uw*5.0ASr{ծ/Չryn\Puy c4yga üȜ-s&wL|/g477'az-gN3"SXb9=h-VpQb\fsԬF-M.UfjlbG>60/x QVbr+6GmJ(Dؕ*VP ,%?[X,WMVu19 -ѣbhmuNtoy-6dbm!T LgEMGQzpK殳3cq E"Zﮬ.@6IM2kW+wriWycmW ] ٻnBٚZ2(j9uF [dyE[*,nN͵pL©:XpӤlgZziISX*c tDNWt,.-±K|ark=#^Xb 5k @z륾F1ن|m6u޽{ρSa~7Pb.#[Bǧ=`(Jx ó'ϋרۊznDcKǸ뮻4߷2J^?1>#s} 0=?sp)s@ ^ W&m_ʹ}4^ͽvB(gTiݙ~_;˃+n!u~)_0OnyĒ,%w]^7%޺#qylMkz݌`,h7r{h,Oo<\\{i9ufYs0z h@"VXy!eǪ,5)cJrKʽ-08U\nWֳoX^m deOYc܀AtT3o3Oj(}6x/6Dž7w"Wm~:u)ƭ#<޷o]SRcɼ<Z(*_y/JZ(GR?lY (5.ۺ(oQ5s6Qj1Pb̲օТ2UwinFټT]Tk\{ڞtDIOD:ɴt2՛N{orvqC8^b 5k @o D/*GW}STyk.x> w+H }'OA[ {8 qLT<9aLdžF2~X*URtr,9/앍P@ps nc=>S&ЩҒ\+p>/P@8XR-%-*\b.]T5BX#RNYVUy1(kak +e2n S+0vy<cQamBE*c@. ˪=sE; w}Ir,nXT_sčƈLő u(;dVf(Β7*p#:N1ck5n7dZD:=Է(ourtI%I M2ՙۓ%Y:N_t.ל8m1\?wk?,߮M2tMj ]=ֿkffݏwsPR֑_ âxx1Ǽ녜< j̋w-u-dG[kهmC ^[eKy,˵RƜ./O{w.m&m6Of[:H 1@G"`v ək DKu $ )i*y#Bdob9cMy0ކ90= ?p,S,3Ro5ՐŚ(ky rm"U2 2'Kg\Cd=Nva=FvWxZȡ9?@Ya,T_,՞:dcMo\Ҹy9q[#Tj9|Xy{ݾ}j\a\b`zdTo-[ch 8l+#:kj eUĨ^ŭLy P撳5t1uU3NV!֨2b猕rM.P{fSU eۋ[y(tQAՅAU8>έۑ^7^mӴ'n߃ܤj^JWAnG.ʉ,,.By$0;| \lG]szbQ!DkKdƫی5mdb%r 2oٷF[֒B->`r5`in1#H -u&9yTnYIrHF`li.je#uوY훁|F˕;o=ro q6Vbͬg 0lFvڦ4Pap);iUHD .U5;4IuOoNy)Wry Y7']&\&7RWeOfr9@۰>0g\j 0^|e .rzvYIjYp%Uan6ŲTd@-6)b\JQ2@U2(s\!gf >5d3p7}쓁Fjm3@QhűNZ3Qճ)x&z9VcU)m4έo+cj幷ܬcptAa*J],Ʀ5ƊgN  06dזno.)Ge PR8[DWkh(r>Ue d*-=ur|, [([1JjU⭐TU%pP֖rkv% _@[2lT[{k-L-UMsU/ؤ9k}5MTFPuaP'Osk n}rO$Nێ*mIޓ7Փ=IWnK'Idi=vb-۟ p-;C n۲rj:V)P*u5 ;f[wuE9tBŚbu3gMՈZ,רpQޒA뭖uoe6ӊ2sUrUՂ;fWYq(QFX#K-xrҜ i15k`Mlk;(liI$IYۙNj.6(pŅK%'N[o 6f=힭nB {w<߭w$^V}"{DZ55@z*q9ش^8q<705P+\`$& }u٫fj*u2r4;NU>[_#O4o+enFQŸ:Yam{m?ۙT{i}E.s@?lJ `2/%CZ/ ,JܨSK&n2dnj8WK{@Zb|9GsE\#e_엽]2JY4g̼RȥϨMQe2*@I;Pΰ]&(dT-{ =7[ZsLqE Usxɞͱ)/5 %(rKȬzR̵X9]mq̚&Bj,GJ*UѲQnتaLdr,rk+Ϳ@^+yL-Y:>Ǧٟ _5NK'>F(yX Ru^5kͤ;Yb$]ĝHK6.=tҮ,-.6jߛe;.oJ7\y 42;ob s, orGI}rǩS Q;(@kb3C 侊MQ.̭T&WAI 62W2c+ @H {G>O-/X3^Ǎqxot xg?\X+MTT^W#RV;5X,cz|]%_\˯qr^U^\>\hmmY<0|A{3rԲ՜*k7&YU62/߁+X2nRCk*]~cyYyE3U01D廮*}s&uKkAfW#gXGkp.,9|dc\f$3'UnU]bV=d>6΅p1Y:vL?>{U Ȋ=rŘV-9Wy-FKf`ٻX16j̲~Ԋe2l.녥rٻX8hĕبo-jYsR\mV+@^/Vj!  <.@=|^܌z\TTP\h/J_@3[Y"W.{d8=$SҝZ/I;Ӓt2&IH҂p'#m h4ynփnPPu#3ž?OD{qR7sl/^X ,{W~W|s|+::ce?NJ?[95g0-333~/@[dv[W}+T]쓙mf?7n-ֻ䝮#uJP=ٸ spެa:ֱAy; qCvpO>%eV3^2Wao x4jkN.؜L[\ϒ8RL9Pe-3-V0ZJ{ X׾ϊ(s.ע Y^M;(sQ%'}rXNwoK<(+1e_ͩ"7ޘOSe5vݪlFiЎ\|ꌜ>}J,׬[U*`*Y (g΋U\~ 7V1KmKvevdAen? UږqX@\%ըϭv &7lTdXDs@iKNkfTW( vYx)eGuWX}Yed]+@[N )3ϹvYjK5 X3xQ#fBm%cbrźxdL_Wj܆ֲ\Ub쁮)jU2R6vU4^Q#C[ʫ^*wygTbF5nXWp lNNҎtҎzI{EIT쓓LMea6YX\t TA[x4upv-cv<-{w< c xOrlC`45W@V@m'^׭}]gjA&%핁SbnKqw pߩw{ݔ6c69U>|VnӲXǘWX798a 6؞6ŵ~r1Y&E.BɁ $K\FHSk )Qo\yKeU4c* jl]ּP L2g?Dfb!{"#׷"!-2WYm_3qG͌n.}~0y%fĢe=X-lPFmQ HN6l%2:YA26#'V\Pof:UaeZ`iA.YX#Q~8cc82q 1>ǜ޺ 1Ч E-ev(y[*wR 9g#wuˆ%< YMEfgV p>/~wJ(n{t$ܦS=o6H7H"G/n=o~7>F9V/|c5lpz`ۉ5 Fzk9ӧ}"?@̠'' K<WHly6,'UzÃ84@Xb \\ ( h|?kb ?ݕ!v?XE.)?wsr?T>V_#ʍZ$zslxnCc)@3oE{i^9 dBA!s%(ɜF%vʨNN+.E:RsBƭR u`)9تܽ헡}ƜVj,ɴJXB%7$%K7f#+il\̩rV_`}rvy~5WG Mտ^ 7y:J'WdyֿWbZWcT#-Jk\^l.x˵2(x}ίɝE)3]'jF*ivxPp>W/p4sk-`30BbM-A[XQ+eƕb(kT^H}ri(k0O(qTa!CX5=z˒)]}INNU`ەtjFɔtS;JN5ݞ,,* F8euW PVd] 7\Pz*Y"gLQf+DyK5x%끥]`Q&6>ʢ-sxjFRB޾ؙe]-@AAa`aEEaKX1z Ԓ0Z04X9coփѢbL^.`6S%b۬n_bL_ u~Q8*U}[BB.XY(lBֲbbcQ.7[:s6znQU;dV eޒ8+OVEbZ *]b**AS" +@gr W ^qtӮtmGݾv2>T!oGotta}2p7B75|ɎOft9S#G-rx>:an w_$^Xf=:xmc 5k Sr5@=@\Ը]Jvj™sWI殖bԆq?;̬7_{r76˯}ϖSrS <_r ) `kPV-ɲ’J*,<+TU+JH s=} aQȎRddaxe?Z@* j6 kKԳ( JQXZ[9ܨ5VrzYx,Հ\Ug4sL uee,=(e8%;؊ xER.[gcS:6XUmPƚ^2NU]4Ut@_ܢuf%lتZI q%Y-\# ]`nu(9FxfcԪ$Vf[ӶU D6g].&W?V$H(N6os%4j[]@Z[ IDATm_HE>8kq~-E]JmmUSQg۾ƶM}{}n~_=Gm-he<kF_Skh6Gmv^l#j~ r~v+3IZTC*WXcUkTCNV*?z69lZUE==6Zof{~Ȁ9mJP3*7eUW?S9㊺2z^EI}ye`|5SRۧ;UsouYCu}ie1 >c`^嵺/qAޛ.ܧvNJ9% ,7#|#>Y W2ˏE-s2B?ʬ̐;>(e.+d(d򬐹9~@gU2]  )rJeBaΠA.3dsLev0's d0Slgsdfv @ffYLgr\2;='3 f>lߟt032ݛYIft?=-Lz|@f32ӛ3OK23-z}Ig$J'dV:ӉL:KڛLO޴$l3ȴt{=I}=S]NҮɌ~u%M@v(廒fM:ν&\ܤ ܣdaii}2pO:uΗ/?:<ێ# ϥ^Kp/Gx9Lǎ~Xoh^I{Lpg/}K± c XO.S?ܧ`7>k @X5`nRwR j`rӉ#R!?nvOFY;ujܰf|]-o%r{]G߯p]9 e9jUD۠=~\kXl. EM *Z#s;bS&uЇ@2(-ba˼{p:śI0cU!c/\Tyx($2A 2@A߼(q2~Q)3@XH0}J[TXo^1`30` $ 4` TZ`lKerw9g500Os{ɾٸwZ>8 8w Fl*2eV4%,^oulT zXdyȻs`^FrU:Q8NU*UMŋzkfr{Gٽ@aU;6Ĵ4{_2M]L_g4|ށ@XTFڷFj&}MDVR[0I:}k.@K+msNk,oi= ?Jo_Z\?~U:^)t4ހVھ5'.eߍW\=]kc4b!{E=0z P;yG-C1Q_Tv^99zi@1"̡w>Td(F@G%|)s's \[1mc530js^+b~Bek}g%3jeLaBKz6l9Ğ^ w ,x&ː5\mm^0;Xt쓵`lY(:+x7eX罕ek)着.{+֒hݖW\`kזU`&?jʲvk+btǤeyfiZ̺,,*JKL(')- R[gd@ޤ,-S2>B$ ObЛ[ǑEYhAZG-Ԣ88,e0EX- " " oXq [&ʾEm$2t,b -2(ep[c|.*\kz|_m_`.\1\?{y}g}}߷QېG7*[sY_{6ξQՄ=Ξ۳,{o}C7%w5/*e^y|WjЇn>q%''ޟ}cy }>0\Y\~z{enVgݚ-Y+uvi}f}}y}>>k"~eC(dA{r^Rr?_w~bIfR[me@VH* tbU=sQ6 7d6nKQ@)BS R7/xꬓ]sqxFʵ>TV\?],9N@\\7ve \T%5mVZ";n^+j[X,Dm9'[cN6͜GvV ԦUuqM)mrES:pZ ";'AWSzWd $ۖl_m2@ p)ԯ(QX 0 ,;;G@-f]ԛyBN1Q]l5:PrZxvꀾԏV6/`ȈE) WE(6gRG׮ cct=Pn@FbW{~Q-opx}{R :sNX]QJ5Z(E2SyJTEA[khQSr~S~9v?{@c=ʺq2`VVIaN6*&-/}8yG>ܤvrܨpW$^ضѪYN dvb2`lݬʝl3yݢw7noC{soߧ=i(&ww|~o|3\"|x;$}LN[o~Ӿ/O\N>u^}ձ|W6;7}`som+5ZB(s0U'7؋˳*29Sﻧ [{pC)kĐ e׃\ǁ!.0 G~~mUSYů԰X!cwʓTG Tȭ*+ wua2p o>Ԗc egAu2hg)dAMG1x/$us믭3~,YXТ׵2nZj\ZQc1[F*`:ԁbk9Tb:HnUCF@^OB R/)V[({G1#wA,bvʝŹkAծmJksxh!& \F0Cm~@0&>딍:`( (4;zp;pZ pgC '(K^ av *; s,Ѩpw77j2D#kȶ,]V*)W&$ AY7]x6~<fYf9"׫]7IDfQx @kfYLU^TJsz+x62Y.[gX]Kgsh,ZPZKq8([+m-.S|.Y$>lQv+-J٢"u.mcj3b3P".*(/-$ʴ$K,fŨoneq3q7 G1ZԺFIfA@88NmGԖGiɨpO,YM-bKH̒hG6@Q m],AHsq`p;ad7_8o_%{oP~_l{7lm&07}`\ p |}7}yZC̫Nrp9'Qo|umo3}n<1{m>j8~??}d"+_ٜ _}Q;{{N3o :ϐas>0c՟{X/r_vO{Vcg9{ꜽs}Ul3>r=%q|< ܇uyǝD"#7K˶(${PZPVR'rlܦrǔ5 #^ B+*<f@7 (}_i(X#o:AK6[۪tyޖXjs $[QQNWʚ:7& v_s` baW `آjC'Ea 00H 4 `n\f* J`ZJ]jI9YrN!"sP[5`A Hv`V̂ @Ra hTL3MV 4C.YJ$y $@V\M=Ve 08`][Qmރ`"߯Ze HvNBeǢNtK/[vTv6\R|.Gw\Jw;>Gǯ<ݻ]?@U0ߴ?7+~C;-PX]&N]@ܐjB;ZrcL `~}R_[Y7w1L&@},;oM$Ӷ<3ve 啬 ͮ՜Àhof0V>~ 疨XQIs_5߮gZeE>k!W؃J[+wdԶl#w3\l]+W",~8pWT˪rEOzZY֖əx2m.5n<\/y6WX 쑕Ur]mr^9ˋbEkiX,%*de`lY>9ݾRi k)UmnyZҴsGIZZNK[ERYTdoB@oY `-8Q6.ٵyIlI:YD(f3 PZ@nfp%Afːz!UnBP7@*\& P6.X- [0e\ƶ\.lo n9{ n(я~<|Ozu=q?7w%oJ8XB-oo]n[0Wa~wwovÎ77o}M'۰v2?񏫬}kn^( }}::e/{پu<)O1+^ }9Nm''.ĝv>0w:;Y@ l`ri]g 5.Jܩ^3uy^<t#/y|g;ne]ָls-cP``l+eb[YOK ;kY/s+^F(V5Vʅ.hn*%KϠlK7fVM%Ҹ$ͭjKe_\֡k]v/-жl+n~+b!Zd,yU_++v~k:_esJkM\/%~wʽ:isټ,h@RںyLa"Š_[d_+7dx|廬]Rn-b;Ua,[u_ԖVxs-+"wr(s q.{L[,3QVl`o,OvZTSf-3jDvi"Py<-+,),Ȼ 9M29m㤴$-Nc 3lU-̢)sQZ@n jIdA -Y (^9 B-eb T,-b@-9 0T2"Kn`7]g4|{]w<{+_i!*ۯǟ}8l@ٟY8I9Η%V??qZ\?=ois}Kf,B k r1y哞=ɟԧ}=a}c{Η{]} xۿ=m}_ջv;]GS|}v36Ϡas>0<\J51X+M~(YگVg#+Զw]f,{ac3uaav썫sv[ۃҾml̀JOpwyy]> V6k-Uiva_ |HG{RܢmP(E#6f8g9=K7QzE((@+*=جP3P-ϼ[d ߁ZhpNJ-@ڭmOTS>jAQz XYr dTcF.mzeݢE ༤Ŷ5.2p)x[e(3Y\X9 uldT!la=Cͨp]%ZHhPEc+(Kĸ&lgs")pk8H*e,Q:-@ u. QviuO٨@Y70 85JnE YUoe Lt DGR $ʢdQJI@;+Kf٨- 嘧+5ޡuJNY U sux:%OU_C IDAT~rz9 \Q?VҭוS~TNWcԏ1P(V.OH:\E5/p}nک_l;hկӬju +KUhMwZ j"@)hJ\,@e5yܷMS,d 1 Yn~ҡ-wAV Lڵn`îtA1T@Y&JVUnIVJ6y>h-6y`TࢬEΤlUVe‰^{}ܳY+AFY;XKv\FԲkm<\J^oںVv(rQne d-Jy+.˴J9h[˲Z7KkK)7ET%2Mr2nkK2gosJ P %63 roɵ&heKK.ȹi.- \o֦%q"UnȾʻLo2 6Lmm2VI(*9 Hle,P.-XR.H^.mAhC&9n؅p:j;궣?RMCr-kկm_,J%_vU>]P(dKrO~=ߣas\ɀ٣{a.m׼fm{%e֮ɳ|1K_f`/ga~)pd~<#Q;`_~KlxҗT*a3:k/'tƦ z]_ nVuPFTWD&öe tIV-*ةul*Oen{K=_]gP_*ʝ8ndžyK4Uꯤvk=Ue}\u='-9@|d/v<pZ^RVvp)e %-+Q *;5riu3P8nAX([ξղSD7f;0XڵA`,P]1JU2 HΆr]tZWtTʮW@TϰFyZ]4?uV]md])CĒًPєᔲk XX4*J/WM@윁.c<8UŒ֭,YB[g lDdUWרWNAz\vu5JJ.kpPqѨzlzP,pUS?~,/~iMX m~]?ԁuOWf)(J^xok%`ZcjF \3cRXm;fbzږ>A=_2I@ujY0 XnTu<JF&t{KRW NE^ڰ_)ܠUn-qbS(ȱΙZ){\[ eHτvlKd@*#3IZ2Gaz'>b:v[T8"y pUhn2 ,ճ;mrT2u+YJ@jZEYj+K\ɂ56ȥ7 ,ɲ%Ȕ[vɬ#fYcYYFyaeVX %'7-O͓\ X%6ȩn6oQ.ז2Ԣ[cd%m- )s84[T^s Rl,29նQl;Ң8(t6 m2XZ$,HX -YE$R nXC.{쳟 KɊ%dz+߾1؃)B>׿?A.z׻6ދ)/m5{MX7?/y7s˛&c^V}_6~؇v瘃^''><>kmuaijK;UzUX(~mvmwYUJcaPTi-ŦmໃS<+7pouQu֞ƀˢJ:9QH֣ʖLְ>nQ6J9E-TzҒ^؝I;wU}xPq㜹֦Dd2k @2֡-0pȨl5 bܑ춣`,u3bpCNq3ٻdQV.sQֵa Jt`XXP./WH= M XB]+ ࣝm͋*XʑQXbcLPX#0\`(b+'K\:;e쒱&F #b|U5AhgS,pqTe'Ԩz]9Kyq/˥^L~ ~.rپ} ~#9.[7 0k^P؏ڏ@~_Ǵ_mKCYm-|y,/vs{{޳k1jznӉA)''.綝>0}`<̕:O@BlK-zmByȺ괽ޞ[ 婽2y]Hogo{޿ޞՅ&9L!.YJ+JٷMpYZUA$Ҹhj2l-k{`ٳ>#eק쿯ק3Y{d BM[օagpH8Կ ܣ~f[EDɹ|uar| AN@+aWΦYi`W)lrsM/%U1`Ʋ5@r 1&,lQS йzV,T6NjBd9=D |@bL]KKY6c-OQ \&06Ϩ3@}Գ&Vn~S&@p)0$߀RŢ*T,j1V(pN4)oXSgGM&n{ %m@tG2]cNlլ,`cL.uWXE@+u (_]d*VY@M@'Vc^ȀV)=(YWRR?Yy:?X/;թ@RJS?2rX.+*`%|~)q]pGQKY:^?PT\57O>> XGr؋eR?STX.Q^GQ޲4s+`L7zohA \ ZPKq~X׵Segؠ4vgPoFVX;' ˿g`rQ _|+p. Dz\86?/_>}Ag%0S_گs\=g?[|YWA.2Z|Sצm1ÔӲtSȳxGy> f_*Y絍>|pFG?~~mF&2f pI&XNʀ ?vBr~(?9aKl}SbM3ٸ+/8 JO{ӌԂڗ?,uf} KKc)]5cVn;T(qQH4~[޲l/;jMe q-/s-<<Xas>ps^* zxi/+9xb<}΍c9]`v<:x^}{p+24U7H dM ʚB=ٱ/OۗW __]R+(c(U XkK|R?9X ;@-*֢`ps_3jwT> JQ͡`og틫B xz2tQ{zJ u[_a?ne0jJcdmY8˦mD$J6Upz~}>5n[k Mfu^i(DERS?mad(bщ)X2'uV箵ɤ̀_'bϱkk^WMfΏ|Y;,**zWW vj4l)mQKP!sئEɎQu PޮSiPg|CqL9Zdd2溉(p;YTPPaM+׵4.{.ٞ%)P 1 J[˵ypy(U,0e$ O+Y82To6q%,G:8h5F{+e1/Y2sb5|`e)yG1A C =)uhAbԜU#UX9)cM9P.c<溶dv~Եʉ;`@iӫ^x8W xN~lvzŒ_?bXכjoV~ԔE?1*ds`%ٹT3(3jg`4v({۵ Cdc mPВ Y ]rh01f_ -+]kj~\YtpMߵRu~k 6$-dAN^4usޕѱ7רf+lqs8V\ _2}W7XcXYB v:KM-Ȕ/kO{1_X3g:n Y\R&H[ZR9lڤ) +eqKlY'k[rފ [eegyVu[Tj enkq-rc%pZ)syRFejiZX2YEj[-ɵlǖeoR7N2 MJ_qsrkʂ,ѾY\Z$7VR.3 IDAT;fT(jelu-{X̺nd8gZtcnߝ0s᢬],;/,X Zb\*wLd|M7}f!3U 9<F 3 h=A1yxD~rj'&~ɀ=j\Qv}t?Q:B=n'=?6ɵ7Gˣ{}8ް?K]oK-O>,]x2OdSmz9++c p~X_WoOa, ~cf~tkܞ by^nQroipr pQmZ/_SG__ؔ?m;>}jǍ_=?f^VYF|[m''N<`ns>0{x5壼D@Oc{RqNomNۿOٿ*sy})괽{8knvNmlOn#)>Mhmzijw~eG\wQ(A[Yy&-]-RʧԲ=ֆb|ۿ){NqƞМ?Y:X[Àrw+ K-[_[[yP?P_0ڲ&=2pj2CUd 2 P}3_qyH6WXЊ%scYRʩ-6SȞE -:rU6KFpW uE} ` Y趰R90\N r 0N˜w|ˍ 2TjR=-łN+N /PTy)Ԗ!t00:Á:d 4ȡ4Tv6Pb} Kցa (FƀC@sF,Wt5TRP:[]@* QVV:g @V0 PdRWG+ U3멿wXT+=PMN/}wyZvmo+Е`9l VȋzU5 Xuv(5q@򡁫 ډg)+ULUݨ\ʺ}IM@. tn /{~l2gh2Ab-P3,p ϭ;wU*ÖI Z1ƱOf gLwF@n'{BjZ>vYZ&r*ن}.0[@dž_עre4(zK2kyλ Hb G- Z&E?Z"-IJ(,s+_kKB0ro?aRVY\ڶHJ Qr 6O,* +w E j[Q69,vYeVgĹl#lҰ1aYBm e}f4$N-Feږ*uOnԶalA:[u#K{dV@-af?ڑr~De />nUhzo\r~r{9S0~un\e/ N#AN3} HqX9\~0r>ror?8B P8kcmxr ,dAMS7ySp}[7O9Vp~;V:y?هN!$YNɺA~,Ü7 #+oG|}[^.KTMhvX/w:c/v9``/jwO[~SoQ{C/{i$Hԥ ;tAv@%SrsYAQ^&9?N{ZO0"~dMW~Tvex]+)UK..PY<_~EJ y-. |rU#PYcɌjL} h+ruV@Rf ki  Q;/ \.0Xp}Aٝ-B 0U%@ۡXa/, EuQJH@W}ubU,e3 hXP&` EBU+ >ƮV73JNYX5 h $J9,PK4&r;R/({{ h  (]VD9 ]6ƚ@奬yݹɧR?p*(ՕA+Αzګ.ՏS]goXkĥ~NǪ,˩ųkV=]^λ]?jwlԯw׿Z{S*ӱ~ֹwuhbX*ia-Qec͹&E* :ُsS u,T(Q:cQ[dIʼU4 y^&Ag%2 q]*[ɨwLw5ɂ†g XkEo.yM`pgo:˒ Dg Įe_6ypnkMj|(|TnQ]ı{Zʩe|R&zl9-/Jڒ,^-Sُj,R7,\-5/,'pߋ梬YnEZY~jʨ$n,29-$,.,KSSozK \NcK32k,Ә\Գ|-Xe5J,[=]ơŨi#-D;KAXAhy?֢ n{i#Cqx'Nb–a`;K{vGYo/ O#i&G͵]3fm>Xt&ԧ>ϗXpp`6,uyr0w.q9}H?~}pQ^R/%u]|γ͗wHp)cq}N.jW_Q#|S9~qSf -`}}|Zl./NձdTܧp(mw>dᄚ~^ ޽3?}`sNLaJMsrW7Dbai&\؃훫Sa51,R:P?nt*oOK7S_a:'E.l%iɤKA.F+n{t3{y朼 77X:VS"cbκb+Wek%T[ZQ :wR[ai,uV 9QVV 9ށaZ2HL\q_0vRSZ.Ϊ2``+/j_(*+JJΕJXԽȁ )PXYXGS?@WN0*XJb )8ny%;X)nQ]O=֑K/tL `TʀVYr.iw80̱\&.`ZX(:Q*+Ź}Q ztG+5. M/J| Q{tw1UgWPY-cdr/(Ub s`PT>]Jr(K=[*,Ausߎ^cR?/ߨ~`M*yp PbG@ Trl\kYsZpDW?Xw.Y\TTv}{;fJu?P=3*qîo`/I쾩 j&2 0e~W֚4oY;mkgܱ?dʪ]t-rc952Vk&?SRb-ǷaÛ]/U~[_ru;UN }}Ps_o߯$e9ܓ綟>0}` mgUb}c?#=d{EY5?WX@!M;5tNUSNI5t8{ eߺȭFanee ytn.=27M2 F{e/ې\05rmY&a,Ke,yZQކqjaRYwɷE9&ʿ3ov%y2\- X*\r'/ .l|"ySKVF%oa)luO m}Cjx+l yMH^ VƥI :l}r1}o;0̷.jշn5K{o7vS;<1{LYNXna_ 0vt[9̀Ru׿~??sf\\|MvS?}펲jNeޯ3>1}`s8>࡮_r?<*r#zaȠlZvKr{Uyz8eN?}1KTX,Qo>z{C{r IMdvV9`*'_,+ɚZWvSӪ9Lʞ]g//NI5/>mxQTJ :RlDIJTVou: (\/Qy f]16TɭT  f@6())i2$Q֠XArD& S⢼-\W :oegE`/\r\= pQ^gE)2-~[g<{?Oi-OYS]V3xh%S f_S_ؒ<[6}}~O~Ұd㏺\Ojww/=j9~瘣Ay:~|#<|w3|]bQ뤬G<$1 <ַeLގoojM':|M^z(KʞZ=踩4~?szDZd䢂%Co׼5~;w]~?o~tws,~Q}8c~ܞ 56c]i'f{s>0ho|kTP0tLU&OO~ɀ6vz@q L|fcߟk03Gߣ<=<78 pP߮˅XON.֑);K`/@JӟMa9h=0GYNÎy|;?}q2L'p}` n W=)̝q}>Ύrr`a?~2^VRrSSź۫]j~ەo=e_Z=goWfڣ:dG\H/ }g{ᭇ-Ǎ~}Wǚ 12Ea=2dGPr,89 F-˄&vqQ l3 l-d&Pun% ,[Θؓ- gB. +rmpy:A.%VWX#gX$:,[0jK(G []2*]Ri)u-̉@SΒas=rYr ۰;-NCCu¢M,3 b`,ٷТF%Q|8eTy3hre2Y-mq \c EdTu`e.QlҲ_l-(x7s˥왗;M8#MWA{O[(_) VR>(qnrl`yʏ޾3p|Xpw'oI@\7t\i9AywM{Cb|.6>sܯKá`ZjMrq7rw{ߺnP2E/zf+\Y/7e;0}/6b}XOm>O"}PNH $#Ȟ F*cޑ~!^ ]JHĦmuQ}.w2,kzLmAXvtzf}`s>vm t>\ 0{1wX wǞ]oNۇS:l>e88{XbtV[/m`]2[~ٱƦ={z˭7Lg `+e/0ĩZɢEK.0%sQN Hre8Z#V b`+9mX,`Ųשl),,U2JYq6RЕJĨ`kATuRJH sVmtؽrSBd\l"qC)P(ٟi/g lѬۍx?T˲*vy\Wa }1֪`H>)0gM.:OqA}vCB{{VMRaHB%D*k L; l #A{llz[ņ@l{EvRS*Ie*<˹9w9r>ltQڮrQrp maLB- \3ΝE)C%LrfaԐϽ(XYrT&6dbK.0U믵(q{ԟZsoRm ء~ǀn~$sLl$X:?pfjm;5-׷j?o-hT߁=|@[@/8xɳ Tf0|͠f g=1,FQշ C4Еmd;Tz^&UAjUUd@1{׬­X6xmՠnV Zg;0B6yAՌXs(=HmZUqbp j+fZ};w-_-/m*miڶ1VRjlQbY[Z9 ^,ddvJUA..ݙ9em 09޴eZ5ٺPA-7*Q NKeh<RmeAp9\@ټV|By[m,W$RmڶP慲8SOePX&Jf\Q+<۸p4R)%wjƚD(peQ]i[5I87Ivii޻ DPyx>iOj#ַsD{^~leyX.[F.?g=\p؇Lǃj3lfOzeg+1Zfnk;B}{l8cawʏ~XLۻ ;-o:;@#ޗ]P\;;ׄehL#ankʠr2]Viu@0k޹,y"wwg.[4 <;:,?JS羢fP $Qng':,\6@+`\ԯ,-;Yoj@gs< Bǟ :(~ᯕAK}dZzo`OkP sC;Cw1@\}P.3\f4lLRփ%BmslenWzgr+o7U3U/`k"P6+61/Vl'*zTw%lˡt Va6܃+` J\jP[@쏭h[c %UmjU9VɨoU m 6%V׶OnV5/P٢mJ-J[sqZ L ]l>SZ+[ .YQ:y*+mrVEa[[ufByVL+dbm\D=pKϗ*ɩMM 9jLy2̗+k$3+CKnmnխ!i,!,216w.P4Q>EU[h.`6*4IEF@^Ii*x(F;q.9Ed. ygpj@GwP0 qX*'ʪ#w<|>;z,p^ݱy:>c~]:n=O>x_ zPyYfu;:z.[ Ƚկֵ^ p/Ɂ;m2GaM??}eg<^ϝ뼭pi~jrNr*HgŻ}D_xȡu;_"7X0WOӳfS?>P_SumBٝ$~|~w|K1濅? Kbl[^0( mWl6#2YJ$YR !E.o:+~`\j۝v rg(}81VlOo5PdKPclgj [:ɼE*Q 3,cSPH.dz `K/JJ"!H7};Wr^~gXJN삃qk7nȵ{5\},Vcc~z6(z|j`qn! EL,E..G^zE1 E=lPakcr=[z&\%'?\dα#r Fap+QZ1a?1λa-е8UAI e_P}*4 NVpOsCۚ{,nUpHhQmVmܩed(ik!7#UUi9T9|Un¶4fTm\YqeQ)$eʖDžsqYW5J r+Y, yQ٦e"UV f+M A=)C:k8[dR8Di*O{-J$4ϭXqB,V:RF>3ls+ltb@n(Q>9U2-'q"lwʼnԷ(g|0΃K/lͶAX7M DlG{ k4 2e=˶,òpnyޣ}M_dUrVmb #3fwܑuep~e?/-HmK!{Gqk?wG3mb֑1pֲ[f0wpLJoc=0c} vr tqw\w\TX,w.u?O"wPkws@i4u yg a+q^S>wl~dv}o]S\2qmF3-1x &5RQgQȢ6z[{gZ@eBhQP6XVcdbJ#?Jux:2gQbٖ^NզȨŲ,ɾ(uD~ 4b[ԂJh@Ϻ 0&듼W+ow RT]e{@hMF) _T]j.0/dXEρ~/s][^8l`o>>zlת!]_c+wL]{ c7V!<LyUG->Ǔu`qsl+Զg9Rl[a@\jǜkαχUXU2AU=Cf-G+ +}pFj[&wv>dֲm%#תG4k^ @Y@q=SCNGsx-T`uzU-y@g]@\ԵfFm z=`-ɝKrYjV&wb 2Զk_%'ɠRwVVAmȺ\s+uꕷ6j2_Uw۪. ][ڠEU[Z[VJk¹99*Vp5l ͳViY(^yKm*˔R֕a+EN.JE*Zp8ywk C\l M+`7ON5e~l\q@6ΕeL)5F(N3շYBm ,9i6% w:Q<5MJ_dVꮤc+prŃQma'u-뮳=_rC 7 9mOpgy/r̹ON׽b;?Dd<&c} '~Gu|<{`쁱'z`L<5v`{?fmwg򈌾 ;L:u֞3uI@}dT}tTTc`첽Y)wCpwX0JS~[' .ֶheP "lںg 9(qr5 ^=(yBm=gѹ矯s0:֐dV.xRu`rA IDATPF|Nh+dw`E l*},ȿ JW35n`X!mm ²uGQEEkE.0W(Y0@U3C3Z}YXbk&}%kPQr.B/f "ۃծ3F\DdrXnԟwVyadl`}"c5r}`S,kK PE.곍R(Hh 8|OP.PrF5W-G3`aSm0K`HeVlkuӿ "([Ub+ pUe=3A2\qQۆ~2\[ UXs-sЕnZ SAòyܹPHkdr~56allґWk<~Vx[ JTVA00?(wsm rO_93he@RMl[w`(M[mlKےwrC:%WҢV%?rqM tsZ֪ʖ\mRiIm)((u+Ej[enJBqJ.̬MYݦN?M Z$WVN LSq얱QNsCݸU&6J"VN5&Fz!\)JT;QEo%Jݫ}'b0/~An7 AXwT ;~x{]Ys\í웽'F;>'@5>{`쁱{@vllN;oo N 2r܇?az=ZYYQ1YQ5y~"ڥ?Ng8U֕#Y>%\>{nJ(وXzLFM̊[~/{+_R/^*/++uNȡmK,Jzks7uo2tC-]ٔdLQPE~.﬩ly-\Uҳʗ+ж-=ϲBK1j[uv3`cZѪZ-V!Z*,^k+"9n@5tblj|Z>pP/vE 04Þխqm- B٨}3˵VFkbe3 Rg3[w68VϢdaY CE,r}sԸ,3Z <獨6[ jc_ջ>sC}!Xr{9o}}ـr^u>pL6GuLeS+f{o%*ޙճ56㢚5]fյyK.nnm[fRy5s^nU̔d+5dK`pL[l Ykdd ,JrnQSx4obLE4o fQJ>U>meL%*=`LPڢ6LjZ=[ph)@Nl[krDVb$[0 ղm[}dhƹkzYi 1pW\^` mXXnP( PYJ}|Qe!^G[9r-Q[2BMjf`28VݶE:Ga>Pq\?H"QpFJj7~5>Xrug}أ~=LGm=U>0TtDAJ2@À(QCfQײOfvd [Rl9aJU[%{ctVԡ>ivF1C͵69-AP{l܀ݐ]mfr8|^s (샍 e7ݒ 5`L Mٹ50S:෦Ěy\US:m}̹Fu|T lAaZu[k[7*hP+clRTGf=vʫF EslKԲ5"Kg lbQU\ۢa\6Vئ%L&96ni[Vʲy0]V;@T~w~Wۧ(4RM(L4=>}~=U_=U swv] }NP+{ݑ{ncT5U2p++f(iMmlmh{{K_Wկ|U_פso_ /Z Y׾Zmno|0ґhU)jZ0ךWܐ!i{SFX;@3@I"m)ǦWC1 ņ<2nTTPN`{ܵkvog)Pa}AʾYq aԬ(,;_иYW~׷0yy嘅prnlQ%/ׯwNmj#k6d-XySV>.ap8IϠ5=`mX}QwVfGN!kb{-Q,ӛ5wX9XaekPa5;UZ a,H6`-l}v(+jBN%J\^;Gwה hnUXۅ'fCr V<\IHF5FEur|\ߢVMkY ˶VfP:6S\IRbwDu+K M205SEJD@8A(j wBwZ4 Q9YpKftc187\'D+(v]V"7Zzw߾o?fdo@X?p}qvm cܰ'dC{`=~v|:c=0cܝ=ݹehws)h0@ek`{M APRwPb]]Eaq@xMKkEWMNӞizM}[ ?vK6vokdz۝rB'*ԕJmonksKתjK̀mGmlohcsKo|8#&X( |:5UPV˼pb_Zihj+llRv٘XEA=*xIP]zyPJ[zӟn+U JR L[ڲZ:ݶB-g$i9(f%p;VXbيRU%YuyulmO,kp*[T ]|.R{8PP隐3lS^ρO.X,˱ĶxvRbW,Sq6TC}96ʍdېkeP~V7_ 4QR?X3c  po(C..1~Q@9>O?@`]s p>gk^QTsu@zrX@}+lQ,H0Gua帯aop!zksU\+q+lLlTVdqYŵ,}{PVv`{ ZT( g lS:,mɺu2QW% vxy BJ]֪*U}Jr 0`y\X$* 2olZjUnUuH:F`f J],de*oʬS<(rBUVN9O[dݢ-re,JxҖ-Z2sɡm y+p+e Ϗkɼc/06ʨcɫȺ:9Kgr(w1ȅ"l@X>+kLWƞ?NPڒ;Q:ʹrQ GJ'SE"O2%D'ҕD((o`x,wޝ\r'gC@o|yx =MNo%-(no .=\vgvNҟ?Go#|o2.6ӨlŚU\:[Vss9K^mBQ6UiyֿmmnN5YwkskS v.$]|~+{>gZ+A[l̜G)F?'걏zDCY)]-mHiOb%Y{ѹ6?nk,X(g{ P1` `Fn/ B>.+z`ƱE/cU|3-9sSl_ԥ}2XܹV(`Q< js>&0E ,X!s6` `X*&[3 >vlA6Ǽ,'/Kfl ߵb_\X+7sUl;f Uk^'OUs~Qr0x,5[W}-jyg@3=1)9_yf~6(+ p-qab\(hQC6[Qv;k*(~!kV,S2KeTЕj[Թ s|+쌻dC~m.¹ lNYݨԶ!7(jy VPK[yaKdΦX+[[1_Pb -QfBel,Sl\EZ9kI8fX!y)SiZ M Q墴-&ιȝʒA-SCl E[umM$ihGmtjInn,Z$Jȝ֍&T+dN]%&SBB;qzlpOksguNaO=nwxN~Opx{`쁱{H= jy? o wmy(p~]"MԖ@"WUbăWz>EZ=0oBx{)ly4!dV;R[*?u*TJg9G7^}UP@Sܐ>!b7j}kK7[CZ/z ikKE/C/y/Y!gP2jEYYW]O: mmmi}m}s__CYMJOz wsKOӜI缪+Зu\ߛKDa;!D6[QJOg]ҖȨ휳Y[ P0Vª5rA&ӊPJH{aNŀ\`+vUPΰaڡFFy lrQ2/ Z,oPZ&w9V^uk,@,o k[+4{ڬWY׸3ln VX'$8O3[1v%L&sviR4x=fyϵ|vf5mAE,}Ԩ†`fUPcŌ1Au[yJPi0woꃊٜ뵞h8;߶EΔ31,Àj2TPQb\,f*R{RnUuF1(~Urn KejUE:RZRl5% +%=-_d*\,i ,J@ni3Ǩm=69.'qemIϲD "OcMlLӸTJ7.oieε5Mfؙ4Urٕ#I6FZܮĀ܉m2]{w%i]@iIiW)'S<{ h|=h'<>\h59 ޲v;n쁱N8xx *0ρ ׏r 0v8u},|sfݨF,~_,HG1O }?g]q $X]JWHl LQjey_߽˜~`"ԡO굠"}5 0O;ҕ]תZۤE'^؞ ja@u|Yƪ/*Vؖ>|O-@*)W=({!KqzU59܀W3~aJ^}@^U}re%-Y=1pjTQ}¦@Kmi;򹊪r=QYJ}۪ θ-VcnKTVʱ6&7Tu[f,b(fS\TiV)KM5*%(vkkPΰMLqrU-!4VNsI|4IM+aemɽ.9#6wmL.-p8N%6Aq)J($2eԻ!6%6R2+&}mx%W4] VӠҍVP(}hy#ռwX?p=NG{4b#8/c}=p=1cvz<c=0c=2sa:`u~˛G?J?ҹ{ӥW\?}?E=10}hYF{k?-ony#ǞWXׁu}64mirc/}Ԗy.y%: kWX#(uU˜M=TW7ze+_uܕWʮ u)6̨2+N@\283:Z[>D pr1?HlfL2s* yaZ@.0vb CCn~t:Gj5o:jEYJ@ge&cau>j'v(;Q sf5q55zYPv9 R4'GUMf}!9>s8N漲bH sK?jhzQ}=:”^e0A8 D`9쓱4 üU3biT(|h &w 7`tk^g/(_7+@(`}mVa9roq@A~\ه>Yuܖθ {$Z|j.vt6˰^_5ecpmr]6Vb=_X+Ȳr_NRS~2- tfa9dp)\T RrR>C)}r](#۶"}2ˢQA]׹eY6WE Jg r,O)6ye+շeua)u_{}]'?]OoZoK!p+ecpkdCS mԮmUg?\68憕[~͍mmm7~V{l] 8rWw]V_ 5ѳps}gLz;nu67uΙ{ x}_ z=P̵V^I)on7T*]vܖ7g=]^+zs5(X$V%ZekkV@&峐eEk9+Î u&(*Cs@&l-:߶8bk:ՠ,<\PZ)Y9bOC׷-l3i͜soC)%30dbW=W54G1b >Vd뢸e=.Z56m9&]_P|'K:?ٯ!Kyc=?Еq0>_* Fd90h~ٳ>fܭ Y4̃E8wnC[t>P 8\+q, ,ۉ 3X_E{Pү`< un>dӷ}]g|3 1a VM5DUTugk{sKMmo:6o'?I]p~CЦ.l{ϻޣ7umK6VCJG%[ڷokUƦ6QxK[]rٓtOԞ4ԼIWuh~`]W>ʠ#W[XEeK%s`PP3Nٰr+얱u0U1H-Jw^Y[&7dg@#h4Xw+3̳R;/ Xxl JV(67EyB6/_${k U0mK/Po[{kiF⹇%˨5QZ3=^ohօޥ>Dvp,3X#XjcfPj eӜ3Xs/ǟj5>vpPR@up]9? mIF1dQ~Yp347]xG+ył^By>1XPokt1\>Pܒ= (e^+X\UGvl܆ZX^x7u 5 `}|ey ʹm)'s0L~:PĶiS̭͸`_2WU ۊ|*픱IfXkռym6An~l-Byem֩(%&tm׊TWzkZ|W`{l-J,yRJq[iBj[,K԰A1i:˶r]Tv`;X/J[n,ΕdYl&EAl {e`kLg!6 %qssI*e]Q](w@X\qj؊}r'L2!6VeκDDJdjhIK+X+:hd>NwGa' 9ŒWX-̛RuCF?z,Z}ƩopdBm x@?J~HN2~hvwD;,;L=;pUrS[PۅXF+T}9{eƦtt S.\|/ߦ->H5Ε,tͻ1tl9 eE}^N}?x/jeֺ^p`Y\7G>| iZ1s].T[[ֶ66r5oMIeLM ,(f<..1 A-jT= =[f>ԋ rVy>XcwwBO$x˶}G{\gxc=0= nk-rzP2]2p/_t;j\TOA15K]Ni2/6>ݩϟqp:..P谕]Hf眳z^cXa+Q`k~5I/߫0H/u5dn׽jײ G~W~E_V.ۍ M3l5w㯭rC 5-X`M.Tx8on>szؙ{jA+qKgnڠV- r$P6 W ՀX@[@Q²2(K&m5uwϙn/`.PU >w@;'dRLS0QSBʀ ePY=\޶1teڮ [@>Ja* xC j9+P8@L/͂ꛩK,urP5[ϺoNz¾26d2P^b)PN`̶V^GU\wm+%aplU1'm{ ,QD(r6YlP;,b%֞U[`a)pu.]9VΣ%;h}!֖e`2k[ 3x5.906X*T|,[/W+GZC,Y.rmsTEAe=s:nYȄrZP楪n[C[.: (jSjk=[sr3TX)b{ MByl Nv-7K31P79U6e NSEVP瓘<̹i8JNmד4UL5lV &6Qzڢ͕e:Ed)+@]yvMQ؝$ wMkkD-GqK=auc=0c|3p~x{`쁱8>{`;9 Էt']w-bP~ź ޶~+A=R7շt;U[=U= \CԸw։ۋCnW_2&SѪJօ}67hccK}k5 H@gYnlO (\}Cۺz}~ ׿+^r=ԓ.}^w\׾}VunAڔ=(em ygb\tɂ K/M"w[xupƦsBG(=D5dRې|S,zetװapa2?۾>stos|n>q,`OqGezqCs"s Rur4t9/(l %

U,Q`jize@*v'p 33 T P( 2@wi,y(/-2 `0NPZݏ=1&TԬ:e܀sm+jTr-4{`쁱{`쁱{`ܝpy{`쁱{_^,\ .-owS۪PݬA^t Uj Mi[T MΩ =[.tT|xrp'NgOm<@)3^cOOqnᔼoP}C#>0nd*BceW.Tbu - p{!mmk_[*eYf@<|ô?S+z:5z˽j7ZGf{`S/}TWZ&_cX;@-QЮo謳ϴ,*\džʫtc)t饗ik}+食67[}8C+򶆰{v(vغLa/ mQWh ][}n]٧Jsvr{(z>9,dY1?,(zk8[C}-=EQ[%GtԚmo^,2ȠuAQ>Zii/=of}}# {h귶3{h?B}w_ׯϽLU IDAT,0F\lk[Wc% @fY>3,o-ZU0cLY GVZ0D sr>N >͐ }1J[Έf@}V Zul]r#WX9jE, h-2wP[ϼ}е[;X scyT!6K` q%2}_{`쁱{`쁱X{<=0c=pb۝wP.Oxp;p/xPbR֔Zl#E6SAaYT`=`O:.\;Y7t'ók=Sp?q>C]sOn2uY/ ?@WܥϱEg̊hS9Wolª UB5ٍ}ͻ[~6U: R=ԧQ6u+pF/zKe_wr5dUV*LjckW w.2momh{SzӞaǜ/| _b۪]S0$˜{ CMgX@1ĊZ)0X.:U H.7c|r3lNɦ5CB,e'S Tf5+4v}pn 5"`sfՎ@Y, SiGTõ듟 9kk9crW 9n^>l}![bmiG+oQ+#ǒ`?)F Z~{;C9#{${5X 9f@'@Z/߇@Yu>*p~|,;T]ȞV KQ`krjyF_-DEa  v,0E=%r=Y٠D^V6vykf;/LFI*c yu nuPަ(m4X"68^2F9YqGEU(yNӼVR*QŖȋP[ e^Ⱥֳz7?=te>OiksKmSZ:go? gnnnv=zU񻿯hsnsB.&PWV(1is}]_O=*ꢷDFu *l`d'Z3,K ,j@Ըˠ8Ma굪{lj3GT#˦@O^l(\"Ն'G(cɺ 9V6+[8dPm?u-9VbMo{J/J`[otʠ\]tS}};w**뇬^P߲>BLo>^(c}>^vho?'+?>.96A 5l@}s*kg6!(pǯ& $7 "~.vkZ :-Xe;,o?6d[̃ /ǎA*uʲRWmurȸgb QG9z\JMgK6q3%[Z5@֪[nehP8pyKdlg;ɵ@#T^9ٲ%p5(urmv*Z9M[jPVe.Q[+1%ٶ[i3]lELrMɍkie, ,7URĊ$湦)P؛Xu4'8o2i\(Y($KOrgߢj9VN$EQ, w2 ǶG9.6|F-@wM&+VFVFJV"cERM'(xD=W-u">\y|(>c=0c=0o{`쁱{Aw,=,^k}u2]/KFHH6B!I!?8 elj/`@*?0 Jl.©Jq a433қ=Z}vuH53|[^{y8 Fw_}}x5 (ޞڥKŷ<6\ > ^:]#%>n;|bPv ^'d3=/; ߏh|WW>+_,{7?~f{ݟuzl_`c vO} <\wHl;u/<w׽5\\~L0J!2o=c]m!oxk+Gl%(M3nW>]eʣg>=#<;wTk-wcqij~l>_l1X~ޮyQNl*wح0xr;VTn9u23AnS $.Wߡ TS.j̥>3ےsԺdҢ-SG?UQxK.**MF/f3wĵgb ߶@H4=X(kΎP*CՏ(Zw=h">5}'le~Ϲm'^ȋfQJYz,Y+HEQy~lQ oȤ%wq={,pru5+8*vUt~?Roͺ1V|rg~tdԨo6erAitdhsTOs'd6w@ao}`J Hɤe|oatаPOҒk˹@ bKLmw@].YjΖZ 2NX@ZcH%5p(fŲݦm]Tdв%d$YB7p\T9qh%4&6x{\A^-6--*SH}2@Gtɽ8kP|ZeY쓻zMNRFm%XڷM`D 1Xq˶vu'۹2j]j;{ΞD_sZ@j<{ܧEz1j=聓v='_)oW>voU}pB/8L.ϣMco۹}qbY)fW,|韵Ih{/ bO؟gO~=+jpFxi W?fGا>)5{׻ޭ]eUngtE)wU4?3{Gٟ|F,-Ih\Z='xQ/t+C ҈2ש/vȨRe9Ln>jaX ʸPnߠ_Kv>UD} %sevk$XŲTbA)wvY+Xy西Xһԑ| RmgPm6]cB[0}bMBOחjX/;U1$[:,`P!3Ue]߷TֶÑ/lg{5OL1S z6 [#AYTeYAKV>aw3.{}=j=P{'As}-0w+ޞTopWx= Qކm=嶠H+bo\e %pZGK~[7wb?iuo|=Yϲ<+웞,{7?~ץ}򋹈{ӿ\l??J^y^De,) ,"t; F0`g&[qtd l_5vI^yx ;mT72q;(U/ԙ핷nΝskGN^lȪkso#y;6@<x7= h0 u,X2>) XRϻA*_^}2=#;BGf!-`pKC3Ů[JJ(hRX>c6}8#zHH^U;8a*7\d;T@iRʢ~z~zkŮWP uek}5~o |[QR-!~}K}-P}([??0SW?Q1B;HQR}էQl(GOK`e?ˮD{(Kb(_ޟng~'P/[N͠E݊1]cKw;Z>YQ-[m n:QϢMb,>`EoG 앱DFYKm{%eے*7(;]lh9PWmHXe#`5nz pkbgMI$;dlFy,@l۴ֶ΢쓓u4w9[JJ6U/ No+-j_g>\m s?*IXxrpuǪ3ؖ`Hϱ:>=*UTR pm 1;_!RZ"sD}/%'xy2@W\oq,%+@vDA˂-߰#ڒ1 E PƾiYH<ߦX^[@/19I9EX qs_9nMY䜂2[bϴ%{V]r,\#?ZYJ2N.al-Orw6;dQ*öZoQOU6e cZ7vd}G,vűX"w@Vm2ۭ[[B"EQ6zɾP ö+Y8<>FKqp?X"9%k%vN!c-ڈrM@.ʭlgnQs2l q-rk;Kqb}EnMlC.)mȻXv֢EuִAvʛmnv̽_Bʕ+WԹ=P{@=P3o_ejxf oWP1^kyowoq}{]tM#0y_c^b?0|jy y٭?/K_h^dsWk_o;[ƞ**+PavFa Ht pE ,@Qʎ؞Գ;RQ9 yĽmQËͧt( XCYRN#@վdԱ(GY:ƨ~Qe `Pչe[ FN|Z;ilwQ[+;Թ ʩE 4CI}/YOjvRA5&xT+XbzbƲq=Jv(_2\f3xR} .PPaP1XLpԺ,P1Z7wPW)gA.U_Ƕ"ovɪg˨jT@Wml]g9Gca EA,]<}3fNg2XǢ&XGWmcl냵J],тtK; ئ\ژa\Cb a=/b`}1́\ܸX"gSmk-Y,w\eنNjY@kAcԸgb7_FmMtHKh]8t7yٙ{ٽgo}[Z+UR{@j= pzzk=P{ӳVH{x~:Wp>ϿI[QޮB"fe,G{pʾ|^do/{{ݾy-ؽ~=޷=`oKUx}kk  `it Ey;E,v4zm`(P DܠC;O^,ن-:Y7ԺK 04!Y:,'Lf?f;u`{]q(]4rlGpuC`uTn6ɧe;N_.7o([d Z3nH>Rעb>LPb]J޹ 0ߣ&=믖ןm?k}ϊ廣r^QNn} Ux5s@j[>Wcc굾[Kc,)1 Rg"l^>f~?>Ͼyew>@>],WW?ET|\2bV53;’~\VԿzʒ,weKzcW*z.}hEJ]lJ\~_Rs%:}n)g;Ԯ(d. ~TbF .Rk \l/<}3 XfԻHP`Yl@֕SU$XTȨE[8]kD hS- dm"_6{V.7 MhC;[q;kQˢ/Ŕ[9(pLVF.7ʰ}rm8[YyDb%bj<'@KrP&٢b6 dY m6$5niuY@hmB! RgȮMR&T u-Aݶ,w+u-(d,LvYjm;KMm 6ZYLP~Z_d_XWSj=P{3g쵯}]a}y!zj=P{ӳV8[sV nWޯ wOd|-ŋKُOso!jyc"{Us^9xc/>xj6vsw[_,Hr}tiU+nQɢ( Pe'V3AٍYE]I ^ /-|Z ".[1;mVaϓD 7| ]dxe;c{[(;-FDYJV@Q~` U~@&W\a y0 Hr>ĕѳx^;Q!R_'@ywE@;cYQ&RdU*(G*cYc L꣢>鳽@oP|UwayE仮+Cz܁hQ / hQ0VcDI um-%y\ce>V͎R_:x.{~WjN̢9/}aI LP#,.,Ἀҕo|P:@,@B2rq- ehH.<ρX[ۓm[AW*YW׌ Ir/V,Ѣ.dzEnGA֔'}RR,ٺ>[dݐ,e`1&|\ԴJ[T)grZp([2qsҖ.ekecjދ砼6,J}6{h]Z nGvmFem&6rZMh 45ڦX2kk:Wb3dB瓻Y_j=L7Mvw+^ qoz^q=P{@OXA nO}x~+߳t=@ߨz v64l`s6lpqo{}1g~-]w! | d)(^ǺS \T_=`׭C'+BKP%A΃+XTFai #okmWNc[EFa rUYʢ-W*a@0s[ee*wp_)ؕ%,E FŦ{d®hp,+ڕ ^WvWU̳+U@'{eW2T^,jB;,+P H< J)%0U-=,RX̣6 5e"ݒѺW_jֽ.Z0֗mq}c`0&@I},w5Qrl^c_̀Q@7v‡spUo7,XK?}'ז}d}HQͳXFaMHXG]lPϢ巹W~nA\ =kZ= ]#]iw|GXG2 $s{Plxv,e]Ȟ-"qf9GE߳X*pB0{o j^trM)k6jo=A^/9rQbK](,%mRE-,mb +oy ` ޢ"jHKnO.j\(pɭHͤ۞,\TmwBFy2BIFέ1XQ@75Եϴ)ZJpuk,ɤ][6s- Z -] =2dvum\rΆFZk΂l7l&YPi|6lMkmg@3gsgfbT%kL=P{@jxZ7 vwV[nj=P{)Cz>^cU{/] .,5Q,uMj_9\E"_ Ns o~u{~~u_{ 2v6eRN(,DipdLY`-v_`@wkc1:Y`2c*-p^I?g1TՀ# `EEv,0: cw՞lU5d[+Kե> R!{E6òFFZ%3W g *BƖ֡ !sr9U}Ε{A&@:v[[J5,E'p [dak殀&?)g;!;(D%un1PZ;+Xʪy癿QvX26mkFYQzJE-X S܏[hy:fY,?\?=Qz]@kE,S@-'z,ǯE*F?X|850f`Ȋ_{/*pQ] hw(^c\]3]&b f2tQ ,],5ZLPƖū`c$[fzZ 7 Rrt99ۙYTq/6(duJa[E?PQ9x(n<0\;|/c?JE] J\@ɺYQPi@u,kgIʨp?=뱯Ǿ@jx*7W*ĭ̅?j=P{>en$]z] {#{; (Cr1ڄL̅"IJrX;o,K;d,.؍R V6Q K(:nPC^r_}lSϾNR PxEwT`@Bk/hJ} EVP;Qy}`7c]`x\5RRcdE *u$,Z40F,Fic2=ei,5gd`/ے=s6r,nV}YsQ.@,`)puQY9_/u1\@V r+.cd\I8E{gl,t[Lkoe.g׽Z_Qcn ^ڶK}/0OU.+U g m~}ԧk} <gG}Q@uR_ `Cjf>}:ܑ5+{?v7/ h's ne<>bl>`4~]KamQOSe+0uN3'IuzFl PLYo5-~eǶWǿRrb ,SNdOp%ǒ,-qe,s /}T \ypE]qԹCЖ*,AJځ,9-dyT^js9eM[K,Q8WE)}p],E/%3v˜+Q֖֒qP9ʯ(H2*/("N@_Y#h)Zz<[LlrJ rkNMQX%R W6//*Z rgyzcpkHZ}͂֒Mʵ6xn-]-w &qH#G74X*w `#Nm`MUn%;kfzwc>{Ξ9W-z@j=P{x! Nf܋bvj=P{ ήw|}.Ϲ_}x \@\{y;~]ƎRSJ(WŦz<\.d[Nl\he.iʊdʚs읦( MbɅ2 >JW`)OFR-0t V/SG) p^Zڢ9P}_d2~rg\ n@ԟqx)Eņ"#f ;R |uVA1e4@%wuK}TrkJ9,Eחv\i ,vp- dl7eRjB6+#sj@W,sl형 *Y"թ+RGYbmd;Y. tPDt‚Uؘ#K}oWaOW e>};w;`@:3'Ype5XUq=`'>k}W3~WbE'՗ƩyfҌuӡ`Rc^c tk7[/nTL[k??̅#U?+wwQ(c;_[,ǁ^Jˎ55 ZԯJ UQвEl$hT彥9QE-+@a\ĮƜ1n>9ʮ'ϖ=[YQ_`->`|,Oӝ*RΎLz;JYqE1`xź+l{& l(zCd n\U3 Zljr;IA F) Ŧ zT}\TrmBn/0[J,0-Ƣ.V hy;8eBgC[~mnieT.6YڍMZ^&9-zuY6$kBkmPfk;`/Ff6nlT[p v:oŧsvMRV z^=P{@jgۨE!O~2}(m IDATgLcL}5(bXdU_JUj [KUfsdI/YJL/p Rh|c4볯_lc. 8P_ sd,5&՚3Ue"s)7٭|o>cR/?`;_vpoQ3ѡ^Ԟ̓+3}ivRI }N}^pRf_>Jghp^ghT>DuRa2hc+6(%%gbJ/d]wڔoQ;n= (&M(ВX̀SQ^n<^ԃT^le oJukZTFa Sݢ8^W6ـMenog "Q_Y-cDʘPS0%ܰ:R>Z}۸,bm{>ʗv~}_Qz}&_>5R>mdSz},縡jV}X-63p^t+` 5+uԦ>\J8k?z@ziٰ3=*ץ-s/e;߷nMdSWT!J;G;7B}V̨vg 41ts+{i^gr>_@4w^q#Q l3^XvyE1!b9oK-e_o !}m>XdLfn{ 8ZP;ԸQ->IBb<ʺ+eZ }2v"`7EY-ǜO2VJZ1 R ok%ek3 Y - [,hv̡6&bMLdHmϴ-V̀dMíu-zm6ݴ2睵 g^vۍ[+wꂅԷuMclfkgkoF.U{s/֋u>k=P{@j=P{@j\kFzxzBu$ق~-b/^ .ٔ{]2X9*Y/s.'#Ot.;D=CpEia.jfͫh^ 9[-K&h@@'4 q`ްJ>3~a#Jqvأ$OP9,佮J`|(uKK}3%gװ",f=XkzE{hTwL)vTu& p(d&#,]ƍ.`-lUjwO@&`s26[&Ƃkc绪204W߉B,Z@rO+G ԟ> a]++%WcdK^},Mru?v\G}@eMQ\F ,J򄁼G+>OgMm}sre7??? ?gRz|]49+( sڕdɌ]{X,r:~+euk05TjY8͖8|%6k(kq֭gdYrd̎֓Gɗ2N-ɹxLmֺ-ɹE6ȺMd]xٜ [j_0pH]msTekQ ֺ-ۈXtüJc6R|A-vڠmvPvgۆrr7ZFm:κ gn*Zg}gN? \mcGj=P{@j=P{@큛+9ݿ7@_.<ۜpx_\wrQBTP\hGud^xv3`W%b:YKallPsRfW&/VJ(,cQ Ÿ*3ypPƿX%b+e`qEQQ/Xb<3\FuF/0 q(QXg)U*N`ޢ*Ff,$7@vA.u#st+Zϧ>syBƘ] ¾9#@>T4d6Yb݊vQ $cs՗BՁ8KXN^_v~}`4֕>_|G*l^>`\8'svUs!)/|Pv>۵WZ__;R|X2a|?6C:ދrygA @(Jϙ=x?XE/Z`\\G1+u/d^&oVǂ ? zk{0vT׹E-QӺŵn  PNZ 0^n Nh ߛm˹Z;_HM((Ŭh9n<ɲ[ǸHI]< Xk% <Ж9|q Z ҳ-3U[![y΢ߥhgؿt גg˹7Qʢx E.=ٶdLF쒱Nf@]Y.'=N);2kr.[/vʮe5X&zcjq'-5a6\M2E.C-ȯEm%+ @_Wj7/ɝh-ʂ6?X)6(qwm1P vٍt2:IP9X{@j=P{@j=P{ fO\I.Թ wry/]?oj^ae'V.J(܁'W;{G~G7}}^%ȋҴ|&UZ}@+pNza*PlWl+ vUY>c`'`9 8 ,k . `kxI=+%0@kUE X X\KFXd+QF%,=h`CGԏX +gWٺRr+Wlj>vpl^ˎ c^>ִeB2J< \,)_[MSߥ 7ITV(k68,1s*s -QWn5}>VW|5W^SF+r<~-A-Pxn=ctPqu~{Y+5{W3/Ǿ7V +a/H= \&y//G ze՟؞!FG{5cm`Cv)Ʋ'+[Ȕg|}RӲ/+8Bsq5X`lAyYFSmbDK]glZԲMaNlmEy)wBQm b["5n3CƢ,klM@R  =fH)a{MFkm\e+.jZXm^mr;HnRDvU{v:j=P{@j=P{@OVޯ*\Ix*q-pW.P>]8EMT(\'Ξ c&Ro;gzP}7)+?jDv-*O@H/OyEa bHS$GFVTVKf3V!YBҫ>c5cՌ=@~}{62HSUwKT͞ ZRO@z 3ٙx+v@Խ (a%e X=RḱxY[cb{U2C.^q:f2(|~cz ,n> rQn][e?Č_ú_>xQ>{}>>~r^}ϿOcӭ\de_?e* QkB0j}-N٫|;"UaCث0+EY`^_zTJ{y;*PgCGʂ 2Q>`t`O(ǜvRȄy\~[jt,v(#8'sTco`B {cLaQŢeI@AVIV@Yo+c". Z<Ln7쓅:En,!'(cQJ[6Q[k9Cr^Y(o[be &ՒqKo]7Z[礜Z!K|.KmRV-*`X!c EAܷE- ! -u+mrVl؍nyMVm7gCJEvmwFn5o\m#cm;Y>k< ضF*MwʚMkgV 'Cj=P{@j=P{@7VuVhkzv_oQ/ .Y҅u`b24$: })*e -lwy>%/~ϼ)}cW{ǫ^-5 +=(j Que-0  KR(A0VJ5e 7a1IWnmn{{E,[Xnfysc+e1+ );mzu0N\lYGe &I܂"UJ_Y8&k:뱫i5Nq)gSZ@PjQ9FE.j=2xOҡL9 FA*=\ԓ*KI Tח*hE> 1Õj5?Ц|dWb%yf?vCPGɬ}N}DyV_;~+d,%3ɌvR2.W٘f)ow43~ZYWld0:=맥>oϭpUؓQR!RpE h6ɪ|w*] >eIA!~~]; Y}#w,p068Ha,e~neOn-s U0GxO {'ʐ1p\Ei9 ;z9mRFB",Rs*Y$Ȩ1Լmay6uiͺEY[m2emUr͒YX#urքwbH @`THͻ burTn@M+-jhe-S,7{-Ҏ}1c39ؐ_0O6&04w㻤>cQ4?ǏlR X`5 k(ɦPnU*ٌ]Qe92 YFԮdrɨb'K{/XjvF9|*R-h_ίsk~.wX%G+%gCU;DԴd֧^ȁ[9\tr>G]Җ V`9ҹ".(vQTCJ@ޘ]+6fy)mɯ-l-|\,S@C]"EnwT@ޠϑe %6ɕM&dkP(wɯm-b{5vŎh] fn,lY%7@ٰ%olX8 /7XݴiiݠAg=gyo}=Vam:j=P{@j=P{@ϤX,cz=x>=]3pQw~Aժ + #oIebRۧ$e } (D}& (դ X)X#jKSa[<I]&/k.ltggBٵ,͂/,sHW1, ^@,vѨfG-U(> .Q ,)?wP\fWP"l,0I݇E2TOd/gߵ>`iSo3k+47 IDAT( gR{\ԟbyV 'z(R4Ŵ[j 1W*wyU+?'s㧿|s $'lݲ[>8`MMQϜݹE5?ϢS ^€>`j}]+Zw;[w<\3, +d)wQ/wqDUܰ)ڈU9@W#8+p8:i[q\n1]eS#Y*\ 'eԹ([{@,Z,%kKe|vl k[IZ>9j_Q` )ao(cͨnQ֓1')~Q>vʯFjQaܑB*jqV-rV9X']2.G]cM-u:k&jY>EsC+dC -,ǨsV]_T`({]+mliCYrb|L uᆅv'pְ"!*H/aƲ+vի(UQ7~,QA߰>O}@̨'Q9WK}s>K}3mF )=Pc8`bk}-؝'J,v@?k2[e |d lg^f%WU,F 9ǛE ~Ιt\b٫iRY -zFw~(Q/kdR,֘r|V~>P.xe[6ȜGWղoU,ƑUCVytLVmJI@z ѰG/X b2i/*Z:K v_vmHaWնdU٧>(fa525l!K ,њs԰rp mVdFېCcM*Ͷ6"Gim5ٺm'cm76ƺM٩qC{|{`T uf6{{+]W:(Ǣj=P{@j=P{X~ntrܮo8[n.\h_0.sU0aӫA d^<\ eB,1+__.Lc9\_> ];~|k6}"[NlPv?}K1;<'rRb9d7OO//;w"(PX}vai:LIPGRkR]HqgL~m3??}#OCQr[vlH uQ CrEE92U'Pk1#٥%pl;(Z2n3yN]*Y>3NXT;t~5HYN>0{}r,Y/Z`!8!J~2Ж{g}\uuZճl F*}j b3eQ?0c,u6}P㏭z?J;R.JS0S] %,be?Pc|m}Tؔ(cÄuYձJgqF緭{mŠy'۶ū~,Yk91PXQSؗ7Qke+6β'\ Mf=5$KP b,ɌEuXsΌ@Z+WҲQ'͑mʷe;.gi`92R2k]/5F΢[qRђKm}2ۈRbwbl-΂s];`ogM,d06Bqڀq&ky?y(}2S>u2㽶օaFklVc,umm2`u-YNuӺ2dض(~uSta{ʸm;Hִdܶ{L۝4NΜ(zqj=P{@j=P{@큛+e{ݯhoqWD K +떋\("l&B:( 2 J1W# ,[yQ&w ><=C0ˏ;6&pL`|[]GGz.?}e'>adY룆oC\+\ˏ}~خh@'֪;fWء WG,O]y8韰6)َ8xz>.}%%R5hzmDqpD)p4.-qruU cu9v 5^7a򾔢g~}ԗ>EaԟZm^RzR}mQ;4>=)Gh(JgqU46^1 u3G:+k@jlD:r.MX㏲\^{l(9'?jlFKO8p%iUԗ[dGSbU}^x}tQs܁e`+dȃ;Ba^ΘȰRwzf,H`1 jY//(v9[RƲ"2Z [q'R*6ɀY, lQʢe3KlQ">[,$JUD;Uo5anjNNu#X9:[rfRqrȨ{]WfeݒSmk!z@ d,ɺ!Z "=n"#7WbuX ww -6Z2oFd,7Onk}rpPm[WbycM%rn7 έ4@\o[뚍m6)lŭ;}Ww}P+@j=P{@j=P{@/I@ pܮv<{{.w^(n.@e>DJ4$ \1WP$apz!I'^M壿%piÏ~r8D|Cۿ;k4?eOwySyQc'v۷UxRO "}ΞG8F@@ ^`y,% ~?WG,XG+˿]ya{+G.?͏]wݩreݍ4kҘd $3ԓ:Pj?8x>'gޜ]T%tm''P5b mr*Q7u{ỷ3`QΪO1p]߆@" Vmɽ6~H,ST<X(RڮhĞZ}_@5սc7RURK}2QH^{r:vbS6fq,kCTϱC9=E ˶Iuw)ᕛ=yrn7.8x,{|mA[^_MԧXRWi<  :$VkQc-?IɊ#Tr`ȲT,h@1-4rl\)f#_z bT%Yfej %K eۂ. (keA`) E^I5J269I'ۘ-Vctd%KW :ɭrq(k[lCuC(oyBk+;:{wβ7^h^?ƪ,<.Hl-=?7eUnU%elX._l:9#/W8[[Nm,,bmT( H.xM~niͤ] # )yl} /.fL43@RH=z @RH=z 'ZzpURPI-X(n[]՗ Duۨɽ(.$O-OK(Ӏ c o\-Zu]vHf6l{6dn_Wa5ٯ7m6|6G]_!rZ0ȩ̎{Z馗ܦө/8妛m6VSo$A p] P Ef/l۶sloswj^Mx 7o䡙."Z轆R HuFKg: JN'IJ[& 27EX΢Hrsc}>7`^%KbW*s,}>L&.Ui-?! d/d7?ϫX5;L$CsJs쨽UoZs,KS>*Der@6?p@l`)+ xҗ8cM}5*U }oeB^oE{>/X9Va!RrLadju5w ISZuqWp^P&Cu4y ;V(m6^TՎ-˽Z58rϫE,J`w>[W@]_kUq0JXXZfoeY]NFEYe&*{{r'&1,Z<[~VT-9(h^`)ڶ*6ʸ `8Ԗs@zkdrkɪeب=byX.@m^X*ڲ-ѪM2e& %.6qKnmiv(˨e!l\`l( +畲o<׶Ki[~/`7oE72lc[.+.K6ʧ:H=z @RH=z @R?lfӭۥgv7$b16< g\Gc;Ǻ.o~Sݽsggg>}]bvmkwev Fvƀ$Tc{W_mw2Vfuly=ϰ˞t;3\q=홗ٞ˞aO#<'ϠAL\Ђ<LJչ]@m,Weq\E+`Ɍ:ַXJz|9Fn. lb Dfr >˶bJm(z#6qP@_gZö<=l\&)Zk<*=Ȓ_f\!϶iɯm -+Q֪kg­Jn}X/Qٶ@ n, ٵbձXY9 c,k\(lAt. q#`Ҷ U@lcy2ƾL9pGȰb͢E,j2XQAb\i!7J%oeE6ʙ̗7m߾}߽ Ox޽p?qH=z @RH=z @R8z`f_qQ.E-(2LZbA !;thC kojWDS+3u\z,Z*>-<?ذZ\冝2DB??>y?jmo٦mMv7*M糵6b<_mL~nH״@揽)J^\5#|3+yˍשW]yRV6m׾ {ڥOEP%U@#vms2'{&s/|ўxY&h:2Q~Mǝm_ % !{ln}곟@[{څه>A)3^mړ/x삙,pّoI۹r:LI&@Ke*Y\|v1նS$k}eS&+,Rf," j ɐs+ZP!G -@nS>gp"@! EM5A6.3ةN@^(a2e\ vQv0=rƺrVݱ5ٳ^jme,Vj U\[WWXAcwl,[VXWG.tkZrqɤ@Vj`%P6p\ѲyX.Gb`nj2Džkef$n(JP`P+[drmkڮqSIRH=z @RH=z @Q @v}~H;?v.E x~,X$=6 }2_G)oWbK`suZ e(a=Ĕ pVv뭷'-Y7l2lj]u]2 3o~M6nً_t@xQvp߆ֻ~CĶs{{ot6c{+_iGGl>]ˀ]Gv®pq:@W5ޢ$ IDAT~ @Ul\vK..:,S;ݶe>"iO:׾p}C6=d#ڞ}KI@}n{fG3Shv=:l<\W2AjqTnhzxIѐZK },Sv)Vd?dˋOjƫU ^,Uv,ݭ΂]u6@l7V`Z׿]m:Rs]v(~uw+`߀SX}*T2űz\>rI-U?5z~E*E탺x{֫r[evQqƵ}TX&s,s5.c CzLЊ Wg K]K/c7&˶ÂZzm%UcPM5nX@WmFiqDɨ>~56F(k[{ƱVEqk+ Qve(ȲmZƕ*lKG6WRٴnJ&.6TVP>1ߢl[[ȒYKnY*{d@/Y1qDiem_U9Y1wc?ls2)WGKnfe9b|dY} AaO}SMG,t=H=z @RH=z @NXkO9@ş*6yq?%ǵ=t]~pÿXoE&yjgFڮVny_ǣ :؏/m?Z[:LD]m7YTS (~5|{f66p4d6vgd{&|S~90t6ԶgN؏Ĺ Mg}DX$.pE1xČkwæ;2ًIR2_-WZ LX bƭWHma7۳, _m϶z!;{v݋?'l{|筷X}ME_b]7vym=##[ɨ Qd6^(hF=({J챲{ke ʆum)%*d-sz+:da_T@B&u:8mqVūۇ &_N(j\*/YX_c1q4s_Rqc5S˶\FK}&A`\reJ?XI-[VL^>ɒuu-g2JMҶr `Xcg][Sa,MhV.,۶9L|p\=xs!Vd[V1$2˰'X7ֲ>otd9Bpk^WW3!'9 Rn6FmM:<+ +J^Qz9XilkKM@(5ȕE ԭf*-(m #5*^kȭjk֩PՖYE[o_Z8h!%[cWoe-lɻʹ,1<3k+-9eny-+P>,*6Q~J˳`pam}[_,˲LV@\pSNSt SH=z @RH=z @8l_/v;Ep/ D%5 X/״ e*+\]%]? %jT#SYZ+vvӍ7|e[ӹ]w}fpm8^&6n9OݫQǺ1ud"٠}[_rw~ﵷ^%XL&} ;󌥘ƒ0~<wV*ҭiL=d2 .Qջ;Ig^b_r]ԋ⋞b>b{ۙg ^Wx*NIX{W0wg8vlsxW嬠,{nU풂T_$,ۚ>԰][iYEM:"cw~!^U]["nm?nb9<+g53(i̶ZJνrgW}Y@i+p:.e8En"unhV.J@oeXateeGn b6['KJܼY>E&keߺ7Q 漰Q}6ʲ26&%/8܌F;p,EnY8MW-lop(Ľό\@s$kz @RH=z @RH= w}O"]| ]p wPs/?`/ߐh,/={J-(ZT}!FvXY>~ d?Xj2~@y'kNWR|Ӌa񋯻V@8?m:۴tjk"E5&5Z]W6x?d6g]QJ;8Aئ77dUq=K\kslwr^ 갮m?ǪOVPz'>1fsMb ==bpWq=4nˤLUO  EuԆmjQ/߷ U5eO¨W힏~X_'ekLHX2VJ> dUd;+d=u%076+dK5)ܒ-RC._>>e_ÚHO[8o?TN7Qɣ_*k= ?cY~e\M3tkRøV*@de,y>VX=9F%#\=޴I M&KR ~ڨ=sId^*U(YQr)/gиQ \TUMv>KpvZ,Q2]w xŶg"%`κdے3[d_ԭ#;9(*m+lle̳?TLJ]ԭ\ZԻXs\(^VX9xbeMXp @R@XXGYV5RVR6ȥ[$(WE]mEYHɋBnKʭ Of[,ٜ@53+ܪsvԥ.SmQ*\l emrgVъ|dyQ R#a.E+٦`9c{K<;hOW.[;;Oj+W]uq|;a_˗Zɖ޲mvz}.;,/ײuN|m;7s1/.^/g|پ;lw;laˎyqzq?la-ieN \v̋ˇ׋Y|=,_e۝lN-fwzoc^\>^a}-[wdwZo6;{>~_˗kٺv'[z˶zXl_;[NްeǼ|xeZɖ޲mvz}.;,/ײuN|m;7s1/.^/g|پ;lw;laˎyqzq?la-ieN \v̋ˇ׋Y|=,_e۝lN-fwzoc^\>^a}-[wdwZo6;{>~_˗kٺv'[z˶zXl_;[NްeǼ|xeZɖ޲mvz}.;,/ײuN|m;7s1/.^/g|پ;lw;laˎyqzq?la-ieN 队X6aW\KGbp׮U{]w٧?)kl6;O꣖ ˚7וmyN!Ba2VG\kr@ParAԏ`DEXWy_a&S9W15ٸ'17X׭+V.Ai[]-b Fy ZSœc 'SWjY&MZԴ(cFe2R7*VUg%08p|W+*Ee~JldbܠuKd, 9JY2#VR -c(eӡrQO."b uP6rrn^remhɻEi -KԴa Edf9P erP,`Y-c[NX,6 t=vȭ{anؾrqi /P-Q~'{y ~:u[wt->-_OzOz[>skOzOz,>-_Oz<ϟ=<>@-0wp;\^/JUF+%ln_J}/gg<,khy{m>߲|VӉM&vx{/SަNSΓ)ZػmF}_2# 4ϸvy><^p [_j\c{ݿ(U޸a[#4~3%:F}ޗ>lG&G\;22s‚ϳn+v2p>Ng?ď ~|˦]u`5C튚@B,QE6cbz54 ep=н. 'xzVuPJD),L}A~Ssǝ?׊/e=l\l+U8u=v ٸz+V[Z6W}qhy~W+Upy1Lh229g.곍(ih#p 'RJ]WsOyʥm@M=w_}3G>bGsJnd/X)j,dqVFc,Ql:_ގ e Ը3T(EZRxT O/ _:XqR*p찕:=˳׺.h[&ZUlE5JW&c9ۊ &E("F5 n"QD/*o,.X7V6VqJ*B`S 쌱0F KA(?. 2 pZ[h9C%mڵ6Fmh. .ж~-ɕK`k,Fu%re##HVYru8[XDmrܢ- ;(L$H7Q|QI&RH=z @RH=z @J?l;t,%=wWj7P=NL`?nT*?F,PT`sW ֋^"N&ʐ륎{֞gl2>iM& @Gwl2&7ܨY ȸVR`9WكMۜwՕm:d>zT(/dw, l^s9:lm>l}slj/0;}!nM/y6qMgS)sg@ jCL~6o}K_vh& tt*o ۜlCa޲7R*#X նrX\@ienӺJƨK1bc kPP{F4T߭Q&*_'zXL`,*V\W\,[>r^\m^ P*xfۖ 8fQ*Up ꣔%Ǜ|[ԷR%9v~FlKN۸eճd,"X9TV5)YM:VN-< RWE=2]+Ծ@^}=9Wr[8Vl}~lF}2׈k IDATuSJ[{VsmK|uL@^,UB _2[+r2ָ)-ȟ Rf,9Rf8-2yjjԸE#ȭu%maEXImEfm)mo27+lC(jՖa$8 ,P/Z(>62l$oErQJ7<Fž9# 7ϥ] e@ۻKTC0GOIRH=z @RH=z @Sg+Է|)y% 7\_8 F(u(ZTcdM d1I,E%rͶ&6ߜ7\;M[*/mnͤ}M7vȀZvti3:>pN?_K}.dj8/p崔@#sGч=.ll2}_]xnC,JQֽjSl3Wj.ҭe/5rgYL_U{ҹm|m-?sFsSO>ߦN{_mO5إ_b3`YEgWVAnzE1D1 ls͵m-1~,K>+F2JGRmc+}Zkhw;f--SOC J8L,q7~2'r_BZqO6^mC;ԗRKdםk2rRJ2*g:vܲ{6yYd CԺ ((v pQrnf?'`Yc,YX$ϣV6ı ҍ@l]^6n, ui%1(d6?Y&1̨c+ ʪ-缣Ŏ84!FFm t.a}b u.۠ +(gy@.\@.ղX'W(f6bP-GU[V*k{kd3U6ۑe͌| e."%6?rkvYJBHsLj̲0k n~ie}(2m/SGz&RH=z @RH=z @NB/RmKk1xrA %%_ˎV_ \T(ke cn 2ԹnFޚtb]wgF eyիaۚnwp vW\a/d}9//JMLw;oܴgnʫZYgOGY(z߻^~^c?=~e+tl:#3{3 #*{T7?oDwm^}]}uzg6ǚy2tf叢mTe3>*mVQU{o9Y4:Xm9nKf=y};֗]è< q/Q=%eh_?9epQ֭(mZC>d,++'QjPƆ*kgWu|ʒݮ\Go[*:˖E,CX 4C>n)+F퐣 ѳ%*Q%EO0C?‘\Acm mжAό֚8ԐwKmsL^]}FE{- 6 YO"mM ,u+emUa;:(kU[Qњ\쓱jlٮ |ZrqQkݪ<ܢB] -F2uY(S(sU.X%{OZ@^-ȭ8ve!2wE)nX VwKmAҀ(p9vɥ'ŕҲQers#-߳7pZH=z @RH=z @R=p!8xH HPR_aR KIo,-nqI`쿌GyxR=L#QsP#_lN7mm]B@Or;ٌ#6fyĶʨݲ/;] >*gʵ7\/uljo?e)X_Www՟nmM&3ۚm׿u;]>7a@’yiɶm\K}~'- o!7@zV;eܞ癮U,jF?Z)}s)i۞d-nT])G@7~6^rKl2c+^JǎV`h9]iyƵ 7"-W@.F,vжRkpb}X{xG =/TGIN翭o]P돒׸ B}YFcCC\[׋rE8+^rdr@N&x+/-sk+5dUcڢ{s(縲sTA}TF tA e jXl+yXWʭҽ>Xشc_ pQ֮~m,n-Hm\[?-{>kp8h:Էo[rb'0ZTI +x-3VnJ>f^5nmQbr+eY&+`n+xץ({l]K-JYT(m Y++jdVz dT ́EmE(YtB6%[QD}԰ԷcTdbi,Sv.P: 0-?69CiBPJalfhy6-,,]߷7Y(cJYI=z @RH=z @RH=pjci5/٥0K|2|A& ._ewoY?m `u HD}֮zNPN{NcKڔmlffWۜml3~wۓ9՞=~{?'O}FYʶ.vvn V'+pj[,uQF\Pzg R}+2̹rr@PQwH~K}Yz},o[)lYo~ԸZzX}TX'u83M/}2[Z_Զp>G-= Gi;øǦ,+%ԏ>*ooL,T߬G rop>&x(pS_7})86QP8 o}5ŀFg/|vÍ/^w=Kd-zṖZV|ҹO9ǚ8V} ;f%;!cg?m:m/%®jKTx}ٮԏ-p Y~8.vwB(JՆ]__wH<;lpKu_6o>jJRPR󏱰9^{}Y 1: tX.o˲h}2:`룴T5`1VVeͫ}pl(K>- o{]:ka6lW[V⾾|Ƣ[g@zAb}ϑ2eTUÖUw̕-zIY'6 )ЕRκ>P׭TǚP* [|Wߒa 2 bMp<𱬎'_ן?31 TX9Rl=S7?ƚ0RGTnm8 BCMrU-U>m-0L[PVQڂZxآ*d,kcBQgr%?W Yئ娉sϦ *`ti97Ud^%lQ XQf8nnb\*5-px ok{ \ --a\ZVEm2JC;2 Ya+ynY 6Jy-3׊޽{m}I0>50N%]RH=z @RH=z @S?h@@Ae uPRtl7C&Q;nR0R:xg5A&OuaLL`,(B_0~|10+e猢-UjH9=v$ e0 2R_*dPn+V([m΋!QƺrY1JVW! ɦaeX0q7}dnmڐ,us|}+DZXPeM@Ld,H_y@zl]Q<V/ b[`/E9k fBƻl{Z)sO~}>& 0X}un?h q$RSs^(=/徏_ͲPs`(GeT(2*z{PIOz-A5~+0{"s{xO6*(V+ok?deeqZ)8O@F/*Z,1F{ngږzE9 bu\`ܠ%b 8U Vc X  ybKA,Vʫ-XeY[P.E =kSQTDFɋ n XuX +c_@!r.}2pŬTH96@J2r  6Ѣsh  3-yeV2™TFzQ㖂)7G2^u2pr#T#8CRH=z @RH=z @Sg -_hjXL['R/<|dzo!rA ߥRh^lu=kGQPX&O;Y_y},Cu+S)] d☱a/ʦmC}1T'حtP D^7v/KaW -2jٻX ^21+ھ~^ X< C}6'Sۚ?= 4 Vlf]yt>@b}`2h>9Rr/Ykn lu=tX,ȁg?Q "}7@uƽu0@U-&T0~~ w{Us0~@)Rٕy`}cud,{a4@R83{é= ,'[C7`w:S=y$gc5b wj}}<>&ZbS-+ˤM\[}|]&D%\jL15Wj:cLXa_0%!PbU>m+0e2m9gԻUXsXVjb erT~mI-jܲH.%[,=69c[,<(-d wo\&;c -+dF)l(ju],~.жqqQ+Gtd`gVd#Vr+3ͲR\Ժ+[/g#Qbٞu>=s&Y\H=z @RH=z @Rweϫ/d <_\DV6|`|NpWN[''E$ VlÝ,QkT>])' Q/tm幷/>o=BR6jGs 0"+U5-x#Un*G6F/?(ڶ<kR㯏?  q폍թT+B[`Xz_w>o>Yg[ [Qj|z0)X*!e{U3ۡ8Exȉ'/RMs+@s Gh|n[>,dŭre ~ҙԔRE9P fg2.Y: rPZ0 kVl-eFij9!FDY۟o>KԺ(YKm[Pŕe3`r( 2rABadbw\PxBQK˺1l%feylTF8Z(YTX"ukʌ\\2~Q֢u( ]A;uCb++SlD.ŠR>#8i?5KmRH=z @RH=z #CڡR* TEԜʗ蝔N?tV֥E\#z饗>-c2@&G1s?$JZ X\aRx\v@:M0'QND׿/[rWrs歹LL[뷲)RJ߈^4kC!Jsn5eqy<'Lf?e<+^Փ~s p}BVd10kѨOVA!I'_=HxPV֔(}ɾX<7FFq,E-Ung9V_m+@\ s-[@)b=r|G< IDAT\Ŧ.\M\`ܫf%] KTeX%lzd3ZM2bS{D[Dˁi*ro3 QrtEԸ[Ԭٵym*9j` pMƬMrp탫lȾ u-ȥtQfYnhUvZJٶȹ]9Ը. ˲B]{ WL=?6oRH=z @RH=z @R#cwdUnc2~xͨ=C [2,RTA@JJɸ\W IL_.Q  ]'BqPaS6 49!wKRAQlHOPpGޤ,,H( (E_9e+8:,[ʆЅ.Ps,j~w~emCxB: uu6ATXv~ΏA%9E-2@h_YVË?/s$%'2~zO&&HeT?v[n ןcR7C7Rbm8'+%+\ny)uݺddB*_)VȲWg6ȜS(䓉AF˹NEm9RȞ[" g}䡱&R1~(P Z UTr>kM핸dȹD<(NX qS@]jxB[Q2`ڏ+v܂h;5PXҳ]) ?d2_jW~gry}MխU6S dRxӀSU#=<1~+JWkcL: BQѫI>^F5+pem e1C] JծUj[AʀҜ3dge+5mfeqZ[W6K"J&ncj[Mbv˹!ͨkQuQ "uKl +uc"7Z,FVb^KmKle2mQA.%,ff,TYe ]2ٸH5˃lON-\jL[2w(r`m.[n&<Qn{mcY,41]RH=z @RH=z @I?pذB`!)PqbKH|{-+!T =<E:UT5fXL=+vd[d@AE[b H NBu):̢ģ~#ZTV[RL})D `{2H@vTY*a8n٢S}'2pA1 jźYT%E@`fXŌ_5ǍR@Y}1?1@:FV E0[el_vk€j՗[A 3~*O~w\r+lG'%'~C}TéW*uCi~dP_#soܓ~9j!i?U ǎR*z3XHVc-Yܗ%<(YQz1ŵ6(eyDA؂g#;۲/?^-PVWY1[myxV|PZ͙$W 6kg\ƌ`s +5-a+Y&zEZ߮~E2L[hQz[(梌%V!W^mVENM+kY,WŹ nF6-_WО$2\nG}-% bdFcW&hʌxZny>]=#-mO=z @RH=z @RH=n(BUXl:ɿl_٭:U[|A* %hC @'@,8 /G5&_K k+>rܫr 6(QI?|EP_^>~,ot2X~]>PPuTsW׏3dJ GLa-+g%6RvĪgPo]4Fۡ8r7D2UwR" P!lg @Ff\8T.}Et5./;[Ms/ XAsUzپ?99lqj}΅_sL9vpǯO4ЛI 'QžxIͼub}B}4p>׍kp?L@=8?nSu@"Pg0cFO ф>n e@V~O Z$ =B0jYM )_>)v= }T2f֙π~-@40ƀ[0[AamF\i˳In,k$8ٟjֹjI6X!>9bu+Ay.E \XQa+ (p!T.k*}su^-Fq,6!<;䀍q%mY`\YJ (ZwHe,( 6Rm[/ ެXlY x6UmGW.M.WO)lw͹Y!{Ҥg>۳w_?uN9@RH=z @RH=zlcA uy((+=/2CaE EB!JKk(QAa؀͊/ X 2@ˣX_)}ԯ2@GI+be)` `0~~>~) a 7נZNe*B Z9T}R\k PJ*(u+ +oSPCnY+q}m9oZ=0'-K%aU+03&)6I6-|{Kzo_c;VŢ,tLscKY'ԩsQ(?l'ݯNQC}&x}<; $?Z(V3^ zH?ROA5;=һr>1껽yR`B5jp %?Ym`OgU[>Pc(Q+T84_U%zpq8ʲtNp3sET–`prERb[̺LP*,p/$–wkwj*rPkd/ɗ@C  @`(vʀr yf'Nl:4˾ s(<{0@OBմ96&1bǪ{$p([{~4+GP_~,QQ`(ް;RaQM`<,YZռ  dX,Z>S( DYH-CγקGn ,aTU'&_"Fo_Gɬ \& p~,dl~g/j3~z]W_ǂ إP[Vd#(UYdT+WָY> Ν/T&@z>X\xsrQ`8Y"JchL   0^=2ن2VϭRFM z b*|sL2@dWڢ`,Y(k WӎL5vR-6XDcӜs-圎F,kZԴEf+KcQ pRҾx0f? vlb>he{-*\=hU>m{7/Qf뙶@cmYB-GpsNl0,M7v:H=z @RH=z @R<88_#ArCEFa^ UmB;-dWSBrJ}XT*WbZ=xQqQ (T `^ =`Pj@Q7>~oJJS˭G>j^W@kkv)AQ FT%HWaG kXA}Tn$c.*VFX_5 `  V{gUk?U+T=H#H# 4f(L 06k60α9ǼXDD2`lcLM6,靺~}u?{F9A޻ZUZU׺[h좱Hnl~Anj>Q*.ޟccQ?6}ú\־Yc:DIw^fCmei4 {쀽>󝵉,\y弯7}7S׿KgԱ]}Yγ33=N} 

@+^_fdK~,:IDF(@_U;)s\?dz}!0K9dJM77W*? ҰBF]4p NVYǒ(縋4Ϧ? >俾[3 ?!̿4`o4nWoDחjce# :w?w T_}-䳁 ws%gARW6^Ԫ 3(TYGlar2GK, H@5IM X_kzZsU~-|pPڲgRX6˚(h稟 Ɇkj\pT3Եr 5@Q``essk#*[bjîX 3NZ?U+Hmq8Vdl5p9%E-6d&ئX @.@kPYbeʍ,s ň!o-זOXϥJ(=Pz@J(=Pz@k)RO%,fQF<1lPג[TJ(iz ~SjUԬ @fc6ċK#oǎFRu ?ذNUm%p$tQq}yczǿWǾu1lY{ Kܽ[W.l/jp2{rZ@|}ٯiֵXBP#aON.?z?4b7 UT kgQ7[ ]9.(Yzڅk^F9y}2w?;#mKVU_ FȺ,TZ|ΰFY^7^+ |&am,n di&_;iԼ@ב@]q,eG skQk?p L;'UI]m@+p8.FR52\^J-;cIM=6dbLf.[)!5V7@`!s0lQֲKF9۹6XWMV-d 65vInc8.Ȯ 2ڊ\S&5"d!`,FܵCvZP.0J(=Pz@J(=Pz@9bBIYY|g K2; `iۑ9v٥ڵ^g~]{ve9C~WRL{?Y`wybhFM+NV#6{2%&*/!+g1P9Uf8j~R:cۊ8u@AX2~ ʐ1b;>Qh]9קBԗa,E})caKI7JeƯUߕ5~R:?)'GѯR|GvOJӅrէgz> yw}TP@ w#a{0g9Y˙[Zu=}rW(;9ֆ$kY`@+"JW֠Vˬ7ߝ[v9PFexO4OQA%4J5E(oQv 2` j yȏUФWaPwUZwKem_@<^XP <րOfx{E;yr0fv %#^ke0VȀcuǿcь0p gn}#{wTQ&?ը,Q`cai8xv{aW}֢s޾,m+W;_r 翯%NޮTFXl&acqQgF &I XA]̆֕rlPmie,*K+R .6D+IUeb# Eob=ƩIb,+c1;#%2¶E% RՒ3 ֚D~,Q22femhq7Y!cJE1:geڢ):9Q"`ڌ3?k,D~6J]K.Jܘ*WFy_jllv9*@.JP.,=Pz@J(=Pz@J(=Pz{`;vءك<X\X$+a* )H/x{ 7ؑ#Gl߾}vꩧ>9W9 r??Fd[RW땱MFN!TuR1c__FV^P {%6j~i) ,zb|*&8F]ENON%Vy\ivj|F虚.kų2ǏP 'hGY纡br|.hv}`ʼY(֐~7k4RYZT*cqO{q{9 6?R3eރg@.~v`<8L*GfPJְf6gGXkQr=3jb쎇ʍm#@.cY3B-%qjm{] Xn ς4 dba,:/[۠U -jБCy C){Դ  bim+`~Rr|-R7jj#K=rK.ent{ejޚsB9HmEr"WV~čUh!{ M&{n @Th֖my(p,=Pz@J(=Pz@J(=Pz`0 òFUVnj$2Q8xJ|-(ۥ]&-@n??e^jAqƲ?j6?a0@P^Qt+, +aM듁[.`Vj_NneFeU,C},]H06X=Xj^]y^0DsNe& GԀg )[SD˲fn)wn.n]d =KQ!vI}R3I|1b mgaOkb~?T)Vo]os=\|}s^Zk%mԠ>CK0v a/)kv0~y f!v ӒlUs$D¸%kDZg\Zec"`YPv Zב5Ô}aQWJX|crsrh[X#h RԢ&5sZ;&z-PnE1̲A&6J[2jXW*VcqhpɰmMTM8[T9AerB[mu$f1=) nh9V VcLv.y.T*TqN@XY ʡ叶{J(=Pz@J(=Pz@X_[#A;yxAԱ0-Q*p^J6ܑ' }((o3iTrL>tSꡆ,SWOݚs)|E-G~p1 WW:\A%`޶$E}Y4Kfc,O80s54R)=ۗ\ƿnYl> @R(1]ug#H-9W(x{,wƿW)[f>K>R}!9BX!lz? jRC<`u XT&~BXXzu_}}k翯?BtnS0C./@\˹|=X_Qm;1ZYϯ -rcVR!6r~py/j0sl,HVnk1]2NuguSK <*ف *[ Y +e%XAop*7GK5˕nUc֊bSz@J(=Pz@J(=PzO^_+zr%QHR+p >ȾT"4u v( =>Tj^cO*}AԨ6 vl]ز&Qy2Ȧ*G{80n_H3T@^_g6U%?!z.DQ}3:U OZXުXs-89V%ղ+cF([#s%6yQ0C,㾸:^Ol2\g `pt ަ2yd6fr 6ZWc5r1\[S25+{Vvm^TjY'+\{sqQ]^VKaܥWUv}(=Pz@J(=Pz@Jxhkvx% ,1Q`aqy<^2VpZZ&16b~Ck:c7liM};M3wcwH*jk{}{߷M`|˾o؍dN΍ ;*7C{kٖMgwه>x}ctӦ[GozEӭݵCۚ{~WX9CAA=Fh@'w}iٖ@dv}k_~co%o ۠O?~ HŪz*#S9 ` $V๔]/|mkv'>&0 5?6kأc^ԗe6b?Ry2hegl-@U]qskroy6n`m ]aKDO%T7lzIbej^Э~=Vvɩ5iqd6ʵCi}2Y&sL(Qdc֢e2VC1J[`1_+rxk͖8,ٸ@dnn@]@vP'v̀:[ mjϽbcL.Y`(pKncgl9VJ(=Pz@J(=Pz@遇[^[#kO $Ppx 6Re(QHuۏC`PF7K2Wl_ TN"fMdjO_ym ;'ʫmо |ζkӹPNS m2'>Q]vt2OLpF hTvM(P۫tD IDAT?tmRWd>s\>վ([7ٮ|FF.0Ͻ;cٿۮ͌SG?^y W^y M~RͶdr^^җlf^zei2oqlNhP)UhꕔXK;/2>3Z;@F KR{V ߐu $E jq𓒳Y^2q[M3B \jU;am @wzp?A2,Qj+1y;/`Ub~mrbr&>5|8Xzvʺu@/jڌk*,,7"hElYԍC)^Q ʲ~{V4YX7XS~ 6[`#HBg&s,@R֏Cv-ٱrQ&dQݢ\:\6Ju1 AiεoMn jg2SsMbRf.[2l,@JFƭhzkV¶XZ71-/_r"G2ӥJ(=Pz@J(=Pz@ R(~%$`@3~\r`Q>|,;֒ƏUP`hBBtfz_ `{*@+G'6/|MĪxjG7&vۭ}#6ߜl6~Jc_|-^^aף` +K /٨dA, ,?AAُQE.ǢU.g/H`@z2ߕh7j O2*Ql9-mm-^qHy/*οEi?l//Yʚ RE}@,c|.~?`s1M)-z!mZ{L̞kVVwg}. SkT#AS%,&1re9>m޸آ7Bt{1&+ < C)ck@/|HyZ6뵁YrkmV-y[=ufɍ Ȝk+;d([c褌ϸd&b:mɣָ`2^Y,yT,t3\Yv(iڭ UAH틍srR9ڀ5yQKlyyD)J(=Pz@J(=Pz@=lkk$C<JB\)RKsXd>T2o?QXFe쵯6o?w\ڍy67m>g>rQkqQʥGiԧ܆}GoyF׽N?teA3e[mlF0llnIt(؀([(]0@,Bos9{~;w9vcϵ'` 7^h;G? [u>Op n6m2Y-˟}S׾淕Ō5\9o |^I[vRVrQ'*yjB\Ö\dς^&3{踻w{=\|6${]XŮߩl\evKQg{+@1tlmgYȂOB6XTN/O_9#[:e9A-j W/+O=lQU1df#[$ʱݲXr&uҁ<[4P،Bmk uEm@L>,#en1=V6iu[ȥ~#.YҨu]N@> XՠE į況YRXj}2}n-Y)Vck4]![7ȍԜc9q,h;F ;ȕA!KJ`>sGQW6mm^j]?dg[Rmj7W=:XUcly pO`J(=Pz@J(=Pz@!=jkk|H2[.@Ʌ%QjB=4wKLԇ z<}|87]ZtZꫥ\M~ eɵ.SYdu;kho+O}CS0h;;mϦOYvbk't>n~γyDy+pq[OOg3{[byRJlO}r|瓙g7\t~gUWf3lg_v}6 `׊ҍhd:i%/ymr͙]tE?jw|ӹ??6(n6]C[V%F+@4D]S_3%@-A{E}QޛPqKw_;c?y*R2ù,?s'-am;ԥ՗1pwn9 ck)yV5eW>cG>>.;;=6O@߼w~^˽E_dӯM0(MAsKWⲹE,lbqOeܯiס{9gFy T&/U1Ō'FiToVQ s@/MB|u1se%c] Y@hqdɀ(pŞ Z +=z+G6-rʨkZ9I}Ne`[+Y&ˮs _An _\܁UKmYWvP\z@J(=Pz@J(=Pza[Y[*6dB }<܌#2Tm~\?Ə-b}&%>~Q>ϲ{6G#O~ ǒUrn.NP,aKWku#%wfG ܮ;00d{m'v]v-tɮE; ;HGn8tRݷ> /H|ӭ?YO|f͙MfS'?ni-0t5W|iOI]ฎ(Vlg~]wK?f_-߷9mNv[imxOS9RqYqoM0J t >m[X~߂~o,w9T-jW&,ן{s5O0 ? sQ ԭ}}cJb#GgFʬgR`ǂ+ˬ{3oG뿯?ԯ䐆fea帨WO>A)T0;(WU3yWfc lZ +5qc|>axgQ,@sgJeXn&ya@_,984M[ 0`^z9sO}BƳN?tտB?.W𫣶C#zw_v=c)gf'^<.ys6.>(ҥ=鐡ޜlk_;@~K^yә=)Gd!  l- 0(R5n׿|nzkXlS(]¶\Զ{p̳:C:RYvԴFu |UciۮO.-sc(G'U?vE/WO?YX?PJY ST^_Uӯus?c ',pg#ʮK 8 (׭$[$m19@Y6`˼Sɤuk\y+/SُRbZ@-}Qq9-YKg溵F98$fLX>[kaQ|ƤR\)\\ƆֿgC/AVA̢f, 1@*Tʤ 1*auZ 2rlkx=+ \`sիylQ=G]6z o69D[^9dV@?K(=Pz@J(=Pz@JX^_5R! CP5<0ကM[?l2QTgYwR2*evqmMg1ۋ^"}r-趼^WÛ㙽𚫤P;7Y|67E B$ 2o`gM?!OL6oّ?N9Tl:Ɔ۝w`=`Ʒl>x638~m-*5r3ϯ6ol6xzWvϷw?.[~]boz[m:l: /PXO3/}s63>|-WM՗z.vCE'l?UnQ60{ճ_myVsRhAr|5kUW._nAPk;? NY<\_7cmP*t|_RT}~Oh@\k^ݞ{~ XBl6ږqhʫEʦT@Ȅk eW05,Q6(ge 6f*X U)g; 2{~qn29+C5-&%CYK},8,FΕN@^ɜY6lfBI1^jevʢ .JT-*Ev[Qr|,e u[e){c U,^ݖzh mPD ŭ~Ui g]Zs W= eu ,ή4ev=˶vIP>]7)V@J(=Pz@J(=Pz`medH+v- J`(ɆT^zuR#n1~@f3~9>޾od>6b_~unTMC!ċdf}|L`U %gkwx6tbϾ9zǤsMkߍ6L %X8s^~{* ;nحl4~v/<Ǔ}_5W@@u6FA%*0mvۜNl<۴WnoĶ&:<^ɦ+tm[dD0 l<@woۜdBc,oԨR;(6?>J{AYl}vP*~TSvVwHg]ɺ8tyT@Z~˹Ц~+0q|?W8d߅[vlD.639I+ڒ5F-K.qC[ ˙/j\_b̹|p PM hrmucQkb-vXyo%n ,0T*^AR;e,9V_e}L+pcA, _le̵pJ-*b\@v +,e.@2Jy\J71lí-Zb\`lJ(=Pz@J(=Pz@J<`-+Wy-`QVXjb݋(tHT;Xs.,&~|8gPRax-v7vYg׿UO6t@ fY}ʆKl_l:|v.  |%mztl]vi'˒||믿Nlk߀2=cӉ}_ۮK_j9ٺsm[ǟ<";znO&,Pvo~Kdn2]sM'3^tᅞ˦sm6{s#YzwR{/k}gdc//F}@y=^Sf3 \R>(-[ʆG \ sd,LV l?`cMa4]Ŭ?(UYk |W `IM@ع;@W?w? k%saHe"+PMS|42mjPrL^5:vZk i,wseR 0Wm˪=1T6ו`7&{Њ%2Ze=ӖYTuZ!p^zn6l(b~9T81xT. IDATpQ=8Jvu, d`-J\W碸]mn(tKXC_+l#𚀮"sn|(rf&6E['){jzBrmmPQ>fewe]Yz@J(=Pz@J(=Pz:JîMdhjyQx0Dh/^e`{y._7XG<%^x `9 2X}k__reK_y/ezkء&r7Tؾߵs줓N#G_m6-o|fW O8NտE25y@{_'%d<_R; ?w6;G<*O1`+vu{M6nȪ73~.V;c }?+Msr.v]q6UazыS׾ԾoS /peknO&[ }ܕŲ~mex}[E'ld+}M>@r;2EqWй=`.E)[w؏-Tޮ ǚ]pVHú-ueTx-yYORuE9*>UydߵI\GDUC5*hWO ^_E}`#*UfY,e"WٌFqXLj|+rE"yyD4V-дW/(&8ˀS^E*fVU9l"A+a30u{f,S/RR+H TںMtJ\[Em$=t t`6+[yPn@Ylo%3Жb2x\ Q /9)>-6'7h.ډ\@J(=Pz@J(=Pz/BybFu“@[W:<^Cg!Gx<$S*6EAPC[l6`ә2g-)N7N6Mm>YgS0jn6ߘutfԶ&cH?ɧKMڧ?Yo}< CwG?ܮ Ɠdro\v?'/xm6lXJxfvS._P]uն9E/v{QF NYۗm6i&0P{ ZE ;atj-%٢>PSn%Eۯz{ظ,IAX}bdZ>Kׯu>3>"0YY}.//א@Vb*,| ] zr侠JUR fSRFanNچZ)s~ƺ mPbwVd@Zl8^[ dS9 glE⵷`q]b3 7,ԩ\EKtUU¶jla,+m6*`iXu_UAly-*K!@J(=Pz@J(=Pz˫붺"XFlX&m<+} A7+t 7?l,4/SiKiϽBV oodlbGg3olc:{Ow{O,'ѻ7m8k~sϻc@Ğ_|PgMcx_6C;]wmwi2^QɾXpQhW^>kS@|]߷wۭIF.4vs/ޜNw+b9@*=3[>d?=66ngl>ll?qhjOZZ{&wK%|wɧ]|JXeeR6g!6502@E"c:`GȫŊ d,{yf-C&6ũPc{+ee .{afJ,?ư`rda7dA9WP1[SU%sU1ږW쒒[8~0q\έgJ(=Pz@J(=Pz/VWmee]"*7rr -JM=$RnQ 8|SXF4`Q^ו[(ADE6FX®Fryx]~_;p΁c+GX֐i\]{O-@cQiqϱ'\p%r>T?pӫ/6Oݞu&2Wףi\SQXWZ?b ]~' 7rd}FowϚew`uTqB*r٤=v!kvC}61 E)uP}TUF,|d}lxlY6ks?`/nʭ@c+Oeu G-˚* gE 7o"f 3sg:[+0ֽ1%ԯgz8 MqUuX6`r ZcdbWjDF .W-9<{&Srl+Xն% `mנņY@Xp? \ %+wye]r"G/R`J(=Pz@J(=Pz@_L,ڪl2QgjE&. "Rp?FȐ=>[%/3~ @-@G: HAV0a. AF*YuCeS]ՖjwwO룦L0^Z"k0/Ə¢UP0,V VnW%ֆ>t2dl˫nS /UQ_/$i]c?U絲OXXeu^|Lfkh.ROvbN`a\Ұb5ѭ]HUg_c: Q_`H $ f,kyI|?`3 mn \c*u3pV"oC^, |Z}mDcM-\ ཌmU69Z%ʘjSc $XPh-Q b6Fgηmɻȿs+^%nX2qyY5&GkQWB\rK(=Pz@J(=Pz@=jWVz(Ny`zv(Qp_j u%}sqϨ'wbq LRʖ˲xɯ$cHGw}؋&lw?0TWe^L}g"e*6/2&ju>V~4~;\KŌ0δ[>|{wdaɦv-Xj??ԔX׿$]RS֟W {3opOn"e}.iP_lw&:G@?룊eMة1Pº  ž #?P !1JjU s>Д7ͤʭQjY)S/X+ |RE*kڴvK1 E U@5tfƆ%1Pdr` TV@S,9@Xj< ,Jm[;@`,l[1X^J,[jce+KpnaXb FE;SF<}qWMvɡ;R?˹)=Pz@J(=Pz@J(=큵u[]YTRVB$\a[ŢxnZA}p= e <goݖSk}kºrN ~?PF'xӱ6/}O1M}/OuK]Ͽc5==?(GwS-ֹǭ?Dٌ+YSvggbI}'kv>‹j_`TM}*NҘOd=6x J,|-;Z0d΋kzflgݖ3n'briɡE}*  ϧZɨkeu\5jUgK-Vέ X5@v1i[R\,JSj\ɨkeu\eJ{ Ep$  jKe{Bm4p ϕˆy=ddu((ЀÍgТfEnUS}}dz@ ߾ w䫢vvWr 4E9_2*NP-`6&Z\9&Wfk?ml7tiݢXaS 6Ќ Wkj6)dw\5 =®u@L}U_6DFыRp YA`T \H+J=Q~.1_X1cɪMRYՂYT(xL>KWd{o}>m U9YVX,(?*VmP֖\l@ΫF1̱~GB&TbűkrI|",`㱜GJ(=Pz@J(=Pz@?X[Ye=\&kT.= 2 dZD:ǜezիn0CA9r3سs?o.`kkk\#;kR2(mQ d yX'zuscmFoUnTEf,wkfGz /1y11~-Ǐ_òt)_\]C{?._c\/w?6dHϭ֚:0OYͦ~^SoZJ]fLVÿg0@u2j+kP*- ڬWբE UNngY0IkeenP!l@ me)[Ԫwq (m*ÖcՆ`KidVtkԭ c< /a*6UԏRl+e p8;"9U2oQ钙;]rm^T ȿeL3z`AKVV'[[oJ(=Pz@J(=Pz@X]]uS &]AʦJp킁UEC+vuyY/+NY,kQY*!] ^`rQ0UޙIVgKuqP` :UՠaPYDM%Q!Dck(ƅ}"jD~?~NuuO4]]u<:S빮2wr4v ڭeE*%ؒ۳%( !hށtE惺@ b\+ʏ-/-JP>鐍ʨdS$oDX5 >y.J۶>IJUl.5Y8G_襸#TlЦ \ Ǣ. څ^IFxڄBmٴ"죽>܍)>?}\'e\Ϧ2ԉcyOW*}m 6(a6ىZ.DvreuQVr~'Y%m)T%&6ZlYZmwY7 Qb|J):n\䐵0Dniu^[S`̸GfEQ`då~/q??@` 0 @` 0 G塝7J%ZtQm=G2Qb'Ƃ9qd[!Z!xs)Q--P5Dž =2ǖs +F*\):X0c,Et2֪*ע,-vkB$3\,AG noo` 0 @` 0 {-r('S StFbmv8 {$3MR<<遼BXGS},QUoTC?۹'G/eu{Xחzm3 Y_]σ{E}5k!EG r׺ozG(OM~6Yݺ>*,>n(hKZ~@B&㹲-8o(Sc l%!(8wʞI빰(w9/jU*Z61"rٌcC86*xk Vîԭe_ )Ur 9*JVt!QB"rQ/7E0*0 @` 0 @` 0x4c`|-VbKl25Z7(P`[)WU* Jl;qRKJRH\`duep:6Rm@:j3W#CCRsʒ ,Zk.0mȮM*_rnQɢ%R'W$t߬|. OIƪBB*[Շr„[k֘?zbeÃQ& ZB!eyS:运;Qo[?Gvz`, v U)x}JytBMHӛl­dB+Kd.{y blZYdDzٰRrN08ٲQ_H׶?0K>kCli]ZԷlX\-xZlQzcP,kwؕԯK彥Yc9lrWڴ>VԒP7*NNw朌DvׯPbL~l& )[f\ȡhm::)^~1E Lv-oa +".RB6%YH&6-D2 ${Yй2c懿9Bz/ܒ9z+JHd2klqh~X(vD}dw@` 0 @` 0pbІ%p%z ni]BV-vXΒ=%j$jϊږ7-"!1x8^UFjUQ5N(1""x_9 V"Djh<ۖ4 o3u{v \.c^빨G+P¶㐌~z,WԸ$#Wb+ a=6ރUzγ-͑ʥD 9:/"+i,V2i]  /HBN S&Emq"9HYXzl!M!&!ɩy"@ƙS+"5kȍGAZOɌMv&/dL~-6%.Qfw>;bTRVz-]%+U/ʢ02x{crs 'fš E/ٷߌ3)q5#sN9[HL\D cٌ5#zQK_Ɨ#h+ @` 0 @` 0؈ε0W$[x6r@Z,=yNvg3:{^+k=]yvEٮSwt(Q|)ЕbzBkd5 *P̿H-VZ-VjTs2*!vݲTDQrϯǾRȭR)_MQ?[l?CjNӆ!-h-T֐M3)G?;U}dubQHk֟*(PYэ F"Ce\SdQS,Q6: E}>Yd}2 ]!׊89 $2dWX%NZB"?Euʞ4_rj4uPCѢmո(x!y'vʸ%`O,bZ6Za>9yF-  Ιu E"}9nF.2ܳ~KlŪ*3ާݬ``Pe,|@` 0 @` 0 X,K [v;Wz!{\qɚ;Lry^+)?5\sX[ʜ`0x/Nv Z&{E\eMEep3ǨxֶQ*V)j!(d_*_"=;E(܎2/u-8"Y~]Ưqb Ic^/D*,?R#߮5]Vݚ/--=+[^0'_J_LdsDJQKZlpq"U -ZJ,d kin8VSXlׇN1BQzE22,DFcu(=1``'lzz2 W|˂=.@ʵ*3'=CMv,yR=q-BbO27կrY'CƲy.sQגawL BfΡc95gCmNvml_'aFnN-9*W..m}Lc\\MY`O_y` 0 @` 0 @` 0C[Jl#eYZ*UUY,B :NmݻEBݻW=v8Cy̹^ktQnsd48yuV͔sD~B@e^R(.5Q͈WS~ rWy]maYCNd1T%d5vs1jV{"Z7neOiPCsKe' ?X?rl(Rsb6`mv¨c/ыUh@qm }2\m:B"LC~3w]ubT" 7XWr`V7 o68jl r^ݑj(WX@zsl!s>WDoe 6=MD))9ER枭[EڢX$!e/鐱R⢦E!S}K[ RXdnU=OW0KkAX(oBǗ@` 0 @` 0 @`py`s% !|zDCn[_m2 'V]")o!DgvsQ2BEΖR٨r Ը]ɂjz%}l;2;TQ}pkl= hWFu{RvTgB8)JӮlG>?hM(@Ryu:gCs׳^uiSiO6lG?_d*SU>:)@5~NToWϽxX"W);Vag r I\X^`X$E)LPx}wǖ/X @` 0 @` 0 쏁oB]Y}n vZLTT<CҮJZ"I8g\r{;p5[2+˄@mq[Ab RdP\c}}f/ZYJ=gITi҄!;bk^HFόC֬5E5JkW~omtɾ,Wl?&9s]~z)h߷NB҃z,e 5!_xcAE.j͠Ɨ#lfBFضf>f>+T$_YlVA ;e\`sJ}V䅸T}¸OHXԩp gl!1$w!"qኌT&]qY|KN| e5du,$Z<|lUO%J20x-{8;!*! 奓<|D'( 6G$/ÙvկhN<.{FF}JU? zGɇO۲ hn٥LԏmyAPtA> YUަ"}[pWv rJ! Yss'/,XZ/S^cQ,a>-+BJ!])l # n,$'*>lP*!'1ηc^z;&Ħ?Ї؅xa|?oo> N>_C|}w~-]gB@@>igW_mW^j)DJyB2BqKPe( b<^?؍>UW]ež0 [_XC@m~33y-?u ~_?T7?c` ({~CZ&7p_Ʉ3wAasi66MC\(%vfQ^mJo5N"E!Ld[HRrx6P9V}kFv VƐ,ᵨ1+h!M!}/ QB,'^43Ԇ, 36M(]r!qSC2oleAY3>pv+e(djCf6X )]SZ*7VBf9s:2XXe_~/d{|I @` 0 @` 0 Z ,-g[kJiYI'V(odڕ=˻Xye;b\`exm[ݷjkSOdj5,-ϳ;~}MGl:IYd{G|NǶ:]td6M]JdU)cX?ɚ}?^=sU!$Mj=eAUW~w=v~[NT2dl:h7psc +>֭ W`CU7C OrH S%uaԏwꞬte2:1 qFu7DY Xkql€k?~V~ hGAJ}zC2X%,=Ƈ#[$giѳ*/-ӜBug™ WRk]u6Lmm<&_я7M'6dbo|_YD)6UOKBNFbnƣ'}YϞm<^~zO_e'|2!3 LyGo}w}D =Dzʲ'XU[օo76hi c٩Ol%1492ҕ0jW;BNMQT -!ٯ[,X>2SgQw47m}Wed$+Vf-mAŐ~%lB+-g[TR] 8f5.Vo]]y+2(Ss$F۩ Vl/8έ;a l74$$0 @` 0 @` 0Xm[R6G+-D[" IDATq-qkA|8$8~!?R% ^[E^W^WG-Ej&6M7ٱcfw6O__W]*Lƶo2JjY4~lN}/g Y G}qQ+5ʧuXjTNw$F!K}Ҷ_HyHhۑR8HQԬr&4\~(nҙ6J YllF>m2 -ık}jPBC2,JߢD ?+[XUwJ˳ bb\0E<@` 0 @` 0 lbPpJ,>y}'V.29r\Ư?Vgsյ]뭨 WAآ4h:]P{x<]O߭miRb3\_Y+gm<h:_٭Mx)'گ~W6UXp0zӯ?^ ?i?bgld 2{;m:q8n۳'d;3f~9v٥y~O9e=إ̞yy':8_Hܲk':xݻT:R1'jg<]{T}$Uy[gye?"lsdVt-p:DleYߪ?oJʿc#WljqbTWfGshCJ).6E.06?;q"yO)ֿILv+XCL\2`s4o"!=!R|.jM\}K=O^O$=y%CB[IKnmuWʰoƊ5ꋔmCu8?pU[C!c"\YrZqldlI&o-b9QdL6ꗹ-+L*`qVƪ1QdA(p#A/17@` 0 @` 0 G[ [%QrI-oyZMb,S`*oChݪwmgiO8${篷38,}Q-O6`=Njڞ[_g0^iM&WH+^jY&c{ʓϔBm.њٳyng;?<VSvl!UD]F}[cOsnkNFv-e;{lM-E6Zodi7MkR@·K/F1-k:4n<_wmVv0w7֫v~jb+Ooڪnk-4R n=CPmg>jp򎏌2wd|KωYn?lg;QRe}C}oc}?[?I} q=hXOm}ԴجW.~!E}FR2780T|V)z} nkR΁Ye>ZlĐ3Iy*N(]@- i>{&,*+!\K[HVQݢ\FŶU ܬ6栂@E {PVn\Զ;zyX:H^[Hmyeq2K+ҪֿRʐ)\r`\4Xvz$}@` 0 @` 0 p`KQa5rFHLd(E[b=):;r,Q7UXf4f#_!"r?6I,DQEeiO;~}6sY 7V:ۋ^(ŚT=O}}6?A93Ԭ$:8re8BHM|&צ9lDؖBsd޺e2̤BE !a-j[sq˂dy.Ri{0Rfu?{A. rz/1717@` 0 @` 0 G;KCQbl2Q5$3Yvpzx Dv5~ V5 CP`=D-wکv9ۮ*FLV/vnoczl2t4={>H;O8AddlOxϏkJ^skx]v]ddzguPI9ꗨX])"oԟNV@Ǻv%3RNbIB.s~/K^b;IOO~?F}of_Wmq0v>VWK^g}?_wmd5~"};Qȟa_ENQ?b?G)2"yNco&^9Gi(Kg$N]6WY닄s[VEQzϭ!J3)ʆmimvua*el7&2Lo)^!yQbcAU1ydҒ@W[U)yrR U}9X[cgGY2.JZH`I uWP63j\t'2pʖw; v|&,@` 0 @` 0 G Ec=n{K<;M-3 >mvncoJģM֥,c> +y{y(IA߾٦Hvj_vDUG rokؾկHl_zK}}g?Dھ_ ?ɺ5 D*;1-aHcٛU&S;eשʗ㏳Ne:vvezڽێ{cuԿҗ/}g,7`.?܁՛lo7wlDɳ(^ڳ("y2g~gM[O_i]TX6}~m%-D.Ϗ_׿\)9^$X?ߣ{!ͶA]2c!c[ 6l{}wDaNO瘎w,~y'?+RTlU_6ѩPҴ'BhyQ?IԷx)Ij%TQb#:YS]{"W-5y[x<;k\rTUe6ʽ\6W?Fc?׿lCVSoxyeeۉks;vUv v->GO~\D3I=2@jnFcɧb TpCh1Vs_Ζ91TYAhf)>Q]/Bi<5%Ws?HLD]A);e깫pEyAT֞'[mCT?2̪DV"sݮZ'38s<ժy@⪐T,QVg ֕ՇT(EZuSFaCJ[ZuY\Lr-+i`7~c X%C>guJ";v˕l90jގ"K ܰP n` 0 @` 0 @`(`hK9yp/(RFNWG K΢11'3G!J x JH:gue]2tqn{߶x~ӟq;3c5<h:[?|resf#{+/W'|=ϴg\p]|Kldlo{;UKeuL3>K=($*wubkXLNG6? ӧ?c~uVZU[l+Ӊ}߾hԇ$iPl\Ac'գQwB":Hr m!_|e/ކ=ZBI}Լԇl3WΛ*'iɼz٪~czO T2_.|*&ss!FbZk1 zYⵖ5e,ԯ|ƭsT) 4=E9(V!CIpa֝xz0y )mA}gPcΐkw[&V+_X/-sL}q3x~Is[SZ{hyO8s8Ɔ%I/GF@` 0 @` 0 GC{x[đ20QwTZ9 2CVVR:r9 Ic1'dU Y@gYsGl4<쪫}U#K/7b?ϰ骍Gc{,.T6&6ٳ%vicz:>?yӧ옝>&o27X6[g媿6׿%dz_3i]r xdO9l)P)32WnklN5zoUX7nUTl>ĴTXCYn^N)oɋP}9ㆨV^ St3,sXUKg\[FYvɪ\x YZgն(uK'_!!K랙 YLm"S֭U&p7/md.-nW<긞@` 0 @` 0 0Hݰ/bCFԉ(jT;bS*%eyT^{T{=v52eR;~HJk^:ɏoG'$P2gۉL|9g]L_v 6Od=?z}Klsm4ZmuY3|G^b=#Y;Jws}ѽ+:YVVlfosL+j>ꙴG'K\2e"gpK;f;?ϭnE ;mu4(pQ :a6_߮N;2Yǿc~o n]o7 ??ڷ:GMڮ?dOr6pfK.!e9  ʺ?Ft9vie+@,lTtda I)NJ[X(]C.eEjmiQɊde ]w, 6ɕAB>V/P\ŬJz8KEK0vre-5sGgrk:l@!`ia;>j@` 0 @` 0 Qoݤ"*-=Am"l_1[|+vtg'V _~%~NEmDp %j-asѦ㩍ƫv?O޵Y8#WwXGFf&eF5v,wM1Ym>o[՟NW~tWߦG>I{ ˘eN359dv3\nGruƙ)ߘnLG̼R2lq1,KQ%@'Y @` 0 @` 0@,-۠?&( WY`J<a|Y1.>~H?sl~{lՉ7Ӟt;clS;VWtfѪ=)gZQEhYgW&k6M_^q>c[oֹ_}7=+*Q`eMg3V|KvƓhWH;׉@9~N>n7n_U`OVmbՉ$oqEFa Wqe(kgNJv>2즩9`LbP&r@-[-xްl.3눈^?ef(eEI5\y^xVV "E{ م 9b:0C2oYV{}HbC - m q @` 0 @` 0 >á2PHa;Ge0>j0+C#G`b"^z%vwd2h,}MV 2smrݷrW+G*QATdmv?$qebњM+vt\o-;1n9/z )_(kT5g,׿ƓU[sMǟ) ,;/oHdRgy g*/{>y@ֿdGv}*n_$ Ui?gɜT?+6֩?__ЦockIY5SCZ O~:6ȯݮOPkQXC+k>H?dDfBLb7G:_?dr^N]M HuJFvʲaN'_P}d.hM"rʿ R^3SEm\#>QʲDY\_*^v\SHv{fTrHqQ~]M[䨋ya\ئсsΧHhdR?ҌGt) Ap%x29ۙLB` 0 @` 0 @`0o(ozF]ge&I=%uYes(ps+Eѽ29mj7v޳!{6#yr+czڻ}wϽʺWle2^7OS)VoY-uif Nq=ﲻVW W? {qO9{{e[WPOdW<7u7ۅ{/Ҙ7׿[o>N5?ٳ{}WݏAjDǛW߼EYm}Tw[۹nKF~:"oSA~V5BtN<՚SvGgZ ^["MCEk+;Y!)QBVR~>`ӺFFm3$qy~C+6DdnY̬OVgei\*b9C5r5)5\J[/X92]YB93F%cܱcF L}x;)vC"RhVuU)V9"ͮҭ>$ΰP mq)0b$yl @` 0 @` 080wi9|d"6dV}EeMRԏŒWA.>s嗿vc#BR:'2⁽+!sO>D;9ϳ /ОNyHO},!/Ƅ8~]vIX'7od1cvga^zKO^~]A+u[sO:N?vO??iG+v֓0Z??a|s cQ [b"T￐(MBS6̨LR溅2Q6fx~l5 /,R4?a3~96 ^~*EM[Yr~Y}Y*o٫] )s%V'okdujV}Tk>(8? u/k5=7RYX0ʺY$gʗO'Ja!o5o|?k,Q]o[ ťp8 @` 0 @` 0 <X lyo6uiMXa}XZVW`Ո⳪Rm")eAVCnwyl+5O؀b-\\bSa2{Lć7G{g=RL&/tOŸq6N\+q hd镬?lLyHCp[h'cI K-gjUR֭>IJVXWXW]_Q0˪X2ĵ5H*Ms|Q~- լ~nYOsj26>o/ eDƏgGќpi By; v|&T@` 0 @` 0 Ȣ*Rʩ+&Y~Y)FRb;l%+ :{׊]ܳhdB-&͇0brDؕrxٱBUuGyjgYz\G>?ZyMm<`i)?_I#RJQ)_S+SSCEY4YsgB–&zW0\تϺm+>JSèneMXbs\X/deqz BN•~erKeԱXpM!Nᕊc>#{ӕrU'g9ẹ}Nb\fs>\U_vʌ _D?[,>o/G؍F99 @` 0 @`H`2N!7֊<-NBEZj:d,qڮ G9C2L]{.{i+keJEʰ5(?m:xFU{^_CI_URa!EMnןbnC:++KT5}r_$n;~3^^H*bc]pƱQ-e.0jǯWirom6eC| qPNgYfX-3R2~Y,CgR\D\Pg- ZT%,; 29ۙLB` 0 @` 0 @`0ԣdRJ KiT jҼQ~_Uc9N9Ůu׈}4(q9GH[5خ';8e cq )ZWh.jWͯ? TuBclmoYX#x>Q b9SXު>z}>9[w;dWJ5[vT~AwZms}!. TE-*[w5kQ¦l"XhT"kP?,!!V.'#saCrqHa:rz/[pі_cC00 @` 0 @` 0c`?~Q$"uWXaEyMZ*x-g<(. ;S /+Rć3{WEOy!QV8#e:!!# xU5j1HC1Q?_)"Cjn7+mT,!z3!%bRjX_N%a5YR}!(6IɻC^m/iGY *d\:.غĸ&Kw1>W0$MERr3˒rsdnq^rTW/} .oC2)s[R8Ǣ9] A72p`gB @` 0 @` 08J0g84T˃c&9efԏrs?Kk H*WY'r+? "sc?L,G P9[U?Qu í,*d_.!l9ώe:Ƃa'5~g B훕QMTu8ԸҲ@&[fgͬ˃|I!uY7/4Ԉ1laz(oEM`ĺڒ 1H'aeGvϊOeDƻ W)+eLros˒u=HRc \@` 0 @` 0 * K6-% !,hQ֩k kOuڪ%&ȅUeڣͥ;~J*P]9cqEy/o/UjVV"SɈD iˆ_V-"XFY}尮?ԡ: Ųws}$ܿ>Vl~-KYJFo6$ATCR_EJ>B&u,v>F$0VT>X1'e+\eѲ>뵝>k/ɛTuePV-3Toʆ%WqE2r)OWcqhN/l' @` 0 @` 0p$b?\p<2 )42=qIna*Mɮke2\EDCԐX~jq0R0a\ƊXoS_T_6b yHO+P.Tnkϥz[~-)YߪZ<YB&RgvRMϬ~n 4G~ YϹBʱuQ#3~9xX QcA z6XUC2*|>lZ]+C9zJMm'p!ySdn_e"y'kG=K{l1R}$~1@` 0 @` 0 E[\"B!Dj^W#,,y0]XD"wQymmYCilQ^ОCj_R);nEcH__rʱn5k2Ź'_r5z9(*eYL"YStZ#oU"dND|},|]ܿg'Y> AEXk[]HZmbT&.XvXLs-|%dGlfl@昍QewNsZ5 |E}W3n"yXCbP._՗8N`)0 @` 0 @` 0pxc`4ҲO9b[޹%pߓ͢y8 >U63xM2X.`Viv=7鸝-},?Υ_HE>=5g?Dz|糐|m},3` 7踳I)%+s!Q5jCNkI,Y?d&diN'5\)rVw}zЦ)?%/DjGwRrU[z\sgιVu%6{e6n#HJjcs4Xť=A r\>@` 0 @` 0 O PF(;`FgDA[]L\Ζ-&'^׮ kW\q{=E-56EWƉxn"@?*N\2+ϸ:ʬ-!kU> IDATyAy V39] m²YNe i6~Ώ룬V,O2k>\i :RvdtFךERg l17j@` 0 @` 0 w ,[i`%9}bA Q+y0L_c Z\TB\<=4^,5\sX[ʜ3wHXPSF0QqъdYO Ef퉱8v7]6l’>m˓JQm7`ևؤA溽.kׇC xxGe`…h3P,o?hQ'e+d*D+j.{kQ?X3\Uneo*4OX|(j__Gճnju[e91Җ{li b_OL` 0 @` 0; %g;sѫGl T"=Tz,0c0a}pqf%vdbVd3ux 2|>tx/ZY3[m RU7&(fC~,QZ Tl(w?Ғd! g@}>P N"kQfQVN YCx&P2敧]q͙EJجrdJY9ʶ\@uFUG6Jbw޻ƀ1` ƀ1` ƀ1` ƀ1` ׎u]b({jIYK^#%MWF8ծyn*,-_ǚQbCb-Mf ( GPfXC\hd#*?oaL%Ől=U6̟Ҕ56!A`k֛bQbK*64I/I`_VҘ9;E~Z2_eNz)d{hf] ;u|xG(E_j$BEzEz?<@gV};I%,ߴ%6;[{y ⒁;~s 3IENDB`python-asciimatics-1.15.0/doc/source/modules.rst000066400000000000000000000001061511423144500216520ustar00rootroot00000000000000asciimatics =========== .. toctree:: :maxdepth: 4 asciimatics python-asciimatics-1.15.0/doc/source/rendering.rst000066400000000000000000000116701511423144500221670ustar00rootroot00000000000000Advanced Output =============== Rendering --------- When you want to create an animation, you typically need a sequence of multi-coloured text images to create the desired effect. This is where a :py:obj:`.Renderer` object comes into play. A Renderer is simply an object that will return one or more text strings and associated colour maps in a format that is suitable for display using the :py:meth:`~Screen.paint` method. This collation of text string and colour map is referred to as the rendered text. It might vary in complexity from a single, monochrome string through to many frames from an ASCII rendition of a colour video or animated GIF. All renderers must implement the API of the abstract :py:obj:`.Renderer` class, however there are 2 basic variants. 1. The :py:obj:`.StaticRenderer` creates pre-rendered sequences of rendered text. They are usually initialized with some static content that can be calculated entirely in advance. For example: .. code-block:: python # Pre-render ASCIIMATICS using the big Figlet font renderer = FigletText("ASCIIMATICS", font='big') 2. The :py:obj:`.DynamicRenderer` creates the rendered text on demand. They are typically dependent on the state of the program or the Screen when rendered. For example: .. code-block:: python # Render a bar chart with random bars formed of equals signs. def fn(): return randint(0, 40) renderer = BarChart(10, 40, [fn, fn], char='=') Once you have a Renderer you can extract the next text to be displayed by calling :py:meth:`~asciimatics.renderers.Renderer.rendered_text`. This will cycle round the static rendered text sequentially or just create the new dynamic rendered text and return it (for use in the Screen paint method). Generally speaking, rather than doing this directly with the Screen, you will typically want to use an Effect to handle this. See :ref:`animation-ref` for more details. There are many built-in renderers provided by asciimatics. The following section gives you a quick run through of each one by area. For more examples of Renderers, see the asciimatics samples folder. Image to ASCII ~~~~~~~~~~~~~~ Asciimatics provides 2 ways to convert image files (e.g. JPEGs, GIFs, etc) into a text equivalent: * :py:obj:`.ImageFile` - converts the image to grey-scale text. * :py:obj:`.ColourImageFile` - converts the image to full colour text (using all the screen's palette). Both support animated GIFs and will cycle through each image when drawn. Animated objects ~~~~~~~~~~~~~~~~ Asciimatics provides the following renderers for more complex animation effects. * :py:obj:`.BarChart` - draws a horizontal bar chart for a set of data (that may be dynamic in nature). * :py:obj:`.Fire` - simulates a burning fire. * :py:obj:`.Plasma` - simulates an animated "plasma" (think lava lamp in 2-D). * :py:obj:`.Kaleidoscope` - simulates a 2 mirror kaleidoscope. Text/colour manipulation ~~~~~~~~~~~~~~~~~~~~~~~~ The following renderers provide some simple text and colour manipulation. * :py:obj:`.FigletText` - draws large FIGlet text * :py:obj:`.Rainbow` - recolours the specified Renderer in as a Rainbow * :py:obj:`.RotatedDuplicate` - creates a rotated duplicate of the specified Renderer. Boxes ~~~~~ The following renderers provide some simple boxes and boxed text. * :py:obj:`.Box` - draws a simple box. * :py:obj:`.SpeechBubble` - draws a speech bubble around some specified text. Static colour codes ------------------- When creating static rendered output, it can be helpful to define your colours inline with the rest of your text. The :py:obj:`.StaticRenderer` class supports this through the ${n1,n2,n3} escape sequence, where `n*` are digits. Formally this sequence is defined an escape sequence ${c,a,b} which changes the current colour tuple to be foreground colour 'c', attribute 'a' and background colour 'b' (using the values of the Screen COLOUR and ATTR constants). The attribute and background fields are optional. These tuples create a colour map (for input into :py:meth:`~Screen.paint`) and so the colours will reset to the defaults passed into `paint()` at the start of each line. For example, this code will produce a simple Xmas tree with coloured baubles when rendered (using green as the default colour). .. code-block:: python StaticRenderer(images=[r""" ${3,1}* / \ /${1}o${2} \ /_ _\ / \${4}b / \ / ${1}o${2} \ /__ __\ ${1}d${2} / ${4}o${2} \ / \ / ${4}o ${1}o${2}.\ /___________\ ${3}||| ${3}||| """]) Experimental ------------ A Renderer can also return a plain text string representation of the next rendered text image. This means they can be used outside of a Screen. For example: .. code-block:: python # Print a bar chart with random bars formed of equals signs. def fn(): return randint(0, 40) renderer = BarChart(10, 40, [fn, fn], char='=') print(renderer) python-asciimatics-1.15.0/doc/source/troubleshooting.rst000066400000000000000000000447621511423144500234510ustar00rootroot00000000000000Troubleshooting =============== Installation issues ------------------- Android ^^^^^^^ To run on Android, you need access to a CLI environment. I've found that https://termux.com does the trick, but you need to install some extra packages before you can install asciimatics. After installing termux, start up the app and run the following commands: .. code-block:: bash apt update   apt-get install clang python-dev libjpeg-turbo-dev LDFLAGS=-L/system/lib pip install Pillow pip install asciimatics Linux ^^^^^ Although asciimatics is a pure python implementation, it depends on Pillow (a fork of the Python Imaging Library). This package depends on some native libraries that must be installed first. For details of what libraries you need, see `the Pillow documentation `__. For a list of possible solutions, see the `answer on Stackoverflow `__. In short, either install the native libraries you need, or force an installation of an older version (2.9.0) of Pillow. My application only runs on Windows ----------------------------------- Given that your application runs on Windows, but not any curses-based solution (i.e. Mac or Linux), the fundamental logic in your code is right. It might be a bug in asciimatics, but it could also be a bug in your system installation. Curses-based systems date back to an era when people connected to a computer via dumb terminals. Each terminal needed different control character sequences to tell it what to do. These differences are handled by curses, which picks the right definition based on your `TERM` environment variable. If you have the wrong terminal definition, you may find that curses believes some fundamental services are unavailable to your application. In particular, if you use ``xterm-color``, you are using a definition of xterm that dates back to 1996 and will see errors like this, where the critical point is that a curses function returned an unexpected error (the "ERR" result). .. code-block:: bash Traceback (most recent call last): File "demo.py", line 18, in Screen.wrapper(demo) File "./lib/python3.6/site-packages/asciimatics/screen.py", line 1162, in wrapper unicode_aware=unicode_aware) File "./lib/python3.6/site-packages/asciimatics/screen.py", line 1131, in open unicode_aware=unicode_aware) File "./lib/python3.6/site-packages/asciimatics/screen.py", line 2001, in __init__ curses.curs_set(0) _curses.error: curs_set() returned ERR The fix is to use a more modern terminal definition like ``xterm`` or ``xterm-256color``. 256 colours not working ----------------------- By default a lot of terminals will only support 8/16 colours. Windows users are limited to just these options for a native Windows console. However other systems can enable extra colours by picking a terminal that supports the extended colour palettes. For details of which terminals support additional colours and how to enable them see `this Wikipedia article `_. In most cases, simply selecting a terminal type of ``xterm-256color`` will usually do the trick these days. My colours are wrong -------------------- When picking colours you may find that your selection doesn't have the desired effect. This is because terminals have a nasty habit of using different definitions of the standard colours. Asciimatics relies on the ANSI colour set for its standard settings. As you can see `here `__ each terminal has its own interpretation of the exact colour. However, you can usually tweak that in your terminal settings. For example, iTerm on Mac uses a dark grey for black, which you can change as shown below. .. image:: mac_settings.png :alt: Screen shot of iTerm settings The color theme resets when I resize the terminal ------------------------------------------------- There was a bug where asciimatics would not maintain its own colour themes on resize. This has been fixed as of early 2020. You should just upgrade to the latest version to fix this. However, there are also some other applications that change the terminal colour scheme on startup using the terminal's control sequences. These will not be invoked by asciimatics on a resize event. If you use such an application, you will need to invoke the control sequences yourself. For example, to re-apply a `pywal `__ color theme: .. code-block:: python from pathlib import Path from asciimatics.screen import ManagedScreen with ManagedScreen() as screen: # do stuff if screen.has_resized(): wal_sequences = Path.home() / ".cache" / "wal" / "sequences" try: with wal_sequences.open("rb") as fd: contents = fd.read() sys.stdout.buffer.write(contents) except Exception: pass .. _mouse-issues-ref: Mouse support not working ------------------------- Curses systems ^^^^^^^^^^^^^^ Mouse support isn't fully enabled by default on all terminal types. This will often require some extra extensions to be enabled as described `here `__. In addition, if you want 256 colours, you will need to mix modes as described `here `__. Although it is possible to get Linux terminals to report all mouse movement, the reporting of mouse buttons along with movement appears to be highly erratic. The best reporting appears to be using the button event mode - i.e. mixing ``xterm-1002`` with ``xterm-256color``. Windows ^^^^^^^ Asciimatics will reprogram the Windows console to report mouse events on start-up. However, it is possible to change this while the application is running. In particular, if you switch on QuickEdit mode, Windows will stop reporting mouse events and process them itself. It is not possible to have both, so if you want to use the mouse in your app, please switch off QuickEdit mode. Windows title does not change ----------------------------- Much like mouse support, the commands to set the window title is not supported on all terminal types. Windows should work without any changes. Other systems may need to use a similar method as above to mix modes to add status line support as described `here `_. Why can't I detect all key combinations? ---------------------------------------- Asciimatics is designed to run in terminals. These date back decades and so have many restrictions that were perfectly reasonable back then, but seem incomprehensible these days. The biggest one by a long way is that they can't detect exactly what the user types, even though computers have been able to detect exactly which key is being pressed (and when it is released) for a very long time. The fundamental reason for this limitation is that there is no standard for the terminal emulators to tell the application more than a limited set of keys (typically lower and upper case characters, a random smattering of special keys and then some basic control/shift modifiers). While some terminals do try to do a little better, the coverage is patchy and inconsistent. Until this improves the only way to get this sort of information is to run a system-wide keyboard hook, using something the the `keyboard` package on pypi. Unfortunately, this requires that you run as root and will not work on remote terminal sessions (e.g. over an SSH connection). For more details, you can read https://invisible-island.net/ncurses/ncurses.faq.html#modified_keys or https://blog.robertelder.org/detect-keyup-event-linux-terminal/. .. _ctrl-s-issues-ref: Ctrl+S does not work -------------------- In order to maintain legacy support for real terminal systems, most terminals/consoles still support software flow control using Ctrl+S/Ctrl+Q. You can switch this off on Linux by typing ``stty -ixon`` in your shell before you start asciimatics as explained `here `__. Sadly, there is nothing that can be done on Windows to prevent this as it is built in to the operating system, so you will never be able to detect the Ctrl+S key. See `here `__ for details. Backspace or delete are not working ----------------------------------- Some users have reported this on curses systems.  So far this has been tracked down to issues with the terminal configuration.  For an in-depth explanation of the problem and several possible solutions see `here `__ and `here `__. This seems to be particularly problematic for Mac OS X users, where the default terminal app as shipped with the OS doesn't match the terminfo definitions. Genius! If you're on OSX, running the following inside your terminal *should* fix up the mismatch. .. code-block:: bash infocmp "$TERM" | sed -Ee 's/(kbs)=[^,]*/\1=\\177/' -e 's/(kdch1)=[^,]*/\1=\\E[3~/' > "$TERM" tic "$TERM" rm -f "$TERM" In an attempt to minimize the number of affected platforms, asciimatics v1.9.0 and later will also check the OS terminal definitions for ERASE and use that for backspace if it differs from the curses terminal definition. There's a big delay when I press Escape --------------------------------------- This is a well-known default operation for ncurses. As documented `here `__ you need to set the `ESCDELAY` environment variable before opening the Screen so that ncurses uses a shorter delay. I can't run it inside PyCharm or other IDEs ------------------------------------------- Depending on which version you're using, you may see pywintypes.error 6 (ERROR_INVALID_HANDLE), or simply nothing (i.e. it looks like the program has hung). The reason for this is that the IDE Terminal/Console is not a true native terminal/console and so the native interfaces used by asciimatics will not work. There are 2 workarounds. 1. PyCharm, both Professional and Community editions, now offers an option to emulate console output directly in PyCharm. To enable this functionality, see *Run | Edit Configurations | Configuration | Execution | Emulate terminal in output console*. 2. Alternatively, you can just run asciimatics inside a real terminal or window - i.e. not inside PyCharm/the IDE. For example, you can force a real console from the Terminal window using `start cmd /c "python "`. It runs differently/does not work inside PyCharm ------------------------------------------------- While PyCharm's terminal support is constantly improving, it is not perfect and so there are still cases where the imperfections cause glitches in asciimatics applications. This is most common on Windows (e.g. unexpected keys detected on resizing), but it is not just a Windows issue. If you hit such glitches, the first thing to do is check whether you can also see them on a native terminal/console window of your operating system. If you can't reproduce on the native terminal/console, you need to raise the bug with JetBrains. .. _unicode-issues-ref: Unicode characters are not working ---------------------------------- Curses systems ^^^^^^^^^^^^^^ Most modern versions of Linux/OSX come with a good selection of glyphs supported as standard. The most likely issue is that you are not using a UTF-8 locale. To set this up, follow the instructions `here `__ for OSX or `here `__ for Linux. If that doesn't solve the problem and you are seeing unexpected lines in your block drawing characters, you are using a Terminal with extra spacing between your lines. OSX allows you to edit the spacing as explained `here `__, but Linux users will probably need to install a different terminal as explained `here `__. I have found that `rxvt-unicode-256color` is most likely to work. Windows ^^^^^^^ On Windows systems, there are a couple of potential issues. The first is that you might be using the wrong code page. Windows comes with `many `__ code pages. By default, asciimatics will only enable unicode features if you are using code page 65001 (the UTF-8 code page). You can fix this issue by running:: chcp 65001 If this does not solve the issue, the next possibility is that you may be using the Lucida Console or Consolas fonts. These do not have a full enough range of glyphs to support all the unicode output that asciimatics can generate. To fix this issue, you need to download a font with a wider range of glyphs and then install them as the default for your command prompt. Details of how to do that are available `here `__. I recommend that you use the `DejaVu Mono font `__, which you can extract from the ZIP file from the `download page `__ - it is DejaVuSansMono.ttf in the TTF folder of the ZIP. Redirecting STDIN ----------------- Generally speaking, it is not recommended that you try to do this as it will prevent asciimatics from being able to read the terminal input. However, if you must do this, `this question `__ on StackOverflow should give you some help on how to reconnect terminal input on curses based systems. It's just not working at all ---------------------------- Some people have reported truly strange issues where things simply don't start up at all. Symptoms vary wildly from blank screens to other applications or tests running instead. If you are hitting something like this with versions less than 1.14, check that you haven't created a file called ``test.py`` in your project. This is because the ``future`` package, which asciimatics uses for compatibility with Python 2 and 3, imports the test package. If you happen to have a file called ``test.py`` in your project, this import could pick up your file instead of the built-in package. Shout out to Andrew Penniman for spotting and solving this one! It's too slow! -------------- When people say this, they either mean that asciimatics is using too much CPU, or that it is unresponsive in some scenario. Either way, the solution is to reduce the work being done behind the scenes for your application. At a high-level you have 3 options. 1. Switch off any animations you don't need. 2. Move to a more responsive input loop. 3. Use a faster implementation of the underlying infrastructure. Lets look at these options in more detail... Switch off animations ^^^^^^^^^^^^^^^^^^^^^ The key to this optimization is to understand what you're drawing when. The biggest cost in the mainline loop is the actual re-drawing of all the content to the double-buffers, so asciimatics only does this when it knows something has, or may have, changed. You give hints to asciimatics as you construct your application - for example the rate at which a ``Print`` Effect needs to redraw, or whether you want to minimize CPU usage inside a ``Frame``. It then uses these hints and the current application state to decide whether to draw a new frame into the double-buffer. The first thing to look at is things that are not actually changing. For example if you use the ``Print`` Effect to display a static piece of text (like a ``FigletText`` renderer), the output never changes and so you only need to draw it once. in such cases, you should tell the Effect that it is pointless to refresh by specifying ``speed=0`` on construction. Next you should consider removing unnecessary Effects. This is only really an option for TUI systems. Simply avoid adding other ``Effects`` into your ``Scene`` and keep it down the to the ``Frame`` for your user input. Finally, consider switching off the cursor animation if you really need to minimize CPU usage. You can do this by setting ``reduce_cpu=True`` when constructing your ``Frame``. Input responsiveness ^^^^^^^^^^^^^^^^^^^^ First things first, you should make sure that you're running at least version 1.11. Once you have that installed, you can use the ``allow_int`` option in :py:meth:`.play` to permit mouse and keyboard input to interrupt the normal frame refresh rate. This should prevent users from seeing any delay in refreshes when they press a key. However there is a downside to this option - it will slightly mess up the timings for any animations, so it is only recommended to use it in TUI applications. Use faster infrastructure ^^^^^^^^^^^^^^^^^^^^^^^^^ Asciimatics needs to do a lot of array manipulation in order to provide equivalent features to ncurses. In v1.11, I benchmarked various options and optimized the buffering to use the fastest version. If you haven't already moved to that version (or later), please do that now. From here you have the usual options to speed up such calculations further. 1. Use ``numpy`` - which is a native C package to optimize array calculations 2. Use ``pypy`` - which is an optimized version of the Python language. Right now, asciimatics doesn't support ``numpy``, because I only got marginal gains when I made the prototype for 1.11. However, I got significant improvements from ``pypy`` and so I'd definitely recommend considering this option. For example, running some samples for 20s on my test machine, I got the following results: ==================== =========== julia.py Average CPU ==================== =========== Python 2.7 (1.10) 54.8% Python 2.7 (1.11) 47.8% Pypy 6.0 20.0% ==================== =========== ==================== =========== experimental.py Average CPU ==================== =========== Python 2.7 (1.10) 100.0% Python 2.7 (1.11) 71.4% Pypy 6.0 34.3% ==================== =========== Note that the v1.10 test for experimental.py was actually CPU-bound and so slow it was visibly juddering. python-asciimatics-1.15.0/doc/source/widgets.rst000066400000000000000000001263071511423144500216640ustar00rootroot00000000000000User Interfaces =============== Introduction ------------ Asciimatics provides a `widgets` sub-package that allows you to create interactive text user interfaces. At its heart, the logic is quite simple, reusing concepts from standard web and desktop GUI frameworks. 1. The basic building block for your text UI is a `Widget`. There is a set of standard ones provided by asciimatics, but you can create a custom set if needed. The basic set has strong parallels with simple web input forms - e.g. buttons, check boxes, etc. 2. The `Widgets` need to be arranged on the `Screen` and rearranged whenever it is resized. The `Layout` class handles this for you. You just need to add your `Widgets` to one. 3. You then need to display the `Layouts`. To do this, you must add them to a `Frame`. This class is an `Effect` and so can be used in any `Scene` alongside any other `Effect`. The `Frame` will draw any parts of the `Layouts` it contains that are visible within its boundaries. The net result is that it begins to look a bit like a window in GUI frameworks. And that's it! You can set various callbacks to get triggered when key events occur - e.g. changes to values, buttons get clicked, etc. - and use these to trigger your application processing. For an example, see the contact_list.py sample provided - which will look a bit like this: .. image:: contacts.png :alt: Screen shot of the contacts list sample Common keys ~~~~~~~~~~~ When navigating around a Frame, you can normally use the following keys. =================== ============================================================================== Key Action =================== ============================================================================== Tab Move to the next Widget in the Frame Backtab (shift+tab) Move to the previous Widget in the Frame Up arrow Move to the nearest Widget above the current focus. Down arrow Move to the nearest Widget below the current focus. Left arrow Move to the nearest Widget to the left of the current focus. Right arrow Move to the nearest Widget to the right of the current focus. Space or Return Select the current Widget - e.g. click a Button, or pop-up a list of options. =================== ============================================================================== .. warning:: Please note that asciimatics will not allow you to navigate to a disabled widget. Instead it will select the next enabled widget when traversing the Frame. However, some widgets (e.g. text editing widgets) have their own logic for handling the cursor key actions, which override the common navigation. In such cases, tab/backtab will still navigate out of the Widgets. In addition you can also use the following extra keys inside text editing widgets. =================== ========================================================== Key Action =================== ========================================================== Home/End Move to the start/end of the current line. Delete Delete the character under the cursor. Backspace Delete the character before the cursor. =================== ========================================================== Model/View Design ----------------- Before we jump into exactly what all the objects are and what they do for you, it is important to understand how you must put them together to make the best use of them. The underlying Screen/Scene/Effect design of asciimatics means that objects regularly get thrown away and recreated - especially when the Screen is resized. It is therefore vital to separate your data model from your code to display it on the screen. This split is often (wrongly) termed the `MVC `__ model, but a more accurate description is `Separated Presentation `__. No matter what term you use, the concept is easy: use a separate class to handle your persistent data storage. In more concrete terms, let's have a closer look at the contact_list sample. This consists of 3 basic classes: 1. `ContactModel`: This is the model. It stores simple contact details in a sqlite in-memory database and provides a simple create/read/update/delete interface to manipulate any contact. Note that you don't have to be this heavy-weight with the data storage; a simple class to wrap a list of dictionaries would also suffice - but doesn't look as professional for a demo! .. container:: toggle .. container:: header **Show/hide code** .. code-block:: python class ContactModel(): def __init__(self): # Create a database in RAM self._db = sqlite3.connect(':memory:') self._db.row_factory = sqlite3.Row # Create the basic contact table. self._db.cursor().execute(''' CREATE TABLE contacts( id INTEGER PRIMARY KEY, name TEXT, phone TEXT, address TEXT, email TEXT, notes TEXT) ''') self._db.commit() # Current contact when editing. self.current_id = None def add(self, contact): self._db.cursor().execute(''' INSERT INTO contacts(name, phone, address, email, notes) VALUES(:name, :phone, :address, :email, :notes)''', contact) self._db.commit() def get_summary(self): return self._db.cursor().execute( "SELECT name, id from contacts").fetchall() def get_contact(self, contact_id): return self._db.cursor().execute( "SELECT * from contacts where id=?", str(contact_id)).fetchone() def get_current_contact(self): if self.current_id is None: return {"name": "", "address": "", "phone": "", "email": "", "notes": ""} else: return self.get_contact(self.current_id) def update_current_contact(self, details): if self.current_id is None: self.add(details) else: self._db.cursor().execute(''' UPDATE contacts SET name=:name, phone=:phone, address=:address, email=:email, notes=:notes WHERE id=:id''', details) self._db.commit() def delete_contact(self, contact_id): self._db.cursor().execute(''' DELETE FROM contacts WHERE id=:id''', {"id": contact_id}) self._db.commit() 2. `ListView`: This is the main view. It queries the `ContactModel` for the list of known contacts and displays them in a list, complete with some extra buttons to add/edit/delete contacts. .. container:: toggle .. container:: header **Show/hide code** .. code-block:: python class ListView(Frame): def __init__(self, screen, model): super(ListView, self).__init__(screen, screen.height * 2 // 3, screen.width * 2 // 3, on_load=self._reload_list, hover_focus=True, title="Contact List") # Save off the model that accesses the contacts database. self._model = model # Create the form for displaying the list of contacts. self._list_view = ListBox( Widget.FILL_FRAME, model.get_summary(), name="contacts", on_select=self._on_pick) self._edit_button = Button("Edit", self._edit) self._delete_button = Button("Delete", self._delete) layout = Layout([100], fill_frame=True) self.add_layout(layout) layout.add_widget(self._list_view) layout.add_widget(Divider()) layout2 = Layout([1, 1, 1, 1]) self.add_layout(layout2) layout2.add_widget(Button("Add", self._add), 0) layout2.add_widget(self._edit_button, 1) layout2.add_widget(self._delete_button, 2) layout2.add_widget(Button("Quit", self._quit), 3) self.fix() def _on_pick(self): self._edit_button.disabled = self._list_view.value is None self._delete_button.disabled = self._list_view.value is None def _reload_list(self): self._list_view.options = self._model.get_summary() self._model.current_id = None def _add(self): self._model.current_id = None raise NextScene("Edit Contact") def _edit(self): self.save() self._model.current_id = self.data["contacts"] raise NextScene("Edit Contact") def _delete(self): self.save() self._model.delete_contact(self.data["contacts"]) self._reload_list() @staticmethod def _quit(): raise StopApplication("User pressed quit") 3. `ContactView`: This is the detailed view. It queries the `ContactModel` for the current contact to be displayed when it is reset (note: there may be no contact if the user is adding a contact) and writes any changes back to the model when the user clicks OK. .. container:: toggle .. container:: header **Show/hide code** .. code-block:: python class ContactView(Frame): def __init__(self, screen, model): super(ContactView, self).__init__(screen, screen.height * 2 // 3, screen.width * 2 // 3, hover_focus=True, title="Contact Details") # Save off the model that accesses the contacts database. self._model = model # Create the form for displaying the list of contacts. layout = Layout([100], fill_frame=True) self.add_layout(layout) layout.add_widget(Text("Name:", "name")) layout.add_widget(Text("Address:", "address")) layout.add_widget(Text("Phone number:", "phone")) layout.add_widget(Text("Email address:", "email")) layout.add_widget(TextBox(5, "Notes:", "notes", as_string=True)) layout2 = Layout([1, 1, 1, 1]) self.add_layout(layout2) layout2.add_widget(Button("OK", self._ok), 0) layout2.add_widget(Button("Cancel", self._cancel), 3) self.fix() def reset(self): # Do standard reset to clear out form, then populate with new data. super(ContactView, self).reset() self.data = self._model.get_current_contact() def _ok(self): self.save() self._model.update_current_contact(self.data) raise NextScene("Main") @staticmethod def _cancel(): raise NextScene("Main") Displaying your UI ------------------ OK, so you want to do something a little more interactive with your user. The first thing you need to decide is what information you want to get from them and how you're going to achieve that. In short: 1. What data you want them to be able to enter - e.g. their name. 2. How you want to break that down into fields - e.g. first name, last name. 3. What the natural representation of those fields would be - e.g. text strings. At this point, you can now decide which Widgets you want to use. The standard selection is as follows. ============================= ===================================================================== Widget type Description ============================= ===================================================================== :py:obj:`.Button` Action buttons - e.g. ok/cancel/etc. :py:obj:`.CheckBox` Simple yes/no tick boxes. :py:obj:`.DatePicker` A single-line widget for selecting a date (using a pop-up list). :py:obj:`.Divider` A spacer between widgets (for aesthetics). :py:obj:`.DropdownList` A single-line widget that pops up a list from which the user can select a single value. :py:obj:`.FileBrowser` A multi-line widget for listing the local file system. :py:obj:`.Label` A label for a group of related widgets. :py:obj:`.ListBox` A list of possible options from which users can select one value. :py:obj:`.MultiColumnListBox` Like a ListBox, but for displaying tabular data. :py:obj:`.RadioButtons` A list of radio buttons. These allow users to select one value from a list of options. :py:obj:`.Text` A single line of editable text. :py:obj:`.TextBox` A multi-line box of editable text. :py:obj:`.TimePicker` A single-line widget for selecting a time (using a pop-up list). :py:obj:`.VerticalDivider` A vertical line divider - useful for providing a visual marker between columns in a Layout. ============================= ===================================================================== .. note:: You can use the `hide_char` option on Text widgets to hide sensitive data - e.g. for passwords. Asciimatics will automatically arrange these for you with just a little extra help. All you need to do is decide how many columns you want for your fields and which fields should be in which columns. To tell asciimatics what to do you create a `Layout` (or more than one if you want a more complex structure where different parts of the screen need differing column counts) and associate it with the `Frame` where you will display it. For example, this will create a Frame that is 80x20 characters and define 4 columns that are each 20 columns wide: .. code-block:: python frame = Frame(screen, 80, 20, has_border=False) layout = Layout([1, 1, 1, 1]) frame.add_layout(layout) Once you have a Layout, you can add Widgets to the relevant column. For example, this will add a button to the first and last columns: .. code-block:: python layout.add_widget(Button("OK", self._ok), 0) layout.add_widget(Button("Cancel", self._cancel), 3) If you want to put a standard label on all your input fields, that's fine too; asciimatics will decide how big your label needs to be across all fields in the same column and then indent them all to create a more aesthetically pleasing layout. For example, this will provide a single column with labels for each field, indenting all of the fields to the same depth: .. code-block:: python layout = Layout([100]) frame.add_layout(layout) layout.add_widget(Text("Name:", "name")) layout.add_widget(Text("Address:", "address")) layout.add_widget(Text("Phone number:", "phone")) layout.add_widget(Text("Email address:", "email")) layout.add_widget(TextBox(5, "Notes:", "notes", as_string=True)) If you want more direct control of your labels, you could use the :py:obj:`.Label` widget to place them anywhere in the Layout as well as control the justification (left, centre or right) of the text. Or maybe you just want some static text in your UI? The simplest thing to do there is to use the :py:obj:`.Label` widget. If you need something a little more advanced - e.g. a pre-formatted multi-line status bar, use a :py:obj:`.TextBox` and disable it as described below. In some cases, you may want to have different alignments for various blocks of Widgets. You can use multiple Layouts in one Frame to handle this case. For example, if you want a search page, which allows you to enter data at the top and a list of results at the bottom of the Frame, you could use code like this: .. code-block:: python layout1 = Layout([100]) frame.add_layout(layout1) layout1.add_widget(Text(label="Search:", name="search_string")) layout2 = Layout([100]) frame.add_layout(layout2) layout1.add_widget(TextBox(Widget.FILL_FRAME, name="results")) Disabling widgets ~~~~~~~~~~~~~~~~~ Any widget can be disabled by setting the ``disabled`` property. When this is ``True``, asciimatics will redraw the widget using the 'disabled' colour palette entry and prevent the user from selecting it or editing it. It is still possible to change the widget programmatically, though. For example, you can still change the ``value`` of a disabled widget. This is the recommended way of getting a piece of non-interactive data (e.g. a status bar) into your UI. If the disabled colour is the incorrect choice for your UI, you can override it as explained in :ref:`custom-colours-ref`. For an example of such a widget, see the top.py sample. Layouts in more detail ~~~~~~~~~~~~~~~~~~~~~~ If you need to do something more complex, you can use multiple Layouts. Asciimatics uses the following logic to determine the location of Widgets. 1. The `Frame` owns one or more `Layouts`. The `Layouts` stack one above each other when displayed - i.e. the first `Layout` in the `Frame` is above the second, etc. 2. Each `Layout` defines some horizontal constraints by defining columns as a proportion of the full `Frame` width. 3. The `Widgets` are assigned a column within the `Layout` that owns them. 4. The `Layout` then decides the exact size and location to make each `Widget` best fit the visible space as constrained by the above. For example:: +------------------------------------------------------------------------+ |Screen..................................................................| |........................................................................| |...+----------------------------------------------------------------+...| |...|Frame |...| |...|+--------------------------------------------------------------+|...| |...||Layout 1 ||...| |...|+--------------------------------------------------------------+|...| |...|+------------------------------+-------------------------------+|...| |...||Layout 2 | ||...| |...|| - Column 1 | - Column 2 ||...| |...|+------------------------------+-------------------------------+|...| |...|+-------------+---------------------------------+--------------+|...| |...||Layout 3 | < Widget 1 > | ||...| |...|| | ... | ||...| |...|| | < Widget N > | ||...| |...|+-------------+---------------------------------+--------------+|...| |...+----------------------------------------------------------------+...| |........................................................................| +------------------------------------------------------------------------+ This consists of a single `Frame` with 3 `Layouts`. The first is a single, full-width column, the second has two 50% width columns and the third consists of 3 columns of relative size 25:50:25. The last actually contains some Widgets in the second column (though this is just for illustration purposes as we'd expect most Layouts to have some Widgets in them). To get spacing between columns, you can just use a small empty column between your active content. This size will be proportional to the other columns and so will change as the screen is resized. If you want to avoid this resizing, you can use the `gutter` option on the `Layout`, which will always provide an exact character count between columns for all screen sizes. Filling the space ~~~~~~~~~~~~~~~~~ Once you've got the basic rows and columns for your UI sorted, you may want to use some strategic spacing. At the simplest level, you can use the previously mentioned :py:obj:`.Divider` widget to create some extra vertical space or insert a visual section break. Moving up the complexity, you can pick different sizes for your Frames based on the size of your current Screen. The Frame will be recreated when the screen is resized and so you will use more or less real estate appropriately. Finally, you could also tell asciimatics to use an object to fill any remaining space. This allows for the sort of UI like you'd see in applications like top where you have a fixed header or footer, but then a variably sized part that contains the data to be displayed. You can achieve this in 2 ways: 1. You can tell a Layout to fill any remaining space in the Frame using `fill_frame=True` on construction. 2. You can tell some Widgets to fill any remaining space in the Frame using a height of `Widget.FILL_FRAME` on construction. These two methods can be combined to tell a Layout to fill the Frame and a Widget to fill this Layout. See the ListView class in the contact_list demo code. .. warning:: Note that you can only have one Layout and/or Widget that fills the Frame. Trying to set more than one will be rejected. Full-screen Frames ~~~~~~~~~~~~~~~~~~ By default, asciimatics assumes that you are putting multiple Frames into one Scene and so provides defaults (e.g. borders) to optimize this type of UI. However, some UIs only need a single full-screen Frame. This can easily be achieved by declaring a Frame the full width and height of the screen and then specifying `has_border=False`. Large forms ~~~~~~~~~~~ If you have a very large form, you may find it is too big to fit into a standard screen. This is not a problem. You can keep adding your Widgets to your Layout and asciimatics will automatically clip the content to the space available and scroll the content as required. If you do this, it is recommended that you set `has_border=True` on the Frame so that the user can use the scroll bar provided to move around the form. Colour schemes ~~~~~~~~~~~~~~ The colours for any Widget are determined by the `palette` property of the Frame that contains the Widget. If desired, it is possible to have a different palette for every Frame, however your users may prefer a more consistent approach. The palette is just a simple dictionary to map Widget components to a colour tuple. A colour tuple is simply the foreground colour, attribute and background colour. For example: .. code-block:: python (Screen.COLOUR_GREEN, Screen.A_BOLD, Screen.COLOUR_BLUE) The following table shows the required keys for the `palette`. ======================== ========================================================================= Key Usage ======================== ========================================================================= "background" Frame background "borders" Frame border and Divider Widget "button" Buttons "control" Checkboxes and RadioButtons "disabled" Any disabled Widget "edit_text" Text and TextBox "field" Value of an option for a Checkbox, RadioButton or Listbox "focus_button" Buttons with input focus "focus_control" Checkboxes and RadioButtons with input focus "focus_edit_text" Text and TextBox with input focus "focus_field" As above with input focus "invalid" The widget contains invalid data "label" Widget labels "scroll" Frame scroll bar "selected_control" Checkboxes and RadioButtons when selected "selected_field" As above when selected "selected_focus_control" Checkboxes and RadioButtons with both "selected_focus_field" As above with both "title" Frame title ======================== ========================================================================= In addition to the default colour scheme for all your widgets, asciimatics provides some other pre-defined colour schemes (or themes) that you can use for your widgets using :py:meth:`~.Frame.set_theme`. These themes are as follows. ======================== ========================================================================= Name Description ======================== ========================================================================= "monochrome" Simple black and white colour scheme. "green" A classic green terminal. "bright" Black background, green and yellow scheme. "tlj256" Shades of black white and red - 256 colour terminals only. ======================== ========================================================================= You can add your own theme to this list by defining a new entry in the :py:obj:`~.widgets.THEMES` .. _custom-colours-ref: Custom widget colours ~~~~~~~~~~~~~~~~~~~~~ In some cases, a single palette for the entire Frame is not sufficient. If you need a more fine-grained approach to the colouring, you can customize the colour for any Widget by setting the :py:obj:`~.Widget.custom_colour` for that Widget. The only constraint on this property is that it must still be the value of one of the keys within the owning Frame's palette. Changing colours inline ~~~~~~~~~~~~~~~~~~~~~~~ The previous options should be enough for most UIs. However, sometimes it is useful to be able to change the colour of some text inside the value for some widgets, e.g. to provide syntax highlighting in a `TextBox`. You can do this using a :py:obj:`.Parser` object for those widgets that support it. By passing in a parser that understands extra control codes or the need to highlight certain characters differently, you can control colours on a letter by letter basis. Out of the box, asciimatics provides 2 parsers, which can handle the ${c,a,b} format used by its Renderers, or the ANSI standard terminal escape codes (used by many Linux terminals). Simply use the relevant parser (:py:obj:`~.AsciimaticsParser` or :py:obj:`~.AnsiTerminalParser`) and pass in values containing the associated control codes to change colours where needed. Check out the latest code in forms.py and top.py for examples of how this works. Setting values -------------- By this stage, you should have a basic User Interface up and running, but how do you set the values in each of the Widgets - e.g. to pre-populate known values in a form? There are 2 ways to handle this: 1. You can set the value directly on each `Widget` using the :py:obj:`~.Widget.value` property. 2. You can set the value for all Widgets in a `Frame` by setting at the :py:obj:`~.Frame.data` property. This is a simple key/value dictionary, using the `name` property for each `Widget` as the keys. The latter is a preferred as a symmetrical solution is provided to access all the data for each Widget, thus giving you a simple way to read and then replay the data back into your Frame. Getting values -------------- Now that you have a `Frame` with some `Widgets` in it and the user is filling them in, how do you find out what they entered? There are 2 basic ways to do this: 1. You can query each Widget directly, using the `value` property. This returns the current value the user has entered at any time (even when the Frame is not active). Note that it may be `None` for those `Widgets` where there is no value - e.g. buttons. 2. You can query the `Frame`by looking at the `data` property. This will return the value for every Widget in the former as a dictionary, using the Widget `name` properties for the keys. Note that `data` is just a cache, which only gets updated when you call :py:meth:`~.Frame.save`, so you need to call this method to refresh the cache before accessing it. For example: .. code-block:: python # Form definition layout = Layout([100]) frame.add_layout(layout) layout.add_widget(Text("Name:", "name")) layout.add_widget(Text("Address:", "address")) layout.add_widget(TextBox(5, "Notes:", "notes", as_string=True)) # Sample frame.data after user has filled it in. { "name": "Peter", "address": "Somewhere on earth", "notes": "Some multi-line\ntext from the user." } Validating text data ~~~~~~~~~~~~~~~~~~~~ Free-form text input sometimes needs validating to make sure that the user has entered the right thing - e.g. a valid email address - in a form. Asciimatics makes this easy by adding the `validator` parameter to `Text` widgets. This parameter takes either a regular expression string or a function (taking a single parameter of the current widget value). Asciimatics will use it to determine if the widget contains valid data. It uses this information in 2 places. 1. Whenever the `Frame` is redrawn, asciimatics will check the state and flag any invalid values using the `invalid` colour palette selection. 2. When your program calls :py:meth:`~.Frame.save` specifying `validate=True`, asciimatics will check all fields and throw an :py:obj:`.InvalidFields` exception if it finds any invalid data. Input focus ~~~~~~~~~~~ As mentioned in the explanation of colour palettes, asciimatics has the concept of an input focus. This is the Widget that will take any input from the keyboard. Assuming you are using the default palette, the Widget with the input focus will be highlighted. You can move the focus using the cursor keys, tab/backtab or by using the mouse. The exact way that the mouse affects the focus depends on a combination of the capabilities of your terminal/console and the settings of your Frame. At a minimum, clicking on the Widget will always work. If you specify `hover_focus=True` and your terminal supports reporting mouse move events, just hovering over the Widget with the mouse pointer will move the focus. Modal Frames ~~~~~~~~~~~~ When constructing a Frame, you can specify whether it is modal or not using the `is_modal` parameter. Modal Frames will not allow any input to filter through to other Effects in the Scene, so when one is on top of all other Effects, this means that only it will see the user input. This is commonly used for, but not limited to, notifications to the user that must be acknowledged (as implemented by :py:obj:`.PopUpDialog`). Global key handling ~~~~~~~~~~~~~~~~~~~ In addition to mouse control to switch focus, you can also set up a global event handler to navigate your forms. This is useful for keyboard shortcuts - e.g. Ctrl+Q to quit your program. To set up this handler, you need to pass it into your screen on the `play()` Method. For example .. code-block:: python # Event handler for global keys def global_shortcuts(event): if isinstance(event, KeyboardEvent): c = event.key_code # Stop on ctrl+q or ctrl+x if c in (17, 24): raise StopApplication("User terminated app") # Pass this to the screen... screen.play(scenes, unhandled_input=global_shortcuts) .. warning:: Note that the global handler is only called if the focus does not process the event. Some widgets - e.g. TextBox - take any printable text and so the only keys that always get to this handler are the control codes. Others will sometimes get here depending on the type of Widget in focus and whether the Frame is modal or not.. By default, the global handler will do nothing if you are playing any Scenes containing a Frame. Otherwise it contains the top-level logic for skipping to the next Scene (on space or enter), or exiting the program (on Q or X). Dealing with Ctrl+C and Ctrl+Z ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A lot of modern UIs want to be able to use Ctrl+C/Z to do something other than kill the application. The problem for Python is that this normally triggers a `KeyboardInterrupt` - which typically kills the application - or causes the operating system to suspend the process (on UNIX variants). If you want to prevent this and use Ctrl+C/Z for another purpose, you can tell asciimatics to catch the low-level signals to prevent these interrupts from being generated (and so return the keypress to your application). This is done by specifying `catch_interrupt=True` when you create the `Screen` by calling :py:meth:`.wrapper`. Dealing with Ctrl+S ~~~~~~~~~~~~~~~~~~~ Back in the days when terminals really were separate machines connected over wires to a computer, it was necessary to be able to signal that the terminal needed time to catch up. This was done using software flow control, using the Ctrl+S/Ctrl+Q control codes to tell the computer to stop/restart sending text. These days, it's not really necessary, but is still a supported feature on most terminals. On some systems you can switch this off so you get access to Ctrl+S, but it is not possible on them all. See :ref:`ctrl-s-issues-ref` for details on how to fix this. Flow of control --------------- By this stage you should have a program with some Frames and can extract what your user has entered into any of them. But how do you know when to act and move between Frames? The answer is callbacks and exceptions. Callbacks ~~~~~~~~~ A callback is just a function that you pass into another function to be called when the associated event occurs. In asciimatics, they can usually be identified by the fact that they start with `on` and correspond to a significant input action from the user, e.g. `on_click`. When writing your application, you simply need to decide which events you want to use to trigger some processing and create appropriate callbacks. The most common pattern is to use a `Button` and define an `on_click` callback. In addition, there are other events that can be triggered when widget values change. These can be used to provide dynamic effects like enabling/disabling Buttons based on the current value of another Widget. Exceptions ~~~~~~~~~~ Asciimatics uses exceptions to tell the animation engine to move to a new Scene or stop the whole process. Other exceptions are not caught and so can still be used as normal. The details for the new exceptions are as follows: 1. :py:obj:`.StopApplication` - This exception will stop the animation engine and return flow to the function that called into the Screen. 2. :py:obj:`.NextScene` - This exception tells the animation engine to move to a new Scene. The precise Scene is determined by the name passed into the exception. If none is specified, the engine will simply round robin to the next available Scene. Note that the above logic requires each Scene to be given a unique name on construction. For example: .. code-block:: python # Given this scene list... scenes = [ Scene([ListView(screen, contacts)], -1, name="Main"), Scene([ContactView(screen, contacts)], -1, name="Edit Contact") ] screen.play(scenes) # You can use this code to move back to the first scene at any time... raise NextScene("Main") Data handling ------------- By this stage you should have everything you need for a fully functional UI. However, it may not be quite clear how to pass data around all your component parts because asciimatics doesn't provide any classes to do it for you. Why? Because we don't want to tie you down to a specific implementation. You should be able to pick your own! Look back at the earlier explanation of model/view design. The model can be any class you like! All you need to do is: 1. Define a model class to store any state and provide suitable APIs to access it as needed from your UI (a.k.a. views). 2. Define your own views (based on an ``Effect`` or ``Frame``) to define your UI and store a reference to the model (typically as a parameter on construction). 3. Use that saved reference to the model to handle updates as needed inside your view's callbacks or methods. For a concrete example of how to do this check out the contact list sample and look at how it defines and uses the ``ContactModel``. Alternatively, the quick_model sample shows how the same forms would work with a simple list of dictionaries instead. Dynamic scenes -------------- That done, there are just a few more final touches to consider. These all touch on dynamically changing or reconstructing your Scene. At a high level, you need to decide what you want to achieve. The basic options are as follows. 1. If you just want to have some extra Frames on the same Screen - e.g. pop-up windows - that's fine. Just use the existing classes (see below)! 2. If you want to be able to draw other content outside of your existing Frame(s), you probably want to use other Effects. 3. If you want to be able to add something inside your Frame(s), you almost certainly want to create a custom Widget for that new content. The rest of this section goes through those options (and a couple more related changes) in a little more detail. Adding other effects ~~~~~~~~~~~~~~~~~~~~ Since Frames are just another Effect, they can be combined with any other Effect in a Scene. For example, this will put a simple input form over the top of the animated Julia set Effect: .. code-block:: python scenes = [] effects = [ Julia(screen), InputFormFrame(screen) ] scenes.append(Scene(effects, -1)) screen.play(scenes) The ordering is important. The effects at the bottom of the list are at the top of the screen Z order and so will be displayed in preference to those lower in the Z order (i.e. those earlier in the list). The most likely reason you will want to use this is to use the :py:obj:`.Background` Effect to set a background colour for the whole screen behind your Frames. See the forms.py demo for an example of this use case. Pop-up dialogs ~~~~~~~~~~~~~~ Along a similar line, you can also add a :py:obj:`.PopUpDialog` to your Scenes at any time. These consist of a single text message and a set of buttons that you can define when creating the dialog. Owing to restrictions on how objects need to be rebuilt when the screen is resized, these should be limited to simple are confirmation or error cases - e.g. "Are you sure you want to quit?" For more details on the restrictions, see the section on restoring state. Pop-up menus ~~~~~~~~~~~~ You can also add a :py:obj:`.PopupMenu` to your Scenes in the same way. These allow you to create a simple temporary list of options from which the user has to select just one entry (by clicking on it or moving the focus and pressing Enter) or dismiss the whole list (by pressing Escape or clicking outside of the menu). Owing to their temporary nature, they are not maintained over screen resizing. Screen resizing ~~~~~~~~~~~~~~~ If you follow the standard application mainline logic as found in all the sample code, your application will want to resize all your Effects and Widgets whenever the user resizes the terminal. To do this you need to get a new Screen then rebuild a new set of objects to use that Screen. Sound like a bit of a drag, huh? This is why it is recommended that you separate your presentation from the rest of your application logic. If you do it right you will find that it actually just means you go through exactly the same initialization path as you did before to create your Scenes in the first place. There are a couple of gotchas, though. First, you need to make sure that asciimatics will exit and recreate a new Screen when the terminal is resized. You do that with this boilerplate code that is in most of the samples. .. code-block:: python def main(screen, scene): # Define your Scenes here scenes = ... # Run your program screen.play(scenes, stop_on_resize=True, start_scene=scene) last_scene = None while True: try: Screen.wrapper(main, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene This will allow you to decide how all your UI should look whenever the screen is resized and will restart at the Scene that was playing at the time of the resizing. Restoring state ~~~~~~~~~~~~~~~ Recreating your view is only half the story. Now you need to ensure that you have restored any state inside your application - e.g. any dynamic effects are added back in, your new Scene has the same internal state as the old, etc. Asciimatics provides a standard interface (the `clone` method) to help you out here. When the running `Scene` is resized (and passed back into the Screen as the start scene), the new `Scene` will run through all the `Effects` in the old copy looking for any with a `clone` method. If it finds one, it will call it with 2 parameters: the new `Screen` and the new `Scene` to own the cloned `Effect`. This allows you to take full control of how the new `Effect` is recreated. Asciimatics uses this interface in 2 ways by default: 1. To ensure that any :py:obj:`~.Frame.data` is restored in the new `Scene`. 2. To duplicate any dynamically added :py:obj:`.PopUpDialog` objects in the new `Scene`. You could override this processing to handle your own custom cloning logic. The formal definition of the API is defined as follows. .. code-block:: python def clone(self, screen, scene): """ Create a clone of this Effect into a new Screen. :param screen: The new Screen object to clone into. :param scene: The new Scene object to clone into. """ Reducing CPU usage ~~~~~~~~~~~~~~~~~~ It is the nature of text UIs that they don't need to refresh anywhere near as often as a full-blown animated Scene. Asciimatics therefore optimizes the refresh rate when only Frames are being displayed on the Screen. However, there are some widgets that can reduce the need for animation even further by not requesting animation updates (e.g. for a blinking cursor). If this is an issue for your application, you can specify ``reduce_cpu=True`` when constructing your Frames. See contact_list.py for an example of this. Custom widgets -------------- To develop your own widget, you need to define a new class that inherits from :py:obj:`.Widget`. You then have to implement the following functions. 1. :py:meth:`~.Widget.reset` - This is where you should reset any state for your widget. It gets called whenever the owning Frame is initialised, which can be when it is first displayed, when the user moves to a new Scene or when the screen is resized. 2. :py:meth:`~.Widget.update` - This is where you should put the logic to draw your widget. It gets called every time asciimatics needs to redraw the screen (and so should always draw the entire widget). 3. :py:meth:`~.Widget.process_event` - This is where you should put your code to handle mouse and keyboard events. 4. :py:obj:`~.Widget.value` - This must return the current value for the widget. 5. :py:meth:`~.Widget.required_height` - This returns the minimum required height for your widget. It is used by the owning Layout to determine the size and location of your widget. With these all defined, you should now be able to add your new custom widget to a Layout like any of the standard ones delivered in this package. python-asciimatics-1.15.0/requirements.txt000066400000000000000000000000401511423144500206640ustar00rootroot00000000000000-r requirements/base.txt Pillow python-asciimatics-1.15.0/requirements/000077500000000000000000000000001511423144500201315ustar00rootroot00000000000000python-asciimatics-1.15.0/requirements/base.txt000066400000000000000000000000511511423144500216000ustar00rootroot00000000000000wcwidth pyfiglet >= 0.7.2 setuptools_scm python-asciimatics-1.15.0/requirements/dev.txt000066400000000000000000000000541511423144500214470ustar00rootroot00000000000000-r base.txt Pillow coveralls sphinx urllib3 python-asciimatics-1.15.0/samples/000077500000000000000000000000001511423144500170525ustar00rootroot00000000000000python-asciimatics-1.15.0/samples/256colour.py000077500000000000000000000013771511423144500211770ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Print, Clock from asciimatics.renderers import FigletText, Rainbow from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): effects = [ Print(screen, Rainbow(screen, FigletText("256 colours")), y=screen.height//2 - 8), Print(screen, Rainbow(screen, FigletText("for xterm users")), y=screen.height//2 + 3), Clock(screen, screen.width//2, screen.height//2, screen.height//2), ] screen.play([Scene(effects, -1)], stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/bars.py000077500000000000000000000115311511423144500203570ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.constants import SINGLE_LINE, DOUBLE_LINE, ASCII_LINE from asciimatics.effects import Print from asciimatics.exceptions import ResizeScreenError from asciimatics.renderers import BarChart, VBarChart, FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.utilities import BoxTool import sys import math import time from random import randint def fn(): return randint(0, 10) def fn2(): return randint(0, 6) def wv(x): return lambda: 1 + math.sin(math.pi * (2*time.time()+x) / 5) def demo(screen): scenes = [] if screen.width != 132 or screen.height != 24: effects = [ Print(screen, FigletText("Resize to 132x24"), y=screen.height//2-3), ] else: # Horizontal Charts hchart1 = BarChart(9, 22, [fn, fn], char="═", gradient=[(7, Screen.COLOUR_GREEN), (9, Screen.COLOUR_YELLOW), (10, Screen.COLOUR_RED)], keys=["one", "two"], gap=1, ) hchart2 = BarChart(10, 25, [wv(1), wv(3), wv(5), wv(7), wv(9)], colour=Screen.COLOUR_GREEN, axes=BarChart.BOTH, scale=2.0) hchart2.border_style = ASCII_LINE hchart2.axes_style = ASCII_LINE hchart3 = BarChart(10, 40, [wv(1), wv(2), wv(3), wv(4), wv(5), wv(7), wv(8), wv(9)], colour=[c for c in range(1, 8)], bg=[c for c in range(1, 8)], scale=2.0, axes=BarChart.X_AXIS, intervals=0.5, labels=True, border=False) hchart4 = BarChart(7, 30, [lambda: time.time() * 10 % 101], gradient=[ (33, Screen.COLOUR_RED, Screen.COLOUR_RED), (66, Screen.COLOUR_YELLOW, Screen.COLOUR_YELLOW), (100, Screen.COLOUR_WHITE, Screen.COLOUR_WHITE), ] if screen.colours < 256 else [ (10, 234, 234), (20, 236, 236), (30, 238, 238), (40, 240, 240), (50, 242, 242), (60, 244, 244), (70, 246, 246), (80, 248, 248), (90, 250, 250), (100, 252, 252) ], char=">", scale=100.0, labels=True, axes=BarChart.X_AXIS) hchart4.border_style = SINGLE_LINE # Vertical Charts vchart1 = VBarChart(12, 21, [fn2, fn2], char="═", gradient=[(3, Screen.COLOUR_GREEN), (4, Screen.COLOUR_YELLOW), (5, Screen.COLOUR_RED)], keys=["one", "two"], ) vchart2 = VBarChart(12, 17, [wv(1), wv(3), wv(5), wv(7), wv(9)], colour=Screen.COLOUR_GREEN, axes=BarChart.BOTH, scale=2.0, gap=0) vchart2.border_style = ASCII_LINE vchart2.axes_style = ASCII_LINE vchart3 = VBarChart(12, 39, [wv(1), wv(2), wv(3), wv(4), wv(5), wv(7), wv(8), wv(9)], colour=[c for c in range(1, 8)], bg=[c for c in range(1, 8)], gap=0, scale=2.0, axes=BarChart.Y_AXIS, intervals=0.5, labels=True, border=False) vchart4 = VBarChart(12, 16, [lambda: time.time() * 10 % 101], gradient=[ (33, Screen.COLOUR_RED, Screen.COLOUR_RED), (66, Screen.COLOUR_YELLOW, Screen.COLOUR_YELLOW), (100, Screen.COLOUR_WHITE, Screen.COLOUR_WHITE), ] if screen.colours < 256 else [ (10, 234, 234), (20, 236, 236), (30, 238, 238), (40, 240, 240), (50, 242, 242), (60, 244, 244), (70, 246, 246), (80, 248, 248), (90, 250, 250), (100, 252, 252) ], char=">", scale=100.0, labels=True, axes=VBarChart.Y_AXIS) vchart4.border_style = SINGLE_LINE effects = [ Print(screen, hchart1, x=1, y=1, transparent=False, speed=2), Print(screen, hchart2, x=25, y=1, transparent=False, speed=2), Print(screen, hchart3, x=52, y=1, transparent=False, speed=2), Print(screen, hchart4, x=96, y=2, transparent=False, speed=2), Print(screen, vchart1, x=2, y=12, transparent=False, speed=2), Print(screen, vchart2, x=29, y=12, transparent=False, speed=2), Print(screen, vchart3, x=52, y=12, transparent=False, speed=2), Print(screen, vchart4, x=103, y=12, transparent=False, speed=2), ] scenes.append(Scene(effects, -1)) screen.play(scenes, stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/basics.py000077500000000000000000000143211511423144500206740ustar00rootroot00000000000000#!/usr/bin/env python3 import copy import math from asciimatics.effects import Cycle, Print, Stars from asciimatics.renderers import SpeechBubble, FigletText, Box from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.sprites import Arrow, Plot, Sam from asciimatics.paths import Path from asciimatics.exceptions import ResizeScreenError import sys def _speak(screen, text, pos, start): return Print( screen, SpeechBubble(text, "L", uni=screen.unicode_aware), x=pos[0] + 4, y=pos[1] - 4, colour=Screen.COLOUR_CYAN, clear=True, start_frame=start, stop_frame=start+50) def demo(screen): scenes = [] centre = (screen.width // 2, screen.height // 2) podium = (8, 5) # Scene 1. path = Path() path.jump_to(-20, centre[1]) path.move_straight_to(centre[0], centre[1], 10) path.wait(30) path.move_straight_to(podium[0], podium[1], 10) path.wait(100) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "WELCOME TO ASCIIMATICS", centre, 30), _speak(screen, "My name is Aristotle Arrow.", podium, 110), _speak(screen, "I'm here to help you learn ASCIImatics.", podium, 180), ] scenes.append(Scene(effects)) # Scene 2. path = Path() path.jump_to(podium[0], podium[1]) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "Let's start with the Screen...", podium, 10), _speak(screen, "This is your Screen object.", podium, 80), Print(screen, Box(screen.width, screen.height, uni=screen.unicode_aware), 0, 0, start_frame=90), _speak(screen, "It lets you play a Scene like this one I'm in.", podium, 150), _speak(screen, "A Scene contains one or more Effects.", podium, 220), _speak(screen, "Like me - I'm a Sprite!", podium, 290), _speak(screen, "Or these Stars.", podium, 360), _speak(screen, "As you can see, the Screen handles them both at once.", podium, 430), _speak(screen, "It can handle as many Effects as you like.", podium, 500), _speak(screen, "Please press now.", podium, 570), Stars(screen, (screen.width + screen.height) // 2, start_frame=360) ] scenes.append(Scene(effects, -1)) # Scene 3. path = Path() path.jump_to(podium[0], podium[1]) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "This is a new Scene.", podium, 10), _speak(screen, "The Screen stops all Effects and clears itself between " "Scenes.", podium, 70), _speak(screen, "That's why you can't see the Stars now.", podium, 130), _speak(screen, "(Though you can override that if you need to.)", podium, 200), _speak(screen, "Please press now.", podium, 270), ] scenes.append(Scene(effects, -1)) # Scene 4. path = Path() path.jump_to(podium[0], podium[1]) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "So, how do you design your animation?", podium, 10), _speak(screen, "1) Decide on your cinematic flow of Scenes.", podium, 80), _speak(screen, "2) Create the Effects in each Scene.", podium, 150), _speak(screen, "3) Pass the Scenes to the Screen to play.", podium, 220), _speak(screen, "It really is that easy!", podium, 290), _speak(screen, "Just look at this sample code.", podium, 360), _speak(screen, "Please press now.", podium, 430), ] scenes.append(Scene(effects, -1)) # Scene 5. path = Path() path.jump_to(podium[0], podium[1]) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "There are various effects you can use. For " "example...", podium, 10), Cycle(screen, FigletText("Colour cycling"), centre[1] - 5, start_frame=100), Cycle(screen, FigletText("using Figlet"), centre[1] + 1, start_frame=100), _speak(screen, "Look in the effects module for more...", podium, 290), _speak(screen, "Please press now.", podium, 360), ] scenes.append(Scene(effects, -1)) # Scene 6. path = Path() path.jump_to(podium[0], podium[1]) curve_path = [] for i in range(0, 11): curve_path.append( (centre[0] + (screen.width / 4 * math.sin(i * math.pi / 5)), centre[1] - (screen.height / 4 * math.cos(i * math.pi / 5)))) path2 = Path() path2.jump_to(centre[0], centre[1] - screen.height // 4) path2.move_round_to(curve_path, 60) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "Sprites (like me) are also an Effect.", podium, 10), _speak(screen, "We take a pre-defined Path to follow.", podium, 80), _speak(screen, "Like this one...", podium, 150), Plot(screen, path2, colour=Screen.COLOUR_BLUE, start_frame=160, stop_frame=300), _speak(screen, "My friend Sam will now follow it...", podium, 320), Sam(screen, copy.copy(path2), start_frame=380), _speak(screen, "Please press now.", podium, 420), ] scenes.append(Scene(effects, -1)) # Scene 7. path = Path() path.jump_to(podium[0], podium[1]) path.wait(60) path.move_straight_to(-5, podium[1], 20) path.wait(300) effects = [ Arrow(screen, path, colour=Screen.COLOUR_GREEN), _speak(screen, "Goodbye!", podium, 10), Cycle(screen, FigletText("THE END!"), centre[1] - 4, start_frame=100), Print(screen, SpeechBubble("Press X to exit"), centre[1] + 6, start_frame=150) ] scenes.append(Scene(effects, 500)) screen.play(scenes, stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/bg_colours.py000077500000000000000000000026551511423144500215750ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Wipe, Print from asciimatics.renderers import FigletText, SpeechBubble from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): scenes = [] for bg, name in [ (Screen.COLOUR_DEFAULT, "DEFAULT"), (Screen.COLOUR_RED, "RED"), (Screen.COLOUR_YELLOW, "YELLOW"), (Screen.COLOUR_GREEN, "GREEN"), (Screen.COLOUR_CYAN, "CYAN"), (Screen.COLOUR_BLUE, "BLUE"), (Screen.COLOUR_MAGENTA, "MAGENTA"), (Screen.COLOUR_WHITE, "WHITE")]: effects = [ Wipe(screen, bg=bg, stop_frame=screen.height * 2 + 30), Print(screen, FigletText(name, "epic"), screen.height // 2 - 4, colour=bg if bg == Screen.COLOUR_DEFAULT else 7 - bg, bg=bg, start_frame=screen.height * 2), Print(screen, SpeechBubble("Testing background colours - press X to exit"), screen.height-5, speed=1, transparent=False) ] scenes.append(Scene(effects, 0, clear=False)) screen.play(scenes, stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/cogs.py000077500000000000000000000022671511423144500203710ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Cog, Print from asciimatics.renderers import FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): # Typical terminals are 80x24 on UNIX and 80x25 on Windows if screen.width != 80 or screen.height not in (24, 25): effects = [ Print(screen, FigletText("Resize to 80x24"), y=screen.height//2-3), ] else: effects = [ Cog(screen, 20, 10, 10), Cog(screen, 60, 30, 15, direction=-1), Print(screen, FigletText("ascii", font="smkeyboard"), attr=Screen.A_BOLD, x=47, y=3, start_frame=50), Print(screen, FigletText("matics", font="smkeyboard"), attr=Screen.A_BOLD, x=45, y=7, start_frame=100), Print(screen, FigletText("by Peter Brittain", font="term"), x=8, y=22, start_frame=150) ] screen.play([Scene(effects, -1)], stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/colour_globe.gif000066400000000000000000003644051511423144500222300ustar00rootroot00000000000000GIF89asJ{R! NETSCAPE2.0!GifBuilder 0.3.1 by Yves Piguet! ,I8di(vӼp,Gjxrˆ!G,84 _ѠZاV`V'6 B^6=ڏIeBisVoqltw$`HI0As  uzN= vKN/q Ϣӥ]`×c/l̴Ϲ鼂6ٓX ܽS4ސ5v/fD@?h" /2+Ch 8#˖xq᱅ 3cY+-})STR.afLW`&xsPCC*j逮H#xt"ӦNS c!+@+7mV[˰/u `càwUn߮-$\@xr\nݼzLW VL޾afN(Wɩ/WfxRjj<'i 6Ƴi6~ iFZurDwR5r7p7v% `F#P) sF^ygY `Ԃ 2` "E}WbPM{U8 K25cȠ 9c{ A\Xh4*XV^ vMdĐJ<[Ui txIBɦ Zh!Ҙ|8tFgߌ i(89Qm]HY8f^u6JkB)h6&&s)rjo ʯd'")nB9 w W$Vٖ)`J+&5*޽K~IV/ro9R,**Z[װ/S<.\1gQ. u;D;n`g,ekT/3od%竵㪬,/ LܣRGd ̲wG}SuzxP8 v5~mk~J]2cXnxA9s A{[_0; ǂZ(f>pH sĻ:-z*L󈧊Ȭ0oޔ'.~88'q xnt:ٛJKEY [KWU,GA=M2.>0!t3I3=J`*{`L}$m݋0T/bE^Bxa>t?2dfo{3 E m|kQ^*AM?ǥN{cHG$Os<m!aWpuVyp g)[ʶD&҅Bj -q~/fuғDجLsN,,̇{ OLyY.AF O>!baQJ$`8IN?I k'X+)dJ^^mޮ44 sX%h'Mb^ZUuCj2x2X@y MKl>0ΤŎάs<%M}Fu 8WiMC(5hF7:LC^_݃%?&3n@5 r-[w9dlfdB̲wBɂQ|5%$'hƧoi@J3[lNwNF\D[wv"6q'F7nucwֱ5y Cm4r. u-lW݂跿i]ۧ4d;35V8}_W95i կ8)ј|զqFU)rKp|};K+f9M2bw?B t2\d.ɮ󩫝[V ?s05_:CF^s~i7ZՅ&*]߀a\$v8+$vm;&ehk..sI~z6%i `u(ЅI_z;0#9ߧay?6O|ALm|k o{R[g")~~zM7wGg.z r:!|'~t~bW]%x,$y nf 1 ;|74$"(W^}0 "&jgBF=N>Vm}FW᥃B%N 6 hv-6H|H@ {Y2Pw=)>H`؂S8s+xOWr%wgB9*R(^x;#Nvz ed'#^Ȃp(rq+Ksw:{-{mX(y+[fXHn5 0N4NIXB sx ]ΤC#xI:$@0m}@O5)Xh% h8:kd؈؍QKj#q( N 8isQxQxW9ihT@S0:XTg5 o 6PFeRTX:(c I61e% #cْ#ODը 8y$UR\ae@p0WX(/$9H&vEHXbZQP>Ik PQhjٖ>pYOdN_ Yy{L^ /WpW 9vt)y \ GygiY{퐗! ,I8di(vӼpF{iPH:81OF4,tpU+HR(a~fVZPg}g oWrt_\Vx2t^>750z0R RZygPƱ~<z5~Ojl~ Fb{l}9όN3|`0GpC*\PGrJz ǚ *0Ф8)/tc6H! =DcI> *a(Kwb9j Rb4I" ΜbW7(FN hgOfm/b%6,5.*p2ߨ z-ͰAv>0h5EES ,Ȗ- $_7nrб˽ɱucUfㄗUNsNTlcY ϗ'S%Hiy$ g}r $0&Z2_LFr*gr "^JXlXfQ(>aOGNx1VUSfeQi4ptقme)a-*YfiXSA`K|@Ɔ_y`.'fcnHU_p~TAv){Y楘Z8U3P4›jNw[ -V˦hВ p%yo-/"/fbop04~( ^[wF-Z,3f 9(#Lش[B(jP;{l?CPˍ2Sy F d #9'iԥ&Tβ(ZLj  Ģ5]6GT5\߶Rz՞QytE;9ͦz,\4KlWaД ݡ\zLǪ3'?Y5`\gB*1\$Lhγ hIJ?ubV>4lѺ: -Q@DCGvXԓ[dE;K+h'ѣ+0 "eJ+VE.w.կJg/kK9i n}E'Qӭ+kKKZW|a\5! mf[[T~.9)LWۂ$a!La:Ά0y'LEo [Ki' `+a4gv.<:9yF枀*7]TEe<;Թ@IXFF-q͠tGhS?%vL5Zı :#[;s|55!tIUY(VUy.N<63jrl<'`|UXWU z)υg7'>nikηsm݊J CK!x` VPox bDXΈ3#BX% gjyu9>+7ڢ h,Lnk7lx XFB nnb&]ŕ,x.tuiTaNсHr`,#EFhN(((BXvɶ Tgfe4s!t!,';U ac~wQ'#lqb cRsyx"4zr0Pt;`4P/.05M5baT{Ӆ R81aTacF0b86h"A";5KAӋm, w!5ƈѓ9 \alr xG/iDgH蘎*( q`Sƨ 24g+Hp<OxH vH h89H.Dx9xP %{bH+ 7(H/$i7ZC<EDG0ԑsE9/p-~@)M5Q)KxlMZ\)/tDUADeY TNm]f[9%)Js! ,I8్di(zӼp,bj8>!G,ի1(t 2j ׳eh4<̺[K( |>m& lo$[q t0a wz~ zm-/Ph fdyntBagwIJƭwDv޵ҹս w6k @7p \%\pAc/v2㪕< 2L$ɂ,ph,#("P2RC I49! W⃩bjqkcGdX~3ϒ#KLiB 0!MF4 kQaKug]vK/k_HsKY,R%j} ̙ISH`+|y,`H 3KR!YlWym[Ԩ49["r׳_߾ʺE;uDi6u!tjYGژEdbQH9HJgW֩%zɢ`bv88z7J]f|Y.*w>Z$F>2v6αfVvԗX"j9程j"]jFSNd)8ߏ"Nk-wk(וC{!9h]@J`:cZƪN=Sj>;j˨Tk }dJ<:$#.૵$wiIg{s3YE<##tZv3:sT3%{ދmx(}"qQOl| |pкGtL2c1}h Ͷxlut"9;w9E[jM(ky_-z6K5R.\~+g[Mx3٢8Dn,Pur*zs= ],OWAMr|ϧF^ .3~[?o~h2c'f+_.nS'9Z cl^WiṼ1Ar,\JA )1T:)ܰGfBbٗ[O -݄(A|x;,fQt%eφaLQUn|遧p3P]$8Ps$=8!1?rU 1L@)DB&FU^/L&eFE~r1g-^RҗlKDx P?DSC⠹E0RԄꚸ>B(q-`_$F0Gt(\AMjY}s-ؐ阹薳.JRd!:@#0PBPI8S-,"TPGH'03R !p I*XBVH>l3( q# t.:Fвs5]QcL[.uiYcP3lg2Ǧ~.=]xDT*ϴAAS%ѝ=;;5gaCZ.̲bn FEme%JW'#XpFVrDgZm"W3L+:[±)RSӞh dzb%Sue@耨t0mm.x[4UZ@K췿s<n]@iKQ]MnooOIa{dQ+$SGm*K_zdU?8zl D^F;f'c*Ak<I1aX26#?=XpgaKE, s72˪Sэ7?GZX9tHފaO?;g,)$J]'͐УiJ[Za߆DYS\hz?0tv;\3;<7_W~eK̻Rq ;®rG3iyu.y{Я8 ʫ;ɐ8h«ͷv^5'ŝtSԳy4}zAvp ԭE|=ot5?]P񤠼޲߽_#w.+7 =ďo'}wu<U5_c~kjM+Whr7xDby"w+Ec5"J~f 7 e%WLD+}qcQ"0=KrzD 37K#i|ɀ k^V(O3xx H&_jFc3<{!Ȑ gWu|s$7(~uxFpE|xT<>h#} J&Q4=)67Rgr'PgNF)VW~M.s^ܮꜯuf(\ePXl k+ն;(l\D9T=rҦŪ%].RqݖpS&l&)w/vEFf}T]m)q w(azg(>WF[9Ӝ͹V9| v&~eF M}󭿎Juu@3Eb6MJ(<|v%g, Jqߐ?sA_~58Ǒt_(5 R)n0mN` O^9Scy޽x:{鿧B+"5(Kࡄt2>4:>C=K<2%U3HeU7b|{-f~+nxk^vj%,w,Xz+ kM!sn#dIdEL` ~Bn䄅E[k)I(8&y vZc.9}(`ZSv BrX!jYSac\b$CkƬfJWfV,?Ox -a۵/Ym1& J.@D@e)t)BVZҨ\eGPQn#C֐_QP hސ3%8WёYe3zQ/"&jy; {mx}SKiNN FWZ_)2nxzq&2W}rWyէ?|'x2x /vu%<>:oH ;^_$J %+z{‡Ҝl5bFMuH3ܢu-;8xfnoȼt朶u' Oaq[oGge(0ؽ&Pd yBm[ê;[;`=%x:ުŃzdQ~U3zrӡhg.{m}jSrjzcO;=S-@JK>Ti+V$u' @s~$ `s0m@Wxv}7}v<{"5}0"orl&v\"YBI1{ }92zXz2@eW4~K ȁ`iBU/s1Eu'8X Bw1h ؂u=&RXȑU,m>F'xՅ7xSEmKE7WNAAz؆nW`Q))X@}kQpW"SP[T8Pw8xb(nNX }:'\㗋h5rdX ،x]h1u_@U(7K@97Q}޸ "-@8!~~~yPrxJƃwSw7y_;8Wi fb"i ! ,I8di(vӼp,bj8z?WnHx=``:e(Zѣ9pA.?4vӂz.S|fG;nI2|/udwzybU@cM{  zZii2be ¬{uETtv ޭ|Cϵ|wդާ6͵-1S$0@ 3, AQu&BS dGchJ" $ʰSf[6+\s &0* .BZ.3PGtR{RĞlD%wR=vRLCbG^<-,f=@[\'h6-x8 rߘd6Y}&u`<$`+2ڢ3}A^! 7^{>PA8gn-goȿ/@z]͟g^}y+t8볏&Do2vֿ]LR0 "  Pr`|%rk$BҺJADA{ji.EG]}QB/{x 1\b%)vcܗE>h0K$6Y{^xB^5DeK1a^ ! fI&iT_*I;(_LfMb.EFj@VRQpL2SSՠeꭗ~HM@M;RLom4CIY+њP)$ t"Nxރ3nL$h@fC _-7@u.SMƨ:i&*t{"X" mRv/[r'.cO&Cu3%CSP 4%R")FE:RƦ%2KCj:σ6]bu&!@`\IZVHUzΙ*3j hF6Ѯ\ % W_%OU?GϐR-,%}4:=7UڒVSke?Zf5)Ad走~SdIwkpMw9.i#HezU7vכ3zG}ìn$.v\r(l|{R2=likVvB2W^8eCqgtSRX@z<m&1H0Nc(mfPWn] dAщ` lo\pR'my@$]ECRmxX#G J˜ @wbzEͨR귈؇tyxv Q8S0xho(8?l5 B! ,I8్di(ӸM,ϳx,``vd`B(Xvz+&4:Ú+c6߸.bs5Oo r$tM?dkW{V+admUT{k .DDASVU ]bE1X ľ޿:- Dhi8<;Hހ|؛hO$Ωh5U) /8`A˖SU8" ;Z-y%K0*@SE7Π5#6T0J,K e`Vv:. +U\QAD.v%!_?U qPƪd{2Y?Uj*%I־~-Xi w\eLlՀaR*ڊF\DW0}:pBs wyQ諣_w6: mwW6PCW7!llj\$Vj'݅hY*qhXA7oUߊDtvOv]lrՈ e_Y&pbRsx[ӐBUbI'dBZ"`nM&$ nr=bɟ[ Ig. HDH+Uڃ?؟ryw)aiCqPF&*@DI&iWژsgrψrzE:$"Z,MЍwihO)*" jJ), ~٪,gXkvXb>(\~B-8ҭqQJ;u8R|oms'ne7g]u9S$W4_`7ȗ8NJ:p_*v#Kx觧|GMLתJIm"j[nGS~炳° 7nZ_vÿ;sI< zj]g s{ $d%;KUn3b'ot&d& Y0,WC"9wAT`2%,J`RC\:j)v!4FNkU(qu14="ٓ U!1Hb 7B4b yu{4bȣ8oX%:=$˨H` 8JUO:H>E8ZnB;$@(]>/.1fwŬeЧ\}9tD\m!_}(Gd`z93 ²pSi͉+8*|, rEP䋌3^ \NBvLu Y@xvMOTӤC&GS)PGÓL}xmydI@$Q6keIUYz佴'qp0C)JV A?p P.1ޔ-7Qn5b%LVk@f:X2ly)Ju>ټ*tc;]*Ϸ<,yag:,"VM֧pE-aG:V:jV nc5j,`<َN u f˄+\ @@檆5+uKBJl7KK݆5F^K^3Ԩo}my id 6cK`<]e;KR0({[rT/|ZnĞ嬺4ƞ Hdpe[9_Uh*6O3`{Ys0U)ycOSvm֟ғ"'ycߵyndd1y9t{a^-Zp>\/W}}`fTtߜ*Q" ¸,JA(t#-g@ؔ/}'.lbkKGW fU(6^ ^Q(Ϛgѣ%yШukLDljWV&{Ϸ.$>kZƴZiMv`\ܼ. v@:X6mnhSg7k9`%2z|ZmnOE/"UqUh}/\TIF>KN>ԩ͹j _?R<{/.9=|'zkMk*r UJY:I"3*NRǶͦ^泣PiL(&iX&y8ݎAO|(ѱx)]`W+ NH㵪.8߭guDu;JFOaij>Hn>iR}>Tyd/ %ޞ9{SI1Mw깟ZC}z{_[}`{BAg{UUWY45ק0ltwŀ xIA{H~}W8 *i7eQA5 aǂur{ƀm Rvp\$z h8rGk(J?HWwC{df AHkv84Q慧W9B>Fgq'*`8i|{7Z{HfRsɓ g@wLUɧ aEg{e'XBS HuWa^er 8x+v7exnbuh|e)26mjDyI4℡[䈂xxQP䰎18(a&! ,I8w\N([ihb4o#lͪ p84aň4FQVäv[Yj-Rm+"X w܀%^LraX}hxe|||2]^ACv | n7sb x}[#7 2ucTÔ;Lkg|٫ܸ:.`yjޮ^%`AC U)rM89[#U׀ HEA`x0`2 [qaC@! ႓CN4q$ (zTIDIJS OC̘ FwV = TغwlZ' `Qd%ܑڰ&,*޻kVmfM1DyX/*N~,viȧ}Q+M;J* 1o_8rnLyɌ^Hexr5ZA2R.O0@@`~yyXVoa\ŧ~[}nqF3PW6xc9@ןi EtW Em_h}: v7⊸!`'BU.'>7?DezK URWybrPR5]唄Rir&%d p!*9C⚄by覇*ʟxECta۞tclx%IRfJvC ЪBZT*'Bg~禡!J""츳zlC>  _9T" J& Ik*ЪXhT@+H]T!/?+,jo6R2'v8Z6I16>{жw;C6Tِ=wKr>nwִ'o;w[HCw޹?t4]]_۞ 8-.cV0EFv/˝x8c T sA}/A9o`$GЧ;^jw8-d`x]]~ e5Cikt# & Q_ %+Oj7E-NWNWM5g/F]GNG|-11ҡ~g=P#uGUؚw]Q^pq#GAzpWGQ7!vKT[m]~9gy p_bx|caRۇhGW !K+8S!f$"|ׂQ:$ z:@J6((gAfq:.7XS(dxXVf5lur[cXWse7cn{W#pAҁvtPIh |paP`vhHtVeD(Q( h 8vE&C|0(\}dpyef%Qx'8XV8h~16vdAƌ8h6h؁H߸hdPPF! ,I8di(va4p,ϯx;3@kHz?FCZZ i,VV*2 zy9pxL6ۧk5#r`ON@wg gjz~+DQSgY  hBPHeSѧЊ7,CC2XVө֊M ˓{¥ TЄ&e3 [s"3.P 7^ufa yM0g%REa=ȑ5m8 P c$H/I4#MPF LO A?RMRS1zHV*β7CBʋU!pZIjKzIvGPU+'ɟ [5Csy7/N|ɢj¸bڙޱM5Xfm1,{k O0rh-\hLJckFHܚ)ohRtH>GX7É@f$~翃i@y':>zBZW9 %?6Hf|!"pab`G.8"!@Pt)|s,j4?1rংL$LG7w΋hfq衛J%i XOy YK0Z!`i QNi觅: 'nzcVdz觉*Jeg6C*7^$Nwih:kqJZlzY:ex&22}*\[il+++@vq˨(尔nk"Z5/ڊF ji!dlV;Zr,ڻr ,qrKju&lƬ$ 0B<)Wp+\FJ"ܴ"C<{ 5C1߶ r8W jՂÉp_A² v'гψv..2rW5ҸMMo拧]᳧)xŤ Kyed/N7o;8|]ijt¼~'θVU)&b3Zዯ3WJǁa ?9Ob9P_ ozPg f ŧ;Hs#TFWӽousDd8f+bz:){bKbLxf4{rn^e<7I2[YhB8*3 |R9ZS'}^6vvp y[TN{ܟ.^pI0猋W};=ٜfn)goJtv|MӫsP1W؛{6LD)8v韁w7>$5J7Gi}w(ɓBh^/H R\ߣퟲ%_~/g (ki|{etb qqkR72C~_:qx\qHrP}1t?eX%vu0C؂.ixOwqF:xi^v>g &LP&`xy_\M(T bL( *\N^hKjJH)hw@ n.Gaq:t Hq;pM6uuv[08CRZ'S+&y5mJy6Zֺ^wq-""XC EǏ'\W࿋X"9iBiz/boW}rWNue|wDx~ vˁ`Z}@]l1X}%~V(ރK>ݒˁ%&bX*&`d}R_m B v| Hd+i.FyZ+t@ba)d.g"nQCpR Zщ{'*瞔hI]{-@$Jtn eY阘b؅%!V~j$ljlgJ疼꫑Rj!91h|-"lr&$ •18SΣ z + 7îj:g_Z-.51F%CιL-,RqkZڒUuvZ>Hު@;]@KV]Rת^mc)@S`Y:h2pmsp;fՓ\2ر匆áW.,@zacDwp 8nfEzi#DFy ԩf&a(Phvј#m# DhuʠKwΘvsO;gF+1{Oh6jt))YΗ.U -FX ҳHh-:J=Վ*\4CYd%#ROcS'AÚø4d0Dix AT\/JUk⓱3V@UTZNA;*VлhD-OMYCҕI]ʓjiK^șdQ>M-m&2Q} Vtͪ7y]Ewd;:Ѷ[q&Bt{1[ SƢ֩%orײ4x \_i0ҴRab B̉ղtTuيԧe&w],?i6,ge+1ޫK:q[ӝq1`]׻=1SxIaͬgGƈJ+5YnhGb60+/VJ>07֍qWk[ؼ@/fxI=PÞ_h=FvHr۶ҝBĭ[5]%^ y*[Q϶0`_]*ːR5V2B0vw]Ϫָ>xe5,'G0 DXx|+RqZfDſ)lc|y)KڝQI?Nvq&bu[:vo Ų7url^{x QZq(xH xdV!! ,I8di(`4p,t}i) V+xȤlvC*etz+Ͱ{E tZ.į|nQjYYps$uL47f4Aj|~k V[`7710l FFUz  {^ӿVVD9qX@aHt1[v&&-sgs`*Uj֡Ub􁷑5bJ"i LJݻu]XNRLAl%Z\`*^8qۄ7y3^&sgƌ;;vmLgxAfHžtcfV5ի{M  +Onnlq]eV@Xu㝗W `@͉.ǴF |uwȓW@`yq6V{&m\y7[~'Vn$jMu΀:R鬁kZ+E-0j ' }- JKʝdy5?+Rie>By&=":Q oxϊ3b2d*; 82\#QZP2_7:SQ1x\®G lg[':%ҊBqC~|JU6!iSRƌ}B3:yA+pi%]Z5͹$'jbi'= ,1яB;CI Nz(70O4ϐo*&7lGeGTr׬hI!ni*#^:9djM@R.OST}j\^SthˎПd_R ,ҕtнTVMeYyOmƑP"Nk9ֳYY9L0(Z5 YEI AgӣU!- `fUV;TAarˤ.? I5߼,yTo[LU(A1љ9ނ {*􊟇; $e4RZ!![mqVub7YiP6[|h 4Wֶa5]p u-BK}un U_KI\K,pve(3&Z4_&%0[[Hv1cZK9u,#R0'̟Zm/]=F/cn2Oŵ Z`uzk;Ztz6u7kK9Qk[|ot7%[mn/yg W:dC'i_)2_a]q[>{Vgb pQ`ΆOzHG^w;᩠[hqo9ydLۦв)F!+q< gh9kJ =?>iΪ? w%dwB,1|;!{O]'N/--`(v{OS'|ͦϼs?!v> wAݦw"ߤ~wkPd<Hk~'~J5'Twg5oDQ*o30"O+.801_}ux 9XOg;CHx#7)(Hh MXvq(u~UTpHT%TZO]@Sӆ  gXr[kvy @Zh151 8~؄&]"! ,I8sfhX6N#tca|ﳮF,dl>!V,2l9 iUiYnC#ܱfjm ]Kvx:I|~[bz4r   ux:z} L7rө֭j,r̰oԪnOݸzqة .E2o)TJ>}"Hqj 4/D¿E!Wتo[2  u:fkCy*r'-{ˋF 8 ;$muɮ"4<#aRn΍NWo,-< d2s-x?+<+]ȣ=߫mϛmq[s7z3MΦR1И~9qwFw'4-mEzg"[:{{נ_'(QK"&zEwݯ3"D Yx0_J/5Q|jmx^gd7)?z*· nD`](($^>"8{sT7 rxčnB8 tkPBֽ|k&J4蔙L-dW?!"Qp<}LXj*V{cm=QΫ  { jSza;r"h:q|Ⱥ w"!ш!"U$2K "T0g%+YSnˡk#U[}g!KD=aK˼p5?WalZ7ΆH >mhs[R2jX9wf4d~m\Bs)F *v6, |?&bh\c/N={ۦ*plH?yHcr"{}:US1a[~ĒX$ٴahYL xml~'_WAz-%7BMQJY'(GdJS%bWA(Krє ]faxĚٚ#~گط&lF!y{#k@ڼ){)A!սg; mSAMR=AMi_py6uv!ZXJ`o K~Q6n8}eC< WF^cL(xY~&yb=ypddا12y=cdDAj`}ڪ BzQ)߷opaQv6OeuA; PiD9b|M? W[cR<i$BbաaqmO}^ǞE߰xm:'$*;8O4=[S|_$G(|^/7x/o \1ߑ|wQM~2q`0I$ .A m`gEQ] ~7#XgV]8^}}T'[0\j`3j66[9l<؃>&`e&@b TqG8FKV6 H@Pq_H h'p`BF]7bt@OwDthk*nxTP~FNՆwtHΜ/TOE:K=$hd5t'Z5뿭U+)6m6z3[|' nv oކ}动ϰ\u寻:!yZEnZf׭_>J^o}\ri6{k׭* px/b.'~6zʝ1ds#jA}ՒR$I6D 6Xr`} 6hvdW655RL&DV砂$psYD S 96tކBY&8'ZR,Z`d(|!2%6(Ez##u#\vIߓ*.aXrwz&(e;Điv)ؤ"X誘i I)e#xji頰j講@77.a))w; dJ- (͚^fƪvSj k!eMlSRK [,g^ #h lp^y9Ŭ#͎r>a 8|77opo7FSEqIsz4e0eK_iH`=vq,AvoZ P1ڨ KPF܅nxe23ƕJ+0}KVaW$e4 ~@wM(ݬyx .Bʊ3G' ܻ {9,mАȼ?->AÓސ;4ƙ?~~Cc֪5~\ǿ) ٻi09 |p#Ha?^ [d!7Bܡ~)D ʧ'Z nACUr(̡\wH/! w.Py]S'Ba@UOj0yzP Gn@BF`B'E}EPռ~ҋ  :0+݀'=[$)YAvOɯ/(6:<uV:-j$ ,I6$VKs#10: fl^ɉ c{mʢ7LJ7Q~t :sv\ΐ/<#M1%unM fS7>rXCf<=SUhHqxSH_:A`ݩlؽ3kRyYu+l^](c)ds*t&8[,g<2IuB<ބ C"Y Oőا.)߻حƷ~/H%bwxdO! {?Q`#t i`/24M_|d_~pf}1m$h&am|lW~V'TDT}԰zikgfSffx6,D~@:k' H0JFf%fcȴg! $FNg]~ƀ1(nE6ƕY*y:(|Ѓ&`/@bW HHoPAf^DCB 86D)U^%7P6dxgjHu8Myp30]`8ioH|Xz>EQW Uxi؈ Rhc@` E[hB@! ,I8z?!fh]4tm73@G]p ]h12fhzQhf#u^ A۝vlmpq;w'$bE\99Zil a"sV puw rnjWŰǼr_ϹәmܳKйjð> T)h7xh3a/(}Cv o 21Č ^wqƔG @|/I~+ uyłH5u͛rD)5,W).HSԨrLXUb1nJѯLz 'h;I9󭻬"K]zc-`:(c^x ^p JhX+G7M[AѶsXԋƭdx6^|ܶkK'cAEZt:џ/}v! kؠɛ׽6z9o`G=#qTRg}yWy:[Q4NCkq=]IWat+h!dy!U`(XEEZhG @$q!!XNUPۏ i HI>>eYgW)dFn Ča&eiV@'gkuj5Qe' 0h2sF C5FD'Aj>zۣF&] V_gZꭦX+P&Hm yu(Bڧsè (s"֎lx૒#Gj,V*! )$䨔cڦwe{o )2-OMr%cm |oiCRKU cW| l>˫_@:KLCe_矓\寮*;/O7(v{a! G󘗖bҟ~ӣ/ZP7O^蠶! ,/yߍ3wvS]T o.@9Hx'>aVZ@,'>"zT!q rPZbD<DatBzcȃ WBAn1&K_A/AX_U>zq*(8]HE1'? /o$ QuЂd 4Rxt9\rHɱq ;d @`C/4$R-Wc_&A gF[^ 5ȁlJ!\Se.s %Xd6CxSfpv)ߵScԹN\&"k0 zQHӷF͝gim046ʰv* Al'&Qm  oP+2yd>Nl`(HiI!aeEmPL_0EFlD9Loj@V=ORoygiL` aZtځֵo16|po͙nᰓIؾ|! I<v]>JuM`GڱbLP:v[,%M6Z:v kKǞ5 #Hrˍ__GBnLo\8r~BW;xt|{HȥD;mֱpU쯶Ajumc ޝֿϊO㳎y}ˁw˯+Ti6% QfDMwj 7qgXGs$[9FgAep~4DusLV WpBHk`y|\8| +Ȃ0JwtW%iDɡFڰ(jLXPbRȉU@(y2@HFUxDZ]x /\F!tx 2! ,I8׍[ihbc4o#4ͪvpX3{ Ft6 Xr˭Z!A.fLm/E V2mXn&_s7NOT|l7!s3YWW YYIkww Ӿ:ȳάثݰͬ~7p[/ DTO3Z+` cY&SxѢˌ1xX,ПO+ TQFQRYAzđk'ѡW݊tk/MSOl+U š\&H0%I|gѪVQrj.}*wr0ˋMQܞ_evʹ5gawF1@+I!Tʵ5Vٮ+O\wmD*lԙvߑǖ[CPm#".\޽9yХSiMKZ!w'!x%ǟl^Y$zRe]FwG,V8!spA`^!_"ZGbB%(d Q13<&4>b8W*`]HdNe4YM٣}AbfGjh[ rϽvӪϘMGEnJ9Y;!:m_np#>x•+zomp-8s `1%~_=5RJq"s>k!"VK&xhq((5 ~ b  `ޱW(L5xP{ĽF8YhH!ֆ>M@LnG%`V]L ljP3",;PQEz3Na"\"6VH,!p(4EL™4~,߹C RW"[Ғ͈giJft0R taEE@.#Fh0Dg }-jۊ /a] vlip+\2A=wpI'4ŶEH 0=*#M#tv28RK$6gN@ jm#%?ɉ!<ӣGj- 7Mg {3ѭ0O#KUJ ;,H!qzRrE)>F4 5ep ӨLxѝf4MChlĪ4)$dfa7e ^T;xtdjL&(O*QֺZulU&n.t'/iϢ%KyUp=5Z\治Jvӷ~vbSIP޸Z =Fմ<9G/0aRֶ#(.\UR-ٺ lʴ3ЅepG4g\0}եt,C0 ye*ťd`P-qjcYQĒ.WR]9}W?20~ڌ_^UgEv%YϬ닩QC%*+1b2C? bW$Kլmm85P9^i/p:h1AF[ k"}UmʨFgJ[,e1`;2㕌~äVʔ~]-灰ŬQdPY^+t_U-ߣ-B%Z %Y5[ΦmًV +4M)Յ7X7sKS䈿qI mC[t Ԭ5`L!.OJ'=֢WY帆,")6B$@-=ӄ$ɧ|IWrUG׃O e jY eG؊2pWLXXo8THnBnsX聓|8Xp3! ,I8ww^8[ihbc6N#t 6kƵf(H  44$I(xLόٴRkw xyNg h~:dEO`puswx{~ gObPwc z#~2\ d VW~}E Ͳʹp;ª ʳd9w٢f xYJ|Ioicѩ$B PYGVБ\羅M'-#:;Lx 㢍ϜuY)8'FF"\u12?ȱ9 mGAE0RTޔtpK8S/*:JUGhӝ7IQ:\@ɎWE`4jVmݩWQuԮQEBUM)brq_]ϋu$dRuG= ٢ŏhe@QGmja)Vg!/,Ӷ`,]3zJeaELغAJY6:o1H q rf-W)mQZ#)+IFYTBւ;o~K۵"l5uhiYf-kM[c:/r^:SHji/f+Vj|b=kh 6:͉_C m;|Ajƾ63uܝ;-,аFnhҺ@W k-r<$yY[3i.{ǹZܬ֭IYslL7 mЌ̢&u<ΰ+skPހMHvޞǙ뾒0YKVgB_>oaNW#`TbK ynE&CmRQI[zthe$2wB||8giNP|Lag }( y_H|o7aXpo @] z SmqhwqGZD 0ːj1z]腰苵 Dh{0^X(u׊X81XrrGȍhw,7e x\N'Z|0MwVhf7u@en]0 I2XpmWEI4Q ) T" X)I%d%/i P! ,I8wN(ndihyN6N#tjõph:q0Ć4FCJZkEvK9(cOJfhw_,\\(߀$_@Bx }{y}}Y"Mt2lVgSgwz zn!l4c  [.MQSw} ֺى}<-1ͮÊh9^-lMlقMA&\M&{'yiT#Dž@. D.%g"ZEJxh2UפNWYIP`gx'|fpZ+X@rt\KRXi]*Q : lL?bA'ZJ&꥘i xZb3\<',8( :[9}bwʈ9,z*7F )E5ka;,6|/xڱjב+î|otiIPm'K%}.h \Zm@- V'' 6fa8XIeEUld@-ëW8F2~v4Lr.8;;~f\kh"MlJ ö]3$(i+GHU0ۛZ5y8N*@zDG^P{ AVb͌2`gi(9BUG!&deP\ϬuQW5֗m>d85ɼpF C@H+xC1"y^T=_ :T!L?ݙS]ArFY0l{e4QC EHOHpib̓K%!pECX`VSnVSPyk u>kTPG:wR5RZQI\)9LS7$yov- "u3MCTRzR9A=(Z:="(> JO?&^GNFD:g$eԳKK?>[u:+r(:ka[ U\UaAIF"@;ϳY (&X|RhnHCB5hV" w]]$$-fkҟjWyUW/~)[tyl:٦t/KذdKAc߽0}I łpY,60[1|MWO@Y밪9*yO9hue:?x]FlcQͲp>a K hforY# l`-V-]5-;+:~ ͻSUص\"25 ԢRؼYO[v^71<zɆkNz\e΀ [.Њqm1c[/TuwCu^ϖHy =DYy_Y zW䴹7qƶ9qYC̙1wW˧-w\#y cv~Y꺭rkLlVyJ`'oZ9ǧ^&ԍpukͺ4iֱfSCͼa}6P"wpgPw\oJ/'ʊ=1|S7=\*R^D6?2ًy+РcUZw[|57s5}wE۷uu0ci9=݌ksC{LoR}Կq̞uM &~wb)Vgt:1q6 Q$T)#ǖ~VoߗZP{M4R5^epA{8k[x'KwV!h&Ѝň8q(x#zm8X !YihVAIꘅOfrͦ$)YgБpbowU%ii 3Շ` y %ty0hPhbHИhB)%%OV CKهMW\ٕMVHL^WP2_Y n9J+Iui)y{Yfq4 ! ,I8#ⱝh,潯Mm߶|ﷰh+r h"1R7CRC1>VόzjpXG켞Qh(`DPfVk}{{|_suFUyk ii[qdZZR l w]se6i˼ k=$0ůWh|l<%%2d}jڜS!]V(0ӣnۧ>xKNJ`maCXŗ)ȅ+G !C7 #*-*SO n~ 9B?~:QIS@LrAI-YZhWaUZNgdp5a~ JnK{#۷Li6.J\]L2b4m&-Ҹ-'Pr5UyMXֳeOE8pk/j%?/S'{akWsKɇ77YEA:V˅u}'7ބ  VB|9Dcx6X~^_ tĕSl"rWXb~FGbDU3OiEu6dE:8ˆc'`( p!WIbH։$zbƈab%Blcx6 )yz5R&$) @đ>%h~^i* dX,q -ʠE ئʤ~%d0 צŜ-i<خ -_Ȧ- y2x'jk0>8Kk/ u<>(+Zn p2,o9\zo 4,|'ՒZL2ؖ@ګ*pOS!/H<2B5lfp)5{w\\B#ѵ|,s#Jy6jq+q3A}|vA]iq[ʒN96V'ntg83L,ثWߟ5faR.ϢCzʿu4Y{Y{ OLm~6}r.䇮~ݪZb+Yۢu?}._W,Qr 1"P mSϜN}C]t8@M$E6%a] wL|D,i u=xӛ PG/U>ae4EQwEC]_.9mƔB% eոB 8.TCЦ̱Y=w@#AOp<#ӷ^K..sp!(7J}BTpb)#VXt89Q;oIir-0S-T2\bC6*WمB"s"#)EHʨ׬\2Y8>d6NaBR;xtXI^1/" 5aV 2L7ރИNc;rV(я6T/FH!Z2ڴ\W%]h5A%b-lwT UٻF Q&t*PSVo˪6W\\Ʀg2s>eUߩxWX:ʩdcS PG,X5ٴ͞F/FWDB63[NUj>C؆vn>(Z%N&';ͅrEY,OIݙ}rkT֗^i\UR)}vuhSpFeeߺYl[Zthefe1!Խuo%E0E[[w`PX4ҩ;rXe3jov5F+}%0H Ȟ[Pε,z߭yu@7B^hZ|办3N3zЪ]w!W jĤ:jvH&ܗ=!; 0LdJu2XX!SA ck6|zH'l,>7Nfw8AXSѯFLb wF2nk;Vڌ{Sҡbsh?Vn5ͷ8Eʪpئ6W..}IYȵ9c3k'Su]KBvv[L,=d ;a#5foaIh"āIGTG,N%,](g,92-t!I;{^ݩ@(Q*Bl>򘌧V=ʕ۵Д++|m:>1Ϲ֭7츽0 CکNMCd f ]ؖUcs+ڱA&|Yײw^|7i@'N[p‡c 0:ō dӱZOvyU}=v uյg]C_w?ԗ}j_Df { H u64]m'_aMXtX jׁ q ,A ajҚkT2ΘdZ@*O.YSL#U"yrcMhA8G}n̄FQ!aD:؋0Oj7epPYS@^cP)فJ %|ȩN$Hg:iԀ!{Rlu+j ;:٢i4P;-pXWK,ح@lm)4EfЛ( Edb k zlv 11MkݒRٶa/ ĝp%E0aI:~r,`X $G&t42Qg˴Os<&5HqɾU-N;l8K/3 4ߘg2k\xRS 7!gunrv*jn̄+}uݏ+''eyS(a꩞̛n88_P:xZl16^{+9:lɺNc#7Cu]`w's̏o=sd_T{Vd&3~3xn:˙R{7M XxE9^4-o,WA ڝl]LEC-IlGh${|Wp[to"oxň}B"6@1lcKac`uE\"hq,zYFR{!@pZ.)pORoz ] MY]΋rsdՅuwYj5)Yf=kuv*5ܠ'"WVjF9FS Xkψ:' 1y, %%fHSQH:6^]b%ʴbԢZDԦ֙YNÍBjtNe[vd}yW:虁-`J}u\PksXw(oD#5r;#Bc5Bqfͽki*d- [6mQ'6.uv;j{%e%/*]9f&;nd}nygq\X/p)YoNW +н4D+ZeYl/y ^xsd)`:Pl]]Iv-| z8/,:޷ +w0AK;;(۶ϏtOAg1uJ{ "Q<,nrKMSn 9jJЕlF9ps;Yke脫JW˾wхir<59&ZM}Uq߆O`7B>2nd9w}uo<u/>@#;krr3vw "60ɋ; (7=, ;ҽGu\_{XƽF˝Ԍ>coze"sn@WxٺQlk :qA.c7wnKޗTgF{hqq̆ownNk"wZ3zH"~ V $qdy'|71)g:Q%tD's9h+xp|0xzU27z\'f5 Ga8XaW+gneȐ{kx׊斃xtBVlsBW v|TVҀ xVk&Ζc!ő ꗇ nr訌rXav1`Wez) Fxh"h名y X!E  (yɑ+ɒ"i i%y4:IqبuuHB8ّGْ!ɔUZ9e0u@*2[xoƎZ h|#03mɌMR9_Yk9y/e8P `RЖhPViP 8  9 ГaI.Ya  ! ,I8wN(fhXN7tmq|ax+o1rChTlf`zg8]gz6&ۤي.jCq'b9ey{] $vGi q$!FXh|h o^t4~yJ"SU˸˻Φ;ԯ43wķ⦷ (iWIۼZ޽#ŏ?da@>.UT|"fOA"8$={Fb6rcG+I'1àXZ[QHʐ2#6T'ַpneLot|$򛽪r H!妖iTIe @Nw(W˨?PdhY2 +|OApΤ4ڥMkE-`@Σ'H!K'ݹ6 }|ʾ3]{M㶭 ݹ7}Z{Qddk9Nn~g`UiW܁6rM(a~aU2X (!DlbPhb?>bO~4Լ0{%!s !%xI!cvAUPwpX%l dbIBWchc8FXS)hBF^‹^$f^uSUDEb5]O8@& ݜ*i^7.Fdb_Nh'yӪE"n*} PnRjqZ&[]{%nN뮵{m*'Ad,<(>92 /%*PN T.պ[r [%F;g -Γ*|_Lezd$(i'M[0VnאK+~_kU-ΖNѧK:\p0+;slbney+|7w} ̏lcRUc}ۯ=gya3}jxĸ-~,ss0_h).j,s #( zⓂ.8u *o`|l{6ǿ'$X'hin >J_W;IgDyPJtb W!)0m#zQhh:f!k9 G xO/r` =PcxvH\+M3ĦD&aZ$ ^ӫmsKTku:Y.u^;r*t@-D,]\~l`U_Gݙ ` 34tMICB*}ӗYG] ?u#52xc S<&'2_.Bq~VJ,;ĉjVVZA )81RlgxoҜēD <ҹQ>a! ˘[8sˇ^l(:1/7 ,st|yl_N,MFZJerUІs@fRdW,^ФcRyKXG֓Ԕlv^v-LKyvQ *{C(W4+l RA򹈹lRn'7#YK{ȺqXvi;ވܧ9# o%&]iVn&4:7,)0MlHF$v-/,t.9ۨ9 $/ˌԄqwW: Vc>'Qmg{|D}tqS zs=xMǣβ)uxϝw:{FM^偞ЋwSm}5'y3,E P}a˱W]Tr}; p_e3.}`ޢ#߇7 >7~?)HXwyn|&QG~bwpD'v~7DA 5kuȀ .%1aY6X&7Y-؁XO}me &h"s׃NqMH2lDsF ;a!:k0},?hB .}F tqMk''!r2xU jX`.*7ǃW`peg|GxK((x>O,hptnBgsp熣x8}4X(0؅8pE?H88}V;T}p'xgkFx(mvx-ԓ,Q6fޘ ُh QӍ¨)HakYБ7Ű 8(ɑ* )1)@Yuqxeٍ-D)3 &.kӓHA O&瘔XW8Y-D m>9pe,ɒG) =i,lUK`piIwYz!V;y370v)Y0GgS ْFP%?#1! ,I8w`di(l5N#t;iiCmH$xȤ48E1Riéz+ Vόz5߸η♺ or$Mw[z||~~ MAfhii o+7 J>tz3 ;ҔSH!0[y5 i9e4`vb)5(S+{Sp.?3!2U/J%(QV8BT=˕e#j *`|Z:(K+3bGUIܯ>fʶ-֋d\ZCșMtؒhۿ 4jp6[$RJLk;I,O}R\yՋ\?VFik ds3"%Os6j0(RfX]ϣC;C{s!IsiuS-%;be*iϟz^St1~?xk3}5B(btI8UTąC6[Iރ%n) 61]46JgbP PKjK! D~!UQE"?$dL6Q;%s_NYgG -nF֊jB H"|VjE ,狓PQ%FZb1ZV?jZt* y+i&n\^k ( $w칕6X*X RL\>ڭi9@Yln~jZBa.mj%*{.v̱e2#"8ψ?~a~f=[2Nȇ O8b 165r/8_Itũ"  h3kn$[j]u4(7NC4ڗcġr㚫⇃kՠH4/>bNQr^:ӟi\^)='dȤƹ. < \p!di`μNO~ykN $>8_kK3ٹ>T9Z6 J}LU7;pONf; ͂( ]u&$q?Ȅ2ipdВh?0.mIUG?N/$4~ Qqte-oS,YVB1ܤƒ,> .TlU;vw-hk .=-jʪ53$e@]n.L5nl.W0]Ω7 m:FӲ"a'icc]ιJgH)5Xw^̞8jޟf9讐 za[%ojw&~X$M Dl`S r42P\1Pt'|F6+5Qssn:yC$[|5䄥7icv!pmHHk9qt뼒f5ޫsw}#{9׸ s`;XZ dSrڪw>ޛ3u(;sqxؼBIߪ|{ >I54+)USI{3_sWo ؂swؿD!ys#mpYko7%6w}+'$aa8yxgw: ȁ7$e<{%7w(uXq(x:> XVR#_5$}$Xçrbj-rRZ=!2rAׅ h"VvV\>k";J!ńPȃ΀T8QuW{Æ|؇l7WDVy;|8(c7gHy⇚(;yH%14Pjp#xG(( ̗'5i@J{Dig<;r0fTɊXð뀓7l`),i E\$! ,I8di(: t]b<깬`+kĆl\p:< 6˥ p%4-Cf wU YXpmspovx-|gh[nmK@e}S\ x/?fi ïƱaz{kÛو LP?|2F֫Lj:^)gۏE (sPv^G1? a3谹0[U角EY7^drz0+t)472Eu`H$SP1ʪVU iҥ2:3TWYf]k(@lb$b.O-nPo9Yͦi Yje~ ,Y塱c9M]:-\1s5LҏS];0M`3{<ϣC7F‡QsZhѥKMݪХv,;+ uj"F !HqNXD[ǟyU(]fu[{ &`7a'ua^^z&ȣ?fL*t}^*Fߔ-jN<')kSR}Kn,JiNg%;H(}c>~(&ͦ,BJm+ᅇjd(Zz)+gִZܮG1?u˭>)(L^7§v #+囯 $*vlSU@I qFJNy|[K +\\Cin !%N1VW}u <@ }W^~ &.MӼvpm5Xͳv=3NJwǢ_TM+5)pV2f3rnl5[zJAM KK.9λs}Y)p 2nIyο'SuՂ|=+9o;kv2 Kh d6\vσ^HA?>%^$".k #.kqC@'E an |:D&@OY ޵c) NnNCI ΃MnRxƧvkD ;DŽJ'5Psڊ7)$ AȄ8s"hF>F}W3C a \ 6K=w| # țoSLcSJ6l["g{<$2mUl^;HPbNLR(UP*XnU[S#*KVҒ,7I7(aJr&eYs%?II{{A[&I?:ItS$B rڌ:xWvǤB:G0p9!J=NtY7*TGz8&=+S-4^gZBR"j]NoNvQO9Nkn@r,M]*/Nk1Ui{FȨS*VkTR*@DŽ&RCm Ѻ1eūJU("jХ򚆥$@i2@fG>FfoY`nd؀So )(f|~0D21!YJpmkW~63bL|}$o}X׸UM'-fKQFLX`i IG]/ZIw =uczo|'O|kPa`nfW.$ao'N%[Ud4"rlpwQꤩq/UUX;_#ɐ녪gVcT2,:yM/4rr0'L_\} =nԆA FFs9U6XV d)C,:'0EpӾ~LMBY>2]d"͛ '/DM.eNxN~iӈxypOy{OoNL(tGi;QyJo tSdr#'LןsK(㹼ir{x U]Eʗ[2rlPC<ۛP\Ǘx ˍ wwGg_}:Un댷W0!zLX`μk)dLVH\>@wSToH\~lY+ =};?۽7h'sa*~4eP׀˳2P$g!UZ 4;K&<~ey V#`؂ z86z oXjL=313Hr۶jHt$"> f H w+C#9,C|.}WQ GpQZTu&E~y'dWZQ(8qȇeX|ceQ4|vXb yVwx+膸Q =R> nnЉA' 2b/hI!K5cx7 mcsHeHİ(4wb(hy.V9F֌ȍ@ՈEG-H(Hk'{v8 x2wx 5vixi0$PbVI jIyiH ip/6 30Xs0m"ɒXxfhG7hg9t C !gG26`ILLf!B`! ,I8di(v5N#tivF, RdqhTl.kjDuhٸ ۙ> }sVoqtHw#>@0|}C Znr{qVo we0fhoűȳJc-O1Qtmëưɝ<@A7|~Y9cM| \l@`Aކ duB6bڐEPnܸ"2zQQ%PaÊqE0ր3$=*P2adR61e&sF-8R@)%(+V)UO*jիYlMKMXcmĉ6j ɹъLLYYB+x5lH^ʨ5Nh^ٍXڏQMޝ,\(=tV,M(P4dJ&z~+VrXK~Zϫ_zL;?|T _z[Kl;n╷ 텄9 AMHI!ǢI |T8<1bY`e -EJ^M[E (EyZ9#TZ[馐 Y`VL5[[qen&'T!݉vvY1Q]b mI'f)",6` j)ojv`*%~Q0o2Y..Mf鷞ve܊+jY$jT fvz+,F; JbCU% (+Κ+@#1iT% ,AjnI2Y4\sN1;EmǬ)lsP5즆u`rWāƪM&qZ2Js:Pk%+vvgLO6i`BZW|2 p'8;]7,SY^7OvpkLZ `}+奶{;.<==];YLxU6gلۯB/7.#7zzgU;g֕)S2'N}K\S).T1t*8H^qK6D+p m[&HA*@ވ ҕr)Qzcxkr\㛪 jWZ~nd"MRXvotq$?"92f o CUQt˸ȁQ.U[2 yt]8I6 Lxf3x@І^?U>nll4Moa,iED,Em{D Oʐ4œ UPT-HIR1,a& %-H(}/g3)틕a餌hJ!'D<"-bMhLyч ˹)e3A6vV 3)rNMʄDr'c P{2I@_1GHo}\#GS:46鈰'cĢ7>w1鑤vpw9@&GpzA:5Ps My2Hiյ:$ c| ɪR^LSS2 i-w&1$/±5#EžPzgP!N UȧJ+h=Fg6\Gkn_F n@7[ff~pdE4UUwQݹz1'Ml<[4J-pkYnGG_A3X\wEv 3y[fdPⷣlnvɃR TX‘U49꩘DR4'ݟN%[ ^G~9"+ooa~vc,3%yqQO l2Uy?/;[A67+V1WYvUc\qo 0o9m"s+]I(zt18v<3:s.+rW <涳O!7G`F2qMU%$lsYf4or]sUվn1ZEyRFq.yvQittUfr-=:a6X*UlYێ3dg[Y& `g-Xx;{AȦ5\l=j zs^N}xݐs_1&D<̱d[C}w\WbaYK=(S+?M䥹 upOC|}p؞ҙc <޼;] EDϔ Ŝytc|Me#waHB/3&5ywՆ]r ҾPfjz$08'zHRڄkw}W{f p9p|~/R_r.8s2iSLe}^4F?ͣOIϗwg~/`/'tVXV"yWd'& ugRs$RERLĐ?(S97T)8#Q5118x$r)x"FDWDGuN:_ұ(cڥ ‚_y!xCuUXYȄ/օfF,QiVgЃR/HlˡXazu(`H[@W!cytv>hh^$A|u<2؉0CMbC>+ h=%TfGet(ЊQt6K9L(tql0@e0}иqJZ:HuGeHx6]tt4'84:6x0?c#lz .#[!4z pY2\؏!7 ( В$i 4;: *;=ix$:G -`SMiI 4Sy!| M! ,I8di(vӼp,bj8z߷Pfh xqb4ث =.J+vhE̦芢rmkpprux$;=P0tnovS1t wFD  ̷`eEsIN Fpr6ѾfmƘ lWĮJR?j9ӳ8U}04Hd2iR<_g5gV`+Xػ &eQ;6k0ܸ0puz6M}rk: sR3h6\_6],l4~ML١hc Z0 ^3/ *Bۮ]5֛ß_i7EAsEǗpYu5%{W3$q%Q 8 {Š &Xa/.6֞{$2H߂ 6`v!&o`t^R]A%c"7%}7ZѐBCl$22Z _TV)!w9ta.dQ^mgpFyDĢYBE`禠 #b>hy}*$ZViO[w$yuj:hi+ &&G^[t*SZIk0츄"& Y[ApꬲolR/b.I>@mby^y!#+T @iw>kI:%E q1w6Ol ,0dɰl "ps9,5Ͳ&%I=.ap}㒽3N\ea Z{^hp khˌk_͘=$k]o~ L;Fc4ҴUృ4%+tweF#:&Y$GI.U_~R"QFT^M3։# 2jOf$9z-`G&iOª:xjVy)1l`-&9Voy^ږiK%Vծ\ĝUh33S6/bF)\Kǖ֢&wW$zKճBe*z75U;!]SE2c'ɘ>aTWZW 55_j4DW,o5YFTBp$cdujۮOkOF"(yWRMU*ȩaz #FiX[3R~U*`QHy=IGTD[QՏgͷ^'U^}!~K9X v#t0wI4Uk Nbmj<&Z+:fUbiqrp v1;[7|>-EK*CcsYS>3b$96LB|Bv-lSRt)/0ktk?L ] }>f[[f6KzԘ bE-B]C#b~P4E-m_s ׎ףgn{(E9b 7N'Bmr/PY' c3"=;YkƎf8YB(_m}Z0Eܨ\sK[Og ots{y6c7qxڧ~)|8gdHeJ t%;e:6cYf:VBe)7HuToxf?BDFFGGHHF989:IIJI׏8;EKLM SC&M |B !@t҄C`qcfYGzɓ(E(URp$TR F• ?*$R#Ҧ 'OT`GULLPF 2 ۡآHC,UcS(j ڌpuo߿}v4<YPMĔגP@jwaU \JQ?&Qys*UJTB%rكTiM 'TW†ɞZusȯbb~u)إ*ЎMFhƝcUX! 'H(_u߆oOũZ JxWT_NUP@_w`qC\{ G!W40NPi@ <gU FXɱG̕(&W`NΆGf]$Xhٚf 磐H5'fWo` 7YshbBU1]Hy#erg±&싱Ri1xVp9z4V(W+ Zknb)1Y<:xbk*%Ec*kj+k0Ykvw:hf&^v)(+. kT×1Z~N^\X7q \[@[ŋ Tt78DzE! +=H}K?<8`v$a;.,}4 \lEk g#CTŌӵa~ZZרb~ |vF~x  /'p85 7f^y En褗n:&_H ˳ʕ6U$Āwkfm ŋނ \ta9Gs-0_gi vqKnF. K<"b?Thr@K5NeP#Dh [_!Tj֚Ylw=n]g3'~"$<q*k!X J[EגtàM1|!yö*w^]@3bt&It,(^Ff3ֲԄh%4گA!>z d$*Oqapp:/jE%)Xґd%  bP% iWDcP-HdU6RYd S1]Ɩլjp8ٰ5 r<9WNX "Z_čt#6tâ*ZN1;Rì#ߌd2fB@gPrTk&;#K>.r(ƑO{ DwӦ8ͩ E'hZ3mfowˡQӇ4TZ)>M' QКUKZP[Y.ćVlg0p h2WW̲ڴc*w)NP~-TQk0V M <\SAkNd4^F|BA@!eW͎N1;*@G|Xd߈+kE#<-շFevcivo X w^\1&b dSv.aGIV̏@ |b~˺]$o鈾ڙn|`!%T`JKB w u_5s,` G;Xk:8+L!ۂ :ytbWxt2'XMn2C|ԂB~ ^:Q}mv%!'FUr\~ijɧj\F/wu vt}\fJ2/s,,2]l:utq; K Y2`:vRvbJ6(o6ɞN0Җ2ih`|ןNrq;zw!` s r1p&1o]ꓕ/݃-ޙHCd x"Ά1{Y5@6.LAE-Bl  3Էrx_iF= ol;P^bՓKvy8apT,I\Aŗ~]< v*dvYVu5b<^V7[<{!''חY.}Mbr"| f^v'uqU|K&W","{Mb'B4hxɵZz&_1v"(t,cXo#z2ZXX~mq$)<,(ubSTuv7sX'v1-f"$?BDFFGGHHF989;<>>CEHIIJI܏8Ǯ?KLMĬȰεH4T[]&N>I` }ˡ`A>BٹiI6lPAOR>DN<,b \|/Ph0A A( TSQ@f)U TQBMX!P:t.C<}:(xTέJ0B E0PdڵmƕKw $2O"%*_Ep$ȑ@^# 6la,DG]nSv3&Q*S6{\6'5hړqo*UN|ͬ n$a让.{0Q" +均M9AvYUVdKQ[f`BV (^E:aҕ՘lG}!x V\cYu`z'Xa6]@hMؖmߍ'xŕ(pWhDhs,Zt(!mPvYwT~XXܹT3ZEjIcb7#fM顇Yj礔Rcg -X{U]W!nR`8 F fEjU( ""lƸ]Rjj)4lFKC17Cz jǖNj٪ˢ *ԪEZ+ﻵb)= L2]GHKQv̮ClizRƒAP#-A_\ Ͳo1Fr1@ɷXH̦h6 +țL7Yɵ8 b2%~El "+O#s2aci&&vsxZH+1* YM*(M8㎷1/r݀VCjdY',-O ljf4(<4pv4M;|]8Oǎ"ȭ]Oʺ:+jsZЀ[\<j~t@Mxk\8B3Q͆"teEh[07ul)UƸ0# M(+DP~DRW &p2X:ƫ|KwH$(Q `[@ǿ5 mb:yx 'A[b G.IƓ#D/t d@6*/O2O#%JGq^$zȩFz`aE,BϐCW>Qd%2+\qt9um, y1̔D]ԧGFBt e0PF'Yd(mdG>֑49%Xja_t"LxlIO GJ,q<*L.2- Vj4t^f?nf"WPrb3΄"'-LFOFAQ.&"Eӌs7%*)ԖFR@2I\-,+ĩT[TЧ@K8^!t$>aSȶ,Mʊ|@Nmjsfb')O:DZM5*ڜ"𣥕ƛڹ`%܂ m{(@]9-~"q͛fxA(FUggŶ1uBl@2i}bX ioe-($uJ+S]5rXt"E+ Q2%YJbn L y˻E݋@R^+zUN,x4I- Ȏ%`Iʼd{Tj4fZ[!峁u%RgReCZ':Mγs12 :CFP ɬE x"fPN}$uRZ d:bS|M+Tx6&%<5Yڌ'Ev:Dxvp ޻4OPߙ/.Ϧ;ꌛz\ˉw9h^e% N#fAEy% ;=;L.w9r2=d~bVqrr|'n.@]rя~i_Z[Ò!-̙;,հsxUwi±B,!@3+5JkxH?{iUN#nnkSO&ƂuЃ{OZ܇l*U1mq~xDx/P D~qvF} ^NY?94> O+ra>EV0O/YI|/GfY3jvG8"a"}6V'Lg'm#XvQs qWw;sUd...'|rB 7ox0~kvf8Vlepr+EC-egxidܳsy҂Dh$B 'b~ƇwfsTUtruR)z#/ !qR^ĄHszkkx<#Z)Upuh҅F1Bbx-sf7fhfxq>8nY%Y'(b/Ix^=АE MgAd Fzk ХДJ瞭`V`f l gv&Uyzq} jy֧; 𨘊! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw| :;=>?@AABCDEECD89:xA+ĉwt Y2ʗE̹*?]Cy`m}Wdoa[3&Q{US!a㦩z1!3oݩT1*SHaqWbVe[w%~UXVh'aZuUl}]~ix ^a6jK9dڈuX=Fmi]1nx (\!T~P @1g"X wmnaْfP^n VPN&>'[cFU]rG!kRE o66 CHՖ!b*Y[G[w0 8hXd᪫JY/ L{&yjIG3B£&6z `L9%la>6hhj見nXtx_ e<*lB(fk, Hkܴ)@ kYZ$ ) kE GbkiL\bV,&Pn[-fa#$k9PX\ bj7l /곫+`U)z)v,0!& \D '_.O_$dDgMCyߜ*ËCrɚ oeuLZߜy=-5Ehjœ),;]}DXN+yg(+T7_'k>b_FR'?u N?D/=:ztS;J6ּIIk$]9ApBÖv i3!<iF7rS F.h,t=s"aC=P| 8qU*H2vh`˦2-nϑ6R0N)#\.x|(h 0 63Nuىqs{`>JoN$D /$|[ BA2&%7-N= ˪]9_ce$I9ZZk.IMOz ,||ZKMyD"sj!E'[QS8i3Hvќ2GwnB6MҨ=`O(8zt]EtQ5h5xM_O M39STb. ˽$ Q銬̢xxB5OCrS:Yv=)#EҬlE=Dt f\ t9hN"}'CI!2ia-*iV$,gCJ0GM_)4ӫ'6;@ٻjB odYrx-9. 뮼ISbq*' FOaQJ'\B7pXSa,>x£ ! ڡ]G+NS'g8(nl(A Cx7j'>x+8K?v)uWlfvYk|K3h)qY)r]s\w? vӇtj]g#p|,2t+?vg`Gf^g&_ooV*2'2p6vwx Hos$-HH'Wpw/7xp n1vKdh}&u!4wBq&T#BЁ6i\{`7m=/)(Ga@T!S /H` nqd 惞VCcV*!!`w?Wb0k;pb g‚&"`yP +&?m-"!C!ahR*sw2ȃ"*XjWrv%hQ9*xa 4t'vVX}Mdq1!!EhvO |SwWUy-vupJE}r'(yqZGA nog{I:)Y]Fі[Y "8rAj(QN 8[uyk/5JmMR|RU`Qym !typ' @m"()WdpXc9 r7J`|6{pXm;IٝΙz6iwn،aGfعYyLƓ ΐHЕ"ǔ p ydNՕ 🻀 G e`Y~?@AABCDECD89:<=DEEFFGGHHHƒ9;HIIJI؏8 AKLM @̸薬kĉ'N>|yPPLBCsJu Xɓ'< BxQmL@ 3|I%Q>4S"B 0h&` 4lxh-A*# IUG(*+XZ(TZ:0+W]xNL(P*Go_-ǒ=Pl7sS2Т )Lt M̚qב'h).fI(Jﺧ>(=BvB=>g+#o^+&yÝ7VEX%ZlIGuu&WvwSf`XdMG]QQB&!WhEVVp$<5Zn %WTi;~L6q){6r Pǡ(\yXY'U*Ր_-GAsf"afnnvBv)x9*\Paɭ7feQ2Ry fE:iUC7 ԠsÄlw[ 5pYX)3Q:&kG4M*k VNYh:릨#) }]' j)|ry&B&\jWF,nAÑL,q{9_dWv r@4>Vbei8)ltp݇.+_7|#~zYefJR7.Y[B 4[pwxn'q"GbAtL \;b*xgajhAbG͸eW#jt[|on;@;6qYRJۊl#tVwEzSo:qfzbd/夌n+wNKoX(2Dܗ6sjgLꘑfdTEr@5z&"7q  bK7Qnzk AW!D]^mmL63U}@[ @αL1Bc@NXFxVS9:})d`%-)"qwP6 ).A:0jC U8K=q{cyXFOƐ0d|LI:]<.6pt%Yȅ#BT5w 3XkiGSsCT3XDe<'s2l'T7Y'7bq)ЁT *biB,2Qu2XY/wz)#P2O6& R8w^Hʹ:7'MTW41 lSmk(3ujGB:eHaMdb@)]%L>YFUc.AkԤ hZN:PAn9RF"Sd]3Y$c9ò5oGIjYD(㘶 Mф󜈝$ gsdbe1͊Umb^FDIijUOBlQ `!}ST*Pd:-&$ 0V\¹j{RX$YYiu֣):UtmDvU`L(".o2e],24+;D{W~H7󁌃M[͐gnZIe6W5Haj[P"֊jLCU},gH93>! "Ћ#u-l" v]A\$A!Ȓ XN_`m,%JL! Yݲ"aU1I'Qd?QۚMQ߫ڝPJ\M -8 X =Ao[;^k̉, Ck4f@*mb,U6H2,%qZdVF 6-FY*$^^k˰lt1`s,PH w (A\x9쓟!'\8-[_F4"%O ]C +Khkfx] ј"[ʒg Cܸ"&:QGx) {fAZ/UJqdUL+GI\u{PnEiK(Nfx!N7R2QI XWSg51nJ ᑈrcgqgwoCwa>(KVᅎxG BM lS*3Jx&~OH}B3S3wEȸzP^a7z5 P6E"/0NzVvmzt}Mx#@%@)hN2!l 錓fdJEUYO `exHMxHMh2!* Y&`08LHY鏓rQL@/ mF619Ž @fK1(!q6pg38 1dvJLPGo#aɔ%a%Ak)`p`rW v,B$$K@v8](PdtPW0LKrbZ)Ϩ`N JI mzi epH YI yu(Wyؕyfe РIpyEr׈^@ pFpz)YIp [y`TPi | 5U@8ox T Ig%jA^?0I:zmib@U2 ABI! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|::;=>?@AABCDEC89:3A)pmut^~+W4^NtA1sIeQa}YaY)Հ}QjtQWnwWXcjR}HNHιlv] &L6$95PшƠJNu[v&pLbX٤TCLD8x%&Off$m&h1L6uY#za%a :eghfE(-0ZGHk5u*)mj챩XL}y)j].({fFW$jYh!~'S6{ by뉏|IVHKj)0ح()E]oEGq坆zvh[lf#$8ᝣ9@v)e;Ğ:7G}sW<")!q=R'Jt/ۭB]3[pvl,`3#K{)7Aw Jl'Q{.#8^VjӴ-wخצXxZج3^3U+{~A(^2i/ޅǣ.WE>m8So}]sq|܊(ZKIQx{gZkCg&mB"1hdyN&iwL]|g&, - ͒)eM[L'!"] ."&P?!tbJ!n)Xp1MI(Xig;g@/t x# @CHjs.WiKBZc\ڈaix+JqW!f:kx0z}%>ow$.yN! ?+=_"S,} ,c)l1MBʅOs H8ZQc:IK><& 1R/9@!2L#IhrT9PӖ.wFǙ6D4jo)ܖiޑd/Ú΢|hLd AHC(B!Μ ZmczrҢGՎ^"z*҅JJBH(5bc$&iUEsU%]z%)"[%HR2XA凕ۘ$aطBS[0"Sɂ@}m4֡YpӑL{8Xޔǫ\lV?Aq`L A&lMiXӧ+^Oz ᡂو?+}TLjnP֙:n*S:s<jrp[#>IݙkcL^{tUd! o?d9M^4[cNLNA #]`VA"eޓiugi\'o=Ruԝ-G: !,M=i לo "`B2cA9ÜyEu"0lJ8YLQtW1}g:\6BGG&5n8-\O ϪM$=b-< (pM;(&iT+\-ݕf7IZRR(dBDC|pʽ ^/0(:4xB#SZfufyf1~_y,"܂؁or}|#7^c@juxJfW12R{ir6r ڗp`Uf^BW|s^duwdq#f$G#AR Hueu;`MTaq"V`(2/!;>s}'6LXLf"kȆQ#Hug E|~g|"(oć2H!S zBzƇAQwc=8!bU{E 0|B2G+yv8! $؉V 1(JX$"an[L28$zX "| ogeȑ^Q"4 TqwbY$pO &$G^U2rOUy OGhd+۳.YQp0z"f'j# 'HX,yJByJ2& )UHɓ9JaTM %k&I9YaO:IJ'YRIQL@pWו dYdxjDBZE! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|::;=>?@AABCDDD89:AHJKKLLMMLL ۔C%A^'8y6˖ x! (@N`)| !@td" *2# .\ Jw [>SS0A|ibN;@1ȡ2h*6J#}*#dU( j6C>Ȅ)rIH<7]EV+b蠧O%ᰇ2_6+E )I A6l)",_. 26xkPbo0X"⾆=J&JTܻe' ]FapèU;1:wUW1QJ~RwEQ %T`b=6YmfvS\vUz)W|5%BRL1]mẄwTNuUH2T`mp"b2bk.RߌWD%RJDpE0b fdi.]dRRyTVPQO ">=GB2h"snupF*ubWE i'#mJYڪQV̎ '"(a[LF 9 )&5ʊ 1Y^^~ZcjwjEZknb*x^'g'Aljid)bn{j)J˧֒XXSQ@2+.nC'Wa"d-b;8Y _hev/-ɯ*:W]=?4NcKf%j1Ӝ,9spRȇ\c#a}I&3nEn7Ẅy[5jO-CW,^zDj<-kAMc/wאַ"Y]י4Y<,-s댺u+nae^ v<蒯ulzB"E9m+_ SфӬQѩ_h} T*DIGγкq )viBbQjn0n:>V<²t . Nm߳ !Blf' 1& >Qˠ61ġy`qUR|d FLˡBjU2c]ѸU-,EfF hQ]4`sn`E{S›يK[udB4WgkaH{mT3^rZVcFJ'7綅JmE6r0Dž=~Xed~ 2R` <GM1"20=\&<45T]QiCǀE8 }¨6j`r-u~M+f$c@GkX$VJَ^,1ko$̶y1_=cFffiwm󤃌'*b&mKk)J3q;^VEH Ɂ^Vς&:AS9uV c :{l QvxڸcsC6ƫ"~R@MS6wt8bFQ*V;&q=Vӯ(cpa X*  %y&)rmIΕ h_h_ƣkMxI^UAzuW(l*ەS;:*slq{Dpn6ҭf9w; $d'KiRE-Kn꿭RG?N=vH B}@rj"S~-mIe^'DG*J9KNB':ur~**L~~{~'|P^Dyd`vhS_;4bm2'n!woSf@`yVf-yҁX#U8! [zlI]1tV&X#3&']~yqf?3iF!6!T y}&f%VQs6gp#!oY[Wi-TׂAaZJ## hUN%2@(iMfP Jq2( ExRЊn^D>2)sbnKb1FH!w]LB Ks4hsL"knO r[ 1cyk"y9(،xu&YY$bN_،3\x舑ِAh># 9D!9fk:M0n=b]4F6׃ L#n}HCEY$IJv8d{AnGx1p5Q^If!`KYGr~) 1p9X(q+x vdP Etѐװrv,7zdVS%  G8 brP1pFVX׉瘶ke_НFPҹ5f P نdeYɐd IЙxi-d%*۸Tuvp Wo+vJᆓС#+! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|:: >?@AABCDDD89:<=BDEEFFGHƒ ;GIJJIڏ8 șACHJKKLLLL ;$L@.tIԭ{פ?xamkB*T0,B& <| '!@x"T )X$Ph'SlOpTF~=8( v%Ѱ;NZBpG@YQN;{v(P 0d@,yT:bmQAre"BUt5>=~Z4:LA&oP\3oΧs %7` {`v)RH]J*TL؞,b71xy5iRf:TҥSnD= _!gzZ{m0Bt͇}'XaiGfxu&?p_Wb9$'!~ZxVhޔx FidJ,5 tNPF)] _Bx`Z"0^8X`pZX=X@?Ey%6b,HYhVm&39 ^<@V?`}.Sh(o*Y*m^q xAe8Ab5B&{*adi&k jjZdŸ䆫j߬͞MWPB~,hl+n{ ̪n5- gjsr"W*#x;.~_ǽY0x[8"rP'v#A t,WJu ΂0_utCuOJ&fd|CXpbCơ ܥc8˘W {S/ьgB|Fr nDM##IFXH+@`IŴ%pӒ8:5O hA0rMDQsJZxq0X=$GxU$CPi.|a˨]2\@ NU@$'$e[E\awGZ^ͲL7*@V%NБ\,/.;w9Mlr6`": 8Ѽr*)|Y-w6@R/bD49+0N!;hw&Cшl"38z;Ғ\.i=̤N܉La !HѢZx*͏%M(!J͢fp7 )lGAhG1Љ qҜPPD ?JM.}vBalJC?SMj1d`BA^vWz@+^:X*wbo L )urm%#(լJhyp@`G1eOjTڤ[:xp+[!ܴ*S1(m^|R7.uv vitD-%;f3BR_6Td`_ڊuG1N!K]ϲL(ۻ_*nDKq0c .ϲ{IB0kR&2|GrHdҔ$g\ pcl|A-w+d'(yDT|^6kO>]zZ@,D"$Y䙟rIw~3xvAD%r '$ӥ_ѳ/u$)< dNbҰ7]YA{ps\-dS }caS=+rp%E6q!xIYyrTSB;aI.q/M`% Mp!Xa8偛eh-UђJqG78>Y@ _Fj'qE5iӔ)KؒW9S"{<^Q`t KX-yJ B4Nsb^p되I4yj\|s S5zpbфҐH~|i 6 G@dgy-fx?@AABCDDED89::;n`װ6p΃*Wі# AW8=xaޮ5h̡a@N% Ƒ!(A㦕 ٵY~n H2QH{u%~{P|bxѥ/_:tgB w߽ XE Py^u\iʙ\7WRx}ؑPwmSiU CO4WtSHŋUqaV\Qc@T5uhx!RP_tXC @Ekҵ XTVI% XbWz@ g# ڒLN1Uh%X`qEw^ B \Oa0Hi:es)餒[M_^%蠅I&hTLHfE*`0~h*tTL:tNf¥g|(`hsźwֹYhƪB |ѧBW&lxlʦ.,|w٦mh#ykm 'kn.|B$=U}F/a,ݛFI@'kkjՙ{o,AN,XubR=k 4[pA]ki#]m-G^ :1ONxrݔݵE+r4@H VI-dV' AW.{Bg"  A-(:k/^5<ݲwabKOmIlShýn;E $ f‰OgpЌR6U \_)W7e!2mbhE1xo#`>.$4!*D2\7Q,c!U8OnC?~Vջ ^5%|;,\Sx) ALDou9H ]xBJ wA'jz#RCȍyvcG>4)ƿAD-5)<$xI6Y|KNxN'5-rca8XђD-џbғyQ%z\,F|&4.Bp9/r I5El`$=Jt{*UMD=a!0l$ *Uר*02#3 ZЃBOd_@*FDu!Ktr+a9T,K[PƔ(>nj &2)pk4ۉTZv,%4be%NS3mrMG̪4d5ӺwaF-U:{h;UL*lVN6t5omŨms5n9]\I.[oR;׆NThoQȖS*sYZ n8hICPX*ZIO`64eo1_8 & av#^PrED{@Xhܵܺ;kݢWxԳ“NIpraJuL]e|TCԶhiO6YŎU%H]L^9zTaT=n/zS$\~aA]lC+鶢],٘8>OvBCWJ?|fsC!1*UqkxɩezvRjx*anTe 9}UVmavTt!Qe,aBZm1WYxRڡv1p+@ +; V"MrJnnS*ಖ8+;߷xM9i[&9^oOy($1Jrl _/ϛx&` 9A ~7xmГ"ZG aO2ǯpHU2+ Vm1NQ'll\""c[vNW!zYOZWKCWt[ao΍= ړWv1tFe؋ ҽ~RTϛi8d)e|' SH읿c4ۭ#|uڗ Qg(BF**}2);S.yyߧ|G~U{eDC]A'gUL72'sr#QR%Ul5:xuwt$ph#6"%A7u< Ch|e,hRR!Q56SeSCuez#q%'Q"S0sΧ2r/]wb7?F'v#1(n pה4d#хi2—򈐈R^,9B 1 5`&\kl ∐$A0u-u=&Cw"`pbWN(j [a!K t8 KF}S8&7P#1䁌~vSXh lHiWoHFר$hhQpa4F(=p-?ȏɏ Uot9ziHwI&MPqctlxazAk(&$y'L + ֍c m$%Q MГt·Vc"mlH56 2~Ɗ8P/YAEä ?rK@Q[?0J%npYIp`Yr,Zy _ \I uIY+U@@@pyyDgffF D ? G`)~]i5qȐMpFBBke O FPi6ioVVY Y0YPu&kɝ@ xQkwFBHU{>:`@)ikz *4x }ʶ! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|::;=>?@AABCDD89 YʓO@d` )͞!!J+( !!@8i*c?$%^DO "٧OG2BST3 \-`AÆ"54I(F6D\EVAy^>H mċK(Zqdž\ρI5z!0jŬK`mbje#fvYxK(Q³]?S>Fغ[s ]|)Zh &xBs=Ne]nėo 7R7ŇS0W$x'b ރuĎ;yK"@VaB%xő(\LE0ʶS T^ԢP&M!AXh^jbB'ϋ& OiM5DZdI%暈¢oMMٓvwZq(Y`ũ2¼]3Gv$Dc鏃i䑉갧` *J$q)bm d먨jűƦ *aOP:k{&R=z*fކ/+\ Lgp{3RXA-Gx-(j0p$s;O+8Qe8߬EmN\ b[Ť~oTBzSgv2CV|Re~&,59st-Wf#%x,|_ 8-9ݔ*`#-c #~Q߁tm;nsvS.{[`"K1@BnD'ⅶqܳsˎ +.גaaPȋ:̮}ηKEqN? 'K:#EuOn,B -D9P0=QK0j[[w%z tgbk0t L ZZUL_; ºmcf 8BKf+b="rY]! pё $q=QN^GQXE4^bpB-R+PJlƾ汏XZ ?NNJ˵ȸCir/i7+!p  ȤQSV $9R|,ⓑ78JlDe񬵫l2t ht.sC|X05ս ѝ|\', "7nC8PCd1"U:hKS qz/1|pX(rx!eB-e;M OjZ Daj-#6:zsvs`&NMR,])ȗXʠFYkUEm 8 ٕ4xe6([[Yd ?UY%$E5[o*2L,i]C9ĕΎ\e˟4Ԉaaiu}KW5pQ+j2DfoM'"$F>SCap}1KJּTN;L`?ν{̦ľly;OqfۍIeͥRKBBᨊ/{^/uSγ/1:yvӕ4®n&l+_0_{q4_]3j׾ɲft]~l\‚Ԗ6<'gf:՚@B 7s(%zDY8g<ŪKqW'oي߫y \PqGj} B֯P@5% 6!xb 8AguC=G&(w# zUG>Bb_\&b ) Ge{H$B"R{c{qW烕(4h9~1`oMaXBڴ4 7}WЦ7sa`/pL;5`pg(7z$RT ^$280jwjJv)7z,X$[Q HLVJ(((.BS [~)D%PSwV>?$Ah&S E$G=0T"|VtsMT'3{Eȅ"& [s0BPzxnUh I@x/uR`Y(Ct}v8: +@H&(&x JftQJЕd6cQ&(H(u0dh_8-J a>2&ȨK ;QSmtœ+ĘܸZ52ib.!!S1 CLqa~;Vca-}eڤXqOx눍,-q,uJuaYjR6|IL@EQY4WX7a%(ђq/L=FRfh a:L`o%DА4Հ0SAtMn.Ja$ 1Ipu~ODVpP!X Ԑۀv0EHxTO?A[Ұv) G k~V?qP8 Biwehu N iEY'vf >taМE jԗƹnYX@\i׉Pp?@AABCDD 8:GHIJJIHݏ8 IKKLLK d YvJcҤ 6A>o{! k墖pa&P0?4Yr1bldZw2哣PBi(O41g](̝G.ĉKq] U/_qdz|U!eف]f}R `F`cSPAE(V(b'6NY!HCM PYF!ŐSfbV$i(4pQv5UB3@F!Ex"JZqŚN n頔E#n񄣎&؏f)d%Yk&Ţn61vCmܤ[@q } cif'"袋f 'T&NXN.yjZBZ"Ij"결 +*RyYI VI(쑇jjº˺)h+fHny nb,碋 Xi픉"dy[&^A ,$̮+X EXPl*!k? t"$M &@H@JQ)u 1 [ -tF?"-N9ȼ5_Y%o;L6[p8 -J,TF;wrr9Ib3LM_τׅЃJf@D)8X ҎKVƄalv0,mO>:Q%PTe#CWJVA{ PBP2I֤F*{X|$IIJZR+H!B?u&,2?' %HA0erlg%3[Z t_TO-;zbw3sdNYr .YOV:" gڱ Htu#‰ a~Fj#L]|J|[B Q2*`m%0bQ^ YPa U3g ¨h&>}9͐q ɿի `XJ{*/LGB9 8EЙNHvէ{ *JqOZvhL%ǎv+wDc VVlgAgZֵgaո#w(až޴wN鰙%P 8ʢlfٌ9W\uH:-)PEP㺏཯Zkת+{upZv>\v|I5S.Hֻ4)},Qեp!B4[/AwTm}b>eBŦUiWx$Cj!F*v*`)3د<K.@үSn!-8btډ=;bՠB^&.صdPֱ2-Uj>'VFs[DǬnБG<"ʹ[Ȍfވ$ceѐ^)M0qiTFkk,[~sg\`:|XZUw#rkҾnM=flSgKk=>`7k%vu{j1RTZbcurScD/au58zlSQA$3*ً8X%uDF YD%j~7ߝem/Կoײ&Z1dow.)O)gc@BЛm[ZO/ި]_=u]A+'|}>x5LدPCiWlaZ޷x50қUkB-MSyax^$zO%ozU V!_NY &`VM\w{S{Xl| tc=q;S?QIZ=".m%՚yH5{(_1IR}JE)' KEXg^)bL\JjBPҁT `TB#nMyV9%]b((}i"T@Vc oBGJr~Q)2ir88QF%Fp6qxUt1G"J_&ℏpMGD33uaw['I8c(`sBƐrGn2391ErQ9( T|#fZ#(&,e2$ (5ieX[5LuuƉe@=($[rXOsDB&ĸkbpM2wwuwsBrC"( ȶIㅊ%!՘Q ʖ4A HqP""55 x'7HHJ8LW ɐMpIlSQg`8c ydL0<FM(n׆$ 9c0#f߇vmg~X Hy'4Q%yJ@)8@Gq䶒a7@pq Rg)TMY I|RgDTBنg P fa6Q8pB->i3 Gduo 4H@  ^IQG8Dw FPeBǵMHo䆘E &Xe*  ٛ@08╛-50HB P[ Vlp\~'HTuI9Iy)~;0! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|::;=>?@AABCD89:@a{S"l@AvJ1l2 Oɒ8&0`H (P(xp]…L2fQDH '8M3 H0%҆L8 1Uꈷ# !#\{  0f6_>eVIH"EJvm e!. 8,l%SJ]DTPY߾ ݗT5^įaL&&!EDA;*Zq ɗe=6uMȟOs2_ \pi.I'dw 'DfGBfOW" :DCi4MaF /RamYQ?=]RN'EQ)ZPDQdL# PF)exyG8drT0YlZe P(b h>#D&:#&U\Q kyu)礔Fzla]exKDY٢j:(W`1 ) 묰‰ 89'%Eh)שI棭b,*dA봳+*WQW 3i 1i6jfᮻ* Қ Ur sRKy쩌6nYhFr>Q⯇ ,jCa. ?1 K @1 % <ЧRL,>4 L7)Xɍ6|s+Cz\$E{4 l;6 p6@6ʷNf4ԨF%э[ 1ݮPl2P'H" ](E /"!j8І ET[vJVY:gz1L8y rtdӯ`7>ԏlU F@-Rs bFfԜ@ٻnLVI˘3nSjDLebQ @&I:ܼ'PAUT±Icp-Ԗcrx ~2d,XI[mzٵ_+p}s{LYLi]:颒9(RHCS,;%7o\^>|ڰZXZ Rx5/bM5,g_Ǫ`X-JH%LX|+/;v2]:B{Xg3!jf̟m*t߹agLczxa@10L8)\[U HѲM PDR_NOupT53 f[GCa+7M ΤE.wki3fϠ=F^ڀ6QbuZMb2[j{xssx~F2Wi$D^u#x/(emm),v<ފ+_ d "T}mɑ,"Psf84$\ْUm<`_UgUc ͓١Ӛ徯 :v)-X7fs4lUx x+p+8y8/5!Y󣬐xC`7TFmZʂhfO벿orj.}˾N~adYb1=7-5[W׺*ggSݍx:BhaIA. }',~ʧT xZ4el@S0i,k'2}L/Lhr4*m5gWM"}&xS#A2LX{ǁ`3r$7|Kbk.KxJs/CVFs7KE PA34@ijRa+XbXt!`}waGhz&c$PyYt(5R~WCi9_i^Gv2X?@AABCD :<=DEEFFGHà : GHIIJJݏ =@BHKLLMLK `eY.i-aҡC'@&u@8"pn-[)y'a'N@<!J'3?4YQX>>A!DNdpἇh a3QؔU 5:B:\W:}(p1B!B81b%e q"řyC̥Kb S2K!"_EI(…1ҠRl$Rg~ 8hYPU'Ѱ "O}D %TA@7T!fgh!蒯RMTя{tĀ+a'NSl"U ]w_'` vn+;f;-6UUg]~v 7!=u$?ZKY {-4UY%EfYhB8`WXi%i$" C#34O[81dfSݔ6Zw7R_&evbPb+6A&mavzbшtDɘnbhSlqj渧*®)'T1 &C% '&t$k*VAX^)vk VJpɖ Ji.NFaYKk *r t*9p(IAhK bX/ ۫e8kxK[Ki<2 + X I9{ 2udBO&cYh2 d]WH~1c`I*"p9:o[wbmfslL+0:ġ[jw<؃B ^X HxLS-Ϣ:ɷ:w[m:ě^xE3S-CåF]KJоKŐnE/>ggz"ഞʐ4SZő^{E^_ \@:lZH^"Ǵ- r jVUl^-p  h@}o Au5] ]@Bx\ >ǵNa %\v& U_x!zч-9lܖ%?'2zڛWaу9"E-nlX=L~K0 roc.\750elq%W^CE0y^Yⓞ f2!8rZ6G/c(IKZ.%C@L0 #2InY&$7򃕬lb'Le|VڒF6Sc|eIKzBHN+eg䊩 Z%;m=t9wtbr^iRjل(K9N0Z㬜iG3)j-h^Ɣl$wh bqu\gCZ."~@fI46mĄXJlǫNQ4)^JT=2h[0 ;rS u=TP%ڔV2[P ;sSm\Q{Py=Q!;#4yRfBP3/m5Su-)d#[ԆʓUfH^:Drz7WstMpY7= Ufaf 8U9WͮҔe^'[Y]Qm !պDfLpEni1zw}ZMn!œE+e2H`o݄Qoe3/wͅ%\]Znكo]סS''0n]K!6qd. [7bݓP}b5vO Ao3?ֈGmmFc/fJX+Pǥr4)zRؓ-1,US&64;#P`VY~0f\=_Y|U_7 Z_P]qK҆ $yvXvlF6v+ᚻ\k-)wۍmK^HV̜q aSwwgTh- tyn6sx~7rl`ӓb}6kGS{!Mœ7a$mX7$5~mLlgG籘ˆVS;ڎWa;:?}shd8N|S=p]Hu';9fy;if(T˩ĺ̌#l_G˧qM" "r<;q+Wi{!-_Ԥf7̳.o,lo{aGºTQfPy y˧;R6+Ln[J^r5tPջ G חvwJxo7|i/U?-R~w&u7~e=JC=b.T fdel}̶*oW-?!X@w8n }lXSw҄T0Qazp6kDA֒1c1LswTnL5 (+b(8*hFulsytuvxrR~YkE[PEu$)%# h>BV慽e''v:BF,(1S4ӉI8/ONP4?NF2qxywCX#/x0}"h<6?^vJX(\A @M~t#5/13RySySݠ~&;K,7uؘ$GٌiM8Ԃhy9.A1d80]<ԗiE"i aO(.guFӘ؊qV;y@x̕FX4Fg 9^yJ8xvb# jpJbTLf&|%lnՐHPbTIyZhT5 9pyNU.MHy( 'aliXpFp0hngG&at Y)6[zD&9E\ |,I  ho.XԜpB0iLup [  JTpsO4HV 7y韁! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|::;=>?@AABCDECD DEEFFGGHH :5SS.=ٚHo'NѤȟJ+-ǜԞczd}vȗo> [,ϸeO(%\i;fq0f#\p:/}k!@M.n2+{7! <-`Ak_զY {`|2aXS?@D e(l.ghOq . \B 2DzfE 'L[2v~A+^Q #.1cT=HL~sOu x!~$ø}aa5` ~ǾIn!a"_^$6IBf[aAugdfYKZc ^BFeїܝohgR2`dmYM2,\7_RYy+qw9IXr-q?Є<"6p|fIO2tv;G{zahng1o̒n[$HBf/:M/ N8L֬A9Qe[2ܧ v,GH nm WL.f&/zBXNZ[Ys1ac(ۚtխ`̸w,;[߾$,WoQ*{闫 ,%Wtc?54V>VgZlKNꖷꞅ DE#8&^f6楳Qm! 0ԗ*̽vκ a2[SծZN4ґ^yc&sz۰M\o肂1,j<;%T ۴:pڥwI)oǚЁ]~;4ѧ^h[0I?큭>l~.d5UwL*7{ }GL∕v&psdޛC5)"sx,Ǘ@K=HQFA;e7X/ʏBDO(zg+pv_GrB̂Zvvq7kn@ j,]er7n`fwIz**YYе CB9'Vu__[w/y 3ӷ`fS{/C{^aB ìA_ͼf3^i9ipD6rOoOL_#cQӭr?5ݗ|b2!_\{{}elSG6A?3$(77ymczx^4A,LxV_zbuo'5GG*6A "J@bb9'u~>C!Bl5;zW=]%^R3^WHSsDfA'bMk#9i1W"#hJQ(R@ fflCgG%)3sg 7vD:j77\XPfrp 1#1gb9xL~s'Ry2S^8O yi x''(J J'}N猧hx'v<8օQÄSv-sӐЉ|vpbYz`9U`15"Wx8P\ aؑ,NPtg֍'pPgad8 %2*y"8<#-YR/"/cS3e9x1N0LQ@ZB_iN+YfhyS 4( H]Qm1qIyKgҵ07&5'?R-ÔXϐJGcif+KT=o9  |Etw9W EN@EB6jD$nRE xǘw N 4# МMUy7`B _9?RV; l& 9K([95م?9! ,dd  %+06;AFKQV\aglqw|  %+06;AFKQV\aglqw|::;=>?@AABCDEECD ' 6A:L@P\GMHBu5_) ( W\$=Wp; ,6s`v猷 ^ *ꨢbh2Y:aEZh "{젉VA۪pŸ?1yiXwcy,lɞB:{ʴR`eQQPvnIȮ+h EXlxJp* 9"a-N]Z,3̰#E>JdՓQJLH ++ J޴zL}19`L|c-H[}v,+($@5a`2܊kw2uTashd#oE>bw3d)zCk88Gv ,`z+8˦6/YyoC?o*h Nς?ȣ>&kIuι^p^-pn/Fʬ fǻn.4/<-`3bQmrĊj;ad`]E0ѕN|`hN ܗ@0po^+{+_\@C Ұ =^ Ї B컦%4)mB= IzfU}D]JJc3bwBTXl,н^ֵCu rLS60${ҸSծtrHo l%G؃VhGjȪ5;Y{Y.׹B'Z;;zA }lV% G2cΦҥ 9H殴˯~U;ް*s4^:3ٳ yX׾nIy; b -YvGM>c vXF}kͥ 7}=>=^?.Ou֦14yr ~o*U0Ȟo*E4?nķrBoWkh!ϗvcuM['|׳OZi(vH.ԁ !U0 f%BcLuOM>X.4DHT@"A1/#Kd%CBq1a 9|wvgek5m9a!&bS`0 w@| T;}VxAٱ! c(]"GBFQ/W؉AC^{&p 3\芙8P`"=nvu(XM M(B^$S"O7o5׈ fI` [Txp0igG(?Nj@X@7 7OeJ~H~hqMxMM0pHp@‘q!% PCOgXY\=P"s1-gVgHX5XP'>rC)QKg)ѣz >7)ɓO9ri5ᰋI)= 256), 0, speed=1, transparent=False), Print(screen, FigletText("Help!", "banner3"), (screen.height - 4) // 2, colour=Screen.COLOUR_BLACK, speed=1, stop_frame=30), Print(screen, FigletText("I'm", "banner3"), (screen.height - 4) // 2, colour=Screen.COLOUR_BLACK, speed=1, start_frame=30, stop_frame=50), Print(screen, FigletText("on", "banner3"), (screen.height - 4) // 2, colour=Screen.COLOUR_BLACK, speed=1, start_frame=50, stop_frame=70), Print(screen, FigletText("Fire!", "banner3"), (screen.height - 4) // 2, colour=Screen.COLOUR_BLACK, speed=1, start_frame=70), ] scenes.append(Scene(effects, 100)) text = Figlet(font="banner", width=200).renderText("ASCIIMATICS") width = max([len(x) for x in text.split("\n")]) effects = [ Print(screen, Fire(screen.height, 80, text, 0.4, 40, screen.colours), 0, speed=1, transparent=False), Print(screen, FigletText("ASCIIMATICS", "banner"), screen.height - 9, x=(screen.width - width) // 2 + 1, colour=Screen.COLOUR_BLACK, bg=Screen.COLOUR_BLACK, speed=1), Print(screen, FigletText("ASCIIMATICS", "banner"), screen.height - 9, colour=Screen.COLOUR_WHITE, bg=Screen.COLOUR_WHITE, speed=1), ] scenes.append(Scene(effects, -1)) screen.play(scenes, stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/fireworks.py000077500000000000000000000036261511423144500214510ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Stars, Print from asciimatics.particles import RingFirework, SerpentFirework, StarFirework, \ PalmFirework from asciimatics.renderers import SpeechBubble, FigletText, Rainbow from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError from random import randint, choice import sys def demo(screen): scenes = [] effects = [ Stars(screen, screen.width), Print(screen, SpeechBubble("Press space to see it again"), y=screen.height - 3, start_frame=300) ] for _ in range(20): fireworks = [ (PalmFirework, 25, 30), (PalmFirework, 25, 30), (StarFirework, 25, 35), (StarFirework, 25, 35), (StarFirework, 25, 35), (RingFirework, 20, 30), (SerpentFirework, 30, 35), ] firework, start, stop = choice(fireworks) effects.insert( 1, firework(screen, randint(0, screen.width), randint(screen.height // 8, screen.height * 3 // 4), randint(start, stop), start_frame=randint(0, 250))) effects.append(Print(screen, Rainbow(screen, FigletText("HAPPY")), screen.height // 2 - 6, speed=1, start_frame=100)) effects.append(Print(screen, Rainbow(screen, FigletText("NEW YEAR!")), screen.height // 2 + 1, speed=1, start_frame=100)) scenes.append(Scene(effects, -1)) screen.play(scenes, stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/forms.py000077500000000000000000000200051511423144500205520ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.widgets import Frame, TextBox, Layout, Label, Divider, Text, \ CheckBox, RadioButtons, Button, PopUpDialog, TimePicker, DatePicker, DropdownList, PopupMenu from asciimatics.effects import Background from asciimatics.event import MouseEvent from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError, NextScene, StopApplication, \ InvalidFields from asciimatics.parsers import AsciimaticsParser import sys import re import datetime import logging # Test data tree = r""" ${3,1}* ${2} / \ ${2} /${1}o${2} \ ${2} /_ _\ ${2} / \${4}b ${2} / \ ${2} / ${1}o${2} \ ${2} /__ __\ ${1}d${2} / ${4}o${2} \ ${2} / \ ${2} / ${4}o ${1}o${2}.\ ${2} /___________\ ${3}||| ${3}||| """.split("\n") # Initial data for the form form_data = { "TA": tree, "TB": "alphabet", "TC": "123", "TD": "a@b.com", "RO": "You can't touch this", "Things": 2, "CA": False, "CB": True, "CC": False, "DATE": datetime.datetime.now().date(), "TIME": datetime.datetime.now().time(), "PWD": "", "DD": 1 } logging.basicConfig(filename="forms.log", level=logging.DEBUG) class DemoFrame(Frame): def __init__(self, screen): super(DemoFrame, self).__init__(screen, int(screen.height * 2 // 3), int(screen.width * 2 // 3), data=form_data, has_shadow=True, name="My Form") layout = Layout([1, 18, 1]) self.add_layout(layout) self._reset_button = Button("Reset", self._reset) layout.add_widget(Label("Group 1:"), 1) layout.add_widget(TextBox(5, label="My First Box:", name="TA", parser=AsciimaticsParser(), line_wrap=True, on_change=self._on_change), 1) layout.add_widget( Text(label="Alpha:", name="TB", on_change=self._on_change, validator="^[a-zA-Z]*$"), 1) layout.add_widget( Text(label="Number:", name="TC", on_change=self._on_change, validator="^[0-9]*$", max_length=4), 1) layout.add_widget( Text(label="Email:", name="TD", on_change=self._on_change, validator=self._check_email), 1) layout.add_widget(Text(label="Readonly:", name="RO", readonly=True), 1) layout.add_widget(Divider(height=2), 1) layout.add_widget(Label("Group 2:"), 1) layout.add_widget(RadioButtons([("Option 1", 1), ("Option 2", 2), ("Option 3", 3)], label="A Longer Selection:", name="Things", on_change=self._on_change), 1) layout.add_widget(CheckBox("Field 1", label="A very silly long name for fields:", name="CA", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 2", name="CB", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 3", name="CC", on_change=self._on_change), 1) layout.add_widget(DatePicker("Date", name="DATE", year_range=range(1999, 2100), on_change=self._on_change), 1) layout.add_widget( TimePicker("Time", name="TIME", on_change=self._on_change, seconds=True), 1) layout.add_widget(Text("Password", name="PWD", on_change=self._on_change, hide_char="*"), 1) layout.add_widget(DropdownList( [("Item 1", 1), ("Item 2", 2), ("Item 3", 3), ("Item 3", 4), ("Item 3", 5), ("Item 3", 6), ("Item 3", 7), ("Item 3", 8), ("Item 3", 9), ("Item 3", 10), ("Item 3", 11), ("Item 3", 12), ("Item 3", 13), ("Item 3", 14), ("Item 3", 15), ("Item 3", 16), ("Item 4", 17), ("Item 5", 18), ], label="Dropdown", name="DD", on_change=self._on_change), 1) layout.add_widget(Divider(height=3), 1) layout2 = Layout([1, 1, 1]) self.add_layout(layout2) layout2.add_widget(self._reset_button, 0) layout2.add_widget(Button("View Data", self._view), 1) layout2.add_widget(Button("Quit", self._quit), 2) self.fix() def process_event(self, event): # Handle dynamic pop-ups now. if (event is not None and isinstance(event, MouseEvent) and event.buttons == MouseEvent.DOUBLE_CLICK): # By processing the double-click before Frame handling, we have absolute coordinates. options = [ ("Default", self._set_default), ("Green", self._set_green), ("Monochrome", self._set_mono), ("Bright", self._set_bright), ] if self.screen.colours >= 256: options.append(("Red/white", self._set_tlj)) self._scene.add_effect(PopupMenu(self.screen, options, event.x, event.y)) event = None # Pass any other event on to the Frame and contained widgets. return super(DemoFrame, self).process_event(event) def _set_default(self): self.set_theme("default") def _set_green(self): self.set_theme("green") def _set_mono(self): self.set_theme("monochrome") def _set_bright(self): self.set_theme("bright") def _set_tlj(self): self.set_theme("tlj256") def _on_change(self): changed = False self.save() for key, value in self.data.items(): if key not in form_data or form_data[key] != value: changed = True break self._reset_button.disabled = not changed def _reset(self): self.reset() raise NextScene() def _view(self): # Build result of this form and display it. try: self.save(validate=True) message = "Values entered are:\n\n" for key, value in self.data.items(): message += "- {}: {}\n".format(key, value) except InvalidFields as exc: message = "The following fields are invalid:\n\n" for field in exc.fields: message += "- {}\n".format(field) self._scene.add_effect( PopUpDialog(self._screen, message, ["OK"])) def _quit(self): self._scene.add_effect( PopUpDialog(self._screen, "Are you sure?", ["Yes", "No"], has_shadow=True, on_close=self._quit_on_yes)) @staticmethod def _check_email(value): m = re.match(r"^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9_\-.]+\.[a-zA-Z0-9_\-.]+$", value) return len(value) == 0 or m is not None @staticmethod def _quit_on_yes(selected): # Yes is the first button if selected == 0: raise StopApplication("User requested exit") def demo(screen, scene): screen.play([Scene([ Background(screen), DemoFrame(screen) ], -1)], stop_on_resize=True, start_scene=scene, allow_int=True) last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/frame_borders.py000077500000000000000000000067151511423144500222520ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.constants import DOUBLE_LINE from asciimatics.widgets import Frame, Text, TextBox, Layout, Label, Button, PopUpDialog, Widget from asciimatics.effects import Background from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError, StopApplication from asciimatics.utilities import BoxTool class TopFrame(Frame): def __init__(self, screen): super(TopFrame, self).__init__(screen, int(screen.height // 3) - 1, screen.width // 2, y=0, has_border=True, can_scroll=True, name="Top Form") self.border_box.style = DOUBLE_LINE layout = Layout([1, 18, 1]) self.add_layout(layout) layout.add_widget(Label("Scrolling, with border"), 1) for i in range(screen.height // 2): layout.add_widget(Text(label=f"Text {i}:"), 1) self.fix() class MidFrame(Frame): def __init__(self, screen): super(MidFrame, self).__init__(screen, int(screen.height // 3) - 1, screen.width // 2, y=int(screen.height // 3), has_border=False, can_scroll=True, name="Mid Form") layout = Layout([1, 18, 1]) self.add_layout(layout) layout.add_widget(Label("Scrolling, no border"), 1) for i in range(screen.height // 2): layout.add_widget(Text(label=f"Text {i}:"), 1) self.fix() class BottomFrame(Frame): def __init__(self, screen): super(BottomFrame, self).__init__(screen, int(screen.height // 3), screen.width // 2, y=int(screen.height * 2 // 3), has_border=False, can_scroll=False, name="Bottom Form") layout = Layout([1, 18, 1]) self.add_layout(layout) layout.add_widget(Label("No scrolling, no border"), 1) layout.add_widget(TextBox(Widget.FILL_FRAME, label="Box 3:", name="BOX3"), 1) layout.add_widget(Text(label="Text 3:", name="TEXT3"), 1) layout.add_widget(Button("Quit", self._quit, label="To exit:"), 1) self.fix() def _quit(self): popup = PopUpDialog(self._screen, "Are you sure?", ["Yes", "No"], has_shadow=True, on_close=self._quit_on_yes) self._scene.add_effect(popup) @staticmethod def _quit_on_yes(selected): # Yes is the first button if selected == 0: raise StopApplication("User requested exit") def demo(screen, scene): scenes = [Scene([ Background(screen), TopFrame(screen), MidFrame(screen), BottomFrame(screen), ], -1)] screen.play(scenes, stop_on_resize=True, start_scene=scene, allow_int=True) last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) quit() except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/fruit.ans000066400000000000000000000575261511423144500207250ustar00rootroot00000000000000                    c                                                                                               e n                                                 .e                    r                                                                   a     i                       y                                      e                                                                     h                             :                                                                     S                 M                        .            .                                                              b                                                                                                 c                   l                                                   python-asciimatics-1.15.0/samples/globe.gif000066400000000000000000000273211511423144500206360ustar00rootroot00000000000000GIF89a((ŴݬrzzzմQYYYbbAIIrjzz8AA088zIYYAQQ ((8IIIbb (88 00(II(QQ((Arz8jrbAjr IQ8A0Yb80z rQbݬդ̓IIYYzbAz(brAQYr՛zrjzr8QYYQ0br(r j (8IA8z bzYrbYQ0Yj(QbQj0Ab AQ(8ݤbrzrIYb(8A0AzYbj (Ջbjr (0! NETSCAPE2.0! ,((H`3gިPQbD9w JHQBO4tq̼Cd6*΄KBL+t0YrC$0P@K c'?<*:Z2?rHSFDaBU(@DqGRrV-OgR1`41Ρ[mc G I83&Q?=WH"2ZJ H `܈]o+2hO@x@0wX@u)Xa iwk @_ dncXQZ l@} ւia"DGuC8@F#9";pBb1B1YЅ$c@ $PB \4ф\XyyGqdo%aN eYpѦA6'`%Xuq ha6| 8zb9QS$fbHC W(@r18e.P0%)[@W_d*XPwPѦhPE]; ? jye!!CP0`EZ^\P/W`qsEQu,[lq:` T9j@yj'Nh̠HaEGgQ10\AU@Frgd|_DlXx39϶EKHMCyp <{TZ14A5ߌsΥq{@ Dc=P6mE?@aMDs|)ϽpA ~ 2ˬ Q\|0AoP(ua*!@v  8EXhǞ`?_yUEG%<pqOf` A1)_'6 AF$ І6@rO! ,((H3ϸQQ;#J(ʙ1)RX  v80dA "F%v&Hb5LF,  %@@)Fvr pޘ&ZattaP Gj ԆEN?G "@ c19'atVJ@*dE 1$TP9 \ G+1].DFk\ ֛q@ VYA DD![,6E@*= ;]oHHP;AP5GPqZ[PADIED|'Ud( ~Eċ[p]PƭeP Hdyax jb`+3:[$%; &vPcĈV8P! ;'Ň/:E{Cv!A}Sm=B8t|l!=FCVdZP|~ϭaҍ6 =d`VP@f!nd>V ip )BQ ChTY-bB0+,)E m{881?bOxVAD' {>0m>VD BH+H]9P:#kA%j ZQ P8NB@bjB!I {"thH%,?FHE {@=ho`QAci=(Ǭ<Xd!opA0riP4=F7Af&E0Zjbd=L{ahsU@$4n0qkEQhW$bAXIDB!iZD PpY qW e_̣ 1ɏFIJ'w{$Cܥ8XxTّ}[ 94|Gy?GV`DUԎL|VFiKp`C 0.D$Y}H AA Ϡ%!0',ASA Fd y WH=Ѡ3 TH DA)!O` "0!0<dBP@ pzB\?! ,((H7)Τ#Jxp 3ODF%LYp p\r'z `#Z8`:6qp4!/6ӠjUE]!G) SjpU G@4.př!,e ` ߿BL6#5Tgpg *;ۃ+x$"p \`arʘc[v"VI .%e˱y ?(Xa3A C+Jb9 `rfp&H X ܵp~a[@YA ^Ň9WD V`o@ax)bZ9k¨:t( qtLj N(*D*@\<4X*lSQ Dހ:aD8ma(cqn$8iB ¿+G0 Eoe0̙l.<V@6<+H<AAn :aE?[<<DD $AjX#[4`Xѕ@[ `(əkfQ@EDDB5`3ua=2ɬ[OD=a(lp 40X^qGt ۊa@H %quL6*|QXmM#1(a k9N@/1s< VGq 8YPC' 5_J!нBg0D@2>|Vi(OKi8<Ѐ 91Hh (LFBJ0 ! ,((H 7oRXqF < JHO4RF0KQcɂ%Z 0LBC@OJؐF ;v gFִiANΘ1h h5tx Ù&\ؑVȝˀ+Қ*jË́4  e+jLjƀ.a(أ %&`5K$`aH {~`4B Oc᥋ z0I+N#{\ xRPv@,#&J:~nqZj` 1 h\\ Yp X p4(} 0&E %XX1#֨p F  6X <0q 6(A` |PD>C}q_4 !*9G%T!`G ) wZtT ښ? #iY1&ׄFpхhtdC`@B/2:X|!(pMhA_ƃ9hWQP..c)wعjZdQbaDk(!ƕ֖wH`A) n1D1 *e %MǒX`b b#pV!|'0D=@ǁ 8Q mpT\)nƮj.`.EVaX۩jѴ`'8L.r 豅j1p_j L# 4m9pm2kAb3!@]d)qm7@oZBF7w9@nExuC-VihC-㤗.e L>;K5 4RnkAOJ6㾷A)p|b{oTK4h?|G &C @/~dMbTaza`520(YթmjL!i3@|#$H LxBp!$-t! c( X{X)@D0A1 ! ,((H nRy3J 5v JHB jX"5Vp`ɂ4QSã0L0E 0ppx :aLPMµ!fM5Cpr$  s]09a. D ٧Y lmfAvE ^DX$mzd"o Bht(Vj_R.=v8^ H6x-{\klCXADix9 W\9l5}tU)$n>v9F` xC uWQQQ zHw9ThDbhER(C@hѪg8 0`ڗ鯚r(Њ.C 1`0@k!@fP[CѬj`El轋t䊁+g4Drk>0Dn,g%Gja9DV\r ƞL<<ΐ1;rkrz7c1^@=l/gĨ+ta= S‰iXXw1^rǐP4h0 kmamJDj !zGnyV8ie[.ITRd1[6E6Y!oDR`UۜUW)1ze`f{[4pSק`;gAk[ TKh@"! ,((H %JXcE<i%K9)Lh@rz!ج"ƈesX@O;$` "8& *A."Eb4hDʖʓ@A AL oٷG_Æ80L6jv [xgZ aX`fGT}5ؠ8G!0sPA_kɉ("^( !P)XVPFe蚍#⠃ DA.VP /0CRNe~>A%`y@$ Q5ɅQPm ,`5T$TdEkYyq+Wyұ&Ps VR x&TH)qZFJB6Ô:$lb:Yj&Eqker& 0@%:xOUVyVA"i :Ń5DD@-{+A H>Dlz'A 6 ]ۭܲ`ȅ!++|-tkP)в[T5`?EȠ}u @V#uEa\v}Ԁ d~xvT3AP3KL` Bb7ﭣː?bЃTSVh 9~a`;}n#@+joU4N8nr?cpTQžOEAV$F3onHN@$9T 487AI A6p JA P?S"%҆<̡Vƭp*wC20s !This GIF file was assembled with GIF Construction Set from: Alchemy Mindworks Inc. P.O. Box 500 Beeton, Ontario L0G 1A0 CANADA. This comment block will not appear in files created with a registered version of GIF Construction Set! GIFCONnb1.0   td4a.gif  td4b.gif  td4c.gif  td4d.gif  td4e.gif  td4f.gif  td4g.gif  td4h.gif  td4i.gif  td4j.gif  td4k.gif;python-asciimatics-1.15.0/samples/grumpy_cat.jpg000066400000000000000000040370061511423144500217400ustar00rootroot00000000000000PNG  IHDRN;sBIT|dbzTXtRaw profile type APP1xUȱ 0 Sxw2BEBA WlzkGUUUϒkif^n (_-LD + HzPs IDATx[Yvs9u.utWWu݅n%I`XI-@"Q.JA!$AKT%F$@P p휳^ks10WUcDtO:#muV=QB!Bn>ӳ8͘ $'$ "N(䩐U1w֘rC]Il372mxxvׯS~lsq7_{9|@!BGoGDjf3t4ЌB&qA0G̝u]O8tg*HGN74nKO(a!Bx{rciuqq JNwGEG::53%#kbuXqo7UcUi͓/ןHx{B!Bx?sPUpJ)^07MBR!ļ)@9 )+BwQDtVTtm-꺵7޾.snEa!B>~UY1ShHYS&a)l6KEhC(s!*$X=wl)rSOΟ?!B!0)ׅI)ћQDPU `#ΔfNm w@MD28HX[g2pH.͍;w/?h2/(c! !Bowra(κ, a Lj՝],v)dJθ ݎ#LS)\U>oz?}k_q ^_>͡a!B}]C2 (4%ky*l悈` u\5es;Tr2_{塛4in=Wo^MOo<+<_wՇ(C!B_~;ޟRͨt1)RB0Q>^ UDɉލZv|\q\Ɲuk~+ߘ?߿ueI婜M=6_b}?y_#\g !B_>ܧ޼$IwDJʬXJF룈s3@wGIk;9LR0"FМiH9k^+^ywUyiI_7UtKnqKFa!B?O>/?/&~C;m*ဈ""ke]WTQإPU*u>h[/ v*̛ tin{xu|U^"_ʣ/B{x ^*P(}EB!M/|-Ӽ}jrJ٦6mڨ" ( ݑcMrFӸ8zr2 {DFD2O*ZCPIj֍yl}1ibշ9n^}7īUGӫ|^AtC!B8վ%0Ms9i.K{v+koaVp14 7DdEfKH{|YwZFG(r[9%ʔqrJ;k,A#~ 4P!b$UrąĠn<_=;ӷzɛL+C_}kCڳ?s];/}˷*>bd4B!}w]i$7xDNޠv%&Ae~'2Wҷ"&2vGrItwe1j֍eY#t햻^ʼ4+^\P;K[Kģ |DAB!?}䏷CUÇڟ2@s7LNrv*H%5uz$JɈIa]FĺT6 Bp03uZtķMIOϹM%}}< 6zWׯm?va!B>sy߻y좮-oXQጸ:FF 2eTJ)4!8غa#!ee.)rq{Ǩ;߱q;nS֭v%'Rt7$+Jug5gYkPURJ&Ҕ)SAS-۹Prr~~ZP)q t.$vz}'rBsXf$*BVEs9o}3DGcorzri^Vpm}=+o?huwy ?h7{_!B{?vʩ|h?y'={Ut&uD7eѵIۤkŻI99ZgY+f2M]8FLǏf?j8Yє136sLg^;筽y7i?.݁n_Oܗ@>"0B!ךN..Ӭ}z5^W8FFI2:}' %'-8 Ǯ`3܌z$``8:tsu@z|tKHbd4B!G\Vs䳋W'*is蝋eeu\!aLYQFDJJzk(BfNdun^Zqq*BE1&Q`7{r=ȍ77#rv^_xW_}ܺuK_x/Z(C!B8#|vE7y|0ebqe]Yօ;+ 9̛1*, %:X3J$J:uupg"cL@UeO_js~yewh勓Em+t9|.9 S9q֍& T2Sk%(ђfI2 iv ݡ7*֌;qAq;Nw #35IEͰ,ŝ]ܽxs=Ӽ~9}e[?;_~ y䥗B!}躮]CՒ<'5o+uLjh+7z$Q(xॳ9лqdR^"2{c*ӎ9{4+(LUͦI%Tx;t_څ| I/-x F1(C!OSego\re<$) 4f~8wjaʙ+'[QU!'q\\`#}|TUc#sRFQs8;;ۛM7WZ7Og"/R{W{(C!OtzoA鱜!D7CRpz︌e 'LN qPfS fv7KS}>Wl8)e8*J0dML)EqU)¬7e\ DA:\n$u]9hVfrIX䡙Gwg镜:%% EЬLSje/zOo>8m_?G?|6>a!Bx'>qv_|ѳ]')]Z~u4#ݰcZ|NJ a+Э{c[?C[.+@KAU}OI*`M5P=&Hn$6fi_+w ޼'K1(C!۷^;w>]ݯ/;=v[D:uT2֝G.1)1N#0#8ƕP?k[GD KnX{gei9,Zi=^MITQ,S_vYܽݤtbx2!B7Ξ{KGvR>DnnȧMɛqZo)%Rq(ZDə E5SPw9nf˵+WIuYnLPt!&$h@8D)Nq*̛D*̕7דh~ŗ^b0*QB!3ndٛMN sٶf6Ags"-9BVE )%'&:9<3*s$JNf* `_;FRgJr Ϩ 9 uYݲ9rrħcB0*D!Bx`|=_IfMƦ#Z?zДt}uiNk,P[41NawjwMJ\> [@{vk%}{;?|t)wS^?B!#y{)KrmilHi^ky]>o#\JaH+@c/1o2"H5jkH IeQ5z7ܝu9"#0%E(:5CJBQ=F^J¦pqYymgf+~woæ!j! !BkOipm3j.g~tE[kt3\Ff&%%@ ġNJdtG RnxBQO͝nf Gft䒩Υ8Idb$%RkxAEsL4@ ?H7wk#)PrJL9jgYWZkJmv4Ϥ#,0rE\2ǫ"B*C lɅ칪7]|"i},R-)TcAs&i>Uw'i"gEedި} Kn$emt"5Rfn;njVs&D.ydbY^gOW}~B!tv&7]}q.~so6 QMW@()@(s$FJ2}4qe]Sa7 6-YUTy/ . 6Vd*C4S$cIl;~zy˙{kz7QB![?.Ugn־+GZG;9눌`ѱqŏdsJ.%@K" vGN.^|rӵX͌aALjv|du5͜F?(",һQJ&OfljhmT┒Uj#B2ZޑnHNSBt/'պou?y>p0B!GK̞ͯ^vW./w\2W5D[W1cqom3:|f;T4%ܝvFwi.*$Q蝜DmcPDœa9nRpwTT86 )I)Is~t;e)Ms(C!O[.kiۺp.'v$A1׏1^Ng]WD k4'fNRԶSNTv9G!B}#\y}m.#D5p6B9, pp,PJ"yuEnֱnhzfN#:FomqADcW8VĒ3>LIٖi*LYϷ_~/޳;QB!ޟ~#]{vֻw޺xz|jgjcclXw:ȥ1Fk2M̥PI 4(Vikc:9a&ձwh6^C6ѠIIFqj"$IWcd430B!O_Ӵ mo߽y~yn=|[TUmzGTM2Pma9,s#g{QT & bl73b8r, 9(TX{?@EAhffAJH::w:Ff(f\^poFDAB![~v^ڻy{CݣfzX~+Z *->B:"F%a4ZOp ;|޹Qcx` ()+e]Qw2(ecfVΜZF6oCz@!Bߎ[>',˕#-VwwO룻K#.N67| IDATyw}t@] 8)czPw48*Keh4()K0_iDT,:)I Ƹ,:OTqhֆ'[ݼqKtC!}o}h׃8ߝ?zXCoˋ3ˡkhB]./:LĦnSs=[MLSBDiyisFsƬ_GI7pܨk̅+/ݎR"_NT8nv·e,R!BSG?Dn.;N6w?ۗ=6/҉`h6n))1p2\H EB3SN֨13Pw<te*4[üQ{3͜)+7Iɢ8a* K(\;썬Jg7RrJNaW7s (C!}[/LcK::Ou-2C@:xEUFC Ic*9ASa47Uj]@$<"(N]퐏c Y9, UCD]WIA3Bɉ+ޛ'wQB!/a疱7z$rRLAomwbHNBə2%AFa8дZ"AJN M$g;㍺S0Yg*xc;bZWPUs{u:J.u]I2) ys&ܷ !B+壽&Q;w\C^ ٠$ nG핬$:{ݜ$ĝ}? p0B!'}s?~oosAI_..ӵN;nGkכ{܏̾G$ *ǎB1Q:.&'ƈ(PQM]F)eJΜ=9 ;~Z=Rʸ7KL 5iڌpIIIIudI SANj9{@!B=̡sCk<ʺWzƭ=r8 jgʅl8 B)3I9@Gװ#ҁcna7zlSeɖӓ-Kœ3Nq$&a!Bx3ddd%]ʣ\}V띹L]>KPRf+ei Y+ncTD))Dv,Pj]hbLho<Zmws.L),KŜ1H)ZWrNJի/>||Va!BxOonYk'\&m&֓˷7p8\;/6PQ~ 0_qƘ&AĩJJc, s#D!y\ QP7FTź4mtG "nj@h2BE;1s@μْTPn&l;uB]=yP}! B!}\~MpvwA룘f13G"tkCr1Dƞ0)c%T1ɛ7; AI#BǕВ 8 Cw2aTNkƲ-t{2a;Nr#?rZEAB!3.~;?a]3zXjW.w#M?sθZrf]+6oEE@9^TJfuc8RºI)C(9{b~L Ac!#eP{?欵#7YpufJIyʜl9ʼ>9=p0B!'[?qSfSIK_j[sfP?|8,]6u Eg=kl it$ (Rf&`a9nn7G<9;Ih(L#wRl7[rN(a².;l@UAWbOiP"kc t3D 8s)&rw5M3}kS{M3.L*6rJp*4k`05vS;B.]?mڋގ𑍂paax*~o^jkQ zvw,ۧT@mF 9j靹V&PQ lNX;DzZƩ.D)2iqRC@EA ~u`sXNp(%#5W룩 Ee7GrZy&]S2s aaŒXxe.\y?V{LmZ`]^h9%L-*2) Jû@)T+bSIĖ[IxރAU9R2yb~"GRJԚ8?ìGEm%nڡOw7T~Y`-kyG+seyoym,g3px_k0 0 O/PXjٻ/JV?/ )UD=D~ץwDksX;ĺ!=^=N+5:=VDZ?>sw;UN J^s:~YTo)w:Bk؀V*4J5;"Lt?Vuj3jw aa'K~PE?}eb۞_Cq+&Q7u[09TBQZˇ;S蹀 *с=BihR lgw51@k249vPZ(r8C@A3J+RZflR*L}lJNctW0:»wcdtFA8 0 0|}}U̱lwlU%K͸SQD"':Νy*)eSz)oe7 ɕ=޻qPUjšSGR3#YrZTuU4rʤmc+DòF^C @?#bwޤCkT̥!*4|~Ż~^rh+G6 aaoտ#>k;3ы7PӜrԓCTȵ #QAZ#܏ˈ`4kBm9]tdVpNR(ma Nӄ3wQjA@Gn¬q{<ԏ\XF.=M IR& $j]kpZZQixn"Fz\²ɚx0 0 ]?򹒒֢SN[i]'Oiy]_״3&;a\jb]W|;)(L3@(9RԈ1RQSJTSDJ)m[v=FN5i&B. HQ0 0 Q?Syqytևf8augA"cO9P*)=;0PXU뺜BݿRO{P'X|'=CEpV%SV D5{~9mC﷒O<|2paa{_ߺ ~f.jkۯE.xJ)@tqX ۖhփT.6id58EUX*:c7b=.3mOtnzy(aao[R'u˖ھԶkEss.*.Ds80yh q]S4nۤwwDh5^ ߧJPaKbF8].>?wjɴV;*9m8(`;უZc9.S7 yX5pꨵJf*)Uw8j35~éJΦ\C푊+dx~퇏Q0 0 j\:=cKRSVZogNϦ^(0Gb,kBiROԜ([5cNTfgCUpޱ N;S  >v*aP1_J[ PJʼnk}H:)&BQb"aQZڪry, kS)_(aa?_?gW~l9:=W+Ֆ\/SKUvP~TY]RǙ-A) /t6cV0 qQ(%TPf4!"H-(8UmF|wT*T4 1jmRཞ>V*=sPT~Z4mZ> G?SE!=Gr-x)iC#ѬQg& 4:vOotj0 0 G_Կ'xӢQڤ!mVwMtZs)x?O)%J k>ZY e]4jI86qfP!6E &b hoQjAD8cYiУ"@r?~9̖322BԓkaYZ'YL%e+X/Lp?}_]psokHo?>Q0 0 6وDbau/wg}Rźڃ9hqv{{2*]`YVZK*%gJ-0kNs3>, =’+fĨ%G(ٌy19BE]Fk\܋S1(gVOJe[8;$jBt&L!PR"r~Zh^s(QM@־~Y48Z=ů?̽CxOީ߽=W`{4 aa#ٻf˾׹r5deY9~-oDCp!-+[EHYJ.aFtu0y0@Pfm=6TEkBN!DD!MO'F]D(9#Nض#~0 0 ??},%wTٶՇ'}TIZ3rqY5#jێ䴱- i۰U|P F4FmBNQ/R(0_G DR *=X~Yj,[5cSAj(`!z]_AK?֦Uk-<G>ß0 0 "'9}Wp9(9L>` &r#%m{h(Z8Ak 3 k)B=!R1jk4GrjL=%mJK}T=,Bc*DZ{\4*Bm &|ڬ_U[YhLAqH/:sd|xo 27|1@ k aaD~8{$:IIy[e9kb?Zn'KDSkxV*Zϙm9Rڻ{ayTz8ipE#a=QjmL843B4kl *J7OTºm=&Tĥs8Ә~'FO+6B)R{Pi IDAT84k\sX3*.u_Fi|3kVO?ou{ʏ15 aaW~_Iֲv&mUݾdyr~pޡ|VE[jl% A3N+QQK+>T4^|/b}-Sk}p,_z񅰿ܗي!XsaL!m]5T77,ˁm=GzwAbz:1|\+U5ĺV>j?kcvӄWOk?TZ3ZBsnyJ)6J3PJBR('WT SUTd}|g7m7lFA8 0 0[7ڳJhfs]Xv^RC`gib"kA^ U ԩc?Y0j͈֋TU9<ȵJAs0ܳ|mjͪ3SY>aD0 0 GW~g/zQߙ(*sw|p ;9O|=?9owgngן1|bp{z=1 oSwǻ)ާ:)ۡ\4_N9?lGn҂VI9cz Á< QsL&'(a30<-?~_j8<[zXZ5J5~nI\4CT+&jNgZq>s=,dwfy#$&.FA8 n ~0/݋.'=\\%LųZxXkfV1jV٣qaT.JL\\>DMYWKZf9.bVU m9Rk!́%D0k(`"R)RX?y&K#c̻iPA*!SAQKfg&Jx<"UBdepq~mi/ضqu+kJ9j)8BT@ѣ{wxaq`f<8{7{z*6 a䃱%׿7 <׳v+[{6C[Y-5w"vyK ǗxRZQ|G6ug:Ϻam@VI[JPu!:' znwN8<񛢖<|>Q0FA8 }`t / HϤ }A~G<_rX!Ufs!$)h\$).OQ\+b*<7?8'b&|@~(憴n즩`h X#hKAiDPQPZ tjmƶmX.k ",q]Ak݌z%Ӭ ✣H/׭&^wmTxr)biCPZ}ȹd޸w~5n,~˛R6֨>T'h;0RjskA*ݾs$/^J-|n}~--~~aTM*A{!mwB˧/9GE8U--f(Pjaَ#4O5nooyr}MZW㑼%n︹a]WJިGD(|?ThSGeYrwsp-H9;%o,󮏞Z(XL4q9plnnXׅe9r=;׼{X1lPZE*Ԧx83 cdtk=1|]+:̕&ʫ_d }`.D>,^7=z5MxW@xMo=~,/5DLNODWp{{eϽY#:_ʗzՠD3吪QkVuDЬ!L{ |nxHV˩0n BJJZrOy*<Cu]>#M-x^ Xg/WI_ܻ=nJWu+ʗ_n5 |ʽʫYMF?ʧyWA3e/o^ɏszw3Q~t^ͱɅ:;hM׼sPNR.?n|>{њJn;G5a[S rHX`* ۶nfTuЈc%w}LF fMk(RRÄVyRqØ>IQ~l&@ =k?4X nƬQKňw=[p5eVJ- ? +bUC"xeeTs(Jw?E)76[ zdh0 z[g?3~wwI@-778}\5CfX_^jfDxH{^(rzX./Vo.|Q>'"k7v+-o/~kי^O~G0\.XyQT>*Mζ=\;)C܇(uk3T5ʼnǪ6[w iͬ;~,&gjN3T()"LS?9ENop()F)>9cqq{B@TYZ1FhCpvg3O;p33%wz(n(8wLs?SkB)qPڊsuaKB77w4pwl6v;zx K~kta_J8g]+U/ \~7~E}?/K+f+z?.ʗ^puG:Fl*+UDkSկ#M{sG/뻷zW_W^)@|گJR~՗s/~+,v5I?{%Lkm8T/ԂjٗuޜrۗZ>l!%EضgcY!$r E&@7d$ X ثn C ʐ!x҈4#$PUwzr˱=q}tMUWUW| ٴ^b1Y.AfX I Bf3ssPEQ{< 5ȳ JuA/Dy`mE7#Rw"P4!$@!"6BrDNJJ*# u̖yFtEF v>lgلpƌ3>EЭ[ikkK}|eON@ |%X%u/|ot?4Ƶ k]T;;?7IdsA[ Jw!k-bhm۠ixZj%zE"5Fxb 1u1BiW ƈ#ʣZtFJ(TjOh$.!et1Q,$63LΘ1cƧ-`wxm9 IDAT5@tpm#)[ږϞϨmOMUS(ocX]mNw vccD@/OBlm-bdw]⃫{nIDrm~ǣa^ Ə]ul ]2?"H=<kk L =ƍxt?/1i)M[Q*_n+{:|~Ҏ% "YhI) YQ,LR!/%uw ! &fp#-\UcmbX vR;HHDO ݕkm@Ul1n&uI EZV !E )z&@Kgk=]>ijm"FS5>Be%X-b s& C h[0USc20:&JC1$ Vnqf3f{횬]#geq:&@t+ub;ꦄ J~|[>/;o[W]J[o^\M7v.^ZZ/! t`cWW)7oފ.XUD@}[coEn'wsgK9oOuC:=xv{;*?`{[]Ǘdg0pߚn߈D^B=Z6탴M$)S |\7| :!18/n2>A̰iжDsJa ():YZH 9%D !+g`P5Rb("J @5TrTu%zmwn@H1 MU öK%3CpxVG\e` {BR 7vewuQODW/񣝨ڥ~^-mQTIlaXŸ:ccuGYyoSs玹pᑙLTpm76D>z16$mooC0Kb}"@e WpnH۹ҥH|!TIQ&q wLE:qh^9׃d`9$xNG`&k6 |Zwtѡ8=zj| ׎M2M܌𡅵Z1R I]gE N4kn|@]MDRJE@=HfyyA)F$Cyc<~YBPh] e5Bf.TiL1W7-NNGv1A1AkF0`?91??a"kd6?уrg 1cƌO!" l`J)g74H ӮW]s;}Y3kY]+e"~_b ~&W?Esv_ܽ r؝lvEdg]nn`w#p[7aޜ׆Nlg[u/a*X beSN>8zn.~OΎ"V0oL9|u롉!><X|Km/-"Tm`uUuEk>^-u-=@y':W"Pdxqs>)5E6ij>+. & g|tQ.0zѳ9`l8qr2F5 fR S BSWA$Li ̦S9$dYm43R 45|p`t )!ŀ,ˡ5w"CW-]D :Ɍ=PFAq$,()Xآ+(z9B%?çp!9nq0Ŷ4 !&he` gfxmӢkC¤c$Ak+, Ar W>O PzzO`df1cƌO/Av7ܚ|V+Эn H//ݻ3]dwWܿPF{#)ʸ}t\,Ӊwʽ3}. lb-p̈́k6λ"뼺ٚ^`-a{WWo0t"zW.G`ޏvÓvC~oT(]j@~߽a,׾_Fpy-e{챿r_ې5`-`e|mq.^IZYK[[ ~E@/!e}Vhc\_C6:D))J-H CEBJDTLqAJt6BKR¸F cTkIyyO~NOB?o#wJYh[ F@!m :`<>3!4pu@Eh2#F% Mb5jbJ:bCJA!Q*V `YA a3…\ۢm[(=~هηI FW)`ii .xFiY=({FPA07-= MFpA ] G-)c>'VN1?:LΘ1cƧ7\١N^ )knE7?k@׻٥Ky8jNk7#Pn,O": ,$7/_^c`amdw~Eڡ766&ez,rGrG͜tN{Y4g?,}`{s y횿roq WÇ%\F}~_)T""0pN+r Ύu$\"Gp۷d?]k/Z0aQ;1BX@Wӱ`vmY_筭=mGt'PqL*:$2.)$gRJԭcIRt6DC\9jGڵ? b36C,;9AYh'/0! <[ s  IQgd 44B3EN( 1Xu iZ:(++"4M#bT$$`"cD@Afr2kzEz@Mbb@(3* "9 EgaX4-6bT9OjV#<ԱX!Ea-H%XceyHftMF2#N$5uM2Ϻtѹ]I M{ZC YMKߕBN !=AA+& !DThq8Ѷ16&N)M)":WpGxנm[x䡍@@$0Fw{ F+;+" 1Nw%b Rӥy|cr?mf;3f̘)ΝCvp+>?;||wMDޖfD_F~ Z^Y)t3WE}r=NVx6᥸5N><p?K?}`)+(ɺm/_D]^v%OϴjΏ'ƚ^ NFՓ9s-}ƚ *8eNGif\m ʶ!!VܵMT&\sŹf#'=;4񰂶QoluNpx)^ΝS ;Tۻvۛb7-:o`]ٹF>ae%Zwi>r,Y^147ΩP֜?qagO\l霯][g?('[wIg?1_A888U/hcR1Pc}[u@'1:e~[Mg~7ȝ;f+/ws`A$}4OB24.NYL*%ͅ"Ke qż߻CD*Q!"QZ4B4sVC`R`EY2snbwX@BAL ιn.f(Uc+ R+|!@N%IP IpɃDY)aF@ 7D^;%[ݮ]bv"<3 24-bPaT#S;nBbIfFQd9Ѥh $`\Uxv|q };}@^Yu,&$ %EV*Bb !$jpm:"b''L*8B'> ]}A뮔޻]v pM60tJiyI@hfXD]RPBI4i!nཇUݤS":SD YV ^m0C)RcyZ$&7Y*(0#cRf3~3f|Jy: voބ~]dNBDqKvww`Ro7n>^y>_3bY,5,tY݊oB+:iIڻΦD_.}hlR6jQ_OkZˋC`Yoo5'8'MV;hm{JB.$6Ŝ5h%la͹vHPZ@dcoTQE4ՃІ͋,{Jyf1Jy>WTaT{e\(땪M :NSʈ!Ɋ&|}v.koҵkWDdSm?8?[Z/z}89!hN+_%aiPv/kY /LϋIdVl=BGipz:RB/%=}8}.xf4α:>9O89xġ#|b' ' RhZF^( D" oGP J1N=b$A۸N\Ѵ-B!"$u2Ԫt(y1qve^D(˲?nel#/2=ef[З,"@M64dnQrLv)$  mb xPfHV(r<,(rX$A (ޕ :/Fm *ʼ9gU,3f̘)/ =˅>e:+vf4" /O_gAdoƛ7޾~ʍ偍Aa^L& ]9=:/5{G"BɨWA/:ao'62/a~E[87x0wacQ=dN{|t&EsBAJ$h==$F%%AerVĦҜu5NZv`vE/I^:'N 'iy•o n Ν׽EX{աOǣLzr?h~/={ަYtS7].4l01ag K?91Ќ&'*NgCyNeBJY>1|B!~yjRM0x4x\ 6"D`22rfOG>@y2`GM[#<'FL,] M !i<CW8D ! hdy$d ń~?M0v @GGGhNHE];3pg^:Ѩ4WNFW J34+dygS+CRVy@)u;ƨ.;TѶL@, m uw,%)4yX37Ύ٠O 1cƌO7iIaZںOؐױ^_ؿb{}*ߎ?Э_z"/'qA 6^L+ ݂kq&A e8g^#}aYaO[a PA\,($_̋T纘G #8\Jq]g^5Ej,YimԢ3r)bҬU <+ʒ?n(6q.lͭ!i R*db<,7))8 :iƔ%HHD6GUu>P_ϳtu_=dur'x͈5"ɋ97.⥒pA" 7 H[uDtGblo .*\u/u !`2pA0B1C!#|D%>5+$"C5`2ZAkbZGJm|J1zH(z 60I(ZEE55Me9c! Z(z(d{}Rpdt,a$R`5b N)vbW):H)ZOw--H1"6%)RZV{F$5E0x2Ƴgpf#\ۀ~?D^tR0oތ6f3fyi|˟_ŗ慪ѶU__w~)NmSǟ&P"JdSmI&"Ԗq uDnIT;2F/idCFWcqR^@w""ٿ ]6lԜv9y.eɐقU{=S\Yqyݦ!V܂J+V'U4PDTЇ|V*VVs@`mF4IL+ IH5,i'X6$W͔,gˤ[HзI@>/y^9%%M$΃jȄgMAAOr&yp+poIYgi3oSiD@e+Yx{{z4Y9|1S7Ҳn̜S:ˢI'pA]9J—6 B4AgO8Wxu"zA]5[m,b G(˲uH)~1D<r;A#D"b4 ꦂ@EJ1@T kU7b$MU]|ĤC;e2Xx2+_ /#ry $ ꦃ)Z:QXJ6FZ%jݥ,' c bJH1!,jʷmЄB脜j1c~8\,NOQO&IDa5U1J3@ݾaJ]LEIξI]`:M:$)}ج@AJ yA1c2xv ?޿NB-2hR@"4Akc KW֢WPJeZ\,W{VӪж5"CQPFCAw!PQ(Z;Qyfqfig,`aa?CmƔJ@-l3zz|12:cƌR~_Sx_J$V1~?,ק;Yl+5Z Xc` ~}}1^_Z% &Bu$"t?S\7 { G?"boK_dEfZkF??W9s*~۷5ѿxYD}(oդ髋+&+.B1=Q̓0(CB*Q6[٤V͌;҇`aùl DbHU*Wfi̮m} #-옊:RGfr(%ʦ9o _?MԒYeD$&W*e HK@}b Aٔ)~4Ɠ?NϮx6vy?٬IEʇ`6jޯBQ˵^2s?8,<!ϫӣ`O_$(\dmlN ,\g#g*c\v[!bR;!F$m`QHNG!xFf-ȲtRF058 FSMtj,D1u2Jk ,N]Ơ"+b͉[[!L0d/dbJH)I&*1IP υA Ĝ}Mip 什}&`m[yDN:, 0:>E5 vhQ^ #0BВi@JFCiKJ@ad6(I U0]}=Nkt'شHQםu)@"Jc$%<)rds{=9688/8^ ͌v [;7Qo: Bد/ [?T̍}}׽76^gܺ׀[Ex q~M4>/Hb:}oYM,ᡷ>~_ިoq㏿|qsESf dp47 OTI؅] ME&,I[-\10-|o 99əHU,Қq# 3f4VL+1pfT`EUU&^9nʰHs@3fT(ڙYBCy1 SqhhZP]VȂI|{|0.4%;KhNRUZRIplAUs!oW!1?֭bu7 {pSn}MpkFw> %^./ OlRt!o t|ɟy}[o8xߐO?_' SR0c7-|;-P~=߻ ]z62٤ٶkLKf+T2|NS7ʿxÓxW|y~~3~{GeaCZy<,atDZfkjYf6C█Phz⚙^\Rycw1*" ɖ@̉\YLf1/#XΑD`sϡ&)GT("BR!SG(fNh;N/ VB*qYHc.*j&էNyҐr 5?fqdyof%#f)ˢiž/yBm37$u]S܉>YRrU0_hGs2PvSҮz=KɥuWqV17S I&C2V5!T!`gf9BB|@<@Ƥi4-1L! 41PRD׈iZ )c0 nCƩA@"n$yDp@DPѿ7-l< 3dl#T ggK}!؆a7$s\bfP5&GL Ef`4MbKFf@U7nbCq#2ӀaЭXe#*,+TLq6vBQTi2I{"̎ 9sùd89`#Tnܸ{[/Nub-Cg9Gq?o\ٗx!OoD7sΰ~@Ox2.@n}Y9G_OA{1nyF"zwO^aی=׶=NS3Nf9Krt ;;Z-/oݻ{_:il: kirk2O# I_9AOaxXW3:pP<ꂖN:$ 1qU$%#G, ;K䂺EH5wD@* ԨyUQ]B$w-nJ)LD \y)ֳpK@AޱJbZY.g LrN6sY9aBLWpBZQ)Kb9bi-UN1Ũs^wʞT)iOΜbT3*l9wyya& I^{U$gLӪ{|6$*j\ΠĒ*/>DSL[mi,UmfjHePU h<EfW'+)BƀAa肃Agg,'9V p0 2h.) fȕgF"w&=u uF0 d R?(Z(bzIr#)동3 /WQ]r4Vc03t~rc (t5>.C#\tlo` 0CD1i=E D-2 )$cGTU(M>e/z +TZUS]889~񳾵Mx{ pg_|?_?U~ npV8]fݥ / Ivh8p3gxY|ٻe 9|+ x @qޭpuX`qA׻O|NM{HXyl2+o0fix/+OPSx-?N|swQsf%hb^Mnm^rLs_o/Sl=ǎPOxaZc*+J] )K3"I1 pBw jABUgJ߭?.9rfL\UnQ(Te.\0y 0Lt 6_TŬĨiY-=393 FAQ΃x:f8P@D`E=Kc!L%DcMƦ}!^Cd`{7o)lǸyS؟])qMR_lt &@lxpn{n\~w}A<4/2cCm㟼7NoOݼ{qmِ7>#я.q]gh^F$VZ=|v7k/#?9~q+bL{^+.Ӯ4Rl9X$WqhOkE?$^S\{߸wLr3a*ռ$K8Mn-3 bVK$-L;5hDΉW¼%- "#P& : us+r~0\agj'880ݑ}֌^zoo6ݾX!qxqMܻ7/s6k S\J?j\̌pp`͇{Y 3f*mKKar~LvUJ+'R4VqS5[T"20,kt=˗wK ЉG.W,;SW RU  ĈT l8+¼q AZ9V1Eϡd$JKAtvl %3%GLg*!j P3u"\rӬi2CjeZ"D,[ 崰}c3%IH9v/+SlLjdAI+0-[2?cWYLv/E#afƱcZFM_SwDU]Щgj7 Bkًocq<x;%k9f2bQ ZL-3L9eϠIJzsr9rw ҰQ(n@h`m^"\c Z:ѝ-ѭΐ%&hMpВDj`$8 ⰆBUaL:VKH6/@|A7Ғ*Ҧa$6vzFU099x ,4) dVfJ:S}U]!xA mdLc*5pZ  D)k:IwP-RP By|;dJF'=܏,GO'CWasPe?Eq?28/I!|#lpx'*D7^0 m~m+NOTۯ+)"&[Nub|#_}.]Z䁚)P@R5ֳ{ , ңG"K%'ώ(繤:-zYe=ں-.2T͋w;\yER̄2[94ݫR)@nN,\*1㫎}C&sHj)˞)Wd*+ԊBaƮe* G0sdHѠL~OMfd2#v[ ν.hsUˬB2Q)}P$MU i;c_%cjuaqKoi}"**{CB{ mܴUeT@a*0[ѹKEsD@EIɵ)i &P ;* ;CSUb\8dSf1iT͕U&g >sQCRPL~RtNdb8/hPAKl 7+ax @Z fcw+ %At3 TUa@uOma$cXmQ+ ލEΣmnQW5 F9x90h Iep|] !k8Fsu5z,s-l:AUk: h ;[ۘ Mi~#" p<}C79e=_byDL @?UfYP'!4=si"8_ 9qs}+}X=fT%j{#soT( oK^' qp6orxM=_ɸiOjgf?_>\5[=y=\/~ju]+vsvZ>]vhD7&]KU%~Rppo/ 8R{~[GW=nоnz8v^rUjBlDK7uuu:U6ߺy8ʯ+Dத|9F4j7t~mur{% P^N{ 0T&UgB6 }FEU{UBdDD&D vASS  E*T ]rd9bj[vX0kq/ )"p0.*[ g1KL4#2gZ( ``RXbSR`p*TwIt1-U @ LLel®)+$g$nޛtv3rVj'dCY?MWY*_iŜbD 9dT"3#TdX]O e<8j!XTTE ]KA)\%H<SN "sTQ'(9aXw?h nQ4  Ffp$xSB!Ia IfRR A3jR6L/yyQY 9`8 -pB(F_)p"p( Ts0HAJ) l)g2Dzu5'(ij4M3&ʦgP4\u@I 40`A@LUVĒ1^3}N>%wFfUBҥ?me}6t2+8/(/y&#kv>><F8}0-<~~ L3=aCc8 ~>je%z9^Y9]\<:ʒfk\JDAϯ,3<Ŭr]5:4ۏpʕ\QܻW.]?׽T|i<yaU5hm)뮢c}٢*][1F[ϟmͤdSZY%` DV Q-²li6[) `־؅ap-OP FB̅OB@ dSr/235^ %! (ܧSWX\kF3a,gC uZPPxnD/oIE%]$ʦ J0"eωQ \ Mq|F0ij"1zv&i[sqC$:דB&4#mԑ!,V*0Ts1 R3G! Z]trr2V )(H)! ~@=b<=|60pϟ aL,LaTP1Ӌ'}l'9籜~ss?SMq"qcN čҜyIWcj')FD<1܆d2€bp7q,=D['r)@'y 9e Э{<\/'uQX0xZ5dq(q0o-kc8Nҷ;g[j>$З+uq:%89 !,}Do3ɪqtRL ?O r&mEq>c~%{>|߿`\ (  GG}~ 5Rz*:wvS RM[ѻjjYlmlYa"<&\.'1tT2Y*8G+DT}v'kӇiKudw%9vkWVNγ y&vJ[@:%[:*gEST-2!SZ/POf%USb cF;75ipaW|xM@ 5Ê@1  S'*m1 ]3S5yfՔKVJ%/@"Z`f%3͘xZ)e 9 ;54Od@ +& jxcP%"S5"v[΅W +FX\dBAS1Um%*J() jePU[ r,dIF?w56fƃǘ PjwF2n# U އ'a9k)ccsnC8 ݸo3#E13H[=!@d$1R`SJQr}?vr3gkOzg8>>!u=ASVgX-0I30wgy'u~pݭ7Cy9<Z&75ɅE{_9qs0{;xϾw4IĦǐxL{[6A7f۷wwI9۝߿?\c>9qU)C׾F9Չɤ%fڦu_9<K з^?6y'*&J45I4[v3foϞ]'?^{<?|'Bٿsy;yGꕋ~ܾ}';<W3zu_'>X!_m[3{]u2$;\[Z9sW˾O+;EU(9Sk{RpxjqĻ>kpS  èc?l?-5æT ͆9D)T@NɼPq XYEFA p 02 StSxiyaf+b9^5ũ@U#o>lC5QUcI1K -^fܥ(eE F5wHT.j)FXWι)-m\>U-f̪gW,C3ax\JX |ӰL/+x(c.MSLųH I;gEwO3^tRsLo}o;iH 玿VB?ǟ_OVGޣ'>G.У\u=~u89Mf7G{i_zfDYX@jq 6>ۇCݼky6̌=́tеk5傟myG4A+*ΟG'֦/2p@~Gfxsoζ&,f-P"ׯjx {1ڵk].Օ#ww]|GA/tV=zn&pnzD7nD{Wi d͌w)xMw&ei XC5mK 7kʴJq(G!!/`zS*@9=SͨjME\hV 'DUd\Jf'?0.dP Bdm~`gD26#@ % C!-G 4S#iMSC2D"3(0LU!dY(8WsO씙<K&޿5--Z͌PUe##oňfR *1JҴb5`-zĠZYvX)ګd2euJf4"Թ$AD)gMT@x`2\(n$KU2:u'M,+Pc,m(JwmQW g+Z!b^s΁X6S7`HjaZ7D%~^0 %Xn:j?lQU?} !E#yTS86x ma !8ZA$ J?tQU2gL4a6Gdx EP5 SxSx; ulTQc?v*v= &IAM`$0`Lxn$exU;Fi f I1m&mӢnZ)f,'h&5Vg+9,KFՄƷDG=gƯ=X_xM烕sJOqdٲxWIz?M^~gk:9qqpg 2@_ʆ(7aM:L_{clFRx FɢieNw _ii4}^Njhz2Y^rN@*+҇+-+`48z~p~ W|lr|!M*/jt/5 YBr 7;\?tv=[@V  TuU>go8X1M#a@HDm  zE & usp*:{f:sPK1\KiDy垘CXh=lc;Hе=R;LSFӶh$L#ھnahVPU,:*Nka nڶC۶S`Ipsgy͚h_:;ĘPQKEDF`<>}:Apd{ې[hӛ%~,'F/`apf r8?zno|Ow%.qUϛ?{WqQ0۸_ o}!tx|ă7'|ކo\)୎I"۲̈́:O߿rYخ 8|`[۶˖/&^rhp;g:Y/1"9ǣ6?lPg;gxN7b ÁotnE+MYazH;_'=c*>?Gsm+7{e= IDAT6~}գ_hNԷt.*a!o7L"lF]/vېF7@GjL;c)O%{8kfaKBcxSFV5l< FAt)\aNH) @pD>^8L=dPYhAz]z,+nQ!OySٶ8GXqDL_.xy]@BNcjÕl(oэ\ԉʀ/wK>ז[m|[r- M)JM&P䖙Dȍɦ̠p&vIV%|/eDYwg)$G0QL捰p22,`DlJĽ6 k $'4̾5Wwb wuyrxgS#E#&ܵ ɵj4bcP/)uWv\Uƭ;bQ db QI)pvNmQ 7b%ꘚF($7 ՑHZt̲\ɷ›fa7¬Tq~qqCi*t4M yFG[|SD f"|&rCeLൢ f%LpW bRuZ4iN40{mMaUQKHEQa}L:{f!YJKBe"*BLaN!:\ ؗ͝M395@I!Ψ0ٛ'tMsG9ODLe'a7/8$!LșU1Q V}`5Ǧ9BSe£c%!33'kw+qBm j- _c)Ȫ+V+ ,ֳm߹jWu# k'9z`K\Wo/_lw|4Ո2tKT0݋ፎ'-M(p}S_mA: FnhbZJML[o$]-(ǰ,Z+[l(*Im7UoVA@Z8Pa*1's 1fiRonwpyG!+5ٍ"]rwa/sq; Ic ӂZj$ k&SZ RK䏮ͲsfAD&l&3  RHÀq.Ab;'s@3#irFLӈ,bvhc 4pi޸e kIpHM\2f_G?_os FL75z0cLbuDIl8?ND7 R?D !Ee~MkQ)ls"1 `#Lp$w@ E8ԚGwd-DKO{ӏs56W7&`&!s+:W4 nM)OfOaj FIm;DDSzI>Dސe`e3?j};%Z̭Y~H0 Q0M5HhV*Y9i8%4< LdP͛(iMVI"ܪafLy悧! qKf%cD-Z  \vKyP S1;9%VTuоv؍h_΄b!pŲ_`@-u&j;TvpT)vAd~!yH)!ƀ)}dHhb'gd,~G (8bJH1}=1%m1,T+T qܠu&J`4Aýp+,6܇$}U,e٧ݡP3 k{4'HQMgnV8 y OsH|CHX$Sq^+yM!I[o~f{e%!-R}*R@p2ťn< 1m[ IMQka}e/Blovm:^LYOL÷'nb}\=ݻo%.q?.!$Q gbppm|-n>_9.ފX͎53Զ(}g_)_JR"u:MEH""BBI\$Y jUc5k"07@Z̀ ǮWp5Y*ԝmkV.\_MRn|Z~x;{px~~l|Wik'Il<]pb*H?h S"Ђ9XJaG7nx#11! hUy-l;upje1s$1A^ mOY~f"p%\wԪ ̴(t6! &R"7f{9j9|pwf8B|EK0a Md\ @ :&>scD @6%y" !R Ϡs݀[GFŔIilx:Th%`\e֚yS ˏtP8UXNJM}E a"h8i)a2)q$;i9ǨZ6" N!M^9S!4'6MBN}ڦz%ý`;`/'Bq&r}} (x&C*T-1}La,iAJÃC;2D, ӽBRTh)`&Ly#O#Gs`K؛qxx ݲr!J@eOB!ΰч~OG# ab8"9T!UN,sP fRG/of,)!P024i8?_z~]o]JJ/qKÿĐf1Cp x]$zy;}uc^ {{¯bJѷԆZkx+C0?|' ޤ>5$bdnJG=/'L$e>$7\tPUb8Q %s ԪvVaV iwo n&,8"`^,LP|^O|P$ VK<;6.rIp1jEӉ"Q@>YдWpRsO$=vց +rŸgH @{!ׄ?qL]BZvBXa9)ќI JL(I޾A43BDl_$ s 43"g9p9Hj "OL%"3#a"jF DtŖH@tn̼b`F=ZrvG@=:gD"$ udxaJNOj5s&^25;9uG۝PIkc a<~QcwOu*T,efT$qrٴ׮ޘJf>v<4LHn>W02`CfDuy}L-@AmbezH@3RΝ~džxp@`sB&N4'2C]B  m {t a7$40#O4ͲODӾ[0)%,Kϩ̄MUSD!FO=vcH ,PrSKxN9)^Jh|N"5``GT'm߂#zqkA}k7MalzI+4 |o/ @sJ-}o+K>FdmV=RD]x' OU?\bs7{_z%.qKEp?!ƭ7 a` ֛>dm(R>.XU>q\+Z ?{ <+> rH!Hmr X1QSWA@#k2e`:$"bf̟Kۓ <9G`׬3@ 7SW(G>5!$L`h&0Fwn K`> BHZfNpvE=`^F6BpMͪ0:VSw(5%CΛ r9X}Z@0h2tW͵%ޜ{A'Fskp#*i"тn7Mv@)SmZ d圑q\=O]ۢo;hW]굢kFb@`my XY2 Q3mۢBܓ*FM)t}7W?9!Qb[07VTqf{fA.DDf]~@!p4 bs+a.'EF0A۴0UX>.`hb1M3AھbnQ|Iָ LӀv83 c՗`eM[&}kXͻBqf4D~OW K%!l~S{$(,<ǔ:h 3HPUyyG@D=i TL `dcdz[Pj=:?vO>I {l۟yKrxK\O Ľ߾ }  v ~=^x|(}k/{KݯqN[-6۲k.n'_71 *rztⱪ[PhMr,9d^!KC$;`q>1{;[:OlSeі29E0yy>P'X"U ٙ_鴤pݶ4N1ĮjGXPψ 'BlB|ĠEh`: F$+N$u3drгkMnDejp0BL ;C9w5ĥ;MZ51hUb_c@DpZDDpd bs?`g0Q$ DCe ]= 8L!К\&HNy]I$@KwL 3d?$Oۓ>ֺB5O.B{R?7L3p"\.āe.5sR6|xuA3C,,POf 35+b\*ef7,tX6M[j9xy+ } +LZ==eqZ bŽVmwL0pp"R0i>piOsb\^Ĺm3`m`%„R& d͝~D-+$̒PWQ Bɛy( naFsLDmz~֭w`Y.qK zwwu3}I >G߹s'hoG?wxt]?6$qVp3׮_L<%N32v2,*n=f7 gEpFb^r +O$H ɼpR L&N88/ԃ)\Z88q@'Zi`x! F0'&-bd|HRw9à f^ƝR&K:8!JֶM 'NM'qnHhb/܌e! *'[psiymЫLS|.ڈ1;!콪呏%\w@ H (XB8 Z| ai'sWu#٧ө4{ _3 @F̂je.J'$DD#3311m̶6*Q!Ĭ.A!10XJ<;A.7an1+fJ ] !_X؍|0cT%g^tEx"zə!Kx=Rۅ[&j13{`xLxΔ16sK cVaZbu FuA0 [}`ڎX.zi.O hYhVg c7lAf1a_U!mZ䒑|vABj޻vfgB9>)͕\D&G HHE~:xDBxH@GAjQ+L)Uc~e9Økەҕ`:!Y{֚HH)H4a+J)Xm6888 , ._cw&Hb/-01\S*pvB(l fG.xyOmg z8p[{xp@_洛|W[Iug !udv'YQ[ONyMiiASbfJDn;G;$P˚%]a =>dpSNhF uyQM8 f.YrTf>iT˚d)sAYܭ\WNHC·ؼu͈)t1;$H.R83]!=aw%Š 1z#_YS&Ӭ {lDM;I}r7-rWx3$&Y.P1HpuE|67sr_ _Mk?gݛݳ=éz/Iӟ{ڳnˇԃezT| E]O-[߇2~swi.Bwdtaœ70RJ߾~v6=n[''zl0wo<R&F*ʏR0&$>d݃׭cSOL30P}EN`栳 _Z=12%hM!tY8e&Jw}f*vҼ!%tP(ͼ5c'FmU>ujC&/W:rف}QSg湽;ƪ1iY8KZ֎& ){29g28TSf pzdT8ĜIc\ݑz. ꞙ8 "h #.b1B ^uHP KL@k?rR,#60x.U%N9܄Lfb8zPv݉q73Hin`%C pahiƀ2K:lGsJMȌ^m"$u7΅O=̒[rĒm>Szb1M;5Nᡭkyi'z*'g:O@SZ1y@p`H@RRkmж8c(`hx #焇J[õP} ay"Բbd^_ j@~9ujQJ am!qgt䌔kpOےmه4bX MrF)1$XWjk nyrHB)]ȚѕuL%4;JC+8 k4lj & V7^3_;ʙ yV#. ?NZ-_/_‹sGr}?3{wH`gp =_ݍڐP͠s; *'A#F"% HdӨ/h $V^Aa`Y4<,.\+JH#s4NϛPfURzrz7&}Ji_=tкILW|wo^4?5<=GxfzQuQqn݂z-Ж~rTh';{/?ϻ;+ۯV[{׋W{7qv=7I]Z=%v} u NV4wW?8b>&PU7"3dk: K HO(cdTVL77R*Nkjw{dKHrY"yW[~ J{3]>MnwULNW so$gƜa} 0x'.0urYX2x+)0CK/.@@ąÏYY`l,fWeA 3ޙD %0;:3o9ta4G)pmO$@;9|0/fpҘ/D<܌&.5.9j,dn b81sJ@PZgnnFb.;coVYX/w0wrcfY&̚:VrUBOTurVFt̐So9 )$7KY,"ŴmH5mV.z`GۯɝpVApt9Ca>g8;nqxpo#1s3ӈ,\1%Y9D 8!p U 09/n&ӄG$}8ea4Cb'sFcX1׊Uw% 2 J3*$"Gҫuf0"ڑY^Ny+M9T3|@\z gcrNIC3Or&2\M"7 ~J,[W=T[39e'3ѶQ3ΉEBKGDΛΜLuxA9Ԧ0$u/rׅ0 k;7 N"L 2QXjxb`Yܻ/Z-cx.U>?5qaqq^ зY=-u1 iM`hՀ@nnf 2TM(ԗ$VG#'˥$7[@-@ q0y*)3`uj֞D:R[IKNԭ^2s!!1t=𙉦IY[=xzz\4:FGϺuO u>:~zҕDIpкu#0:ɘkE{KH:Jpu\|j8H xL $&YO" 5+fF0\a8 j"呥, -}rvRK+ǡr7+_d|6a2F/UGa^aGhT#xtD!\Ifk8j9Erm,"wo0kH,]AHj֮U7 =sI%b'0~p& 4*JWzs=_K~_΅E]?g!PnKl/^;/|52K :|a+xD Bx|bx +CnߦWݹu}|>&;3KGV1gNO uzpqw0䌭SOǦU@K<r;J;,FR̐#p ;yM!H",]\Mu]jS#wq . w9%:G#yi$#NrJȩ`FwmS.mcJWɔrU)$t)Q:O0SyiuÔѕXlV=ԡUt%tڰVa jգ'O{!GkŪ@HnT s!ED%#2c&̵sG? Ams48]Q^-?%45b6q IDAT0MS4\mM,a֐KAN+A cK{! sZõT sL糴x=@ ÚYufls#rcڀ9G!4c5 8Oj`j 3!dn]o]]OJ~4$= i%~gEK ?W}d0~_g\ώ?ZErp.M<|ua7a7B`0Sn4p$F3Zz2sd,"Ǜ0 -G$Zk/5C|n z^weJ=CO?n(1R+?}D_Gul..oξġ¾ϏDdDzx9k=>2^ooxٮ{svgZ61?mkR1H.=ĒA6%QU%pS#m8SmRj9#@^A\x DwQb8ЈЩS3;8A2+"bN|Nl֋HO,gu*DDUY.MY6N9]f0'3knDH[n^wNj6W`,pU0F[AQ 6C Z2Bt,$I  aO93 -q2T"0aehacRp΀B! sk#,!k0x_3ٝ92 L p SiknDopg^P29Lx0 !O{d9 Pf%0F/af!+qq)fӈ 9e$.0c)?.NriKW.7;awvB'6 %aؗ)%1FQRXῐC8p"f}.{nl9(_r:Okp *-\΃X399"LQ4({{K$|$X(,ki7ŴOt8%#p_7ZRfJ4 ʱ.,,S3gS5 nVlkhk8;N N覊6[doWC[ }\ Ke>㮍W~ߤO['oOO/g_fz:./\zկŋ?>2@w̋sKҽ^!H~f SJ4PXSEL-98XDE{yXja*JW.wE7xU *dGQt,n\I+Q,ܖ.EYXː}Vku9oiEM+fǷҍO4dtY? 72Ʒ:FuQ7 /t `Kv.ݕ_} x]^u ww:2hizM3L̜Ătɏ(iu&yNܙ}"yA9`"7`mnfF 8wTfB:k$pQa3IzF suaNO=K$ BT@AQf+(fpSjZG]k=fcP@(™AL!Eg>X( -#Ab  DRkbA 1Xr7VI. &8Ncf"-M%qD.-3-҈rAZu3/Sv33PJT]D5Z)3-t$692mY 09LdBtx }Lӄ;Yڠ Rs2j:3%K yE&^:? DNgm9RjuQg_x|ܖ7D_O=>ż}oxɁN?Z_!q6xV}:^_oᥗ/;K|gv+ƕcD_޻gWGu8=" c Wsyx:yfmY4:.P &w`LA]]D%FZkV`чεc_'Z ~t"snp̙=e=; kXA\(A*nct3)t91oY;ռ2io mbsC Q Hy[4$NMf% 8ġ M í&aAKӠHU BL` X2\#!hI,^zR|p$BI / a :6\& 6>@ ;Vbdp o+РXRu@JrL$0hk ̌;xm pFu0 Cz=y'CYڮ`"qu"șQĄUi12Հ:!01, aΎ:!mPJ۶5$hxl1eա3J5TNuɆ ,0׽B?Da#!h-:]rfMLk5"\1&|bMhl7kV0Tr;ˠj`ULm8ÆY`39GAX6SQ+ 9ef8chA9d11a,g}A 'VgIwkni/Zu|^ZKW;O[QUַp?7/kͻEnu(ξ;yKfD%'l6 !&<%5q7daۈL௨6s͵50q\K Y#fIalD7d/WYtέUQ[[thFCq@Ivo ΟuɧgWH|>_Gy..)ٰ];7~3ȸ˸=ީڭ.u8Z1sVP^_x)o& 6s^kx{D\9p۳㙿yGČrBfIG'B8zwyaZ(xEDIUV0KX1G0K&Yݢ;Hp3c'QPwɇ8臲yAEP-P E.`Lcʥh9[lZɝ. pꡱc "dž 8ZhG{&la,t{4xkk U5 fgoKx.t\$"*+T+ 0 DVpR95 `B_JBbFJ]7 5;S{܉r.SU߯6;ODpFs׮^˗SBvBFR0t]NX r Д,ݮ16< RP,)k$07I_(U:G<8==œ'O;=D9Y 6X^r %e,K|h [k^:Wp;4͘8~_rtt^t] t)A$LtrPrA)5Ǹ0`ZUd\ednA*K'>go܄90MTqЪBR iU>=>ZW(3k/vGNi{nna;.om`n@:b^]y%%2ULK/$n?i{%?Ƶ\w|_ߝlrB}QƱsg:H)1٩ uDL2 J9?j."ëfs?k"}"`|MZ2%#zc43ojl2IgIM$zP9KBrF]>`%F 8^@盆. je,AӶ?%`Lc:nA礘7;:@yN-~ P",9dY*R]8|ZL| ,ȑI*Ц`EޞA 0 Z-Vp崈\HL-UM t-°b^ N - ê/HFь^"JN[j=`X \JtЮMѥ m3zKHZ6  !%vB)Q4)ς~XAhȒpxpRz:Zc0/T:p7dl7󌳳<¡w`nma~ejP.[4#n1Lty |w4 :OMs70 `|պLژyQ tOfjX-Æŗ6F*J! "FMAĚ ]*qXw7O 6 f1#t `dnϚ* 9O_u+D{5W_/~ oN /~B5[nѫzuvQ?r}[oOjsDaܕ7$֊* ѥSl!Fby֠v.;8Sdbg=B r [v=rtUr !pBr3x G .q`L=K[رj H#d7sVճݿ~s>}Ry{N?yQuQG.O;aYQct@wR#fc]ʗwxbzڿo$ełݿ^!"wYloߦ_cգUR}|+H\Б v1}ta )rJa&f t'`Cw_fͪf#=3;L4ca$ml(HL0j՘κ;iZgd Ԁ4A\g`9Y" &8LKJ"CPrI O?)1yt8/O.nZA9I-$Ca9]agCG nnwWn B"AM~rD ]4 Z70̩b]et;~{s/n9NS^{Mnn~w]{}*En꯾>./|}Qʛody4Ô`]>5|NR""yfgo p7N7VdܜJtVD5cRS>@"rp13SAYЕ{032 ,6{g%҈dѰT)Eߺ-WMiLmzo^5Ci,[3XFbBg(`at0^wdkB;=җqjػY;)ykagDSXc8ZVGA)VQ&umj0E7|C.M⎾ta!q8& ,i 4a ?ۋw}؅-t_73|k=s3ñq4yiߣ:Ǝ}4#:rKഀZwPc|I,f\1B7o*lQbDǻc5h/ogX`O@@UQSBMg6޲ڼ][ޯef9䊒j*c^c5`9}Wm >9t*=1Ew=2+5*T8uƢ18{%߿S|uv_z3>x#_Ͽ~oB/_ïHD_ײݮ?s@oz'g<1)J橥ͨ$h)hu~CUvm6a5TQJ<@Q޴7ي1)fT,;Z@3+bN&Cšs\sF2KEmWڴ8$ʕl=?Z+mR\i=:;?{?L'c( ?n?ͧ>z]돫lpt::1bTe&|E< (;^v#vɕ/}N>: SVn'͇ߚK\q>-FS Ns\xLq5IcӨqDfY2HtИ҃R|8=~i;^Ra'20IUݐZ3LK2`'!D䝸cqDj#bBa&UϤ^k8'w7U+U+3H WU!0!/k>XKC rE0YcjRPX¢!QKJlCRMP}6h@,gP1QHBC@ @0.~4_"AUJ`da*yQh!JP-慤 x&j Q8V@иj̞ e;2& dhɨ)Jy,i{Pm'NagaZލ#qsq5#$RXFܹyyAıх}Ys;p)BgCf̲{6VC9sW+ ypP%D`Y#0bG8&SDT0PЅ9y6&+5(1b{yg+R/,!0MM=c8 `nr*\!P, 1GX-a@3=@݄G8{]=,Uw.g?^ϿN_⋆_|_ȹzKF`-̿Iʜdrd_2Y$ 1Vj#=vAANH) ;&rfJN)E6t4M9AeMcbS3N`0cݹ&% %~{n7j–UkE)Tws7E7yNZ}:LW]>z]7 #Ki3Y/ ^^F =- E[q#:RXϿNNY | >mD>w7ī|W"^SV`޷Y_Ot%X=-z !IL'R\FW ,IkI:?~>~~}eԔњJxq!ZS%3wHjuWT5O ;(k!̷Zt,N;d1q` )H֚EȃAUQhCzqnrQ-1z|W9[gAAs!XjUy8o Di-Z-mيʗ7_R K\d"ER 2hV,TFQ%oZLL %5SؐHrafK7hΒ b ,@-@MԜP5j{cutUSDYA;eY w,\[-B+b1\SpcZg--%P㸂p^1b>8PrAʝVø ءfcY#ܾ}c戣5Ҽ{ӴG8y4G ;H)nSZAy]oR6.|ul>U^Ѕghfjx84aa5gwn/QbEn"RoE+CGN: 9\V1jm*y),j &l68?/=uВ|R78:a)]t}s\m/PRbۢj@˸Z3o/>JoӋG"~޾_{ۑW^{\3O>@xf& 7cJZ2{xZ &+ dO(a頰?XP@*&_1Mf'@md}SjMh~ 6Qz%zmvIj|(jMHRʬ 4Y6Ec&Aʋl*gKz*@ vU瓮ȉ)Tip^;ݯKD^_+YT_"O_{nV?؞$JDZki>g)ds >^eVUyUAxÍO<~>OVP "{.3=~=zyl%{Dg8]}SU׍GiUҮQ:72 %ww 2LKI!Awqyr 颪]W"@$PJbJ~+^!i2T4+cX8^)NC~MJ 2̝=ƠX3Db՚ZJ`&ZnVa&Ϭ\Sh^i`$5}Y_6XЀpKZ7 -:4QnuUUMR "J#@%= ՌB=I"7T+ G\T:`cdQ .iw\)dbG]h܈edf\x[8Ȁ +< 6`$m{ ̵D8*yP>Z G"Ĩ9BkE h~c7m,e,5T$1i&0M<Z 3dj]}H#V ƱNDB9Cu w]G+ u -]X/tjKvKLN=]^_mNnN.Hm^ V;͇giw TU}A_ c6Gt:$%ێ-FɊܫ;qT:׼Hiiq5`Ps>đr-ȵ"ڤ.xalr0BpΡT 1Xii&DHRâ, URN`!۰EhIbԒĔybrT $D CD8gR9f}F<xO>G~b{ןz&R^ wO3~PU;_G{ OӻRG-ez"f|%_I+IIPS{ ^~{tZ"7o=}G;/?IonF4D- 7{䛡VHI:*8!nեZOh<.ҩ+c)E*  攽I #/rBB+RZ53c+Z 0HH)=,$" lH^UO!LDVURVUc!jU6Cz X ʬZKXLR$ "&Ddyoݯk+*?A >b﨣hR+{+m\ E)OflJi)r6LO 4&Z 詅YjN-,WP:o!5NK@%޲ Vjo!o7`5u-\K*ҁIDC4F+PkKVGS)`0?kY8bc[t.Hqz5B Z~DKw_X\lE$8vF=wG]&8?8"ƈ#n޺n@0LC%ψi@ axĖ=4M-4]`ɨ*~~ބM!^ 3C_x|9w;/uR:uq5ջ6*1dP.sB8 %`fa->|w5 XMMImg~,ox J6JiVdkO_i)a7CŇƒX(&Uua_E5!\4}nO/TNWhLsl|{+j2tǫ!;~Pu#/_b1NjQՂ_&|Lyc?p;Go3o쪛*l{a z~pwSnz:k'5N3oMs  Lsc~΍;~޷tw~H>"}xzIF_7H_U-F!Zx2#&b?j k+:z< Oxz!ZnH)%UDCJDRRsRH(z5#H?Vӆ[wZ?+K/@'v+Zd;i['o3RaRQZW1ȅcJ4b6 $g~IÐ,HQrNZyeU.E懤`(A@ aB /TK P j.Tdd85v|QzAc sN`,j b{Wx^z${]v=ULA['6RJFoOEyMx+5H(b2\f9g8ȉ0#v-rI)w]Nj9΍(QÇ:ZάiGG[0<֛uQs*Gnߺq9U n޼qL0P 8Zp) 8+4a{y T/haDBy\ݼ)* P\mco6ؿzC}PTޝpZ5Q~I_2J%F^}z'㷏1$"Ƣ0nR$EfM$]]"cAּVEQ S-) P!Oy"LDj&0 bȡoaxXK&T;aJȹN\r2Q;aQIb5'C`fed`)>Z4$Tcn;Kcмdf%úvsi yAR? g YVEl5M 1 R9@&56&[so2:{YT"~R2’D[8 W0hIXCiaupVfYTٯjYƄ*r]vvD.|p薖iYT?gd^>yڙj5]05O{[% T}^m*Ю9g]9zĘ5u0H%cYƪ1Z*يS&$`a^a;H b\]cљ=ϜџD\0@cEԖiÀfq:jy< c0)3bйZH 4"J{Ř]cT9bK C])ey:yz t-wZ+yBTn wQf;ua8:>~{iAvdJRnn{~G{.MOnz^x;?qO$^Y % >2z}녊Ƚ/_]oGxvT}$O=uk|Hyw-VGwl~Czyq^>y=%ӷ6Բ :_Op B);q1*]w.5s|NدQPN9{͏j?& Ds8?Jn7P޾nzʾlR)Ykubˠc hޝIߩJkdtyM-ȝ+\ C2E^cf2{*IU-d1oX6hN;1ځZNh)BɼdER@?ФoJd,ROx`>:Rpr5hPX,6yvFy0b=lj9mv&\(j}C Z*ƒJ'RZ2z?k{=&%p]<`)흵}|\3ǒ֢Z}(QcMKBʾMJ$Pn]5(WKՊ\2o\p̈h>H-,.eHǖ.>t(`" j1bz䫀% aDЊt-+A$6e%t \pva8OW8AGVkmyZףCy4Ut# + }0xTg*)3yn'{?J6٨6 wBgZwX EGhH-Z%=Uyf_qhtbA)t]k)ZSL.S4w6?17u"/>TVoբ߫1=֡*Z|Hg IDAT,7˟8O&䲗HIKH)9N;@?PS̓ SrO1cd@WJꝗ[`9]jdpGL' {SD537Yj1tD F)ʿ_גVe-Y &sTYSX, LP33i-D(O#:еn-͕*1١b&!9{D=<]8X|hw>`\묚@D`x~O^zoX" ,-|sZ sʨb&\]\b{y uz]}!ƈ- b*vNGk1j0 +`RV>va͛BV^\ brl,ɘ־k | 3} ޖkV 7G`76|a&!;c0 Z%W%ѣ3#G)8Zoێ B6߿C=Jtޡ(aO//_/}BY>$r^ߍQ6K/IDEsÄ)h Fusi 9[ytC֫ZjՂ2; A`2R2 t0h@19j'?Q[}XOIoZ™"{r2ZGwE3r@J,4gx/&U+R6kC˿QU3Rϧ]ַn o1I+{tIʊnHڍowG^y'' 'cNz:UL# _g0sEč-N suNq3crvS->##@D\K%JɊ3k}ϕ;_eމ|e7Ogiz!闕JM0'}MY SrzR+wಀHSLs BFVME(f D$$TUV-N@:s)y&Isk'+e3P ,ajQ%iC.j"ldet2;k- Jb8U/LJI٤$j+5C2RMvF SVhkmQ4X7@N6 QK&J3CVvBdRMӌM5"P@ !5`Qɪ 9Xb"BQ4O ,h DMSJj VXDi [jϽ*m*jbRB,X%ŀ`M9͐f1٘$a3b1 &]KTSk6^sՓhI"x4 cbWwpD=a%*KFWKІCߙ u~o*=R 6vq۸q2@(c]\nŴB{ҁ`k}pt<"{gHi z 9N&%[RrMC@J%]зyʹ) J#<rHyB{8 le̳ kD$(5H6` ][ʽE_|t)>@w3|h/e+/{^^{~(ouOןݮ!_>{sݻq7ZbyN˷Y&4}ѢDLVQjsXe%% d}1EAA,6ق7Ym!DLU(ȦK` LDswh jl"AZ-MK'f*MImKdsh9r1v5W$8bc~Ϥ:q)"?=n׷ ?3z}7 _I>g6w`/kKyNGS*f]"sMGseuׅihMVau NMfTԁhdL'$,@}m 8+' |O~ǚQر|qvW7o2O#jNu(DN)hKn'1;Q5Q{Gt 1;ڈp'uNNx`(ZUU0w'6dw1i$8 `59MQ{LBGj:jÜ@+)U"\x Ls$19V؆gl@WXUdIxoAE+ើ= S{j`hg?VyXc{., T5=,Zc1~0 6 `{mMcؘ-5U [vN 6Т0^t=iC\fw4"W[ޣ'IDH>` " c,!3B-ȩLD:i@LWص`X¦ji6S!|¬" W=l\']*lēObG\^bۡ~Gggv( q0{]s]aX#Vsc8 Ei)bg穱WV/rm<ćmn-a}J^:@w61aD}ȇE)N4:)@60٪7<iQr4!瘠(9#ńnuY~Zpѭ^hm1W4^ʸisy? Ox":.W^zM^f} !oCՓ|ًz?G'D 礹53s 6vbOnlWK6Ӛ֊>"4CUf>4gB^["ei%ijVJl^ZPTyI"\m3|S!@,T،PAJp΃ZJz 'N(6LM[M64t @$Tk^mG?@*P[[}\ǭ J.ԋ?G#<ü[,EN8ѯiU R7t>SIU+$$6Zt}⠌"Sf9ΪD;T:W=`\n2 '> )lZ Z90t+a'&w^@!GFM)2*:8aprCgsU2XAG}߁v./,X^#P@|5ܺAꫪ}=6 -I>K])! $xq٬E@g س"4_vVop@_O}p_MG??+7"D?S}/Qv'C#"ꋼ{S+M}CuaU\oO{B7%8PբwEPGQa_5Mutu"CEV-!SaTQŚ^VP8)a[j ¾RiqWؤl{0,`ׇ؍a/>rZ4 悼CTKUqD]V\8*$ űJm&'T3h@pT8i5 G^xs%Sn6pxL.l9gEш- r#׊VYq|{nN,!>B @R%b}7 ‰ 8C)6͆/&4]M4!xd]@hD% o?4#[S;;Mo'7Su!~ 1~Hu7!O;'UfRf& }(M38a#%ْE\7qD(ܺPr -yw,þuoݪnv7Ň0-Ѳ+f "d  S@e0I@A`jN,9&Ll6Q{ :綌 LjJJmPͮ{󟽿r؊@/ %w7F S"\%$ 0)jBY2Ґ -Q!v.̑dG|'K1s35GEL݄vktX ZD?e%?W~?TÝ}Ľ\ïbX?kE<׳"?*3>u8.RǼǮ yqrak}]ϛ{WmҰݤ^ mE$4(Szz?\3U[ b2]UnӰ='Jީ()HoV7hp1ٸ5HZ#:oΛ^R$3Mڍø3HE.L{E( 653 )13Sڼ f]9E)T.N (wI&γ'ڱ hՁxn \.Zx.A!Up8Vy-Cmq>1ieKI/9sGٻ0V[Xl?9& C䜽#9V]gtR%AqB-rf$nEkpqy2>{kLdWa]ƌD:6%L4bC 96t>Cu?͓?盲S>5%QL:>y{޼r>_r}_y~件zD|'!\O=x@<6 (:3}k,5|i.˜k%mu5Y0g,SBs\>ӻy$bV0ePX }Qk6 VYˀ8"W`L5%qIyBoTUsZeZ1S"}sm@| "@O-5ˉ91fir߀53?RS<$D_xiqo/֟E3{S:c?;~bI-mno>lG,7Xs'-iSmZx`J[Pz"iS!HR$+lR U2W|'S:0L;{; '"{!Uj92lܕ=Vz>9zL[bjsʯ&*e`ko D\'aQa8]%@#3gI鑈\!H0(, q& !CA6̨)3XwrLڕX8-Uz0{9gA`JKZw)Zm !)IrgQdPlswܿ ΂8dE"4+DH{ā iI]TֿoUduR{U5T¯ B-Q]{D`fk ,޷5nnoyx=zyvPV3o@{yzQcv~Wsf{\ s}e9v}JW-'g+Yhu>O?ۭe,1 әyPxb /bP@}C7YesP vs Vb ,k9ynS侄$i}X{GD*?zpP]2-4} ߔkxx=:WQ[:&׾û[2J=Szi`g:xmh+ɭvK{+jd a2_FU}_$]ҌhoߪH^m \)j▄;kF #h[7u폟[[pq2-=Q2T&pBե |PkGr2SE=*$u#Ta '#Ga|ZWQy ]JÀC܎; 6)kx0 c[J/=ffzmi0bqqq1aLZwqG7쪨t:|+r0 J0nF36;u|C<(3%g yanvuKN)>}{؍bk: I<鴵IZ09=Ծ~~E_{] otn{=ϵ=Pj۹f_%Bf &*y ZO4:XRLxY[㐱F.$}D r_CLGE#BS6DZ$,PFUE>Z yo.s1׺_-\={"ɓzo'x{$9f,NڴkgIzWiq?@Wt Po43te]Ȇ(}hF:gnByc?ᳯT7>|o|k^ᔓo<'9v]|۹1@9L#JΗ$򪚙*(d7 Kt 1_p0BUJUM0^6OFdw>_O9_H$i}U"tnD 2n^nD^gُCB|tm FRzEy("[" dfL6 3QrUզd+zP*bɕ/&Rr9c㟣.8M[ I,¼>fEѽUo<0ܺo=`Ú$M">3 }yؠ SP!KU^ުX`=yY w2~mZADD=ׂ T.J%fX.ɦg[W;:${̹|_U0a|OV H|jrLaEr{[w]_L NkB'آϔMzS]: CIH~_-7U(9cۃDGJw݀{<`#i d|ڈ`wآy=/Mzf\emAe3`(es83<}q`cm Bw$LunfӧO):#XJnjIjWΧϛݩj4 C) F`GbWIkavE%6C(Ⳙr$gEj!HA4y?q<ϸ9uc oʐnuwal~woy~Ӆ,ˋy?7z޼)&|^'!g[oM:yJvCJ )iQb/ ,BhQ( !?1ӕShen1E #=fZغ2젇a!2 Ƃ:E_)82|@$RTh ,٧k)E7QZ7[^n,ݣdPHZ[j0,Q]/;Z!)[k'dōDYVj~u]AO ^k釵l?G$_=[z1ߓ/֟^Kǣ&V嘍x:˹15fRh٫.6,*)' r1d.ZYG 5l4^iף@UyODL,C`b;*Q`l1]CtTՈ] tsvR<[]ǓUOn耙SID| =gyEk?I ˞rr A;n2e"Ĕ)̜P0f̬'$BKAѪ3"\/|`aݥ]#ǰA* ~əY^}fZ]5a$1|o5S{QqI!{wƱw}T80,OH-Dܿ涸< a|?ܦfZJqj)80{A ^Jqou-Xɪ$bCJZ RUhdpX5a 9C1C̱_ >Rmu xMP,Ɯ< QIYz j$`g{p@)77h` $Nl 0z凶9n77#LL\:Rp3P0ՊN$w`N`Z14iq=znnV opx#|l.01Fg'wP -q}4"`y8(g@q0^K1:% +CJ"qS;SE!yt5=!4pJIĀeٯV~7(u= Pɾqbm _ [-TV,XB* ^Y\"$.[XOsײϓ. 3Eg`i08!S{ЉvEBU=@j -Fazxںy'8 82$"<$C)]炎RܗjH뺤v\_W}>"VP'ᖜPS9-=wBJyv$9nO]bi}e{M 7טR"lw#RPJ0xr m+jf`ݢk4Mhc3& =0dgΙɹ`rPF y| 3{R%eA< |r OjaAw`w{Թ|>x@amF77.r⥇o,giewkW|_ߵo=l~ͷ߄/;%[:{IFO޽zyv?IV/ZN8ڽ΁dMUYd>5(QQћ?h%`F܁<̆YК;A$ǃ6u(9+L&I^R?gBܔZ\S;[uWkbOK]|Rؐ1 aXY۸N'z.5䒣+{BBL{$պmǪSOzCOk7|l/I.^rz 1o'{OQWlsl`@[Ehn3'[e/D1AYOvrA<` ʹ`GA?^"ɏ e:0#xD; 3x YM_Ϸ7e)~w7̼_~F8+j&L&4Kl)FK!fZ `6P3D"iE?|s_X(H=mӲ$/ ²,% }ʁ卶oImmv5uP> 3\k3zθ+'84,Ls:{EDwՎޢ2d`znׄ\{Ӱ8,7 VޢOC:L*P5W*|Lz}na$ED0k3G+GȓDc?!$kOWLĽyVx̭Ka<inXA00c5w̺Q)9P6u[dI|3p5,(s)-6-@l¾.!x5K8 {q qi(|גC{Л[f] ix|GUdɸwy^ fv,،#s_^[0 vRS\SBz<"n~လ D\OuN8` nwۛkϷykdץ#w\+O*RnjniYR )el6l-240O3 0 y)ԯQ~F\v:3vhsfἩ[!~[~447P_~巶O77ӓgzrë? x7_Ï///֋ϽoɻoN0\IuӼn"%X FlJ)ebf@c OBeӾK$,)GKR ):ܾ4L53.D_R{H,`SNp;FJiTFꋷ@V\-a0 ]f|9 &Of5;#e/ob2㽙{'% s+]3 m9?)pRq_'ߗS_dJ5'q's)uk3( 7cJ ytds1YkoxCLY3?d;~zW&1o2D()DqA<0LϦ6ḩe,We(?QJ~NwTR&HR#O cDz`fޤRΉER0ch+ſPU2U!_Ds9u{*t9@ ]M@DK;0:rMt/k`X\"ɚ xm\!dݽym>OS |xIzz?{%pxu0sz|mNpzN 1+^T.N[9!#_T l-lI똧E& ѽ] cK,.[8"O];e-Hb_[^db_EXte| =#LJZT[sSnղV8Xy+3-ԜL)OپO"9gpptT{̌6s0/$,Sk^__{Ɓya P*jmi޽{8.p8e\g@GgϞ!%Ճ+^ZZq{siPyvUO󄹞?r=J{ڐ k 7-ν@46WgSXFh:RB34ИZѫ+,[ uWa%1vyGĦnkkЧme;z}O77GW}+|_y}?$dow~sozpMv_d FZaJn ٧=)w5Ds"^ k3zL\H[ipwbNTrs7eg {yEPq$-Il]qk"(1ZΛ1L:@Fj;ѻ]~O O& 3^*CJ^iȱq.#)eΒk5ƹ_xA['~ݫ/ǿ?=`mz\BQ#Lil0ڌOmjgR @=2߄x lF[a\6% "TTYlL /!06eN]S")"=-2{%+)Ofhz'oor{P?[{!Ģڳ1 &zobׯR8 lxD\KcF/W^ n_wA#޹`XJ Ir`6sFOC?M^s 1B.^>3Xm>U` @,IBA$-= ,B쌨yB*E DBhe3tp%W2mz{XNZI\‰H֓]IZXgvX7N L@!A$@@)k#XZCӖZVàkiuVK^X@(AR+P+]uggzcD{vaR{Q/00z⥪3k\p> L-,f "U"'9=@،@kB!y?@(ζzy:GKd{vqqiĠTU\1Юnn7(=g 3-%szq>?ٛ}htSMG'C~pd?}g IDAT'+]}QE4R.VՆtp %J{-u-QHT[ T$hHv  K9A|HaNIoeD%:0˫"200~e(8cB@Qb8Pp֣8a>rRԺjeRJ:>Ær?e/:j(}SEQ^O5  Af{wceTda2wǬÖF{ WoA Xy$sʑ] mٟ;v $u8\glx|ٙ6 `M CS~;h9`Ak, O,0^^7b[]޸tQX uZ$ Fax&9`Ѿ9`kl_+`x "Ma+RkNu]mόәVȶ6EEHG`@x=[۲%a܇ ː.u qzV蠵{xǒ*"|`RȊrrØGJ_<4%XWuB$p?!%>XG[mիXJ.\E85y 9ljȰq{{tˮ]]Rips{|^ ,aq&Lӌ<2?S f$4Q댛k\?}}Gq$]^D4aHPC~<6>2"Rɐ<&]2_m}WSdI>hsVkVZ3]G{Z 0)6&1PEwfd 6O<:LW _郺oGkz~b/*'^?3}m_#hEmOL:CRT{c#ɽ@8Ɔ~hSGa 2D,>apdw)vW0ϞHΞ\FM yi,(:i ,Uf*1aS4t)a/PKl gFS M/ݕ0ÃS2ֈ$Ic)uJ{Bf|ڪRl8 /0*VH,*jB2i._'52xT8dBH'TВ|n 4$f"@ی$59_0zC3$jusA)!e]: a?$0%+R 9d& M`u y"z*T úE&`\h+3Aϳ3UuFfB 3Ep_2DE/{ǹQR $CKdUk 3#s k1d1\{[^P!%~O_ܳ7gliGk)7 dJ Xc_!fT&`3aUtS1Uss )zGi?bȒ0M$% %uL{]-VJ}E״;ipUn{bME"YK=,zp!礗^ͻ 0Wl5dw^Aqpp)p_$upFwN#ΨujE. `9N~D8AK6m-s2 A>+Osi4MH0fZQX(`'p #lHNЦh`l6;$q\+2z1!R?.]X;N7#mfrP˭=6^D_.+77Ω7)'bSjJ,d5|)6`ތ6 e<|`އ%.C q {( M%%?4rΫ1V)u73'* C~Y9$GN>bu fɧQHTl8HU1ښ0S\Dv"S ѻz T!4~рD#kHOWW鰡T䱤7F^R`})O/NY?௾;}yL/ї÷޹W?OkzL-A(7s:Ճ"Z&ZߣT>NytsmyMF ƍ',H99s qR {Eo~ne` RDgp=@'L m@ibC>z + "yeDu !?սӽ.29sf}3 ]io_G'|›o}SaM%/֋X!?y~CngmҳP2#k<4#SD0fbi47CADE""aX%6V7.5U5&\~=9뻄7>D/fs锈 Fo{CfA7k,!ztyвZìOpVKy3Oܐ]! |jaQzZx;R!*ĀT՘Q[^qaez( G_u4oݎ]rw8Zmff3$C&hl|`XsVfGw H5u4 x/V.hfؚrCEzm;njoX'\ƶ!A͞3.t)f @L}C7IRXx`E X$ 0P}[r _铞/p1] dIIj(À;K*D "|\T,S|x"hμsK;B@F[e5D?gKp` |2d]=9WȠB80.z$"d@uEo3#sI@t϶.?n :Ƚ!̥82[`Pma`^;{ (.=enr/(q)^'@HK=yl:[%% \k ptː"Xz2#P{u ^q)_.9ޭw[e59gǐ>]{s6C-Џ8 n x: "/{ov=c9Z;?}l7'"DJT)(W."!D$ BB n-7 U!!z.rA$vĉϿcp1ZKC%;^zךsgrx鼠WWW IhMQ;L_?"M[ L"c+=1h]q=a7Лn˲`&.pqya[(0M0 tZ\?{6xVh}"atrGJɳpƸۻwEq<\ƦjiJ P2-:f^9 _Zп| 'cs/]O_2[]MWSVmňF&ݐ*7B ֍rdp+lG(>#M\oEئQa #bH[a'[ckr  %y yE!ſu%Bm ) q.yDPrZi΃#mP_csMrʈ`l SGW{@"(t@M|ܸAWU'AnƳZI cZ kh"n.A6Sڍb-6cc[yy0v_U+W')YJ?Uߠg6|`ԾvlpO&i`kU#uo?i rFJ0քO P~l[, dz>猡 @P 0R1G$/X%5AI/!|鮭$D y0fK\l==dk9NqC$S!z*+ZMi[EҤG1aϔ۬ ˁV/Wo]_s񛯊')9 FxOT^XW~(y8B,E2To'_#͔lάmnf(l:ִ;]$ט*3xMGbS:SCFzTZM(y= `[3kYu5[И`{'"vs&U3efɛ-&U|f&$Gjb f60Sr;u( aXw㑺43'(ih X=M;e ⰪXnޤ6!zxkc}#s]Fg}w(U5z/m t $a,`N\MvpmܵG_s/(إFkVsi`ڜ9m7SoJW39&eY7CdkV!ħ} WKkS (OMzo1($CN޸ .p$7:uNn;|N0H#)u8t`;b^Ȍ$(UGSoUF ٫O >fxô̡{"EJ|:c SS1eԛ?]bFֺfY𭵊i>^ڜcr)UodrJPWFV6 IXMinNH!w0; 24{O8"`!1a(r0J)iÐG:*2+S5%Cі]lh;jnfOsNncj>_z#[g;g)dv㜐1r;}yL|~}w@yl=M2<}Y@}_qc{M7A@/F_w\Co<軟0nK*ʉM<|`:%sk #S"D ̹[H@rju+̑p@8S 3 JwC,j97~@P`Vʍt..150t(Z( A(397 p"HNhFu4Q:-'Knk3CJQkțFд!GC(u'ZQ:6tOD"؋3[w םHj j``>s%}F7Mjb K?^GkgdG>_ۿCO0?gk.WrO곯>{yg!)WWO-˟5w Ob%eԉ'ɳ07U4ImxьƽP7Ck:0G ޠR2Q7l7d>tC"V6e]%Z3_cf1&٠]Z[}>D.c1s&\bc>+p?Z',$;jFB̙f | "*,%{^zAdEA6>᪋ܒܜ fF7VjF)N^9qͳ[Eb'X Lb$k5/B&: ͯ6rB)ͧCVNLhsH~@MVO}ZyPF7KGv;Z&oS`ӾhӍ0Lu Zo }jr&tizˈ- ֽi\juGH (G܉`cjpi/lt/3(d 3fͧ掎skhy;_7Ka cFf4 mHe,@nܴ`+8{S)%G?]ay319'zwT7TR`02Z@3Z;49|s{{ fyy t7 ;ڢ!rV槔0`.Q" =?ݩu<{ }[`9ݺ5h`&ǂq_~0Czx=yB4kG:eT0\<ςP=| IDAT;QvZ8MSx3w}47{p-)aYpη rWޜ3zm0L 2|؄mkJcO%%o]2ăoS<-`|K;`̿|s}ERyXPDlD$ޞ6pbeB1#J#;2 pss)68L,yyFnG˖idMQ0G5pTU#s5? 8jT5wZY0V0x~`ͩ-i1n/߂sF {7C],u!UAr@H$pՠH'1@%o^gO!gEvNZZ#IHL09o { 鬻Wq} >7)^y??|ln|<H< W;_fK~ޔ޿qǴ{.Wi|=)U 3t|PLDu;b#A%DalvMG0ajT ^Ʌ xB; J+}p|OZ;FiW}Z{&|,]و J).1_3d-Ht#m)uzASt7bj[?EiG"Aū`ۀo#yŔAJL{ƀpm+D1Q\>׉ʪbfCGzA~G☝M $ѐ!qLZC)͛EocX3֢̌L %LL}@0f -Ӗ&5gF<Pyȴ!`z2 3Za!͗\!KhЙ}1j!y gkdP67Ѵ(,b8~OkLUpD|Ns|v)jJϻkV6U0 9>w6(&>*7}A^լnx X f JdCS!U pyBk)o,+FxvprN Uks{:38:C]}'"R\s2G|96 Ņ֊ˋX9hguAKYmOvChrZ1-9psZa`)ikjz 28#B.]=4C_"^.&q5k][ݵ on砷W%+ ˩b`Uѹt́$3ܞn0r~y9ԌaHskp%d'7Y+08?hgvp)~SdWgko~k} _7~2-{ӉaϲHVBoȪ]X9 -sKĤ #\7wEB5AC|jN\ r sR E*mFGGr^(cz;SES 7P2ZsH7I;]xȩ`usT <mt۾!5]";JzVk@7$1 Vb-tPv}BZ!ᘺ!MGdL%Ԣ¦0& ]?pfA&MCQy"fv0H c:nSgy'+z̯nz^7ߘwtNNsQ߻'_ܛ_~:g=9|(i*k/-x~C{?~WNg~bs(_ n}Dy?o?z9scoZS&74λAb Fi]擞0ҫO3j.w>{yoPr1ES& -d^`,;t]0v赢MX>aZFJ< %q4ɽ!y՚a͝\ Sۂp4]ÞMw\}#2 qyLOZmPv_k?#Ã}7Èl@ޯO8dRVkKU2덴f@2@mU~jm, m dt'؝~Mr°=PPК۵ G?s]WV=L0`U"~7`Y-6$l 8'ÀiSϰzmpRΗe ʩ2j]rZc^z;]jPep~lµWpZRctD7už=Z mfӑc(Vm]@)22dUOWɆԮz}Tޘl;Id-ݙXGD=K@8Jo8'u> LOOהT, "Һ\V}tȓ^kĦCg?IM<=*<ǿ7w_ c}׷?9>E9]x+rpxHRXHrSBXpz@I\Ԁ4˔Z}kO$沨'=\}Rk,#sOd3S^&2Jy:&(n7Y uk7O,hֳD{GLg+&@(9$y# Ho@dBrC/D{<20Bgg qkEOZ!͋jY&}NiRBr"N0Q;sRM8cEz8/١Q|$9Zh=]Zr`OKEu!p>-Hl0ShdD0*h|B%hc[lTuJEz_dw3F7s7["u I}irK {0]є̸b!AɄ9d%KO1=/H5ĴcN̴isa{Lt0*MZ5e"rifMUB0~(a(`& 0hgv-ŃVz-N rUe1(P™8sh%qpS5wo–gEvZp(9 Mn[,Ʈ5KP\T[4O*{(=9!ۺjJQ$1Čy+j˫K9VyvW@56Cc @#CcVT"yu)֭$϶nT$ؗLգ`,5_Eg\)nVsG3'eM#{Z]hzhbA+AtX߿W X]k %jpz䕂g&"CZhTVV|woz\w{mO+ D=)eT=&c_ؚ:D>qݜi)J:9[5,'XRՅש)&9ݩQ!!yq6@L v;T9c À+ܻwWWWBJH " qfttӆσV̸r6aL1p:A ZL8,?3UvՍR`4Gw1&>0M++B?aN -V-PT}P0O͠殭f)l]*Žߞdjg?w/— ^=^ȿ>_/?;vB12a0ܐm,d>4i87^TƺRIK/i 0KXWGp2֘HkE;)Mճ2gp$]PGskN :$"tE?8u%ꈿRbjJ>MX ]XH%.."a&,exFq8 Uf _ע[/l6@)PaTUh34,L%t6Rsyi14og{]̵g|!Re]IHgSrʶA) Y{<3ãMa@ 9eo,\\^@X"Q=j> (rsqOmP]*Z{x?SB sC 'XR0ڌ#N'hW!`=#CRеmlf=S tr"L y( y(<;Ƞ% P!EFW.)AzE*ZlLJ<7Ͽ׾z 7 }?oGBO7^n<\{hj[W)"3z2e@t'!޵80oW<Z߇uxy_etٍ"$2'H6Q_rKT$by{¸C72^(I 2,K=TFRXB|dS!N`LTbP~6(I.yόH` F0mq! IrdAX2 ;"3+0tK!^]e(v(w"'4J(&_5eDh6fbfaf10+M=ac.80bU;>oV6H ьO]D0dv&M(rgtXjD ښz t[ 8q:MXZŲN#"b(9O8oQ3_Zk[JC E<#Ϻ7 PD?o]j1^אu?A U5p>$HD D.aQKmH%pq oݘGך/=ϯUE R(9o{t4m셒31uX?k Dp޺~5RJiu9<fB%3IuE?Z|ޕ SIfߺniDl$X;ݔe,u;`YTwi')i6OrFa9%1*P+@@B" 0D=741Pn`B0{ ".PIXb$qHDBMi( W?!v/6oU/yeԧ>UAR8Q67) (o~܄F؟I) aw\s,1OMܪPbuKLAfnu0+L(ÀyZ0G.m.q:0em՛2ud˗4t| _\2{Yk8"6}&1[u aujS8JZX~"(ų0'&kγ ^DGZQ m؍TkN-ͨuFu1yf9nE>= ??nP{7 %;Aw$T5e7j7M!4s0/a؍O):-ny3Ӥ֚SkHqxvfLWOş`?A)gFkN7O3n2Ju O8O=T݈9*2Ls:"a`<{ uK)L%3R8+A-&6)h0\2R0q0/gӈsHh({Ut}; ;i &y"1vCw]zwTv杏|ᝧ_y9|y=4y=XawS2IkIrmYլeπ'aL00ܶout08!$<,t/RJsYb#eX]7j+1 Fn N0Ǝ2cܩ%r8⮑"(z #Qnt7&2'<0T}]uDV䜷kQ(yշr5YQs/$Z>@ a CKDx[~Bk{26CQ&4NQFv1K_SOuyiXS|\Yҷ`mdBo_ԗ{x{>{]iyp=>(lK{` ̬0FW8Yo_:wQuλ=%di2rB$HvXXJS|v(L (Z[5+B3HL|)}/=f̰/)?2 D;fރHfw<fMMR#9^O HaR 92ckSf/d?xx:|0$ uV]eݩKxcvx_$ ÚS,=-/id1Mw*0*!itkxjcxb}G*j;㞘Lp[Ah֬?eLXW#рб::Fl=!--yOW;G4M% +5 kQqeմ_̄r" 8"js#MWۛw]^agr 20l&rs(MVU֐p@e!p-X{5QCQl`!tr0:a&Xc[\^^"[xShwfy:@wc|:e]J9Zg2{{+^vGQ q7׵À~yDHA]1 j )yl ! C9"PJ¸ȗ|簂3!칡9gv⎡y7y~ojyqyRp^/?UCwOTYU;bХp%hekjPc5Tr6R1@iEBLAML"J OVzJ;ZkK"F( 3bRݙku\ohx @6ڱѮ5# (I` ("j׾&⼃(( FY *i|e&Ԯh龣![sd$mMu*Ca<↻yyQ^kC ,yqStʮEIg95o|3f$ Sn]Gc:C>6qxZ}AIfWDmZk|x뀕\==}vl']auyק6X_ vJo b4jW([Kˮ/E-/0N:UlJWi<\p_1a}~-˲osߏ.=C<1a$w0a<1jcmn̪̈xsky}nBVT(23w~u?vw]W7/i@du(CdqR~(IIWE *)=9BT|3S"UEsz'.N^RTh殀[NYU/"Gud$]E q[QB hGG*9kXjRE ~gLbMaxp~Z8zg-b9Q= /$z,2I6H7t;Vތޑ0 =EDw0pGڀvD S[Ǧ>M.H*x|~D6X۱_[1sk"$،>Rm%h{ 뺜g?O<25 NXNZB&d2>hLwf1\R΁}`tSԍNNjDTPWx@hch0g$8Ӱ @(~ EIGq2Wq9t0N7I.h;c*NfvJQKNYݍCU$|&FMds]D%5kZ 7)^WPҝ0ZEޖvhÉ#-MDK>Y=TB H8QQD&(Qi2w{UO|ȁyyx#mEk@s(a<4jE k\bNs[i.xe*7oQrF]M(b-$00XF^~qyz-5AZKo]~?B=Rۜr?q|>__җܮ/i|Wezhj> 5לKxP[gn*.[aC\r6v67,в&Ra0q4v|">l8ZcP9 0RSai0 _=L(*c?5+ӧR9%L%,!@zږύz ;'=R2ƩYJk DHUbiANHT8A6ԟZ4AIDYjQhR\㪊bN97ь&Pr maSkEAAtc@qۯ؂B{t9Q-k_4J9龷 /Em|j]m_?{ݲ^`0OjPX. &G?Û@jv߶nvbK]ޔ\ 9&w!s+!t}GP jlB]ǿ/ NMN30ѣo?#ߗSs6d||*rR~=x\ۇ䇿?WŸ׿뗮!_7PY~,OeWCcԒ[JyG[Km"GiH$}@9.Ì(s ҽ#nD3#x`O 6+[C`tawS)E1h(7ԃMf-7q:QH5lGkد;&t:o.a`[W Q t@"_Ip%y,` $)5GΉ{DDi22z(ٌ&@{;wMֹs9ֈC>eAH;;[bFB$&~x X #D˽~tj5ǺshKIAd趭8^/x4`#H.@4)D- 2E9)i @ PtDc%~?p :.* Df>wX&6r))&5\IMI)%1ـL ;cm6 ;en&Tc348 S6taOJmAs}9huEwLfR$?~ YQ3y7oޢ,K:vq+^^^'V&ƺ&24)! TQD8Ѝ{m(u g8} JNpbY<eY~~ǿOk+K9-}ׇ֮!iIҖ_YrNculRiHRy[؇5hNIeCo5q0ŢU#g=^7$le [hT}E&l"N3HMĜbaMgN_LMۜ"@Í8x/ZLgQXLJ -!Unapw@8坈%g8rk {27]RVCZ^_H.@kDC` Wc'f1H=blX "??7R68ێa;)=towchpt5sl"ǾuwOZ- aAhk:~wx6+]o7q;1HSlb@swx5Ta8"c۶ h<ma p<;DxV{h1GTQ*>:3&yRp=<B]8n(b'SW<vN "T F 3KpS"<;F\qRy'n0MH0#Dymg:QD&f8G: AN)7}B?ÆO(Ma@\p"2u"I嫼 IDATC\j`G7qg#)Kz=fR3,]!=,2b4q2 e)@S#$/3=n;`tF{%U4ˁvlP('Q?=(裳H72),JYF]["' ]o-rR0 2 #||d*Yt86dEJ c0Vd6NM N!R* ܈~YD7<g$AAg.l'R1hZ4I9.9* _O\bprvY9tFYC '*Qܙ<|?0Om>8ͮClv*ƹ织mŰqsk)^FΠưc/abCh0ajAt l놺.1%2G]!sQ `YH/^Bޮ>:w; ̅SjB.G~]vˆ{>SLteC9G6zǶ,Xjr"-]e-5o߽?_/eCÿ_}3~mR4f\6z_modz}2SVRtD8AXA!mYYCTOj7[\c@-.(Oil  M]nIV8G'SF2.̐D@$.㔠Iqsy G QxG*. "8cRt) B_@̰4 ֆT*X |k !nNtO ̮ gr,ON}aa3zQ 71DDBtm0I#ꚑ5p s!3 a]eGw֏ݮ"*p?&I]E-Z{yEEFnM(伭*5C&, ljЎ{9_oten)F1{?g'hx<8(DC0C?|i'TJP!)RVgӌE%rG8Ms!vWP6<#"qI-()I9+)4ܬ9x c7Sg|0pSVb#gg(@+S)bHo&YS;g7<ΣxfUSO$1"] {T#>K4fX9eeŶ]PrƲT 3[Yxxtlf!4R4AD sx|xZp]!B*v=23؏k0x 2|Yv6{LC+0 [)xzzºf%7OG?]seהto|}Wy߉端ڿ|bXy̢-]5mάU8 כ#/ hRm6򸢵 8~DR`t]XləSLIe[7)zLq Ӵ w@ECę0ZeaPsS.HeR;d [*VҠun9"zTLeYp& ^ #o #E/ Exj-MiXPߨxt ~G;6  jI!@v175eX&qRs`'Eh) \qt6 Ht+5Bt2;ѥEN@M@RC)51RPkx9윒}leGw[?r֭}xXr]/#78:,}(2J.ȣ<.Ik5}!.* ,ЬI!aa. ݛ\yQ u1gWhF5*6 ة!MTς+*VILsɤ)Md΅PÇEɢtoG`L]1Et!yy m@lj-=imTp҉&jѠ i]0fwc1k4ER_ PyVYC- "IީW DGUC$y|R9} zq,s/(YÈHȈ±Q6тd' CA+ad(4PsdzPJNM͑Yg$6m@Ѝ4R+n)@r8c-X=2k'M@O#!΂ iBwţ QГa_ @78Fj l:ZR` 9Y6QJ8÷,YydgC‘N6]Ӛ![9nu,3#x %#b>z9[ M3&!G4v8猄RCpI޽yfzā}om}']<<q>8~|<(?_a/-BW~_^G[ҞW3,+\1[2t]&M9iҤG;m`Y)9@!ȦDZt&UN, N 4y5%S׭}"QNc_i2aSV ~<9B)_ ȩDA':6ER;p pȥhCΙ9Ϗ#'4Mscol&E:NLG FЬzuer%GjrKDqĽZ8Q5Ȋ4D\SeYb#1t}far^_^. .fuYj.RʦP m +͒׌aO),.)/kRY\4?HI4]_TӳUc*mT\,6yEQC*IjN| y9U:{Tb L.]>k|L\FL,\h[ti7=(gz8:Y\OFuP#R(.S;(a,㉙nS]ۖRbg[y D4`iܰ-KCDٜ6s(5M9QOQsLL\, F2v'\\6\?|3AaiѠh!PCIQr0JQgc;>&ێ#Lw1(A0RE'sC$≸G6rEb}uR&{kNgQ|<-9Ɏ3͢A $0d;c&ABK':u~I,-Q38!Msa"3DiRzr c|2^g]ᄠ8R'B[k;ѹ8ND 1|h*OO66'a蔂za;r~pwԥ,O7I ?iO$BZ#BrQ[kR|rJӁ8Ou7]nHY,+;:յdwg,O?I~^^j!o/%Ç?s?_?뗶!d\ _~{"U0QV`X)UbÇ*Ds"Td㚱g#0L?7i>XD"kgN3)3@*p9UN-MoBh&qjl*t=MYX*`(6 Zu1A~6D4t(jSn6a=3Jp31uBiAaҒ3TSXOMN"t N -Ib\>unz>hB ©\Ϡm F,䁘.B|jƺµ}Lh;*XZ1sK)PizDy 85uez\p\uY.fZrƺl-Xf]n< 0ʨ{fŲ.)2G޿`a5MϣfRzk3˲~73~?q7w?jo?<^?qTa{_Hb2JDTYKӝjЁNRP9>kp#L:E⩦7mSΐ,ƨFT'EڂŤhSP D#ؤV)M@AجFs8z;d+´SδM&cf[b,'ҍQ<$NӀY4[wݧqj6g_؈cT|82"(wGuڴ'~ L,\>Sb2; dMJdXeŶ$Q;і\ MoҚX bPQXJR*q}(YrdɷfGRr{}YMq))躺8 1v[,Ru4buy}{6RMD"$ishqCo,˳hE=1!%%-M'\H Ԫ~fXmC @hZm COcQD!.A亞Ȉ㌘D8N*\9"d2u"zR:FkH׼ۜ7v܍t)DY}AUhye8͗t0UTHq#Z5ZǝIo7ۊuחO^KhES@Bi6D8D²w&ƚB9Iِ c s$;̸q7t9!F -!S>:%80Ik4_'R̵5]JFɉ}rvGk;-6\__q;&İ1ICq-Rw((~}9!3 &Tm6X&96"k8R{1  ;>S7[8}0 Ryϻtȍ# Oj6 H{~{EdsRPzA*lF-DԊe]p5uw^_Qeʙq4Wq}zcz8= kXmd@5m]q<>3hG>(љyVNH0CY &ZNIR֐SBZ2꒰l<-~gp_[w|} ?w !~on(h6ު$Ӣ[֜C)l6eP2;3N!f8$4œvb)&{mxN b/>Ifޣ9bȃ\uHP;!3; 0(Q`)*wÆIثFl81-֔`6Dk~]R+€FE݀4$'P7Oqdž~"|=4 Hjq^Ņ̌B"Jz:N P1"| *asއ8/eH-e+Wn 1,^UrԒ2$Ouپ(>I**y Hy{層 sX{GAUZ͆kҪVQO<]jwfAߔsVM[`g AڶuFߘ4BDg(+8qQ Nj̱bLm62)\1,V|\9q! D)pf-\p7܁f4РNnG'6#*h<~0&yq &'W;\ U}ʙ] wI9u[~# -|qыu dJN8Z RsoѼM=]==Gl :'3Oe]kluLN`fOlX0G< k]*xr,d C@qAh]XQJ&r&א!W>W,}=I@1T3fٌs= bNZ+:Yh)OP fg gp>ZgpryrʁXd̚a`ISלJ:a,]D`Ԡjf>g'kJ Иfl#RKpc$-uYmhrB-4ot6Fݧ; m%6C)H^ꊜh40`W먹DTЂ.\k4%!(?Y+3^W|>_ןˆ~>mIֵxV]m\KUs5i27,2 n.S[?s{x BXB\='S\I6LX@55CA8ӊ[ TJEKR ܼc+"rftY p@`Kd=Qh~#Rrr}lH=кa?2XDaNt)F?s <4UQ 0!Æ28ЈE# "$1 Ty+EO4=)2-,Ч )%uY*j,%׳ϓz >PJe[ak7r9ˊx%=8SY֧^_Shy{L ZvIb >iMʒk)ZJV"4.>w멍]ܑk-oDf"I2Je!0Ut Vw a.OI\3RЈjЄ[Hl 4ߵ8N#>x0BsJ]XA='"dRqJYi~l s'@)(8Q74(ifU-fΘ1%I4=p> IDATըPe}4K~D?t=( 0IS[43~\ϾЭoUzzzMmjܡ`,E6І%P100> ~w///qOF Jpql( E,扶eXDg///{zHX3vO/CQ{#(l,PQR5\ 3cwR1F|"lq6{T@GT>/ujcGو*Z;|νApRR1F.HzIǓa|p268vZ7R1QrHTi7qY75)ra943Cv@m@O#.wh7~L? _+{漌4k˦\.I y)BҒetNͬ-eNR?1Oa#2pd0u#&-, Q"9M(V2[>?bB0`0Co-PR2I1E Grx8iOIUzDf(BꝮaNXy5& y3VaDSީ>1p0i6 g>Ndb Ye$4)OM ,*fhN}>0G)KGњ{9ݘ ug+Xk0| @*e{_>oO4磵ZR qUwh^n#/uٶI5Ut+*R볦 `Ӥⲙf ,) QIn͹Ԥ) ֚N*#DMۉj }Rx]5Ņ,FX٩e8qg|N߃6zC)S3qw_? W_[y$)&xp_Ժ>@YOTe{ZUUzűȅiRJ0\2q*zXQ=5<5h4e~nz ۽H;~#eǢl 2QaIK8t0 430c:BZB#nH9d" n2sEw `Abfg.șWKn( |8ƩB`UܑJ8>" Ь.{(?~$z{,Y /%C@C2߻2!b[M;^q.X AB.K I?<>G{obE{uq$sF;;[@7|)uw.xsyM\D5UM.[.hG3ĩʙ\j* t3n#lݱIǚ#(`<nj482 0]1D:Swi". ܜ&2Q@P ,J²4 ,.S͟I`?F[ pk'Ձ%6 D!Fw;o#̌;v/6 =]SƲn'a kֵ`.v}"8$` FánDMb4Nb{ nQ1z0z1qpGk(2eaӸ9v`ARbrfy58~160Mc䆲dd4 #s(>dz] $|/6 ' 86?0s(Ig\0Vvf(h;K"\{2'MפqŽS05>gD7iiBq 5gRX dGdxx0LL{8cu5f= 8^^^κm"D ۶W :yqOL4t+Fʳda]/|.EQK]azk~\khhT:LgRh#nsf#laz q]Qbu֑2 nu)TCGe}6|\Bo؟R/=6 h4uCnX5 @N%gNT\2]Ȝm}g0 =$ õ}22 4lJNXօ1DzqNiC!GL1|B72Ù ,su(lgׯIcMI+pje9'cLn|i(y61Q@.-:4H"AIF89}I$r@@[۵(nǁ%b1(*[Y m{|ü\.&z于&kxSu:R*= K)MR'.IRİ:u*4RIY5i2{Ĝ-[ksΚ"f隹k~/08I|Fq0#PJioy2JZL}F𗲶b'eFI8M) ?Sn>m 5m qF4^B/o# pI"z&pHhhyD#Vlހ$"\ܻGZF)"~D=.3òU\q\x}}AkpDhT=\/{T)tܹ8:v} Q0F_=v"퀪 80ݭ%9j;T6+//O+rlFQ//FCHGy3ަג-Mz{2o6#ai[0i  , 1 yd 1@-%!i0m]UimusG;Oo~J\_sChoOxM?𾡽_)\p5e4'UyŞBzʬkbXxjSoAD$56js٬xe,q75붱Z5i^Djm֕t,y,DҤL%RՃGgdW;eAT b vܫY˨aRU4#B:% ׂ ĔEnaAZcq}zzqwq!ˏB54_uzs>F sCO8!-HjΜVӺvR\k9f .8p%4Rc|Ԥ7iI(9ˮ_9P烑'>(fiKj8Qf NFqBJHMI XSۏ,fF| Njcຐ3E8emH⚩R´noŤSd>ٰav>~~PȦ:X);8}7kHZ2e 0B۝"=?''0X v.k ԓ So>r"Ƈ8p|Ljl~a^{9'i\Уz],:!Y=Y4<g"8^ksEC 6jlBM}x:2sȸF8NB9Z'1j:96[h@ؼIgUkkoֆAC,T5ä,zR yLm³7A98CjOƊnfFʬQ#k׆vPˁR B::Ҳi(Ǧ6s왒4KboР}Y Gq8 l-'R{G4)%Iס煘iy391*ws2}ASߪ$9E4Ndh0 ,i,AHyN-rgy(89/dCR\IF/$): 43Cl8p;3$VtrTp9gF ptn^ Ji&zq7}?OwЪ>l-9rLJZQsbK4G3gδ\}fۅ{[qֆzqX2'UÀPb;ӰiBtBC zvGhǘx`c 1vGIj]6BZģx9{/C"tb3'D+`.~N4(h ES'"#(΃%hCơL\NjqzQ&Wtއ3Qm00ق1N 8shEkjr>BӰh 9wF9OV(pݘ+j!:# 7A =j;Q `$["y`Y֑fW N&G4R)'g.TD}ĵ `lAJ U3?cwH =z1Ծ+O%&jp<Є@"3 7kCt +B v/oBG@plMCX朥lNGd)4)ܻXJ:{1]@ zQ>Bp8CQT 5l_.+Z3my >b\& ^< =S\HE3a,\ΙCCT]6PCˆMC5@]h'ޅt~ʑe!u{]8q`Y#Oʆx ݡiPf0:%Nv5iI=@:i3NEbOc&aq+q'J9,ia)Z@d[sAw G ( b3 ZQhfPN} #c4P*;g`:Ix?ʙ[2L@'iִ yX<Ϥիa En^c50̢3uRMV91Z I^_ouΑ]U;{\qmdws?P35⥜x}$'"#޼yG g>;Ҙxֹ8h_0s'[P[7\/۹}XZÉ~R~\L]Ǐu9{ !bۆci͗]HSO'{!'G0A`1 )DSzn&bv!Ff^ej0"e4MPхZE]tlBMО; -[E9g'3{9] 0_efG;M aCԈ-cf)uդ|X!: -t?5A8!fPesh\@BӉZl8M?s(4i8h_\(7<ԓxKze@c6)84N-XP}]wL g͸7<= 'Zyy]9}֧k.m竵R}7̅`1ӛ,$@k`!PŘk|].6r{i9>}eY4|PW :⒄I Pcˬ)`δf=rU8^ ~ DO.͝~3NcxO[-֊It':gR31֩ASn6SDujQ~`NǑ IDATJAmzrV!gKf#=(c?! qк5W}G+WUG A:IgYpO}A%0 18bU;lۆO>ayH "8ĈJicنO//B)ZOEA34v cS3)Okpq)Rn,I2-sVTE͈y>}w֠ .SbjB %"8QE=gPdtcL:cЩ6'va3X&dVfܐS#p0Æ"EbR$瑩Z-1R{Y JiXejI|ǵLY/ z44mlLMZ !̆r Cznfb}߹d1FdA$Dڈ ϊ m1sN(tAe0:^o7Rqr*J1>}5ev,̣ˊ ii)|`o8;#ḟoqglbۖOƧ>_[|\!5}Uu}{}F_|][ƅpu!l-}se2IqpJ?PZN3h-(ʸ*چ&c.V%DP#]@QuN9dE6tHyptȪN|GoPNjEǺ.VgЩP֛MdcJ.HBt : u ^6==\gFVMhAET0fnҗzZd;{ $#dA4QdѤ *DEJ)_PҪLr),.m\KMQȑySe^ѬL qǺ^a#xyCD6.{?uH7q{חRʵabpeXpȣ:!bT,[J) `R`"}_<Ȩ8($U5 9y?N=c'pX+ ڔwH&S"" !DQY AFSеƷ+,*^B0?"0v ;YhLa`d6j Bwz943Z< 9FvAD: 3F^s0o!޽CL 'Av[Ѹ"e-؂R9zG w) Ҁiq&w|v^@ռu065E=U')ONr@B49ւ%y85aK&X E'5~l}jPi8#S2hwsq*udO,$Md ZB J/4]a?fA-nk?ytYQ=ևƴh^MdВسyGP<-`lZ.si91Yr1wMq)k0() F#k?Y*u׫gԋ Ơ]:VQ)1nXq?>_?O3_AV>x IF8d@vOWV&7-ռovƯq/חu}>,OZZ{sX>Bo;j_ZS>s%;眥%yhL+٧S˲+L.LǠ$ؒj{[^Bu%)TEӴ&{;[S]4D?'0Bfl1,KDaK* thQEuGIh4"N!m[=K -3ilmn4hUL\9 =mPJf90dMtp-pg>rF pNZGШиe d4 ?}9<{pi:mYW9~ϑ dNGj;-( 8 ??5;>'uPt쌑N$g^!F saOPk:(D,K$Asg.҄r͋zgA9Kw:Yg& f#íq#Wק s2rm,ifƝQy0qn%WWjzo؞VlX!my%A-o/ח{vR:nրi]> zϏ3rrmnVʭs:Xb2M ,!Rʃ8U5NcA dm {m)\p]2*=Ԡ2N5&C/'wwi G3c/XTLibLQ7r:3&5ɰGNPhҸfrBNݿ 2?'*tà;ADK1zdD(ZS`#cdŵoNREkvqs{O o<(`:ʆ$1F,)Lt{d 1Em8yCQcn+\!a>;sx~(5r-=Z$_r{A)=3#B|l6ڲA5;gBk>@#b < 9}uYPc)uD24+j\3`q3:f'ttWh R2b4ވMc@N` Zmwnzz\Ntٕ*jZWDt-j0tRTRzoӘY~1p%w};1,Dj Ag覝)bYgg15wje&5w'(9Am[g];P[7&רA.|p$ҼmúnW\&%ۛ bL漥O͗Wgo'ն_//^7`}v.[c}Gai!9[B\[p,Ɏt(ZRZP% kLyPi5/`讷,D2<8V D|9QLIi]F$PנN0*@YI!?~Π 9S#Z͊|._Mdm )-yդY6E}$Qxhޟɂ!&PCQԩ0!]ޘWi ţ ԗ|@D 0'D]qz${8 XpsPPΊ>*C3ò=<$':߽G aqz4o7UJzoImEk(ɀ̍wDeɦIVpΙë3)O8}k1,1 U䀤V̉Z*bzǜy|%.Xq]cePs,?LjY5_喖.?/o_/n]۾~އi]kZ`Z 8$}'88cDz!L0EУpwjcsWA`n0٨69824;f@8)n>]h8F06ڀh 0gMUvQؐ ;7ANME'J;3:gӄ60)7E^ړQ4}^'5(3g,Rc= ͗{Y8/8z/e{0\&i^6&c *q4 D?F+~`T؇UE v|Hc,޾.1h/a?jbJ!xGV-7qq;iDZKZAʧn%!9$؂.CET5uF|4IM>F:4.@>+x(4glh5{g|6N{ Bӣ1;|8eΒsvp=:Z\S ([JEYAj="*ͨd{4PGtuI~Ǡ45,5d,&C43r%e _,guVbVğ_:y"^TpyJm-jt0RwAbd۠pTFy7tXBwLa]G~(gdbj(l`ԚB5'*o4H6m̈́x)Y63 Z,:ޡ HtZt8k4m]4!Dbwtp4Q/3Z'DƦvMsaG>PCC\A^E3'A,8!Po *L[4,i2}DzFw<wVz# {^>Aa\K>"M4zh).*j:?=ԬM Ge癩aYFQ'Q38O%8jVU8H&jp!"+yp;zL>ƈyt Q5~{o[O~[3k̗_o~/G)x\_!t?½k!~]ׯbkH1]-\է\͆%tY22>=I_P 6I XG\/Wl |'^h0 ѣՎ4%h`16(3!pS:Ʌ9IaIi'YNC=hy %&Qӆ' Wspɱn8prN Kw1&iDX&7cDv,0 tֈ`0B㜨’Ҝ`&Su`}Ji:_#X͈\tt)6tA} E썟OۦQ˒.'APFOH>"{>Q d#"- R&"}eTylmŷ|MÏr’OzW3g;Oψ)!Sz!}Ό΂Ρ=tt-yԪe]K %Sϴ1^d8.+AI_/ۣF@~ԡ̜!2jQ'sˤԍ"ջ̳vf>C!Sh^ m]Oe9HL]Rׅ|H*'D5#څD;XHJǡhwZ'Jz_^.i7|PRE7-Յ t@e߉*Ƅ0ie|1RXjQ֚,녰y mir9(9Zh'ޥa5x7};Eȵu a#6  IDAT]0yf}Ul?X֕LO,^Q}CȐm}H":]MQXZDzxoPbcL#|AueB @zfT8PR3]|;.Yr(u1UJu]ptIáA;vû(7Y>[`q69XKW\'cr̵*F MM.bZXejTK)XqsKL\.x~~d1D`]6 8BGcFoJc#Y?* zcz8ˁ,%c 98h_\[?o_og o}WkΖc|߻{ߜ?WKZB.j5g39Nw"Dn~4a#:g0p>zLwt:Inxì(yaZ3j??PMwp>h+5<Jb]F@9?4h=hP1岦,(PgY2w~?*q57|˙ ~/ʯXΓMA i]z 4!ރnu'FSQE#MmViU(\JV1`Pd<ŀ|r@Esb~FT! :hCIȍ9l4%q DOJC:TX|tת1;HmZ/Y#apl1*rzi"@G>U;(Zå^S^Phzr>q=o?Y ysgn-ɑ"7uj 8 Ks[kK$I(k/24L!0 !:$= fcgnet3MJR ;^_?4Уac'pБiP2huA`jsJЄ|z;=ג3fluBM o6q.:"\`-e@\p{qIPHJ1hн0Cw+Z0w Lb tcFuK5hꊂplM@jO;z+t(i p{|ZI}-ZG@:@c iYPr){SX˲r b\d{FK @2TcqQ?^} 5t߾`Ϭr.șiK28rY/xÿ?1r}~!s^z\ͅԳޟ>9jC5^;i_^^V-F@[o T/12إO^N .x)Nsao 4z*.jrLݘ~BbT3h!`$xdRF+fvu6/4Tre(чy^xIKv Ɓ !]%k06Y ZpO7⨈'6@ q?()%3ZoY3\hC DSMMN ecDj!5DSzlo6Eq #ԹD~=Ö///\3mHqOTr] !\>Js qdR߾q~醳t쥣#u#rTWa?x߼}GۯRW/Z^ۆ7{~-n˰kv }Gx^,k^p߼<"M ݎtmc^Q-ʾ^.XJfq ;fxr M.jfn 97 ^i^49N\`OMT "eKZ`K\P!j#vIiҴC7jGU+! ´ٌv0RUQJ8Oq,px !kF>|%N, *ʕdIğq梁FՄ,>.8swwİ߾bi_{~;Z5t4|o޽,+Ri$D<˺9yfiHYRoR3]ѡrΡN ]_n750!v*7VԴ y86G,9-h հOB]> f&$HS/m[b²M^Ft+b z"0_4L 놦pZn/x MnTc.Oi˶ѼDqv kF&)~>/mzJZ&osDYW>&Pc @r,LE2ĨZЦպ! '4 %cg=cHBw˺^IY']p2: EMPb+l\ 9镑*DlF#J8dOy"%Vg 9H 3ȵ!D9OOϸlO@'wA & cD>Ĉ=B3r)̜)%sNFJ4;s|YO-ݡh"A#csw`8w0\{^5ced璟GpӇHcGYǚƦ+r 2"^Jad>u:#5#4l:\7jqd&F7u8LDgts1p/5`O*{Y;I /%d]9-p?V;S4Յֱ]W\b{K;O5OS\!??~tP涔-[5[_ţmbTgF9Ki1F]!`yIMS<#7Wλq#)g>Q!?/>%3ɑׁm, .a*"M`5 'N/ThWiF̱&7^>L} dwnZ3Wj.~X`QFs Aydžgz8Ԣ,.A Aϭכ574?!R䤑)o]A6{8951.yR(ʿcSwV<==I!b]s&KF [X i]&rC~QN ۍR, 1F,R"zH &}0hxLwiIX"2:+/Fv<_p<XE僶J 0DDf9L,s.p prTi{(H 6,}>eI00^ i C̢1n*rsƹ;H6$1D65gt.e)rM(J_6.#*Of(G3PvO}b߰7!%|q*{lۢ}L .:(R}7SyWψ] 6S#.{@ú~I,8jمC8m]=LCNλOA4lr@ݞyN]btDCgM;j!bYcW#)otVd57sad¤~{Ov4T Co99sMuz]Sc.Amj;\z*<[jZ)@ !p`+|VLfA)ɵr ~M2NI<"2(.id=dA"wo,z{@d, rim.&#.RVINM %vϝ Q?[=$nr,W|\zU(un%ײ9gB_kPJVz,ż~,hZj㖓WC4f8G{'#D 1a8Xf0+}4Ir2WlIE57nN*( Sd ?R@'A'w` n8[Rko-̥jgP*n]M/k"MBe;ja#,A?WٴjS9P9ƺ3;Em(jDarDY;d!FDD|*<ϣx̪\,2"-.OOh{rۖy=>/kݗJ U! A۶gWz~ɞA-%$XUR4 (J+pÅ{c;:'%$ "=msrjbZf~VY4Rdȶ83(1r KA4M:fK*UnN)zfc- BrX4ЩlzlϺ@IINT Պop U;RWTj/Et0vEC>9dl!.=|]nc@cjx㳦_ rh%[~u4BL+Ew xy2+9;<:'*BzTQ CFoh_yZ7eH,c72筈X~$ 5gheܰ 17G9 Rg=NԠwHuΥۉ9S&yB>шNi?gRD)k!RA|Zk8$2oӒX"MFJ!ƌMƖ8fv}κ%t\2ȰaVa^ҮyOzu> G6ք(#d*bb$I XN$e DD)H}M{!Mps7ƌhxje8IF7ϯ7e LC{uYrF6~wL5# AWPJN%XZC#*U*j0+kDytHA)Ȥ$F@wE)Y]d;,(y]YO RJа7` ̵lHAMGb,vRd0AkA ( .jϥTP?k֓ .ݪf!^imHdX׽<6Q%p|iws(wK?~-: V g,w_-!LQ~^c$H-HF۷=dxl3eL(#&)=M(t7t5>~+~5z\Iۆ # VDB, N*E, gJE6T ٓ(KH;$c-kk&E-di61L uޅ|H/PKåK R^<(9srgG+) N gl{釤o-XC%Al+HDhj\!~AlLSdVrM姃wV؄2balk->"IَX.#ݿ4BG-$  a Ţ>В~[цp؊Ҫ*֖u-U)UJUURZa1V46:ҏVs{E}g) }S7$JAM&qyH%z7gM ;#GOB a2/.gcf"7j>f^xr* <{ 4r>|xf4R- "vc 慎 U19Z!W~3߻d!x6[5)Gc.¦HV :s2LUk)[t؏#+(JS)Gh 8CaSwdžSKoVW2O'Tu<t,.i^绶(ey_7'=K~#BяmQe[b[E1ߝS{)0lQZ4JZkWhe,Q &s4T(֤e:rHHkFV*0 H7SBw@cC(2XBND>ԭ1*GdeFkT)Faaci4a53du,4'jiZtS$'׀TRheP44h =gKzS' _!~&Il~Sʃ9d/B_F `L8AV@a9N$>|@*2C{m`r&x(R==? ܃يCSMa^~z U)ʡkq\` ?}0/Χ3ev6 < #Rh{Zaw"(lf*M^B;Gs겠}Gn, (Ghwc?ɄlM!I< J7<"T(n[%TF@Qg4MdjC'2~ {aJ|rT[hRwZk{tC+%oP#jgp2Ȣ(=  rƔypijw#o7R5efoBXf?j 1l6mׄHi?*CRqp%ψ z~dsRhaRR n׫b]VFgc}f m0QYJnE|~@ȑlvs&%+>zvfۗR`#Jm؏;pbY9䙭 ܈(}Gn5LS l@LnzՍFF2XK-DIi+ 1()yK3$V~C.X@Q⃔#w@U>DTcL9UBG7M;^7$9_  cG-nhB|<Ռwt;ZE:b9^t.ys**JogGqFCQ-t?2IBSyLM?^b-keJBsixKͲog?6&6{[~Idžm{ ~eS5˂`WsV8bNXFL[K)C9v1WU޶}UwS /חˤ{zZmӛp?'=6U:wUCp `OZ?)@r;3JiQVR! lޑ&h>2FqDG.{L'J[@6OC=2CwoC' s+6?k}(nŴZk4EfY-E21T,Eԁ ɽ"J|xFR]?WXG'j4&<^\*ɉ̨{qNshZ-0 黠M 7o;.OgCz:8yYgrZN2߾ <m2"BicA5L˂@<ϘO'<].cXxcDLN8gv|4X/Hk%[jaA8V.`^fއ}j-Rj 930i⠂TU)|`X `]lq`c$U6MiPZϕx1YJ)X>u*^U)ǃqF~}MPeD M/ eTg:%^yn!l$ňjũ~ OOGq샼ijv}ۈ1g|78w`QGtQY3*bJʍ* g 2J$ӛ=kzp{n4sIɐKN<dc[ #hÃ,=x^)i-Q䯼J=tY<2m}v1}K[rvJiΔ[xTx.w oYkӁoj^%2B?ǾcWS胬}S+J0u_8@;0u=dP8o~IFZ(jI6M4 %mT5ͧ}Dx/ ʷ)Nɭ",7Z)*f!0aw(u Jq339\JQ_kAu>Y,9XdH9PcWn Ay@h}|۞"UZ)ӌ|`o()aߘ cqiŲ,y]0)r5A[: UdW.|\__n#GʭS7[RazW'ؚQ5]Jj18c5Z钛J'!y8GY]a{ H$-mN$-XS?&JGc*Kʸ yP+s!`m^ MJm0$ukIݒCJjˢ(f?g1Ti`QOJU>4͜ @Z']gMȲ\{B6=wD: eUP*Ah|Ikb$GY>xH{ f)(:)8x|"hJţ+,˲ L ?bzĘ.!` 3r/B+?gB5> E$7w8PJu=7~!c5iA=i9`2Rw.FhI雵{EHnnd~֘(=bDÌ eTSօM~LEiȂIV#qxcf1j~߆7ϭUYێZFO*!2XX/yGjcҚ9wҐYk#b7mnR\cYf*S@:j[6)5x-{0L69Mr,ɜIo ѩz*Bv΍Oi $Jzv9XD\.U@"vFɶ6J=)({Q rA, {<`# CJB60s0(+5{#am)+cSfRIn!tαz 6e)E#IQkNlpvBsQ (%QN깙pπYZkHYB6?@/nj3pIPSSrJϹ[e@hgc q"1ʥN^QޗSy֋d݉V.DNqZO]# 1 0ϰnBp^i m,|aeRHyC2Z|hx8OKpFcgh]aa&LdF-~#s& nXT*҇hP_=27B|7l^zԅj= &ѣ0DTܘ})<Fs.Ɖ]+E)fS9mJ9C<S2U<]^ | /O(E6vˊ,8_py~Bmڬ ȓ4`ީ^謧8P ZXgsϏx4i4 &KL)bxʐ.0$v]&$efɅt@SVFW%B-ʗ? .˂,$gA2fb9/ ~72cXgZJ":k(Plj*LP_fZaT)|DN{.%S.d$>ŧjZgb"$"#vi-H#Մ{ilbQU" [~XOj)HqG$x{w 5=,m4DFN5q+MȯFײ+j4rǎzV1nwJe%gHO_';˦9jkpݹ Sq1s gGlcJ@ܬo; ҄c?"c2tm jp 0~:8qn8$ue;q~L} )i0X9i8,E%t$ knF/x%LB+~u0#d4M#|H1 G{Mc+m"- KRjt eZC+%6K.\LP2 !XH&σx R?`@+5 9=/8M3T+F<ЄhgJQė??_r}~7!o?B߽k_u󯿮_WG/O1<1z| hQΈ PP+bXplK-7=d(WZAD0!^@1zPj>s`ZNIh3`+E.iZmwxgEN~ $&\+%QJ+J'x>r b:` oc3e|lk9~Is2tK-}N+)ő >rE pC։1@k5gMr~_axZV@[nor}x&p=v|{fDzao{ٿɏ կdg#*/cP76[nvmZ(jS P*׊`3.@^@hlHGLQֈ⑇_EdEP$0Wy[mDȏT-^)o-'ZC5-1,yxk#į\ᩔpBϓN24H}MS 8faC⟣L()0wZ<Jdil$0hk` ~΃H=ʀSC =kJ#HS 6/ ѨXcDC wQ^%k9LصVPM2EӼ< ˺b=)iig7oޒY eYE% <޼ye=hzya=ePaVLJ?L>` BD9MؠZAkq;)4ڄYD(˅r5kdu)3ٰ(=AN|KD-M9 .yehBmCU[ɟFJ1M 6`T{h{ʰґXЁɶ̧C/ 4Q0+6_RX{2x֜gTfS): gjLQ>'Xp.6kCPv PNN~M5ZoB?;dX`78IEc?n٠2fZx4 !0 Unr%^iiXBG/AL f!bo6GocL(g4y%g8| }8gC刏&JT\o7HCr0!UoD#d!|&ō_N"k>1V"#lu)o3=cR4_ + l;kCk:mZQ>JQΨCw[Zr *m)u yȹhx) }IrvuXZYcBCcf1d@O4P6d:H֢H1a sUl)'Rk%XH Uφl V (XaH50Tm9cfQH%&$ tlMk˘2Wxwp:0/'F9·ᖻ5~c CIMU- rj؎AL5jݯjr_4jok?wϓ3 5@YZa S>b0 A!XuoR QK-c"GB, 1'D 65hb.$`A#+}&Mk 9/A,9Uh`A?k}D94chT&ey 4#@o4Yn,96CJ%BLPcpmѮ"HvjGTpC^pkžA0YCC'r+,kN ސ{'k"yTض sCPL Ed݁2E$JJ8{2Jv4\Ui^|^FjwNG>ScQKUM41y2+6)+qI|9C9iUܣ0W%B*$c|PvЎ?$Tt1֑XCEiY֏ا,Ͼ$:!Ek0~{c(\РB |.70L8]Xy&Hi&Ej ESq{%_T p spڎV+5 %oȋ-'LJHrKC?0 f2Tj'|r?aZr)!hxk)Ԣhhȥ!eJ5޼z f<ُ["N6a(*7r^E MkP!F&XpYoĠx4y׹ R.p0D%0C$ i8BY'`Z'R*yT-˂˜ǔx{hN}ge]6X <ӻw}OuO$G֊|¶(,+0e(V`$4(\J*T|/;4&WjŸR"c^bJAL3qpPbQ,6dA a12ܵ'Έ*qG`i[z~PJ!Qvֲ1 U,kZ k۸m;hdIX%!; (Za'ZB51l;rkT+mM ~#%R ۝Y(U {, ^5gPZf@E- D^Z@*A0F)F VV"z6M!PE bz+Q+LRpdI.20y>jcUȢJS/W)쩰 iu",9bHȐ2?h!HĔm+kP5*r1@캮PelPnn Od/B~FJN9|awbR 8oعd1FC`HeP$:TQFed=l-I RMATFFgÐInCrnk}I\plj20if: vݐS;t>Be[29hOuM;g`D <tHBgrJp |Ȇ(Ҏ@i3qip:_0 I3ضd;XJC%RY5ba\'rJFAyFCP/^K1Zk'.o(πH&>[n5Pmo{vv#Ki)^owd+.k"a1*Ór aJ ˻RAǏȉ)1D3LQ<^Uhk9ԱڐfʀqzL+yFMOIuDv)?.Ȣ೸"uК[G["07X('7MAt6aUuxz4MH5yF40 <>^dÛE}DZ!hM ц[?cJ,2 ѷ܄ZiwF5t8k~޺ZAC[Jm=PƱ| Xuy?kL iNhv\ bڑSBr8E#L:LIfԒ02**Jz¥Ñ##S(5Ck#Y ZaȮ. gfwj@J6BY0?j@&4f ZnJx5X~V R^i)|]REؿV4s=R Ja ۷xz`^Y Ao:VeN&q1c?V,4V1%z^o;!^R<\cohZ_gU(C Jsb7=3RuiS(aQZ:ϑKLCzVR#k-詛x)m/\ј!1 BADUU}C%QbTEIUJ|Zd}f^J)&$6%Y޲k3|F}콇aYp}2lܴ}%wNjWvmJ8 vD6 VEm) 4*^>~O9ܒ#ъtD2(-p:8Jc?Ezdؔw" l!m0#2^5#C+]l|!nIp6nT;KI\c76?:d6<`Hɗe2 #ș 0J@@YHYޟ|+ $鉶j2hiһr˞{&^$rF#R }H1P W4] 5dŭoZl)ωryw;ʽ1\T-iJ]ە2Ri% E>0hgZNy\e( Z`ij`5@,:7~Z)QI>mSK)[4UCd覵dx6;Z5t{VMj6*8.LEW9J4 fcsNMl%%DRD pjX<_L2pZ!Y׆Z&2\_ǥ~mgTs=IM󄶐L@S$69 fijDO} =fD2ʔ v? d%.M4,Z8K)?) O/Pǃb傆g&(JN6Hhnh@,0胜Oa2hLtº<=qr*$m?,_lOluqn8g) I($3*^==N bA)5xἓ9%}3 k.)l1-+.?~o'"l&j8- }m(9av?I t07C`V1w1Cl縓{DȐRz~πS)zg-x!,G{@ ]Tq,˂IhtFւop+~VM-s;|mf YhMDp(СY]*DJ(1PcHtK#1VܶmRfO$&c}(lMആ}?P2ymzN.We)7BwgXQy?7ɯuS=kqZDz#Fr+2,#?,4PY0;C#![ZBa.^ܣIE`.vlM@bкܕR&I|xJR2/Y~N(c^W3bsA\.x?&3t>`]V࠵Ǐ/1~{$>|E.9cYV́Kl^ ;KڲF6XKxʇ@ d:nrpSeLOᜃ3FePҠoOʹ_'(GrIkxZ Z9}?r}F~+:8J6#.iM LAD݇ɍ%~(Fj8T@sY8(Kz x#v M6JqIfۏضCVxpݰIҌza!CS-cBkc5 m Ӳb^!<^c4i rrZQj¶;~Q~\!|\?^mjsC;ôg3zΩ^R\?R{ժuYLk09GBʚڜZ}@FڙmEَ^0jYCfA9-l6 0 b,v8Mga^W8C5t%QM=Y!ޱP6Ҙv**V^s3>R+;Ps'^# nԐyv?e.Z.ߌ iFDZ9 CXR fu5dpuI?=LOo藑ϯ^eZ:+~J޼y x>G#Ϳ`kvm_i|k[" F\QZk1]y߼ׯ${ ^^ez|Jk-bS9D͠ÑpQ,z.逢^ e|5Pai7VY/49ɬ"wΗUbtE@N#H)ۆS,#@U+;۲p:ɳ{7= Q]4Y4CE,^2/mR+Hu]4/ 8]im5t/2hn LG?i3c i{}?qYڵčy[sV!Ciusoa0qO<0E˱ x$QY3:1^ +;!q(IXH&fF)3̻sߨ2 #hNI}IjM4l8Gc򈳖yWfbݏs~9AȘ!T>b'1N7᝞lQl }6VSޓ7FQȦ^i6=5jJՎntJmKğ8e'͞ub0fIC*g Iޠ8Dbgu\cA7`:)1[- uզ|-3A/l;w KU=h "Jl>v c%0iV{UȢw(Y)2L-!>Xj׼עqu"?="<޶HG.RJ<a1e0YוM҉$)/9jYo)e%0q"w G~" "ejM.- |lWׯJcRZ{νοNk|*9)\ފ\`n5jηHpݸ/Ndax=M ajvgSVYShU>0PCyvxY^<+*[H*AukVWӞ%B-N#t"BGM*860{~cT9sNWcQ$GKbb 4ko&.kMКww/^9p__<%5O J]A=DvdK)j\sW<9;z OOx[/t9TG IDATt:{m'o>s]e<Xy|nx9'.qϪT׉QdF2eT$AS6Y 7.29E|r~4ݛ4e6k[+zФpCto9nDpgg!H/J2¶f-y^ׅu[I;m9H4#ũzWR{i8{nvTO=6kkx$QWS5jy}E}uRyOZQ9yz^?MX]l /M!ZsLi:K6m6m88MԨ1JwhЇ4m+tβ E/s\!xƑM}+F ^dn)%P9T \ 3/0 A*.ß벱UK#lR)&2ˤ/Z Iq yXVM Dk&70>r%DkYA%'rҪ"'$0D&d2kLi&6$x"df %nVMT hLc3R 7;z0#HmL^%Fb)ղ~ It6 txx|< e] ]zq)rvgRez}rgS6~89 }'2J?vj_ }+.qFHtZuOm1bDonj +{~ +؈rcŅBDJ"/Ɖ Ԓq2LgRs&"slKM>/Q͜ƺţ˹ȶlQJNWZ0[(Q}w3Z%8k)RĉDnɥL)1ϳlZ ;Zc,Q R veúIqDHmpJsV&Uie1v`} 'rNR6 TLr V[ɑ5n`DtXN[1-˲E5Aҗ$gI K.x:6)FyTB1#J!"e#&O)d+ BXy|>ayOvmiYbHYKa땡bJk du-p%M:bC'K1밢&gk'PKXpM4:)J+ML% vJRȓxUNyja[1P+a0BZaT97:ȏ>t4S(U`);(MUkxLZqb5i,*5cE]xiHK-8$2ڨȁX*f4UI9¼49b4N-&2ISYIԔpj%ƍyYݞ0҇98K+erj 6'm8 VN8I_cmGsqNo|b|~LLu_k|}e.Gwy8at~RJ~,0Lr[u>W(M,y_}ׁfԺyOE;^}pZCYs8,Fت,Kf*r$e 9gʐ; /D6,(@C[k-2K.i"^3 QAo'3dmՀF1=I}Ũ"RX{)j#Y2b+RX=Hcyynu4ٲ*t;u0zdBB̰,3q3O˶\))[`gy ?73X˪a9ƾ߅NcN ޾0 d<ֲN$HI6_} 9!Ui)JI"_Сw}WbПN#5#"1t^`8 iݮuXjdgi4`Cכ_r6*kyY&WA_FZyux5MZr< x=Q‰d{qMeFSDu (l1rReg3= lŲJ.M }K4tVSV`ws34 -1g@2\ОsҐw{jNCpc^lH E(+t(wM= yqK($7aI42ҌEeB[:m wi.M'Ur>_360`4O㰠GKΗ3,E0t5kc-OO,>*OtLn3 !U!Ѳly(g^gJ 99A.X.+NəuY]1w%C+aQ.<ߞO>LJ$ gʺ>7?"-Oco ZⶶʶL"Fֽ9beTOM}Z4F ]Q*3-;Lhrdy&+bvȧe{6_c 7PTp:$d@ڮG,wꑖsO/ٴZg)m+)$YQ]glP>Kل 2%76$qE[*!VoѼBiy'E9,E<f̑QlKQ&;0Q<|F߱/yNiFXqf9ku o :t=&$i>Ƴ@+@atF(O; ~LyKDOhqj0Jc?a8}pYrՕpz/ѽYs[_3?^ ~*o>vv92X5.^W X`RmК#^ 2Ɵ Ջ)Lݞ@2cEMebĔM+l;@Ӱ\,9@4ňTO"$ i4+/_8 /垠{2%GkJfZZ2gi nu3ox40Ґ=/nE5P\Zi}!˹u.:;7%djȞᜐ\ IMHa0&ӉKfVߍix|x`^far>3#%Y) 7:'^9X jm BQm⏲UwWk/9P@-+p$;kEFsfg!ϩTm1M{{dyGAAry>(!,BY{:-dc貱o#YxmSۃْ4JOret_y=?KҶ=}7_)U|FYkMnO[싿1+PK~yǶl,>)M7.ĻRsӕϞ!a6$ŨVJRrg]%Hέzb]giޗZհ R->xƱgGeaoZrL^F> MmdJ3g:iDeшP3>@jm3ǖ;v{( E3Ao⯖ms,/gEQD^Me0Vյc"Qd5P0i/{xŝFf0ɠV]Zgz#*=/1D*jI~"ux*:+uϬ\eCVD zBSK$ 㧄Bx|OqO^F-7\z/_x}džP./ۏ 0^.5mji Xsι` `Ǿg<0 FqN}<s؂Z a$\ ۉ^†Q@BC8W9tC^e%Z8o1)kN`#8J}m s\[ħxiRAjQIa.%%%([q/|פm{mU3媲).+dϧ/0gqGYJ!idBm!/9V퐨Z7@'4s\h]'B?t4iqހq&4W^sx0_UŻ.;bʼz|`:_ǁWydl3i =˅wۑv9^3kJ< 5bq ~wPL6̹9w$CܭHS Ž ]\ 2#$p *"+)ӰG!Ht1BtNztD#ZYUL$[ DZrȜ >#)eyla%ؤt}ϼKLw,+)Fa5\<(ۜl*N\m*HsڰHxr6-2tsۄjuKuڨF 65ޱ 4RIyV>9r~|峟揾16-mŠA7gwwS|_S-p`eYiw V\XLֆ ^a˶K30@O Vϡ֨l]1 더vidzNeISi<'NwM${N>Ղ![WM9#2hM.M1vv:a%y8tx]dl}t5:CUA.lwzJJ:M9M˲(8p_C7{v(M9R<6A֤CK 3Fك)sܡ<`5w"MɆ:|l6ma]#Jt5y1ƑK * #rSw ArOsA&>DAXﰘ}H`"}׍D2ӸJĘ%B1n334!4+ vfU^ Rv F36ϔ$']w/1W nNe '_㻁ίӶ |Wn8{_?Exc \=+kmtټFoz]%Xcs7c=Ƹ>;N&tƓ9_̲.`\(y y[ bvL&zűĺZ[ŮSpy;! ]bn6:-X$uHd$9gZIݱu4Ty UM6o)gD VWcI&^ kcՆmF+t;yDn(wV"s4!Zko8pi4NE_25->(/<񸕗"ZEk9EZw^_N#бNc ikg|"u%4M|駜}kDR4>|5 )YCO#H[dm|zzM9k<"{ qkro,$ki6@eYzښ .(؋|)y]C 0p@_sB3rIxzEkC외R-4V)14+ׯdJVnf*@EѮ^ 9XBӉr!\4U>e@8wafؖr0'r'-W  *!3 [ÇW?~Ļ6 lZiX3j|ض\2,yhA\nWi0vht!H!(H#cWhd;|H18r zjAрIڅ"^7ʨ/;a'Q\A2}?, y9ax?O.kghk4=)bbh^7qPO-4vQG^1m;-Sf[7 +hSm 4gQ}C#xɄ5&摋W*%QuGT덝ĜKEͿ*A $kTF@X*$K[E$w~^CyD4H[xs"})RFj1b0bN[.>ҙfLZ;q!ap:q6\G0`l eYU}`1+.HjFd!(F [sJ6l$AZZv4GKH{nBh#1gf)Z;'JhlQrlF-:RH*KI: tКYX2BtVi8cF_b }Y#ajm qǦ!!>CB2oI Y]XNO^%%Q a]e:OLp@cgBKe$?pbݤ9Z'ï7<XS"̻h .3}?s?e1ּ0N<"͚uaiҔX瘺3yRJ"ti:Rb`= (iZfQW%B6@kQ`Sώw~zݤJRIpz5y.1MpȥpRpʲ\a1u%$41 j㬣8C*"A};= aHV Nen"!Vi;|G{%fZװ*]o:\)Z6 $<ϨTXMmNޑrbr:}u*ςukF۸ jUOjQDXh֒r!g|əXDv(f50Vi:ȨeJfYK BH>l}4d[dC7w\rQM'.5SV=ɽ*m,K"fL6W# J kqrh; Ha>\G9{mYփ6\kժ+vif;bL!* czFjJBP 2Đ&و!Bn t9*)Cj#(~v%Y׍aū$Ҥ?mTN$ zV-((T \ɨ46E7F9X[V4sޣ=xDcˈ1T>!Ul,u־5V1 K>bP5ZO`ѬIKap2/Xh9C7qoZ:nwٟn<>ٮWcܱnHw|p%Sڌ5ȷw_?}SgP )>6r*|?یe{2NQڂ xz? Œ䠚u]ZlͤTpRz"5&if ErmP+-RdDԌw&[()BT+nBWS3,MEuBL }ڨ%UrQ[d"VYcXT}2[2}cKR"Хy[Oib{g|M4C*[9#P 24Nib̺Frg>?<~fV$"T[o}b1tg03}-%WΗ3۶W_J?s=|7ܶ'GO"a `̓iZy:Ac PNʗ_|Iwl+FC3SmY=W2烧6)Lut9Qrf[Y9gY6!ii!,V֦ y )GJ MrItCG2[%e[سNI&:0~rNs*Zk W)mfvoiD3n fR\ϼ}aXct0c(;/V h1[Hޓb(ٜzbm!aZCZ#_b:9d-qF-Q|J׿][f-sZȩc點N*^( қûY!ٖ[l-3gL0L-TDnO-:Wݢ ϔirm)s**=Mm<ۼ0Ҫ%̶ɳ1& y'~X o}C`˛ja͉}~9ϩ>yְU">ھry-#i/ }N8mv`DPUClj+;݀l҄[uQiG"A`I<- }+:.GRL, :&2.msD5:m~GVcQM 5﹡:zY/~+R F,* wGɅ2EFҸ;+4#0˲\Y׍t6CI_Bt/ekPD!tlla.zZrlQN#&hb ^- 6D0N2h} ~5;25'чRɖw,L+EL$t~ jt'<}ԼAw߰ޞq%3]e#>FL5>4p8Y?#/ ZY_ΛV~y6WEaZ3f|}lUW_geݪ2VMC[zkls30axn gZ5}$pu]6bLfH%3u䢞 c;UF{'`͜\%n )Uz JKE ku.b"&~e[R*afPÔ'pB̙T+]iJn۽,{H*Di1*5E~ZCK`LB."1i63g,y/HK9E;-m6Қn4ٖ,r0(s"geWSJkޟe:Ļ5qO} gbJ{z2ȝ MGB778Z~O?3}Kʙ-g5a˿+̺JESSoXlODZLW#mBTۉo :x3S#>@C ,"(b~oM~NeuVU!pA)|b%"͔lr {}`MϚMj@d2=*Z7)8"5 HX<@qrR6/ib]V޿R$x=}?0 x|ƍ#)g9ς1No߼o믿w~'5KD/R 'ZZg>_gV/Χ ^+@3\%YL; BiVF =KP_Mq+|̙N`V+)| BT!se[%g=CCXK8ӊ4)'m;r_\={Ycns-RTu=-m1FۮXkGhN.u@*¶Erw)1*gY:ʬ$cEio`kѢњxќwܮW޼z- EĔHq>DᄇƼ,/`Ўqu]wȑ NE© S[ӦJ%n=Gvs E1gs6Q{ )p$3ŏ?c6?![kFM6\yHEd2ԄeULe:I1Suc5"qFNUQ[a28X4R#cA`1؈y#X+4YuCuJiV#Ihu]pΒF y'Efk%[2J*Ufew_hDOORJYW~B:a 8Ei+Ss`pȆm{xJ{8],U*|^sN_[awm}RN~ dhW-G÷7z&?-;dž媿[ ϗ=nfI] 3v 14 6 Z[mS]n|\[Cn//-RVXq:>.Vy)dd,SfJIw qxidu&FEApGVӨm[TƼLZyd4ޣF "YQ 2a+F(K3|G+ܒM i5_Yb5X[j]yy(^01=ٷ,˪9N]jNMciDN%o%ޅ?N\Xu!,xm0!|2|*Su~xx|00N|䫯1M޽/hI<: ,eV3jRRi tŖQ [DzFfΓȺ-1ѴmQ4$ISZWBp?k9rHS)yAB-I$#B& Dtlfsf8Bڢ#L!gkX+vrU!9G+e8ky^V?uGsSs1"g+UOw q2:_M8cdHHim^Cwbm+9oBd9G?hcfpT1N7/y9(5UMTK*5$x/)uw=˲(a Qv $ڦ!P.~(hޓe.E089qߎҲ, IȎ7ȳRKF▎NF4 ]Gi)ce0 JRFeC|:6mN86/BܵDJ1p:XV'N~ƨg]~mIwusTf]v#2-1A%C<2aĀLl!d!a$dtuweeees{ߕF nURVe/kE|^8Gi0J3Veԫ}w_ݿb^f3}~x0[vJ㿵~0(4E%|]EVz8舿mwbpTU6" gm<(zFT͢.Pi%"uq{z0G\j`z`/m675uhi3,Ia Q$U֊BǹZq͸zoPU%-"RdaY26{vU$}YU1^V5ҫ(KѦܨ"Cķڄ|]^27z+liyN,9-.~sω y^pswF|+]o~EhisKy18ï+$}?[g{۹bү{>^Oѩ2zZceb&M뻆~՟PƏ~~/M6WL7w1yzҺ]zcvÐh-VujELm5in͔+r#c=xMlwE$/SJegҶe׬ge#d#M941,@Q /1Wwa{[bszpn!J1kJ31זY$iVZI-c)/ql10|\®p1? UePn] #Ze!wTqb0v`Lx|0<0MMaC16 ߺ^Obаljt#&><-o>y*Hoa< _K~~|[1ꆭ/vfx3Uj**LjטbdYi斕[^ UQo;e1b+lawY6jqo-P8M G.*6-qo}omHUxӢ| j{Z٥YJ:_V20|THaҚA9蔔01v,%zmՐ{T&Zzy}WwgzI 5I4BǏyAӗȆ0H(ʖ_ vDݔ@tUk2-H:\ tkۺ%d"Û{ŋ4;/2֨u ~BP`i+B5$L|IF^xTk`Y fF WRǑn:yr!xB8PD>,-FJ+ -mTAx6%սlDֹ]oT6N,`xbT*hr.lׂQLVu TmNPa 2HYK3Ozcs;BwvڈHJ+-q.`-#,QKq>kQ|~YJ#PQt#?wDlpNmh`Rl_* V po2JlSzrZu}_f6eiJDvإ%g[j#\lTnmk- 23B}Ve3_%G10zGh^VajϪdS}M IDATrvy⛟\$| Á%%zϺ.S5H2 gl\3 ʕk|*ddI2J}M0&[Yb}bÇ.kY>|~|x n^WqLr^밮]{i{= CwS܍u"N<`] t)VFwN@"m)4p֋q`^a8#/eܿz4(~|{9p>쾌%wzr,1X+v;)@).2IP@izA@E %W O-Jߛ cr}4 CԢ2 J#zv [,)'#whيgɷ4n=?"\X\L4ss<HkK g8q.Yn7hu^$D]fsUd('BAǧ'^?<;)V|\_̛7o{ǧ F%浨/Ia(yA6Hnq+Z-aT64@❗e&"$:iRV:cWemn.L,"C7-v)%8,9u~J!8I^;4 qd^V6&lJsI(gJL4M2Rlhfs8[yqe(lCg#6_WQ[\ U=֋ڨ͢Ip'ea Ljs^c"n,2!x(X"l;6,H#reZu;:mv>lE ,$ ۝fit8(XiA4Jiu7]I<bT߫ 1[Ә#0*_״c`W ۇragG5X7"(|wqn$gLnmkPA@W"I54Y$?WkMr~U1nriOyܬ*ҴjclDr+>4AF0C |1Z\>I7gFFBFd9ohHep\U_浳$08W^i7o;v=0=2`x |mpWWPk!x}Wcj'g\ S쩵j}7ǰ\o=`|N5`LmY r\g,͊]0r8oۚcFeMd[[v: k zPPӌӵIi]s">ӌ lut_|Yd\Qs;7. g V t$Hx8p^FE'V5`=Pz˖2қ]i;&PZ$ektU0RWh0;˲`*Klu_!r'b !HG%q!X$~,K6߀z錵3Uع#k.n _~%)%rJ|wW_}E7Jm3VZTahL4g[C#xKoURBGҪrY tȆ5XoIKaN V`_̚4(\2$ -~-c%uh7L#ϳ|^Uͱ:lrW0RR88'=˼py SUΙ@Ήlk!TK8+c[k6ۋ_7a8&u14:"a [CeI+O 10N- \~ `z?_M-~hF uv=)3L#R^3 }@q!Ⱥ]pQ4MVȆSXnWLt۠JO1 Yj#Fd-uԜDR3s^Nxw?x!6#[dg w{ 'jkpXLBgrVSyh,w^nWBR&a}D"sCe!a l]K,-@vٗFa[)Zq.HL=;k\V5*Z^$ fXL#Yk8}k²rnqU;|>$*xEɨ" nC#ё/QuYy^H|p0xL8c+\zO]y*X>uF*ߞo>kdePfm_ca)wͺ]'Ӌȱ|sd,p`!cdkrK8ߩq)-kR-klȳmt:9= n),ZU Id }_\/l[mDIr=op5%BB,EL 0.- q"d\8]s|1vnNm'᧻RƏܴ QyA ƈ#F3kk%غ <0M:-(XsB$W y4YNi-)VGX%h}xk5.2qŏңV^z|'^·o1h^+4>qyu^^hʶZi W˅!xi»4IBZ/%!`lYW!ndU6p`E YZʩiG "ym@?vpRNҥAdLf5kbܯMgtɟ:4{ɕܪ:\fl}8!H pܱ={^ebT9@8 hZm^yYp: U6d޾}gL_@DRDƳ+3Dx1e^^9ǚHqua"6K\DX3V15D,IHʛL֪~ibkTܚ@K-䚤!g£4.G@f\Pd#ٍ}N5 97$N5!|zC3A [K5>Flm̋ʕR+Rc HH]ߛl bDRZk!6liT l1ug/rMʝRU{'W>؈˺B$8p]eK ~K˕z8(J %{~@[6kKFkR:d̷ r4LN(yOU\k|jr~^/W^~؟۶}jkx;T=[՘{ z(jMU-_;MVk-ȵPJV"JD:ktVhӨVk8;/ٳXV!K[EDI@xș]rº(Nǘ M1%uͨʦZ 9RwlGG_ Vb |g.:: KVϑ;WIgόgS[uL/f%ݙ$B߾ pƘK?l?|ײK뻆O?g[M{jx8JvSƨ۠2䋵N[ߍiXD$4й=a)Yr߀9[%}YI4 E֍sm ZM:VYcA}['%)n]6ckWeZtH=PۆN h w Vt^|hHS.b-Ԧ?4CT>#ݲ ,b!!D.Zt։l |YVO9͡@EBTLe^d&>{HxTycdͬLǏQkv- 1r:p]&zeJ[8{cBȻmu.I]LhB:*YzZ s/Pk51 yVe^Wդ*MBO]Epih] f VcK*s&AoYy-E XL&go<˵(J(jBQ76ec#FO }{\FeWi_}{XxbQzV%_~ o^L52ʹq^ț7̲&M̷yb8ORJYJVA^g adnt `T_GZ3c4^|EFo1JJ.aaޓ[8: ټk CWy<܇MZ%Aݽ}N%ncZ{G"`[&dpػލC[B\ydzV64ʵxB e#$t~qo׻fq Bg̷ \YAEDﮰ5t ܧHW @֌0l)EH)RH`^VrROrWQP>s>;Ϝ+LYsVx{&r U<֠Ս%[V䭃ac=zr]$j/Zgcl_ąlEE6#[*>uCÒL-fʙUUj/D^kH̖ w-*Ϗ.gY[NkpuYgZk, k|w5VW֧W?!L=gB|8cL y|XCn%|tbp];kt\Vkݴқ/ݔsܢ]y|>.ߢ?~n*>#] ]Cg|GGo/M%χɇ麬zu6Z&#3hN&Sؔ 9-x7$HSiz:)`tuN;Q=#yZ*YCPb>`W\5c-k3q Ժ(ڶ%PyiAR%%1Jv ;4vWruk &v'U!y{Oe L k-$@+B⁈1JRb#OORϴR{pՃ24NU((8H93#+>z ʖpCo޽»ws7qA$/8NyÇp_͙V3A!|:I֤樵44J} nb|Z+kUb֛o3LJD&R$JZM5[y:+MB ޤ8rgjOCɀ?K) Oj@;m<"ق"J"3~RK)e\|}[V2g oV\*)RZvhk>|q^M)\{ ?EΠau <>>'S(^W]$yw co7n+q 1eG @Z!΅%-tnkGZuk͆cN/ܤٚ DƸnr=6Z&9öA$wwwJ7 ww6։&r!KiCIB .ȖPz[\&Ri<ȹ%CiVV-8F3B^lr}qk6$9/Q0;DECl TوyR.(:Juj\vE3FxYHJUs+BkϚ <0/Y7 &W|p`]V%tvS"/-iްJt֔'KynEYZIA;4fBJ39-p䚥0xGPknp:@AxO?_~CsGXK]<_\{5l- ѤmC^Oԩs>e< 8Du9O?[w u>aw_sifhk17i|Q$O%EoyoLSJ+^p ghYE;Ekxm7phQzg{Vh1<݃k[2J/GzQhNIO IDAT0akQi̜O46}A&l]t#v"CѠꮞ*N֐N)g-A{k8U(YYaa 9y@l<1u)r!j< ! 4El LB<";Bڏt"y gpN!R]/=l4ppO_ܞqfN<9.~FHA-6){k$yòF谂3tZӑf"L΅%8':56lʼnǵea:s"瓀Hi0;\LJE#r1 )U>7Dޚ7rx|?6Wk9'U 4H@:yiX< }3gk92(qVpF7VΝi]%އ=÷Uge#J^ݾ㭀aR* ){|7F'&4}0Qܶ,? AXcIb-`O'^!Ӻ`Y*5:Ԓ??i|(5_71:4&R*ژ;t&`,yT}gQF@L0q87hb|AU,!Nfc佮+w `T9k̷=+4֕q:2#ᬞZ8Nv 2H-Ox u&WGDΝ5[<-{?wbݻip[|'S\]c)Og}".,+-oX,^kw{k92҆}[՚s"ټVnLj/H`#&pd 5%n,61Ye0mq7\n7mDr-cC0٭4/5!RR:p] ݀l, cTP[  CBkܶ)h,q!O4+d1Z#Xx`A1I2yəiЩ?|` tCS&x=&޾}+ )H@*k:ZV$omkT6M#+jA+t/BSr3VIp}4qߝwXZdƸFQ807,Ja${+P-u\z>}|/(}doMUfJr*>/uM>UrHMXQʓD^umwV\vMc.jjPREW[e O2џ9&!]$5gݦvQl We% MJS ð75a@${^ayBmR:202#U7{ZBKQ6rE0#q]`^Cհm[z-lJMA}w\T 1xEYbl0%k-1gYrjɬG_2H7V_c-!SRd5[Cc2cxϞRfm!pJ>*ͦfҩ/VXQgmk۠J~ =YSkUPR]7ٲC)Mlu,;ӣ* = V갯02L-KM{93; [5p]WΧ;i0Ju߶޵07L}AIEa '*JoyiRSZDU*&%uZ)#A6}CCmf@,RQ;{dFz'$ Mapk: H3ǯx~;> z7u_*ic Љ05gn<_[I8k :ŚF^~+O??p]QO|;]_/awsZ4 3lw.Y@AJΰ*G$q o]4GdX&Y@v LGR)\癤[Xd㝄 2$JxAM!gloRrF&^hsV5YqP\ cQHá^(EpW}=[f1Ҕt >ZF |B;\n700?/ktv,%)jJ)V]o)GR\k;t:r(540q84L5/^β8t[43y< ~vhK*M=g9{;zRN{cHpQdD60AewQ7X)e2*ͯNEzRg]5OS5%b`ԛؕZe@S[èR 5Z, 28B&JVZ2a3lBma."@YUq@g't"cdݶ6g"ٕh&f(Mb<6%LQd p Wor (} iz}[('j-XMW%RW,ZnyX'!uIo4q{tb<HfJI35ݘoO|0G댱o5ޯ6WOo|_7Nݚ9zojm̬1"U*CQx҄80b o<حZɲhr7jhnzZ&7 YU|j'42c %^^C .͎u,6R>S CؚE:j`p?bzB3FA^n2ֲE~RzcGk {*کnWf]+Ida]ٴg9"28 BtVzD tXօÇG3 i 6[Vj QZVI}sȲ,B %/;]C_inzL#)eqX zg-&Rea]WܳlzvwHF y]0xNS_}gpoꍴ\/ϲI_~%~Wx~|LZ}$J Uj p:zcM k:9Wl[G.M =*9ӬjZNsUkuVJf6N=%wjR$x3t> r\!0MnjFҺjxx[;KѬ! (E`g?>1M:mf&ٰ=-PA;ۍ5w\vn@of\n(mh(%ʺV&SF}x=Lr^E;΋=WP`?E7F%e1JɚT:n7d~hK[EyޔZEv虦E?w׫Dt+ (Ԃѻ8|"5H%ߩ$~SݔY=>^Rӗ%a VL> ٰIE|Ίw!C,Jnh\.nr jWJeHUeP-Y_Uw_1_tDʕR+vfYF`3Z髁C<@Ω7Z?Fy%k̓9ejpt&o*A=P3k!8?cw CI'ԛOLc9lgŵqr*mČz! BDMKfn{mll$`녡f X񎀄4Y좆KZdp+3Aj F;vU/|FZ2*PwStI2ؠ` ˖*yQˤwz7Ȧj%.ƴyhQpqTin!n03e&#Ñt ,R85w#*#yJd.71r~q7 BN҄x Dj/v4M:q))CIF'X=YGn-u^J9K0V1b#]KYDOƑe]{fq3/Hg ˲18)cWoF3 qd̴.ZI~8&3Ɏ&w}{D$F[@A(H~&ZwA+-Цr%5ZMV8dF7Ws"`m\5ˆMw8w^ޑrZ.gm~=vg''nPK!d62%H,#C7[/MheYA5HiH$u 07L1N6o[ͣAG["4Z` |^)p8LCp[6(!Fmri:i1!2c35^:M8SFt_!3Imk7*y3#Uک,n,dx vwB6 8iN5hTTzaâ;r;;Ed_kEHC|BoRt-hܼÞN9X2"mB( ~ߛأP'gS gڂq4U@kIDP0aI);V{Uչ>x4ᮮ!4γ9M7:yBx4%C#A_O5*# ;qpIR8=%Ę1XFwFt&cS%C=*ؓ&|{(`hf& 3"jبڙ@Hø"/&Sq~LH,Cpʟ#tﻚ(1h Jro&`Hx_{xL@o"t/xg y{nF6t8b|;ta{MSPXu19_78rtz8.xp[8;b;G<<e6_l$|~๓ΐVH#|:"E42NYHo zB]R2z8L2EʱPJ&!Ez<  p1YdG؈8@4a'q:Ƭ=QN٧ *̥(!8N7?)py*m)Ej-plJ5)`2PD"l#`H )xxQ&r4&8ɄYg"M͜-+m`! !&pP'|;AYZЌ@˰5>`NOl S1{<|>"Hgk\Zc:C0YUH9i bQfh&-#AѶf$.w}Q X>p}.Hp<1N#R1r7h&n!vMQ޿ENFUY BL.)=LFM>)Z+: kRy X lS MIJ Fx<V9@a1=?RgW 8',"n; u΢uHl>nJ] 0Vn^Z{`F+"޹YMzC-}S0ndgOg(xK)FΩPbQp'8Ϧ"I-O7F`{wMbAXJ[EkjRy9ͿS)0TS zl7l۶YN Z+7J M;8'TJVمp: pѡ/p& hpidí<BLH0,w1/75T9MX{N 4\7Oڰ^^'@ $W?Mz/1Nofp鋪v;Ƿ xK@1\L0:m[Dyɒ0wJ8t#jx>pN p蹡囆x߷WEoc!R0ԙ>$Σ "sȸ l÷PސʲXZkE;|@QM<%9xdC+HznwXq3ۤa9y7/B9Ӿmc0@CR4sFp.ߓ|;oOxt6rt&j3JiTx |Wq0dRaÈ,8&P1%Z8q"EBi IDATEm6.l AڥJt 0wV+bz'ٶAA0KP+opԝ\y{y9lص[@lx!w~o^$%JcZ[CpF3>#Ogݯn/{5. w2#uYܯȉ͒z.ִVkFVhD6(S-Z(-fhC f$9s#`+ iY#WkzVfdhRBo:xֆiq] 9x Z5`4v!YH{(DMQzCLNL 1& ^麖ݏ琑Л@! Z#9|:O31xL ۂxF)믾ۆ)&\W${LjC8Ϩ|g[^asg4iJtʼx8K߇r!ޫ˂*?5˼@7 ;vD $:zֲoU+ÃG{j%鼧CLleEvR쁲e]13?CD6p:A#Z6$|unqXf6k]1ˢp (DJ:Wt&C;j5zGv[+=hphuelY%vc:TFmWM1"Osp:qhPreRV 1 *0ŀ8lt~zr?|;O|>}\{AS?<6˔Koe链rREJs}~8~!K):ւ<#)(esOЃVj @#$=zh 6*'鐁Bn^Ka,,. ·RhQsFq ݶ BP+R)b᮹rZ1w[Qϰ5jbT7mfU@)w]zhWDxpnG*ϔp<[3DڥCDW?ƻwo;UQD0/+8ӄeEt+gGX˲7fGH3<"iFm5Iz5@BčG"TU(l>K7 &5ڤ$5 Ěpff /bBHl# n4wbY9(uyZtv2:@b <7YtB;5󲀖&CPnze;QW`n3vۥ%ĈFPĔHt ^ÊR,8F@sfy Vl4| 1p%4~Mzύ$Ծy7>;<~N'_N &Nk_Qk4Xr4N8τ 4^-+bP\!mB^9E`^}f < Dɻ1OԆd>SB##r$Y6 @pkP: M ~G(τYF+%ˊev6ڞK!25kj#9eVe#"H>!x|6y8' >C Pi78H)aȔ'<쒽:7PKCGG,>}TG37?+t{C̞<VЌgXT/L"Nog!#+dr++T[Tna aڕR$nOo`ޡ:BZGJov ϊlUD-Iїiޫ*[-@LjR!Ez{Giv'6ٶyP6H8g:bo> cNHH_0#PfFňL:RS8RF1 (I썑#^uc=#T,39e@V9^Åx/@#~zw߽b4UM5|z~ 1:oչ\\AjZt[.ǩ;TmpCC p8Vo_ù?GVHd3njlLc)b<bD]g8% jp69gnb_1jo kLVfZC[/ؚdvCB2ρ#c&燪I^( E[#4❠,'eI9'zu_| ٥d{ 9Ҙ"PԦ|aoC)}t 0ZQ!·]ke9hLo 9(zAA٘hr> 2uFJKik+y]$oL#=)x$x 845ZzǼ,P!Lyt06c@Dx 0M0ɍkJX+%1EtT:`DzjMb7MXv'!RSd8t WRc@B6) 8vܬh.Qj,i(eL(,GyNM K45?C~Ww9\]@Kb*I*uFcd;7^'ﷲl\`k H ->aZ5bPń%apI&{!6c(jd{cԕpx"n958u4?&Cq gC% QoXf~hqɍAC §9^H>S1hF)5i|gG|8=>B:JgqIZcÜ B CkI V]w! ie4k0D^Mb$>{n[?%E8GM(,۵bP٥x[{т}þ=#%RjŸBMK Չ Bʈh{nһbTl|u5)&tUzZRDn—I_l9SF'6aPlAX޷Rq<1r[~>`V[˅988ˌipaߠ*18rswx`/JPWPK jyǜ'? ޽{Z+>q32z"]߭quȑϋ -B|_]q<ZQ uF2z emPfdQ*e06Jv)۷GULÁQ`QEHg4#/w% `q3<%kj*D!fgM#|}0 35' TTih"hRtV M]d4HKT۠Ag*IǼ.8(Uu赡F@Ѐy~bY.heA+ |G v`ӫO0j~mtg9'#'~)#ƎaaJ )b[~~nΣ Ktڝp^]+c; jaCG8׿?iz>[SwDItt.Aw%Js&pp"g54c( av űtB|NXc4d56d/QGF_x>H:uHDC? "C7 _©G >PBPn'okت u1 %M5}0XD489WcQ>ryvEY+Y,P| Ä>hҳ."tPl.yK9'AJiѶ]:|&@I-{Ό H ƿ(j6+{1=bNxzq:g)Ä3Ä&B^vɐ̫b-+)ʢc'x03yL6r40 bM.+3[AT91bYt~';HreJq,ea2I0o8=_Kj12d 〗 (R6LNX4 7 Jǐao9Y ^fʇǺ.JC _7cF\kt(eN:T9C4ŀnC-v5=߮Om1FSح n/{wIUeY|a&,;Rʸ6<=@z g PCb # 6ĈqVE] &Tq;ǃC톗nRF( ^8  !zj՘"r;n ]Gp*bQ "ъn*8#j}Z7J8gntG)s+8ն:&2!g E\ CF- I ]l Rm3[DJCL~JMSjec2zm/? PXTJȾ0 :wp0d`mnc:D*~A1,+0p|w\ک5D3/"-VwוʗtdD%AR`G#w4`: @+Äp@#w(uEmy)u1S >4/&oENw^[H"S-عf`j^@cc >Y8_!f@zOic#zl`5h~( N;BF:[zGúʋ;A+윳> lm/a>XV=f݊58_n{ Dvi`a۴>LH,];P|z438 @s"#8%.8{7|CyIEWw.FfLQ:10$jl`鐐Eil7J a~61&h8P9n0ZaQOVLR23l-*@ Z>^=/[I% &R =,}ϟ НCʌ!z@ @z6È7 Hzݛ~pLu^u)XT5e%-S pJ)(ΰ{-xy~x'/j瞓e.3^~wo!7,givv40wHw)}K5T;Zk#Jxw`QvC b>JZ+DIUeCPj*nBEP&MSETn!}UpC8NPdw8ۘzJtFt,Y\ T0g2m=B[Bᷬ;Bp8'>GT |/vMn_ù;m ̴C]DaE LB|4U7Y97@ʜWh1疠Z蕖ցĆ?&cna0oχ-їܫA|= L& ޢYVJz%A}0p7oS8:OK[]K@'5|*dםs"zŧ(ESc|~8~!#~k/sq>G\7zbFҀ[ +=|4٠R~TEG1ǐr&q@s<4N1v`m}l4M#:ڤ̊+`z]WGn !"V<PY#9@Zႃs5I/CȰXw,r0p4$8MsTnIGsw,xl iG<>>2k+bH(e0LWp\o3=ZV<==^*~cGRкnF=_ڛg6wU<궆a˲$T"IZ05k q4Ie h] km+Rhb]WH!QUY # vC~8ӗjm]$۶OA/&SUpSHź`Sk69ktϛQHqi"u-)Q!z\.9]"J!p^ T|C"h)hm[uo߲)&.p{Lgzc3W;naUH4B+uݣZm6b#G=zFw`'Acsa>@#>\y {. R0^u]VܖWg0{1%e-ȑj"#vg z]VDh5C@ND8yoI<.TyXFQS6txHNW ǃrcfv;UP#u;<FHKא!k8 q-h ,a:I/pzcS 77\j?߆7v~raρ/~ӮCć<??ӯ~ /wipY)A۲@hMLUlH $Vxx`T0ОpԺC:boHҠ̀ր:.m›,f_uu>a $A Ő6C+XĘ8 [,e]#$ҭ Fi@N|0b8F;ΘtO^ tPҁyYMM.d%=xxxEd%Qb>ƝkِOp+bCIo9adwVI)p:|Зh[4*LRD73{xJ΃e }˒9Nn:6Ԋ!%'l#nХ(qZiƙϏk`C ӅlIJxqZ:}P EtoYV{Dd}jGʞb[-= '9E- ylj)'Xf[ׯ~obaz9' 1;gH(«br_{ëWᠸwf9 a!|>BHr]WN6ԖH1/i:`H|v[>68.X[Q#E9gxRV1#| cVRz /X}P[B1 #)"Xb0va]>Ѣߩc-u?6vږQL7K#J MGWĐg7W)ڵ~?N1a)T7SJh"apy p:32ceFE@ouTW͚3Fi|]٤we ~چ[.0uF9π v&WDr,w1=aB >#eѥ`G#j2*u~ vӄa34 j . |$Q3؛Jl^v DՎz)u] 5;҅b7g]r>&Ui1%eTi+a̲xGA~~*?t|hǗ_~YcE魡?|q]GB`~B)!Ŧj~(R7 W@)I^{1y{Ыɫ% ~]K]tS:"AAcΦtG94Q]D-"htE9%Fb4 ڸ=a::־-cDqqu HY ,vax<ǂZ#Ji+bZʂ p@aBJVkE@Á|fS=?s8og9+=DÓLkct<2/Kl&n9Y!ГA@lhlľϸ nly݆ ",8m0A.j{'pi!Im!IWkyvkaϦf]govjxp] (ua(+ smflOлŵv?͐;᮵AT?w/;PjW2:C>~VN۴>l_wt<><7_c)(b3/PZ_}<5]Qe %/t4pFJvznksJ=y1F!C:4{w`G62mbR ltyv2> 8aݛMzUzɥԙ-;5efQwpΡ@]F mCGoڛmH:]L2#eCj0¯!䄥ѿPZ80 kG+%v=@yrCP{3yzqç~Fy8=0N/曷e]`AΌXzx I__ @Oez ֌aSJ|{l*Xg\_,$4`Ӷm6(T4 +c.i")xh' fĵV~t"μuЂ6' >E R-pP֙ۺ"E֤@+װ(RLԼ1/3BHE(T1M !zF4rtPFV`Bq &mR\K̈!` 7}'a:qp::ޣ//xx/(eGiw^ `3۷6T֊V~E׎刿ͯrzlbtL|{$ [ĀIM;s=(جl2cЇh8Dc&CʰJe*1NΩ,e?_^aYW{apz؇N!8`F(L1aC6^|Lh>FߖywWs{Y ̜K)buŘ)}^sa:T#!"xp8g2P%핾V;Rf<gnD㸙|~!Zva3aѶB_Fk ]tp8)pAD D)]^BLRq7?t2D,džh>pߤ3 &jR֞x.s_AZLQ52qk3C ňd3VƘi7tz]l~hmk3AF0yW@{rG2VQl6hHz {&1Y,ˌָ N[&B~_WdC{oJsB:?k)i:84T(+9!"z*~bYVVn{g" 4@xXw.7pe7;f ak@>>-W޽i1*|]>,?!#S{_~ZzA.% h:R b'\2sK^)ޖ`!^+CX!vt zqu)VXg  ^ԣ) @YMt RjBm&6`.8<8t?)PJR]>AR=y)rJX@<|9h*xw@ol:/ Q{q |b&!d( ˲Brs'qzOe[c8"q#PւRѝ0ЅS3XIpJlpWRs,lk8&+D31ŝ*㲬p¢ۆBY<$F RPGJKhXaC:J $q; 8ZS7:<̆!Lgf`k7: efm8XJITpQN'8瑌l9oH9cX!r:J1zѺ"<R1yZt8`:} |]N3r7/o&xͯM^KɞJƘ"&r8Npjxyyg~jK|o]12}71E4(3=7wY6-Bp-ޠ W>;&6l孏 ޽;vJ6}FO4~ Jp4s:j!Ԏ#:w"}GĀ%ÅV;oC[#CA5<4 u4{O|QЏdpb#D~/7mD[op!=׺pݒq;í`L 8B l0֪r˕:i:F\0߷H!PRh-}>f:yqwwwTt, 4Dm@jAw]*!IZ#isRj+"^k]l:TQ(s/pLyt81[X A8TUg,3QID_SveD!PE9!Y m+|! !~G9Y: *l֍3fNQXg1iDn!h]\%*%z뼟G>s{ jE0ÂKn))FgpW8O^o\8tkk!n)W:⼌ps}v{|D ~]C|}e6\roj|CU'r/ H/^֫ WJuCJ|K$sH"iMCy/c#Z<1Ժ5#vou oBZB`ntU3Tg~q8{{xh)`YT9#Γy:p)% {-z*-}; uY"4 ]kǤ Xg޶8N!s&JGwi1EFF6zς2(^鈒vNdcԱ-$ L2b=4+da/鱡dwoļl3[Z+C<ӃgEf4=nجZ꽇d4Ϥ(11<;ɨR*9o [-S_Vt*mNGA,{>Ve1ֹ%&FlޚF\ d[c  TfYJ88hM֜3BL8b|Gxx  gԜ8kmQ(˺h"Z㈯(R{ Pag- XmIyJ#7g4sJn6RJH1r\+4.zUc4M(Zm[PKyz>(Q8R Ja]|ij;rȘeY{rn}ȷ7PW>+[0Gjt4>c.!yfB x{ x^/cp>ps{>!z, 1)%FJF)80+Jo)gwtz&Ћ1"*C96yӉ!~֪Ge<5'FRA[I-H38x03F`ktΡvE[ᰧH'T&t|;ϜCʾΛ<.~R `jQ 0$x3lfs^c4᠓u3 &#]ζW4;SHwV)Z2r!@Y1*Uj2/ 4P|w߼^OnqF,RM L΢3Z㯾ru|.SsAe]݆/l2_A΍7?@KW) i8~K#z1(->i9C`o,:;BT"d@1AO 0-ï30Cl7N؉*b$`U3700Jp:8 4>['dW IDAT{1|gNkN[yC^ƈ o=mKÈgw'4N#޴Y^XϞ=Gq˘3jiBpG⼃5o1Lsh`yۈZVfY2LέxfL'k1h0\{1i ʺ1pf97+b 0 p"5Dxo &WtnPKQ4Xkks昨ZӹA_zntP OHaLTfLtc ٜ70.fnB0]+>nۂV0uY^w81n. yF XeͷQ`YmuFtuZ~ֻI邗_3֕C93% |?ӯ⣏? ue3v<z+e; .r@BfyJKܐ"*]֍&Hmqpkk 't|Ekr4붡g)I/0DZm!ELS[ƶB%Wm0-ad$k)%‡G[m2^K\EAc:bp4 ~_kmx</s),jS6~R hPb eе9a&"M"^!M.wZa^Vź8p<{I}+*׶p) piRbf 4a*1DHH4ϡU{T-U48!~w'|NkYNe볹*Z\8ܠ5ojb$QuQAoX/׋~*jVzyg癗clxbQ>Io)i0U^-="8M#sG!D,xCkUt)r@=UXp( J*g,kq=CuuJ{^% Wlʚhދ}zx[XV՛S}~[he?+>]5nĖ .p2\ʿbL=EXT/8 ň}q]joᲝԑR1\ &mBW' p/W)@ nb[T]dćN NhnW%a,RoYtTXl-d4K:,Lcebu<].ۆ| hR^0WN'le|n(FҞYWKEEQWhQ0a^3,k\i0RzrT6RG;v777)wZNΧ3G>0(ZL2< Ā6z^gۊ!$X3N3Zkx H D[rf .鵺ޣt '8 Qp󻬶VFAGVh޶ZP5_+>("q\ aUF;zg I F8z(ݘrbJP:U6#m:O8Gk9-3tAӃR3 -]  ku֡6 FG=w%t9 R\OP溬x||tC`` =ʚx0zR7;`jD* C-F.:&EC[C->h`H+ɼt(@; g8KOr̔\҅e:oC%p98d!Ơ6 Az791#Sub rـaP>xS?wq2 tQ[*ecdE2nf:m0Mf G= ĭ_9aw^Wn!V|[Y m%6#[jOCGEFyp] rA6;,k ]J|~oW=ry;`r]B\8fkD[\+7wbs ݠ2~c LөV{|uA]k&UDu2``amU8[ q:=lMQR bԺ6377Vro;z[~}ڸOQOxLw //,ɋw~qht>c]Js ֆj]ʿbjE[p1bN̾N!Uir2HZ ,*6^* 5SJa4 ^`F6;pTX0yGW@a3[=<ZkcѤm@XA}[~B}5@ϟD.Sbky=V%ⴶ? L En|00HSV+BaLҀRYr3 㱭cT9Uk ^J=%fP{z AJ^Mho p 4a@!-8 4LC = {4FpFT~np7HÀR+eśqah:3oVMH47Dgu3װ#Ũ4GɆ1 qZQ&F3#ؖ9ǢUs[X8`BinZDQJH$B0"g{!6s@/|N2Sq ULMa)At!۶ eSJA!F<9~Npٳ;f,Pۆ.8ķ{{oHGp[(k3} sOk;y`"\&zO P'YZRl7v,qPa FۭuVKi@ PkgQjvD]0 Go?KP~̕  ˼c u2֨,H7Lsx];:\h2m Xgn( GGJw`w4[+ttpתϪ!Z /}9?Bp+a:Z;o\@k0+n 3!! ZΰZ"1{G7o529ҬJR8D`Q`}g-z3 bJk]*kqwU% !Ty0]%^N(:\N't%v1)nDۘ8Dg88X!lN'l{0ӗ{G.FiapK,H1"m+H1S6}rw|:fE:lov àɊpxBoi (f01.= zU޻a8`p?ӛ'a!]RbOҊm]m!?gmOPGֽ7/M?OS{!]{o76 fX5Z=Ͻ)oE?;cgXz74=|AL } wM'=  }0Jo0x6&֢'/N#{o,Pz},J0z옻Zy ʠkDtm-fwxwF^V ym`Qݍ9T`FlCkU*j̑~x1Zo 7 G,kF3N"p#tt:a^Jm` 2nC>k`<bL(rƳgp> 5gOG6<@p:Wb  zie7N=[4t!k5;P1aa SB +2鍥r@u{5M#.MXx?>ta4c5oØlu;`xn561tB$\M\)k[vt,*(ӥ|[:n9riD 뺪 BW(!ەFCo57B rC;uE3@ۋ-w0O6c1:;}ECc+4?O iw &z.;4ށ[ Dp%:iwϔaZ)9ol('|: bBeǺ^>5ܦ3`>f k^9ol };)1 *V: m֨D(=bCӺo+K}5fٙ`mzq:,;!8I>NÀi<}^ZTmLKi$تuf}o݀>6/Zg)[Ӻ` J٣*p^7x}nza cͅ! 5rdzG>BA)'M{)bu [-p2VB ۹@ |RvZ!9趵Vdv2FNa_jrKɈaDmE}֐N`24}5n(E8ՇL﮵TdX=Q|.ܥ$ƚ3ʺRN;/X`8{v)O^gZK+h)4g}{? ró/LZ'?֏e_=~O/Uh*7ƈw7ow?w /}k !8R !YV1Τn־|7H>G:ڶaC, Y;ma-|wAė=°V6a82Fa Z*hlơY嘐ΰ0LG*Wn:Nhf@(eon06 wWvF W߯ 3ė2`-Zg63Xb YN3I&#agX38U&CYXL ʗNn.S1q͚1POǞSVJ!5r l]EM4Us |>ʆ^Up:!B.GKgŦ1 +7ǒ͍}ǘ"z hŔhC;AVӻ~flvm>{%^zi oe ;t<޿2_b4۬jG!-g~>ߣ|/)V ?'T%( , gh[z+ B1?]Y2S!{#$U- 7Ռ ><1xTb>gCƉd\*Έ!R }Kl'9ˊV03ɦ0}WKT2YyRM@Jvq11*w.u>&vbli a^UҠ~v oZ 3 P+wo=p -^{:/طQJ?g%NtLC.0;|Wi|Lmyu ҰGX0Nq+x`h zX 1QG)/9DQ1E=R"9-Va-4Oê6Х'ێCXZ:4#j՟gCLN]9JAc 2yY1:<{Q)i4s%:ƒaA*|RQ[G+C ~¨6T˨rҚJ ;uy0[O186~u0:sP^Yk8 8`tfw-+3"|rKjbSRflۆ(**A4Ĉe]TTeALypGF +j̡͘L!P!pX .GܜOy.&Z6g\oҬu6|&b7y>6o_W'y=o/nď v:o?m_~o<7_|9?|?)Ⱦ6g﮿׻|ww>;}sW[uc<#I8!/D{P+cGL77̤a`XsƼel{`ab;\q_ +N=떈!n5[𨠄Qs9_F'Qyjmkt8}*0/Jks0"*#̠'8x |{B0"ƀy7H-zCJ&Gᬃ ,D8M4@-7l Zzs.&^>/k=wGd^#z)DX/HH$[LbZ~l>ƀq<: oz/ uEh/sd6Ąm]V2΍773Jf4 3l>PzKEi ׅrNny4\x\|Xzjbga -%eȂhs_PGArYC*:|ĎׇdmY(+3(έb-+Nӄۛ[묄poa =L9äʼny4͸:džRzM7/9Nx9`[W ^_![ͨ&`q={ V[jpm}Wx;n |>߼HA̎^8MnzngZLΓ ˲qE7Q8A4巄0 f1 3?ux .@؇7q!ѳJ{ÈR e<== c&rގۀ꠴YG?%H֢!XF-0G|/@uLt1mHe[ s|Hg|e%S3DNuE%sKeMb#<#Ӊoo/^@/~ 6xYZLqƕ#@]-;Nxzz̆)l@Tq gjːA(e 4l Hxmx.+Z("DxtAVmXݦRsp5хP.z3#Œ40ߴw!T0lXg79瀮S(-uAר >(%c]ddY/004ŨYb:L7JKmjǀ.xUUNӡ~*r /h@stФf&%Q֌^6HZ6)0M]oLxk2Omқ5:_ݟLZfŸ8<ؽ{̒g}|ŏtɶ_1 'e_g}f?.w| sc~>57k ^Igpozm5?8b|;8$ [3J>1)p i_x6(o,Ӯ1Y%tRdcTyPPEP|B1sI_Nځ9iڐ>\@'P.GYYF)n`kX~`c:m^0j066ÍiHS 5,tkcSzo@qnN0 !Rzkh,cM~{x9IwZА3jgxʛ7D`Gu|xE$qWzW!X;}p[lFm7H@H{[V[]BmPwZuCxHF={hW/_a-mC$(aNuLYԮyuD o=b&RsA 8a.(bGǭi:!\VKFO:u$U.^g<=uZĺzCqisHCv)d1+{'vZ!Q*F=}v/&E0z> d_;;j{~d/>lX/||f> B9SOPTq D&k r]~gKf5uYl|vƸ> ^5g#֕b MAZF6c\k(KJ`b s(zvö Qm$џ#z [pҥ 8Eeà>ށ^aZ˰A6`]EIa 0 1% &/̦ ֚ukQ:tlԋtuКٳp{O#GѸ 0F̄ & }96|8h0D:Jjj-~)h?dgN[-H67Z31`H#i-hoZuvPWs֭{lbd#pvq`!MvpJ8ijit`nHVYNXHs~gc}) B|Zs1~C}2*sh$ЍQ7a-JQ >zFa7,wIv%\UXyQL>Yc5_S2h>BX̼U3xds-+C~7ZeeQ Rs)ZWTTHmX MZB.a)r9N-SH=(;\P{ʶdw{p `].:MY=:DNd.Emp>|S77]Gf.yٖR/_BNWJhvz_;H/jk CJcK,$:Rs!Hs4ѵ4,F1 Mu~,cua`SuAtB)yi֠%g,yA 'bG4ԝ2#W^>mo2j˞ SҸ4e8F@/oׁo} Mmپ/e_߮~8[_j+)Ά&u5 s"eƢFxx~caC׸^/0r'n^Jvs}!ѡlGCx-|`Zc 0\5eBzbYM p%#HFWgH㟓VXESӼ5<8]E3Sf%Ս}@=p;#=.hq]aGbiG 7 eC-;ytNm6P]l$̠9su4p(%풚 ( }*>*=)uMZ 1NYkM$h>=fةh );C@)% UM &aD:15:3%S$t9c:ILkⴵ\2$wg ޵qV0WB;?[F|L׫Pze.`'u ePK^>x8‘XlDV鱳V .3lKJ'[ 6n+)1qi$ ֒qG4NM0eJrVpDN wG}|&QA|O߻GN pbgʍ Q)EJZOV28_(0"i,xZ%2Lڣ# sYz YTR Gw8aRQ2Cmb[|'|#޾y AC HiAZ#jn4o8 ŌFT JN=v*45duwU#$pWB3<}}ܿrȕͅ` al]WĜ1Dž&4xk?;fbȢtt!`F*Ϳ!LGMY8W QjE7twǜϨdlsB?)wfDF/4t ܛ[Qd|L1;i]Vf8ju0NRȈB5Ęˬ9-Ǯ {JLɗƨk-ZqĂuMGw2ZPku+aY& ;g)y)R jǁV%xfH*u*З\rB.I4ϙ`"t}A@? 1V*!(Ӳ J B^ʵF4JaK!(!,}Y%񙪪ɹ(F`GpCla#ogcͥǡ?}pk~$)Hڼq61Fm--Ut=a]~n-Sѣ5Ƨ-N6Ʒ:]:{__óbz)xr?Jo%[~o}x g/?zįBK裗3| ~(wkwŤ?R0\s$skzs!=|t}O9 Z3P *q;,!opN71`Ck9}}|xۇ?g}/_b^몯]bhau8FZ J&?c2/kk:Q\ P ((Xuay]X!:aX9#%!bv&c,*BAp%I"WPʦ)AG>SGQ_زP6xs8R^W3uEצ%.xFi0{)1agܚ>83Bp @Q:f4t^e(YLӌB)̥BcYP2^^qCu!<23S4RaL#DNWlZ6b\5*K5`k 76L-%)lx< ;jܓ6-t^s%[1|U{Պ4A߄9gWEF` }fyբQvX7sDܢ0lnD6 Ct]*1n9C3u}?9+R3fkB=RoP\jZuL5R\r~hauY%cI\-y:G_kVίoڹE+?/?/d'O헿/qgW~?7ۯ+_#o?sv ~?X_ˇ0 bZ[KxWJ)b#rNO\ryNZ ι 6߶Q9gBlnc+iZm` UB|%8,#׊î3Is6蕴uR&lc'V4I6zTxD=WBpp9zÀ *svݿtL5xCI)ьfLZI`;[G} gz ޫC'i-_nU)-36 ݈X-Ro8my5|IQy7]z+N=)@ ny+;c5?$鑂/T-V5jqZw[úeQUwuU*ӻhV IDAT亮AbiFc?n_1e}0vTc&oD6n3IkÏ%1(9Jm9t]Pgfx=BGYŽ\Wӗlv|AJ_JwxsyG>7ޣղT_ qzfBS+ks-|uOcub8ٜ8Nx$ؚ+˲Om\$\l̆ eYp^Qr|Uf/]hFS8bYІ{{$%p>Џ(}fEXWa^+Η ָ -0RJW=%F"͜w,R!g䎳hHre傴RWK4_qww~p:*#1:ifDX:K:ެ tpfl\aǛ|{{X,5)hd1)"%R.Tk"ץTe]=>4D9$t}R?)o^,_ cLUuT)<&GpOqr ߨ_?k/>_??o6%l _닂O_Rj=̥ Y{~{z.ԇ`0 nM0#non0 =c4UO8膎.”>}v~ `!֣֌2, ö!U^$Pa˺Gjm1f e7xߋ. s`#š"Upw4ՋjA' )R8%"]AT91Ͱ0ᔐ2h߅wb+fH(厵1Sl ʍ'Ъ8يhGԾ[c9?sϮ&u\lߵ._}>ۆ΂S-j{ϵ!? &wS|=L!B#\ ZH-zȶWT#A뺠Ԍy@FesΙs0b!8l'/nQ'NYD@l]rV.H׳{{`HyS5r+BM)Ywww44<i|Y軲b^V@ Vכ 槥5K|1_:!/xxx岫RYyY`zE6a~95Ix`{a<_}|=Z+2ePJʈJ |F*'͗0`}{CVR˾="CkxxxyY,3=jX2Z1r=}j5/Ày]4{X]ktxK!xsmC{u1/+DH-sϟ]?=91Biu,a1\9O*T2xV*L=F 5JvS_+- 粡Tu^ЦլT=6Xj6ib-~Xf8V [S[z}gk\ !t'zɽSLMec,R[i ]oxt:i-ZZʚlkEh@Ru!ku˱ؾꝝ\浕<:Ŝ\}?ݘS~ ;9E3'wΓL_>ȯpQ[B_ټ1s={~tFR62'zl8M(m-YߟR`E1-X2ʧX ebGMG|%۱QqǮwiNm͟Éߛ<4&4|9s2,HȄ934r2` HEen"ap~c[{q>_Rtb^1 #bqD9kwi nS#j008n1{w?_Z 6> >9RTڋƁ<Qk8v(6P¶N N,"Wh8Va;)z c﹆R3N')%:="f j9 aNz7!p8 ƈG}01)F/ˆ״?OMf27`<U:]uksFwzPʗGƙ54w91 >3x_K1a8al m.j)猸" )g ȹ?V, Ym-JjsVmhlI](|_yX (9#@LOS(N[!A4:1h0ڹ@bvDSѥIeqς:Ok);zX雂>w FElQ%sSʿEwmM"k8-6+Aޙ<=ơGg hRr]r]5Uڹ!9ꍩعmiIH,+/&ѵ|1\0˩o%E{[8/X͡tSn-?Z{yگVOp-7rɗ:}-A>_-O9֋'_Ͼok1+/7|틢w};9?_=-3% ǭ6ok)6ń<0<7V#"0">!BI&aBANh'1FzWhAmĨZf R Rځ{竫*+Cpa3@WcBףHApb'i UsK Vv0,b̪>)"Xby.1D4^ȱMi0/3b-CfЅXfHx8pzn-TTuȉ٥<-4D'F&̍TOYJ ^Rx0 8!xSvl61poJ ]- =J-Zʄ (1-|DCc1#Ez6ua<@Ĩw4Og,eR(#u+m6Tu`&魕05,l7@nXCFoZ-V`m2N#4>z>?% 26EHk9HvOw0\Ժ8sɐZPZV(Z©p\r ]3;Sxg ΢:4ᴧ(_ \"|70ڠ >:=s,yԄ()M:\ 0 4Ni<9A?]j,7zAMww C:|:|:2_Z>M)U 0Өj8"Ѱ@:.3? =unofy%+ZqMc.|SX:]곗XgiXZ{Tq=Υr:p<һ y8!ӊ 3b)b 'BB0CyUȋqU%~N}[!+H3q]1t]uYJ֕*ARDRu nռc y[ Bi6 EeY3 ߓ:~C?ӱS[FDTJ^zٰ0 XT/\ P5 4!U@EU- lAxVZ낔 ]V;zIA𭨛Yk5NIxf[(4fX3kd9ƳAV8 i^dEej̋i~@%j L-(پח؜7N0xa?x&cmx~0,?yeyXg7A}/<G |1%|]_?[kH[>q9zߍ[WW@u J5 bN9a*xmWmm 2B0mitH =]bpaDE:tn$\X%(*%Mq%S2.7|2 i޽˲` ԝ8 h:UT"vu+¼.>hg2 JIT i{]tOQ.܀mIIadSn8i`I8ra=7KZ(\J< Tht[J\2INa !*W2H%}\PN+E${Z)ji&r՛g r,}h]Ar䳤F2F 4AN,EmBϦPFQf5սMoU kd4XǓ 餑hq] ƈi5כ2 z(a} O'F x}PNH40X#߳h i2Rʙpq<5NgmƺeNA%1;,CN IDATpYtΡ9322^{q:.\ ׋NU#H*Jt a{b409#&:] A GіZ(77l#߷'}ߡ{8W^!gq`[Sb*&9)Jze߼B-$ZKE 3g%,T{تgXsFJE$`vczɉM)lBUX{= ~e**#5kȻWLT{6 /{k)'MY]1"3&&*k6ڴ1zF!;64a&_Ec*NvOc, dFjA b]Η3yI─Ij%V9Sz8)5R[U R [{4VI*kϦe XNԫM\HyTF;qΈ1AZ#@"Ź59.,PƧRТCqyVTZ6 &:vMf/CyH:V/m-ҦdWՙŧO0? 2߈ {xmڳAy[,7;|˗Wy*/_ -~ή/ O?+F5)Lϩאa{ӛ~*8AUT$4V"K( -x84 fdby}Pûe~.T 4nݲ\ +@Bb\0᠅FsgGL M+npˢ;". a@ %Ζb<u== {q RFy PvNz(& eH bF7-B\JeQTE"k&UN hQۛtik_Gш8y#6췍 t!u{qX(ܦM';ԕ`OkMnzCvж!ˎoU=,Ă٘z0۲VlM}m,pʦy|U;”`ֽ8kPb簙V0 6 L^Ny:/PE=0V!z?ZaM^P9R-ZCΒAgG4M(HJ?sg٢&6 5AJQ7VCCibL^~Bߜ1|g3W*\({S|'X㊇oS6jAMϏ|^rԟs &{ ͈@{Lwi@zZ F'>bN\Ɓ^0}Jvww"x@.ffI%kkJד-rg18+[EᠹP '#~&Iq]N'<| ,ɥaD^xf oc2@k) k6(Fõ%[g=7Igɼtx<"꺻+X+4GNQ1elB׼H+3UCǽJ5z.t;I5=h4A+m;qkao6PT=YKQ01Ml.<XbªƪrRNH27kSIR= A?sjT썔D?D䤑~né|{eM_ׅ)MBSusm[Ci k D ZnFݬc6!RQRX`cWF4zX76[c֊M(՚"-YS6VpS y4wk2'sͫ;M= %_m$L6ػ 'Gل٘ǟ)%_5?>׿|jnn|jnޏr _‹|~Q~/ [W]ARq)z?(xs+ZW]‡BjZPpk$`Y SW,1#yde=S2r؂kaB.ܔe?FcXy֥-g8kqHB?@>cz"%[-t^!?8RG:v|wO5X^'}.amAҥ\.'6p*AT)X'Vw (b?tv6+^-:ܤd V|8UJp.FֲSv 5̓+*.@`S))ell9QĒs"a-;S v)+%`Ft7NR ʤK-&wS:4vNK7xL'DO#Jf\\RQ"Xi8 Sb0".+ɭ:E9 Xvog\WN!iqE\,)e{,i_Q8R.Dd)[6\Ev?/#OO3V͑+\e# Jasza%;#B{1y0A枕Xg9kCbp'FpL3 0 q5ؗ߳v=5N̜S{~q,k䔾rCg=reqN֘:bDO$ɚyJ5Dehmπ*Aex\N:g+`Yٟ!EӴ|–[g_3ssXf1Bp{w#bڈ|溡@ w>4xYd>L+9ju1\YCcZaYfܢU|AN>tJFk0p(=`߇b;QJlt>>tHଲ劘3%bY?N3ϸ#iRHMZ+"B֨D(liQD(M&X)ӲhSiӗV,f`\5"&{p*.Ij fcP-"|г5Z[܏,A~$Ƴԗj[NN|0OWD~Y:XgPxHxZ]cBZ/޻ 4ę4DPѕVkˡkjoܝJ]zoL(Mpq)c6q EEq $.#w],R7jSBiWM%;):gx޹tT|>^{9c:aX#MH9!g`:V<k+4Ь;"*p>R`IUk*}W<%N i]q:uᶫU-V *5"qyy=ۅqњ tJ ә6.a+Ĭ8N8\XU|ڗ33yzZVPs0 J֬I$Jpi{>aFg{$̞O'_9煟1T.BD6Le:`j\JaI~Ze+\ѥs&BՓ+xO8xz>:ʏ7og$[-VpWsWXUJeBuc?{7oޠ5g.RgmrZ֬U=MmfnQKwQXpA+ŖC~m ,L4ђ:,Kr(sU4K?lf&raqqجә\Pj* aOjm6u;KaF̛P!!2+ߔmMZuvEL D 16c[E^Ln#\K9HDti&.w: uqt~`5qo-hm)g wyz{]4kٵ (渓u ٥f^.HzS,ܼ\.^9'yxC<]?9&9[J}}L5 ~?1>p@9|}K쓋'iڸqy>~iWw+aP;qKƘ˚]g ӲA\,;9E. 0#%!Ռ&u;4D#5=*O`%Cp\W8q0c0.c \[1,d[!\8*KXNgt i]N}>Z 1I̜m܍pcs |aSCtȰNk,F*SЉvd߷=L"yaÏ 8Půila6P}T믞݈MDuKA_wߴoa犯=/1 ,8;ϟmIE @޹GMKBjF㴮j&EMe-,4#I5jS;Bqcn78K-`Zсnn1"Nx׌\~W+Ec,uEIӒYoc)]њxtXk9y%PtkzZҪ⦿^k#W>K>j˱7o0 :qkH!炼ڳ̜Ӄ)~>qڞiA3П'` ٸTUw2fyfeMY+)@Y}VY3]|qދs[s{ n-UVg[nV%b9;Vgqy]QSi!]X,`OŔᜍO̝u5ybwbhW_xbϥؒƫ//aSG3fy>eƲ`m?=ioTmއ gv8~-z@^!%ؿS #"0>`.Ljhvr$ yo$L(0epeqie`Ȉ> L* VkUk!NpJtxIW^y[ӊi0MJ}đ ՟iCG8G88lܿ>Ì!UiEˑYz̞%SxGy=Impfh%@Ƿ&;}fKZ_^3~Eox$0/'ah{iad^?hquj#V["M{-t)pNX?E7]èSygWcy 9ep]T` @+0Km3[˻iVqZQU rd3$ R^8:k[>//.!*w˪J-j]6ڻyG UuJ ?OKKApasp`,jij8 62rk8\\[)gCB{(=D;==7p( adٺ&*: yZj]UuI{gƿ/8Gv)eLz}'hS q%TQuw=uwXJʲs~[+'i%5'O `~?ZhZnGi 7qm1gN326zﵖ ?wxۛ\]]!~f! aQk|IV}oV0* ?K4GXk¼,0vZeɇg~k +3鮙R,vDx:cnr1 fCq[v(ZX [=B ij!9pAՎ^ G9wޯDr{K7Fcg568 Kƺ9rYe|%R2T'ȃJq,vj36/2!O6{q'`s5ogS?x^w_/{oW?x9+. +_cX>}o_@9~4axE9"Gi@'7cP#8'M O~SDu8{5ȰCaDp*&xs@:H=vCi]QjC0(r^2^3f7 \*y>ju>k"" kQF!Znoy0?ѻ-{;hbF=p#8[T+Ob(SkV-SL4pNE}IaL6X.:td[GLl8T%v>*myo bJ_m(BJjNo3z,+%gyLC'䌢j%kkhZL$z5V29nə#̀m&7Ԅ6$R 3.8ʒhI ũ% :"B].!nfc*f 1kp`i;Ǒ ޲##B pq3 Ur~tUtmΰְ/Ng*y\OgQҌ[6 -^ `^ 7y4T]F@d3B0€ZF JiC@4Tp״+ҍUbc= P[5/< Q{k%vGh,M1x|A1 q=* H& y4!j]VB3'p3 IDATSŴ#R煵 Mc˲ Ղ\+JNVsW)J\!!)qa R}Be]0UKFNq`D ѫTcF`}08D?<.1GƁ5t;j "/X{*e<m5Rtvgu[1p2 Vu 0b-dd\MIֹ8[ñԺH-RURWD*FBj|Zņr^c^ mܗj\1SȜ v@ͯs_iA~ -+χx]De h?B#C}}^o7g_Zin7 E_[W^F2 S884e,J5S^ZԎH)JR;UnY*t *P]D;iMFZ^uAeUBAn{Sn"dzbmFT54eWktەns1GٷF;:a3 ƃ?1zi}۶XgT)`/vbgߗF(4`!L1VyR8i}FE?;g8wu*t"ކ{&Xh5o|m~J;m ˺ jM9Q՟1v#N )gG8׉~7w9ꡑ6fcqZ_5sx`&+g*Й!1pi`8gܫUi&%vFuEt",9Sf+M|&pZVNk,aTŞT6`ZlӉuA9yQZż,T3xLjm 3Jvu;.JJ$ή+eFmW{!N~rmӌJޠEOm w!0uN%z}Dcm103N3rvq"{!i]UVфQ.ihG= @WgQm#J.}c]He(MͽNƇZ8Elr;Qf&̫Z#%jAanC Im.~3k:t1}+U1A1r0%^HmbyQ )CIFߟ ̠VMse9瘵QRtΡtA>ڟ߫> ҆Jo]rpVu.kE)),sZZ[my]!U3Pd9tN^l36F")\P˔v 2<.vbƘhfs3n"2:cٳѫWj %-5JsѰyFNل`-< c@lmXьG 8{\.0^=a)cvZ_n.heF)Im# .[4f6 Hus[N8"ƁZ5"y0v@v;Lҧ'T+tp"tؾy1yƃunhnˌ@"2c9L4*02{aaCBTzn[8x[XTxh; i1ZE",5fT{kizrÑU Ӊ*-tbU¦cCCA7tc61<ϸǺ,K(U+ %wZ輇1xs,[Z cDNfEDQ}ip||e̓cRM튭5x.j?|:Yv0@~L..ux({Zkugv0#R"6K4ZX}pP^~9wJàL*_z=\=y*iK<}58i6V8ܪ78\LY"quu0B9fkC6#yucD낔20`9MIqZ&9p%N+I8 SZam! 8 ~zŌvT"{yl,9Zk1/ hRsm$ cw8!̱'u[賿(s 1VqkāDuOzOѫ22wua%:LJ#D>pw+U.j{9]T&%b|t~W)Rk4$)g֌*c3048 41b)- Z1hbm5"RzNMPL\Q 2U2V'Gi6ŠI9vr<0u~?=?1]Zw{ޘڗbtƫo^ȏ^4 G"vK廀CເykGv-ŰЂIb!ʹj?Ϥa~8BJAI4TIXqm1R3RZ p0зz@Cw/kZxCi|7_|x2-ׂo~G^ Gxk/y;_ٺ5:`]\ d(;ꍯ1-=ҙ7&s{;a8iмhB2f; 2!pχhM>4ϔCaK)x0 p]j<0:T ;4[Fh p_p0t!X=~b5{[~;զyn/ Ufgr-H(jq6: Z8ryUsHfqp{b:z ~b4‡8,ab6CP : 7 Q][!%Gú&<:Tb04mhnLcڝ ~aמV{nCXU *ժUZ ؠu5_Qc z`C\( }Sgbrɨ@ 6u|) h f4)5\n% ĉei"5 ejT0#p60/)Ƹr<FGuFNDq“'W8aYPR޾[B"# `AqƓ'Wx)J΄Dk&YSsyE~=G 2g~wvBvv:\n SYsZ?gzāGR[^Dތ'HkG4*yUH~ iA)\"[ON3sc 3zΫC mz)t|LqvX*bMr^WK \?8GJZ*H<^j=DXe` 6u/|.+` Kn7΢Bb8u>0Nsp8l.RV)t񐻂,ww[f2DXʊw qfY#Bմ~e[v5v\uQTes֣UkRn0nGgXc7*v{~wb`"sjM%볚jf-` D (e.̧buhDwBjs+e4a)YBX1ilP <.aO&W eAւ >`ܛ!΄0)g PK}~88(g1lS{Xg5!,Kni}|lwXs?y7K.?oj|non!n>y|aO>qV/~~cx?z!?K'G'8oo~Sv _+ó%߀d+ĶJkx?+_c㛼d/p #NHʕpGoѬ;s)`I=&8G-jbSFmtb7ZwReY&`P1'Lq0L Ⰳ D08`4E ӀŁ٘Z7E{!ߵƇ:/CU \wT8,a J+ 85 qoHkMe!XHb'ErĤ{g,i`(%'X#hnQi;%h\sfHgrg hft4rЇoWDִJ"jV YYN|:AYpw$ٲoLl !s͉dZ|H(ja53V+EuYKR=I}UIhXx!W_#FiQC|?.nThݪv0$)c# {#0Y* `NXz-{~ \ ܼ9ܰ =*2{4Džh pC47`m~I >D{8[Zef82S &;LJFZcО3 ZRz'.CcA73qB r!)+[.s\6KA)'4L]imÐ<*bI].%WSvnxM%O)Z (ӼݫO헟]ן7_n 2|O_<'7wA?A/GoB>P;?l1oe_}7G 87\%.V>?r<_kv%|Fq^frnqD0R*3g{QH }xc M#aC |β&Q VTE,V`' FC8PV8g87g *eƌbkUq w@w^sR/>BbY>5D!F Ua K-ܼ00*U:9F>z@:fbT)FsVU)wFd[TZBLDJޭ3Fzp=0tKfYB%-%~ԇ iӊZ1kKEɉ6,C[bWZ:U?OwZ^SJXszH02M=\ ð]oV4EV=8Ew20̧A!LQömnM~^Hu0m,3Z\]\Ҋ 0V]Lu/B5K.zb@r>c^fh,?ޥP77o`"D*!Ly` ع !)"h^_5a1u:X3М3!Tf'y vZ^&d]qZ{*8N$KS;"-i~P ՞aґlJř827&T`-n߼ Hs~;ϳ:DJKi>=N|~| o^&,eqww Ϝ|Q[*zڕsJHi4AP)\;>3y;f@Pw<8vrrg8CP0 ;k"#=KU/P`Nob4M«|isy:~N/Ok^ڌGHr!|U~o#|Ge|jW[|0z;_KƄ0edܡM!zږj̷eyw92XҌe]h)OXؙ CY*#*%Y IDAT>#5x8/(7x}=bf\pn'3BG*Y˳ռqĄ! N#Ւ{@ݒnw! ZMZZ5Z!ha>ƠJ(m0Yܚå{qA>p|? =HxXWJ&T5Kɤ6a>Q-(Q!L˸1b-7^3%<YuBB UA:޼$SC4xi0+#^MhQRA=U i%&tPh$E9Y=~vdtYe; }گuݪr[1$g_{ְx05%>*6f%poA~F,YapZ]"$Zbmz y8XmM kC-CZЪT\]=w̔0-s]I8^Dn֥JFk:'e٢UjvjâՌ41JAs5H >!10j8( 9#~4!Huݔ5%XqQ\˂T `Y+Rn[m8-qyU+ WO.}*nvj<.@VEτxix.D杇H |_EЫ{-no-->8o+rr B#U*KyW*ʞQץ= +eGʫOή× k7,X^cZ_OiiSF!:47*ٸYB\|#s:4%9[si"~>a5aXaj?P0\u\4?_`Y! k٥YA]2UTJg1c@u\J\(Z4|g9ej^)܍)V`"m\_;>V ktpY viqxW}8rsw婝[yQ-/kҵ|' xWuo׿||;}9O >xw~ o[W_}^eL{,iA5OG_-%RCdCDJ{;LqҲgb ӭ a´xs5f&=t֑V9W]`(n*4? zVinF*AN6x-K6X40mGU`> 8"!HCjX+~{>4U!J&\~r AEV!35VE<"(j9ګsjKPg 8Zm˕[/ti?;|>mnR4B`nCu,e{XU~n !bۈ2Gvo%X)bbɅ@{%+N F-ZWP5)5Z1-Ka1v@< I:yբGuO `F&e~8XXE|hJOiu}{lL5n>}u7[nP{tϵ C#IM̲ ׂ8XJacFx-r.y4RFm ˺eB-nn1 v˼bfpii yIh`_'0Nk08Lvxnb!y^;μf{ SZŒ~J,9vmKy \mpPjZPPq:**?F*KfWh GZS¼~͌&JC@:d)A;4mZAK0!1[j0R^ kkqº>&AKækr1vgrN5)VڸV!s`M: -ZbĒmwVf][1edti`!k@WqTXU&0*]eHkz3X x& cX 1 ӈu>T~Pc6{~.\CD3`!ڈe1aSV2@)z pg83̛c&FޓD P+uts]jgo)V+5q̉!j-P]"gH J1LĶdr9[C8? :(gqm'>]Fج" Ŵ1>S{r+xzuȲvƓ7s+ϯ //2?#>^эu7_3א?Կq^?wAv 9yo.0Sq]^~Ez\墡"JZq&c7wCP nBh7ȥ si(Yqh̍5ݸGjĔ,vXp9z+]2 ;aDnu?Q\Zl 0 0cEEŚ " ,ӈyY1 UPRC`\amlqQWpiUjxSQ$CfH{`uNkMB-ͦXkMU+*ᑤlBZ9h!U=?)Bb^)RPM?4ʞ7o< ءV+*,v"툵VEG|zT+ig̨<9t0s`!>R8[X NG9uhp౶ 8rq!`*Nߎ}ِ&J&LYB8k^7[(K-pA堲,\zrna0NJIq$u?b+hUVj=~_%?}!SsT<»_s󜰤uYr٫,wvmcg=BQVJXo˞W*!WMo"n@13j$؀P@k\Rݯ}O"hV{4XLٺ8Nh ÎFfy+;k2ӧj]6$v\֕WږK5g;̣Blnv$qa8~VK!p)bAN+q@CWvO+%c]l jUျcgg,[#9q!mb;x발M']Tuh%z~lp<]5&Xs0x:p85wWЊd|!{qy,Ӵ@ jp.b셝€ˋ-Lb)f4p^cLJH{${̿su XyϮy i0pzOgp+ieeeYH7XMZ3#l*,z5/ɴLYbaMCΨъs}b1Ix5z>sӅu/5iMF򻷟OOݧ 2`=|( -OӼ>soYfuuUf`OZE%lA!D ƚ "3fNʁXL Il23##3n={ukP r! 2"}Z}x|#^58>knk{/޸?,t5ߦTd''SG~ﶏX.qn|·6-+WK&֦sU?ɟ#1 ns-RXҊKcsyyYt' 59nė- 9\ d mysb qBvX* 87{ ִΦI2 $Z%䵡Y60MLaF[EX"9QNpY89h5#350\p=2Ō%Ǣ% `^ b\дBo߲LUUZ1W6YIuEs h:5ͻ%:+qcUݔ`! *oQs`W=Kl:@T21V/Y5gZp5oЅ7Tn0j XvF3'p5cN[ Wd8w `lJA #ʝqADYF7wxǒ" q7?c̸Sʨdw7@+wϞI[a(/6L 6%i嫯R8NaKmJ#*F=p(;9'\'F)`WJўW$Kgp݃V#m] k JJ,l{ RwY4s֒VSA ) ͂KfZZy,#4e9U]@3> ZQ+Y~~N,`m0T W6\2Pv׀Z3U82\}q=uE? c0/P@ZY ce, yKMF+輇%U.KAO. Ya4l%CFɶZ[kZI9f&˖\Yͯ/|P^D9+㭽_Wk ~>jb|# ) G/>%t}n |wgL3\9M#FPsϦw}`,>J)1,z4>;ĔakAȠ #7pY"R5e%eUԘ+|D+:` >1noo4KTQ켵`uV,T\ !QR܄«TR#UvVmc2{&t ҙ[t*KК2Z#ˏ XzrjGRc(U12qt62y6u&>J76am,%OkyaCq'cW}:0RJn.Z#Ud'j4쮔Us bȒB{/U&H=L ]N Fc;Gv86S;|ט!/ЏSM={>q{}]/&.}vKGX5}YKc/B 3_o'fG>%mowYE;[Ͼo3P0s.ZLkd%\RsFkLFidtJ?`Y䜱U(h qs:uXcu^$W",jwoڌ"߽AKSOqqwXk?)T.,hϙ aMb:`aG,Bz.M*(b(2ҚиjvHFs1{s^ *aF >˓Zc5@`{T /8Ԛ+HmkvpH~zp#Cj2ذ_πaI]mܤSxV tq74RemZCkyDڰv9"y^B )F9Ėo\[p Yƶہ<;{/Ͽ5/Zdb *Mz1ҳ)M\hnpRN%39tp> b>ԗ4-|%GTRyj_Pj7 { |3x<&,u( "y竀0r0z}YWĘT &-e$݀$cWռAj|+JȄd88EX zXc:muz hJhX5K`JV驣7#D+ ʊ)AKujSe(<6IT*ʵ |ͪ()} x?ʘƀ xK[&=z7Σ1IIMd 1'<==Xݡ밬 08N'X#+qrB"(Z@EC:e, I `/pu[&c q:;ipȵhnRM|k Bp:tHLY%ˀ*)8Y<y댤q!xQk*T)u(Y3fGc 9o-Ϛq.ET,+8D(-ްYh6nWkm^o&mwsv T,`?t ()vR. 5RPS[g<_5b2#-Yq^ި̰ QdUNUgQG II}R . ~97a"j^BHz8Lcj-5 i pz8dˁ{8s_Eɖt9P͋?0돿%1>ի+ ?WG>S'wzx7EO~C4 B1cPDvKnH)"*WRhPc/~9.3ueA?, CxaDJOž- '(Ӈi3 Γ>pqXt:uރ8N臃(H IlFg \д`Y0Y URVh0V;*7guIobpUBj| ImF*uyд;2 ZPYti0,*F47 8ϱd e7ٴboiQhX훪Tl B'C)]LdlbUe=6(w IDAT\i;lBd,zF9a RR@ij1>Z»; +ςaꢊ O\Y,5`YH_ ]u묒]VUS0 BN > y ˲n*uUI8"*2 R\Fj%j8?= ة)ٸB+VĞrû뚰&ő $P#Jz0 {w]Z뺪B(FUN(04y$;Uݡm[VE7uaI[7d*1ʰj$+lTAֺ V0䠻 nBqa{X|~kae1gಬ$SreTfE?]養/5&uE?iq:ԶE;67/_aGO';5dU2=*8Z|zki,/Wu@l0rV(8J50s.ζ |8ݜp^P.eTdi pΠCt$Yu]HpN8QSVd1(iR6U^ ::#F,˂.!Ƅ29#5f(z/K0f#C]X:kA 1a^WdKSl!8u1 +J:o7T>URa9L!,2;JDj+ 1Yg,^W'$j!4ls,9tpnO g _>S>f\ϟ 9B43\V{?OTj6lnpe m\_~;T@<{'NW^^_??|g }[·~oM ><{~o*5fO)՚R/$D[Eˍ^c]50np}Tx:?aĂ[&^s\XWـHf 'Ld+Gm }a)G+H) AYjzTNv>`& k<\D6R#`$ȠGJ]/[k:X/Ayt(:w$wLWT׭7cL!69yT7;D(Z̜r81=*j}C\m9lA;=M1 b 󦔰fo 9f}̺ђbt׈,b^=0C.iW I6gg2lB՚E~@33)srr}fCEWr@.PwHiƊuY`al nd%Zp:"J#^hђ,Drq9%X%n8Q3)E*Yh+=0$ Q4鍢1Xe˭@B/y\ZRÄf*>2F]B" CVK މ:rB Ni:w\c|L@>b\zuk jNSgtj5VgU@a`^VkӁ!"r> }s}t)%&F7!&ɳݝn1#5\3@]Wf- +(ܤrw~~/oqL1:+5(>H9(o5E,q<ϸ<BpOX*Kc1qX[A\WF ReQ&*c~ݾ,Ыsh#Y6LbG~H;WE؊%/I]j7` 0G2&dkd0LY\+Z0f q[PsզqEOonkߕ!0uje-z='#2nkC[89IIJ,B=%+ q]C?k)24Tlm uA+zf^eijnbZ##l &m,e'Ӄ|p [f}(d4]rںf,|]g5Z.τhgj̣_FkYkuG{ϯ^|}O?}ISDV>e߲Gj:Ւj φ%z4Zc^vҸ8n?g{R)9 aWnp}_ܟcŇ{%베o,L n@_YFQfTja,;0,x ̣IX=FMt+Q9W5̠rs L'(9[ w]2[xӴV6Y $-òBrm07K/V x,ذZ[]V-/=FM X㊡dP3`e` `Y;IC_̤"%ra?,|:M?-WkzcmDR^|+))f^H\k[MfǴጁWk) \d  fᵴZtlJmR]kr#AґV_;&(ٙȤtVcBCL1|>c\Q!ӛw(O]8NGAǗ gcz8"\!yw La]V%{1XeQY+jLaT&9 q%8za,j+aIѨl̈Ylv])>k@ ^U $VRP[3CcHdZ "Q@JQRe^ˀ*:uǚ"RJbAڠz)5T:#R :UeA.Y_nѕ93HeC'~Kfx<p7|]zYDz`0NZj.nϘ)ãV91ak7(hMwarB?H=r.ߧqpsCVh& Ð.Y/Wt 8TaG(ԣܤJ ƶ><*7t*{,EYBBhBHeԓΡ^굵 GB9XHniU-l,$ 0&fKGj\D840ڮeZvZyj?*^N?оzͥ:e4(e[TypaYZgQ3d: [+EioG ȟd9r>X'n'`+X83ֽl2f[[L`ZvxXW<ϯ>M] kBm['B/t^^_7"Ma?{߬ҏ7Al`7wN!|mNΟcx驻q.x7 Ɛ1LCߛZ3DžNGܿ~Mr {>g`VLJ#> _}zżHHnDvVdnb eKh w 8x{p"- J{dVkBL@ ~zYWr[)Nix1 􄑨Ob XUIU8rbNjVzSجHi=A-eH9)]Q'aSmHTiJ/ز!7j!)aȡz;G%C 劔,PJCL %Wx_ حza0 cr&͒Zj^k2;y 0')l|Z yYuͻ6Fyl YU@CAٮvXkRܝsNaխ~$ .}].߳C|yBuhh( Z eI^")J(&2yޖ͑<2K?[˲(7)fXLoqjTaU(NYa4{=!4.1 d4w9FXYX2Cڡ]#+58qt&@1kD˚a2NrּWm{M#Fr+p֋%8WT@TVְ+~Ժ <6yd.rM !` KFp>A+]2 S 'ZKWXcL9"keȏc4/Dίcf9ZŜ%эXpnO/1N/7oW^>*ooB>K?sk/Kڊ_.k-Q!6 Fy8MG<׻]bC8)fE/{>^~%%萇#9c>.5axHiK~+X ͂U%+ f5dgt)XFUV.0jC%ޟKRk#n%E{ؤYbSR/sV@C-_| cVg{ͬ%apJNJEߓ;!$*7bTC:g-6ل+o |Ew8`]0k8AmB@J,nnn` V-4U 97X{uoZֵʐ}^{@A*68UvH$oc+* ^.M_Ԋ`$0B®0/=f'@ 0 .hJP|"}sXZ8kPF)b:X#MDgUJA+N3yppxQr%g<8 #G>ElK\Y,`۸8 EB;~WfnnnfMB~drE ˲jw6q]q nlUEok;Prj0! dphtsx8[+%M߀d}!tF!D>P)8hJT\%c8) 9U]pA4ToJfab Z+k5tf)%dz2 )fĖ`aE[aMSdbcQΔVѪ\{:`!=yj ٟȪѪ0%^JZV|-k'[g>QY"ȰdUivV\rnwv;Tcy>:Ę&jZ87H?,,r 0[`ӢSWvދ e'.b0 D.WU;s҂0)}G yr͞~r/yzs<1]+__^rɶsSy=~爿|&D/h>=mC4|| |Lm;Co8 oB>n??g<\a^ a0Ԍ%ךrkԘi:NrF=C0njÒ+|pxsZ? /L7h.[JLn#O; g--q#`u+F")G[ C{F6!0'kQu}@78Kp{sx }]xdHJc=`lh`.Iq'CKE%"MvXުm7]"2@mqb]n #[Gg㶍d}t L#\-rpmi]yȝr t,1%+X chXPIוB%9$1Q[La)늴J=z8Ǻ 2%sU@* 0D}Ե\23+QU{Z%Btj_`) ڧ\7~!Xd9j ZcESx 09za40Àk`/g,fpL&b6@:Uןء]uo1,s_ghpGl g|~ǿ+Jw?cwN!|K|Bo?Z><\q sC[qas!"čs7n\J{ F.9W<ĄzŗIJ_FQM,`1(#Jr_4spI`zܜn$[;y8c0FK\+2nǃ q ΍={.K8JߓN@;, oEԭ}Xzo0z;~ŊGA5f*Z+P,7{B2 sDZź@llOuUkFr(ƀA b?- 0!y~*7Q0`4ߊtkA[X"*9r d)M,: bYYp:\0iY0֥,[Yr"9={rEpb" 1E[-.K: ;uYU6t!3qH_`=۫+ _#t^-:+,XUcrGW E&\q^.! xK@wX8ȡP`,,Cuȟ-Q(XkhS%VRpV,u:`"ThTJ%$5d| 肼_ Ri5.xFx{chERc GR1^`I^[nft=Yxrlp#­`Owxw RrBtӯlaS&rˇ} ~kwZ·kkOƧxKǾ{bGgmZc)f9t'oNnC yW+q=xVsJ ;pFl\g_S*曬bQ~@C7PtgA> S2* `*lw3aB? (9aVF!@G1"7)y br1We0K6-I2k %V[+@(R44-5()Y>mw:PkM2bmYhRD!QY27&K8fR7/b]aRaDp@Y3BIoZrBm}MܢgEK4k-A@J"zVwqd)1 GnzHE:5)B֠{ˊyMj[3qP33g[9z`bBIÅM =ZE1@CBp8Kƚ#ˊ|%* >d@-aLy U$ZvK9:F 4>`#\9[M!E+ƄR2:%z4-V2>klUe"$&x劔f\5 JzCU- QbVs` |bԩ&~-qqkjA ;azp낗\10:ZC ְƑW#N#y-6h-0`Y803`<#.+27eRT7$M` B/U dqav1M#gc}yzlЪ(t}/4nIGkT+H^( >j?_. ˲-I-irmguuZ"!`J&:u\uI "31W|Mjo &k2k4!~Qr[UgQf `s,7c l\o. {ogЧY*p\]Eվ9B䜰},2V%ju{1WQ"! xF]ԁeYdج D 2rtj{/{0 Lw:!4f„p+t&c=GwRl&QK9 9]G}4]{7 x7zO^[\ωI̜Rk+[mܨx{XSF(Q ! | g*.Y-)݀2ݠ bτPl/jZSjkGQn:$bz'vHeeX)']]Jܔ-r鉛u(F}D{#lk `8AZ\be\z9t&E!&։f`Ce$5!V` "ݖ6ҮDnh]^xhY9pOӄ #TY)U KZ wf5bJV[J)H,?&RJB'brΡ%!IJ~c ѓRl=gxÈ2 |H **cdDD<Ϩ:%hUlIP UBZ9+1ZbJh8X5sNużVMțJx+AUIǫsN>',j@[V tfbu& P;$ִ"a!$"*b!5(dc4X:ԜD7;:JKjZ;, ̯ߤ"B^˺wb\㊎f/bQ$)^rƼH^s fNl`(t)%peY8+V1/\7.﫸ZgJ?k^w%O>ޛYjӔ6jjK4B\$Pa`3˒=Cj $z̄BL-p kVrFj5f!x_ wt,lee6j1־;.ܾ c1.5>`J?]q~,?SY3{hgo7?~Ć~eO /e_?~5v1޽XJNދ1ghMeFNbJ )`BQq1y+XbIoޠ\p|QjFJn+nsž>GxS}N̍0j6cF 8pkET 썁ӈi586$!'0!8E܌ Qi gGYfX)J["pCX #'b'/X"ӄq/v>=o,Vz~Zc H0G!%qnqV -'Eo,ԍN`9_১WR,j9t{:J gvq<)#uRZ).Z&ʗ{' ?!Up[q13'Ş2#7 dG؅[}1gږ'ժ?3t^w^:W_wMsgCĠւmUeRºu0_,}ۀNE۶bL{Z,;LHmo(X3\me@Oȵ0x0k3Kx Ѫ4}8uFE5idFmg/2t6A6$.s,ܮȾszp]LI ~ؾICHo=߮gu_+5(W3  y}jײ&{|SŏjYwj69k=×0̀r>15xA}|l[_&pa=4aM>tA>Cmc4Ctw :ujvLJ_L[Cm}EnEvqʩwOu9Xn ÒbD.$Hϭz|xe5| Opds 9%YnWi?iPh`ы(m()!ꋰ֊/~.,du) :b\Ŷ_s*1 zhළCQr,ZY g<6ZD1ZClGkZ I1 109cJAA;6r.P.<zBǠye\Z ˱q#id6+- 3ڀR|J BJz ґu# cRDܦ:`Xn*Jط!k҄%^:`Ћ6M[{=Bx<\3s^50ů Q&oR=4 VFj0W:0OwCGvU'hUN >j| YM!Q5nHv9ƥ6^5ܓk,CX,H"n Qjz.:˜Aqz*|d,Zo ׊Q 9bYE'CJV0%9Ϙ+m3!:1^%b&t&24A$V-Wܮ7~1-7b"KdV7˲>NzJB* xƭۆ>debY 3/tZ_:g#|ض1 b?qo WtXX댏ɍx ;Fi ۇag4;ȳYK? ^¯;;۶Ǔe &8& YEU@`1zEVy0lv[I DidZnO0_X<#<Èn â(i5mj 9G0H}_uז 42_ _8s[)ʛ)F\FB4Mpx8` }(|Pֳa a4Ap HBgcΔXipMkFLB'aPt8!pk-([k|hB8A<=3O%էg-%N1E5&Zx4!Q08UÏ{c~58hWC P"펲g6RljZk0؜SaxLS#-Hzi'yĊ9Is$N,ᜅswAskֳ(yG 1i>ɍ(gqՂ%n۹p6Zg̽>rb6@͈ \5fx֪ 'Z:]UjMU\/'L/x>t{// RDU =Kmr,pPy c ,-*6۠+kfq炜 OW`zlG0V3܈h& 41l(3VjRR4Z`wVJ3zZ|ވұ Qufw@@PZWѦyb1n-8< b"a{w=Vq13 nǤ[% ùiPD7dƽeyRY<.x3R!5Rؤ 10`JC3 `J1;b譟*0+u)QLi”fJ@$g#TAMhBO 3> 0:PZCQC:mh VU8k$צCr9ۙ8eyx"; T* 'Lk`60ihk=+Hev+fP Ƕ!&sKelΤQD:J-șGA_q"Ɯax @.%,˃l!D%6`Y䜩 u^y&%]H&+mg! $[+%빱4-1l2aZ ߪ16AqCLo/?v[~}}j&hRM7fH{gB m͐g۾r@JE f(kG#Ck#4!31M3.ӄ/=5P4-KGO11WJF^w<^&'5g1jfpEs&DCd`Ya+.%ya>XOJTa  gziƺ~qJ'{X۲b/*{! NP) e0(8mƩL{Gp Cp;0RN9I@=ǍS6΁p]%D"QhE!3X Hcm-A))yϼ_kG\72qnMELۺ*}r@QXTZwxzzºr"]ɘ<"{1J=bY1> `'&lǧ џosv?oD iX1<Ȧ6&}]g"R e~v:e&^SOzt\7+>_/ Sv!UHxяJB+4Ҍ0҇c:*$kT/[s_,w9:O* OR33BPj ͩ4}{g̈qg: 4r1`g}g48pcXׅZLCK$3=2Bd=`a\D9(v.!M>L7<ŀ#f m(s#\I!>PIS!U $B6XGU#~2HqeƠ|J~;JT>3n+^>|Pk4El*"b~]~;mr2`=`jt1ȥؐz Ҟ+Z%ꃛZٹmPY]Y6XraawdSFߑ;!n0-PQJE{ΰJ>:׹']ڙ{LRrV@u2R3Na?Hbv~(fqlx$$5j Azrvq1xug;gx/ -0! BJs 8 ɡ3ƶ`,#cjm_cLvt4L柅'!\u7lNȷ+ IDATtX;cL{a0> ֢5w^oXCD 7[.x^ϗ :9ci;ašKZF.4`}` Y{/𭢣c2vx ֓`n.6@H ˺Fp m9\ְla;z}Vh@ƛ7!4 x,F@kP{AVwoYZ=0ޟK6K4Skp'˲x&Q5phLӗ3 Jd=,xK6;R: Tr!0 F@@m"]Q4Be?EZq}a_+Z-#ފJz?d 8覃m[s uڳw֑jYXBR+~d$3RZ~ToC5ce:v-(( c|7Ooi-fZQrøPqf3BM6pmc]BhB}ٰmj1MhPj0R?]ϫ}`/H)5㏟uv|aÁߑ4D+7 pS*s ˬnwDڤڰwxGWDx6+vA 2# 9?޹/b862: CYNnkԌP+` }i G#`E\-Ak:02{7!lI\ K֋?`/w>jq?]קkreL%:ɱQ7x n̸1s^W] |:a0wߢ|{H_{E6$%g](_4_Ԃ~c_PrfU1*f7a35g w' 1Ye}o&oQK9 mG6OV1.JBX`޹S /R 3 %ybp7IGZqNX4iWaR1lԎJ_Z`PHlZqrDrTʡ?F0,CWA ;8Ft{mFF,,eI93!B̠'T@nh%Wf >^_(G=] BҤs~IkDou(ГNi¾g|xyuYQq :p-JhZ)4B^+sǦW1]ӝ1#chaRk nOOu0LIhjTtIAҡ)Fqܱ. ۺaSPRRXt~{CP 򥔳`:m]Q[c]a[×?bAk&Q܊}(xPn T%zW:Kq#<%!hxcP 1t`Xt!׌. .P+7`)N*c^Z32"x ZqM_oh0mF5)L{Ũ- ctz@,hcE-ZH'\qB/!yu_EyeJ"06z$+/٨$x>XJRo>\ Vz6y͹%jb<₧ SDsp;sl(K ՝ü1ᥔ<mú3F6=*8X΍q9M1T>Z Pz?~5dVM=}Mcڬ8&6"4IrX3=1:Xg9Y_d2aGU*TMXDk(56h!uJa @wUF+Z:Djf a9<zǀ1Dnaw."h: >l#&\R<5jc=T1۾"4%͓+8.綾a٨Аc0Xg6zJ&?>4ߺp7l?_Ǘ7zK?]\קkrkh00vSL;ޖ_HRJJ< q uGJIwԋRqzuBF$r!%b[7QV=ƈ4!'M V#\ÜflxWt1hQ;J" 8`t}x!=h?K۷o N 9KPL唋ZǍP I)YXQrŶmhz{4ԁ<,D}tD#I[U{lrܤG@;Kϡz1WP% =vzd@ ,\,6ZC{  育s=rǐNNbfoO!ݲ왛,CEGZJ{,]%;97 mEceע_u/(9AКC)qD t%|."9C I5@:-ܔ͉18K|/^!ͭzH* .x~z^ӄ@^w}߲o"9. `1UMl1"al#FRnF9_~-}ks0)Fu7+"3z+R;몛@ H(aєnIh5S"pJtЫL`삇ՁDh|f+k*m9C=Mi˽S^lXz.x%631%bGt1q)q#C 8ϿBs^.]{vdX0swo}0%Qb"1P ___!y ֍2碑9l{cAt3C9$Xmr_Yd`D* > zJ.m[cP1Ȩ2ϴԚ1jٿm̯뭣/e.) }GsbŶh"k 5)TF 80&!0a6+V*c @z.sf87PZE x1kD{pw\ "xS=KϿbʾUҟK6E)FUV$y&ԵÀ6 [g~|.!k yB_Vިd;Wmcs R+nMsy >lAe `>oKO/!\־ֆ1M}S?76GGyd8<_d 3d0 ض innvBJ Q$eCͣeZ> g)ͺ| n|b rYڎ nΗDFVap> rxtmTSZh. i>Xmj91G^p6 gbĺ, ax*Ce/0N 1%L`I+c77b5مC);CĐp^),5X)N/w ZQU} j| NxDŖ!]tCe4¨Jr֢T a Xv2 5ȣ~1`gYO)ܺ]oh 1QyW>(zOJxNM~ܖ 1Ѭ4JzW/wRZk@nA0CTvq D[5_7d:l3`>o~SZJy󍷮jVO0"paMC )MW|xYwT첣d;". qB 7 $CG^;TH05]1 9+z0#-fBml,J 08ň'kbBnӔ0bDg{h#x˽>h@DCCTZiu˗&l*uE4%N\;tC@ Ѕ >x'Ξ[1W5[ (U 6Fo#z"F2t흊8$9ʔi[VLqfā~Z oLL2 Flz,.G _6 #8{-k^+` Jec{B=t;*D?\H;c[7!*us8 78`ӜpnM/L?nY󩌡g1c0Mle ,W` !$|o C>3 FZ JpA9֑ĢV靽5Ѱn+ LGʩ)c~~~̓9e {W͛7@i0u" q˺Vze^%]}h5 g=4˶0 "ca| R);%Ο4qU[ESPZ;nĊ>f*Z 9TUZPTLn:2\0ơԂia4Mx<5ׁo}f_=0YmPJ\^8} LOLkm ?84A }]aHf1gWG}ۢ&9=cv#GS*"x\z}zR)?7"ط@!g,ˢ߫gkǺCzGpa`-\EL&wLirhBtۺIq`ʶmJLY&U, P6 hCK{Lֻl: 终Yd!r֊mp^xk㘦G 22NP9i7*NRUv ZSZ{WPtKh< F/T:0|lkJه*mGZ`Cx ZàE -zkRt7Ht+_yW~M5[\G}3iMf#V#abq/طeCE1@F%D3@aFGi c1GW,+G[8t1dh4_[@J3h43,IsR.Yx{8OR#!r;(401`J39QHm ̵ZJd-nJICtZ[g>60 |gz@lF76$Zca`q\` Ϧ_=!,Է}F̓Ctpy<8eg?pI IDATg>wzB{O㴺=< u_=,x,%){H{i;mŶxg֯}0ۆ`R34zTnm_U3upPvx;Au,A@Q:;΀xFmh PhI4r)! XHjCG 0A䚋T Zcs붣nl}'4 )TObN@[|0FV1p7kĎg­&"lB$nR;'A;d 8ܐ18D gjCHF?t)25 2Hf7W H567},_}\¯{_^\/VVZ˗fc̷/p˗_nwfLS2VeaCQ zG42fW8*Z&BdV6 bxWn_9S.;z#EzcR&<}"-P;Jݮ'RRZ `,+sJ匱N) B<%Ha~!K528k"i3zG_~XUJVx{MeqJz4~PMdYk(|h{E֦7 I }>:u;7Pq6qKA0}ruQxI=7t{ilͬҔnˆ[2~T4O=0Oz#c[Bő#peXtcVܮẈuwr%8*;n'|ra.ߣԂz2eF AB榶H+ d\gnjKhcwi#Ĥvn(Jl9pKwlߡF lpdv b<)BxFdau2 s:Hj`R{x@S:j9sFpH}O;!XKy'v7 \8u8U%#[VJ <ɜ3i²g @| Yc93ծÇl@k$R\>O*|/HTftauPBa[QDƐ1\a.7)Lo`!]7M׼B6``co}Çkr?͛A `cwN}yqyTleGg:HoR'X0a<|LX /p`").;uyЏ:Vq\QJx*1tt0|`CDTGӦZˍ\V0Yh`|Ķba3`A+2CE~9 0g<:>[G, #U9ZC8ky`Vq'pc 9CC聎Q;nj/{oj۾w=c>/M 6,D0ؓ@6zeimX='QL(BIT{^{9ׯ;ƾ} R99|.{E{LudVJauH/`ZMQZmG#هQ++Dmyz2Laa1F[*r>f>k~e#UkWJ[XZ̟bz>`ϓ?!>oH †6Q+J˸!zb])kEy,ӌgʬ N͊X`&PNlyaVID^pr㶬v, 7|R~Yerv_@Tnq@t@);hĝh@Ɯ4UrU,$aA[XA\R3eCr~gVΗ+Īr>\^5cu)n|~, #eQ2D\&#xcW$Z??U>l\?KC_?Չ /K]i/5.0yHq Zdf"j~@]G#[!H .sQM.Fhm`xguN+zԌ! ô<r)xq9?~obwȥ7żXŕBAmc#)b!a!¥0v֩7Ux"P ѠC-" L*[@h*B)3Yr`49 uX<S } ijQ+a62sZao)En=)jx46:E|WPU@98b(.+ߑ9>y" Gb!b( Jn aoL[[M?p@{!l]+$6'ѷ::r˝s† >(S9 eνwtPZ} a˞&iN[8e)y)Y{AJ۾oU$7ˏ/=0-.\Y|&5W|D3*rhaWW7{Py6a*x?ؠ @vcmi r:(H&qضlM4P1 ye:TŊ2(ָQPt+^ ' ¨yV;PF|d6bMϹ"+oM-9c}zH*Jur ȭݥPۃik8 m\-b3=˅y6-)E\W<=?!&z?C0R#p:-i?WIa 2L; KK&#ϴ$8- Ji8_ԊgR̓ &7\Lrxtb=|H~{a{l(I~i3e!E~'lf r{CJ#ts],gT)9D]KL$o Ma7ršGL1ErC+L)Ri" !=h\"J%鶶nV>Qjsȅ] dž<Ƅ)Gg g4iZsPJCάv LڰL@)@` włgq ׊-o(5FuPyva q$s)vk tC8'|*a^oYR"} /iח O:ъs^ _Mzy9}}EN6>=xfmhDr*ڥ SVA$4SV+J'| WlWq_Ŋ3=Z!bRRЪwn)RBn<==#'in˺ 1pP.EkC1S=|a×T(T (t=ag>#Ld' P3=%1dcBZ[ tg6,ͼ-c44;bN?WJIۃ?(G!^͸_ nZpXudIX\\C@D߫PQb`w0ʤCB=s  U~/۶f0g{liX7ensEJܨI60g]L,xRHX5` `Jۍ?TO4EO3j-h@A _ ޿ |b+^>~ĺRW"zI ^^᝷bQJG=JoOm~_&^}p6 zrscͤ3lPt 劚+I6@x`Wdח1{,0/X12!d@PB,X [HBpE| 5"ۖ: ]9WRAkeOtВw9J=HjW_gVmENQ 2t># 96.ΚO/?b eAkCI] >|x*q#u>zn%|;,7qõG8 q؆8N[P(Uҋy9;9N$Vk|wY&`2 F6\"S3wȃsk]A* >P> RеHQ[w Je-Y6jg棟I¬F(r׼5nj1(v5P^NvZPr6Sy1%ezb+C{2/H11*6Ӕ[0x 1^J}cn刢c+.猎1fTŔ?˥iF+za )|/FEœ6F0p2}+\e7D/ O[\Zz. Bs/߭bM2Z(MޤiN7Lޣ/UQElfVQhU$ˮj`Z>i.9#&5ECΙuź^XaϘRf4ڔy&I%*,) D Qx6WS%A <8"8>Z3ܻw~CPexI d10 a&O1+|{fXRb)으:X۠ j(GQf͍; E5ٙAW>!̍ 14A[GVjJ).qXΌ4X00M'!+!&fip!NmZ(I1 jZmSj1:t:AxXH@7r, @9[P~̃4s@ Ie۸aa@ 2`'^o ;6P0ˏx~~~;6޿{%0ZJLqx %O\@)ss?6SJMH2ޡnN @ g[H!Xndg3Xq&dXn꠷LEK( zBUBAz mM :i=1 =`}dcQx0|1*d@LYdL z#_J#6Lj^e9[b i-FVp^NpY6ܮ'eFlsfrʭE2t`9-yFn%>.j }kyEXى`^94pxcXזbPBy>jyr."z&z-sBd9-x}{3h[ip&Z* g9xˏV0xd`2*^^7fSLS]ȒGtzA{0v1v2HŻA 0/iݔ0BpI8&COG:%` IDAT#IfT#V@owyѓq= 8zw趁0)ތ*,R€5gij6f; T SJF۶ҿ 4iec<:Z&XV6Rj7QzlGMm¯;GJU-gQӷYfٖR 6Z(!Ewr&CtB5hdB۠5H`aL§;uX?#MS#xĭs 1wn-m{IC98ȱ)ȖZZ2^Y7CY[4eؼ/Xyv_ly?xC$‘ ;~@-)b``lm s Rz{Й~7qBa186蔾{@?JĔXQdbu:Z; ʍ&uWSL"1U|nkm؊@<3[uO'ܔ=O)~  2u^fHi"Ě> iw -l@7Lv ffBw{~rt2Ϸ7b[X+)!}eƜ*ڣIT٣q-^ޛQJ=8z! lxo?PZ,NelZZ)B@$ ъ)rp;q)ifQW#l 'V׌kIՆ!Ͷ̪xC9gՎ\PxlF5XcZAS(=7N?24Ӕ8 S%61M/VF(`E{_/ArOplJ%UW:`lyW|J{׍2JX)uj.pYqLOoy)%6 {  VoAޱ>ȹ gbp+daZB^__I-53 @ )&~㱒BIUL zAJ 1W:Zq]75;xAu[.'xOikbΧ}->b=hsNްa_76`%]kՔ֔+Ib;$ZݏmaB'DmN@*cp{FO#ϻP֎ُ_}N`Z5e3Zt»wO<]:wTp˳H1匔&+g[Φy0u^&D@L!F\NgNΡ27B]f_=߷vxCY@}a5; Vmúg>Ww6ub[? fG"RQklA'%!EnMbD8g ӲXs15v?c3N6{ '"g֐zg~cb.{nn(WrF9g.K񈂄}! q{~u4#D.y!B|IDU 0uqN>]QEB 7?B/s{WVq}įK9_]nOZ ˲9k<^^wh%^ۣuW "JS^Qҩ.5cڋ*Nz ]ϭ9P6^5QǐeH-oxŴ,6 N3N m˧O`wc+A0JPuqx=\0N>&K4/4p,)-MΠO`^scu},TF982vG?& s2 9R@pa 7k.mZ)8x<6 و ^)<_Q;} ,Rm" U¡Qw9Շ~jx?FNצ%:#֕Y; w8mzA//ox+ <ĆF(^. *Άr}Ě!nC@DX |3W_N]vFW 9|k¤660J&ip+XZEmôŨ͚jN)LOPtWq&9|@s 5倱 jdFRM<Eӎ0TpVZ0?;m,ju:)R@ rI7B{u`ӑWRP+ *ZH2Sa6] -aߡ;UHv.Ur L*}>DpuHrUwOl??bCT577_2JϭT۫8[[m%kk9rױ6) Q"V^{VU{+Kd\Mr-J#GY z"&wx a9eb 2 GXtAޜf#Nv8 'Nwu 0\߻|(q%{/%[¨)R߸q8{Co ӘyX+7V%Cl0=B-жw pX2VôT 8V5OM,1!\V8_o+;o=~yCˬtDBZXLӄ> ~~}{CmK>deY=Cqc4Y$ɶPNۣw'.'/oW;awc9kv>ȵ4њMjŃtc^.譛}eբ:!omP+Bjddwu6=1AU7JS_V$u3O~9HRm2*@C"__5&t>c^ޡgZL54>L/gxlb9* 葚 !F4VoQ!cjNi20 }qlXN3p^X6,_eGm/~mxxӉm#xx0;owno_۶Yw+gS0y)䨐s[k#aY\;J6jTb6x9tUpl1z<4'L3=>Ɔyޛ1FDz8D-.C/ R&|ݜc ifl U l9t x! [l;@A-C&GcgWfdt3)#8C,U~>8!6i8zWy'%4QY:m{eKlꗈ[yM5n%K.GX?˟\^:45-և):]jDuliND/Szx~|r۪蝓9ض1h  ~b<>`KJ={L3Jd6\C,Gr:->Ao=w#ńjPrU uʷmv#* i!| $:c 'cprZ[!J_p4LϞ󈉞uP8L!ZgƉ |V$ͳ:}<e€c[18A^7|GOgLiBN0OiY0I*Zl;jC10McD9ћ %MN}m㧗3v0So}܎|ZSD6 d=t}B 7Zq{nwx~~t¶2vApOX`;+c7x\qXו&0MqhȔP¦;ax"t#f=x3+ >/ /m D;16n1ڀzV*cY@J qs^[a34+(xuS`[Pw- qVhmZ8 ʔe|N)-lx2cL|̏ a&!$nHLS<vEk)kC=>l^`2Zw覰fg<(B |m@S# ~VqdLC?0.7ݠ^ .$@.+aO@K@ $V8W1*-I)>sU;!W <;3Rr,Dx SVV`C'f|| ~>ECA.ΧGt88'*ahzq]q^rV#WC0YYGTj/ןKC5;wPxGSe2~鲺$Sl "ҫ`AVoobTu#9"BeWѮm{t0jaiRHi.|c|ޥUzQ8Q ///or5Ad f5X~`Y0.Ch MF23׶4GpH:&q!z)cڧP$To@Eh,(;ȇ?eiMƬI5y]l;:|dps @9$iBrzlBL@oh+r>{ơ Y5kJϋWGY3; } w@8{<+mi瀐Fkh$13l& zKD͑(lH|6perkp!0R'{{Ll3c]m_#ZAZITy3^ @Qmx}}9g>zf>[㘎;З\D*Z#lN@wu:]i} 7J>gxB!|9G"nQ0U { #8*Fض58lt u0r\ \r:A-#ހylEC42Pn|Oc&{ebDd@Hj)%ӌQ 3:gߘ@L@Oxp-xH}_Cx~|y`2 z} \ ;5g3IFcB֜ョT֍W'qmYͼ|'5YgO{ I}V;{V9 ϗ_>YnƖpeBe x PGO|۝ӱoFV2s6~m>J;fnnv:|v8û[C;捒]D ÇQJ!p˳"9&(&H/h|]j6fNQ*KC>=KRUU~]_^~4wxk6znMoS /λ /lwmc M}ދ׮^iqcԶ{iSyC QT_k肄$8xAş/^>2pOС^1ϋ61޷mOAқ<6HʇW(r\+ a%k۶b(pW>().Ŕ\= 6dBSdSlCtH!%,=~[!+`).pR| a!rR FaVX`Sk0"|6Dc)>x0]&J`[?Vt. wԊnۍPFNB8 qD;o {w Awl6O8O3( ԊW_![mE?zAHRfu9RiyJ@c@─jp>@yZ, b$kVudLa4DTk(% $nFE)2ᷩ3EyoHB]j m+xf=BHZ=N?&I*hbY )%S2 %B /k!&ۥtt? Tyn k '!V8d2wٴhgdjܴ8#c6kKULg:-#N K?qbHܞ:cЁ)_ 1/02 :=qwȔ=*L&/WkF@Gα bob sX:UX~ӼtBCJt RWL tk\B7Չ%T&Q }qE& I__+~O`r3x9~7S--_I)d 7 ׏-qm?G8v7iQ\|_sTܴɅOsZtY~>m{Q'w`ꧧ#d^mam-7ˮV oCaۊ/u mtV @XNXN' $DPz3p[<gT.{qrȒ{XfE}6La8>sCo7g<1\ws!n FGm(Vm*q`9!!1GޔIX錔f$-7h(R*%c[}Lg-'O?G(s4FdIGxdł`C2'f=4q=y9 bdq7)^$,-vf5b)rxz-CaZ"94GDk\)%| {R2Ʉ3 b:ZmIgGY6nFe>N3+mEÜ#uJ\qKfӼAb-֌6*bJQ&︮x~ C09;)%\F2V Ix!QK+J)X'O3F8-Ⱦ|zL3#& ZeO{+ɚ]yuE40%˰Z4=M5ߠ?cOG6d˰ be{꜓ko֎ {f TwUʌ^k+-qWK0JTfx s[H\IAWGΙp$#7 Y͏EаS^xO)a0\a\%]yw c ;)*{SI f9 >r ~ 󙌀Bs8-2= >s1g:rU !$DoKsB<;lvxv?O v훱R >$ևighYAVom1[~,,ə4GlΖwX3|H3ؽ .xB T|u. bCQ74j|B#xo㷱1jW/1j_2?^R[u_Gheu/ev{ V]׵jsCF~>c.Jd<6zxGɇ?Y6աՊ|}e874plO֫a W=7GfR :RKrIJLfa75 Hfڬz(F$y4 @L`/;ZH+F0jq$<YS{ˁZz}iPI= 95 ޶o. Ujz'N_2N\ hv]ȟDZBBD[yt#jN3ezc ?, x?ˎ(J){%u*Zri@J#C J)kyo yJUvĮ²ss)GFsfi-Cgoi:Ɵ V(h2p:-;Ls`FF73#kYNyCMD]7rp)ǽwJ+m Ā}d|hFrTwh`X,8mpeѽsj m1^-]߹$~s#I%as.ĄPy^pf\Ng( 8ն ~uț]w(YCpRFJ!&dh@ +i&9D;JOm.9žxukۜhQø;x%NP,U!"wZ=6BAK)y9i`9xxߍ=u/Dd EjiH_HO D'>baos9vɝ2靇t<$*bd!)1%S⨾ѱ$p 0kR'L94ar:REj:O4LbFy䲁TW^K z q ;n:{ ԝi|@+sN.t m`ުex L6JE>}>8eӄiaN.Lӄu[!) 1ߗNGPR}S%7TU;Ck %g#j~2^1lg@6QwO'ӂݲuV2h>,rրDrAf)Xe #'I.u¡=bf@`nmxsbkݞC)ªwۻ/P$J3BNQA-3X E X/xyY+ U|ǜvN|mO_Jwg1=wC7)__\ ~6ihAε:\r^TԂt[P4‹J44AoBw΅|ez[Qוόv%+x),ܢAsn/d_'.A!;yåeRV﹐,[#A©2,ׂa9PfUZgq0烎)_>GZ˅LhvhjJi޸շw}ݱ.t04t' ʃ+u){'WD*^z SOXWdRsćq:)\l$g=Y B=bF[LFUSrxoYxI>!Awڒ9%al^ܮW{lP\.`HcfUҦLS^ usvi6ˀ 뺡l˩c*%m:DzqD 4O;ahw8@!fK_pva  ٿ}\1gd䜑mpvcNwEhn(H|!Ԋ)R&xH 8(kJ=0MN;\.93E-oᰟs

?=*ŏ1\Ct>/a}|i}s>zUG֮v}q]U\#} S%kB L {y7\)]Wmݯ5ho8[N)j]K-Λ?o-':uXhY+r3\ pw>Jaqϧ˲ OS'n񠈴PtbD4^@ph:_47-ࠍjF"U PztiY  SlstT/,VuLAk*fIMP CWп9T+Q{GB݊Cpv@rh2)Hcn2 \ir`92y:ZRH^)v&F{0>`HscZi!Bމ<pWnu2wb#Y)bJ~mx{Й"ZFǾopJ%fVD6NgP@ݮbNC^stpʌR;TLT@u0DR掂eY 3p]o8ψ)C%g.}`wY%u/iF "mX{ Jȳ A"[O؃ :P(̘(jc6@b0EA1EB-8fa a{Ls4HxeLŜRPˊR+J"mg8O5Tq9q]oX qCUa톧G,˂9O8:H%!w]yQ^y/]DeRu@kڔyai#ֻ;9><J9afܮ+FanKPKEkTSHx^8J2SnC}D󲰃B"!xOJ'D's - {qi1pl 5^S=Uq^fBywH-Ai"sBa Ü(Q=B s9~bkJe2x>L^otcLlU{n{=nfwBp"Ң:3u(1JoyFi.4csg|fN%Ӳ^kKLH.ʫ;MvPL)ґ{G#ߧ|"aۈ2*2rv  >C!wt&G()˧)_ny_GJsLJڛ[ӔOR"իwj1'FUwUqS^Z^]"-}ǾmST)E{E%T1e}2"%,Gy#@+5匏e9px{xPWD ymx}xzΏ*upՂy9ك@#a&RADz7~`p6 gڍykf X4}!"-T:E){hUR.G%G#)zc6-LjT b8/Q+ec]W;8Mޣ׆6r6)7# Fk`ᴷ8^LFQ\'&V !Vԫhu 29 ZO")!E "]3$%mtVTje_d먭"m_q]>3 F?;?Hf umQւU^^[N~g8syFL#̃SrBW(:KbTlc/6@1'C6#m#$bp;mǺ1ѺkCkS*LD}1 "'bIb$VZj'В8X@yP`@RUА{Ra֝{  NÕ5++ >Τe bgRzcԠg~уnlb@ټepavXscE:yYUSTpyx,p~81Jګ `r}!$= °^tp]@g̥bzEOVz:o#9W߃<1\}{kx \I\)K8ArJ\`󈙰= e8 iAQGN* cCKbٹ8 Ibjc\VK<^?Gw{ߝUeh]5i#o-M|C06?/<:;7r9Eu#ȦMO3 Gm~%(0mFǫxꣽE-.j0Aykg}J>(\fhO*՞CZqM)'0hȇsOߨ IDATGǺ+&pƺ*3:C)gla_A\k۰\nЅRu.BD)f<^^nm. o=j) Zf| qyB)+;y>3u<τm/ >V,BPS)m}1dւ늜L9[VIJTULVDƹ퀕'SX !R+ϭHH@"*!O1?<ؗzlEd'QP;,R Zkx4x}}5XBD&2c\0 ^jrʤB:btEYgfG/US浲 9f@pw@iŪl<b $e^CĈ4#Hwo,ca}[} `s"}Ucyg}`3O)ՍأhV_ztf|~>NH^׿wrNCAO޻k_܏z){}jCik^d> ЇzTZK1N#Ĩu w0 `O#4|^Z+a [nԂo7zh; ~}3M2$۶.gyA6Rδ H=gxLH3{ ߳l4MԔC};h@$jarp!h=RT!KwەCY(ĻbFun4ZC$-PU+o7fY-0j@ǶRvȨPhaH7D9Or`™"3*{&V\g82HNeJs#o.̼,"af`vh5i>L9f@( !wWL2PJzBu@+c`X; Z-_1D8 PEPƠ*gZ3TTbXj6u*` )OE{6?ʐ|cE@m$%LkS lu 8#ZNDh.(h/_SCo]8p+ň.jJ!!Ļ]P.%Zm;I۾EU* bYNx~~Ƈf`'fSǘ#ǸC)T=)$sWp(SΉ+?s鿚_:prc8D=yg?o/z ^!BvGu% +%o>0D] ^F :4;)"k݉Avfy>cO:!ī9=jQ}d`tU!w3A-VK#tt!6-vZ&; <}$x%/ws Nha3bYА!\ڨ.=;6*}p@5jwvFo;cJt[Pm"m p#XrF,NJ1K0mɀ'O>mzlYWO̳#FMh#s]txX)yxƺdYo!ʁQ.'>0 KF8Aw1<dG\myl,C8ȃu)$ w CH:{?Q;p[V.&10cy|?!&s`f 2r pM0_xNg%1&{7 UB/oN!ýN8n@;ZӉ]aYd/Z@ˠtN VN¡~ւ1 ;z)]߬n[W7K(̕@R^^^*0ѰQˎ LZf ]i+G :xp`?:B s=ިZx \oW2["b8r4,aqTUVSa=NL93`ߖVAOKCDġIiBp֍8 Jo(VRKKKGud h%wMӜCD 4߿ޫHe!2Yo9|0rR2 yX߁}/%S 1iGo'pXx YќLYc(RUtg3Vv*6>25BBP9gf6+)r2g,B8ejqHtA@.QT`4O;V`Y4BMieGJ+ ty< , RVTfheΓ>:;g͊ b+v8imںڲf;n+;=wV<<6}(NV+MjˋI9t!pdWc- cy-[<[phSrJǧ=Si3"OK@J ˅$W0GB,O=ﱉ%#A+#e.A(PU5>_rW_~^^^'s~}P`u _-˄z(к;B)림!cYFDȆй^`v~[W"ϮÈ|8 nrEgBxw5Q ǖkj`3-N>9bZmA"{|"Ft ^邑ƚ"|Ⲗ>,d@s>yMt;o݄l%+<^KH+oϧw^>ƺi=y RjEd㫯dN뫌^vjw9YI+ 9Qs4O2dwD?^w{ fPt¤;p9ō1SB`ݜ"퍬KA F+rp9t9gVxz~!A2SJX B&7W!\Qα#OT ꔊhH>%y%wNyU^J6epXN붢>u^GkhsZ 7"Pն-[0.Vz8bx$B$pvљ7aOY?簭#ޮ7Hcf;V*n͆rpU^gN֭qHK OvGBո [f6{Nž|p [. ;&?x\Rv\.Ցñh0ҦN38LK_pteA-1&]%5 21ϼE<vV~AGm_;bJ^*nI)y njA^lvHGbRpLdX3xVPA,ZbV<Ӳ۾AFGtF/xxkkjT% ~ӼPvT"z0Y=|dy Mt)Ip>F]qPJcJծ;갼321 , C҄!dl l4v(>:w{oc'8gVL sV[CEDs,p1)Q!8xC: 6V!tV҆*HMyB;j5458),3#(I]!'t ! b:b_7տw}}d燇u}y5yK?~S9?݇!L/bӒnN#s9kq IYĔƵ(}r')RCјQ9LgAFr[ 쪶 _Ɛ,f#CJ wW!xctCt;PFhUp>ưbv.eR&t:Ze1/ ` w/p89mGPKtT|`۰zp0=>aA ̏n唰;sfiՑJ2ZaVܻ c 4t倪c yo]O) V~nt 4Ca[ RbmEvnHea(R4XٸP|B 4a_9nQ7)Dwjd`HWb܇(DY:^mnN ]}){"_޿a9BćZ7!`du e h"gShMTTѝ2010rUAծWncVarݐ"\agX̵zRTv*Z%g9!`v|m@kh_mkgήV}T<\jA{[WU> em58#}OiM1”bG; ̎d6u穠ƪ"jeA;X&<>x?Jaj&7T%Y4ѥ=<鉋1Ϭ=Чy'vRM йh6jQɨ [b^@.^+0| |ר#O TJ{l E U\p Sqe/P>OG;MZ FZ3Z)jbJ~罙rФYpq]W. XJm H@ĀOa<0(0Z#'#fr”2\ϟWFAw" >ݛ(9dEN)Թ&80 ysN[/H?ٛ>ʽ>?۶-,7E [u۶o9vxÝ,Javl3պ`6lו4aIŪ D+T$f<q惣nb QmH6$ 1hRq]oF$ٴӧwB"J)PeT7)9'#JBwlϲƜz}Ήǽ2SmمJ QeѲ/Q |hGroPh=TXB̫ $ eQ#޼q{=9i̹V\a,2TP8{1o3/mwdyD8ϓك-Arc?*);lFnǏU/dÖѤc$Dmο?7qbM؁ R1ƒ~)Z,d8`/zGt?EJ&!\dLrX !`݋2s@wg(!lXuˎ ƺni3qɵՎx HE rn^|Y& œIѕ(|;|C Y؇V;6.~PEUӪ Xb IDATu2r%MQq}xk#NK{MCMWsN%ʺmcL ʾbF|jW89F~4塈A=t拫I)]LV"]O r%Sed s9=D C"rT(`0bVc)"du02XvDz>^lOO)ewĐѥXbOS<:` 9e 7Lb dm6h>==Y>?xZ̄$cuA6[2f}dSCg#]-6QCL9&bdR!98?>`<`L󄯿ɟ)jmvIG D9>[ f^0ņh;uXp xE! 1ڷ;È}[1 Uͪ/5 28stp9[}vlTUDhnc4 ^/f U{2 <&`0(@DSEԳN.=j`"UDhD\|ӟӏm,QHE6Z{7"ԙI4_bGtA@kj / M>/IiB}/ l8pu@dQ*m^ dS<C_ًёɆJ#~G?Ę/P 4hf0*bϴ*q.#baJ{sgK(j) 2V7ܗTG,buD ( a`RJSw!ny2Ę\4t1%3 àUDy@ y@9A)"v,(]l9JRE)Ǿ2xl._d?E)|}^??ږIssGJ']߼dkYTU-tkcV*ޗ>?=kzmY)bC OZ,cn/{IC]r`0Z7B—=0?{9o6 ML(:޵ю 9۷ t^/W 1A1M#MM%dV˃V2XC{@$l݈ V䀪؛J45(6[|@w w{`wXei"JZb&`dmA&8BL1 (\P:}G-J=R3 2RQ[2!e}]a {'3R i0:vCLMcO}uj[0ZEr05@lXn{(HGkD¢9CQޡG0m0Z :,aٺIvVELFz +OhpT?9Ek68;DSezl1oQ5{Q`M 9 "nؖ r{ 3yr YyƲ=c 92h@Xs8Zf:Jrų1ȈL%dyDf{ج_re޻5[1aM4'Gv8r>415p`V^@noV{Ei~|wS '" .ϟ.wH ]m ]H>ڲPHᮕ*j`um=}"x\N "c@ BHFM)" { 2u&2՗j(Ta#= q2{.G4ڟ *<^*+9 !e[< I*b`U!RsHJL:]\?Џ|_gǥ2H?޶FsH*DJm?}~_Kb^X_U7 M2HX~^RN=2)hۆxY !Ⱥq-k0CiU(&`Ŀ ? z(HoT#a> կz/Ooh,4 )%YrܛzNeV.0aJTlYai bd@1@ЭWJ8a. F*y7˪qQ[E*:Mhl[վw])}xdu0ð! 袤(eNh޻*V*30`F{00 A"%l0e]ћUԮOBܼ~9XxYAFe&V9Ĭ  =|)_ZMLGUj*p Pe~;櫷p +7"+` o*EqzE~HA1`jGH@j׿+ tQ ,(@i;V ^ʆln` !Aad29⾬xчyq;$7j=r$DLBiBP!"ց4b~ B1F2@M8hRW09?NoUQmݶD^﷦koJr׶U KzkT 82z!l K^@7)sk?yRF#AjkUeY rD.uiǾmeAUl yT֛=t8mDѤxnחπ tmX6{1R>-8ذ-a@~3C;j auY7R0_.g m }8`J*@jٽP(cmmhֶ<Ͳ[|SBeO8&,'T`/F$M|*ieG' hm2ic^ G jCZ B $~&w )PB-+[w`NQ Ges:4jjI뇵|c%LVbv0#h?A9V"b"Olxf3WxX?{Q5:vzǠ*BDy1 #d];á²=ـ#!2!I!V+Hc:8UhS#82{]OUzY_@*e`z;7 ٔ1ѣN31{c : !|YA;)sjCS8 E0M/3ww|WH9c/ e, Xl =9"@X=ؖf9[Cl̒KL*Q[gHHiH9[-H`$ T[EVaK}kndc 9' aJ!E)\*$}9 Ͻf}yyrp{ݛgH|<5DDJOӯ,`'컁b*^ELV(9\W=m=yo߽J쟠}~+z5{Vv[8urQJi<\>o%P"q7:w8HC)蘳GS}ZBx D@ U) TC!EKWt᯶fX X Ǡ$.AU9e;Z;nfcF% l 1.lm>D5%`Q:s~_?[V0RW ҐSPeC;18 CG֪j<0Qݩovݷ )5yA,juA;= Fd_Ga l;Rdb6dךg&uraD[έR*y 4,9H] :xۺ.fzcGwSk19L#DrS˽9@z6rc 쭁ľc6u5(rgFւo߾ ˺z}e6w7M )>,~O3xXϋ=.,]7Ez]#U7 S o ?Oԗo@4 Xk$Dr[~5sX!}g9o/i<4:g-)?G#@1+a4idVm[ `~Mf v0@Cij/@UJﺷ-0iEBC_^-pqG"r:?rʙ80RNy̦0SP1{.P޻ET:?Іs"O q :8)Ul{ݪyT+!9Ft#펩oT@m2'DV߆w"SWqֽ[¨m߱j }/C4NQ=C{#j7̸YuکnsΠ"!V S bj3ػ b:?}ŀu۬FʼnGr2  r1%exb̧IŤmυZJ E+4;b0ݩGwJ@8tfT9(18 *iZ zۡc+NeM] 0"uB:-ep;TM]fZ5dg_ U\ٸZ1 <D ~.6~O03h,jhaH5z/tB$y|D@F] utNGZܥX#A;pBܚ[4 0~Vx(59| 5#H)ZCCN^cGfO{+RhvPuRݓUbNRpTp@MUGƶTOH9cN6jCv̑B @^8ՎeA0Q)6K3H1הe[~uQHo"jHP'U%ξ!D' e3#Ɇ{2p䲫)bOO$jmw 9UmU3[޽/6E"ReF$\ !Z1!Eo1 v&²-;["p{1⭨YKmi"9}B^`|SsDGgayK[q * ֔@B)H)Ch"hUku&wxїa+?/?ƉuY֪zu_A%e|o^ڗoTzo PĎ~~ۄRgn @L S681 0F%"覴s%`u8 P-HD[S" cǧcC.!z}B.z{~=ǘy^2ޣc$pZntf9 Ec '^Ln?3za< k)FV;m 8B,)z?w}|^k;^jŲ Dͳ^_mE {Qu[Ѫm{-xy} M3XLkrkJ50ɐ{(2I NW;Rxx#cg#cH)j徝T} Xe=ջڻ/f=̄n3.׫eEQ[[oK2#@Z$kRX֊)/tXqFvAYu<jܜ3׭"bx~bR$'/G~FArPQ4Cb ƀB_tZ'³-|آ+֖;+A>j`&?LqHI惨⍦.:ǺR2ⴒϙ^)9gV0'[3~_A`׫e/чy #J-6LE><\W 48ɀ$eà 1x|@r10{>3KRL9Լc@3E֬ RT~rģ]Ev"6կfK1UGĆ. ja0rBMu]Dx+4v,1O3e5;AԔ s>3֭@0Lwivg :6A{R2u3Հ|ט o0_&Y1&Yvf0=BlY7KCsK=W)"^`դ+ -ywtXVS\5L1"b^^_ RvU*qԊ| vT ]H!`VDtWգ z鲙!$  y*a+w2ڻe߭oџm.`FŧbbyX6"폏/ oO?Dr&\b~DLm$txnߝ?]Ҧo)FPZSǮ7 9S㦟nMk^U tVfPT&" Cz $(Si#gTV 23*B8Pz+ R4D9E)sL0Ut54!b=_bP D Hݚ^ZE1س\Lo{Ť򰲴#{Deh뺜OiFgr`3^SpB5 qv* Vw, 0em?LUxl8L6?١h[LԔyUzKˁѫDR DFJvn6n@)r@֚ÀRvlv#C[A >;޾yBځ8DR yITR ,C[r%v =F z==+J+HSƲwҰn| ۆ#B56Qu%Wb&-u#+ 8:1Y}]Ӣv8$USSÀa̘ <#ҘL;tYr.#I˺c7Rq}t3k7Gog^ﰽ}6ko''~;7W@] '8b3r$fJlaEXX^Huʝ`&uBžĄb 2Xqޯd)thZ}q?X1RέjP}p6oxƋCd"oF^=P;lRvp}mPd bEo I48u*"EXrH*DD/2/oiZGX)>Nx*ro|Cݘl1ʛ˅uEy};M"dTX@wMOY;&+G?CdV@^cCxH8D;ADz!РJcʽVzkF6b)+ IIᑦ+S2?P՜C/S i"ɐS"W,o54sZ4PXz*^/٬݆n=eƽZ{ dLUEo{ 2ԛ+ݳk9 ? }_w(lK++a ~{ŶAS `S4h ,Veez;xvC ?U5` "}1 T\gC)yA-Ϝ9[Y&\/Wv, !:R@Ԅ1`v֍hC萳0ȷt=J.ԗ*rn3}p1+Ф`0S![Uq̶o ,w16SGUF m30Sr)iULJ֝m[!yf-q[8 NT*Y~+#.vp2[1۽ET)TLMka[#VS@7⊶9<4h;Tmՙu7PkPpH \A^RZT?&m!{X[8 o5{$FpGu4Pwn;a?R@'[®Z Ն 0ja :Cus dSĢ-Yڂ"R4d[оa/_חTŵOwTя¶m}=RZWA)?~7~/~a:NBVqOOTW8}[}i|5B1+ 1ω0Z+8% _yK!q$[q[k͓(G0L 3].#6͝DlKK 0{Hn (rlikU98tj@ڶv8L6L9}0rgٿφG۞!&M RV¾h"xy}q,PfoG;}w5siYڀ>tϦχDcyؔ`p:Qm{ю>,{3l oVW崪A0>`/#Z"8D(^S4!`6ֲ@-R}; UJDp_W͋ҁMeEΘȹjAΆb?\ jCB e7l%!"YֲT7u)1hJXbP1і:朒w.{d,+~P`Sn[rbeCeXfS^upBD倢UwNdה8Y|!bv~]g;@$X.KsuA˶ lHCzE2uCuA ǧG0LdCh"7rJt|hAN>-:p D8̊|FK#oB1=&_ఉ<Պajb{~ uy6ڬQ3ʟiȞx@W c[VO9P!'>xl153iDy̸>\{ "lU}!6SC3ڲrƜ.JsTx^YŮKe Hy@iwFTZ8+u6~5{M.Ntg}"[b^-v@ "EB:Y!z769X :`Ư?|DqҐs8jp a~ H1KdvR2 b<]lDM;8R ijGB¶v-" (VmD Uܙ4QWĞzKX*'×@[<^Ӿ+yC,=HM$۫3c"|g^o%ֶ=;\k}\v=\'ĉ;QL n"4@T-[(!!KQdдxp bGp\ď\yZsc c̹/-ut{gך_e]%y˲PL @+c}WXL2c]@ <^.iBEUD!Fbe q9 ch1(ωsb*.y>|>s&\|:q2p`jd;E4aYiطkmrZv+$Ed,Za2TW+U]5p<6Q ͌;bʖy6e1ZV+q҇o#VW{m*Zpzϒu]l#V+z;iAKY rE7"GLCmu&mM]ɷj:7!jE {|D$9dP4bw6t|-lYoЛ;0+*36iH@oogODݛONf75bÉۻ[era8|rBN9|#G XdEYa2Osºxwނ]G !5%m6p%彉 i 2"$KM{֭Av a-zx 36uAs2m@>]ߚm0D-S.kzEdZZl!䪃m5d&muYt h*ZM.,drrb$Gt<byiv@잱,.= Cط=l bZ]1nLbLvk op]i Cz5}L(z-fg]WlhT#]Des*@QWK8n+)G16$ud” P@ 07RirhDd:g>f>zEؙAUߢ>E֬q\|s( ٽ Gk!V&7Möo~-0d0@.D[Fۺ]ѳjg5"bفz\%B N33ڶ!y  dLs][EOAYN 1F )chr5 B0 K$dq!TwUv](f0s ! !:NwwOW1j>ۜRֵ`Tz|9u[~O?o|ߜ~z; (P`X1oz*԰+Ui]D5L")ax^[Yr&Y]km=ƈ̙CKtNS erɄ(^~9ǰ́r4g{PJP}I>zE t8e׭~1! ASTF͡11F+k9c^@Ajr"5 rq n+0OjŶCr`iJ)ˊml$e] ѷ͚1,=ۡ+vҥE/9`\7Bɽ"coG1ASCd@lkB p,^8! g[`s49|kJv^XW4!# ntHP÷ vP IDAT|Ɓ-EUOaDRˇ؊ngtwɝZJgl4M>BRc?E/{eyw;m U\y>D[q ֛Ҽ&D;oDЁu&N㫏O(Ѧ1|!p0S*칒b-$IW;\FڇOyRt4FlYn>+q٫J;f$*l@m3~Uɼf`dcc[W0O!Lһ)|` =y`)eDŽx#o=w *v-#JcYеͺi'I)Q41{^ f:Oy{kzd=}b=@R1b ֺ!5k(߹rO=`Ef}C,ȷ7V^@v Ft`tZq9R@v9}.t~& >Cpͩ ($%Y$GL>!1;ց7}rė칉9ehmɘrhjڽI9?zw`ͲZOنX<왕W!=1%-# &,"uY/epyxV_3г֊iM9K(Eogml\_}tԺb&lm39X`CS8FEY ڬ9f)2X ƒ@ʌ R.`#ˤ \@6 rB*2{/D33>ipF>|Ϗǒ3bT o/ fn"/o^~W^Ow;0M s A?{w4c0+MuN<*k:¢3'^bIu%9GTdtnDRQBR[U)LEnϑr9 @ǐ@I@L#S)982ZHa,u!Jߕ(<%o7Gc{. U3yj0ߪbyh4 +ărb`Y#ƢGkdUO<<<`IZJ0خz3Mt9bibhat #,<<33 Hߴղ: aC&+bXԚEPi: o]~mtjP4[Shtrį 2;5/| A&$٦9'#$vmtj쳠ژ+9L^2PyMHQBȼwк77xLJDhŮKR>6 r1F=F#eY0ٲ6phgSnsr{^),{}5잶7#=A,{Cx||\N]?!%\:tgm杛O'ިxgE 6z> 1g.uy^rR$V;߃fPdlh41yv B:BqvY?>>b+ZoɤkV+4Y&zn 8@@ΓiCc-XVc';žAdN92 :cDA"1M}CZ|aQp|h[Jx1 |4 W峎^ugj, , kXbHE)QHeNZwmĔ8HXBkc\mN4!ӥ@no(P&ڶfB7'FbMhdmp{ط,Mɧy>Vj7b`Ru$)l͆_XFdZaf9h*U:rv F'&77gl>NVyzӃ- Bɥ0"ɏXwdtsGc`f FO@d* SFW=t4 tY'Zz|:!b:7=  ׭[H V1zTLbR*=SHm&w>tAڦ#0]6IjR1oo ŹPm{>"*aYT.qpєa =kN5 ? |ᣏp{{W*k)"ǂ^GV2_ {!(袶!&R H3O@p hݛBr*xzdr)qG'h [l6c`Da,X emۈBL^IAZb4CPm#m bͿH]7Zj[/Kr|'׿jقݶ`|a[ j59% QԷ!w ;ȷ{,0s~D[އI3(=cT3B@y3mF]jCgy:A|#ܚB1,VaE8}PF޷ɱ@W9 |Z|ʞ#̩i*=6 `h'5*GdꖒD &m9#Ąj*/{}PB=72 0|] ݗK}KꝣaI-yk!HĶAu\&p ,i[O~1NC6;Tp>|Џ!Nb2@ݏ!v̧b[}W )H5s`@R)un}|x<ݙf]@cpj\2vuLI6*zAak8 [!P$iF >YQ )RԵ>}݂b$%v3a{|h?wz_ ӌy@FUق*Tzn︟?y/x҉2bzzR\X@-JηkǔL@*A"<+yJ[xеi i+"qK1XJi"rb9-S)p@Όl2:RBͦLw9ݶV/⛹5̲Ofڰ/ .F":<,yz)Y} >Mb ( Ï5d}6{oPG#Fڬ a{T)"@m3DB`kBѱ3(0H AV;0(2pwu"Q2*V UPt!G69<5'TM+wJ@PP&sϖcƲPf ,74x%Knf}_Xѡî/}dҦ܆'Pfa`1k "c0|yPA] őy!2,֤6 DJ`P2t $ԼXKvylnCu9hl q BXը}mBۺaٚ ]jct$mhL$01ԩlu]X@߁hWQ2!=2jGlx@YH~52֫{ũ3.0ZC7_m(WQ&H"¶Q(yb5 mô`itX)&ѯ\f\PJBJӜQ7 c X%Fce5A乤R Z2aֵB6yF`KuK~8m0A&e6Ϙ5# [ aip 2g֊Dg4o7iL7w+,w.LU|v;N.oCo}|7~W'޽ 93lghѾS|sC- 0JC@3+)y%%"M!өL@U5Bi(Ұ!`vP*V6 gkHA@%#W|k8325HN$&O2\v5`Dem5F1 ajimVb u1a8|L9fԺx-KbZMJTy܈݁3@NŊ Oa2C@HD9Z~Z1`i%"sDKߘJ_"d{WiYOVtp q:,kPcNϒef 8@ & (ps>y4y 挛t|a18G\Edφ J7c (2jkT_!k69L[:4h,^K2T͇z> *\|[z9侢vm[Ek3y cܾ 1" P]=3k6hun0G}$붚;&;u; :^dFV46ҕHuP4A}t˲CS䌺UT]yBP{t]"aHX df"9àҀє$@pK>?7 b N%lJx )6hlHo>^'H&^S}Ϧ?KYo*Lr V]^Y ia~u5S89GbN܅ E JeU`2Bo0lr!wrS~"=Hj>&7% l>$&McF*x`Y!05TZ7˂6j f]+F[y7 [[\~ػp8r't/thNF3I c0 (SY4i3gs#?`wYVt3noN(9MwI^ANS@wAV8!CZG BoNJW;d 1o \ch[q"|ؖz!̣F!z~_("}56(`u7 !p{w/B2#x-ڐbIJ.ض͚"#|uѯ9'$V/d` (ӄgx6ba|#"bR"sNIj!@xѳ${u,S>dqނ X'Ǵn>a v܋8 L)ٵ-N&syaii?3?go/}/^@J /}/_rS/-)7Ձ!b!u9'Ĕ=&*t|]Vr{U1!D0 6vTOO2 f<<<5#2><<͛w"!{̐!R 1&2P'7RQ@=35&''MŸ/F~*Tͣ&(e֌֭q Z-w$&1k3Ul=>>]r?l#'`*b@ &9F3^~ׯ_cggSpv 4ZmT(+8|}>Aж'\ ȁ1O%goN悜 <&jWt|â^>Ji'Zi1$lߋ"f͠xDE jL!0eydAAٟ-1"#2Bv,B9l*+HI /tj<E:oq>//_O>Շ! zoVNOßo*ӤZ?/k.꽻T} T.{|zw '役 gV!u bo~e::ӊǧ'/ nXu2=2y'y UMK=eE0(~n՞udr2nonn &kI`Et)xL[s&'%TL>gh;liP˲CP.W,5G @i.Rp{/Uꆜ&qaQP,eEur]sGޟK20Baʹ2r[SXf*f<~6UNoz MUFٕ IDATb\iFI3>#ۀ6ud1!blyLy☐i>C*8!r6h.PR4 #iJAD#qqw׿Cq|hO?s}6 t#.Si}g«WI!]c>qzm+ڿ/.:jqt:a4XƊи$mLNzLj"8ͧ(X4fuP5t;sIe*i.RbR)S )bة~"wȱպf>(zL10֏hFP5&G]cEs.'T`O t[5GD&Zf 6t6>ۤLd-)#%p%!aܻÚfo 鑣%ѦVq\Ag 9@tl{崛.PU-JN;UFV0iylKۦZP1 @ɷ[{Z~gD2N44M_ŚVs<$2 V=Pq+3ThbT{wTR@!輟~).Okq>ͶdҚT$UČ^/ b\v3^3_colL-}`pGr̀r ֊X ,'n=vbA06$8$agPB8[;k m5bS@Vw6*ֱkio2ms|[]}cs /SF鹉\H1ߞoEDMm<)h:豶M?ϨaY:R&83>|G0`,MKoK/݇NLy6ؽw?*.V#r)TA~n6mEA 4ۼ?< ޜ8a JAzCK9+z^4FC˓QJtepieB JX8}ܴ#x/[oa*7þ.=Ybrlz6,&Pr-k.WlKuWfǶ 4ȹ27y9Ҷ_t0)'41D{t! =!7Ѩ^DoJ;sڵ^8q.K4` &<&}\{-LvɤщH!dR!!;6qQ4pAT|;D&ݡL AtxmYiB Zg )N|ηSDH Iڰm "VFB{6m Cҝ\jEer +@ScXC$xxxB5<>^m =b<=^ ߃b>70i^Xuas1w:i1F%ۖCc17!Cb\&lloWkoD%a&@d2Gv %ڬa.@P& E7hŶ.tQGVKfMRmJ?;X"RP]>3xns1}oRZC hm$2|8kCaRQD'VYFduCo/CF mێ;M"ٷ ^pn>ӄ#jΧj Wk]AD9F=y~}]kO}Dhۊm[o<1{ ˺t2@a܌.A!!O6VX&p6 pRʙ(l  dUI=E(y&ď~^ˇ'@onD'xS SOk:|P>G_~{7ʯnoǠQ\ãF0VҪ^uMiҗau@J dn?lȈK$rQ8j3`msm9oU՟́ekSA "B P2e.x@dLBgq FD"Gk@ ctpm+ 2,s-hts!EۂͲ a" ߨ1mkq$|KmiaU.#qhøLT.+FxD ڻy<=+بlgB0&$y񸵆3x"4O(9fYgն~sx% ¸=0 v_'qV=qSR˧~=b ;H)e泲Uj(yA6Y YP:F`deDˆ ld##r}~o)tʔy6tb.V=F#+B0 UI#4}ò\QJB)%ϑ<]E=kֱ֞fͱ7v1,CPŮ%W <^:G[kި<!{\Y 2Dɕ2I}][KRH@ٚR )L֜;h2m!`S<`wBDp*p@DR$ D &QpF q BS^NiS~8~P{7-I.A[kby-&1"oХuWSɟ/5'~61)̑BR|Xt9ny>Em1* n7wᩧsu "݋&.XdpʉC̱Sy*iR9TBJEz10S09.Qæz0Z`Yѷ 6Q3CEؔX) V찁mYh |Fj>'}UYѤكJQ\*H7MiJmún^$0Cm ѻ1pn5iL n`d9CFi 5b1)a 9&737W IӚ>8O]߁?>Eg2l BHv7|/bH7B[`sIOwB \c2e]oͅM|ճ\=BH(xݪS﴾ơLں?7|59Y4d܏fK*(m;IK<Υ8F3idVk?,& `HhmMѡBWtP▜ 2Af}ʽ<_uAٶM2?PGG Ʃ̶Rtkcj IRݽ'B&}d& ϊ/x~ q96B֊yIa2opL,3Q~.ƘKR,W,낰a{G)-%dd)%󜱟ySAlQ)zEĽd c4IHC`&߬^)Td .%{Ⱦu&<_go߼úV<]XWkR߼{ǧ'yv0?>bI)nhc84a]=MXJrU 4uJ1v/s-VRaݫ(j˘/^D ^r>W!{?ژ,7֌nJ΋KݐSFe=W>iRB)=R"|SsSwp273^z K73r`Rp{sFR<-O2u.8 ~ 0J.aﶕܟ Ny&X׶E{m iELpl<9ɇ~]'خ-^{nM!!hoi568F8 w$clA9DFc|\6 k?׿|O6y'ߋLJ A|;ӸC\Ͳw]IC_雟k_3gNJSzUU=ͧ@;UC ޿Kw: S a@̷Sa h$PԘrBC@)0u >nx>(GL%ྼIzbYyB+MA0ooT.Q,'ptIJz5fZ148 1%\L#6uzSl N3p {{GxċJ.`Nwmλ11Zk}ιUraď$(MPH"r$DYF nIDnd4A#N"GAmG\Tlךs_sk L6ιG{|ab c?bojy #EM4bE6Y.MXXWNc*< 9'<>>.X6|pqX&8nh]B0|{"{qH^sv/.b!}r!)2%`JV7a&˺17~Pk,քFuj~) H`CX%~6bTcIvDBdaO^"Sc@B̧0dh{98ຮּn26Ph\{xˮ3;0g(v'x.)Wv0\:ZA&K@ tv.{?Zmw 8hYF2a !P'4H1.fڤ"F=V%o n :Pɞh(Xy0E  AT%P{=o|#X>r!A??grX+3-Fm؞8͝~?O_O~?+ ύIz:Pn36 = 9̯xB':M1A2bb"n ip18py.B B!$!ư$YM%+ޜtokvY!DA ([V61 2<ńuY!Ұ:t>M|om%U-^7J泮ś~V*0GZMAͫ?13BJu_׷_$?"$'Jʽ_CϗvSO}߯|_s@2/)zkxD$G몤|~'WhI49%߼i8(1BJc!40QeAXZi9l; c}8nOPA{k赂bL+1?x)ёbWS yNGs +B4i^&}tn cbSo P2q6@ְ$dUm0BnY♘PFP&@cxv4w1MmC4xd5XaaFlhM']u IDATn=ű#pj]Ё KiZ1c>\ ݶöOV<'yJw6n$8AHöS(&d6 GP"̧)%^79qGt|lP5Y7J}n ؒ>8Ys={@+mSRD7ɤ"dK ,+ray)% Pq->61І"ځim[=r=Xw5&/ Ht牐x;C`uvXRbub;mAƴ1 w.ee?ᮭ!Aw#VlTӝ|- b|x5N'kMIԶ~^r:,ʄf6(5Ͻ3RVX+ V`$6PjwEu+"9=Z _2 `$ юP[zY`]AL`MÖEIu ﰣx=`OmO1@DBmƈLSr[+nA"'Rbr8ڄٔ.рf;$ D|:3. TZT`0;̿4ʅPXK k0UAM)g\ ٷLm8+{TlmaJ v}A]nAYIAmO?կ}3x!|0u_?$|1 NuBEIB|?9}9ލB#t _scFY$MBBcrT%9bJtO 0|:_BLs1=~tO`&&iBQPD ͳTBmy`LKw_D6)V}F"&Hq0.~۶SV4s;J+0`ܻ`= ,;UmCY7x)APRXJb ]:ӭVobfy}K/}w;\.w78_,"J,꡷j<8dwjm ^0lq("Eb6‰s-c5|0&jYd$5',+^z bE؀;)c*lEo!(n)Ohh{B6E>p{~ VOy^D=Z]77$exFɁKd9gvpIS-+7P#Z@u[G%}!#%fJ`- 3붠ZDa}o͆$sڞ/W=#cPG1/r~0ltIG4 ~_Q_D߾ Csof9c]Wj۩` ^-d DfLS|S!ELr9L  f4-Vl#fP"8)SN A$zCIlCV+bxя ԋ`&omЂ\oʺaVz ^oN+<==O>y- dj>b׉mR۰-HDZ;mA,ݾ[ &}t+u(nS X`+9t:'0l٢;] BbF CM eXn7b~|h=%sx:1a+!TPtpzg0M K_Ӕp2Χ ) 1Z <匘LnMP}XnW6лmۂ mkx~|F+6Նd2gw%b.bQf1TAc:v{63ija:Y;J58 Xev͵6h.d&D rmܐ*J1;T1(WSX,H%S4LNPn!F/K{6Nu3?0N+.ԧH)c>meYqбG9e(HIhU8?lE0]p85G0p0x!AbD`BRȉS[E? I>u ZAQ .3O ϝ@ \ĞlLd\iFY -ӂɻYaT=Qͧr,o%n)<^8E.(8xi~ҾQ ش`g+()EO3޲B^L:1 Vۆ 2Dz@T,Ĕf:8A kM+R+jxѥՠ5oFoo0zfw3@"#J5Be )DtXPj*^Ȗ8! <y Y.|C3<hV?95v/"P_a> 0QgLIc/} o޼|61*{ }e K0}(h:1 A:_s\mxxH=bl)Qm^TB>36oXtlSF43NB6$ :C4"2`(YDbydHQ@e/ *Be.~W;?'N1bJzgBԠ#?R;~ 7rQJ{VлmЅg }Zmw 5y: \5Mt[F?ȓD b5<=?mFoj52Á Đp>͈)yqXMF?'YvDOqU/lmN{V֚vXDԼm(8 $<[]o'k࢘P10i&l ^?TvF۶ VI˺awF|sZ4C`]Q>S,xq}Y4$g;@Go8/!/}Vb[=so [0 Cv WZZYmWl'mS)(v~xs21Y(XSH.4pM:Rla]xd!4L*sh T'* ?#ZvSvcwI`E m]?>[*L=#+D\5QPuaEיy#.)'dq/EPq$zL GjA"i)&oNlbRus ٧g0T >w:]bDN6țO3!! ,_s@&7šL>!M>iXp5Gw3/8fH/gIjQCv#5?#!& ^ym@(cȖqiu%G"\(ѦWY‚NE'~OW}w?O~kԿ?V<>|[o#)<')L^")ISqI`]{oC[Z1Q!D- "[dM]kIû B =L)dҪGCu-9j / a=+P'0ƨmv]=l]VT] lXv7;6l+A55kĺcϙlˆ2zlieuk>I`CӁ9MD*: }JCX04<=>4[ 뺠׎)FL~YD~|YLe0HAB(Ͷ)DDQΫ$з 7pٯn6Dpg@5_k<]HSh̆RI%)E BɆȭ!6Lȇ, tm$$CX}ۡƅFCI:IЁA<*tw9W+]}C׷#(`~1?FK*t/o}/տW_ԒzzuBqBz-%Ogιt ]J˨DcSӜd'|I(8pd4ϟcioyބBUU [y|},S$x"b3J0PU u9!Zy2ah?֎?m)mJALӌ3n7/Qfݛr«Ww8bZt Mٷֈ7U5ZbÈmFVnn~o+[۷ Dxmc]o&W\je5mR 0:o &M]0~9$,bd%%dn_E$P`aUjKRT,ˆ>:n/ML{pJ61ڵ< )Ѯ/8EۆrB QE" hD⦪۠ѷG#˩*ѮT~=7϶?x&\}l6A?[ƿ?}S_o?IE9N8#E2:a7!>B 8ںH,!NxN9>11MнTڈ(ҔXcB͉`[ڍ+j)PbҮj 00P@m&2y m']}FJGHָb*Zh~7iYk}!g]6N :PAeL_LsB)&Smae+V1OOM {ú#gϲI s> @FD0ۆ$˰L.|UW{km{l+(@"X;`[B(魣׊tݚY7ϳk2ww)b 8;Jݬ1B-2O&E A[Ͻ/Mnfդ1,Lkũ/$P|뼟# @=ݢ57W/uF37`MG@dA86޶%o%=#v&+C9 [5E9XHs)cRZy?;|‹Ի{& }H!E GdR2V};9ѵu97AeRw2IZXNd4p}H{78VN`X Yɳ j[R+RLȪڦN湆lW U=%84uO I}N{d1a@B4[)\lKE&.Ԏu_RIɇ ./Y0Aؚk} L>ccYn6w;oST6:e>bbvv0g_[p8dU"⹪:O6,] O B ߝ%|w~X::J7ioH1lywwgĔrL#Zג2bFw} IDATfr kZ! L&g{z~!`s1R{#DaPട8:2?9'ܖ۶aqt5 Ηy8kEc썻 B)2"&1k1Ir*!$P1+GU  V 66"mҹU@o'<׻t 1FffNw؟?/OvPmheUSYse"L!$yP8LBqau]\NӮx>{EMl^h3X bq4ŋ{be5+zG 3@sJF{#H_I6Ղwo@SB!Xwhlm{a0!Q {!toU;q#1"u DCshen١ubgc/;lfY!ʷ]}g>[5&#U/scBAoTT1M3m3؁)ft!|v[pG3t߽C熭; )vϠɭC칊lQ6mq]6ڴI|e39 MzB"P-dMoo?}g3YLm-(,) ~JSZ5 M˧dE?FVЊIz5p/IaGh,瓓Tr@bfCp #iJSBr@+׆V;iF]Wܞ`]hY<!O! D<28 aXyAp+#*.wHp<ۄ(l{SB`3rA8EAc] >cYo Yq>_PKߘö !cKhxDZj7; ŃSLy H1wpҬ% D6.N+_=>x wgAp>Χٞ)HϿzCx~|ϱu,Cq}afQr7vٟ͓_bì`$cÈuY p4:v, RlH\mXa[ur%BָZBR9%hL!b&`VఴiFh\8NQbfVik&KdρJqq#6hS`MiFSW}dNt -\V͛,{x?~g>+B,p }T*tmz?}o}??𣏾+,o!$mnקM['KH!J4@9NC$@LSEIB$sP&!bab"޻ D pf6I7*ercg6e |qEW  qYB63Vm2ϖYo>X5ưJ=4UC/ޡ:(9F3 o@!QDo~e`Mٰ{mv4ψ1}fn H t|mh f 900Rt=trryT؆aXx MP3ߘ`2Ph71Pug8d@{ͣёCuumC)Fs eip^F#HN lr3hrޜ9Fh!9Gb>|8beKvp0m˶B+L*'+CQ| x;=7Qw+M̎nwbwrO Z񩾄pl_+k=Mx';mp1r9b>6priM@p>'0xѺ hPr9׃0)!gk˨6(åv޶S 1[`7ͶBF a>:KOOOha|>[Ro+mNbʨ[1[,'Vrؾ0Do"\ցGĶ?4DZv)`bc{GL6) |4dYBH7C4D;Ϧ{_zN-=YSǖ33<.qdӄׯ_!iʸ?›7op\<)"ňy4t FbQrdV\W\q]ֵUz,u}0Ϥ1 .˶x^ ,1乬n` $~>O9{| E;]-)<[aq;rs@"Y|lNeJ<@\svi]𘢓 fy iC;ٛG5 ą3ПG7hyn?5MTU =i^2견xx|~7~cGookӄYjOiB())qbwopOAJ3J N'|駈2j uyξqXŁ=+^=NxI]NͲ!C֚|ھpNb./7jrs%mLۋ|u.=uze_yߺtU$ #;"(= Ѐ @?d & D "Q-Rlzs{/O٧ADd4Ph4Y]oչsY aëWa>x)^y1xw|F !&Gbx5r-X +%+Cx5ҁC5$uJm-NU@d 08 ⽧O, .+ &KIswww9+ҾZWTWIZ\5y"grDх9TX 9H) aG q 4t3:ljk!9F|&/^%"DM`9$fP !th"Y;S[u*V5OLks3r mѺd-&Pq"wʒe+mRKPbz IjhuZ7ap= ' (z vsXcTElɜBVBF ẢIa!ˆVoeE4݂arN !УO>Ԋ1gQ,1&f55 y P+}]!1z9QNۃ֬ZbB {FdTo[CVXkh/3N6ELlC-oi`Fcڸ]uCD$zkT" R)=L1[nцv ʹr]SnT#bʐAn !*7r tn(f pH!8z;FG b{X]( րq7:x88 y ey] P JeS+7NRw"D | {(naJ)> oKK)7=y`S%mAdܺm~t\0LOtox[s֪{7'fs:9 c]ha !s[W, yWN#Tgab"#Fl놻MBF!rW+P^jaӀZ7X@^3qٛc-BCDo`x )R1gBb0D<{v./Q{Ǻla>N"bfݗ߼tu!a3`PZ4F9|N6IW4bU*?3jbFjGP03mA#T˕r.m?ɨ:M~3!Rr3ΧGK#qL0 lE&;'*OgWE<@LH c śvjNx?0|׎u+0(Ji4ԍ|q9&6 9Y 8p3L)Y[E}q].(`>eSE"rvgĞ}8MqĺXmbǍܤF4HRrh,ͽ!!OOo~cg?x#1icia!TU5Owp|싚hAs8K S:Bx ,0n4y瘟uffutDE9N IO}ljm". !P^fv˷ҠXecCjAsPm&obdJA ,bL7NN$4pxùkPDI@z@2uDUBpgj,!.Iݣ-`B -+%=#C[5/a|8ŔnE G {/ ;N#Vaa7 *qx^xu2N,!l.([c4ԙx#⠛ah H9hp:u]I0nh;νf#{9ia:'[uk1Fq#֑r$i!DI8#eְn^B,ccT%T} q,w}M mZHf(h擾"xGg^8i&H<Otp .3|z{~ 00~w3wx={!%@:)pD{Zɴ_)t7:DjPuxo z{,ºx)Z/8/4Hh3?tE͌Vfu&18Qxi"5AGJ;GS:-:b?r cֺAo?ӟ=}!{kz-DB0ĐSƄ'wd*3f4^FC$ j5@-f0ftX7ΧiNB/S)ֽ7ֵVGwjۆPWܣtyĶ9*:9sI&"r9` b,ƑА4z L㈻{6m8z"FoF~RVoT)%Q)Qe#{;rd#VKo]l+L8ohm4pu\֠@bZ7- u >^/A@{HNeԈ"u1bY89&!!CхM8 5 ! D m OC=늾RY}078)K# IDATH7n CGzgn 1-$@Ր2 Ze`Bֵ*}1Dƨi0R J-| X{ۀx3 u`Hbiָ彭A)we|7̥đzaQjؚ|"Vrss&3lUf;c톺l h >yi0 #7&UR&1LƠ̗L^;qM%Zz`r37z1L&Z5r*qx>W,nOu!A0 JsmPi! 1D\/3+RO G.DϚ a.H?jL8 @`ԭ067,JH6OGV$ C2r Հ! H1khMӄE-\}788]- ˶J@1bJ@"CO 'lJlNR1CMDHmvc׹S]ˀCJ{-ya N7O9S035̥0T ,-5c `KǻoC&ԲجOZ"HjRtD. D!90JI RU kV BJ*,bFm UR=,PD r ~wR(R O2Pa]H5luJSVGXk^P6; 1{4wySRr@F qm. 1&u]I1ebI9 m% [Pbvz I[M u[{ ƁH1a:Պ\ RNq&\̰.+j 1Eks %m u k웤ZO`NG@v!tk=׊(Rl ^Pob͖yVߴiXe-ܤ![AvxcNvZCBaCE1Ov,H`6֤" $(`)6C8?x+s_T;?|.D>ʿ7o,=y2tQ'?{˿-^?I7!)q.6Ci 1 :1{5in){DLHCh ݺ(t!ٛ4 bQ7p ߠ5D6zo1)En,znob[7,mC6l⛎7.cBHi/~e8.amNҎ|?tvH4(n-˂;6W`?*ƉG=Ao;`$ңxp},NiJ !]tvht8P J?;]0{ɉqe|0i1!qk2iq `J $rY{8zc`jL L"v+f֊V+07N;_|wBK9&?= #xv"[b̷Nb XNݚlMJX鍭7oj II=_5ӈ/&|*^wG,|+;hGa}M$iK3V7nF"ȭrb>}3"iޡ1stϫ:k';*CۙomcwRkg^nz7>uYn_|a>p0U^GkFY 6FzMRRc5[jGFPq\' jir „ 8ܠln0q"4Ya"~EL@vؔz6cTEL L%U49}sKf[W8|:up\ѶJHu#= Lyb,~E*X40V(ň+NǛ4vq:ܞ9{SbdT<.q?28/c6Zϙx6-^! utkغ+ p砒Ca ܀k@x um]a ,д Wt '{Vb[O=r]wKzkϾӏ?_ޯ3 JiK闋Σ CzlNs֗W?s!uA0i<jbs4Ly^ hRGj*C :vk&*J1RTU݉-f׷Y һ@RJͤm*"*!#нq[!#o*)=$v 63S6JJ-=oMvX7 yvҜoZěxCSvq+Tkq/^RE?1CgVqĐ ^+j3!%N[CLB;`ZO|sJCp/|\{Pps|/`TE|L;K)wn}0Z ljU`kf)#ZPo.oT)H} )fp(u*_9zrkX o޼>NHCWnýFyxĺ:mZ-Xm#\+;uܨ3$AYCo8wʁiÓ;yy!(q¶u\וn66OBf̉Kôi*Ü23e ]gz`Tw/RbL.erUn. 3&u3#+^? !eHݛ͹{#cxn.hY`%VlO1ڟo$fs0vGS)JB944ag=]ւmWJE+K`lmt0=pf*=Y{N}6 +DvVͪ0[aX!l Z.KO}?lwx;~3?7^hъO^eFyTujR[B9kzxO`i)OҨ! a4=D4!!pA" MD4,Q ba0mS֠QTERLS2كeu*V)]J8D| !M.=VNP xڃwP4p)"P!.u{4EmD@n 97jb1k)},H[PǑýb̡*io۞HI݄_n{|z^ j ==>R+i®ͤ@zw9/aI왋jp+:bTm]n?{y2#GXV<*cmCN,q Z-ކ2Zzko7*ɊerҿT ċc3݈lPo4 VƂo*ZɛK'v1oM}Nɭ=rœ/W<{z=π΢x _x=P!`Ħ? LiI0^|)YZ zpjA^*_a{CNKDɸu-`r1 4٭uTtH +fD w֨ Q˅!uAXa#8P/>$.e|a>pơGkU{q}L8ٵw;vMa2MqCiO5t/~/{ëW^5C0j6Aq)= n}uTQ$zuJ! Q1YDHsM0T1̋F>v1To84f P1@B9s,:cL^S+eb]1 $RtJa۳I\ 1ߣJ,Gb"rDJͨ MZ sȑq0;1xKo꒝beHWYzn(z%BoHA{Z tq3eSAkǑ%{tF,)MXw83S WPB$0ygqnru!eG'{[OJZGVf}[bT^o9kڻ)YDŽ'wG<{)'ٷܪefr-۶, Fv9ayC e%ȢR滕7ۆuPzYHMl^Ro "k.f\Iw`wSQq]Wlbn7{sQJIT{S]JwKGZ'$%n5Ip/p&n wӈDuef1gޛ <0Xv6n{5sBpߜf ^T35cB&߆ DDi}i%TaaʜOgWW8H >K~CXW/o3 8_xx|x^߸\juܷho* 'RVě݇M?# iޓ{ )!j|+G̠'0 THadnVK=5̹礸pֻ!?7tg)P p# !gGbf/\&klSضAqksY'mзv'^/@@(eCwYANi*VTwifzvz`̞JmleŶ.O ~י%]v" Q#RVˉ! &FKx+Fn%膮i+7\fOb3>ACrb2ӈgObgl )b]-D ֑@-[x EJGL! c(u+X{Q- nXEә9}% $}ˢ7?.g"lR C$l|m!nx }5\*9 L1Ph;B)Cb{߂&ΙqDJƑ|k At|BvaC~HZ(~[u 6O}{kCoAY~3s: dZ{)>`mYp]CSvP`a[ <{?/8nL%0|b6T@n@&n0w GҜ#ϟz0$tf0O"U bx2}`,bX*eG c23 E)m#|LCrҰ(6ZDե$.˂UB Nɞ˂t>46}871@n{i@+e*7ZgB$Bj3! fZnC9{0 Иp:= L0W#xc84kv4( Fjս| Kk<'=K5_!|w[ g ?NoGkϿ}SY=?˖嗿~K_OC!cF !Eb@f=\Rk01 ¤"9j;ACP" nU 4Vs?H,Q[Z=!QV4T1H8*R}KȟkB6|"†e] H=@0ATU͓Uߤ>Am4ǘ2+DBxGN'{Z `9 3̀uc<2NSb-+W!iIJ\[bD2uab={[8n-9aG0 C*pz|&,mE#aH j`Z*'cH_YpDK}ŷU.@ !72Nq&$UH!FHN?΀QZ;7Guu[ XCT&wwww8x)@Ҫ0 .t}+i@( '[v ;*do6Zƻ6 Ij (l.oz.Qn~-sc) Vcpzޚ;C $w鮻/xK@Z<$f~Qc0|$RrI/ٺ2p<ͣBDJ3qr30C`;oA i)"HI[Y \ylz5D tֲwaVKzka[ra4Jც=fD04`$#Lj b&|O>f3,7R6 C:XXHVp$^ݷ1Oﰮ J-N1#AVzmW̓W,B"hxM\#1ǔab0ygnJEՈ/^e6b?u ,Ph HJ9j)8-^/~xG_eYpp˻˜J3ƌ!}\ 4' a~*VFhvev ÐQJa}2e+妄0p eOzfofwrK)X 9'g7$16)!6;x-iFs&2#x>x?w%y$o6v1 fQ͔j@D4 !ύZ{#>;_]1KHCPn@[qȊD_ѱnucVx8sݥP|8 A)w399Ұ.Ļ D(? P*3:aٽ W1MRH<k.6}$Dޱn+/ /kehU{l0'OxDY7'ٓC/ٳn2Ayf-6t ~_ɷ!UmH˲R"ٹ%ФTRD[79Z =`W6LݣKQןxZ CZZ+~SVKT\K) e)2 )W ƥwʷ-OkTaZz_*RZóg nej8xiʆ?<2jAN,yDo )E|AI !`F3iF 4 ٛ0oҔW ӃROQ{JMj5bG(7ĽqhPZ3bl_EW|+b=9 qrƐ)sʼRP(S@׭@2E YP3Dy4P(R[)>$A1Ozu1kV0GVV_a0B}X9 fE9=c{Vw|J"o[m|Ϙ"`'yrfيe!9U|;؊*^Zuilf(f}K}]j͛ö7|>/g>DG~&/x;3}o>h|G'^>itY礩Zk1}>=X;"I h"Ӄ ʯFskV ̒= %`C`TP*CbH8Nә :0 A :1r3-(xk,sـ6%0)$jg]oF`Ɲ I;EU:johUі{+{VX[kk}^K>_f>g\nY矹o~~O(g諸?hCA^}{O!o'W?^1MR |/Z?)\~XcwAЖ}9~_|av+uYw.!pSxw&2sVW9 9oJz5h8otcػttRk}8My1L{B*e953#I"̇m4Q v9h븏cxa %{P&5 9Ü 3=B.3KlP 3CP֌ 1xԚֽO)!a9! kKz\̠:'<{vZ3OpN񕯼x0& c3\]#~}s)a1pp<)CC@B( `Đh&uA%y5^jHe-1fcZ}G)/DWt#$zLڽ~r`٢E+"f j,my?%!};F6V׹ت*`Mh ~0_#'؟|U1\:1 TH1t`F /!xx~I&'!z !`Pp{J*{ Mn~-q?c,mLۡ-9|?o=1 UU~^i˼ y`x@ ;u8>`.# R*׿ޙBrSy;6+Ez-bjV0 XB_]s= du]hH(`6.3%*Z{SڑrZJb8guAΗ3.3~QX3w":6R {w';a&eg1D")%Q]*1n`6ÄkVQ P*qz'KC" % R 5ⷣ">1}@5e25P aY57 YS{Ӌ`}Z+|Z;U98p@C6JkZZzVRjj_>wg98};п ~wp/?ǟ~u̇CA*>wOG~_px|P[N1I.^n8M~vk `vf2<\8I~&mYV3[XC T̃7c|)yP0Sz/}I)+fЏcG-`Gzquu|97Ĕp@e>\vQZR@Ԇfy|ǧ\!L1uu.&2zerMaB_ng}îDC/p(ċ}@mk+Zںvq>U祔Z8v6፰ u]!ڥ4<ޡ6}@sS5 i֍əx 50|6.93ѼZp`B5݋%fU3fTEPc0jDJ`g "د'n~6R 0P,4{`<̓vE0i:"Ŧ%|&`1; kGɈn+Sn6dkG8 XP[mx b?A^i7?Y^sE HtΪjS,OLZB:PҀeR !&8N b8x3 7Rs IDAT v]q ~TFH/-y/P?{W8NryUz]Q ]D5Nxsi.x'>'iMzCFLʙvJf8NV9 Ydvk3@ ! PR YTP Sb4ij:va57 S2L3.01W3nՂ& R-V@ eOBRFm#7>Hv1eHXוf; cbxxX+I*bpu}e>dv,벇%Ze}Ŋ~OWC43lFb_Z3ӯkVo2VR|\S</^!7)þtU@x-+;`je`4bç Qr|0 PG@uލFtX8A)5g?Lzx ZTxxZWHueC A+`赣Ja0Qp\Ug4l9n8 ۬&ugmRce^0[&Q8j4+J(Q`xO[v'p:R8 9\}ۤ޹Uvn6Mzaı.#jMQނ$~@d3H˼wQ͢OZ+~RĊSghR+wsC@ɲPKhޡ/ÑycWұt+( /T&qLylY(<5qzwwVImk.T(Xg^}teU9ƼVah.fܜOHɣPJXӼ"xH#zy^`>3ga:#1F\\bz͛w&H}25z0 sy%{ORJRkzGIge[6 38ݖQ;I}7{_rq%c6˹ nY oEUo&țE5g%+M}TpT=jE~_u"GYT+s9sC@áOjɸxI*=#JXG+gjT8 O.ujGn1:8%];zBxDF\jwurOljZ,[2/ B'mEM;! O#,@XrFXS#"cNNaFBÓdKN\#SI@#'|yI/NH͔]C&b9/,|yBɤK3.;÷2_|(A 醵u p>?! '9g|z`]腪[XA-DCFqd|u+%"!\~Ɇ%g(A1(Dc8b6P[Fh"d2j訃랿( 5#ńuYpsunX\O=2X^lrBZa#16=FHs+C\#x0ǯaI>@'w4 0F6Z8G0q^v.ԋ) Z*\Ҁ4NX\9)dL1/`3 }s1iD.Lײ2="x B,3*4X !|k\k-X56'\ѽ.5<>xpG\+}*;wl : DT8xǦۥ-cꝐק+ `.! #DrY0 #H"̺0z"Z͐Et9$Eh*k9.NPqDRs.@;NNG_9Jͻ |[-|p>>L ׇ7.ntw6n_'?Qo%UV !EZ]TUt4'nt~<||v_ӷ=7_|OʼnSp'K/ Kc|mE[M| v[;:jća($xx'[Ρ悰wa(tR^uxPgu]]xvqے^NB)3m&+spuZA87錳N=)O39(vi&)PRKLHV] }J ;1+0)ur89cF,y[x3rGR\]_8 ^*j%YE̺`eGa@+j&'[i8@J툑eQk|YpHV&+K)9HAed z9Ht%EWӈBڔF$'8l0@5B^9T%@wh sk{l/x61jࢇ70Nyb> 1x"YabΫY: uE^H՚ x8MUㄑ_ӕ2¯!NSZ+b`p$0FDUN#W"gFTXloي4FHUetjWW ]EWߺе{']މ8߃WhϪ@ʻ(I2O~(oc˫@^[M?\n׮?xOk^ߺIw< S-u1~V{ZBH"AU K7_)W7<ϿDdhC(5@.Cc!!㑘1X]4T!jJId)prNv&A6jn.We x#"WMCk@ U30=JS:q<-H!nJ+6JZ|X{#Vrh6E~3(L5EBrkL*=%0C`h}'DhL$J|Ð Z J.VI[heA+~}m07jb T nNQpe͙uYP]~"hwYc-gZ!.A >v@ZѮ*3}5q]zRZԣu.sI߇;g׿CAKDTUep>/GǵiYH0xcI =s 3 _N q K%ދsMwZ,')F.h*8'șM<qX{p5ʎkkp6tjZht`njzۨ[x|&RslZy󘀞HSPMWlkJTu͋eĕ+c7w&iV+3[EG0KAΛ'`HU<>j0')R 5bٯBB+ޢZV 1y !̗rYQKdyf}oFX IaDk^.gT5H>_8ERDD8!LqxP=ئe)ݠ5ge^2񁾜uatBk!G…fۦl(P1ׁLѣ;T HGj>B9"K]Yy`#!PZ̺x&MC@cX3s)t̸?@;|PsGo˜"XTmЁ_ԑ{ٽFNp(Й!C(@jo1~C;bdŀ3fDD"R:=!I˚q}wcYZVhYqupΘ7Ϯ-gOIkZ aG[\V.‹B"b!ypY c<5Nlyd+3 F80M1:Tڠnϔ/*iލ0;;ga'و:.:i@Y DH"782k<< ʴ[Xާqh"@Й2թ@PWFuZ3[Johų$ dhG69CBL 28!l8?=kB. 3DCU*zk(v{ RߵAWJ&JiɱHޢs"%iC^.1'Ht 6$]]DTۚאܫ)-tS?~[ ~C?A_}v*>q/>wi?M/ڗڤ-Bn,q8[ J{89Op=7ݟ~?sN^>?"{Yk~R; zUВ;EL 'ۈ@HiӶjnSّ %뺢uJ88 X.W)5#[6 -mm(eF 4a~H1!8JAJa^PtU$DXIg)hhhAvTE{ELɞUJW#'"'~9X}9S%UJyimD+'9 FѐiL{ok^sXLlX"ANᴭ|>[.a2 JNtx>5JtoUo&0PGzYp> $뢫ZE%Pj~DĔG^2D% h q*s[`qр#\բ7Ԥ ^L.o&̰ja+B ș~'oN(0 "+],KCP "%g{@CBBVET\6E+l隭tGQN殪-2|T38y1Oj'.茈(Nxx绨 YM榁1# srAzv4$8e#J>sv,c`3vvE@d_+j+*6w֘5R@RrQ[6n7`mPkdJ(>&; .swss|̽5BS_"ň& -O֣JŘwBT,(]`;eߙbvB˙NIOkʽVRR#?ZQ형 #reLP)˺G`Yr! IkCkK)a]V[RJHiZm" IDAT`aQHC(U] .~Faiek8@ 5=AKA׎bZ=oMNqɴP S ޼ 'N;=JiH3vhN֯d8*j"]>jӬ@wi8_~&^@^2 boCJU.C\^L)X4]ꢖ;M)IBL~("Nx!BH qDJNSkL$8BCb<*H1FLv8aق-J"PѱS;-8yoD[@XҲuŹW[xf[CbWs)<R1tAA&؂r;,+u7G7(ޫx')8-w"uǜIMVj k؝_ڙXd!@*{0X׌`s3!3`w Nr,cS|?Or1_H&؃0 )[T" M@I7s?NLdMadeYqY2je]2r. 6{w#] 5)-)\,hE{ŘyٙK9- g"Q;ٚ2_FK3/z̑4f^"X2۾}$F0vW`&Sr4}Kag+Vd!P"+Pe^({RnEgLӁPkFg/^gg"\̇l2~00 g{ HvV q@Rx׎nm]_EP wWjU+{\QEAsoxh?@q4暞]jj'g|z_?=6}_&qJM;7?PO.qs7]yW?8Skk!㍃g. 7zg<8?v>7_~z}{ei\A޳"^UtlMe ~#h a oĘÂ;!?N! ;doPeZ.Mq@Ոj`V[׎ PZp+ IҿanEY+wOFvi,6?3{#.}-a"2Se˒ۂ;ؚ)C팉(8fK6ijEj8L"3e.q`vs)6\CNd8iF <`$fw 8T2/sq (I+}i  70 s(ˌ/q!Q1 =g\E BLZEnZ `:MRB QZ 3(Վ.\ԦǰP|a⤤SPЛȂ{oq!,,a,(EA+ p$zV-^#RI '^N,(V 9xv};~Ƹ,z 3,l9G)OpБfܞwWuVb$@נabf<{~{`s& /$n i$qM(uW w]`>]1Rښ`{Nn {}W휘ۏw ^%GN+g8U/9w[uUq=yw0ju .y4t~ΐmt~P~_)gRg#{/Kc'C:0Ź>T3'rjRZk^Dko5χ4M8ז.A$ZKÐU]k<A1$[ euy4 Z-$w%T&=g`ybi1:!De zh#AH1 QڵZGeöz׵ܢՂ8\m@uJ T@xHc֍ߤE$z)1, qg ge5Ld6x̓ :w<OxW)0:eYX{^K:o~D9ޛU$6a6`h`А =PcjMH4)h̼`8ـ͑4ɮjf{nwֳi3.)!M?z8Jnmsũ֊hש/`pZ]DvĠh0h{A4wu7R2a*24Oҙ\}rPɉ{9JDjm9N~OxPm`ۊwe?^yfhۊv^_ cw{1ZAR?tM}Ò&A\L9'A TcRb1:?W@ ,ӂV*@NVUL9q</KLz84a*S 5C>Xo\UmǗwX޼ys%N bM3l늜^ AŻ{ QSx@OAث 1ǻb)={QÔZـ~Q!9!IN/#U?h>߫\Ѫgy{Aއ!Σ| @J2(r[7L (!eYn7vH)"Frfo~Ehח'B^^^QˇZ0 Q̃Rv@׆j|DԗSӄ8ѻ`n |Y>mNˌi7<; ܯ+}N[KGueD0WIҔw mz[4##v0uw#|R%%$ sBh4?==a+j)8]gAo J3w`cQ%\? =m;[3\gG+jm8|a&ľP3miY6k֠Hi#9;"Վ >'AMy1 c[ʋv:e o˴߮SYa?x/8~?_?]<!?IC5Ƨܶt޵V[1PXO)$ "-Clk-y85÷p51pqC|enG'^20бnŷ,>Zw^S=gMu~@>h̙Ip]^v^I&M  ^cw;. vsm|/:u}:[PnÀ(b]o›cDC^P~y9@]PҢdbL^|*)a_y5U h;hu,Hsc,'oPb[wxZE7o~7ZGγ+->J,U@*)E9$1t8b8{XZ!5n!@X=zG]ސbP{ض#LW)qbZ 0( 9cfLU`@tN:v,d0ax1%*"hF;; ہZ (N9I Cq{v~Xzo><9"iQI+abBJo~`@Q+ѭ0|:-Ô(u^W> 1N$h`^+h@9rNT0Bp*{G a$[;yhn aIsƁ/0㔊ZDQ9R ¼b+$va:̼5AYCHhV҂67|iAueuIh]o (dus#􄿻?}U9gˉPHLz` {V|bEX1yzl\?AxC%< >g?_?O4RY[0 ƭ^5 "sa1dң"aH D$jXHE]cr9˭`{źPH&9 ^ aV[ uE$ak>kW̢qnǙUkbYښmm+16p]oy>{Edٽ2[m;\Yί؄5Djp7J +|Zme*1(abY÷geiN05PuL) *yPl/3G(@eB˞m]Wgq` ĬUN2x0>B ޾{iJ(߽Gy97ogMaTh?>ݳq9''\h4/Ei^p(1wrʙ1 i`G¨ oh}wd)W*n lm9O}#*m?p{C:~TS۾cIUM Vc3̳Ԁ_} 6ж<\#jֱ,.!Ћ*8}N"!I_?"~ uC,j6z2io5J:$4xTOJH4z}f##=u~ea {H)'Ѡ"ZBh: D{1?o0& 5UVe?՘'8l:aQK)7ꧠaa2 D5f=3ᝈ8@nux(  P TX5q:-5*j<(0;)XԐ;Ю+mFHrFm788Cr4G/Og,!t )}}i-9`+13(AAs{3N@ә]݄yuݱۺێfU$if/dcF?'zc]zlVЬcRwZtkE 1(%H;Jm]V1AtPd|Feq !+9g9g<><8Aq{}E+nW*^>l(f3;A1-47n}'@vUO Q,{o쎉o-ޓ%T=vLs ͸?~3L#M  3A4A HMDT5"IЛ:ڑok/cmo9J ۿcא<=x}~~Na=\E MPa6t+4Aۈ{"!qZjݴgho2',Z}m!N&6ʶ";<`]`c0TJ0ET,kƄaC zU{I3Qm3RyQၑF9̭yc{r'K+8D!BA=zʆ!`3?yJh5F*p;;aJgk "2njm!<{p_F ?~DHT7k)0@-3zC6wF^at IDAT B('Sʈ)!ycHЄ1gƖe`'~|v fW sH]0Xm{ARY2d6~kV;RaƯFG~+.WD&LENTI!J  @`jJԾ`^[ !)gaݕ|=TLmt>T(Acyz/bg 5˄8M(X\-{Uuth+)̄f)wQkR&޷Q7"=lSBP.>pm1\$!Cg >PG4qA9`: NDB::{K3I}ۡ~ORNְN0͇*ɗ D 󼸥6sqxg~$^o7Z\0eFnmҜhKŎl0vYJ2]kFu, 'RI !J{}]׌ARn|yZPY߷u_9twT r^GmRQӒ]{|M eL NҒ/91^U̙A+uLyF R0ƵxKәZŔbۊ/dq/AGEoׂ*<_ ͉1]}yWpcwM ig^He<,D1 yFwػvUXb“|gyx=)blOtQ}~]>_b?t#^/{7M㥶0ʾ%=Q'@nc/yT4iKm&2d:e 2_(?L9'61Zڎ1dhR] !@C4*$J"Br#3|oR1 ;F#hha>>%wB n YN1 f bSmtZDQ JXm$zX*|pōDF$8W W"f#u6NZق$8GԲv},u[gNJE7~V_>]ejnU1ƺm+wպnƎʲ糖@с ed<2^(Th0r$Ty>T^y8!d̬dhu%MlZ!zջ9 fnUzZN\-PKCyq:_IT ryrqԃL@1OOgAŭFFݦ1q1z ;'S؍!bʬ8BHXb\MVȲ1x0”̽T#ucfkdAX*!ǔh }4?pS+;jEo.ʎ?z}0uT#ﵵu{Es 0 Pp`/g {eAh+pe[ Oy&n IyİV\Ώ8/2_7懇 "$F*NGA6l|"d}~2p>$ $Qnwli>Q*Dֆ mGM%N4]Fs[0$ba{Tßx |[̀?_h+}}w<~~/kw\~P(:*/[]\~`]f[Sخkeh6 ]^6죞.o5/@?@ )zw_|ry@o=ZRk}Im0ʄ*"-c3nd_S_pln M9V.6aS7ŷͷfFPRmk0@Sm`ܶoT*0+6 i )js{J a} NC0 h}ZQP֟wjG' <{Xϰ+~c3[neUT0N)tcޤzF(HͼwSC@0@ !BkP,9~1%WMmۊX C˲f0i,7 PڜubA7*60DD5.WJsD,h;ħ ;>Fa/+Vq954`Hu+qp41$ sfEsIAL>GK[c?>#hTAWۺY)%NWs;bk CAm 5a0]jyZX)S*eb 8xd9_׸<\ 0/3o"i_~O=ێ_|Bk!e9ꗿD OoYYVZgJm"ӌÅ9$N>'>Vdc&{PjZ+j/'Eqt旓|_c J586i~S >yajiD%T !M gckm<\۷s4}ّBmRNx-}ER§Qk/6І{%^BfEXG4.IrrksPl;_<ֽboە9ҡ0F# jT7p}}k7콣I`XҺii2# Vٗe/^iaPOIsyf0AD /FktH6Dh:W1 fF_~s+~O;As23?<~oöo'Kٷ1Z $\Jڰ (izkk:D-vX C|lG  a_Š fF\J/eNӜ<*JU5f $v(| Bȇne/yPВyiԇZDV;$Ƴý@pD5RBWkEpQ}k(ێ֪gyy€aTN@|XqP2-q̢FX[$@V UsFT~ Bas&HGEڃఊR˫ *.3s 0ɋtIQ$p2@X4g ˂V9*Fk 9`nTiOk o yFit 8pAq:H<<:P3F#tz)xްNuev ;v߮7lۊʆb۶ 4RvnVMp&,1"hn@ma󃄧%u]4yJT)”3Dy^13J1Ձm/8yxtkdoԘ(}4|@`Gejm4MIT1H9>K'̯L1dc]Yf<+0p-,d:i&)%f[Cgrlmw˯Z+ 1u#ŭyX^*T.}!mJT(tW*ɳ*+!/=Գ"Z cBkm*̡y*}K1a ҐCeYsSǟ\8qp?u"O ZP_}bk.<"R`ǽsMDMGF:nϟ}cF WS63Q .ӂ2{)#V|N7qJ/<< HVܪHx!3o B^vU'/OtO1S@mۑ$E o5DU‘J}aNL̎ԈogD7z~󍄗,K+)mq<ΪWsֶ4)ԋNMd[4=`"GSdRT 2Iҗ+jӾJj1erFo-Fo!h Nim TZo$ڝR2(Y&n{k8|:XT 7 ʲOkp '~+$rZ 3% nq8Ԛ!yZFZ ƀH60tÛ )'v~ nwY@VXe;駷y8:zZiTFS nwueꠍz F] h4AlxPN(p0/6c 󔙟I!)mvݚ6记SA)GBW9<9DC%#R+*/ C1f k%?Wˆ1 1-k`_W3-e@wʐ}/N0 q;=|@i))> Yxd .цڱ` $SCYLföć, DTWt36HB I3߆uhN^aQ<ofɳuKLxVv)JGy9Cr9ߋk8GJЬ1԰L z1C 'jUۍ_Lx||zgTauC5~*$P7_ ƺ 櫹MIUa0N e {!̈[C/e,mXn'] B۔Ӕ˿֊9gbs+3mBm1A\Ԙ9)4ϘsEsZNa\p9-h&x}y{ئ Үs[x ,< ʨ"H9c4B†r.5`: 9Ee`ʅ;z3 @PJXWLqBLpP-zW})^__BN(`"x=DG8!Zhi 0 Uqe!nœx_ifr hh^na~~N 㴠1svs hy!PpZ0e^3 C|%s+nnQ;I){>S eSats8j^&zuZ&:#D؛ASƠB%1`#J4S!aRMhbzz[)/$V~o+~ ώY<+_L믣axvo|*~򿌟, s:MqznJy}r?nk\'YTT$E{JDOՐucwTCn~$f( Hm/5Oy<\쩖wnh*:eѳQuj‡e-fP[ST\U1|9fobߛJ LňB}C6 DxhV n{qg']` D0{n Qzg_AO7kPl̔8AfHtTPN{]%` @HJ;,ۤh2UʈaQPwbcP4kA1Qn 4evk/ h*\䔙π8 ڜ'ڠƍEeO92{l44$)h!zgi, QջoK-*<8kH! ){G_3˅!̙ "ШV:^^i`+Q>]7 3R N BhZBHYL #(!Z#& !Nmդmcʃ-߮k D 4d pu74 LQ/?zvXkTٖe!f޿}V3!^r@ 6Un~ N3~ʼnRy^߬h Scc\.1b Ta+z/8-'K67g@[mNv QD.D].P.zG R4vEuL.>ꕖ]#UYq Kw˱ዚId*s1!E3?)Dq1$.;$ӒVbBg G/'YErD3K04y=CVض?*KJ(at₱#kPO<3ރ[(ʳ@oϘјqj_90P4y ~ *{S:". .}wc}֣Al z]dq FTB#1$x {$LdXLu{I?u[ __ÇMDw'{ί=o׿^w_\G"uv>F.z꧟=;w[gVs唎.64"y;q Hi#E朿:v$C_ }7IJ"rʵ6k計kpYhRGEFJ^̄9' /RI+|zfd*2xyf'A{gg%ƚ!99j3lcCm9e,Cӈ9%ύj͜j%%ZAkS^3^whIǪ\0]Dv)+Ա_i@o}IjTa-J"Ua njS*v0cû7f]Uer Ql?C{ }tLvV:ʣȌ BZYRԻUx%tRbSF+b#5v}XHqéTQ'o TaybuLjCB#` Q 0Z|[L,Y κ;Cyr@l9v%<?c5[\$::-NdDUK)kVNRf[ }߰>=6ɪkYoüӃ)~Vk0,J[ I!RHG5 Cf$'ky'|YUnߺ~ڠ#R.HIKtiz-jY  P^{V@R+Ջ@TuF{z'1xcgTmj\ VMߩx6§cXj+!N*8ltRg|°٬YLj#34AЌ>Dxrz.u0 3Tc:>W lP1iTȘe ,,~#T!ǓHj#Y̪ U8U7DL@)%ih]_Ac+r8fUhCgT.Z=v$UU$j0bAZkB>AQc@DRTfnc'_иx# 7x:zE%xɃO>q·t|w0PFy1$ O9n.+w% iqlfr.7 ,2G$D4>8#Rk*cz#3o8*e.ܖ؅Rs뻞DkMLBlY9""ێV.(J4VQ"X0"fWP֚3z#"TanCo4Q@i 9g0)qlJ)]#Z 表Tݒ.J[H70/@ P[=5#Ǭ ZY.jf:tkZ qċq<͔ (9tTk RVFRf9anUKF5^QiŠoM03rJ G4N?7@ E`Y A):.b;lbښj*ZY2#b'l\Uͱi)fy11֟)Hh{. l4}C'7V=1tzrfjje 礴[Eeficڟc 벖yt3pQZbI 8-96m)+\hϒ.Q9Wts/m'TQ[h 0hNRe"Jw8xjk8;;vEkcqœ -SDO#ҬɮPsF=&{A)k]qvv1-8vl igV2~##Gtz MDZ j 8U[&.%Ŭ徣j)E໸*rkU Tuf48ӧϐRFZku``6(NE ܛ.rA*/^  bP炩iNuj:y2r z͞CZ-њ}PDmrJ%u9vm6}ap.X/RԶ8 ZrFj$Ἶgdj_9kȞ+[N@b/_x>`Th}$ %λvUw(U+/ڵ8ZK5jvxI~PT]VnԵEw;{hUK)s$d]"[88o L0;;#óG΅nVj'2QjRH)KP(2Usn%R,0T_98Qs8?}p~+6ܑ]_8^\>s}9^ >[.{4>Zst>n|+i'~Ͽ;>|Ç!}5!r|}8 q.؎nw[̓y(:!])#>s5G-{׷NR[fw~V+;vMDj)$=w]ICJٶb"@LV hZz,oֶjDX9 Z8/fw QD`j sJZFjYlj&|[U:-tG nE4_x]L!7. c*ϥ}p9 wPЂ=Z)80#.//!U<;@ hR2Pi~+|ƀG9IˡnΦtPך=\{u8۰_*1 `>k1C4"VKAv0f49AsQk檝vQ Vb=FKӼtTf +G>F;).ۺ+N?ꩼ;‹/.:~z뚌V¶XXun#|RӂӌyJ ^E8%TKQPsUهq4jì"F :Զj]qEMLnoLY]v ]ip r8.U~u&8(b2j058;QYx]Y157e]D 0`(Vl0دm6Ula9V#j\yuӈ #RHBZTE}ni!jaceiPu  [-8"%4Fͭ@XD J"W[9χ), SD-9jҡȵ]cIɆ@69Jh $*~mƄ{n2;&`oB+:oǴ.U%daN :T9U-CN0Ԟ1 {T(h~"@J ,m@6[QWf ?柤{˧㸕wwo x5-^ .}ާɓ[=?/o=wO~v '"Wn(4_~ߎOo<4n !t8·( !9DݗsfŎ {fS$T 39^@Zm҈k"vS (5!Pk{mlߜuŒ]t`f 掖0Vj&ĒǓ*Yf}֢<llf0غ Mދ׷nՑq1M鈱l\=c'q}n ft.$C+0'vѾViJX]L:|>ӋY"u =Zӟ޲^1|YziҌlV5V%)٭wCjtc~}gю_4}Jp(A{B6R!a[Ԋ:af$~UnKe5wVIٯd:v;C761{oE VFm, z8tb6UN-V+Y.%_3ݾx}cAF%Z[n\g@ T'!:ck.1Nuw{ڽZy#r=:Q=/?_g~z5G \<GG᭫+N_ɳ}U)-e^̿Oal)9Wxln|6s}6̮9MIn9ޱ[Gn6NWQ+At&U$9EZwg5mP0ūٳO Y~bfͼ]0'#z5[m|3`Kq,C*,$>͓ZJZ-rYeFvoV!Lv݀81ZԲ\L Ar98wa*W@v8rf4x./c6Q%Qc[7*SǰT5#ζ6vxB<I4a"W8@VSx:joq%ʜPkAYs2"Hi^VvYfRm6IEϻP#qPE^^On/;[?as.j,jbap^,;:%4"MnҝCN#J/R3R^<'Sز]&6$RP*%B@bnP"WLd=r-YDVo944UʔYp0Z=㨃p-jdw& Ҍ_}8qC;+[Ƙ2R@S'n8jIw}c4S3x]@.,\}{LSʨC}߭֩xlႳk@UXBRڿ]IJE9 tHMmT8RP5je٬vN>PI!CVb1lY٫#@ZRޯ`6ҥ"N?4M:(L{9vk}?SPh LtP&ztѤk{Fg s)@mPA[]lGzh?6&CzKu'QmRP@T:zV[х``_]Z3iz5h9AI]Ÿ#8/YY(_ݔfokcwzp(F#MJYhyp(jީk;t҅(MP~%.Y,s=Us͵"b !ۙD;s^jGM|LI* 55ófZhd IDATP"BTQ %N`],fáTdy9>TϹM8/e&'phU /.O>ţGMyJ5 * "@n#"yІGoz ܻɸG߾+_Ç~G߸uuwvo:wgB5j@c9&`߼ RvynB SJDNDfI̷ }\jLd؅"yZihxB;Pp|`dshP͢pya7 d#Z i ϯP$a..ʐcij%nilt&ֵi"JE>ZtBgyikjj9`l]R9BzhYʽI287kNWS N#^xqj~t2ΛB,yU9v8 .:$ZӮlL=4 ҈B i2wC0Jk4[@M?:uREA !X@ RC0ؔEsd|Wl.nK_]m5CV,NQU4U l|='+l6Cq(X;xy 5J+~Etlc7{g٪mT-_`}lYF.unUXujU[:Ȫ-fk=8TYtI+oEJUEk-;kLa >xD.xiOŅ٢^~W /룏>>.@wO}_魷>|h޾!нw/^{7{S9Syϵ D$DBR Ep.6D3;v K$v:n ĬMj.DMAPvYj9uI)i.%;fS,pVUmQgjW.,xn5fsst Y!.]&eIUA턲k@Q/ ͎~BT z\PٖA Pe~Yl~!h Ǻ WfU] Č"G>pvٚmQa{ucИtD. 5pyr5y¢mҕj 5ת"b8ޫgx֚Xql3ZJ.J8#CU*4C3V1m`RΪ*7]ף$}[禊43!l-0ϳ~lQRYʹ|=ewZYzHU+Xf; T#Rg~-}od NS˲8Q &ZӼ,Ӯx=T+^5 Vm6ᅔ]l8;?ݻw_v3(5T>|-0`ht1vuf8;;ֺܳk|QTw0 Z(h2]LY{]0.] Yåku=ﭯqYPc/f eQېS= W+50faRd4Aj,YO{\]n R*Ok(Y;QA%v`ĨjUǪ.XNyb|wC,誽_VVҾ\uγey9'~@;V4۳]A3CyƘ "dVaF)T͸5oy%z!.Y[9uBȥ`a2 iv_+ՆmRr%)D 6=9}9prNN#WW:1eAsֺj6V +.0k*XS:*T\2bVwekhҢZuGS]hB`(gUECP9!P\)Ds{ N}P# !)szBhG>" >=}[l18s}R^"BO}.:mtDRk"AJ%2Z *MIHc!6܃sw=07j5\s)*8l}h.`t:`.i{8BJY!̘bɈ\Ӥ]j-Mк!J)j'5FPؚO!I3b5ڞ_B`Út\:4+ͨy4Dt@p(aNiU Rb=k-H9Ù--vv͘j*Erag# s\]]Go,}`.3_zp}1˔LEf0)%yQRpXsa\J 1*q^nkH],NsBJyu@T~έ)tgzy^4!82Gʪp59AhWo=x Cz5__ Byv{!|wǪ˽K 6~^;|+Ͻ?yN,ړp0_#bn՚ESׅ; |,v K)τ$s͚Km 5 `ZRW\i$)j]8Lc 5Fh:?{aB_e 献׭kn >\%gJ*nsN;1IKZY*u5I?DJ+:rZ-.ai0O S^DD t= T4V h' (IZSR;s8GTYx RIh)jqvvyډ/^;VdۘsRbY%y]yLU+絸YUة 5V@,?!keI3ER} WJ *!-d:N?md nO h Y:3^{ZS eݿxcTuGt8۟{pCŋ+1%]tt]Bzsx+4wXe4x8i n!3 *!X>Z'h z\!joZkAL5{jEcDVP ڑ[19?@Dk7BUS`fv/C\w.+fuQU5{$9f]81fif5Cē>gfc`g@BLs03`6<AY3s3"zDdP褙 3M鬚M hv \qީڊfԐ`'Gv8?;í7:Gu(x_8CfӤ9Ѫ檋!TN C*elџ.@Kg ð?Ϭ{]8B02e:z0eYT%ҰP![X0fw跽f|k^Ag_j{lcNU$v[UTJNW'!xfcuAyNh  .p#toCdj3` `&VgDr`7jq!N{ 7c~g/p~?kއ; .x7Wz5l٭OƇElsv_|>F~XP7.wY|>n}ȥ7Íy+ppD޽\L@/"G*Θ֑t5[ctm{ A86D$D.QKFm(ƈ*LJU@.V9k7F[F&'-htݸف!v$#o[a u+YVK)'{`-AjAjҵ (l@׼`LkQ~׭LZb7;-*(N۰Z/b %TڀqtP\ Jtqyu<#{J61ߨ CuWqy>;sNNn9! #h`/YެV+6r$"8! 1XR&̖z7iQZ))AJk Ʃ><)y 1*AA4#vB)Uj[UB] vV$s9ԩ QkuRCiE-e`x/<9X,UQVA}HabLun-=pZ\yJx>x ۡǯWҡ(UmVܽ{Ǽgt^2~))=e{g}v)ᳮ\2%`6Q_#)%T.ĵ&$ׅj[WX5uLYEyW(ujf{zP4Si,TlU|vui9*ֱh[#j\*pUJ;HH՜OwCSʸ{.N "|sl7yRPj_>C "@zs[-TK2 9_Jvn;GHv^+4`];t ^к@=/sKB>9a!嗺j%Һjyvc?`h5>{$溘5VqњK~D3,M 1TՎ.kpbkv: Bp(1=x<u6Ff@Eβp-֠UFW2ǭ:YXrs)pB* שsaiwN n DOk%U) \sta9g !`ޤqc9"_f"Z#{B 6!@z"oiӤCZp[Q㤵}7=qV+;l= _jU VT֪blٔf CNCxil -C׭;p-j3=*PR{`=oqJdC i 5Ѡ]u+h9VR) rUڱe "Jw" 5w5Wh^6 v j"gsp Й%V+랼x8bC: _(`cϟ>G?1n8_Ǎ>[ b\ n8v^Zfl[LJ ͝ٲw6Àl*jb%bt}*hQ_o IbLDVm>Z-%/%U5 b1Ls1sz0v2O:fs{iV)* -qN%׹nfE JRT%LYR qs8;;A~kٽrW8fR0N#R*H1$RQaJ! ғ* iޞ"*yH _ G䤟j0H2zC_/Jxvӡs;FWvf uѳssW]%5NԊb@Rb.YkgBw*^ ܒ-0hQ<{V |AWsJC%5vǕ;[\5yV4x#K uE@B"XRP[5pn>Gͪk+`ʖ5@yT'c'#!fw`鼫{6;@;rO~śz}|xca}OTCj i0^~W< IDATul# fPn7{ /%yǏ˽?w?c~rΝ]]?̭9HM1E._a$IO+Dpj#B']5"O,g"V AЁPRcߨ0Dm9n5"Z#Jbٍ54^ q ٲu lpKh?ON9+" 0`!5v@ 5-D<Ó[~~]V"Y3b6NmҀ* eF.b,R LHYiz`'UV;Ty3UPe RIŪ/r^v(5(R*9}EvTp+z T\(鄖 "@A-i2چjn[wۮGu IY*@j$BγBi˗/D=-|l,`&d vJu˫].xe\JL%a7l0eU˚4תSD"hC- 1F@j.IK d"9l:MJI+#Wm Q:"Imfég=:fJeF o6:( iT39X ЏM@ szd=x,CC ˌwpǰ–J.a٠;8RO> nϐӌO?ZO~ կͻc'|O[7opO gx-p}&W1"F x:`3P`VU U*6R N˴[AJ^߳ iNxÀ%5Ha)9N'AkmtP;\T9" 7to1- "mvmɲ+̒oP҄* ˏ%yv=ztuMSChUq .l*neha xc}e l0 to m halX"Lyo<~9Քf!"*6ݨGֽ7FR#@JXTߖ*óza!z}*is |~Zl8\^"׆~yJrò$/yA'ӂTtSQ[o`Ev] <!F:=.|s a= /A[5ϑ(#Aׄy}M|<_/~H>߼)~_//k!u\ gfXhrRN7*+4B7 vLK@,Jlm0 MUc!=%87WZA{-bHh" X=KDKHl)2WK[ { %V%e@RI6&v-wwFu,v*qdw8BUJcڤG-րA2lXzEw,bk- аxG%&-7!}`װL*YN)cW&SF>`3yr349r`r^;sp^ r&]o*R$6BM,Fh$ 16*-XXē)tjË/pyn7/_nz ^ze^z^ʴa~tՅfY|A%x>h694VrCT੤d OvE' jFMLs̏ Q`C8>4HrG_x=`+Q-{HZOVι#IimV[DJ#Gr+ 4U6HvBQE7kñDY7=6<. ׬f\I^-;1Z(覰Reroqz=W˵ͤa_5f4B[Wz]eD108q"{䖱 0_f}G"v4A#) F JEEHF! .9o ()"6piP:jF}<Hɠ2ZAenIXĘ,I!q Y }fC8g9 p"-o.y۠Uv k#i$I2"4)^f vfODrA+?n//C n-{{|<=Q$Ha!M[@К4xvDX:4HX@N |*(2PFHD4x"Tǒ&6`ɼ&}7 uFM+l41y |gPs*EѤz>t-rxĭaL2bv5 :_~,p`PbX'έ (4XnؘM;TW5Ɋ:u=M2V*n\B~K̴ɖaN3@-/_@jpa [UpAE`&GmUiRU 3wy#9:Br[֥#.G180'L@sz Pj3Dny !N i0xF5',4SZJ|f!b^Ӣv5\sa-z罚oE۩ǬU9@cr2;B;,)tx#XfmJ۽jG"[g,s<D8(bI&[V'< #`0caCeY4~yԫ<5гzՖeAu`Vᨛyp>cvȋfk x>#LZ)WR} h)$T?]gtgFZFm8L#zm/` ({Pugz*y*EuI %g˻%^-vXtзFUdTMeuX'&^žz]}˲+8˔D<6ĬM#֔04:MMl* TDѹb0 k IDAT͎TIBa"<BV)@rҤIK\}sݙS@,SK%>π϶fxk3n?}ל胏xπ&"t}}/nyg#Ћ_Iv37}!L^r>J!:ZKwB̜RuҤUv.@]Ё<!2~D"΅ E"줚 @8VjB, d: -)ta;O(ƀ\ ;vinY.6M>D]uM pn4v4Oy? SA'Z<IV9\PXzדmvGe:\f Y{99%tq ('#xWJZոs:-] Vَ@@¨i 1([z6MlӒW[nj ySM|V%1@Lfp:i$&0F7"&ʖ )} )/nF`GiAm՚q*lb%4~8g&.DtCD Y!$1NmzsՐEpQn=~8hm8m0*E& (!Djt {E;> dԦE*+bth YO*!o_|ZQr[IJe s k&|4M"Zkx5i,x!v;L4A:ᕁ;|`Cjq-h]SZn*lpCkBɺ]D NStrP/x2v.3Ft]gzڼ{zR0yɥ2=Et0gJ Z}vd^Sv}NTJ3mYU ͻC z0@oCMeZXS5$,Z>g׊& e_% .$`p*,f@*J+B{"Ocr<=" SO?>Z=? x{'WoQ[O?i׿[O?{>}ܟgߝɏ>Dޏ|8 \|ˣ's;,9Bw]$惐5#jjPBR $;~:A$Vq%$UbZL r Im U M DRYQ5fZ/_~'b"Lˢ-jMCWJ)5 /eR#dQe-ZY'"p`IP_[uD'`.KBgbt<ߩlUګUfBnU69X%ﴐ"+1 xq<*0bI GyJL+&!]GYCKZ,\y W*k@i{t,>`8PJJQ4IaRZ:m"r^0O^itJR JNJ3@c] ^@_TRpyzxB]xǘNjJkW&*v;v {U.D1c7 =m r5t F饔ѐTk^Sl2T ^eu8궓}i< nyd>e3(Vp1(7h%tTrA+Dgg)szso9gu֚zV|«8Ϙ 9/vPymdUP{Vrnma 6n?+|P?%A6BL`8!2}!i}6 `^!D{̦N`B tW :v;cbv{솝_4>UԂ֫EܟPk8 8 V!U5ΞO]tnOd9mu >69C,A(H&HEc(@0DiF*{oj>JaCN rhvo#cg5Fچ,Z'PATjYkRU5!"*LPmX_Rkr*f67 Q >/IiF./yz:cϝoz?fԷǟvC7%O>$~H쳆p?v5>z(ٳh`}|W7aW8ZI]Jcqx$iNK&.qKpνk)ck[<_2G?5!r4ddjxD\[kp@ZܸT  Cds)%e_}%=V (%7}H{CIE7qYc{љWMf2JW@M%+9f4J+)T˜QZ6١P *Y%S*6E-[t]["I1끼e<6Hj8r![&X4c٤{* >MPI1V"m+|a&E`q2+iU,D}s[.5v} TjjV$63&pD-T'eV7cR1猞R4lMr-h]rΡ( h8b#69mqRzEV s.hRQ!W F;F0'4| jR 8 v#Wy=j !v+rU";Z-H#thynיQQI9e8Iy#QK<(J QΎ1Y=FTqD0 󭆨0Cp[/A!mx] 4ZHΨ 0/CU, w"UDhEZ#Զ9GL^11T*q<UOa"J`)3D~6޷_{?97?N}{o?sWlU.=O' ~Gc7D7?tOϟO77۪^~w_|>U~N>u.-^7C!~~=wRVeKsYP$Ԛʉ)Jje )FyCxPKyZu"RwD5)U0c*@Ze&f"J D4EӐ'y&DL^-i ?x$4RY˚! $zhd5gn1T"$M=2'' Xf|E%~l[ (;6.QDȆQNM'ŶWA [ CV I9,o3&jŶS]<'-jE%?fH݀{gg-`mk{%RiT$;|`n=X7%5 Te-hxɶ@Q<ɵSJ8θ8q<WLH)69 }WۯEƓwq<,_~?xDjNȋIZTP/N6!:4!/icI*ɣ1 'EGx[R_jEhr)ѦpcB3nPsaժy QǞ6 {} "Ta. YyL"ɅyrRx96kJR.dED誤/0-4x |>>y5@ձ]a^in uC

U,Ԉ1OQɌRtb%i~@[v؝9-wl,g,ON2a^mj7/Z۠b2HQ]z@9vC2ydOKF[8 $!!LO8(Drw.&2Wz\kS_!ݿF_ W OM3lwFhˊ;\ yo:1 4&freUH !3؟2TfBUe 氩Xaīޚ5t<-^xdz0h]-ԼR8S4nD4G"DE4wU1c91?s<i|mv0ƈ[,.(Qre4-y2PƮ]@Cw@2LY1cg٤[M'ʡp=>伩^5aVb]!$_㢦un >~H]o{`Sd<`'|,k u12ݝ b`r(g唟#"UfPU(uk҄nfPQX*5?ET!ki [)c+v= _&@.hM8%%EsCEKpH^CКp.fn`ڴi )|#6Y! orc!+-!! T*RFq\(XkmI&N7wG-w6 "V8NuQ'+]kENi|wznL/MXmGm4\ieL$M)Y zY c(Jb >`Gz8t~9%pNH=jB S)xzIM++$rBo>Q3Tap9xq:_tFQa6i\24Ղ ?z!~]ߵQ4vLsƲ[ˆl0#{6e^Dq&-^gR殆VN ،6 iElhz -0cضZ =eF~go ԈmBtҠuY=Fցv#~e(𸍒F-{yA.F%N(eD4Hd {&(Wz`EiJ7+Iз#LAN)L_Fl: =\&w<"eo#wVgX7/1Lŋt@Ʊ]RiMit*s¤bГaZh3 xSg2։Mk-D݀vE<><& T,'IbYT qzwÔ\ogq,P5?y[Wau\Y_3xeu36FxB~1]< u]lÝ2􍹘F6èrNZ1%xfq= v?+Uц z!Qϥ `=nS 47YngLjz8]UHO2ܠJ*)tvmګ4}ӈ ɞ?mO0ڭ}gX;@`o$ 6gLy27&?4%Q9VVܵ }f7qͫ}n} \LCKrAL=QͨyOn *AZGu3u+_b7jC`6D((0d8WLbm0jo8nGMqNmN>>14]|]WبuQtG[;dj#?L"33 ڥsڶ,1%"V*TWfeMRvU.sy^(yY{?:>g}>H+}7૫[ouw:^7w;K?&~owIZ̗PxRl<Qw ̜!̻9M:NQɍ.j)ekt ڡ5-Ob% zh6uȂ[5_ib#OOb[hYA[l[SL8B6ҕ R2J"L3݈)E\EC@Bv} Ѽ4$HZ&&ݵ~565%M a3猜 n0 XMP#噍ll컸UO\3궚Sou[9tYPEu={ ҍVlA2tlRhu#ѧ}XvrS/Ӝo)l 3SO*vVLSAVmoH4q=]* )fn:b#3bwAy>24E DQbq\F[+1ȫZ5Xf&d yH5L#9\1bmn|z|fz}ԎAOWUm29dá7NQUSJ%9bc[kWRz}ܻ\=&].{ڶGZcɥY{Z3rF=|ÏnRx=y;?|k_˟~G~9]P/|<8rG\ɯ/>?qCnoї?W @ LneAo_T5ūE_~R8 EnoJH6i5l#TFC(~mE4nҽ4UX=G ktL0͋}ZG{J{1P8 6vESG|jy4Q :3?/.V.Q @0jM5S{,e&ծٺ44k8 hJ< (X"֌Z<%n&bFMb\L%:Ji'd&dZǵ #3\ƞ]cleF'0wרFl9mA5 ^8L0OjZӈ+ M ҃\fŦD ϑg#e>5_`AZt#6śٔN9A䚲s#1Xpw=&6郃X'&9k%݅՝nUױG_ٖxQ=O͒=y ]OlkP TDkLW:<7F[ Gszn*`\7MknwQdLS`A\_O1Um}amy>nMLOhs9,8,I9`qD9?FQƚF3n dı..Z!(Z׭>2JգBm^SMͭY=^>T㳋ǢX}BKN;8)!8LE?O/EgnwcNi?G«/|nzZ4?ߩ[Ņ?' O^__voՕG7D iuϵ׊Ъece"1Ed'QŋZn4Mk*s|nRErƊd2i >,%GЭk[ ]ZR X1.ٶmO & ig0bco?O@ _ + #jP3L+=ak kSմKhۨd>+ɃjhӉf K|*\c<;NLFx9m6/N(y5ԛOUMF7D1m c)M7 j!y ,RzTeQu@4!X g`a*^Nً}Ugsp~9;dobz.M3 Q4'1Q{_[Tkl4YN@v6b4>;xޛ{Dsg$\0aYM(\~7739t:Jӿb›&u4\cdtr5N`xT>O٪şAԞ+ucou ͪ2NTN?ȁn˷0͓F YN7)hu'e;6^Ž"l3NjUg;y׽hA)'|'"Dm#H&p!1K&DR(6֧R![_o]/Ï^\>~DrXgWU]O  6q4nScY:dzSEEݛDl$M3fvhZq8OptN;PpmGY6&8J2#l\3>rl)B514m=:"6(@ek- 7P 4ۑQ _ 7 4YyNsu&>n| IDAT$L#n_g"CM\- d2#Qt4_5Xi}Lٰ Dnּf3 ]./ ~꠯y1La4|(PVEx{MOJ'S^Э U1$Ħ">J e*֊yG(FgSyFq!|}%w^`V1ϋE#CoZ_X>X'J`s-'> 8͉ N(Г{- U'7Ee\qxh6MMξT͟ %&\6gYNn$}ހ.6k}po{Xv0*b̥0-YFݳ NñU]AUŊxk; 4-ҁ)N\TI[Ю-e;.֩]Vxka;\=eގɟ|=>|?cҵn4y۔_xz¯(cb% hf={_T83i*] ~`^#ޛB̕˴߮p5( lTuLy裡|^T43$FN9.P"tֈqLX0޺m`oH4Rk hG Mt,Wv8f4v S r bS. ( غ5 vsCbOy:y@6l\GY[3>?yϵٿ33glYNP5 1(;`2D#u4L[ X L:>IhX)tx@ۺ٦^6Y‰P&-Vˋ3O/!˲[ERr#4C#8RlEJ׵xt]X an)r2mWŐˌʌmԺ+::B/R2:Vk6 'X{Qɟ ˼uI )O@..ݡy|aƶ]Ydy]B(A<&"1W7>QJN e /x T&nf֡^df5 Ȩw/pdP2wP20-پ0pB}:@@5&C *{֝49&5AWs<xʠ!MX&4&Oۓa),tdtonq \k¸gg7@ ٦н@j6C_˲V׭#[Ч{3pIiwVJ=& @\|;fMpaW2Õō=#07$hB J h,݂TmA { Fl\!6 gNe4HhdeZ>k. ЇITNMy.+H@-'.evɆb%M;T5)#9@,e 4vOo\3h`uNZդ=(dVp=p4PH\jbB޼J %o(Gg%`ZKf_r,G=jx0On7F\Z}#"Ә:n5rN(yB.*,6kGdP`A3JzդJn Pe r(!qJ&sSI7T#f$1턒hj ̉&XWeMx:^7']?8|{ [?ϭ>byi^ӓ]=|Vk֍ˣgV}CWWtm~֏AÆu9o1+0 |&?vqi:IJ܎ǣB+i.©$鵋*C^neneN{"(BDKSy*1U -N'aHL& 2;a/bSa"s2 ` iKl=F@HO}Lk<) CgJwOų~)U8ܑT`-9;6` NT,Ic.JdʴBe* !H6{o-/e9"D] a)- Bk [ 2Ϟ)&r ?  w5Ows &tw@(N9p2>ٴ) LSix#D6Q1u+2Y=eoM:4H&N GX+yQtR2f_1 &LKHx0lk73&21!n?aomɁO5&$^ӗ:bElLdM#G+ ä=O;Den",uv)Z_k-rR[5JYn%}04@C\_}ēF-Yu=9a.fb1 g65Jz2:3өnݍX OkQksh[k^ M\RBR 1~en3A0"TfM~ʳ٨MdΛlPtDY̶=yvo~#&,sUX]51-=@5%LT,AA+o qNSa%es_K.N(uW፜: >!tˡefk sm(Ձ͜019}d%$%A7mH`lf[C7o|T +>k >>q XdY h4v*nMw>j `PnTS=6'<}h1S& 5&2-Hߝ(!S֪[f0JLޙ/5ABL$X#TP"[QMg*'&&VVpӮ2(THEAE6sMWx|Z=W'm]/'ZSʻL>vG~~}763~{~\.|#D٧i?<"O/QnvF7TDkWUޅ!<з&--[<K*lޝ}L-@vz/qZʜ_UDhIRIDyʜKZXc&+ S&LI󢀜&3Ls)(SrdCVR(:BcO4kL(1 X@&ڲ6D";~(` k"<&ش2E3yQ7igt;HѴLFAL0t:[#kͿsܻ VFAA>FpViVHT5PԺZQ3!V ܿnLL%7\Q@{Z;ya-\Fv9ƴ!a贲)LNRxe]Mg=(LŴlm7ikS̆S&HO^X\@Oe5@{&evzl4NiNпDfh5+N!Fp/= a^4p4G!tT&&'[wĖ)s1CKlE_^ &@j U˂כSn|u]qy~qITc=p,K0z3;<;3$֯]* 61D{q!5[G)[hW޶mܗmۆ9'?h1'(gy\GRv~*SPcfbڠ 7pdS9FNɜ\BcO)sjo콬5CUmu1}ꐐh]!2Odd2s;!arFb2sl+Qp{Q1_< ۬{9Fcjװȣ,<f `sVvU].]dA=֡G<Jײ<&1$.>l&j-jfvݯ:jٸRʴUɢ&@Y23 ڠL*[mJ $RJY{"(׋'>z|ul]r?nG}{zη.m=|=z|;oM[OǞ_>mWx$>zzً_8w!_p7w*e|t羨}_n{]9;t~ 74O+tLBeڵM iko/}.KҞs)ϻ鯥o:w*8-P jQ0)95D:Yh fRkՔb Wd`P"4;t*,n8@^"=bE6d|VngI=엌H"^ty#7}oP)+t ]#/cr2Xi|Z"6UGxSRvM h y^#Y~tGZ)?=Bp0!4EӨjNldPDTŶmN7Kh~#s̨3QH uc8xH,rD~U81@МAFcl # ND5p[W)DPwlNӲ)vSxgzUkCdRg5YvYdVpZн}0YTC7HWlhZˣ- 5Ш7|aΒ|k.ɛIu#gӱGz|>oHD c#otDuj*M0]sSh)FA(nM٘vGMF3mj)f ѐ^fb 4j1EYC8H®͆y7>7I}eL:07ٶ:gp1' [#ox-ѣQ]6qT#̯"o];'Jqz W!Zې ޱfzyfO֚M{_Tcn:<5\&Xble_̱V`I`;#ɨ {k[v}c>[/EE2M,، Ȧ6ܸI'NHJ1^ԡC@RlAF$@]qT)Ezݺ瞳Zs1ƘNz& Q=笵sV!T J| gG")y <utcGchhe-qVF@uz1z ]7oP!;y 8t:!%[' Fnܣrlyɜ|_kH/ 3wϭ5!|N\Ӿo&:9nomo91~{~ 0 ILZD|fwZp1IF>d8c("y1&laaYe.F03%7 4nj@~Rٴ>9%=8^z9ZZ0^<|jk _oַWWӧOwO]ok^K>?3}R)鳇{LJ{^4_+wwQT\__lo=M!4yKe-_•Ib6x6F6A%_?|i}ayήy)eHz"GoԴ d53SSגr.m4Z0x3 ҬDP`1M̠KkJuPyLcضmrM:BjC'ʌ\0B J.P>ҔtRU#VP9E8Eօ UHԭe. Z22jR>Dz0Cţ!mӏifLg2`w˲VhHy0"DGG'LavwuHr3 bfC'&y2 ^ef\aKS(RmێeYq}}} Q+1rw/݄e(Nw/=6}LtAA6 kO9Ig8Z1oQ" Nue2 OY`V\:r 5jɌ5{j 1}s;f|>{4 L#ME|rL$(X)ʲTL]_%_֧}4)%lۆ0"/猵.dY|/R7g\]]AB >0B)0v] ݱ!4 v)ױ>R)n.et 9%01"&9'Y6ϹX0A.QB$yx\2Rivµ7TR*t\r|S88ogj|.N@%% Da77)x;Vx/gJ&-ș,gE{D ,>wܔgeBd qFc,Żox)D47~^|r|iO/z^+ּ\VH,G䲦}THR(F79T/%Rs.vRË 30뽙.BԀz U%O8N ۶o H.ܘˆAD>y&ț\ MҠ⛋ݔGCf >Hq2?Hz'f@ .5;m55zLJ PT?̵<5*e2YD~.HUd""|cg9DE{̟Id-Ʉ#epi J 5Y2ЧN2(9 cRW/KMB{þ RxNlZe4lZ">wx 0'EL|1\d*i.^}|:aR"l<6 S6w2LIQNpiZ- 4ЩSZHKMˊqN@ Q IDATvZZGC`nHaN?>9:u߷}RL:,p30t)c9GѠ3AXHia`1T#, ÅbualsБQ|PT ]q6}I"=,XޣOGc18Rgl,R@!%b5lס@N32q[.g8bhMu}wf!9Bîc#sm~˾xݶuF ^DP:fu>?9 .MSof~6RR+.X2G8 &-=G۾э{vD3ޅ\|G#J~~47)LL>h 1)\I3.NいB[adqk;6(I?3DLOM('Ps߉=%΍.@wJ}j8yyq s`%6PS55iw -|^a~E^.IU/F}tfŵ`6_Q'UܻTs)i mQv~>N/ddhۛj}aY,Xk9|,տ|o2j+_zyiGw?_j/c4џt i/ ٵ|bR1D"kIX%8p\K,a?i(AM{k*CZZJ>HJyNJ9qnm@Aq5Z .UDD̨[qFg;x91]4{s*{g {hn˾pd )Ayk9g"'!ca,䜉 Gt=Jlc9V7Dєz:PS&7roE9κV*7x KW2cf]px͞x< TehS4ue/<+JsF[k(SGLD C.&I]D4갱jޛީIuFo7YMSow^k})^>}'7RoOQ(/C5-ɲo=7w͗? 7_ԷzK}]_Ώo~~A4 ׫ud;]d%'IXZR]ؐ\%!,ɚRʥ<4~:plTuZ Ð!C9pֻr5 %fN. KIEd!jhH9\o>4/pi]a䬇ZF *ȡt\VDu64G"J$QrL4/$B9r]30MΦx̦9s@o/3Ńf Hoь#GhN*sb|>1`!q(pCD%}Rn#es *ަ7Gў1.E8D ހJ"yn"ɇdDKhb0eYei.q}9%T/D[0]Ov$#3@36獅_kșͲMjp215cRY(ye P0 7eAf[j4Iuqp,)F\1u5c;! m6H&Mж퓺\!d6D&%Ⱥ֏C"Du3<%STwk0Դ. U8`"(¦;UT]?5SJVQؘ034z Mֺ[ YǼR+FhISaټN'<6ĩ>)t]8d̜DĠnyZXIl 3䏎d:ƍv%3  &9 l1I}q}?A lly_?>_{M_-=woxGj,{)Ir9ԯWW_yjN7Yǯʯ=_ޏ ?! =h{y?}jzzU@lב@3IݵH8η7炙Z;m|l}md:R+m:zW)R Lt t4%dBɌ.j"ֶF5qrČakXof@ [1c8: ZüNS%*ڟ%j&MK͋!gÙ8e ^0%eE6Sq[eYq8'4'")чByvop#SmB=Rl6G_A2 hoCg!6ޓѼirb4vip}omjBкTRbzF7Bťcڶu!4DdFZ`f81.eEvm'6.6YHI4 DA6)ܭ0 s$P[D QXvwaN?mp\m;RrΩS͑txF1c߶Y,`1CDd_}gXˡܽQ%3[#]ϔ ҸWG +TZ8pGCHC턽1Kt]6jsHbFcGG03&rXA3O_kGH 7i6x-$E<>c s4qݝ_yȤ1I o|.Z8GKRDUE7}~*+XJfTt^[ ɚ%MJr7ui$adH{` ן0FJ)'ܾٚ݋\:3ݜh5GF95wZm߰O fcp-5pww75q`μ wsic n1GL=u] $}TUh,APzjb#T35AH%uMG)(,LJẎ0{RSܬ"MħA\W8}3*BkzZ*֕(]9uN2(e%Gjhµ4Ga^kkۤwG`WGj`Uq{.f:!Q\5Չ0|f'$YPtc`=0[_֡@wD lpRK(-f86i&4y;@uJ4XP tolyFyFEyE+"4 GMXalah "Д1 (^|FS[Mk1!]1 U^XuIDLу~乏"Ӧmhȵ 1GjHטy1b|7!.ۻ[G4}6@P k=}TI2 "pZgKͷNbdь= ])OaP24j,Q,MIHk tI4!b>AקE"1~b /RŢK_;uc)).Tp:%NtΔKN)DI8MX/@B ə,>7礑}oGԊ5$Ŕ%>"N䍢 {Hqk4mY,Ji@,g jű#E73ILFNgƽ j}e,P ЭvCʚHjS'[RN"IC"jJ+b[fͯ_]}_w= /|Of~|zxY}v>7p,NOf7?{v};wwoODCԟ]<‹03ò,%Lݶ곏*[BQa^HF$h?~t #(DX, :"6MM>Ƣa8m'ZrƒA6c|NW;uej꺮F4۝IYp+%g,%ͼ#Ɠfɝ$ ໻[N؋@]'}&;MیwsYf 8E3g*J-V;,]mHQ@H>äޕ>WUGW$R"rm+rPFv 1驪Z\Gsbrq$N pNP[ Mpuh{qƅdRy^eeoia4T]ȟDu9&'Ac\i9@wS[ "rZF)ϡ^ F6>q)8pq} V>ͯ]hs.pR(7 ^ |ƈ7. ;bkh#I9m)1N^hj4Vsx4| hJyVۤc;񡤪H3X؄1tmLR퀘(ݐڶu7UGNW?s}zo]7~7^^ګ~|u~+o$G=>.k*?ݭ_KOҟ֟ӧO?#v Mho}k|Qˀ~>m[rIf,$mJ R\?:,48n>1zCTJɫgjU{\9T51T\S* oɠI>vtL).ښOepvlũE~8ǹ0S792匫qRL.zoRi't8;0|ju* /iqO@Ri|<+w㉄*-Zz X$](<|ΝySWdFKSb08肒Yt!fS4SKdbN<Η!C o(#l.M->3|E38v+"!g:9/V,@Rtb @mk"Ap͜Ҹ>MϽtsIp]khc41>'2,r9x(S8%#el,FȄ촶4XVH,j,{#uϧ9e}}`Cf\WL1SGb"@أXϥ8UMzBV#%/LIboMdO\΀H`Iӌ&72pw߉Mc0`Ρ3 E;&>dInEtk@˻bo;WOpy*u0 }ddTGrIHo\śΜ"S0 {;\Ы>L>X(Gކ3(O7tLdQ%ѓ: ۩˳B'Àua8jW]j̘ٛ[( IDATƪ})8ѳ1v#<r1븘kލk$N*'Gf ' %eh  ܌Zb_O]4a2MHT}8c|#jSzNP7 ҁZXp<:S7CZ4#z '8tVM]R7WA4j}h#(Z i` 6;){E5HJLh8!jp-;sYs+Ld)I4 CLe16 , KJ)ΙtHI$~2}}tn>g{Y7{'T]_{ѫ^ǫG˕Z cR./NOֽ荞sÛַgdaa~=Ϟ?_x|ShhxnDΧHWnloR^~N\3WR9\Hr{|8^ R'_..¤im6TeG/Ɂ$WPE0H.rD)d>%4s^әsM \80imU3\.WDp?HޓgaGl$ L9 & @VH)Dy\q{{7w wx/ gϝT g9c*y "ƈk+@/)k#l(Tk`aFIg.Q&E1c8 13sgRӽA ȹ9csN)aq"MȰ9TNn?{z~'?WKETg6n}W)onOvܝNzwo}5ӣ>l|zCퟦ_ujc rJҗ򋿘~}kkO//~7>borۯO;'!/}F}ءqPn?|OH7hʃWuYky/֫GoBxӑ^ɇWxzJoR*ucvMaP[wS3աfb)Sf|I mI Hn>aqKaΒI*n‚ݜ.Pre^vfNaʜ:,.o8sKBtуO'S䂃JGmn⼟nq\ǯt|\sNx,/ヶKꕺ^իrUٟ_]\T,Kk6so>S~[o>>}no|;D4ͧga]4fM/__}/>mIԶ>yQZ/~\?|Ӏjo)r\ǥևuW̴>ƾik>ms|`&Bf]TUbsnhL+,k8edtCRBYap\4*A=qA>BI VᴮO D ^x2v{7`~MwУ(65psIzF2h RsoN wc/Nih6A!ӑ(1lOBrp Stȋ6)9oИ5h)3ļw!lc1< Pہ$Ӎ3[结XG3Du(wRf96`6Q`^{! (*9dJ|PF;jp`qF,`=ltBC萪e=@ڎt%W)┴\s / @}FJ긝QS#0xw57J"uP}Rh֗"뺺vf*PeACN5br 9GRgwi( z[Jh^43vQ#~fͯ }eS/9nߞh Yt5oA#Sbq127a >8:bo sfd/P es $oq;ȅRCp:dlK%NU@)WD\BZ-DN#a:1;*r&)<7p9 C)< by7٦M#~ϒ,GhHS"UZtvIG(QBk*xk`ٟp\V5/;| L3oD6^l `:Qtc|t%0rxuّDw+ﵿ1G{`vD4j髥@I܂SYq$Q?5ܬ1nqM1u"㒣y&&LbO<] ><=zg6p?k*}W|NKY6Ik4hu9~K.ʺ>Kipգ vzlo~tOO&G7??g7<>.^>'enVD6|;n;wcKx?q#'eyO>^;?~hw>{w!W|l(Eq2KYʫo^?$=xrL^9-rxvC=z՗Z%H9|ޚB[C l}z`ca`C*0T!0*uaeÜ9emnS-&~υ(Q kRxQ^Ҩ{qd6u!CC MwM T3K@ y'h! O@o0srʐzE_tp6KS Cfa;uD;9f*x`cTmFrwPJBP)~ւr8 ef]T´c[;d3!ōpA̔ph.̫\1,9Sl`I 66f$&5Q SԊÎ /pE;^Qa6a;0\DN(-Z,~&z9 vl'@cYXGғ$O-oJR4mm^oSŦFG8) E45RFS6Fww6 3Rч”RW"rNTջg!YY2zLJ(\nVw3qppNϢbm>Oa hn>,KSߤt(P\1v@"NoP=a`H[ ܤ!hvJ[ȩx6;5URIH9 äesD&ܥ[D3kajK "b[+Ƙ6׫xX ua5ia6Dr2 :y}#h qT94aPo##D8uP Rx=h]9`/h>ܰSDF% mzq7ć{'m2gj\\.gM_ :{PB j ua4mk[)(1 6k cR L0CYЖ5G(G6~968! M4AɒS]q:-Z,~#J6:Z~ű?}{߶O?u gc_w kCǒeNy?kZ4G\/ckj%-r՟IK}Y{?ھop|9WGoP`Zm;>1N7ϟ %mTwGWڔNVT5*uimGl" r07p<K e"{1%qJb'YF-blna>"smW0zl1Y%p"Eq queBdrȅB(z%BTJOhvbNqWW4a|NW NVCP@͜Ls t)])%\__+0'9c.{!ԝ' 4I]A.vqiLYp{w ofR>ײ1E0ud>h64}"}5p/;twG*$=G85h?BĉTR+0ƛ` ?7jyו溬@o,^ 39T8\(hߘA ۠fVEd85ͼ` M{SrMf 3T2㉋P ,sG3BB9>:sVM.EnaY.{]p9ӰE&p&C.^kxcm5D#. MhQ)r N VAK~IwVf9RP4ID4!1&}5TNG`=D,ѦiYlxK sv\0d '?; C1!>TjJiA%4 RDho)%%O{tt+P9^kWo_p-mznڋ>׿쭯VWoݼ }5<}u;?}^{5Nǻk }oo|Ewr/=.ǟt|Tnt@{yoG7O, 7@8o/`R]=!yU \Y+ /zNiv Es lKͣR,9*YhL"itc h(ф 2a _^<2AGGvSiEJ`%&J,J ^écҧlDw8gQ6"1 ^vX8NS0ax/WW.]5Cޜ;P^|V` N: a9Jc O'b'tӶ"Sfh9h|1oJb}HF \\EtELsr&2Xix)"vg1iZ"ҁऽM]7VKeDǗežI7nzսH^|=>wFupnL)'}' 2`*9M7@{^h_7c`]p"LCq6 d1oDsvs%S@;+ |MyI1ϋ=:=7ٶݍЦ| f}#3ҩ6F7lj:B#"v9D|"cmz,˲밵9"22*lآ")dZ_Đ݆dM <2![ IDATa#08PAH Elʪ̈=ۃy%{G$޽瞳c‹Ud_NS]4A;2yBB؁)BUuar)`fQgzF,!^dC9TJ3{>|OQI"Siҩdhʬu\SxL|vGIxJFw+5qUjLxl+}9W5Ѿ7NjFk;wz{^}ucu1Kf"95"2 FW2FBLݥrBPLf1@$q$qot ^9k!m<Xv uSgk4'{Ԇ9݀,Qwn47ˆ:|>^o.v7YόH%2='4D88N>Ila ԅKFUkDo^|42%r|ON_>Y (Աu]x88*vNmS_ȷpḮXյ *j{V"~NjFQ"U( 0ɕZKӀr4.甇yw?{m&qD{ I6̠31F͌ED tGU,԰^<ŋ 8J:}3 5 sZU ސ篔MS0((;h7l~\ 9B0R(9C5ʝ4cf1&n=p1rnӕ3DJvr ^dENwGx3heAb#sH'OX\pyK<~MyN~Eϯ 7ɣ.70d2|gb tQUquzipN\$Trj /af՚eY)Yttz^ & y1։poU?8<i.PiWtg|)l:M]#~¸FE/7a>N;hȉ8'S8 !msש #p~ 5?Yy 7pAνd) !Zf!JF)M|F`-q{o٩W׎¬!0 wVrr_ !-\kzqʼ f:~1q!:ipjd'8L/^ 3 /e2pp`-Yq1GSfAs#H7HM/L.It_zlҬKR`O9>rN)e="*5\O kwޞ.GwJ?6po#.n^p|[/M[_޳|;I10?l"(|}¿9=ʢw/ν}l2Zy]iLJk_7rs-Tg-֛jv.\멶V[Zc{@XY UakK6:8rhM TzXP4 *}t4mn'"o9YDF35<"'wf6 h:lRuņ;. $GNz훿 Z͋wZžW,SiB'P1;"lä@ UUʂd,xtfp:QZݱm1sz7eۆRvk&"/zǾoeqmaDsܧ/qk(wt[yO* @! O=-n&k'gNl~5^5 H 6芘XlzA8M|pJM3nË؜,(}rQXJvH5 9'OE׳#ٍ)N7ҔϛĄz#Žul),zcӻ>1N<)fA愬y*`.L0DSD֘Ʋ?מ-.0%Iν*.8_"cCOZ4#l]yVbX0ș4^N2{ŋjosq9`*B%@H}/z;TuB&d x]ZᙙnU[<4 .N3 SbU]۽}8A =x4xv ۶9-0 d4Ε?|9HOK ̷364#eN 4| %ce(+ ',mܫb͑鲈3h(l(-XlʵF(Va2iѠ/%kL&X`8{>l'Be:Y@z)MJ,^uAǵ}_W/r\2^=7{0{XN}ca<`=>uRdaOeX֣_; m ftLJŰ~' l||Ǡ?[ ^OX Ql圧ƉNeRRN s(\"1 V!R3ƍy=Tiy?@4͆tyh?QcS:ڇf5,ZyこozjPŴĨdwzjKUS8q0FiZq)!&k0w\E_JL!GLDP*"_ AgԔؒ2b0l(˂@ֆV+둍/qRSFwE?4R*HLT!!z߸zE9 {br)BX7r, I0jUդ9g%`}fMPmFm}ۺ=5$)u???Z=2ԗ|xLJs;I֑bou{S9}w/|k_c,?eÛ?uCw`_חݟ~2t}ått^֛<_~t~+)>m<k[Na]zfjju#+"Hc%+Mz,y-Vq;f"75Gi PUyH#Fdžf6lA oKZWSOsvܣq#OXe @UmQE@ LS2ulNѳ9}lݩu&7!/xpkdDj.sc]݋Q oFoh 0]b.r&sqww%nӜϛ <p ڇX Y>c_snGvЈh t˄Cuľ2$b'y}=R߈8<mnGdvض3JFIg/x3)E =k0g/ Zwm!5t<9Y*k|²\i.r 2ӥKz{Ńk0|J1DZRXdhftH4-ރ Jչ%&byɹ;L'0v0 e)7 ",pF,C˲R ??ID\<^__#\LC3$ۘI視/3ϵRdBomG*iB1鬭r)lTK)6SXWs?Q&lRa] tRR#kyz>At1%M71ȶ)QYY Øfةklf3FGYʼ/H Ni 8p7Э *2 >aFY{bL_kŶgSd԰^yvkU#;CK-sƩܤIـ8glbZ{Ծd- bC9:hs3ΛtK,2A-&RLԽ( N x`qh'1My1P@X#$3ވңABO)<-1yДжa-`#Mwv?319kAdH4.`8.:L<,єTdIMj/ va Iouߟ`}Q}z>=gn'{z}{?;z]zƛa>b)~$NOuVÅ& ,@S3֦Ͳ+)Æcjś^ U:I0Fu5DCncNMC?u]{[glNp-:F'")Nmc*M/*'w c@0\8+aaEr$G 늲4S㚞ϛ)0Bu#ËZ]2Y1 }8s= S5@t{]f?v%Q&sg0Y%:XO)C۾4h";;(#x- F2װp8"w@?`#JPWcs0Tt7J '6qc<}2D0XhmLD u`MN .4MI!gȯ'LQXPͧ+inЄk̠1:: }46 6RxH+6cNjlՒaf& FEg,Va1kBl4ıCãTSq* P--tӳNqD5NC}4AS1Vݹ3IA~ P-Kt p\[ @:fW=7[s`hNة\jа"gd, 4Qނ~+ 6:j7 5(1 920AGE]k3]7j0єRI>bHh:V zk}?@o:v=}샧g}Y=Roq5f?'ǫjQxl^F]wO~i>޿lcnGƋ o?~"41|}¯}'' ?궾|\XU{U^ZG+חoNKON7_J9?{=xsчdDs1Aj6E5U4G""˺tk s!u6Kr "Í5fp(0t$'43/.ulXaRB<7Aa1 dѽnG\ 9uoYϏ@a0)@P݄g2#h+ o0)%vZ"ht 1'b3̡ ޾k52CuO. i^|y }G lRo-ko5u ;|Y\iteq\@&%ZnTІ;;;LՁ>+V׾?{E Á b@m IDAT; 507TK9d@R]Y*e ֔'%,sʼ01r7SU)[4}6xs|wZ wj?^-CYk\^{xɳ*xXnw_~՜y=n[~ky]%r\mj!C$9K*,պ^f]sXM7ܳ[A6sU>^`uI贡I!5%(q9Y/eq DA*$H+,ifeg#unW4RwsJH0܅}8ŔEm^whO}ml u=VƧ5.Lc/f\Uq:7l I(2^9{9E Mb5A۫ٹxAqUF-{^Ip;yC3BwRE.ɝ:] ּqɤ[tZ=y7R3R3=f}``oV΂Q$^2tC3(ޤNKYHcS2lPRX+,0pJۀ@S,Q;X[NY{'ߗB1D\%@|)z0H4ioL/>M8BI^Ο{ reeCK)9go=21r*r,\ZX'6ZRE c>3Ť&bndEZswݣhõI/Ƣp $uHӥ2j#n轡NWw&Bb0/x}W0`NE0%3>lp<#  SO-kPY<Bhf@(\#|ONnmwc "RRbQ aP[q]:½V}/ML*AS{xއshdubJ nNuIp .)yJ n.Pgq@ځ9oN џ>+ߩUϊk#]4opXYC3g|p>veĵOQec 2'w~wvםg Amh)O _& ap\}۱e;K#O7bӀg (iwwy) HBfh2ޜTȵ4>~=0N#0 %eϪޛfUA ZJ&AEmؖ4KkبG 0sO'sO>o'Oп||rok׷~;.|ˣG_>0 e93+`y@Sɦ)弬IDS)bÀ$Rd/_I, e]q8^qs mR]t91< A2\&w  >)pg=\0!f!D0`<4:\ 0Hc1o=|VYh )(@hj`Z; kƮ:ճЀ9𼯅.Z4ʠxS.۾qzMH"4kctX8ߝf~\]]Mt aSri a*cbijƜʹ Qa)% .O"moa,.T PixY35E8BۀMwmDW(6pW(kIB~=2JV.֦#L|>sGkKf>ѥx@< ,٧cL| qYz8 ½Eq{zʄ|:pt#儎N)T]L`+V;/ cj_Q ux٪^X$f]}- T6uRHqvٻ#,!FgAP'۶q"4&Ûj Um'_?" xΨFkuDϝAC{")"@uvs_nfYVa @.S*>E`L3 *:`8d+h4=,^>#uztl0'nǰAbڸJ>Сgڪp\-yӣ1]Zkhy+;)NDݛ 3W7&}>11}5#<y\ "*]pt#ge)S:RB|>b" .&i^x/ t K u<4JGwf7]IN$8T Lq~z>3a _ pJ5ƀaNw|6 _nCh5!=< O}!(N^D5 T=[2&H91F7ILfM@hN5/C%kn_;oŸzsO~8<﷾_.%O_/> HOJZÉ(^X' _Wn˃ծhK۾xS?^{dI#/[oq?鿩K~˲}?`ڬe}qZu^G9ג eYKYn$INi)"ZRҼ.ˢaKh/l)#rr~LJ9AZuZhlfNl)9m|]čA 6|AA%>Lڋ;)ܼD?%a~H^ߠ͐ IT"4RzѬI(B.lD-}zb0 7:[G<.f}B|MtT4"ӃV^17<ï5 OurN\ӂ@#/BlFYV/8:Rzu(Ep8 r=wS>#tk)*l:^:?hdLhUC}8þ(hjy?C`CkfR<1 ?jG7=:&%l;[37n52#Rb)+r^MJ)O0r,0MwkhK9+)$(duMϿ{/SOaaBO=\,FY4& ͉l]MSF!EԈzwXÛpF9;h3c!+>Dɋ_<{8oqvdžEaPn/ϪҬhq0̄}wms.2M)ENd0\% -&"#ԓwX' 4e!SkCq0Ӝ\>ܻ Uf!tCd7Zj9Rkk#W(D@Koyg5k5fDƪެsg\;)j?bw^0 ˶3ߧwVFmNIB'c==Л;}8 U`Oe/66[k5mNyY\g;0ϩz Cl{e){,kgf" N֢sƖ|Dp{vQ8X׀מ 0W0$ K` t~V{#j S@ST^woxXAZ)Wr@.=tB("I!S„.ij†? R7:,$.vq1$6[YV$98d6d5fpzA+{eqp*&3c BM\h)KM;֪fmӋ*ZcuF7yRVD'w7-}yw]W23cxL.aÀڍ[(EX%;0$Pqs! ] \oG(GoOl.+‰t47餦Gp)|ߘ]WFgH`_]ya<˲r: 2V1WA{ӼLizwFOb|.ѢB1d:M@AZ]cN~1u ?㉌B}&gܣS^e%먺o8\8GH" 3255F@yޭ]#5\:;X Um!Rc*}7MYSvUBGﶉXWDpgIT ))-|\e9RV×_?JI[=4A;o%~|0~s[W~>6_ۋ/hY~o^:JOuhr Ǜ\<,/}G#Q{DTnDmӃ\Kxx% 2d=^*0X͒HQj*$6ըyK6 0[׃K%AA:T agN#eb]שMi)亳=^yN`N> ^JaA&% @7>s#$P3&͓vN'tIo;]d f^Fgr1!B:ifyXtăShFm*>A օ|=q:|vzm4-Pb,NC:g- k)^U ض3:ȵr$mQj,.^M8xvc 1 au669 g# 4B˲r"#H%$^~JouVw$b*m£awJԤ]%766FIvi~Dj#bdp1шW54Є]+jcI4J9-,"5)ARʤFXK谔0ɆaLqhrq:.N+JBc$1ʡF4l4g6>"P>X[QZuYq8Ԗ YyN{07tL-{hr pzܳxێZwŃG'Dm'Hʪ,;͕J)/faԳfep})4IVh$-GyNRajcjYfǣOc/;u`dn DǴ洝7vVźP=a6MPd4Toг7RZD~DO;ij~vtX+uuLS14>tD$ ;'(s\ͩh̘BC3}'U;nh ^A^"7e5&O5v}ReQAD>_NۤD,騭aKosD@422Y]٤T$޹3vK0(|+AƗ$o;\c*x OY pSddbj~*z?7E\F=*'2Bmroݝ\gG] qw`sB/$8)%k]TUTSNIpu)K1 }@_l>~Gʂa?Ӿ֦r\{?JB>,O_ykx*+_//:O՛}tse-mb6jՃCyZ굷\99={r.R~~}۞:KIeUMȢrAV%ֽ%d"fb"$PpR#rx21tGzXP %" 2X8LaE3IC=nBb- +k< xR/:)tܣֱlpX9tN}\zngwWMZx"(.ġQ>iط([)t!CPHO Owt6:|f$3`1p*ũe)8o'oI}i{1OPƺ=2Z:v `;_"kېps^bfeXײO(Q1>c8:443wXf>u'nlBw)eoIL)4{)v1DI!Ԥ ä2gpR ('fldYEf X Ed'Ij82+e]YctlTa#i7 toSAon+ .\B NAm̆-t;J+ E+"2rżq#d,tͮh jRK9 Dʐ| 9 /HBG,<㇗DP-dW:jAͽ3Fx 6' \ym^˥(E0J4G  %7BfVً>:NIQgӶ@}͵n>CI )Bp"&*":Ϙ眪8 6x wͪF7WAq8 O0]N&ro mXD}M|ROr3}ŃIL)U.2M &A8hB|6iIg6_`z& N-]F`©b G鿫ӤW7|,:\g{y634b/S{4lUj6?ʬ"h% 2 wXYN0Q xJd }I9Pc d cdS 36l%a1z_ k4OSNlכÐIxq~bRy5ԷuoW_'OC^ˆ7/<ǫcAg{ɋW%ͺ;Y/_R^~t?^ݷgOuݶ߿ֶlSAD̺sYn"*IfhJ"̘˄ӉFp8\(^DL88|>HE.Vzh ;8Z IDATV~-8n?Od ΅;"暕5<ZnB$Fi nΛS]#9/77eQ< M41ȏatN]P j!crGyDt SΧD1 7CGC+3 cHύ RE Q(SR.4R8 ؠq}J晴;*'"mE0'owY,XݥL~0D ti oÚS+yf@F(ȝPsR,@tRV@M;늛Ŵ>ܑwv_,6˲;g.>%A7MvM!IcGpmȦ>0 \BifQ 2CtL^3ń2"h.`uϕi]8ƌ F0 2^%>Pe2pAgAc͋B7=r*'o-qb4nFfʾh,:h/B*\uv,ٍ^v<32,`{ AI]i\{݀Acɽ`7d9 mmjnhJKN9hV9`lVBN uN)ɤkz ?F9{CsѪu=i~6օ:{k)SCƂ,Rp*{U ~Ob]SL|䦪^\# Scg|?)~%a{Qr;MdaKtR;hikS4YqD\[5\\/`ID0An=># bo>JZr3p1hHiȽɵ}r|C4}SOaR|Ջ@%hаx=R 'uqfFc'[@P?b"wE5ή kXn}p/sɧ7 X3o~Y]l=)ޝ+1F06zF *(9t= UE{{aߎNPmnm[`"KY7c=~||`xçϟb{Zmo=[_~'l_wޔ5/h[OnM磍vrx?{݋]ꥷv=y=\ÏHۋv.iʱV= tZXm֥*a.")ɃUq @z&hzwcP(~!…:9,\WSr߽`Hg*t]Mz8Ui۶I<@5:6-Zff 8|#^.tn݋EWb\)OIB;Z1`x>0Sv|0XL^hXkpp>av?d9b?t)tlœ=^SΔ.W#'lD*t?Ch_@s fAj\\)Sa20@M5]^H!{+2Iͳ)Y#M.xhuP#HV5\&pku r@)k70)auuh]<3j.nw] EhD،N'N d0D4O"8LHM#bp"K1$Fa̠C#{UQ⍀D|/şJsj|qc6]#CaQu2óV֊;Y 0/z4p"r%GȽu̐8[ `ͽiRʣDnvoc4*IYf" hi'&PH vaonD "LY?Fh m;Z'`ե?Zd}zk4>fc[&o"pVgMwԽba=Da)c``a7Z4loD#odui/ilSG6hF-DBJ vۗyQ7}r]_:Ȝ &[^#&8Zä*u];f8X&igƭL*c sL/eNPܯtE"lgU)H)Ȣlt!VanvGm}[;ӏvObzw{{$c>ukHcs8zDVgsu-}_x]חv.IlvL)%^|59rR'IKX{ڞ=[;_~>O}Շ R:f d秧Ͼv~YM$KIr!Co6[ bUUU4Mhi]7PU0Bk`҄?N݅9n_s::<pJLN/ccB3lB7Be PiCVty/v>>Fs`c5,;c0y0Ѱƺ񾤄R ͖Zu]T7f:'aG [=0t2wt ;/م뺢NyHjLj;+H?TJW]__xy1t 2`#lͣ X67iiz;? j-hQZ(/V75d Qr'^+uAanFqO@SUy+^)gH8 =}FGN/<5>,N+΃#U\tAQۧ݁ o2G5F> 1G$Q'gS!N٭uU^i~D):ڨ7 @e(˲pHƄkhܘ{Jhxjхr{5#,IX(N%H-7*Rwgo.wT6XzC$/aS9ƞBcf`pg"}2|{ߟA-č|676d6l+N V~=` BSg[ )+V]cê4 {whRa\{{g VEhğo]8,d<*54/gRv䧓ڌN#!zw?)Շjfm4 zӔ(@S~C  >#Zu2:|N~9j9:Ͱ*^sp0+{܌ βCoq "7 iq\S7XNݼy-`!@Y,=2&Q6i18  &#XR.w]_cϓ*cpe&9MQDDEEQj/u;ߩ^t⽯v~߭g/ՋO/޻~wW/샧Ӌv5,-r]}ϯڦW/*l!|5^\y6ٮ_Y.I/櫫IעzB>>:_z߆|&єOz=7exzMr .D( ѤS/DUa5/-PVQ Sg8A\6UxN~x0pM>rʄV0V"vGtBUx 3v@" 37#=m=3+,'an]Ҹ>;2&bt$>6<&+)~8#9i⹔ XX88&j::46zˎ0{=Q  4f)bzpg7 PgDU> Tw3#}P?VvZMg5h"myfϥ<Q)ܖ] Ch2gQi)QUϣ!R ;H"إui^̺N]|?M "+XE{c/:tm̸/ܟͺ%Q5m ~IjV)[ϟ>~%xgo[W?swn;ϗ/_~r~c۷Ѷ˷}~^~_mG5?_)#?y1ן>{_{+V{ݹs}sG߶tmC;k˿w7>Ջ[)e}-z]$OK<_yB'6Ek}V,I:X = 9@u=qfN]@^cL4ܒĵ37 `q%ర{@ @4x𥤸~9 j )wN~EK.etUbJ(k|&,5O3fDCD=ncfP@w@xQ># Clf70#rTe{֟1$8BH"AU3bď掦q8V3{lYi=4`CBn)O^$!}XD\ȆUMo קDI>}|bwդ@lL<AaI6nt ̹OHlblDiN|S, 'J-fA8F5 S>FF1|/`]+T'q<LHx1ϋUb=D!%sD-,UN5 aG#0GwS۶y"EѾe9 Ly eD dL3Ě?_qag@ªBQ랹ZEߤ t:͚4U63ձe :Qo";9@zDf/IDQGwR 1u.]+˶lfr Oh8b3~vgн) 5>nriOy0H9i7V92h=ƥ;| kB{ x_($ =C w]d·a(vtXt6ks`VZ-'UJuASE$'MrҬo/ I&UHǣɷ?GG/㯯y xIկ|e_oN{I}s{s__^^'O84!;_B*lim}Y[&/ݾ{zw/r__?oyJ˽ff\^ TZD&U:dds[w9i Hf]̺Xo҄boznv:"4 nLlc5t`"h]I~"cc':RrİW&uu}F n8d7_i F6ݚSt `u%^1! :isA תpTAn>r])2P3jPvec^!b~Xyq:W[+h^ FD$Y,z#@>uGe[Μ*>׭e5~2(FP?<\:k B`^azP?ZݼP}b?~5jDXфy`9#:4ePq [J-37yܝYA΋"^)>vyq{#F^ z@ݭOX.KCR:%k 歌7:DjڔyfWxuz?ssqE!_r@ؽЊB4\ݸsT}cC-LMl #+!5cD1 |! .5w? @.7J{F oTCwS\6js31= z #TPz77d 9s(r)aY i%h43u@#j!3"/r a>F:j 4Xc#; HVM"0=l8h[s}$sUrBٳd ADd 1C!Lfί""z܎ƈ?ŕlv?ld;opL@}iM˘6jM*o>rPݍ2a~5?wCM \6f( &{fAsBEWę!-;irMmu !wQƠ 4Ol=@(_̺x*NCfHLI63XIEEi 5 pOE:UseDQW:̧hg?~|?zw^?7Gٷ[x4pP86nBЗg߱|rz_֖Wמ<իÔw{?_;5{卼ܺ^>+IiZ^13-,)/̺;PUt>^2BՂm]m+uEhl~ \c>Q͐v"ꎠd:OQ98ݬ"zCxS,@n.է8 Zb9ϓ9'Aj ZjrGVI(Z uPDӘf]°ap+P?jݰl^NH֘9ai1[҆h~s m 4ܸ`>3﵎K; Ftuj졲|s ':Z+uD,"yZQiOAGڡu#Ok3>V8pÖٝ t"4vw]D 8%e$7D'"~RM)s=UR2=Zbd3Qh4akF5 IDAT yn֨{u,O]8܆yFMs:9^Ͼ5BE @P ,ZSvd2rF~u{kw(uGS?nm8C տNa0Ȁv$Wu7qidUݝ412<͡ћ[nHmN/"șŭK"n"[rpY|~)v4&fW,L(24S604PIh)Ͱu|[;TZ|v̑7[A׃#7֚r+ϹfQ7E0`׌le0CZ@bb~v뺲n2P6Uf̆RT/3t`YclgxpM S Uv:ߜTF 9 sHM$(; Pn=FgxH qCo!A"@nlVyFd- "bCF d6u `D; u >b2~1|`Asp%rݑgwj!5j9@ v k-*ZZS:Uy#.DI+ZmE5$SɊt^xh"~s_|??=/sů?ц?Ow%?Oy-vjeYW̽ɯu?v7޻W_G>Ig_^/nw{o<<޺ih;_=͋%X"2:KQԳdɖLD4M,t8Qh]SIQ}/ٺziPnYp7"p55ڝp VEP^KHCF423y^ju%E(>ÒiQ p '"ZVJaFZ6#l!'hR2uf #PGyjfwyFS^xzFW՝I*(*eƔY|gC_gk=do{89Y)aḚܠ>PwE="h.#V&-2WٔndpJ/)sz^̊(Zġ##gT@mwY\.LDD<x.-.o!O3"oYyݳ.h< gIV ʺ<\aME3:msCĦg gkO^bA]lLW1Ak6j[)XF&75ufM`49{| 0ڇ{3#Z*x_z&S2Gjz^h1@ x b {Y*֡`洞׹W2u"0wG@e#Y !䬓3"n[ yI5qS͇_1t Ju{ #C)$2"">`p/T|-)%I*R[b:V`V*I5MФ c{a9僙lz1S%+s?v_m\?W?^c/kwڭ7A=]~.^ {o=w'W_kw޺W}3L_~^ONO{rG?uAfuQ= izlf셻`eλY>lM05&em'N`OE9 ':k u6FI1Sr9ѰD:'cipjB7>гm[!ֽ|<0&73()Oj_ @Zrd" n]ryy0%"ph |Apݡ/rFʳójc^zLp 1}Զ|H$1%" ec#{w2(H)'wt_sٓulZZq0c/M8Bݤ'!b#l;t4uJʬC{&XcZ<9A e0j=Hc"rc ԟ8G==i:[&3 Ӄi5͠h7:mk+èHxiN>CC.I%0p(D躊8߆!4mTwSv/g=V'`g4F`CܣF⼞sQw1}vV6OϾ#1/eu#o y8Hp_sVK ^b&CK;ٙ4ȨMN;J/k0;+kxJn"6M}e9lґ4&&qv`")4I*9Oi2 ]}H %IsrJj)';Xò,>w='߾s|sIz!"7im?W>wWL>(קti{K^~v~~~b~!ǿ3俱}ҏΛsg;wѴ &)4?03$Ǥ^',IuRoM Un̚[]7MY|s'nS0Q.ظ⑋0\j>5'nv 9"W}H.<rvʛ!IP s߷muƤ 2TO=ݛ#^AϦQC~buCثGXp)E JsJL!]# NUwvot'FDD|N%$)Qq:!;󙟷SOiG)⍕#ԞtetIyAw9Ɣ4h];?3aYpq8 EB?C{kAroDn:\_Gc)硻P-ܵnP k,0TO)&׏2A4:x9bMsF3eY0 jX7"aZF}5pbU-}[Џ7yulhap{a$1ϳyH= ; E+{[4&7T. 8pqaCD~(+z^ QH-)ƵJw!vX'{A+SIvuG)kEekͣeVH@:Ӳ8cDqqq;"GZךvmuLDnߙ :B%HU>%ŴtLm뷺uo>Fz3SM\<`{:~zR$ ɳYW0GhssvKz/> ? sN I%k#˧Ɣ6}=UD{xLyf_1*bM8Oz?MajcAʮuk1aZJ)P1RZj8[) \m;x)]kXDFXN늝*ͦDLLBD0"Xb]ӈF,pDR1F͜)pKanc$}A? AOxN p!yo4*vcP(J07>:QUT݊&Qz<R"I0Ԭ E5u^D5mڹ,]T4uE҃ Y/g^l׽P# >^z7?3/ڡx9׭ȝt7|q-#O8w|~mS9_]|xz~|q5QY}"zoUNӃ4{,T%KҥXVU.xxA^BTvü`]Ϯ-0Sύq@DqO$ KʶbY)c4݁S(1sG4]Acձ\cʷO96L]K /7f NT0w= :t8lzoh"&D 5>s֘Q@ `]Whqg,26pJ:8AqOZ#&\ϙd!ode,̧`9`hH}D|*zǚ1LĩwF=f4޵й쀒CaJ}h04a-Ge5%\/pda˦qT"YA|*`EiG玤nإ >+u3/ b"BRq,^M7WCo"gg8yI_Gms'p&Q0r(A 83n`*=#sOF>$r0. #Lth6h"NdzC`Jͫ7[-<;깉 $qfq!`>MSr9Y>Df蘍{M8㠺w%Dpm%Ulu47}CG(}g=`{ӯI140: B!kzmq-Ǿ">8+:Hᦣm 44DBt'Q6A9:1H&M"19r_RJ)IRҽDLx4I*jYS:Babbf,^uBa</ P+֭=}fŒk}m}Z=yhjr*>kŸ{G\}y~wRUνYom^S^?_?vowo}?4.j[6Li>y44.?Z 8JNGMdvDlCzCWzMPeh)X3Π.ꎘ/Eg 8Q>UD;5DvJNN3i"pckN! TrdFݚ eL ־^}9i@MSR(uQ0j|P+zaI5f \Kík-_eVlbR8W% Nn]omn+@)upљ՘fҙFXNq3ꆺuEQ gϴF/#orf!_w,؃ 3`׿N?~-7։j'G Ml k6M*jh ̍RB-Lkp'ObB3iN9ÆTD1yr (('SISLوl-\VlۆzvzRrN#nzH{hs{7٩&@u7W12-;Ɍ;fVQT-AIz㯒^ޛm Q$z ^C5e0H;)H@ 1y4B*rJFA]쭡u:ZߍC93fEĐnd":3 ău' >G#s6)-qp*g"aZAom3tF%(}Ӝ ꃍmd겋I _:}X@weW"왒ճoYwt?ɩuGSBu)Yecy`8\]'n`\fhH^Qo8T 3;I=️ qu;aB7=[E mzJ9Lx#Ɉ.kvH 3¤J0s]_ uܷ}Ηܽzl>qOś7?D5)O=}t'[WV[֫u<-K{y9|Tsۭ^?vU9B4VTd*$Lbm""RKuM>赒.GS G06{1 1]/TK-|@U:ИХQ\ӄy a;t0snD|.cz3snޘ%M[M1MF@0v# lMSw6pV\FM|f se{4A#X5L6잫cBPN:sifoZ\uЅiEt mW53vt}LO5;{k zOEPEU4a5s-SvG8ZFzk4QC* UE-a4̦OPJ DZZ )SB7Iez:yqbՆ^7ƲucFb̪lNDjOyC[PZqGNXH1O* G4©4>=Bwc-ˆ!P j,B0bXi}1E'`Wcũ*Z7R=T^&gץar)Am bE}[d%M@6nJs/:ж#ks` Vj1ӯw=rwr ;dqpC,?i /([K IDATA+~q_돭!Oă^&d?Nk[nu\=r·Y_yx'?Oě|PZϪzBTo!Qi9~$޳jYO.Eu[uAus;|B]7ғħ~3 #&5olZלb3ۮP\ .b'C銣;o~@|Fde44K?)ANBM{ZfiL aM] 5s!Bz2sƺQ' e^^ƙ]jMXg#* (>e4DCGR67!7j+ضͭ}}OAn` OIO駡v׾xm+ڲ0Yty²,Dy|#SIf>x TבqHdPcϪEp^͖k)Na(+3HN;rŇN LoltzW+MzrJN@( 94L9C1Y; ox Tw6vi@<XkL[F'u T;u3:]OvĨ xkSS"${;Ec)a_G^6VY}x[ˈƝPh%!3ak9ř_Rjzl U"RѼhi{oToU^uߋo!Xc,m0tQ x8X{;Hm *" TzX﴾njrbzw}e"Is/c?vg׿ovq ~3G,?k?7OrƩ IUn][Ln//߿#ğ{5?Ƚç_]Dn[>&̚@DHz z굔9Rmdֵw(HΚTRDsvZi mcj3 vB<4ݚhrokh$D,Xsn'U7 $ۆ1PxJDKW){4 ;h6W}]c..h|Kױ zƔ9 jڍh@6hq X>]ؖӨ)`!@3R= ,$0.u/ūr7eZAw}:ڻ^pc<. j4'(k ?^|t}=iB>4=ŶZɑUMS4%7Zf3;p6,ixQ۶2LzyF\L&3=f>ݍn3jmh?u6Rke9\^^\ _v,tQ ({f7oqt2&g/x.odG 9CPJԒ^3yL-"cDI L 5t:ЧpCh5$ C5*[7{jfsHBPZ`:g8!`}RR=X>ȉMV\Q~_#]9g׳#} ܛ ֯{\OHHS~I]' +×GlSH$-(g̽?C{5Ihl[Jc!7Smáե Mf =*Lz)˼s|Q5KM(KgI9IsQ&3]%缵x2ZV_="l5oMLEj:ɜo_>X擫_{ςnUEJR~qKK_=zȾ/_G#o_|0Yjw^vKëo\J/r<+[?o}Z_'| }_v, rRGtJutc"q3n[)"+P.F:tN0#w[79KhQF=RỐ=1$>LqX`iB7w<-UdQ^#@;[Zt NBhwbjR>H6j*Z-^mOEwY{&7pʫq'D (4: T\C}o0Z%.@E⨱Pͳ,h:2&x(sĦGaϪf79(DcD`y=ͧ,8 Q*qh0y4ŵut#Y؀IL4;Zഥ0CDi^dzhr-CoG՜:{G SwZ; NpO#ËF,J+so4p䚘~C7js6 3IC*Jؠ~Qq޳:qDb*ϔZhB/ʣɯ:m$q#2rK443Ɍ*{\%P+4#u>=F9r|>!yku'cz9Xg1߻ۣL@D~xEح{ k { 0-{]t4#j|!E$xX} jFF󸻥5㳧ܕ\0ެ G2qQ_7пBDY^ 5n ֚ ցޅ31n[L [o[z?xa}դfgԲIo,-˴mkx|H_YҖry[|H8=.>_??~n}=A!|~z-k8O۳{r'O>\~GNíErgy_z^Oza0-zZ!r>ө66Ke+Z2VUĒ.IU'R7뽪u|m=aN,qP48TuOlXJ̇$ 1F7XN\uQR\ TriL1ۓiYDQ >;n>tNѸv7`)7h]l sTxh78DF|gf6V=ӬR T:(OR yu1ji7lF lHZ;CkwPq'D;vtp㵈HhT]/@JkP*HeohFnDDlu#UF4L Jp39$mQ[0sq0;k;'rZ>Ffg t°%>:q(A1$*,3ÅZWoЩi4q꣰9)בc؜N-pyiA37ptݹÞk:-ŐӲidl yhdYbQh^õS`ui Lw#I=PpR6kG(8ŻH?+Tu]΁ ub6/wFM oQ}lP1jӬěIM<QP{utGhu.r)"8G۞6V^\В3WMq JsV_c LDFm14w.kIZʇd9gmsdgSH neZB0$cf]x͔4S3w(nJ]~m籮I} A N9u_rl NŠu0n@FYqhHsυ{n@".'gp/IG}C/ǵ纹yhj#<|Wr DGsI,̏V˸?ϴyƞ8|lx{t&-)tVbHHRɦԚ8É߂m=Z}{f8 {d'pP%b:Vʩ}~#1䭷O|/},U4^ xs[}n,ʷn圗>p*4,S~7n%\`m;=竧jٮ`z-{GumZΥN֪閤|٭X_*&br-mmI)'#`6D'TD޽0/e|Fy䍹\6'(IAY4Mi\7 }Gp(ØBhnvwJy}mE4$n7&ܐ7tl9_Z66вO8oM3=Q4 cIr'l+76<7t6Rw/.Y:)qm<&,L'Gcm qwjΙe[&9">U*{r[݇Ƙs}眺WwZID4b(=C@mD2.kUdbdLA7g uoԞ5+lak(G{ C)iƧyFJei-SJR/*hXTBB]W' Yʉ\w95=4eԫLVM@l|C4}vB˴sHjxaq>mƾضe7Mb .*l~w*O5&y(\lk6y5~셯0zEt99;ȼFwnuY%X|Lv{}8Pkӟ vsuoFwUZfMެ!bˎAH^x A[! +ڜk=ejq*MR1.-SUvЁřZk d\;3caw&>}P>#8VWŠ\\sWiށ*iXc/j/,0>׮Ƚ$-!9Lm\gz D6jc<󹄶=|@k浌 )%8;'?M7s  SFN\rAS02yQ Wwƙ^sv[\(wn(e"NsU!ƔISQYDT+a)ӣ4%%:yΧڶ.ONO?z,J<>xtu\Vۺ~X>#h׾5oF oUo~[gկ^/ҫ:h}_S?suO|O4InN ./> pJmO>۞={>`~TnnWmukݵmno7Ҏ^eնYkkqQin;׽Wz:V[j[ͭoLhG׎u=#Bů&x[ݰjynp p@w6/XrTbYHD.F3 tA%дa8a;#"썣#4c11ڕRr *5J` Z+1@"@8ͭm,MVd {cӽn ACn kt[۷@_j$6f`2euxs)aq@S}QD-y]^Ս^\ސmen~ :)oHɇɨh< p2O6`YHSfw7tPa0>2g;(*B4Zfu=/ I`Pb@{r!*zS)#'9m'(5=\^\XL9נ1 )@xoǵ6d@w!2r m8(sjӹyOL`}q )Gxlы &ˊ}L$`Pކ3=AAcFaw4]eDuSJ }5vl=X67Q \}C6dQU1:3z|1c]h¦yr uͮm%%%f1`&2ѯE~-]Kg * ZꮉA"kvdncxR _@DLwxڅ&0Q1, m]brl/!a;Kϊ!z؏Պy/mP}>`-;%} < ;vMgQBf{@õvA ÞM2l{7u V bHa q0GhzaM5dS]wWTZ+k)5c ۺwqT99N< ~~Yq6R?%߻A%[?O%*z8kj@+^R~{s E=M@N}vs`:j&픘G}f@yuچe2 F \6bN"gvӥߑa0Q>TfLyS*\B}vp9׻۩b-HN[o70x7 s#&A F /c9_^Qi=U B>(H; IDATTÉ_P])s*[>xOR"[z'ӏv=?St6:=yq[η׺=[ zR֗P2VWm [:Dj]ar %rK㸛m54t(ȵqAuɨMh2PWbf>ٳ;`:- d:CDFV̆:daMU  Ɯ#}2cFͧ;Y"Qv5kR)#O:-b Gväy!mfސ22'r~sUmi꽢.h1{YLmRf{oG[#BP{[[F;ayEN͈7SH50jl∧]m]2;׊(S2Q )Z\| #ĔZb2#%)0Y{Z~GJůa+ (;&J8=*$-yWbCTiqAn`[zs*ySjfPoCύܺRÅ\8rNRCs1T2t:hZG$6{(5hu ќ~?[ Qe$.0|yn)`r/mCڠ2ζw/ 6slŞDd1uV@9NJ^CK̖'訝t{CgGkw9Kwy]ChHx„+jl_!9GV5U5$oBm#6nMl#\<)їe 6&Y)u #>AX3Vý = \B;6ЂZa_"PmYG4Ro{ΪDw+D&"2\a&9msj]gJ!_>$;!xn$)\kw-nсMMDɛgΔr`3A(5"*DR']IeUB* |Ttuu^}xA?](1V۶*ғ?\]L?_Ez4%z2?,sH飏{?ת*@Ӝ ǫ/txtߢpH9o矝~;7⟿}m'9gM'|q˱z[Jnu;ߜ&\߭iQȱ- =H3Sm+`;mzVˁe9<:?u|ݯ\[di7ad@"T~_rbs!9â^)/N0TB 14!z& az΍,AM5[L߭ȈFUiD: jlRje]гTsO=֜hLmuof:o 85!AFX}7ÚcN=tdLٸF1jDnӪdL;ˉ̵[qMRbSt0^AS;(y\pnP1< _T!p5Ŝ+ӠJk\Uwq=BРBl2FjEf s_sqi}#~B13νN{0C^$<̉AOBá]\},@ZΎgZLw<aq?/ COٍb?U䘎3,ND1 zU8REes53s}v3xL-0ok{n]6Lu`cM:oLb(uF墙P0^q80*)b&E` 2Zڒ1O̡RXn_[s {=ăh"6=3uEu$gf\O sf$ BE4ٚk\=RĆ4fk*'DvmnkLpn G KEL~fD`GȨb? Ѳ}NdFaѰ*=}w1:>t#30&gw˺VrҠοoMQ箉KiH2iޘEAUl 7era)/7lIg<}$c1mT-D'1]x[fuڶ9έ2n;۹U#"tVq1\VX_|1 ɋڰnRAьWvF2ӡ=jpߗ1{ f2)R2Q,r'үt~AJ?KwĜlR(BZ8c~^z2]\1_ޭޯc#7߮_O!M g?c^_~ߜS;mSDt7vn~ r~s?~_m9~G~Bn_ߺn4vVOr}۩K[5MAjZo;X3_04]>x5χBZ<$]҄FD:zSchFsV.'CȦflSb]fjM1=Uf'vn *޻!-OEww]0@Lu4 VbFX /hlb L LK9U$:r䧵]zڦiu[rҠ` *ԭ&YQQp'k `Cp7ZM ߨ(>єF#lF Byݍ5rwq*[nzs촨5gv:hрغ!wdd"/L099>ٴCp<¨Iw=LPQG,{(Cy8ƠH".#TgMӄ23 0xPdunڶai،&+ '|&І>jGdE1f^cA{nVfG_ 5벌aG X +c 6–}E1 պ^ FE^X7{]@ykFصy b+u7#y:@f/"у0D$943e76\ LS7Oi|:F/2Ivmz7)! (fbs xTR^(`κc 9%w9p ki=Js*c=/^<$*6`NJ#*| 8ņ3E6&\c} L| KȽB"BL#`ĉ hDTuS!5%V,@V! z&*t.^o ·Ӵ^ʷzE_OZןZC{?_{M_#>$"Z>}|<6Ή_~xxV;=}ݖS{)M_?F m&L[>=zi:)OWJ1MKN%1_2ђI]mx)7V(Fhqr+sMҬ/>e@{qĴ6 P9r89{gSCRش< ߔ+=L쁁(3S`Xrƶn6\kԤ:lSʨu`)+ @o[\8o)`Εq>19G +t&u dNXlK<LsƺXΫ;ZDN sV0@i ) bؼ{)}3mH~wu# c4t -Ɇz4yZ_C?+ N1axEhVc7-+'?̄kTh(%;iìpqhMgC ;>:O"GYu(迶_Y$vnk֋]]w+6o%`ch h 7U.ڋ'Ξ ,"bx [lCq5(`#0{ZVe1ttFSi<4!\rc L), H}eNHS7leǜnQErAeY/mQ z׶v} Lt8/U/߾[3e*Oַd|ݗ*Ϲ~ƛkQá?xVR֥=ytwd;~z{\opKL*W}/"r轖<h*GPQ^7^7Efh4Im+2[w TN <QP*LX&KȨmwk aiXiJٵHaJG0g 5oF)ۘAB]96셫+lߺ,åY苈dw4C9j\$ZS^}Ql3^QhSJ% 䅧O^̎j!uQ)؊yNj#evv-Ťu;h9"~) \xPG5$:*iH +5a$JcZ(CVGm56P}PRvCXj=蓁Vq<A(2l한 юHG'cNٞ97'N;1)!)tʶ%2qXը{!jl3:Il; y& m9ycF Z%\Q̵V-rBpf^|uiRvͧc3b Om%OX a jڶ A0V.} ! qKpxVښ4kfӎG6704vRQ[1C.&MĞ()36{ʸ7ihEiʀI8WO7C'!i4⃮{r2`o-Bźn UbN%CKdZʈ1g %mL˺oC@2;J8Dp6İCzCH4 h4QA"+̈]È:C tm\|$m<_ dՑ+C%[?v~պX :f JLɳ[OAXVob ԰W3ˆjŽ (fI>&XcH ~$oMaelꍤj|hM*Dn!ٶw..2ۻ[~=SItZsAOW_8sz~)/y_kO<?Px!7_i/Ӝ|}]-)uyr?>Ez7s~Kok׿;Y;'Oo?Ϟǹi~t8R)/<ṗ^4ʚ_9p)|ilNYH9{=(PAi~H("2b@2vQȬmlSO,]Q< DofUBOG:`Eel6ASwz4]ءo+ӪZ`؂S20|U{eBčɤ U.mTsF.M)hF# 4U 5Đ;]/\k'CL:.2CInzw0GU-[T;ќYE^$f(Y3qq<O'f)OL>&#pMAkm=8@;/&tlU, 4v lA8O'ĻIR74 PsdokkD/AagFr qqZFp8 xp4̇~&$VdvB&@Ȍ>cVsᆻuwȬݛքyqdM2'a*L4OݑTbǚy 5 N7'ǹLfܣH}-@:X [% &tJQEYwVBήWU{I$\LM_=[iy}y4DЦC5[i{< qhQll7/97.f@^ё`hY55l qRWB@d) B8 <ͮ1\V\^^1MD݉!mE |=b'sd_3VF^4fm0,2c{ 0 p>o "!" 3wd/3x`1>٣ ȯI{g;I1Jm,KvUU{sls^5uѬ1yU3R$!a#5aB%YӒ.D ZFL`LLdEgx#8P@~.1QG^qWu=qkݵ⎧ɞm8C/i91۟ M\ɴ6_umj g^F̤W;[ 4ǔ ȩ~Ni AVMITZH΢zT@7%Dh" 3)gbj&"YO$}[Nt~v~gK.w|;o ~p|1m\WْGRs$rxC أW㕥ݽ{^R)Զ\$nUţ :/=Ï}/{_`՗z{{^'~ͷ ;lWy /|yq_rL2͔hGi2=ҁ@(XZ]d#~@r IDAT ),4 &stsn(%w fln +x8ma[yBp9IFł6&'FЦPyMKr-M@U޶n<&wL@sk|kcJ#?1!ͷZ!0#A3mmM+~p>v`ױAFJ8thWV#u70)SkrVCbl"eڝ&a7[hmd>2*#w/Hs-KBcCVnX]$4s0`)3!%&_`YP`o77FʆrC09?:iց"ъ.A\ܞFЯ6vLTPٻ|< 4ng&v`$â>ΑR0~A󽠇fp$b4\1栨8gIS%gڭX7./Q-(NxSyfp8Q+0KfhPx˾V~Ş Fٛh MKŧwwh6Fظ bMR3N]ñ,ۼ~pgu-Tv]o+;Wԇ]V5ߍ| .}oس9p"1!fr ԭ֍0! jM`EDfI-,[kŲ,!Ov s;t w11dîu10f\~EN m6G#a TqJB @B}ۖg RgnO r'n.}/Z[Pv~j*9n}gi>^2Wz9uk AλO0:=;x/ &|(eνkY?js!2CJiuW_ۻw|?Eo]>{g$b>\"Rij{Q5LS+5< garHS>vm(.%e+;21К%2׌!C.{Q} -aܷRbij k4]2Q{ZFF'Bi4>@P$345Ze}=;*!ФYئPnMˈͦbvzi':ֺB`vS]6\½6kh8ԑ Hvhj ?$icYzoXu}JG@ pp0o2kEˉ- N6@s: wv`A~]ZwmEnC;¶nmd:fT( ;za;LqWnqL_uJD/TB*և~.փd"fulL7k4;av3 j+e٩FpC\mmp^4l&ݟI{3I=ڪɴ],Qd iE_k͜'`J)"sɘ\h ]5[qG%\/9hџѻ@o}~}<=m14{^ۀ";54~(Fԏ ${4&pck=M@R}b-;CQb/pNpU5*yٲ A`nUܪYn!Lg,R*4:F^R `L ʠg8o^ ": λ>.q) eMq>'mѾG AlŹ4Ǟ0Xa2'FnFIn=1Vo'7[KdwhcynlTi€QwTpޫRl4{vmJ7?ԇ:͒Fw9 %X3}G\v?ݭ;H*17c;Ѹ9xc~/:{ky!fro׮bVs8b`[]@Ê\ i|8OpC?ߺЮ Զ"O4ǐ Qd%l4wAU掞RT&o%S/ ")$)g09kbl3TVZ[;Iow۪n{[ov>}򸷺RLyLu;ݬۻzN7)'>Gtwu'oo-_ooOz:}}(o|Skۿ%P77ް/_[C_W>wy|a?[RfH.K?UYWoyDҳncͭn~k)h:|491MZ)"v,ҩk]LK9\4Yz>-"ʂ~ GQ0P JUAɾMZwJ+֚?j%4K6׈ OBF7WICk|cp)c۠D m"fԲ('NȔAPtTOknnmYԶa*֠mBVi2SgG]yPlMjMB B)YJ<;"ӧfp`Y&og ŞhY L3 6hQ|}[&_6aNf+%%( ~M;JNu5Eu=HD1Z4rWvITp: Cɨ BN&XgbCXu 5{w&h 0js'y>,Gj$,PEZr!͝H/>P%(%gGBԭbۚ`|K!oHdHPv>'m.03$j33>Źi %`J*v&g4O0r.@]@$(Vm] Stԩ;(1[ufU`xHa%gPGg=eRL![ΎW{iJhlxYe f3' avQ/ tk' 4W8q:.n w>No7\>xim.~N86DILăΌ"1ꮯ P>))aӆ|PYO9*; ([ƭVFֳN7Dn?xYJ gtɳm+_TT >~v*:z7Y5)昴|3G=1^_OG_\7h7m˧MvZnd9СCZ^2/Gٿ~'?Kzs;wo,I>۞Ŕ mHxqyK/|1_=|._LG ʙܥA|J9v*IK.Y7Q͠|o `,1 ]YwZMSꮃN9E&w]\^b/4a>̘go:eE~fkuA ?ψl.5#iaƔNČ1r:7ne1;wGJcT96u-j(4rfu=5245V9Q9r^]]þm?%!'Si*,bf-'wm ~pId]vOLN $Et9M,˲S*#-nh: >$稩ծ캼z JʮUͥ$c28̇ؿ`Z5QyX;%/]iQ1 ؎dNHn!s'] #0 _7Mɀ8EY]2p8D5Hg >b)}rY5$]tq!A*X 1JLçr}Ő0W i!ut^,MNd69O^Dl L`k"<2†Hٰz3vxQJsqyqXȽY!0A (lH5;uP ElTzrX33ӡEn~FԻ= Q0/STՊ.FGBSX}铧ܝnUxY'.'ž|}E޻IYѼ T^<\ܜrU./h(?p5%&FyBc.ΤzoK %Ez.ez,|wEN\֥7V1Kx9lAcba`lf_x9EݥpfFa33V65 =( HCwApM`4Jx֔u0UouЂT R5h:Д8܌|QDhsF!s| h1N^8vXfw7' h(m7=r6[Hk8=( ϟ"i/e*| 7Uy8Ltl텾S7̲X:CAd<AIMaCSkwע%MkW?"(i24uJ"@2&wއC;Ф)ԩB~HJp"){GqZ4"uMsceki|@bח>YƸ{$ۀ0v%nk&` "4Na:Ⱦ;&FWp?|m(~T+  O MCW3 {@1+9YDB\C&O46LvVk{Pׂ;*:޵nlHFe 6I5,JJ#Dh Շk1QlQkޛ#WOͳ S*Vz6'mQxG>[!ٳ4y pbch]`7G[:y<; F\{ g 1ӴqM0-Ҝ@oqKqF0}kYAŐH ahg%4{֧gIm#tR6la;x0N9%j3h&vˆ=pߛTI jzZ=~dk]oNpS(gp)OJM[zS3 Z3O4|K{~4<.؟p oZR#AsNcL9WJcbVީ gNs)_Q3:kԲ9꺜w'lnmiz#{֭.u=ߜs>7͊ڱn[J|^|s_/|++w5}eqto}kG ZDW|o4GMsy{+\x!s5ʲ=Q]D(qnϤwӔ^xa:}W~}?:/ers{Z4eNʏ_Jǫ<]< kk^rAh"Җ \O4 Jxs?-]As뭊4Uږ󵨦beEVp"w L+DB4IXEq85L)kc@z4(A)abMVGѢ,xMm]1@6zTVP@8P-D*(P9}c3*ZO\c|:CxQB2? VvRGz:6('()G()Y O']S8!Cpa|DŽwH6t:e*NA KC%ɶCǦV004 F)yiuA׎2",T3{^ZCB8&^Pѩ͛,ݡPӟZFd6& ڵv& LŞ Ձv5 <-* ܁NV<$Jbͻe\=l]W#!%%lnڽ$dفϘKFB{ۯ-0Sͨ$ VGd^Eo#ڴINP Ï MMjSܺ-M9hi"C8EKbd*F+ ym_AI\p;-\aje+zwi4TL3xsc8U0s|?Z[1#4e2lM鲆LsTLypM 0{ @l{t 3E)y,Vǘf57$o!R; t4F[%L{FfqFB46aSY'HBbl"Yd{nz/` R)t: g:'C*qƚe!ufp@oJc\ZPRZ  `B!&s:țS@`v%V]pkx ݘ)$ CsGJZ ܈t_)g$om`HJ%L\t IDATР\HHQN) `$^n{'uNҷzf$ʹ.L]Gys[sεs:lZɤ@ +)[^y兗 a7!A$@]m&mW]UN]^k^cJNΩ}Yk9۩wxygOWӣ]};_''~7lȿO'k=}}W+]+ߟJo?^}]۾ [_5ɑjtqwQ_˟yyX}o||}ZG%,zXm;o@%ez>z27w;Dǧﶾte@"E:,[tBdpDF`/,&`^Ppu}BSF ZUL.gnK2C!염Lr 9I?PӯJ6SJs8eF kּ4R/2s^lSTJNmg_ 踵Z#9БB{칏bI_h.oB[&Ĝ'dR2ifa^L9sc2=~sDc~&hc} ,f#U1%+袇k\C(摽y(&%cY ]N!'u%[C?d "@MS-"@ftOib tӌ q,2jSmC-[`%+&G g6X< 1;^Kg^ R>=m*>~úDp8v $ЩibР`Vפ{,f $ q"hK !|@hxk5 m0cЅYBX VBHn2OK^P!w虪Mzf9gtTk8,$)#nޛ!)ai!fY*KĚdlG}.F>$ƻ9gw"Y3XMuq#ð~3V"a v:;Ng]~DX%' NĬ6[ĉ+( hrYPuaxJ,mnݾ=ۚr~޿VbZӁ^Ǐ[h?ַʋr8\MwӇ~g 7>y@ ~qH(()~W!p3lusUZ^gHӻ?o7_>6g,?~7[ʜ}(UR(___ %^Y 7>- Y{۷IHzDLY*%t]XHʢ4,<"`\(9FA",G3r)(exD)DW^M b1|#C,\$$&,wl$'쮝kXMzXܦ CiP!ArIW׻3;T-k3G(%_Ia^No#",jc)㴝VϊcӸ@Í}mkʕDBDݑD9ZĞzRPr6z ]EfAd) i1羔֪7eY`𤴉kYx@yx0DFRgRl,ŝJsBD6\紂DФF4F3:ƀC^PKeYP[sc'sfקzE4 fCNRfŐP\ $a/b&BS-f Soéֆ|*4< hTHhrBG$3M2<Q/Yms0[VyC*lCGЌAހ:,O02(M 5`b&l)] \{w3rF(bH#GLn͏0I#3ӌ9vX("*ZyfklnvaLv"8U3; Kum  ,ԟ۩AO.Ff?VݍՌb2xu(49Bއ7aPuW4_bl_\*d9./i#a3XЭ(pɴm0?Vl&R%:J4 RٸPkYf6vc(Wr?@4AFI#v6 7Mit7`:B(p$$"sH3e2rsaR$ZQsk$Mpn,쳞SG5%f1Bm@1f~f9MvdGp/}jK#|oh3($1{+Ml0ճ-ٵA';,Pu"gݹy܋yMdn4ZhJ 6bchCc@#7%UusS:xd3>w{}^ϭ׽ߞ Bz1ZҢWR}G۾cq~iz||K_Ys󪭚:|snm͒8^-$Ԅ֫5Q.өRxH)Wr?;i'߶z؄i?>~Gٳj?~mFUUGK_xvRuG^bYϞ u^+Uok>ÓPe$,i)WӁI<iƐ޶H6\(i;CrJQ{s)"!0PŲ"WAlr|̘qOHHa6(G_T͛Yt$>eWT| SM)~g$2@G;'zPŶ}S6wONVuߛ(9d@s0Q/BO4afYlY,sX;u۾ɋO c_|̺t{(d>PMզDfr`i}  e:}\_hVL,n3uq߭Y$S5`uFh/z&ҧɁzFqgY6uAfF ~L%UU1hϡUCպzrm0.:#4&`M^R 2zX3`[p3Ω1)A54hJ<¤7Uc{ĵ5 FVJAs^2]4gdW 9Fϴ5j=֟(5Iq>y9L]@8n7XMR6CoǵcCv*|Lp2SSIs]Q"ßOc8펣)!xsѰk_>e Gb=tNET cݫ#>lkSFѫA->Mf[dg |8ZzLaG%4 ڹR}:=s2I_rxLSXn߼33*1 CW@mieI,zzp/pW?'a/~ISu`ooOǫG\;;N*rXI{[T\=ej{u\^wu`Pn:wlj%bW{EpbCH1Bfc?s^MK)S4 tE6mt6|٦!rjč487'[tӋƘ|,t~<7g .1\רVQφgx^7D߲lh:>/Ӵ@aזdMxYͲ CX$Y!="b:COFؠ,ao]ض9L?cC(RI`-jaR$vpTȊ{Cբ|%fDмd[5WH"2D:OZkT0j(ZdKcoDžU$5aQ83.PhmOhV=={1:ܨhuR܄Pڋ(-@UEfX8I8 |9$7J| 2Fwj^.u2Z3نEAxh,鐕N. Q֚jyeF62D͊=2N}!U]yAD!L3sA xFpe>JBQ G8:sDb, '$q?7t:U䅘59xti{51r#Yތ>Z& 6⼢yj=^xjL"tɆe]}ϯ:C sQTwl!H5#q>P5{$ٟA͕:*L@TCKlpY%+51$$˽"ff>$3k0D܈Rr_qp =~[7*3uf%V!&6D:6UD,HB6b"cbFC8'KVOwwߎ$`=t}IrX;mh777uNϞ|0~g_{vT靻꣗t'/^@O?Չ{?VN,$o:GKYU#Z7:oDjo_`돎[^Ͽx~Ӽ\Tzw{FI9wtB*TqۛvZ+WҲ\(QZq"Xs:(:Zv*2ӚB'G>FF(Rp)AJ@ NȩL$0 =o\B`- PHZ.ȄӜ)Fc) i٫KL @>$ -+aD$K!rֽ^%x\>dioF1aOf,H BW5~Wm. rG#FAF^Je%plesnO,>Y-x8h:}݂*s go͊soc›`]71+h\$ŤCmz7z8x`rRL.2Z! RJy6o +5^ah:"|֧ lw:-ϟ|Ar3x01LB4@0#N *92eP -\P5`dG!uU CAdn`Mtz[<L Gr)T˺'kT#1dD3RK&A`=4֥1.?{Hn)vçBFEsN b%C-~sެߓ3Vfuzhh%_6q;ҔHɘhMǠمf6b l sGz~>kВʚ%Xa Pɇ4X,<] ş'AzeٞD,;8:DN̈gHwdLǘRDuw*Ӯo}+kkU 298rg#N(ݣfܱyޯ,aCI{6/6t^ڛh~Ev'UݲrґN2=z>hUbŀ/8GUW؆UPZZy =Nz0ͥub*sX $EFd>hPmo$PA];1q+RlC1D{o_^oHhD빷R^n>b;Ӿms֩e>#.[w?[탯|Kӛ7Wݟ;]w t{{OM3/\SJzęm6t&$&N2'.-v,9땉P; r IXr 5ic MSX'G}#beY>Nhv(mC>_Lm S&{說SCl>^ no0) =4a$.xaA֜|p3Y +@3 }z浪. e3&['53Z;bRdem{ 1N\tA Zq(M[}Xط 9WkN7Jbb p$: 0qz-#cp8|:oVksI&+P0# ZXSk`f݁E*.#A_ > :-C[Pڼ@'6("Em HHV<^켣 k9h6e$-e~zb$ad4HTPGD9Mbϊ D2w-FTin8Ddeуq9`nM{߇]hŵgXq8504MER8]r4N[m(",idThS2#z8V)DY:p)SGxkfM;^Qrdaz JN抜_ fġ wѠ9VNXϏUH%l YS?tӎ|E CIDAT,n?qaAfˌ̰hYV0X(c"&=yx8\S^n锽=!| 9(68ɗ_sqCcx̆5P%XD\FPs޴:CڹBs1b-A󳔽魱9C @%S^!dNq2fNff&s2Qeԣ"y-!w.a} A ՑD;U؛ОmGβpb\ݘ&Y`zh$dfg`duV@ɜV(f>,ne `H%-,ȡuXŤQSOJD1u0 -؆`@y@*7^vZ[=c8'QT![)s"zn;+ӓ/͎1>AڷKhp໻O> ğ#`Kc7 w/ϗRv1Ʀ*cO q|<ғ'ݝuGſkt\'|*WU]_'s~swѳ!#N)K*\YI<\]7ՔdFuy體3q_|Ug ^{Oey2TӠ9E X B?}qakm㰈MWw'\ϖ=yF2ؤ>9% 8r;Ol推1CMu`*TǗSw9@&fKXK2ZK6Q!1Saq(ItwDf)\'#^2#02_*Q/91f@`\M"7?\94`]V ;ͩo-\!NCɎ6ަO mkp}QF:p\MF"C[FBVh_tnar]m>+KL3ș ] ,z؋)+DlBM>Мi95L>9efT@o|yO'To.`(oa#bC( u pu6 H/(A0r5Kz9``x_Ak} p܌ѻOgBM{M,|t6qv] SPAAZrgPmag]lYg0bNyR0Ƀ~6yYfSZD2"Ia]81YdIJSH|I\ZUM+-n֜kI>NpS1[u7zuCѶ{kh~%]֖#)'4ՙgȐ9YE5ֿ|fr 1n".RhkIY5MOf52m nlNٝu2sc;3EɍpPmq׺.X}Ǻ.0 mUhWw3X,L& wJ ˅AycqݤVD`ھ*2_-MMYj\{q#!LBAsIhN"dQ}߀V{V1TRyY6ծ20޾ywI;qq;7o>`<'|2~ښAoҒgvNG?W]wWnox "*HUQonh7o|GܭWNon{;-_<}3-{?.\_{NI}߶z:on;ߧ>z4'_t5 /::1O;KR*"{_ԵV5,ojk(׿Mi8P5CWt6κo` 2l{Xw'lH9Wݸ˲V0tsFM ZBw73`tI-1 i]7"b0d wF:shFՉ-ГN9ẽ^?ؼ` W Yko^7jO_u/ӊ`Ssw" m$eHkϳzx0LgPkvs 5h˲X\LR^|hd7 !s~kuwz%hrhR[^0y%gzI ;98e4%4QG0^tx0KGރII92eFU Mzs#nhcLC@ⴆ u%g(R(aΚ lc|PʊpRHFb"u\?<] #,|ih _1T;+_29)!c8ÇnY, gGZot-QӁ,]/H=0ujnX G՟Hy΄kkr35@ 6v b8W8C(q }>:j3[F[9gv3Z<-y<+OgLxJ߯Kk">0c}GUʽ\?Ix]ps_?Kh\422_k9%qm-x;㓟G+޾zw~=ɒn??^kuY/_9qjo{ZGSEzHgӗ_Gi)WJ#1A TL+rnwFGvȊ1́ j;zSJ1<Цc ?H[ Y4C{f0h6xsڴ C W`nL4`, KB6/v@PE9cdYaUuhf*=N /g0kߏ<1 T|3>F԰Nf_{7# j(q/e³z\;GwWI\ޒ )dɐb&!eY0ȵd~@Jh!GllB1%9Y){@ ~4!`Hr0S&,˂o`78 {,S*~ィݦLPI%+ՊYM `g&Āpr̄jPֲC-(1%)j"W,=NfYofVEE 1\rMlC8T"@?ELаW{ꨲ:UߟxZ` 0tH}tԲ,)f0(o^(ͮkɿ=]<ݍh啀fP@e,TFFBdf-KvF3j$@$Ӝ4̬ڝ{Ala)ՆGpeZA̦VX!XJ (f@F{ u7l=븸91Mpi>g`щ;"G@Y1pXa$P2Gv{,F=Q@gC2Rm [;q#&@A2 0̐hF _ʂhinXphsmRb>0SQLyG{ys30Jiyp]: f>}Qv3lTU/c?CNF BJ'0}JAH-fC/qᨒDHVk>D&AP6IYj:pvHo!<ǽfp ` j.Lr񳈞]8]L=R"ZA'5;#SFCxuj 9 qi={_]@Yͻ‡%N'[DY QPՓt8%[4센j#33GclL$ )Cum; g$cSJ`vϟ|yOY~/o_?^7"Ŷ})P̈́Fۛ7uo'RY4o5Wjr7Is>+_yw>?ʹJyceYR'tt߽-umvfdZ(hJr@)Wrxr>Q.GDF$U|[{L6>),$ي~\2gŢD}DT&Sz6i d6;h;[2Χ#;wU/oopm2ѤŁ7#8UȋÈAr6)@-eANBlxOvR6׻]Y>]e>4p I44f%}uD&hҶWX!,,*!cF֮O4w^ĆB7+#&ޯ!6l7qsU/g{N/ (O*d A4NppSh9UAEߖsz0QLe%Iч뾱rL1=ײ.!Zt 9! L(@%˾-{aCxD!iMjtmX݅xju햬3q6W]^.`3!KByLϸeC"tKdEied41޻k W\:<ôjKY\d(0QgL)L3j@@jS.XKAξah> %Ha?%` tјVa$bߵ6e Tct/2k &n63L19mC)e(lXm _G#e)}($ǝg4裹ZAQhjnyɓK~m0ʘT4Q8k#\EX&57+zȆ#mwCL#*L`%̕= OS;KEfo_9Fʍ6i Fc - `\@ÕּRc\*VB j-@ퟃo뤁`jt1n4@Z(U&/;%qnDLjonzvkzy}Fϓ,'_} ?!pΤIENDB`python-asciimatics-1.15.0/samples/images.py000077500000000000000000000035441511423144500207020ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import BannerText, Print, Scroll from asciimatics.renderers import ColourImageFile, FigletText, ImageFile from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): scenes = [] effects = [ Print(screen, ImageFile("globe.gif", screen.height - 2, colours=screen.colours), 1, stop_frame=100), ] scenes.append(Scene(effects)) effects = [ Print(screen, ColourImageFile(screen, "colour_globe.gif", screen.height-2, uni=screen.unicode_aware, dither=screen.unicode_aware), 1, stop_frame=200), Print(screen, FigletText("ASCIIMATICS", font='banner3' if screen.width > 80 else 'banner'), screen.height//2-3, colour=7, bg=7 if screen.unicode_aware else 0), ] scenes.append(Scene(effects)) effects = [ Print(screen, ColourImageFile(screen, "grumpy_cat.jpg", screen.height, uni=screen.unicode_aware), screen.height, speed=1, stop_frame=(40+screen.height)*3), Scroll(screen, 3) ] scenes.append(Scene(effects)) effects = [ BannerText(screen, ColourImageFile(screen, "python.png", screen.height-2, uni=screen.unicode_aware, dither=screen.unicode_aware), 0, 0), ] scenes.append(Scene(effects)) screen.play(scenes, stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/interactive.py000077500000000000000000000112251511423144500217450ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Sprite, Print from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import ResizeScreenError from asciimatics.renderers import StaticRenderer, SpeechBubble, FigletText from asciimatics.screen import Screen from asciimatics.paths import DynamicPath from asciimatics.sprites import Arrow from asciimatics.scene import Scene import sys # Sprites used for the demo arrow = None cross_hairs = None class KeyboardController(DynamicPath): def process_event(self, event): if isinstance(event, KeyboardEvent): key = event.key_code if key == Screen.KEY_UP: self._y -= 1 self._y = max(self._y, 2) elif key == Screen.KEY_DOWN: self._y += 1 self._y = min(self._y, self._screen.height-2) elif key == Screen.KEY_LEFT: self._x -= 1 self._x = max(self._x, 3) elif key == Screen.KEY_RIGHT: self._x += 1 self._x = min(self._x, self._screen.width-3) else: return event else: return event class MouseController(DynamicPath): def __init__(self, sprite, scene, x, y): super(MouseController, self).__init__(scene, x, y) self._sprite = sprite def process_event(self, event): if isinstance(event, MouseEvent): self._x = event.x self._y = event.y if event.buttons & MouseEvent.DOUBLE_CLICK != 0: # Try to whack the other sprites when mouse is clicked self._sprite.whack("KERPOW!") elif event.buttons & MouseEvent.LEFT_CLICK != 0: # Try to whack the other sprites when mouse is clicked self._sprite.whack("BANG!") elif event.buttons & MouseEvent.RIGHT_CLICK != 0: # Try to whack the other sprites when mouse is clicked self._sprite.whack("CRASH!") else: return event class TrackingPath(DynamicPath): def __init__(self, scene, path): super(TrackingPath, self).__init__(scene, 0, 0) self._path = path def process_event(self, event): return event def next_pos(self): x, y = self._path.next_pos() return x + 8, y - 2 class Speak(Sprite): def __init__(self, screen, scene, path, text, **kwargs): """ See :py:obj:`.Sprite` for details. """ super(Speak, self).__init__( screen, renderer_dict={ "default": SpeechBubble(text, "L") }, path=TrackingPath(scene, path), colour=Screen.COLOUR_CYAN, **kwargs) class InteractiveArrow(Arrow): def __init__(self, screen): """ See :py:obj:`.Sprite` for details. """ super(InteractiveArrow, self).__init__( screen, path=KeyboardController( screen, screen.width // 2, screen.height // 2), colour=Screen.COLOUR_GREEN) def say(self, text): self._scene.add_effect( Speak(self._screen, self._scene, self._path, text, delete_count=50)) class CrossHairs(Sprite): def __init__(self, screen): """ See :py:obj:`.Sprite` for details. """ super(CrossHairs, self).__init__( screen, renderer_dict={ "default": StaticRenderer(images=["X"]) }, path=MouseController( self, screen, screen.width // 2, screen.height // 2), colour=Screen.COLOUR_RED) def whack(self, sound): x, y = self._path.next_pos() if self.overlaps(arrow, use_new_pos=True): arrow.say("OUCH!") else: self._scene.add_effect(Print( self._screen, SpeechBubble(sound), y, x, clear=True, delete_count=50)) def demo(screen): global arrow, cross_hairs arrow = InteractiveArrow(screen) cross_hairs = CrossHairs(screen) scenes = [] effects = [ Print(screen, FigletText("Hit the arrow with the mouse!", "digital"), y=screen.height//3-3), Print(screen, FigletText("Press space when you're ready.", "digital"), y=2 * screen.height//3-3), ] scenes.append(Scene(effects, -1)) effects = [ arrow, cross_hairs ] scenes.append(Scene(effects, -1)) screen.play(scenes, stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/julia.py000077500000000000000000000007371511423144500205420ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Julia from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): scenes = [] effects = [ Julia(screen), ] scenes.append(Scene(effects, -1)) screen.play(scenes, stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/kaleidoscope.py000077500000000000000000000036211511423144500220730ustar00rootroot00000000000000#!/usr/bin/env python3 from math import sqrt from asciimatics.renderers import Kaleidoscope, FigletText, Rainbow, RotatedDuplicate, \ StaticRenderer from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.effects import Print from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): scenes = [] cell1 = Rainbow(screen, RotatedDuplicate(screen.width // 2, max(screen.width // 2, screen.height), FigletText("ASCII" if screen.width < 80 else "ASCII rules", font="banner", width=screen.width // 2))) cell2 = "" size = int(sqrt(screen.height ** 2 + screen.width ** 2 // 4)) for _ in range(size): for x in range(size): c = x * screen.colours // size cell2 += "${%d,2,%d}:" % (c, c) cell2 += "\n" for i in range(8): scenes.append( Scene([Print(screen, Kaleidoscope(screen.height, screen.width, cell1, i), 0, speed=1, transparent=False), Print(screen, FigletText(str(i)), screen.height - 6, x=screen.width - 8, speed=1)], duration=360)) scenes.append( Scene([Print(screen, Kaleidoscope(screen.height, screen.width, StaticRenderer([cell2]), i), 0, speed=1, transparent=False)], duration=360)) screen.play(scenes, stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/maps.py000077500000000000000000000571461511423144500204040ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import traceback from math import pi, exp, atan, log, tan, sqrt import sys import os import json import threading from ast import literal_eval from collections import OrderedDict from asciimatics.event import KeyboardEvent from asciimatics.renderers import ColourImageFile from asciimatics.effects import Effect from asciimatics.widgets import Button, Text, Layout, Frame, Divider, PopUpDialog from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError, StopApplication, InvalidFields try: import mapbox_vector_tile import requests from google.protobuf.message import DecodeError except ImportError: print("Run `pip install mapbox-vector-tile protobuf requests` to fix your dependencies.") print("See https://github.com/Toblerity/Shapely#installing-shapely-16b2 for Shapely install.") sys.exit(0) # Global constants for the applications # Replace `_KEY` with the free one that you get from signing up with www.mapbox.com _KEY = "" _VECTOR_URL = \ "http://a.tiles.mapbox.com/v4/mapbox.mapbox-streets-v7/{}/{}/{}.mvt?access_token={}" _IMAGE_URL = \ "https://api.mapbox.com/styles/v1/mapbox/satellite-v9/tiles/256/{}/{}/{}?access_token={}" _START_SIZE = 64 _ZOOM_IN_SIZE = _START_SIZE * 2 _ZOOM_OUT_SIZE = _START_SIZE // 2 _ZOOM_ANIMATION_STEPS = 6 _ZOOM_STEP = exp(log(2) / _ZOOM_ANIMATION_STEPS) _CACHE_SIZE = 180 _HELP = """ You can moved around using the cursor keys. To jump to any location in the world, press Enter and \ then fill in the longitude and latitude of the location and press 'OK'. To zoom in and out use '+'/'-'. To zoom all the way in/out, press '9'/'0'. To swap between satellite and vector views, press 'T'. To quit, press 'Q'. """ class EnterLocation(Frame): """Form to enter a new desired location to display on the map.""" def __init__(self, screen, longitude, latitude, on_ok): super(EnterLocation, self).__init__( screen, 7, 40, data={"long": str(longitude), "lat": str(latitude)}, name="loc", title="Enter New Location", is_modal=True) self._on_ok = on_ok layout = Layout([1, 18, 1]) self.add_layout(layout) layout.add_widget(Divider(draw_line=False), 1) layout.add_widget(Text(label="Longitude:", name="long", validator=r"^[-]?\d+?\.\d+?$"), 1) layout.add_widget(Text(label="Latitude:", name="lat", validator=r"^[-]?\d+?\.\d+?$"), 1) layout.add_widget(Divider(draw_line=False), 1) layout2 = Layout([1, 1, 1]) self.add_layout(layout2) layout2.add_widget(Button("OK", self._ok), 1) layout2.add_widget(Button("Cancel", self._cancel), 2) self.fix() def _ok(self): try: self.save(validate=True) except InvalidFields: return self._on_ok(self) self._scene.remove_effect(self) def _cancel(self): self._scene.remove_effect(self) class Map(Effect): """Effect to display a satellite image or vector map of the world.""" # Colour palettes _256_PALETTE = { "landuse": 193, "water": 153, "waterway": 153, "marine_label": 12, "admin": 7, "country_label": 9, "state_label": 1, "place_label": 0, "building": 252, "road": 15, "poi_label": 8 } _16_PALETTE = { "landuse": Screen.COLOUR_GREEN, "water": Screen.COLOUR_BLUE, "waterway": Screen.COLOUR_BLUE, "marine_label": Screen.COLOUR_BLUE, "admin": Screen.COLOUR_WHITE, "country_label": Screen.COLOUR_RED, "state_label": Screen.COLOUR_RED, "place_label": Screen.COLOUR_YELLOW, "building": Screen.COLOUR_WHITE, "road": Screen.COLOUR_WHITE, "poi_label": Screen.COLOUR_RED } def __init__(self, screen): super(Map, self).__init__(screen) # Current state of the map self._screen = screen self._zoom = 0 self._latitude = 51.4778 self._longitude = -0.0015 self._tiles = OrderedDict() self._size = _START_SIZE self._satellite = False # Desired viewing location and animation flags self._desired_zoom = self._zoom self._desired_latitude = self._latitude self._desired_longitude = self._longitude self._next_update = 100000 # State for the background thread which reads in the tiles self._running = True self._updated = threading.Event() self._updated.set() self._oops = None self._thread = threading.Thread(target=self._get_tiles) self._thread.daemon = True self._thread.start() # a separate directory to store cached files. if not os.path.isdir('mapscache'): os.mkdir('mapscache') def _scale_coords(self, x, y, extent, xo, yo): """Convert from tile coordinates to "pixels" - i.e. text characters.""" return xo + (x * self._size * 2 / extent), yo + ((extent - y) * self._size / extent) def _convert_longitude(self, longitude): """Convert from longitude to the x position in overall map.""" return int((180 + longitude) * (2 ** self._zoom) * self._size / 360) def _convert_latitude(self, latitude): """Convert from latitude to the y position in overall map.""" return int((180 - (180 / pi * log(tan( pi / 4 + latitude * pi / 360)))) * (2 ** self._zoom) * self._size / 360) def _inc_lat(self, latitude, delta): """Shift the latitude by the required number of pixels (i.e. text lines).""" y = self._convert_latitude(latitude) y += delta return 360 / pi * atan( exp((180 - y * 360 / (2 ** self._zoom) / self._size) * pi / 180)) - 90 def _get_satellite_tile(self, x_tile, y_tile, z_tile): """Load up a single satellite image tile.""" cache_file = "mapscache/{}.{}.{}.jpg".format(z_tile, x_tile, y_tile) if cache_file not in self._tiles: if not os.path.isfile(cache_file): url = _IMAGE_URL.format(z_tile, x_tile, y_tile, _KEY) data = requests.get(url).content with open(cache_file, 'wb') as f: f.write(data) self._tiles[cache_file] = [ x_tile, y_tile, z_tile, ColourImageFile(self._screen, cache_file, height=_START_SIZE, dither=True, uni=self._screen.unicode_aware), True] if len(self._tiles) > _CACHE_SIZE: self._tiles.popitem(False) self._screen.force_update() def _get_vector_tile(self, x_tile, y_tile, z_tile): """Load up a single vector tile.""" cache_file = "mapscache/{}.{}.{}.json".format(z_tile, x_tile, y_tile) if cache_file not in self._tiles: if os.path.isfile(cache_file): with open(cache_file, 'rb') as f: tile = json.loads(f.read().decode('utf-8')) else: url = _VECTOR_URL.format(z_tile, x_tile, y_tile, _KEY) data = requests.get(url).content try: tile = mapbox_vector_tile.decode(data) with open(cache_file, mode='w') as f: json.dump(literal_eval(repr(tile)), f) except DecodeError: tile = None if tile: self._tiles[cache_file] = [x_tile, y_tile, z_tile, tile, False] if len(self._tiles) > _CACHE_SIZE: self._tiles.popitem(False) self._screen.force_update() def _get_tiles(self): """Background thread to download map tiles as required.""" while self._running: self._updated.wait() self._updated.clear() # Save off current view and find the nearest tile. satellite = self._satellite zoom = self._zoom size = self._size n = 2 ** zoom x_offset = self._convert_longitude(self._longitude) y_offset = self._convert_latitude(self._latitude) # Get the visible tiles around that location - getting most relevant first for x, y, z in [(0, 0, 0), (1, 0, 0), (0, 1, 0), (-1, 0, 0), (0, -1, 0), (0, 0, -1), (0, 0, 1), (1, 1, 0), (1, -1, 0), (-1, -1, 0), (-1, 1, 0)]: # Restart if we've already zoomed to another level if self._zoom != zoom: break # Don't get tile if it falls off the grid x_tile = int(x_offset // size) + x y_tile = int(y_offset // size) + y z_tile = zoom + z if (x_tile < 0 or x_tile >= n or y_tile < 0 or y_tile >= n or z_tile < 0 or z_tile > 20): continue # noinspection PyBroadException try: # Don't bother rendering if the tile is not visible top = y_tile * size - y_offset + self._screen.height // 2 left = (x_tile * size - x_offset + self._screen.width // 4) * 2 if z == 0 and (left > self._screen.width or left + self._size * 2 < 0 or top > self._screen.height or top + self._size < 0): continue if satellite: self._get_satellite_tile(x_tile, y_tile, z_tile) else: self._get_vector_tile(x_tile, y_tile, z_tile) # pylint: disable=broad-except except Exception: self._oops = "{} - tile loc: {} {} {}".format( traceback.format_exc(), x_tile, y_tile, z_tile) # Generally refresh screen after we've downloaded everything self._screen.force_update() def _get_features(self): """Decide which layers to render based on current zoom level and view type.""" if self._satellite: return [("water", [], [])] elif self._zoom <= 2: return [ ("water", [], []), ("marine_label", [], [1]), ] elif self._zoom <= 7: return [ ("admin", [], []), ("water", [], []), ("road", ["motorway"], []), ("country_label", [], []), ("marine_label", [], [1]), ("state_label", [], []), ("place_label", [], ["city", "town"]), ] elif self._zoom <= 10: return [ ("admin", [], []), ("water", [], []), ("road", ["motorway", "motorway_link", "trunk"], []), ("country_label", [], []), ("marine_label", [], [1]), ("state_label", [], []), ("place_label", [], ["city", "town"]), ] else: return [ ("landuse", ["agriculture", "grass", "park"], []), ("water", [], []), ("waterway", ["river", "canal"], []), ("building", [], []), ("road", ["motorway", "motorway_link", "trunk", "primary", "secondary"] if self._zoom <= 14 else ["motorway", "motorway_link", "trunk", "primary", "secondary", "tertiary", "link", "street", "tunnel"], []), ("poi_label", [], []), ] def _draw_lines_internal(self, coords, colour, bg): """Helper to draw lines connecting a set of nodes that are scaled for the Screen.""" for i, (x, y) in enumerate(coords): if i == 0: self._screen.move(x, y) else: self._screen.draw(x, y, colour=colour, bg=bg, thin=True) def _draw_polygons(self, feature, bg, colour, extent, polygons, xo, yo): """Draw a set of polygons from a vector tile.""" coords = [] for polygon in polygons: coords.append([self._scale_coords(x, y, extent, xo, yo) for x, y in polygon]) # Polygons are expensive to draw and the buildings layer is huge - so we convert to # lines in order to process updates fast enough to animate. if "type" in feature["properties"] and "building" in feature["properties"]["type"]: for line in coords: self._draw_lines_internal(line, colour, bg) else: self._screen.fill_polygon(coords, colour=colour, bg=bg) def _draw_lines(self, bg, colour, extent, line, xo, yo): """Draw a set of lines from a vector tile.""" coords = [self._scale_coords(x, y, extent, xo, yo) for x, y in line] self._draw_lines_internal(coords, colour, bg) def _draw_feature(self, feature, extent, colour, bg, xo, yo): """Draw a single feature from a layer in a vector tile.""" geometry = feature["geometry"] if geometry["type"] == "Polygon": self._draw_polygons(feature, bg, colour, extent, geometry["coordinates"], xo, yo) elif feature["geometry"]["type"] == "MultiPolygon": for multi_polygon in geometry["coordinates"]: self._draw_polygons(feature, bg, colour, extent, multi_polygon, xo, yo) elif feature["geometry"]["type"] == "LineString": self._draw_lines(bg, colour, extent, geometry["coordinates"], xo, yo) elif feature["geometry"]["type"] == "MultiLineString": for line in geometry["coordinates"]: self._draw_lines(bg, colour, extent, line, xo, yo) elif feature["geometry"]["type"] == "Point": x, y = self._scale_coords( geometry["coordinates"][0], geometry["coordinates"][1], extent, xo, yo) text = u" {} ".format(feature["properties"]["name_en"]) self._screen.print_at(text, int(x - len(text) / 2), int(y), colour=colour, bg=bg) def _draw_tile_layer(self, tile, layer_name, c_filters, colour, t_filters, x, y, bg): """Draw the visible geometry in the specified map tile.""" # Don't bother rendering if the tile is not visible left = (x + self._screen.width // 4) * 2 top = y + self._screen.height // 2 if (left > self._screen.width or left + self._size * 2 < 0 or top > self._screen.height or top + self._size < 0): return 0 # Not all layers are available in every tile. try: _layer = tile[layer_name] _extent = float(_layer["extent"]) except KeyError: return 0 for _feature in _layer["features"]: try: if c_filters and _feature["properties"]["class"] not in c_filters: continue if (t_filters and _feature["type"] not in t_filters and _feature["properties"]["type"] not in t_filters): continue self._draw_feature( _feature, _extent, colour, bg, (x + self._screen.width // 4) * 2, y + self._screen.height // 2) except KeyError: pass return 1 def _draw_satellite_tile(self, tile, x, y): """Draw a satellite image tile to screen.""" image, colours = tile.rendered_text for (i, line) in enumerate(image): self._screen.paint(line, x, y + i, colour_map=colours[i]) return 1 def _draw_tiles(self, x_offset, y_offset, bg): """Render all visible tiles a layer at a time.""" count = 0 for layer_name, c_filters, t_filters in self._get_features(): colour = (self._256_PALETTE[layer_name] if self._screen.colours >= 256 else self._16_PALETTE[layer_name]) for x, y, z, tile, satellite in sorted(self._tiles.values(), key=lambda k: k[0]): # Don't draw the wrong type or zoom of tile. if satellite != self._satellite or z != self._zoom: continue # Convert tile location into pixels and draw the tile. x *= self._size y *= self._size if satellite: count += self._draw_satellite_tile( tile, int((x-x_offset + self._screen.width // 4) * 2), int(y-y_offset + self._screen.height // 2)) else: count += self._draw_tile_layer(tile, layer_name, c_filters, colour, t_filters, x - x_offset, y - y_offset, bg) return count def _zoom_map(self, zoom_out=True): """Animate the zoom in/out as appropriate for the displayed map tile.""" size_step = 1 / _ZOOM_STEP if zoom_out else _ZOOM_STEP self._next_update = 1 if self._satellite: size_step **= _ZOOM_ANIMATION_STEPS self._size *= size_step if self._size <= _ZOOM_OUT_SIZE: if self._zoom > 0: self._zoom -= 1 self._size = _START_SIZE else: self._size = _ZOOM_OUT_SIZE elif self._size >= _ZOOM_IN_SIZE: if self._zoom < 20: self._zoom += 1 self._size = _START_SIZE else: self._size = _ZOOM_IN_SIZE def _move_to_desired_location(self): """Animate movement to desired location on map.""" self._next_update = 100000 x_start = self._convert_longitude(self._longitude) y_start = self._convert_latitude(self._latitude) x_end = self._convert_longitude(self._desired_longitude) y_end = self._convert_latitude(self._desired_latitude) if sqrt((x_end - x_start) ** 2 + (y_end - y_start) ** 2) > _START_SIZE // 4: self._zoom_map(True) elif self._zoom != self._desired_zoom: self._zoom_map(self._desired_zoom < self._zoom) if self._longitude != self._desired_longitude: self._next_update = 1 if self._desired_longitude < self._longitude: self._longitude = max(self._longitude - 360 / 2 ** self._zoom / self._size * 2, self._desired_longitude) else: self._longitude = min(self._longitude + 360 / 2 ** self._zoom / self._size * 2, self._desired_longitude) if self._latitude != self._desired_latitude: self._next_update = 1 if self._desired_latitude < self._latitude: self._latitude = max(self._inc_lat(self._latitude, 2), self._desired_latitude) else: self._latitude = min(self._inc_lat(self._latitude, -2), self._desired_latitude) if self._next_update == 1: self._updated.set() def _update(self, frame_no): """Draw the latest set of tiles to the Screen.""" # Check for any fatal errors from the background thread and quit if we hit anything. if self._oops: raise RuntimeError(self._oops) # Calculate new positions for animated movement. self._move_to_desired_location() # Re-draw the tiles - if we have any suitable ones downloaded. count = 0 x_offset = self._convert_longitude(self._longitude) y_offset = self._convert_latitude(self._latitude) if self._tiles: # Clear the area first. bg = 253 if self._screen.unicode_aware and self._screen.colours >= 256 else 0 for y in range(self._screen.height): self._screen.print_at("." * self._screen.width, 0, y, colour=bg, bg=bg) # Now draw all the available tiles. count = self._draw_tiles(x_offset, y_offset, bg) # Just a few pointers on what the user should do... if count == 0: self._screen.centre(" Loading - please wait... ", self._screen.height // 2, 1) self._screen.centre("Press '?' for help.", 0, 1) if _KEY == "": footer = "Using local cached data - go to https://www.mapbox.com/ and get a free key." else: footer = u"Zoom: {} Location: {:.6}, {:.6} Maps: © Mapbox, © OpenStreetMap".format( self._zoom, self._longitude, self._latitude) self._screen.centre(footer, self._screen.height - 1, 1) return count def process_event(self, event): """User input for the main map view.""" if isinstance(event, KeyboardEvent): if event.key_code in [Screen.ctrl("m"), Screen.ctrl("j")]: self._scene.add_effect( EnterLocation( self._screen, self._longitude, self._latitude, self._on_new_location)) elif event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]: raise StopApplication("User quit") elif event.key_code in [ord('t'), ord('T')]: self._satellite = not self._satellite if self._satellite: self._size = _START_SIZE elif event.key_code == ord("?"): self._scene.add_effect(PopUpDialog(self._screen, _HELP, ["OK"])) elif event.key_code == ord("+") and self._zoom <= 20: if self._desired_zoom < 20: self._desired_zoom += 1 elif event.key_code == ord("-") and self._zoom >= 0: if self._desired_zoom > 0: self._desired_zoom -= 1 elif event.key_code == ord("0"): self._desired_zoom = 0 elif event.key_code == ord("9"): self._desired_zoom = 20 elif event.key_code == Screen.KEY_LEFT: self._desired_longitude -= 360 / 2 ** self._zoom / self._size * 10 elif event.key_code == Screen.KEY_RIGHT: self._desired_longitude += 360 / 2 ** self._zoom / self._size * 10 elif event.key_code == Screen.KEY_UP: self._desired_latitude = self._inc_lat(self._desired_latitude, -self._size / 10) elif event.key_code == Screen.KEY_DOWN: self._desired_latitude = self._inc_lat(self._desired_latitude, self._size / 10) else: return # Trigger a reload of the tiles and redraw map self._updated.set() self._screen.force_update() def _on_new_location(self, form): """Set a new desired location entered in the pop-up form.""" self._desired_longitude = float(form.data["long"]) self._desired_latitude = float(form.data["lat"]) self._desired_zoom = 13 self._screen.force_update() # noinspection PyUnusedLocal # pylint: disable=unused-argument def clone(self, new_screen, new_scene): # On resize, there will be a new Map - kill the thread in this one. self._running = False self._updated.set() @property def frame_update_count(self): # Only redraw if required - as determined by the update logic. return self._next_update @property def stop_frame(self): # No specific end point for this Effect. Carry on running forever. return 0 def reset(self): # Nothing special to do. Just need this to satisfy the ABC. pass def demo(screen, scene): screen.play([Scene([Map(screen)], -1)], stop_on_resize=True, start_scene=scene) if __name__ == "__main__": last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/mapscache/000077500000000000000000000000001511423144500207765ustar00rootroot00000000000000python-asciimatics-1.15.0/samples/mapscache/0.0.0.jpg000066400000000000000000000365621511423144500221470ustar00rootroot00000000000000JFIFC  !"$"$C" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?#4fN7uu)E5($Qqؖ'4K\RO xWX2]Α4X\eىW2H u"%VZDf0vM."8vcM&ƭWLP{yoSGp*_Qk=LNAf'A$)k}P攌W 0xwR[|vՓ(ۋ2՝Wྟ?#YwzaH`~`1zqvl=%lzS7ֳZImWF*GQU­ i )ɡH1- `ЁEx aDSQaVެ891 A"XhHݥOt`x;Pj}=3M!TBD9>U UNwq>IaX=q" &")ćj pUeG~zaycn jTs&UnG9rOU-++OVr¹Eh/5ER3w Gt+54=r;kel3KAPdl2Ǒsa#0-ۦ8`M$kNVi_Ca涍K.гऄl•./dkjZb=0홼&`LeW$Ő(&Rvq^4g#i;g5Kji=ʛ.={ &B&ѬnӢRJ+Eq,fn[-'"VX[<ԁ⿇|'>xO5ie7RTQ%w*)Zm,c5U.,n` $Tȡ>bJ6`眯V5iociufO,3]nR'v B~b_yO]v6m oInCy3m`6mQOQ\<֝,,,#rX*Ym6&LHޜFy`_L5>2mtt&2q%Ȯu 6H9 !G14npA VI\جzbE&)H䢝"}EH֤b23Jc;g94jA )@,|c-]o7;ixN!9bQHm)p9o+q-`3 REQm20>jX׵^ƳCgH%qF/`ZF9p:Ý;͏]kXJ4Tdw(DO$: NhŞMNV"0el0 pAQ\cIt[b7hI*1*Z?{#~xyBڒf mq!Pq.2 lr$O8:AqcoHAAVʞx1QSy],Lgu><p@`+1]Y,[:vjlT1-A9ߑӵrŎMu涤HREpA +kZxĊzz*<[sn2 d6x+|Ҭ!% *[,QA\etv3,3fTrjV>dYd`18Ԛ[hd/$ I~5׼)W^ IŗQe&"(˴?G;N~bMKG"1WF*GЊ]I$Ҽ;I#gv9,O$LTRDTe3w9GCI jEK*n%[ 2gte= A[ k[5]: 0ő2rzkӼ1$\[3<\ j1ْGF|{đG>L87:w=(HSV'*j9p'ҽk-Kp2kTxMZhV#pĐ9&209Uo#d !]=j!UMV)Z KHFEhГ%q$,񹍊)pG{'q12kgľ4KI |Rp b$6-#y9v[KGSHS^yZtG{ 8"fY*$ b1c$zVu7T_>zM%f-ǂHϸn](%)u2.YYvaG b*»۱TxwO _oj^Y%86 iNG /cy=G7zݵk!LѠ$ I~wAY.g^ 6yq@FWs{㌕ё41 I&m<(\@8ROu:?OWVGxDZ F[[Z*_@Ɓ$yE'vbHAp>Koiw^ WwrmA#JDJ2(ۏn4O Or$ص]Iv[o _Z12{_0[4  n xb mG)vV[K kd%h ETASsJI?\;#dji%f'< $0jQ.hiqNqv"<]KqZ:11\ N9<՘V]]}y?VkΔU! +4ccN[:XVtJ VNyRXhHwbGU{IZO瘹cg =>5ƨ6[V!MhpW\4^OQL6dJv U'=wYj7Emn펇ƶyoE%…PɶG NܜdNAY4g4RT/&hAmqPy^s~ir31K9H1GG8pqs?m Ÿ]XW?xcSɭ4nD&՝>}.9Q-@%PA`8#8HnQwē Npv޲a6C}/#r7 ܐNnd4^!!2qzbCp^3^qL.bYd0{Z[ʹM˞xXuiCz<( @\ s^+W)'r)ym:Nᚕc~e%ܻ ҧKSInzz%LzPy'NH<ҩewо';#=#l:Z50~9rNX<)Utm?φ5hVAn{U h lYC}P2ۥsZֽ=-B̹pzӨu[R7|`NNH8x[@ȱ[L&IɴngZ^eZZ/)% O2>$xLg`e`c .y䑎K15, dԛШvЈJ&ieP\d"jZ6CiTB`BwoGs ffG\ `vvt -pv%1IDZ5:~M dP3ӭ{i/462~"m?*8N0:>Ve(ҷthH<-C#F#Y1%=?Q\Χo5B]v*>ߟۻ ,Kd{eh!\O9h$O ;*ņz+ג }c!ÇRSw3Y8WYTo4N'HNpy(򑑒I]洱`,J]HrXwapetGV6'Er5/"0i v˒zqMy牵}I,r;FTsZz7vWhd@KrcOX˧jJP/M  eLn:r ^q_T486wkHT'Ўޛa/ K-!*3WΛG4Z R5fRB0).hSSO!]KS|n~#AKm&c/F0Kr3`.lY/vc$2(_Nz>3o kNIseqà PŔ@|W=޻xNԡXdw,vⰞ t|Zw*5oKmu;Gy`#v8-Y`'b#zu\Oڧ}PCS#kmJD#a1h$W?6Xuu4͚й^WGA㿈vMy]GEdާXp8NBmKK!+NM#dyeP eN; ZŴkf-fsȶW,H N=0y0Q2Jm9ڰv՞}\lV+}5-M*+(r[C<ךkmf4h-ndf?3zgu~7 Eݴ7mvr 6)sk04i'-CnfXi`0+8cQV@O?4| 2qVB(3AC $SQGydi$%I=ϭ6E<aЙ-黰#q ܋zMΩ$S/?hGcrT{ɊUBͅ'DBn{֧A;(&[qv9:$ckICrITZ}ڟ[",oq^cuoag O yUQ@PF[5<<<B{!ݖyhؕBA'3+3=y2E%+4> şeMӅݔ/qߜ W]kVZgċKKma5\bq=QW/Fii!;E&fHx{튧"9[WKfWba".o8?e♢J:1VSں=FM--+& .A#V\|Gw'Bjk;J28jPH^Fq@@(h`)w`cAҚsF"˚j9$sP;wzpf=>ǽ9Rl`.(N x10$Pi3EkBVW R3  [gx%FCu5XzmF -BHLv\Hv$M8El>|MymhتrYVXm'N'U¼0ݑvkSaRVL(\uP=1'ׇVE*IJr0g5Id42&E#1^RIw_Mef#Hc9c۸=u6VCR63K1Msڻ:ԱOeyͻT:'IqZ=qA=*XXzWxgHѴndWYb?Pz2+47k*rZ/  32F1^OY=>9aӃ9` 'ӰOIq$E7>"[=gmQ3Ӓq\U\^lt5|AtYmb $rĖXpq^)Ƥ̉'f2L```NpsHOp[i e+߂vgCpsֹSJSdإ-Α<9)\AB}L?Umf]bHv\G׏ǚ/5_BI0.mE\<y+dYd,3`#<8qy =_e:V#N$:=ތ$i,JSiJYBL(4Qȧ)9L R~ S=1^3x#I}?~˧Ѥ@nv}CBk+gH%]#BR7̿ԩlf r*h& NHkuCK@y}Z5gl$]G oE-WbN^;_ss)G?3` W6iʬZ$$^GgsԱɨYp}i2sx9|Q4~8maG־K^] Pѣs y𻼟)'vaCZ&-q\o3.0}r{>NZDVz'0eJ0H~B{u;q^unL' cx;{R꺦\-Υ{=ܸiq/N&Q̛SP3v95Nlz`]Q^h9'ޥ9P|g5kfF)r):R-LUqR t2+Y$smvymھbot1tFKkebbP0rqe{u ;@0`r=szn\\K:tK}O%hexZ6%&[hHbaiF.N^# 8n*&d)NiXnMKe$;(LiNiQ !R(] T(\R\m*<>6u xvSy#*8ݵwryr3jzmMv7676`3~d$Qx7d5J4*X` v'׀ <E$hZŰh:[ CLwm @GR@|³xnEXyِVr\O43 5Ʊ|-'$k#;yOIIgjmN]?VhHݭcx'8`@❌ֿ/j[{Hӧgi``2FOB+'k/QUa\cL={RzRhi<Lԓx)4-B)BҐ4keğٴ_ qy ]:2jȤǽ^?j9|)GoI8seFwc B፨npe}Bd~ h(Eww[&L)+9`7+ʾ֭O H|58bȢ[Ì( :91JIGq"} g,.ѵ]?N1Jڣrȯ,B@$1wzw-'E8dmB73crqɹwkρ_5/ZLLa{-ܤ޷%I@"U+J; &ާAe?x6c59B VT(t ʹS_pg %v_ld6㎽v~cWĬӂBN*i3iguy?im5ĥYDjp; >R4"IdČFI%xkX-oymv ɶ0Ks^6붲B8g%3 0ܶpv"9 @1Pvl2\]ev&Y}|I8Iq#|F[jGœXbX$isG¿ eZ%ӯ-lD*O%ء|͌RǸgSWj=c\oTSB{IDHH[X( 0鎹)01y'9QEM#Jtx#Ҵkhlp[DGUNxρ|e#O j}DU6  99c'j;xfAvpOh|+G^q(\u9c8OAK\<7:mѰ =tlJsD 0 C)6es?gٶƩ6Ytm>qKU|RqbpR~ρigxcG4!Oߪ /qĞO9$D>( :W;f$:}nVZk$QUUU98jGc׾xZ՟W<7hړM u(,E\pzvvHF;Ұ;XP9iqQO>dF <:rg>lПtߊ{-gO2Idp{lNG̥AV'IO\!gxd+ɸ\S_;9>%MH%BQAчF#H9N]Ȕ.~\.I>!ugm 62\) Y9ۀ_~׬uCX,Y`gS,n#E{RՑ1b0 28a8RPJ=8vi)Ns8J)H0q)x恃m>4RR AA44QF*]*18z~wx"k-&i*Y=;KqḨ8 _-l& ) ŹІ#1z'48$ƍ܃Q#(j@7qPƑ\fTi#Iu2H@PF0rXc򤅷? ҕ =4:^_Z5Mix@hq@>ԤSUh%s@Kgg;#.qIq(8H<1@Hr˧ʰ$.`Ȼ1q8'lqLGn ؤF$gN>57\V}l C1|= _D5ץbi"wqۤWpEqC-MH!ꇞjxn`Ya$N2.&1Ji`4+41H8ZsVP|ZbGHbMBRqRP̑M<})!3;]+KgEм $ϵMh%GQ)3ޒ8oH}GҬ bDQs sBˑ@`+Q=*SҘ9Jiig=EHE):Ӱ1R8dr \vKM1O Tdn@n-e>bއ <;T’qnQ r dLn#%=q}/) _ܡDy3l[iÀpr 0 XZ/q Lec$AF2|7Vpython-asciimatics-1.15.0/samples/mapscache/0.0.0.json000066400000000000000000012472071511423144500223410ustar00rootroot00000000000000{"water": {"version": 2, "features": [{"geometry": {"type": "MultiPolygon", "coordinates": [[[[4224, 4224], [4224, 558], [4158, 564], [4136, 570], [4132, 582], [4114, 592], [4068, 594], [4032, 610], [3956, 612], [3948, 622], [3940, 610], [3944, 590], [3922, 586], [3900, 632], [3902, 698], [3906, 704], [3930, 704], [3928, 710], [3912, 714], [3912, 730], [3928, 746], [3926, 762], [3948, 786], [3974, 790], [3986, 822], [3984, 844], [3990, 846], [3992, 858], [3964, 876], [3956, 890], [3924, 900], [3904, 898], [3898, 908], [3878, 912], [3868, 932], [3818, 952], [3800, 972], [3782, 972], [3774, 964], [3742, 968], [3718, 982], [3702, 1006], [3598, 1030], [3586, 1038], [3528, 1034], [3516, 1010], [3506, 1010], [3500, 1022], [3486, 1030], [3450, 1018], [3430, 1022], [3420, 1014], [3384, 1012], [3354, 1026], [3342, 1042], [3326, 1044], [3312, 1040], [3302, 1022], [3282, 1016], [3272, 1026], [3234, 1038], [3226, 1050], [3210, 1044], [3192, 1056], [3182, 1046], [3174, 1052], [3158, 1046], [3152, 1050], [3150, 1066], [3136, 1062], [3134, 1040], [3124, 1024], [3086, 1024], [3062, 1016], [3044, 1028], [3024, 1030], [3006, 1022], [2998, 1006], [2980, 1004], [2968, 984], [2942, 972], [2928, 944], [2902, 928], [2892, 928], [2894, 946], [2884, 960], [2872, 966], [2850, 962], [2840, 986], [2724, 1000], [2698, 1012], [2698, 1026], [2680, 1040], [2664, 1044], [2624, 1032], [2620, 1008], [2602, 1014], [2598, 994], [2576, 1002], [2572, 992], [2532, 976], [2506, 958], [2492, 922], [2486, 922], [2480, 938], [2466, 934], [2436, 960], [2424, 960], [2414, 946], [2386, 942], [2366, 920], [2332, 916], [2324, 908], [2298, 914], [2284, 926], [2264, 920], [2248, 928], [2230, 926], [2222, 934], [2204, 932], [2190, 916], [2162, 920], [2106, 912], [2058, 918], [2048, 930], [2034, 930], [2028, 916], [2012, 906], [1944, 898], [1908, 872], [1908, 858], [1898, 848], [1876, 844], [1846, 824], [1832, 824], [1814, 798], [1806, 770], [1796, 762], [1780, 774], [1756, 770], [1760, 728], [1754, 716], [1734, 702], [1744, 678], [1714, 662], [1696, 638], [1654, 606], [1640, 572], [1622, 572], [1588, 586], [1572, 586], [1546, 574], [1528, 590], [1492, 598], [1478, 626], [1448, 652], [1434, 674], [1348, 736], [1358, 754], [1356, 776], [1366, 798], [1370, 832], [1364, 838], [1360, 906], [1348, 932], [1358, 948], [1358, 1008], [1364, 1018], [1360, 1036], [1348, 1044], [1344, 1060], [1382, 1086], [1396, 1082], [1392, 1100], [1402, 1108], [1414, 1106], [1412, 1116], [1358, 1094], [1344, 1078], [1332, 1076], [1324, 1084], [1320, 1072], [1326, 1066], [1318, 1062], [1316, 1046], [1302, 1038], [1290, 1012], [1272, 1016], [1266, 1010], [1262, 990], [1278, 996], [1284, 986], [1284, 942], [1268, 938], [1266, 916], [1250, 954], [1232, 954], [1226, 946], [1228, 934], [1220, 934], [1222, 906], [1178, 886], [1180, 878], [1214, 886], [1214, 874], [1194, 864], [1190, 850], [1216, 840], [1224, 804], [1206, 806], [1168, 830], [1148, 834], [1146, 810], [1132, 810], [1130, 800], [1122, 796], [1122, 780], [1108, 778], [1080, 790], [1072, 808], [1042, 822], [966, 828], [954, 852], [924, 856], [888, 850], [874, 836], [878, 824], [872, 818], [874, 798], [890, 792], [890, 786], [876, 782], [892, 764], [886, 750], [892, 740], [888, 724], [860, 724], [826, 742], [820, 738], [820, 716], [806, 720], [806, 734], [788, 760], [760, 762], [748, 774], [732, 766], [726, 772], [706, 768], [694, 778], [662, 782], [638, 776], [614, 798], [600, 798], [598, 770], [586, 756], [530, 752], [496, 740], [482, 724], [452, 720], [444, 710], [398, 710], [372, 694], [362, 694], [356, 672], [334, 656], [334, 638], [322, 632], [320, 618], [280, 630], [268, 628], [260, 618], [248, 628], [242, 588], [196, 558], [188, 542], [148, 556], [46, 568], [24, 590], [-28, 594], [-54, 608], [-96, 614], [-128, 610], [-128, 790], [-122, 792], [-110, 822], [-112, 844], [-104, 850], [-108, 862], [-128, 872], [-128, 1446], [-106, 1458], [-98, 1484], [-82, 1492], [-66, 1522], [-66, 1534], [-88, 1540], [-100, 1514], [-128, 1494], [-128, 2918], [-108, 2908], [-74, 2944], [-38, 2964], [-12, 2962], [-4, 2968], [-14, 3006], [-28, 3018], [-12, 3020], [4, 3032], [8, 3062], [14, 3060], [20, 3042], [40, 3044], [48, 3028], [72, 3012], [84, 3014], [90, 3040], [114, 3056], [114, 3064], [90, 3086], [70, 3088], [62, 3074], [54, 3106], [42, 3110], [-8, 3158], [-44, 3176], [-106, 3182], [-106, 3146], [-118, 3142], [-128, 3152], [-128, 3164], [-122, 3166], [-128, 3178], [-128, 4224], [4224, 4224]], [[1138, 2962], [1134, 2950], [1142, 2946], [1146, 2960], [1138, 2962]], [[1196, 926], [1188, 922], [1188, 912], [1200, 914], [1196, 926]], [[1112, 2978], [1094, 2970], [1100, 2958], [1110, 2966], [1116, 2970], [1112, 2978]], [[992, 3334], [966, 3330], [958, 3280], [964, 3270], [964, 3246], [948, 3216], [950, 3180], [960, 3164], [950, 3164], [938, 3174], [928, 3170], [926, 3156], [916, 3148], [932, 3136], [922, 3110], [886, 3108], [874, 3118], [862, 3118], [844, 3144], [834, 3144], [812, 3132], [820, 3118], [816, 3102], [800, 3114], [750, 3108], [738, 3114], [750, 3124], [750, 3134], [740, 3144], [710, 3146], [664, 3174], [652, 3174], [636, 3160], [632, 3178], [626, 3178], [622, 3164], [614, 3162], [596, 3196], [582, 3174], [574, 3174], [572, 3182], [558, 3182], [534, 3162], [508, 3162], [498, 3146], [490, 3144], [464, 3166], [438, 3170], [424, 3182], [394, 3180], [352, 3196], [326, 3194], [312, 3208], [292, 3208], [274, 3222], [264, 3222], [248, 3208], [232, 3208], [224, 3196], [196, 3178], [184, 3148], [158, 3142], [154, 3132], [158, 3120], [180, 3104], [184, 3090], [202, 3082], [210, 3064], [192, 3060], [184, 3064], [182, 3074], [174, 3074], [138, 3050], [138, 3044], [152, 3036], [152, 3024], [160, 3016], [200, 3016], [214, 3022], [216, 2994], [200, 2990], [194, 2982], [178, 2984], [158, 2942], [170, 2928], [168, 2916], [182, 2902], [202, 2904], [208, 2878], [226, 2882], [238, 2874], [256, 2874], [254, 2854], [242, 2840], [220, 2820], [204, 2818], [196, 2804], [222, 2808], [244, 2820], [274, 2854], [288, 2860], [302, 2878], [298, 2894], [308, 2900], [320, 2922], [324, 2888], [346, 2904], [368, 2906], [366, 2928], [408, 2906], [426, 2908], [458, 2900], [462, 2890], [494, 2866], [508, 2834], [526, 2822], [532, 2802], [558, 2798], [564, 2770], [578, 2760], [594, 2734], [588, 2716], [630, 2680], [638, 2646], [632, 2550], [640, 2528], [674, 2470], [712, 2448], [730, 2404], [748, 2388], [744, 2370], [770, 2356], [772, 2338], [794, 2318], [802, 2320], [764, 2388], [746, 2406], [746, 2426], [760, 2420], [770, 2390], [846, 2310], [848, 2278], [854, 2270], [938, 2230], [978, 2234], [1006, 2208], [1050, 2198], [1070, 2178], [1074, 2160], [1130, 2130], [1136, 2132], [1140, 2148], [1154, 2146], [1166, 2124], [1168, 2090], [1148, 2062], [1138, 2058], [1128, 2038], [1134, 2010], [1122, 1998], [1126, 1978], [1150, 1952], [1182, 1880], [1194, 1868], [1228, 1852], [1248, 1828], [1244, 1740], [1232, 1686], [1234, 1652], [1210, 1590], [1212, 1554], [1202, 1502], [1212, 1502], [1214, 1522], [1220, 1514], [1216, 1490], [1212, 1484], [1202, 1486], [1202, 1466], [1190, 1448], [1202, 1436], [1190, 1424], [1188, 1396], [1198, 1376], [1196, 1364], [1204, 1362], [1196, 1352], [1204, 1348], [1214, 1318], [1256, 1286], [1302, 1302], [1274, 1324], [1270, 1340], [1264, 1342], [1264, 1382], [1276, 1388], [1280, 1406], [1300, 1424], [1300, 1438], [1288, 1442], [1280, 1458], [1288, 1470], [1304, 1478], [1308, 1500], [1324, 1512], [1310, 1520], [1308, 1536], [1336, 1534], [1344, 1564], [1390, 1574], [1404, 1594], [1390, 1628], [1432, 1626], [1458, 1670], [1494, 1708], [1500, 1750], [1518, 1766], [1546, 1778], [1570, 1780], [1582, 1792], [1604, 1848], [1606, 1896], [1646, 1940], [1652, 1952], [1650, 1982], [1644, 1990], [1626, 1992], [1596, 2016], [1544, 2022], [1534, 2034], [1482, 2050], [1464, 2098], [1434, 2116], [1394, 2120], [1378, 2140], [1356, 2152], [1352, 2170], [1346, 2164], [1328, 2172], [1300, 2166], [1274, 2170], [1254, 2184], [1234, 2176], [1236, 2190], [1230, 2190], [1214, 2178], [1190, 2172], [1174, 2146], [1150, 2158], [1118, 2150], [1096, 2174], [1100, 2222], [1084, 2232], [1042, 2232], [1060, 2298], [1024, 2296], [1008, 2264], [972, 2260], [956, 2268], [938, 2298], [936, 2338], [946, 2384], [978, 2402], [1018, 2396], [1034, 2410], [1096, 2404], [1106, 2392], [1110, 2364], [1126, 2344], [1134, 2346], [1138, 2368], [1122, 2422], [1152, 2456], [1162, 2458], [1182, 2478], [1180, 2510], [1194, 2518], [1194, 2532], [1202, 2536], [1206, 2550], [1246, 2572], [1244, 2592], [1264, 2610], [1306, 2628], [1294, 2606], [1308, 2600], [1316, 2612], [1366, 2636], [1362, 2652], [1354, 2652], [1344, 2636], [1336, 2646], [1314, 2646], [1308, 2672], [1318, 2688], [1310, 2694], [1266, 2684], [1282, 2694], [1290, 2708], [1362, 2710], [1386, 2730], [1398, 2732], [1374, 2666], [1408, 2666], [1416, 2656], [1430, 2662], [1434, 2652], [1446, 2652], [1438, 2694], [1416, 2698], [1408, 2708], [1414, 2726], [1414, 2768], [1396, 2780], [1390, 2796], [1364, 2806], [1350, 2824], [1346, 2858], [1336, 2866], [1316, 2912], [1306, 2910], [1298, 2884], [1286, 2872], [1274, 2874], [1258, 2890], [1256, 2926], [1238, 2934], [1214, 2964], [1194, 2960], [1166, 2968], [1158, 2960], [1158, 2926], [1166, 2900], [1154, 2884], [1154, 2874], [1170, 2862], [1178, 2828], [1160, 2804], [1144, 2796], [1152, 2746], [1140, 2732], [1120, 2750], [1128, 2764], [1114, 2770], [1110, 2804], [1078, 2808], [1020, 2846], [998, 2844], [988, 2878], [972, 2884], [972, 2918], [982, 2944], [1000, 2970], [1016, 2978], [1026, 3002], [1046, 3006], [1064, 3048], [1066, 3010], [1058, 2994], [1070, 2994], [1076, 2982], [1082, 2982], [1098, 3002], [1120, 2990], [1134, 2996], [1112, 3024], [1084, 3042], [1084, 3054], [1070, 3054], [1066, 3066], [1076, 3070], [1096, 3052], [1096, 3064], [1124, 3092], [1114, 3118], [1114, 3128], [1124, 3134], [1122, 3154], [1108, 3172], [1134, 3178], [1134, 3168], [1140, 3166], [1156, 3188], [1174, 3166], [1170, 3156], [1184, 3158], [1186, 3152], [1176, 3140], [1192, 3142], [1192, 3134], [1170, 3116], [1172, 3092], [1192, 3096], [1196, 3110], [1212, 3110], [1204, 3120], [1196, 3118], [1194, 3128], [1204, 3130], [1216, 3120], [1224, 3092], [1202, 3064], [1208, 3046], [1196, 3040], [1170, 3042], [1160, 3032], [1158, 3018], [1172, 3008], [1184, 3014], [1212, 3010], [1230, 2994], [1244, 2968], [1254, 2970], [1268, 2958], [1296, 2952], [1294, 2966], [1276, 2988], [1308, 2970], [1316, 2990], [1304, 3024], [1290, 3030], [1280, 3048], [1282, 3062], [1292, 3064], [1314, 3034], [1326, 3032], [1328, 3042], [1340, 3052], [1342, 3066], [1348, 3068], [1348, 3082], [1322, 3096], [1310, 3116], [1296, 3118], [1274, 3136], [1276, 3150], [1288, 3154], [1280, 3164], [1282, 3184], [1270, 3190], [1266, 3204], [1248, 3206], [1232, 3234], [1210, 3234], [1204, 3240], [1194, 3266], [1178, 3276], [1182, 3288], [1166, 3312], [1096, 3312], [1082, 3302], [1074, 3286], [1078, 3258], [1068, 3250], [1064, 3286], [1080, 3310], [1080, 3320], [1056, 3320], [1038, 3306], [1022, 3248], [1026, 3224], [1048, 3218], [1034, 3216], [1032, 3202], [1046, 3188], [1062, 3188], [1068, 3180], [1082, 3178], [1076, 3172], [1080, 3144], [1070, 3122], [1060, 3120], [1062, 3100], [1054, 3096], [1044, 3112], [1050, 3126], [1048, 3142], [1030, 3154], [1020, 3140], [1018, 3162], [1012, 3168], [998, 3168], [1004, 3192], [994, 3206], [990, 3228], [976, 3242], [984, 3276], [1004, 3280], [1020, 3314], [1016, 3328], [992, 3334]], [[1628, 1310], [1636, 1302], [1636, 1308], [1628, 1310]], [[1356, 1358], [1358, 1350], [1380, 1354], [1386, 1356], [1386, 1364], [1364, 1364], [1356, 1358]], [[2830, 1408], [2832, 1396], [2848, 1398], [2846, 1404], [2830, 1408]], [[4008, 1540], [3996, 1514], [3960, 1488], [3944, 1466], [3944, 1456], [3964, 1446], [3982, 1450], [3998, 1484], [4014, 1492], [4030, 1522], [4030, 1534], [4008, 1540]], [[3700, 1508], [3708, 1498], [3724, 1498], [3734, 1516], [3732, 1538], [3694, 1538], [3700, 1508]], [[2612, 3162], [2598, 3158], [2596, 3142], [2612, 3140], [2618, 3156], [2612, 3162]], [[4020, 1622], [4020, 1612], [4036, 1586], [4026, 1558], [4040, 1548], [4040, 1528], [4050, 1534], [4064, 1562], [4076, 1570], [4078, 1584], [4054, 1584], [4046, 1598], [4036, 1600], [4034, 1616], [4020, 1622]], [[-76, 1622], [-76, 1612], [-60, 1586], [-70, 1558], [-56, 1548], [-60, 1532], [-50, 1530], [-20, 1570], [-18, 1584], [-42, 1584], [-50, 1598], [-60, 1600], [-62, 1616], [-76, 1622]], [[2826, 3464], [2808, 3460], [2796, 3442], [2778, 3430], [2744, 3428], [2684, 3376], [2680, 3340], [2660, 3318], [2664, 3302], [2646, 3280], [2648, 3266], [2634, 3250], [2634, 3234], [2646, 3228], [2648, 3218], [2658, 3216], [2662, 3204], [2696, 3200], [2700, 3208], [2688, 3220], [2680, 3242], [2680, 3268], [2688, 3288], [2718, 3346], [2736, 3362], [2740, 3374], [2754, 3388], [2824, 3426], [2834, 3446], [2826, 3464]], [[670, 3350], [630, 3342], [636, 3310], [618, 3248], [638, 3236], [646, 3218], [678, 3232], [682, 3256], [696, 3276], [704, 3278], [692, 3246], [704, 3228], [712, 3226], [702, 3208], [714, 3198], [756, 3202], [770, 3194], [768, 3188], [734, 3190], [716, 3184], [712, 3174], [726, 3156], [750, 3154], [762, 3130], [806, 3136], [834, 3156], [850, 3150], [854, 3142], [886, 3142], [890, 3156], [884, 3170], [900, 3170], [902, 3176], [898, 3186], [870, 3202], [860, 3218], [862, 3236], [850, 3272], [860, 3300], [856, 3316], [836, 3316], [834, 3298], [822, 3300], [816, 3294], [824, 3250], [820, 3242], [814, 3268], [798, 3286], [790, 3286], [792, 3270], [784, 3270], [780, 3280], [766, 3288], [752, 3278], [752, 3298], [732, 3298], [736, 3310], [716, 3336], [688, 3336], [670, 3350]], [[3658, 1868], [3648, 1846], [3638, 1846], [3592, 1876], [3604, 1908], [3556, 1916], [3554, 1910], [3538, 1910], [3528, 1900], [3518, 1878], [3508, 1878], [3498, 1888], [3476, 1882], [3462, 1862], [3440, 1854], [3438, 1840], [3424, 1820], [3372, 1808], [3344, 1788], [3338, 1762], [3344, 1750], [3342, 1726], [3364, 1666], [3356, 1634], [3370, 1622], [3388, 1620], [3416, 1636], [3452, 1636], [3480, 1658], [3544, 1668], [3572, 1658], [3588, 1626], [3612, 1638], [3610, 1620], [3622, 1626], [3622, 1616], [3636, 1608], [3638, 1590], [3656, 1574], [3682, 1568], [3696, 1576], [3706, 1568], [3718, 1568], [3728, 1580], [3752, 1584], [3772, 1646], [3790, 1672], [3796, 1702], [3790, 1750], [3766, 1772], [3764, 1784], [3750, 1792], [3742, 1812], [3714, 1828], [3702, 1876], [3684, 1886], [3674, 1920], [3664, 1920], [3658, 1868]], [[3606, 1614], [3606, 1608], [3614, 1610], [3606, 1614]], [[2952, 3286], [2944, 3284], [2944, 3278], [2952, 3278], [2952, 3286]], [[3230, 3500], [3202, 3474], [3196, 3460], [3198, 3444], [3176, 3436], [3176, 3426], [3156, 3416], [3144, 3416], [3146, 3428], [3112, 3420], [3104, 3406], [3060, 3390], [3050, 3376], [3022, 3358], [3020, 3348], [3028, 3346], [3034, 3324], [2964, 3308], [2966, 3268], [2984, 3256], [2988, 3240], [2976, 3240], [2964, 3256], [2930, 3272], [2926, 3260], [2934, 3246], [2914, 3248], [2914, 3236], [2926, 3222], [2910, 3222], [2908, 3272], [2902, 3276], [2900, 3254], [2880, 3234], [2892, 3202], [2884, 3170], [2890, 3150], [2916, 3148], [2896, 3138], [2898, 3108], [2886, 3084], [2868, 3066], [2856, 3072], [2880, 3106], [2884, 3134], [2874, 3146], [2876, 3214], [2868, 3226], [2878, 3272], [2860, 3284], [2834, 3280], [2826, 3240], [2806, 3218], [2812, 3204], [2808, 3168], [2820, 3162], [2830, 3144], [2828, 3128], [2778, 3166], [2738, 3174], [2718, 3194], [2716, 3178], [2732, 3168], [2740, 3150], [2740, 3142], [2728, 3130], [2720, 3144], [2712, 3144], [2700, 3134], [2686, 3136], [2664, 3126], [2660, 3142], [2654, 3142], [2598, 3108], [2588, 3084], [2574, 3082], [2562, 3094], [2562, 3102], [2578, 3110], [2576, 3124], [2568, 3132], [2548, 3132], [2550, 3068], [2526, 3070], [2514, 3060], [2500, 3046], [2498, 3022], [2466, 3032], [2464, 3022], [2478, 3010], [2478, 3002], [2466, 3002], [2448, 3016], [2442, 3034], [2444, 3056], [2428, 3072], [2436, 3076], [2476, 3060], [2496, 3060], [2514, 3074], [2516, 3104], [2476, 3140], [2454, 3154], [2426, 3160], [2416, 3176], [2390, 3176], [2400, 3194], [2368, 3216], [2360, 3216], [2356, 3206], [2336, 3214], [2322, 3202], [2306, 3204], [2302, 3192], [2288, 3184], [2262, 3182], [2240, 3158], [2242, 3142], [2224, 3148], [2214, 3140], [2212, 3124], [2230, 3122], [2200, 3080], [2182, 3030], [2154, 2994], [2146, 2994], [2106, 2954], [2104, 2914], [2108, 2892], [2114, 2888], [2112, 2874], [2126, 2862], [2138, 2862], [2156, 2882], [2170, 2888], [2192, 2836], [2190, 2822], [2166, 2812], [2168, 2852], [2158, 2852], [2140, 2834], [2146, 2778], [2110, 2768], [2094, 2740], [2066, 2722], [2060, 2706], [2046, 2696], [2028, 2700], [2028, 2684], [1996, 2682], [1996, 2672], [2016, 2664], [2034, 2640], [2028, 2598], [1956, 2602], [1944, 2594], [1948, 2554], [1940, 2528], [1950, 2502], [1976, 2498], [1980, 2482], [1974, 2472], [1964, 2456], [1944, 2444], [1932, 2398], [1898, 2378], [1854, 2304], [1864, 2266], [1864, 2248], [1852, 2220], [1858, 2190], [1892, 2160], [1908, 2130], [1954, 2098], [1986, 2106], [2028, 2102], [2062, 2118], [2096, 2120], [2116, 2096], [2144, 2100], [2158, 2088], [2150, 2032], [2180, 1998], [2204, 1926], [2202, 1908], [2192, 1898], [2182, 1870], [2180, 1846], [2212, 1784], [2220, 1726], [2240, 1700], [2254, 1668], [2252, 1648], [2258, 1634], [2270, 1626], [2300, 1634], [2336, 1634], [2362, 1644], [2390, 1670], [2420, 1716], [2422, 1746], [2450, 1760], [2452, 1794], [2446, 1816], [2474, 1844], [2496, 1852], [2512, 1872], [2510, 1926], [2496, 1954], [2494, 1992], [2508, 2018], [2532, 2044], [2592, 2094], [2626, 2152], [2632, 2174], [2628, 2184], [2554, 2168], [2540, 2180], [2542, 2192], [2590, 2204], [2638, 2224], [2652, 2240], [2674, 2244], [2706, 2270], [2706, 2280], [2728, 2304], [2716, 2324], [2692, 2336], [2690, 2352], [2682, 2352], [2662, 2332], [2638, 2332], [2634, 2354], [2622, 2352], [2598, 2390], [2602, 2406], [2620, 2404], [2630, 2382], [2662, 2362], [2694, 2366], [2704, 2350], [2746, 2342], [2804, 2346], [2818, 2330], [2828, 2330], [2834, 2304], [2848, 2290], [2872, 2296], [2882, 2234], [2924, 2142], [2934, 2142], [2956, 2166], [2962, 2228], [3008, 2260], [3018, 2276], [3030, 2278], [3040, 2298], [3090, 2308], [3094, 2294], [3122, 2258], [3120, 2234], [3134, 2230], [3148, 2240], [3158, 2234], [3168, 2200], [3166, 2144], [3186, 2122], [3192, 2094], [3206, 2072], [3188, 2078], [3158, 2108], [3136, 2112], [3132, 2104], [3170, 2068], [3176, 2050], [3214, 1998], [3238, 1982], [3250, 1982], [3260, 2020], [3252, 2030], [3240, 2026], [3228, 2040], [3226, 2056], [3206, 2070], [3234, 2064], [3226, 2080], [3226, 2102], [3208, 2124], [3190, 2134], [3178, 2158], [3188, 2200], [3214, 2188], [3228, 2168], [3240, 2162], [3242, 2148], [3258, 2154], [3292, 2184], [3290, 2220], [3252, 2266], [3260, 2286], [3282, 2300], [3292, 2298], [3298, 2282], [3284, 2272], [3284, 2262], [3300, 2260], [3310, 2274], [3304, 2284], [3308, 2296], [3370, 2314], [3408, 2346], [3412, 2362], [3436, 2394], [3436, 2406], [3430, 2410], [3434, 2434], [3408, 2470], [3408, 2478], [3442, 2506], [3424, 2514], [3406, 2506], [3404, 2514], [3388, 2524], [3390, 2530], [3402, 2532], [3424, 2556], [3436, 2554], [3430, 2544], [3432, 2530], [3464, 2542], [3472, 2536], [3470, 2516], [3486, 2508], [3484, 2468], [3510, 2470], [3522, 2480], [3522, 2498], [3500, 2540], [3524, 2558], [3526, 2572], [3542, 2588], [3576, 2590], [3614, 2632], [3646, 2686], [3648, 2726], [3656, 2740], [3664, 2732], [3662, 2644], [3676, 2648], [3670, 2676], [3676, 2692], [3688, 2696], [3676, 2774], [3662, 2770], [3656, 2754], [3656, 2768], [3642, 2784], [3630, 2786], [3622, 2776], [3614, 2776], [3602, 2792], [3590, 2796], [3664, 2884], [3678, 2892], [3738, 2890], [3748, 2898], [3770, 2894], [3770, 2882], [3808, 2886], [3812, 2894], [3804, 2904], [3834, 2944], [3866, 2948], [3868, 2928], [3878, 2924], [3904, 2946], [3906, 2962], [3918, 2968], [3910, 2930], [3888, 2914], [3856, 2870], [3834, 2858], [3820, 2830], [3816, 2804], [3826, 2740], [3828, 2730], [3838, 2728], [3850, 2742], [3854, 2760], [3868, 2766], [3870, 2784], [3892, 2794], [3892, 2820], [3906, 2826], [3904, 2858], [3894, 2862], [3894, 2872], [3906, 2886], [3910, 2904], [3926, 2904], [3930, 2910], [3942, 2906], [3958, 2918], [3974, 2918], [3986, 2908], [4022, 2944], [4060, 2966], [4088, 2964], [4090, 2980], [4082, 3004], [4068, 3018], [4084, 3020], [4100, 3032], [4104, 3062], [4110, 3060], [4116, 3042], [4136, 3044], [4148, 3024], [4178, 3012], [4186, 3040], [4204, 3048], [4210, 3064], [4182, 3088], [4164, 3088], [4158, 3074], [4156, 3098], [4142, 3114], [4090, 3156], [4050, 3176], [3990, 3182], [3986, 3166], [3992, 3150], [3986, 3142], [3978, 3142], [3964, 3156], [3964, 3164], [3974, 3166], [3968, 3180], [3960, 3180], [3948, 3164], [3918, 3170], [3884, 3164], [3866, 3174], [3870, 3194], [3856, 3210], [3844, 3216], [3814, 3216], [3784, 3208], [3772, 3226], [3752, 3238], [3756, 3248], [3750, 3256], [3738, 3262], [3718, 3260], [3694, 3274], [3652, 3280], [3648, 3268], [3634, 3264], [3636, 3232], [3594, 3236], [3572, 3228], [3556, 3242], [3546, 3210], [3536, 3208], [3514, 3244], [3514, 3252], [3520, 3254], [3520, 3286], [3502, 3308], [3486, 3306], [3462, 3318], [3452, 3312], [3450, 3288], [3420, 3286], [3398, 3296], [3396, 3310], [3340, 3310], [3338, 3318], [3320, 3318], [3314, 3326], [3300, 3328], [3300, 3308], [3262, 3294], [3264, 3304], [3296, 3330], [3300, 3342], [3340, 3376], [3344, 3412], [3328, 3442], [3312, 3452], [3280, 3450], [3274, 3442], [3264, 3442], [3270, 3462], [3246, 3470], [3254, 3490], [3230, 3500]], [[1604, 3920], [1588, 3898], [1576, 3898], [1584, 3888], [1580, 3882], [1548, 3892], [1540, 3882], [1510, 3868], [1508, 3850], [1540, 3848], [1520, 3842], [1526, 3826], [1514, 3834], [1498, 3830], [1504, 3804], [1524, 3784], [1530, 3754], [1524, 3754], [1514, 3778], [1486, 3804], [1484, 3816], [1472, 3822], [1458, 3818], [1468, 3768], [1456, 3768], [1446, 3796], [1438, 3804], [1426, 3800], [1420, 3810], [1366, 3788], [1364, 3774], [1344, 3766], [1344, 3726], [1354, 3704], [1348, 3700], [1338, 3716], [1322, 3718], [1280, 3660], [1280, 3646], [1286, 3640], [1308, 3638], [1314, 3632], [1312, 3606], [1298, 3584], [1268, 3578], [1260, 3564], [1220, 3540], [1222, 3518], [1256, 3488], [1278, 3488], [1292, 3496], [1290, 3484], [1274, 3486], [1236, 3468], [1244, 3454], [1264, 3446], [1258, 3430], [1266, 3420], [1288, 3416], [1298, 3424], [1308, 3418], [1328, 3430], [1350, 3424], [1382, 3398], [1390, 3370], [1402, 3362], [1416, 3288], [1414, 3234], [1422, 3226], [1444, 3234], [1444, 3222], [1456, 3218], [1464, 3204], [1456, 3200], [1448, 3206], [1430, 3206], [1424, 3166], [1434, 3156], [1446, 3156], [1458, 3166], [1450, 3182], [1468, 3176], [1464, 3136], [1444, 3134], [1436, 3106], [1436, 3084], [1442, 3080], [1438, 3056], [1452, 3038], [1454, 3014], [1490, 2938], [1500, 2926], [1520, 2928], [1542, 2904], [1558, 2908], [1568, 2968], [1586, 2996], [1586, 3028], [1596, 3034], [1598, 3044], [1630, 3048], [1660, 3074], [1670, 3102], [1684, 3118], [1702, 3118], [1750, 3138], [1786, 3170], [1792, 3182], [1750, 3192], [1760, 3202], [1760, 3224], [1770, 3218], [1778, 3196], [1802, 3196], [1802, 3224], [1790, 3250], [1776, 3262], [1788, 3254], [1796, 3258], [1796, 3286], [1784, 3298], [1812, 3304], [1818, 3318], [1810, 3330], [1832, 3344], [1832, 3352], [1822, 3356], [1822, 3366], [1814, 3374], [1816, 3380], [1830, 3382], [1822, 3426], [1814, 3434], [1806, 3432], [1802, 3442], [1810, 3456], [1822, 3458], [1836, 3450], [1842, 3462], [1840, 3476], [1824, 3480], [1818, 3488], [1832, 3494], [1828, 3510], [1806, 3516], [1810, 3560], [1830, 3582], [1830, 3616], [1844, 3616], [1852, 3630], [1850, 3642], [1836, 3644], [1860, 3648], [1868, 3660], [1864, 3670], [1846, 3676], [1872, 3678], [1886, 3686], [1886, 3700], [1916, 3726], [1916, 3742], [1904, 3756], [1866, 3768], [1852, 3738], [1832, 3740], [1824, 3752], [1792, 3704], [1808, 3742], [1806, 3786], [1788, 3786], [1780, 3762], [1748, 3738], [1738, 3742], [1766, 3760], [1764, 3784], [1722, 3784], [1678, 3760], [1678, 3768], [1712, 3794], [1774, 3794], [1784, 3804], [1804, 3806], [1822, 3828], [1822, 3838], [1812, 3852], [1786, 3866], [1772, 3866], [1774, 3880], [1768, 3892], [1726, 3884], [1756, 3900], [1758, 3910], [1748, 3920], [1714, 3924], [1700, 3934], [1656, 3934], [1604, 3920]], [[1202, 3884], [1176, 3882], [1168, 3876], [1168, 3862], [1140, 3866], [1134, 3860], [1136, 3852], [1122, 3850], [1124, 3838], [1112, 3838], [1104, 3808], [1076, 3824], [1064, 3812], [1060, 3788], [1046, 3792], [1018, 3778], [1002, 3752], [1006, 3746], [1022, 3752], [1016, 3742], [1026, 3732], [1022, 3708], [1032, 3704], [1034, 3690], [1046, 3680], [1060, 3680], [1074, 3670], [1092, 3670], [1098, 3678], [1110, 3672], [1130, 3680], [1144, 3696], [1154, 3694], [1142, 3674], [1104, 3660], [1104, 3646], [1076, 3658], [1062, 3654], [1062, 3624], [1078, 3606], [1060, 3614], [1052, 3662], [1036, 3662], [1032, 3672], [1018, 3676], [1004, 3720], [990, 3732], [974, 3728], [986, 3714], [964, 3706], [966, 3684], [958, 3682], [952, 3660], [952, 3650], [962, 3642], [948, 3642], [950, 3624], [960, 3612], [958, 3600], [966, 3592], [990, 3598], [996, 3594], [976, 3570], [984, 3552], [992, 3550], [992, 3536], [1004, 3526], [1038, 3528], [1056, 3556], [1050, 3542], [1052, 3526], [1076, 3520], [1078, 3490], [1064, 3510], [1054, 3512], [1044, 3504], [1054, 3474], [1040, 3470], [1016, 3448], [992, 3446], [982, 3460], [962, 3468], [948, 3464], [946, 3448], [966, 3426], [990, 3428], [998, 3410], [996, 3376], [1004, 3356], [1020, 3350], [1038, 3354], [1044, 3346], [1064, 3348], [1132, 3350], [1142, 3362], [1144, 3388], [1118, 3408], [1092, 3406], [1066, 3390], [1036, 3398], [1022, 3416], [1022, 3422], [1030, 3424], [1022, 3438], [1076, 3428], [1090, 3436], [1124, 3438], [1126, 3426], [1136, 3424], [1162, 3446], [1162, 3462], [1148, 3462], [1146, 3476], [1162, 3490], [1160, 3512], [1186, 3516], [1192, 3544], [1200, 3552], [1200, 3562], [1186, 3570], [1186, 3576], [1200, 3576], [1200, 3586], [1184, 3588], [1182, 3596], [1206, 3600], [1216, 3606], [1218, 3616], [1228, 3614], [1240, 3622], [1244, 3646], [1262, 3666], [1266, 3680], [1314, 3734], [1312, 3746], [1290, 3738], [1290, 3748], [1320, 3762], [1352, 3798], [1352, 3818], [1332, 3828], [1324, 3854], [1292, 3854], [1290, 3864], [1264, 3870], [1254, 3880], [1222, 3880], [1208, 3874], [1202, 3884]], [[2310, 3666], [2302, 3662], [2302, 3648], [2272, 3666], [2268, 3656], [2254, 3648], [2254, 3628], [2232, 3638], [2224, 3614], [2206, 3626], [2178, 3624], [2170, 3614], [2170, 3596], [2182, 3576], [2180, 3554], [2198, 3528], [2212, 3536], [2216, 3550], [2234, 3542], [2216, 3524], [2202, 3520], [2204, 3504], [2218, 3502], [2206, 3492], [2206, 3482], [2226, 3462], [2234, 3444], [2242, 3444], [2266, 3544], [2280, 3552], [2290, 3514], [2286, 3490], [2294, 3490], [2304, 3492], [2306, 3482], [2312, 3482], [2324, 3510], [2314, 3516], [2312, 3528], [2302, 3532], [2300, 3546], [2292, 3550], [2292, 3564], [2264, 3586], [2254, 3622], [2288, 3620], [2274, 3610], [2280, 3598], [2322, 3588], [2342, 3600], [2342, 3612], [2354, 3624], [2358, 3640], [2330, 3656], [2316, 3654], [2310, 3666]], [[2582, 1872], [2556, 1862], [2548, 1850], [2552, 1812], [2540, 1794], [2540, 1780], [2546, 1756], [2562, 1746], [2582, 1752], [2588, 1760], [2616, 1864], [2622, 1868], [2618, 1896], [2612, 1906], [2604, 1906], [2582, 1872]], [[3920, 1810], [3928, 1796], [3944, 1790], [3920, 1810]], [[4072, 1848], [4066, 1840], [4076, 1836], [4080, 1844], [4072, 1848]], [[-20, 1848], [-28, 1846], [-26, 1836], [-16, 1840], [-20, 1848]], [[3536, 1918], [3534, 1912], [3540, 1912], [3536, 1918]], [[3550, 2044], [3536, 2034], [3552, 2024], [3562, 2002], [3574, 2004], [3620, 1982], [3624, 1966], [3616, 1952], [3640, 1954], [3654, 1942], [3676, 1942], [3686, 1958], [3696, 1960], [3708, 1956], [3728, 1932], [3758, 1928], [3758, 1934], [3724, 1964], [3728, 1978], [3710, 1986], [3698, 2002], [3622, 2030], [3610, 2030], [3584, 2012], [3572, 2040], [3550, 2044]], [[3490, 1952], [3470, 1950], [3456, 1940], [3458, 1930], [3468, 1936], [3490, 1952]], [[3414, 1942], [3406, 1940], [3412, 1932], [3420, 1934], [3414, 1942]], [[3140, 3724], [3108, 3702], [3104, 3674], [3092, 3658], [3102, 3642], [3086, 3638], [3096, 3614], [3110, 3616], [3118, 3632], [3112, 3606], [3120, 3600], [3124, 3582], [3158, 3562], [3180, 3562], [3186, 3568], [3182, 3590], [3188, 3620], [3180, 3638], [3164, 3636], [3158, 3648], [3156, 3676], [3162, 3688], [3140, 3724]], [[3418, 1954], [3416, 1946], [3428, 1948], [3418, 1954]], [[3370, 1948], [3400, 1948], [3398, 1954], [3390, 1954], [3370, 1948]], [[3272, 1980], [3250, 1976], [3256, 1966], [3278, 1958], [3360, 1950], [3336, 1970], [3296, 1970], [3272, 1980]], [[3334, 2086], [3318, 2082], [3310, 2068], [3288, 2066], [3288, 2044], [3304, 2014], [3348, 2008], [3352, 2002], [3370, 2004], [3386, 2052], [3398, 2058], [3386, 2090], [3402, 2110], [3384, 2126], [3376, 2126], [3334, 2086]], [[3812, 1982], [3814, 1972], [3820, 1972], [3812, 1982]], [[3576, 1982], [3580, 1974], [3582, 1980], [3576, 1982]], [[3774, 1998], [3766, 1988], [3740, 1982], [3762, 1976], [3784, 1996], [3774, 1998]], [[804, 3454], [792, 3430], [802, 3420], [798, 3408], [808, 3400], [806, 3394], [784, 3396], [764, 3428], [754, 3428], [746, 3440], [738, 3440], [720, 3420], [720, 3406], [710, 3388], [714, 3376], [728, 3370], [764, 3372], [748, 3360], [748, 3350], [772, 3344], [806, 3368], [838, 3368], [846, 3380], [850, 3406], [842, 3418], [824, 3414], [818, 3420], [814, 3452], [804, 3454]], [[3416, 2042], [3408, 2040], [3400, 2010], [3408, 2004], [3408, 1984], [3418, 1988], [3420, 2010], [3432, 1992], [3446, 1988], [3446, 2002], [3434, 2022], [3442, 2032], [3446, 2040], [3424, 2034], [3416, 2042]], [[1994, 2876], [1974, 2846], [1980, 2816], [1990, 2812], [1994, 2796], [2006, 2794], [2012, 2772], [1996, 2764], [2000, 2750], [1990, 2738], [2002, 2734], [2002, 2728], [1990, 2710], [2008, 2712], [2012, 2718], [2062, 2724], [2060, 2736], [2068, 2756], [2052, 2764], [2046, 2786], [2034, 2796], [2028, 2816], [2018, 2822], [2026, 2856], [2006, 2858], [2012, 2874], [1994, 2876]], [[1868, 3070], [1848, 3060], [1818, 3058], [1812, 3046], [1798, 3066], [1788, 3068], [1774, 3052], [1776, 3042], [1794, 3042], [1784, 3024], [1798, 3014], [1796, 3000], [1826, 2988], [1840, 2988], [1882, 3012], [1894, 3032], [1892, 3046], [1868, 3070]], [[3654, 2564], [3642, 2560], [3638, 2528], [3620, 2504], [3604, 2504], [3594, 2484], [3556, 2480], [3524, 2452], [3532, 2422], [3544, 2426], [3550, 2442], [3546, 2458], [3554, 2458], [3560, 2444], [3582, 2462], [3594, 2454], [3606, 2468], [3644, 2476], [3654, 2520], [3664, 2534], [3664, 2548], [3654, 2564]], [[3486, 2012], [3488, 2004], [3494, 2006], [3486, 2012]], [[3526, 2016], [3506, 2014], [3512, 2010], [3534, 2008], [3526, 2016]], [[3500, 2066], [3500, 2052], [3506, 2050], [3510, 2064], [3500, 2066]], [[3468, 2064], [3460, 2062], [3420, 2062], [3416, 2052], [3462, 2052], [3468, 2064]], [[918, 3322], [906, 3324], [894, 3302], [906, 3294], [906, 3282], [896, 3278], [890, 3288], [882, 3288], [880, 3274], [906, 3250], [916, 3230], [928, 3224], [950, 3244], [948, 3292], [934, 3292], [942, 3302], [944, 3320], [936, 3330], [926, 3330], [918, 3322]], [[3624, 3424], [3612, 3414], [3606, 3384], [3612, 3368], [3632, 3354], [3638, 3362], [3672, 3362], [3692, 3372], [3700, 3396], [3686, 3408], [3672, 3408], [3662, 3420], [3656, 3420], [3646, 3404], [3624, 3424]], [[900, 3450], [898, 3436], [886, 3432], [884, 3420], [866, 3448], [858, 3446], [860, 3422], [880, 3402], [880, 3394], [904, 3394], [904, 3376], [910, 3368], [934, 3374], [942, 3398], [932, 3444], [900, 3450]], [[712, 3482], [700, 3484], [688, 3476], [666, 3440], [652, 3432], [652, 3414], [686, 3410], [700, 3438], [710, 3428], [718, 3432], [730, 3448], [728, 3474], [734, 3480], [730, 3490], [718, 3490], [712, 3482]], [[3480, 2158], [3470, 2152], [3464, 2146], [3448, 2146], [3440, 2134], [3456, 2136], [3460, 2118], [3476, 2114], [3488, 2130], [3488, 2142], [3480, 2158]], [[2966, 2156], [2958, 2154], [2954, 2142], [2960, 2116], [2980, 2124], [2976, 2144], [2966, 2156]], [[846, 3590], [846, 3576], [868, 3558], [866, 3548], [854, 3546], [854, 3536], [864, 3532], [894, 3528], [908, 3506], [922, 3510], [912, 3558], [900, 3564], [896, 3576], [882, 3578], [870, 3596], [854, 3596], [846, 3590]], [[3218, 3598], [3206, 3594], [3198, 3582], [3180, 3526], [3182, 3514], [3206, 3526], [3234, 3530], [3248, 3542], [3246, 3562], [3230, 3582], [3222, 3582], [3218, 3598]], [[1950, 2800], [1948, 2788], [1934, 2784], [1940, 2760], [1932, 2738], [1948, 2734], [1968, 2746], [1978, 2750], [1978, 2780], [1986, 2794], [1976, 2806], [1958, 2806], [1950, 2800]], [[2698, 3746], [2696, 3736], [2680, 3726], [2698, 3712], [2690, 3706], [2670, 3710], [2674, 3698], [2666, 3690], [2682, 3678], [2698, 3678], [2704, 3686], [2718, 3688], [2716, 3708], [2708, 3712], [2704, 3732], [2720, 3730], [2712, 3742], [2698, 3746]], [[3442, 2156], [3452, 2158], [3458, 2162], [3456, 2172], [3446, 2182], [3436, 2182], [3442, 2156]], [[3464, 2192], [3464, 2174], [3472, 2172], [3476, 2190], [3464, 2192]], [[3422, 2264], [3412, 2222], [3420, 2214], [3424, 2192], [3430, 2192], [3430, 2204], [3446, 2204], [3456, 2196], [3454, 2206], [3436, 2210], [3432, 2220], [3432, 2230], [3442, 2242], [3438, 2260], [3422, 2264]], [[3660, 2628], [3658, 2604], [3640, 2586], [3644, 2568], [3650, 2568], [3652, 2582], [3678, 2578], [3686, 2588], [3700, 2592], [3702, 2602], [3660, 2628]], [[2780, 3718], [2776, 3704], [2766, 3702], [2760, 3690], [2750, 3696], [2726, 3690], [2724, 3666], [2746, 3662], [2758, 3686], [2786, 3686], [2792, 3696], [2790, 3716], [2780, 3718]], [[1138, 2318], [1096, 2316], [1090, 2312], [1092, 2306], [1114, 2312], [1118, 2306], [1152, 2298], [1172, 2278], [1200, 2282], [1198, 2288], [1138, 2318]], [[1232, 2280], [1216, 2278], [1218, 2260], [1232, 2254], [1268, 2260], [1254, 2276], [1232, 2280]], [[1174, 2262], [1160, 2260], [1164, 2254], [1174, 2256], [1174, 2262]], [[1288, 2256], [1298, 2256], [1298, 2262], [1288, 2262], [1288, 2256]], [[930, 3562], [928, 3542], [940, 3526], [940, 3512], [954, 3508], [966, 3514], [966, 3544], [954, 3548], [946, 3560], [930, 3562]], [[274, 2282], [274, 2270], [282, 2270], [284, 2280], [274, 2282]], [[798, 3524], [768, 3518], [758, 3510], [750, 3518], [740, 3516], [742, 3504], [758, 3502], [768, 3482], [792, 3490], [798, 3524]], [[974, 3398], [956, 3394], [952, 3382], [950, 3368], [964, 3356], [986, 3358], [984, 3386], [974, 3398]], [[2622, 3700], [2608, 3692], [2608, 3676], [2592, 3670], [2582, 3650], [2600, 3644], [2614, 3666], [2636, 3682], [2622, 3700]], [[3414, 2326], [3414, 2314], [3422, 2310], [3430, 2316], [3434, 2344], [3426, 2344], [3414, 2326]], [[3712, 3376], [3736, 3358], [3756, 3362], [3764, 3368], [3756, 3380], [3742, 3380], [3736, 3388], [3712, 3388], [3712, 3376]], [[792, 3560], [770, 3548], [760, 3534], [798, 3532], [806, 3540], [804, 3550], [792, 3560]], [[4098, 3234], [4080, 3218], [4082, 3208], [4122, 3214], [4124, 3224], [4118, 3232], [4098, 3234]], [[-16, 3218], [-14, 3208], [26, 3214], [28, 3224], [22, 3232], [-2, 3232], [-16, 3218]], [[2706, 3672], [2684, 3652], [2686, 3640], [2700, 3644], [2708, 3644], [2720, 3660], [2706, 3672]], [[3648, 3312], [3652, 3300], [3680, 3296], [3680, 3310], [3672, 3320], [3654, 3320], [3648, 3312]], [[956, 3488], [984, 3488], [988, 3496], [984, 3504], [956, 3504], [956, 3488]], [[314, 2870], [306, 2866], [288, 2852], [294, 2838], [314, 2850], [314, 2870]], [[2562, 3674], [2576, 3668], [2590, 3682], [2600, 3682], [2596, 3692], [2584, 3692], [2562, 3674]], [[1020, 3498], [1010, 3494], [1012, 3476], [1024, 3474], [1028, 3490], [1020, 3498]], [[912, 3646], [908, 3630], [924, 3618], [924, 3642], [912, 3646]], [[842, 3500], [848, 3474], [860, 3470], [852, 3498], [842, 3500]], [[94, 2988], [114, 2980], [124, 2984], [114, 2994], [96, 2994], [94, 2988]], [[534, 2782], [536, 2768], [550, 2758], [548, 2780], [534, 2782]], [[4210, 2994], [4190, 2992], [4210, 2980], [4222, 2984], [4210, 2994]], [[2850, 3306], [2844, 3302], [2846, 3288], [2862, 3294], [2860, 3302], [2850, 3306]], [[1324, 2706], [1320, 2702], [1326, 2694], [1344, 2692], [1324, 2706]], [[3332, 3350], [3318, 3342], [3324, 3332], [3338, 3338], [3332, 3350]], [[710, 3418], [692, 3404], [694, 3394], [702, 3396], [710, 3418]], [[2740, 3714], [2732, 3706], [2736, 3698], [2748, 3704], [2748, 3712], [2740, 3714]], [[2424, 3656], [2410, 3652], [2408, 3642], [2428, 3648], [2424, 3656]], [[148, 2772], [152, 2774], [154, 2778], [148, 2778], [148, 2772]], [[174, 2790], [180, 2792], [190, 2800], [178, 2800], [174, 2790]], [[3612, 2796], [3616, 2798], [3618, 2802], [3612, 2802], [3612, 2796]], [[1834, 3384], [1832, 3372], [1846, 3370], [1844, 3382], [1834, 3384]], [[2656, 3660], [2644, 3656], [2646, 3646], [2660, 3650], [2656, 3660]], [[1972, 2870], [1968, 2860], [1976, 2862], [1972, 2870]], [[158, 2916], [148, 2914], [148, 2904], [164, 2906], [158, 2916]], [[868, 3386], [856, 3384], [856, 3374], [866, 3372], [868, 3386]], [[3080, 3722], [3074, 3712], [3086, 3708], [3090, 3718], [3080, 3722]], [[1828, 3790], [1828, 3772], [1836, 3768], [1836, 3780], [1828, 3790]], [[892, 3512], [882, 3508], [886, 3500], [894, 3502], [898, 3508], [892, 3512]], [[2720, 3770], [2708, 3766], [2712, 3758], [2722, 3762], [2720, 3770]], [[2948, 3686], [2958, 3688], [2958, 3696], [2948, 3696], [2948, 3686]], [[2760, 3750], [2772, 3750], [2770, 3758], [2760, 3758], [2760, 3750]], [[3644, 3336], [3644, 3326], [3652, 3326], [3654, 3334], [3644, 3336]], [[2726, 3642], [2718, 3640], [2720, 3632], [2728, 3632], [2726, 3642]], [[2978, 3390], [2976, 3382], [2982, 3380], [2986, 3388], [2978, 3390]], [[754, 3458], [744, 3456], [746, 3450], [754, 3452], [754, 3458]], [[1490, 3852], [1488, 3848], [1496, 3844], [1498, 3850], [1490, 3852]], [[1156, 3158], [1152, 3156], [1148, 3146], [1156, 3152], [1156, 3158]], [[2624, 3632], [2630, 3632], [2630, 3638], [2624, 3638], [2624, 3632]], [[1164, 2982], [1164, 2988], [1158, 2988], [1164, 2982]], [[2614, 3648], [2614, 3642], [2620, 3644], [2614, 3648]], [[3140, 3468], [3138, 3464], [3144, 3464], [3140, 3468]], [[950, 3392], [954, 3394], [944, 3394], [950, 3392]]], [[[3294, 2810], [3294, 2790], [3284, 2766], [3262, 2754], [3294, 2810]]], [[[2628, 2656], [2650, 2654], [2656, 2630], [2632, 2628], [2622, 2612], [2632, 2594], [2646, 2584], [2646, 2574], [2658, 2576], [2668, 2562], [2648, 2554], [2660, 2532], [2660, 2502], [2648, 2498], [2626, 2500], [2606, 2514], [2606, 2532], [2616, 2554], [2594, 2582], [2582, 2614], [2592, 2632], [2600, 2632], [2628, 2656]]], [[[2440, 2380], [2450, 2378], [2474, 2332], [2488, 2322], [2496, 2288], [2512, 2276], [2528, 2250], [2538, 2198], [2498, 2228], [2490, 2254], [2476, 2266], [2470, 2302], [2454, 2318], [2452, 2334], [2432, 2370], [2440, 2380]]], [[[2478, 2656], [2484, 2652], [2472, 2620], [2520, 2584], [2518, 2566], [2474, 2562], [2446, 2576], [2422, 2576], [2406, 2564], [2370, 2568], [2366, 2590], [2376, 2616], [2386, 2622], [2398, 2646], [2408, 2648], [2422, 2638], [2428, 2618], [2438, 2614], [2460, 2624], [2448, 2630], [2446, 2642], [2478, 2656]]], [[[2192, 2632], [2214, 2620], [2226, 2600], [2268, 2574], [2270, 2546], [2298, 2498], [2308, 2496], [2312, 2510], [2324, 2516], [2308, 2546], [2338, 2558], [2346, 2554], [2348, 2518], [2362, 2500], [2382, 2490], [2406, 2498], [2418, 2488], [2452, 2496], [2456, 2468], [2442, 2430], [2432, 2422], [2398, 2428], [2386, 2420], [2372, 2420], [2292, 2446], [2274, 2434], [2274, 2416], [2260, 2412], [2226, 2426], [2214, 2442], [2186, 2446], [2168, 2456], [2164, 2462], [2174, 2472], [2174, 2482], [2172, 2498], [2162, 2506], [2062, 2496], [2026, 2476], [1994, 2478], [1988, 2484], [1992, 2494], [2022, 2498], [2040, 2512], [2048, 2524], [2048, 2544], [2060, 2560], [2084, 2572], [2088, 2596], [2122, 2592], [2148, 2612], [2162, 2606], [2168, 2588], [2188, 2568], [2226, 2544], [2230, 2526], [2224, 2518], [2192, 2516], [2194, 2508], [2218, 2498], [2224, 2516], [2242, 2530], [2240, 2548], [2256, 2546], [2256, 2552], [2208, 2586], [2204, 2600], [2190, 2610], [2192, 2632]], [[2432, 2478], [2418, 2476], [2420, 2468], [2426, 2470], [2432, 2478]], [[2142, 2556], [2144, 2534], [2154, 2534], [2160, 2554], [2156, 2562], [2148, 2562], [2142, 2556]], [[2146, 2574], [2154, 2570], [2156, 2586], [2148, 2586], [2146, 2574]]], [[[2432, 2048], [2434, 2034], [2426, 2022], [2410, 2022], [2410, 2038], [2420, 2048], [2432, 2048]]], [[[2404, 2942], [2420, 2928], [2416, 2912], [2402, 2910], [2392, 2928], [2396, 2942], [2404, 2942]]], [[[2304, 3050], [2332, 3046], [2334, 3030], [2288, 2976], [2292, 2918], [2306, 2904], [2370, 2918], [2378, 2904], [2366, 2896], [2334, 2898], [2316, 2890], [2314, 2874], [2324, 2866], [2324, 2846], [2316, 2842], [2308, 2854], [2294, 2854], [2286, 2834], [2288, 2802], [2276, 2800], [2272, 2790], [2250, 2798], [2214, 2780], [2200, 2790], [2182, 2784], [2166, 2788], [2164, 2800], [2176, 2804], [2178, 2796], [2184, 2796], [2190, 2810], [2210, 2808], [2216, 2822], [2236, 2828], [2242, 2876], [2260, 2888], [2266, 2900], [2244, 2932], [2248, 2962], [2266, 2986], [2286, 3000], [2294, 3038], [2304, 3050]], [[2308, 2878], [2300, 2874], [2300, 2866], [2312, 2872], [2308, 2878]], [[2262, 2858], [2254, 2854], [2254, 2848], [2260, 2848], [2262, 2858]]], [[[960, 3164], [976, 3162], [974, 3140], [980, 3132], [972, 3120], [960, 3116], [958, 3098], [956, 3120], [948, 3128], [962, 3140], [956, 3150], [960, 3164]]], [[[1136, 3280], [1162, 3278], [1152, 3264], [1134, 3264], [1136, 3280]]], [[[1132, 2586], [1142, 2582], [1120, 2570], [1106, 2570], [1106, 2576], [1132, 2586]]], [[[1096, 2640], [1124, 2638], [1138, 2624], [1136, 2618], [1120, 2616], [1114, 2596], [1100, 2608], [1100, 2626], [1092, 2632], [1096, 2640]]], [[[1062, 2684], [1082, 2666], [1084, 2650], [1056, 2648], [1044, 2660], [1028, 2652], [1010, 2656], [1042, 2684], [1062, 2684]]], [[[1078, 2638], [1080, 2630], [1066, 2620], [1066, 2582], [1054, 2572], [1054, 2626], [1070, 2638], [1078, 2638]]], [[[924, 2776], [936, 2772], [942, 2744], [934, 2744], [922, 2760], [924, 2776]]], [[[742, 2962], [766, 2946], [748, 2930], [726, 2928], [724, 2936], [742, 2948], [742, 2962]]], [[[686, 3084], [682, 3066], [706, 3066], [704, 3054], [688, 3052], [682, 3040], [672, 3046], [662, 3032], [652, 3032], [652, 3044], [664, 3062], [642, 3066], [678, 3084], [686, 3084]]]]}, "type": 3, "properties": {}, "id": 0}], "extent": 4096}, "admin": {"version": 2, "features": [{"geometry": {"type": "LineString", "coordinates": [[2167, 2653], [2163, 2642], [2153, 2646], [2151, 2636], [2144, 2646], [2137, 2637], [2128, 2638]]}, "type": 2, "properties": {"iso_3166_1": "CH-IT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1}, {"geometry": {"type": "LineString", "coordinates": [[2146, 2501], [2141, 2495], [2143, 2470], [2134, 2455], [2151, 2434], [2157, 2409]]}, "type": 2, "properties": {"iso_3166_1": "DZ-TN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 2}, {"geometry": {"type": "LineString", "coordinates": [[1909, 2218], [1885, 2240], [1863, 2239], [1860, 2234]]}, "type": 2, "properties": {"iso_3166_1": "MR-SN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 3}, {"geometry": {"type": "LineString", "coordinates": [[2452, 2101], [2453, 2101]]}, "type": 2, "properties": {"iso_3166_1": "KE-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 5}, {"geometry": {"type": "LineString", "coordinates": [[2173, 2001], [2175, 2003]]}, "type": 2, "properties": {"iso_3166_1": "CG-GA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 6}, {"geometry": {"type": "LineString", "coordinates": [[1073, 2175], [1071, 2175]]}, "type": 2, "properties": {"iso_3166_1": "CR-NI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 7}, {"geometry": {"type": "LineString", "coordinates": [[1096, 2173], [1096, 2174]]}, "type": 2, "properties": {"iso_3166_1": "CR-NI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 8}, {"geometry": {"type": "LineString", "coordinates": [[3237, 2065], [3238, 2064]]}, "type": 2, "properties": {"iso_3166_1": "SG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 9}, {"geometry": {"type": "LineString", "coordinates": [[1055, 2197], [1082, 2218], [1102, 2221]]}, "type": 2, "properties": {"iso_3166_1": "HN-NI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 11}, {"geometry": {"type": "LineString", "coordinates": [[1052, 2199], [1055, 2197]]}, "type": 2, "properties": {"iso_3166_1": "HN-NI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 12}, {"geometry": {"type": "LineString", "coordinates": [[1102, 2221], [1103, 2221]]}, "type": 2, "properties": {"iso_3166_1": "HN-NI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 13}, {"geometry": {"type": "LineString", "coordinates": [[746, 2261], [740, 2262], [746, 2261]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 15}, {"geometry": {"type": "LineString", "coordinates": [[2202, 2631], [2201, 2632]]}, "type": 2, "properties": {"iso_3166_1": "HR-SI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 17}, {"geometry": {"type": "LineString", "coordinates": [[2198, 2630], [2201, 2632]]}, "type": 2, "properties": {"iso_3166_1": "HR-IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 18}, {"geometry": {"type": "LineString", "coordinates": [[3272, 2284], [3274, 2279], [3272, 2284]]}, "type": 2, "properties": {"iso_3166_1": "VN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 19}, {"geometry": {"type": "LineString", "coordinates": [[1113, 2231], [1108, 2231], [1113, 2231]]}, "type": 2, "properties": {"iso_3166_1": "HN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 20}, {"geometry": {"type": "LineString", "coordinates": [[3277, 2299], [3278, 2296]]}, "type": 2, "properties": {"iso_3166_1": "CN-VN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 21}, {"geometry": {"type": "LineString", "coordinates": [[2189, 2825], [2192, 2807]]}, "type": 2, "properties": {"iso_3166_1": "DK-SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 22}, {"geometry": {"type": "MultiLineString", "coordinates": [[[2950, 2440], [2949, 2449]], [[2946, 2451], [2946, 2460], [2954, 2463], [2963, 2480], [2952, 2487], [2935, 2481]]]}, "type": 2, "properties": {"iso_3166_1": "IN-claim", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 23}, {"geometry": {"type": "LineString", "coordinates": [[2623, 2349], [2622, 2362]]}, "type": 2, "properties": {"iso_3166_1": "BH-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 24}, {"geometry": {"type": "LineString", "coordinates": [[1041, 2233], [1045, 2232]]}, "type": 2, "properties": {"iso_3166_1": "GT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 25}, {"geometry": {"type": "LineString", "coordinates": [[2064, 2585], [2068, 2583]]}, "type": 2, "properties": {"iso_3166_1": "AD-ES", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 26}, {"geometry": {"type": "LineString", "coordinates": [[2075, 2730], [2077, 2726]]}, "type": 2, "properties": {"iso_3166_1": "BE-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 28}, {"geometry": {"type": "LineString", "coordinates": [[2266, 2913], [2266, 2918]]}, "type": 2, "properties": {"iso_3166_1": "FI-SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 29}, {"geometry": {"type": "LineString", "coordinates": [[2267, 2572], [2268, 2573]]}, "type": 2, "properties": {"iso_3166_1": "AL-ME", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 30}, {"geometry": {"type": "LineString", "coordinates": [[2406, 3183], [2416, 3184], [2438, 3165], [2459, 3159], [2500, 3127], [2543, 3143], [2576, 3134], [2584, 3117], [2606, 3117], [2625, 3135], [2661, 3152], [2704, 3146], [2714, 3151], [2707, 3160], [2712, 3169], [2727, 3159], [2733, 3144], [2727, 3162], [2707, 3182], [2675, 3189], [2647, 3206], [2629, 3230], [2628, 3253], [2654, 3306], [2652, 3322], [2670, 3346], [2674, 3377], [2713, 3424], [2740, 3438], [2761, 3437], [2783, 3447], [2805, 3469], [2823, 3476], [2843, 3455], [2834, 3423], [2755, 3374], [2700, 3292], [2686, 3250], [2693, 3225], [2738, 3183], [2787, 3165], [2803, 3183], [2797, 3208], [2805, 3229], [2820, 3243], [2826, 3277], [2840, 3309], [2857, 3314], [2870, 3300], [2889, 3297], [2910, 3316], [2925, 3311], [2961, 3317], [2998, 3351], [3022, 3389], [3045, 3410], [3060, 3410], [3091, 3428], [3168, 3513], [3152, 3530], [3147, 3557], [3093, 3570], [3066, 3606], [3076, 3666], [3090, 3694], [3076, 3694], [3062, 3704], [3063, 3729], [3086, 3737], [3102, 3726], [3136, 3741], [3148, 3737], [3177, 3693], [3179, 3679], [3171, 3656], [3187, 3649], [3200, 3624], [3240, 3592], [3259, 3553], [3285, 3528], [3282, 3487], [3288, 3469], [3296, 3462], [3331, 3455], [3347, 3438], [3353, 3402], [3350, 3380], [3340, 3365], [3347, 3348], [3340, 3329], [3345, 3318], [3363, 3324], [3401, 3317], [3429, 3293], [3443, 3299], [3444, 3333], [3469, 3333], [3508, 3314], [3529, 3291], [3536, 3220], [3543, 3224], [3556, 3254], [3568, 3253], [3575, 3234], [3590, 3243], [3610, 3242], [3640, 3283], [3630, 3302], [3635, 3333], [3598, 3378], [3583, 3381], [3583, 3410], [3592, 3419], [3602, 3409], [3621, 3432], [3648, 3439], [3676, 3416], [3689, 3416], [3707, 3402], [3717, 3405], [3773, 3381], [3768, 3357], [3754, 3351], [3732, 3352], [3703, 3375], [3691, 3359], [3675, 3353], [3661, 3338], [3687, 3313], [3691, 3281], [3752, 3262], [3787, 3214], [3820, 3223], [3845, 3221], [3866, 3210], [3871, 3217], [3887, 3218], [3904, 3199], [3895, 3193], [3873, 3200], [3876, 3177], [3915, 3178], [3941, 3169], [3959, 3185], [3977, 3183], [3989, 3190], [4054, 3182], [4096, 3156]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 31}, {"geometry": {"type": "LineString", "coordinates": [[3670, 1939], [3682, 1935], [3674, 1928], [3685, 1896], [3705, 1881], [3704, 1865], [3706, 1857], [3711, 1859], [3714, 1839], [3719, 1843], [3721, 1835], [3734, 1830], [3721, 1828], [3757, 1807], [3773, 1769], [3795, 1755], [3792, 1735], [3799, 1707], [3791, 1669], [3759, 1609], [3757, 1585], [3736, 1580], [3720, 1567], [3739, 1552], [3739, 1515], [3734, 1499], [3714, 1490], [3698, 1510], [3682, 1558], [3690, 1558], [3691, 1546], [3699, 1547], [3712, 1536], [3729, 1542], [3726, 1553], [3721, 1551], [3692, 1573], [3680, 1565], [3646, 1577], [3630, 1610], [3602, 1605], [3587, 1624], [3579, 1623], [3584, 1635], [3573, 1634], [3577, 1643], [3570, 1651], [3541, 1667], [3482, 1657], [3463, 1648], [3464, 1639], [3455, 1630], [3435, 1627], [3421, 1635], [3390, 1617], [3366, 1622], [3354, 1632], [3362, 1667], [3353, 1700], [3330, 1746], [3342, 1793], [3361, 1813], [3384, 1809], [3426, 1824], [3436, 1838], [3437, 1852], [3478, 1892], [3493, 1893], [3515, 1880], [3529, 1902], [3525, 1913], [3530, 1923], [3563, 1925], [3564, 1918], [3578, 1912], [3592, 1913], [3605, 1924], [3609, 1884], [3593, 1880], [3595, 1875], [3621, 1857], [3629, 1856], [3634, 1863], [3642, 1856], [3638, 1847], [3649, 1848], [3664, 1940]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 33}, {"geometry": {"type": "LineString", "coordinates": [[2610, 2643], [2600, 2648], [2605, 2653], [2597, 2667], [2585, 2668], [2584, 2677], [2577, 2680], [2589, 2715], [2603, 2705], [2601, 2719], [2626, 2739], [2633, 2733], [2643, 2739], [2646, 2733], [2658, 2733], [2669, 2716], [2669, 2725], [2682, 2717], [2690, 2726], [2705, 2723], [2712, 2728], [2725, 2716], [2731, 2722], [2747, 2721], [2748, 2732], [2731, 2741], [2743, 2749], [2742, 2761], [2755, 2762], [2744, 2768], [2749, 2772], [2741, 2774], [2742, 2780], [2790, 2787], [2793, 2794], [2817, 2797], [2832, 2809], [2854, 2806], [2857, 2783], [2869, 2783], [2869, 2788], [2872, 2779], [2874, 2784], [2887, 2782], [2881, 2775], [2884, 2770], [2894, 2770], [2923, 2790], [2918, 2781], [2934, 2767], [2959, 2720], [2966, 2730], [2975, 2720], [3000, 2724], [3018, 2700], [3029, 2697], [3035, 2703], [3041, 2691]]}, "type": 2, "properties": {"iso_3166_1": "KZ-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 34}, {"geometry": {"type": "LineString", "coordinates": [[2373, 2602], [2376, 2602]]}, "type": 2, "properties": {"iso_3166_1": "BG-RO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 35}, {"geometry": {"type": "LineString", "coordinates": [[1151, 2065], [1147, 2065]]}, "type": 2, "properties": {"iso_3166_1": "CO-EC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 36}, {"geometry": {"type": "LineString", "coordinates": [[998, 2214], [999, 2215]]}, "type": 2, "properties": {"iso_3166_1": "GT-MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 37}, {"geometry": {"type": "LineString", "coordinates": [[125, 3043], [143, 3036], [156, 3011], [186, 3014], [196, 3007], [203, 3013], [214, 2999], [199, 3000], [191, 2986], [180, 2990], [165, 2982], [167, 2973], [155, 2958], [153, 2941], [166, 2925], [140, 2915], [141, 2906], [155, 2897], [169, 2907], [182, 2895], [198, 2899], [203, 2883], [199, 2874], [232, 2874], [237, 2867], [248, 2871], [251, 2866], [249, 2855], [219, 2826], [190, 2814], [168, 2790], [146, 2784], [142, 2774], [134, 2783], [123, 2764], [116, 2767], [100, 2758], [97, 2748], [151, 2766], [182, 2789], [200, 2783], [215, 2800], [235, 2792], [241, 2799], [238, 2813], [258, 2827], [262, 2817], [269, 2818], [266, 2833], [277, 2849], [283, 2850], [286, 2843], [286, 2825], [299, 2828], [320, 2848], [324, 2882], [348, 2892], [353, 2901], [367, 2897], [387, 2911], [400, 2907], [402, 2897], [429, 2904], [473, 2882], [490, 2864], [515, 2814], [522, 2814], [526, 2793], [553, 2794]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 38}, {"geometry": {"type": "LineString", "coordinates": [[2661, 2507], [2662, 2507]]}, "type": 2, "properties": {"iso_3166_1": "IR-TM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 39}, {"geometry": {"type": "LineString", "coordinates": [[2181, 2451], [2180, 2448]]}, "type": 2, "properties": {"iso_3166_1": "LY-TN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 40}, {"geometry": {"type": "LineString", "coordinates": [[2445, 2448], [2447, 2447]]}, "type": 2, "properties": {"iso_3166_1": "IL-LB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 41}, {"geometry": {"type": "LineString", "coordinates": [[1962, 2098], [1962, 2095]]}, "type": 2, "properties": {"iso_3166_1": "CI-LR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 42}, {"geometry": {"type": "LineString", "coordinates": [[1858, 2189], [1856, 2188]]}, "type": 2, "properties": {"iso_3166_1": "GW-SN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 43}, {"geometry": {"type": "LineString", "coordinates": [[2508, 1928], [2510, 1930]]}, "type": 2, "properties": {"iso_3166_1": "MZ-TZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 44}, {"geometry": {"type": "LineString", "coordinates": [[2643, 2571], [2645, 2572]]}, "type": 2, "properties": {"iso_3166_1": "KZ-TM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 45}, {"geometry": {"type": "LineString", "coordinates": [[2025, 2705], [2024, 2697]]}, "type": 2, "properties": {"iso_3166_1": "FR-GG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 46}, {"geometry": {"type": "LineString", "coordinates": [[1412, 1614], [1414, 1611]]}, "type": 2, "properties": {"iso_3166_1": "AR-UY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 48}, {"geometry": {"type": "LineString", "coordinates": [[1368, 2146], [1365, 2145]]}, "type": 2, "properties": {"iso_3166_1": "GY-VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 49}, {"geometry": {"type": "LineString", "coordinates": [[1050, 2199], [1052, 2199]]}, "type": 2, "properties": {"iso_3166_1": "NI-SV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 50}, {"geometry": {"type": "LineString", "coordinates": [[2635, 2338], [2634, 2337]]}, "type": 2, "properties": {"iso_3166_1": "QA-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 51}, {"geometry": {"type": "LineString", "coordinates": [[1944, 2573], [1947, 2573]]}, "type": 2, "properties": {"iso_3166_1": "ES-PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 53}, {"geometry": {"type": "LineString", "coordinates": [[3652, 2021], [3652, 2018]]}, "type": 2, "properties": {"iso_3166_1": "ID-PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 54}, {"geometry": {"type": "LineString", "coordinates": [[3471, 1940], [3473, 1939]]}, "type": 2, "properties": {"iso_3166_1": "ID-TL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 55}, {"geometry": {"type": "LineString", "coordinates": [[1228, 2279], [1232, 2277]]}, "type": 2, "properties": {"iso_3166_1": "DO-HT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 57}, {"geometry": {"type": "LineString", "coordinates": [[1232, 2257], [1231, 2256]]}, "type": 2, "properties": {"iso_3166_1": "DO-HT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 58}, {"geometry": {"type": "LineString", "coordinates": [[2604, 2522], [2608, 2522]]}, "type": 2, "properties": {"iso_3166_1": "AZ-IR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 59}, {"geometry": {"type": "LineString", "coordinates": [[2676, 2313], [2681, 2305], [2674, 2280], [2640, 2268]]}, "type": 2, "properties": {"iso_3166_1": "OM-SA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 60}, {"geometry": {"type": "LineString", "coordinates": [[2523, 2236], [2535, 2237]]}, "type": 2, "properties": {"iso_3166_1": "SA-YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 61}, {"geometry": {"type": "LineString", "coordinates": [[2599, 2387], [2602, 2389]]}, "type": 2, "properties": {"iso_3166_1": "KW-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 62}, {"geometry": {"type": "LineString", "coordinates": [[3815, 1967], [3825, 1975]]}, "type": 2, "properties": {"iso_3166_1": "PG-SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 63}, {"geometry": {"type": "LineString", "coordinates": [[2134, 2603], [2135, 2600]]}, "type": 2, "properties": {"iso_3166_1": "FR-IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 64}, {"geometry": {"type": "LineString", "coordinates": [[1022, 2205], [1023, 2206]]}, "type": 2, "properties": {"iso_3166_1": "GT-SV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 65}, {"geometry": {"type": "LineString", "coordinates": [[2438, 2429], [2440, 2427]]}, "type": 2, "properties": {"iso_3166_1": "IL-PS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 66}, {"geometry": {"type": "LineString", "coordinates": [[3210, 2122], [3210, 2119]]}, "type": 2, "properties": {"iso_3166_1": "MY-TH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 67}, {"geometry": {"type": "LineString", "coordinates": [[2132, 2602], [2133, 2599]]}, "type": 2, "properties": {"iso_3166_1": "FR-MC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 69}, {"geometry": {"type": "LineString", "coordinates": [[2017, 2481], [2020, 2479]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 70}, {"geometry": {"type": "LineString", "coordinates": [[2017, 2481], [2014, 2478]]}, "type": 2, "properties": {"iso_3166_1": "ES-MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 71}, {"geometry": {"type": "LineString", "coordinates": [[2022, 2478], [2020, 2479]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 73}, {"geometry": {"type": "LineString", "coordinates": [[1330, 2257], [1327, 2256]]}, "type": 2, "properties": {"iso_3166_1": "FR-NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 74}, {"geometry": {"type": "LineString", "coordinates": [[1331, 2257], [1330, 2254]]}, "type": 2, "properties": {"iso_3166_1": "FR-NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 75}, {"geometry": {"type": "LineString", "coordinates": [[2465, 2633], [2474, 2651]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 76}, {"geometry": {"type": "LineString", "coordinates": [[2454, 2488], [2457, 2487]]}, "type": 2, "properties": {"iso_3166_1": "SY-TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 77}, {"geometry": {"type": "LineString", "coordinates": [[2533, 2206], [2535, 2202]]}, "type": 2, "properties": {"iso_3166_1": "ER-YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 78}, {"geometry": {"type": "LineString", "coordinates": [[2502, 2594], [2503, 2597]]}, "type": 2, "properties": {"iso_3166_1": "GE-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 81}, {"geometry": {"type": "LineString", "coordinates": [[1441, 1640], [1443, 1638]]}, "type": 2, "properties": {"iso_3166_1": "BR-UY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 82}, {"geometry": {"type": "LineString", "coordinates": [[2183, 1989], [2185, 1991]]}, "type": 2, "properties": {"iso_3166_1": "AO-CG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 83}, {"geometry": {"type": "LineString", "coordinates": [[1857, 2198], [1855, 2198]]}, "type": 2, "properties": {"iso_3166_1": "GM-SN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 84}, {"geometry": {"type": "LineString", "coordinates": [[2283, 2808], [2286, 2806]]}, "type": 2, "properties": {"iso_3166_1": "LT-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 85}, {"geometry": {"type": "LineString", "coordinates": [[2426, 2638], [2421, 2636]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 86}, {"geometry": {"type": "LineString", "coordinates": [[2603, 2575], [2601, 2573]]}, "type": 2, "properties": {"iso_3166_1": "AZ-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 87}, {"geometry": {"type": "LineString", "coordinates": [[2604, 2403], [2601, 2405]]}, "type": 2, "properties": {"iso_3166_1": "IQ-IR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 88}, {"geometry": {"type": "LineString", "coordinates": [[1168, 2147], [1168, 2149]]}, "type": 2, "properties": {"iso_3166_1": "CO-PA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 89}, {"geometry": {"type": "LineString", "coordinates": [[1134, 2009], [1122, 2009]]}, "type": 2, "properties": {"iso_3166_1": "EC-PE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 90}, {"geometry": {"type": "LineString", "coordinates": [[1894, 2150], [1897, 2151]]}, "type": 2, "properties": {"iso_3166_1": "GN-SL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 91}, {"geometry": {"type": "LineString", "coordinates": [[1917, 2127], [1916, 2125]]}, "type": 2, "properties": {"iso_3166_1": "LR-SL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 92}, {"geometry": {"type": "LineString", "coordinates": [[1856, 2204], [1860, 2204]]}, "type": 2, "properties": {"iso_3166_1": "GM-SN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 93}, {"geometry": {"type": "LineString", "coordinates": [[444, 3168], [447, 3174]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 94}, {"geometry": {"type": "LineString", "coordinates": [[553, 2794], [562, 2795]]}, "type": 2, "properties": {"iso_3166_1": "CA-US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 95}, {"geometry": {"type": "LineString", "coordinates": [[1269, 1346], [1267, 1341]]}, "type": 2, "properties": {"iso_3166_1": "AR-CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 96}, {"geometry": {"type": "LineString", "coordinates": [[2067, 2119], [2067, 2117]]}, "type": 2, "properties": {"iso_3166_1": "BJ-TG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 99}, {"geometry": {"type": "LineString", "coordinates": [[2318, 2159], [2322, 2159]]}, "type": 2, "properties": {"iso_3166_1": "SD-SS", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 100}, {"geometry": {"type": "LineString", "coordinates": [[2539, 2194], [2541, 2195]]}, "type": 2, "properties": {"iso_3166_1": "DJ-ER", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 101}, {"geometry": {"type": "LineString", "coordinates": [[2185, 1981], [2187, 1982]]}, "type": 2, "properties": {"iso_3166_1": "AO-CD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 102}, {"geometry": {"type": "LineString", "coordinates": [[2540, 2179], [2537, 2174]]}, "type": 2, "properties": {"iso_3166_1": "DJ-SO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 103}, {"geometry": {"type": "LineString", "coordinates": [[2179, 1849], [2182, 1849]]}, "type": 2, "properties": {"iso_3166_1": "AO-NA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 104}, {"geometry": {"type": "LineString", "coordinates": [[2204, 2632], [2201, 2632]]}, "type": 2, "properties": {"iso_3166_1": "IT-SI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 106}, {"geometry": {"type": "LineString", "coordinates": [[1104, 2139], [1105, 2140]]}, "type": 2, "properties": {"iso_3166_1": "CR-PA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 109}, {"geometry": {"type": "LineString", "coordinates": [[3499, 1952], [3490, 1954]]}, "type": 2, "properties": {"iso_3166_1": "ID-TL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 110}, {"geometry": {"type": "LineString", "coordinates": [[3490, 1954], [3480, 1954]]}, "type": 2, "properties": {"iso_3166_1": "TL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 111}, {"geometry": {"type": "LineString", "coordinates": [[3490, 1954], [3480, 1954]]}, "type": 2, "properties": {"iso_3166_1": "ID", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 114}, {"geometry": {"type": "LineString", "coordinates": [[3473, 1939], [3499, 1952]]}, "type": 2, "properties": {"iso_3166_1": "TL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 115}, {"geometry": {"type": "LineString", "coordinates": [[2158, 2567], [2149, 2564]]}, "type": 2, "properties": {"iso_3166_1": "FR-IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 116}, {"geometry": {"type": "LineString", "coordinates": [[2540, 2179], [2542, 2182]]}, "type": 2, "properties": {"iso_3166_1": "DJ-SO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 117}, {"geometry": {"type": "LineString", "coordinates": [[1339, 2246], [1336, 2243]]}, "type": 2, "properties": {"iso_3166_1": "AG-KN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 118}, {"geometry": {"type": "LineString", "coordinates": [[1341, 2244], [1341, 2245]]}, "type": 2, "properties": {"iso_3166_1": "MS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 119}, {"geometry": {"type": "LineString", "coordinates": [[2489, 2257], [2487, 2256]]}, "type": 2, "properties": {"iso_3166_1": "ER-SD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 121}, {"geometry": {"type": "LineString", "coordinates": [[3210, 2310], [3216, 2300], [3220, 2302], [3221, 2291], [3239, 2288], [3236, 2285], [3243, 2281], [3230, 2272], [3244, 2265], [3262, 2237], [3271, 2234], [3272, 2217]]}, "type": 2, "properties": {"iso_3166_1": "LA-VN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 123}, {"geometry": {"type": "LineString", "coordinates": [[2146, 2799], [2140, 2802]]}, "type": 2, "properties": {"iso_3166_1": "DE-DK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 125}, {"geometry": {"type": "LineString", "coordinates": [[998, 2214], [1022, 2205]]}, "type": 2, "properties": {"iso_3166_1": "GT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 128}, {"geometry": {"type": "LineString", "coordinates": [[3187, 2121], [3180, 2120]]}, "type": 2, "properties": {"iso_3166_1": "MY-TH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 133}, {"geometry": {"type": "LineString", "coordinates": [[2503, 2597], [2511, 2600], [2546, 2587]]}, "type": 2, "properties": {"iso_3166_1": "GE-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 134}, {"geometry": {"type": "LineString", "coordinates": [[2210, 2779], [2217, 2722]]}, "type": 2, "properties": {"iso_3166_1": "DE-PL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 135}, {"geometry": {"type": "LineString", "coordinates": [[2210, 2783], [2210, 2779]]}, "type": 2, "properties": {"iso_3166_1": "DE-PL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 136}, {"geometry": {"type": "LineString", "coordinates": [[2155, 2797], [2164, 2795]]}, "type": 2, "properties": {"iso_3166_1": "DE-DK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 137}, {"geometry": {"type": "LineString", "coordinates": [[2217, 2722], [2234, 2719], [2237, 2709], [2240, 2715], [2250, 2713], [2262, 2698]]}, "type": 2, "properties": {"iso_3166_1": "CZ-PL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 139}, {"geometry": {"type": "LineString", "coordinates": [[2551, 2585], [2567, 2584], [2567, 2578], [2576, 2574]]}, "type": 2, "properties": {"iso_3166_1": "GE-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 142}, {"geometry": {"type": "LineString", "coordinates": [[3664, 1940], [3673, 1942], [3670, 1939]]}, "type": 2, "properties": {"iso_3166_1": "AU-PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 143}, {"geometry": {"type": "LineString", "coordinates": [[2134, 2599], [2135, 2600]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 145}, {"geometry": {"type": "LineString", "coordinates": [[1331, 2253], [1333, 2252]]}, "type": 2, "properties": {"iso_3166_1": "FR-NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 146}, {"geometry": {"type": "LineString", "coordinates": [[1957, 2164], [1961, 2144], [1954, 2145], [1958, 2140], [1952, 2134]]}, "type": 2, "properties": {"iso_3166_1": "CI-GN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 147}, {"geometry": {"type": "LineString", "coordinates": [[1931, 2145], [1939, 2145], [1940, 2132], [1952, 2134]]}, "type": 2, "properties": {"iso_3166_1": "GN-LR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 148}, {"geometry": {"type": "LineString", "coordinates": [[2436, 2305], [2453, 2319]]}, "type": 2, "properties": {"iso_3166_1": "SD-claim", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 149}, {"geometry": {"type": "LineString", "coordinates": [[2262, 2698], [2269, 2700], [2276, 2692], [2295, 2697], [2305, 2691]]}, "type": 2, "properties": {"iso_3166_1": "PL-SK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 150}, {"geometry": {"type": "LineString", "coordinates": [[2130, 2766], [2130, 2768]]}, "type": 2, "properties": {"iso_3166_1": "DE-NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 151}, {"geometry": {"type": "LineString", "coordinates": [[2530, 2503], [2465, 2499], [2466, 2491], [2457, 2487]]}, "type": 2, "properties": {"iso_3166_1": "SY-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 152}, {"geometry": {"type": "LineString", "coordinates": [[1877, 2297], [1875, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 153}, {"geometry": {"type": "LineString", "coordinates": [[1911, 2355], [1911, 2354]]}, "type": 2, "properties": {"iso_3166_1": "MA-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 154}, {"geometry": {"type": "LineString", "coordinates": [[1854, 2290], [1854, 2288]]}, "type": 2, "properties": {"iso_3166_1": "MA-MR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 155}, {"geometry": {"type": "LineString", "coordinates": [[2152, 2057], [2158, 2060]]}, "type": 2, "properties": {"iso_3166_1": "GA-GQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 156}, {"geometry": {"type": "LineString", "coordinates": [[2635, 2338], [2635, 2333]]}, "type": 2, "properties": {"iso_3166_1": "AE-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 157}, {"geometry": {"type": "LineString", "coordinates": [[2652, 2240], [2640, 2268]]}, "type": 2, "properties": {"iso_3166_1": "OM-YE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 158}, {"geometry": {"type": "LineString", "coordinates": [[3704, 2259], [3709, 2256], [3704, 2259]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 159}, {"geometry": {"type": "LineString", "coordinates": [[2653, 2238], [2652, 2240]]}, "type": 2, "properties": {"iso_3166_1": "OM-YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 160}, {"geometry": {"type": "LineString", "coordinates": [[2635, 2333], [2646, 2316], [2676, 2313]]}, "type": 2, "properties": {"iso_3166_1": "AE-SA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 161}, {"geometry": {"type": "LineString", "coordinates": [[2692, 2342], [2689, 2342]]}, "type": 2, "properties": {"iso_3166_1": "AE-OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 162}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2161], [1362, 2179], [1346, 2173]]}, "type": 2, "properties": {"iso_3166_1": "TT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 163}, {"geometry": {"type": "LineString", "coordinates": [[1287, 2062], [1281, 2073], [1253, 2068], [1253, 2060], [1262, 2055], [1251, 2054], [1258, 2037], [1252, 2000]]}, "type": 2, "properties": {"iso_3166_1": "BR-CO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 164}, {"geometry": {"type": "LineString", "coordinates": [[2069, 2728], [2062, 2722]]}, "type": 2, "properties": {"iso_3166_1": "FR-GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 166}, {"geometry": {"type": "LineString", "coordinates": [[2453, 2101], [2454, 2101]]}, "type": 2, "properties": {"iso_3166_1": "KE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 168}, {"geometry": {"type": "LineString", "coordinates": [[2436, 2305], [2425, 2305]]}, "type": 2, "properties": {"iso_3166_1": "EG", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 169}, {"geometry": {"type": "LineString", "coordinates": [[1661, 2005], [1665, 2003], [1661, 2005]]}, "type": 2, "properties": {"iso_3166_1": "BR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 171}, {"geometry": {"type": "LineString", "coordinates": [[40, 2048], [40, 2053], [40, 2048]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 172}, {"geometry": {"type": "LineString", "coordinates": [[1949, 2376], [1898, 2376]]}, "type": 2, "properties": {"iso_3166_1": "EH-MA", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 173}, {"geometry": {"type": "LineString", "coordinates": [[2465, 2633], [2465, 2622]]}, "type": 2, "properties": {"iso_3166_1": "RU-UA", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 174}, {"geometry": {"type": "LineString", "coordinates": [[2426, 2638], [2431, 2643], [2446, 2635]]}, "type": 2, "properties": {"iso_3166_1": "RU-UA", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 175}, {"geometry": {"type": "LineString", "coordinates": [[3113, 2216], [3110, 2220], [3115, 2222], [3113, 2216]]}, "type": 2, "properties": {"iso_3166_1": "MM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 176}, {"geometry": {"type": "LineString", "coordinates": [[2622, 2362], [2627, 2357]]}, "type": 2, "properties": {"iso_3166_1": "BH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 177}, {"geometry": {"type": "LineString", "coordinates": [[3107, 2208], [3112, 2213], [3109, 2206]]}, "type": 2, "properties": {"iso_3166_1": "MM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 178}, {"geometry": {"type": "LineString", "coordinates": [[3070, 2383], [3077, 2381]]}, "type": 2, "properties": {"iso_3166_1": "BT-claim", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 179}, {"geometry": {"type": "LineString", "coordinates": [[2002, 2790], [2010, 2775], [1992, 2771], [1990, 2756], [1998, 2751], [1982, 2740], [1987, 2717], [1973, 2709], [1973, 2702], [2007, 2707], [2015, 2716], [2052, 2716], [2062, 2722]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 181}, {"geometry": {"type": "LineString", "coordinates": [[3062, 2375], [3060, 2374]]}, "type": 2, "properties": {"iso_3166_1": "CN-claim", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 182}, {"geometry": {"type": "LineString", "coordinates": [[3216, 2178], [3220, 2156]]}, "type": 2, "properties": {"iso_3166_1": "KH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 183}, {"geometry": {"type": "MultiLineString", "coordinates": [[[2454, 2449], [2453, 2442]], [[2454, 2449], [2453, 2449]]]}, "type": 2, "properties": {"iso_3166_1": "IL-SY", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 184}, {"geometry": {"type": "LineString", "coordinates": [[3459, 1941], [3464, 1943]]}, "type": 2, "properties": {"iso_3166_1": "ID-TL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 185}, {"geometry": {"type": "LineString", "coordinates": [[3938, 1459], [3945, 1445], [3954, 1449], [3948, 1437], [3957, 1429], [3969, 1443], [3982, 1447], [3994, 1458], [4000, 1483], [4020, 1490], [4016, 1500], [4034, 1523], [4032, 1528], [4042, 1523], [4054, 1531], [4065, 1561], [4075, 1560], [4083, 1585], [4076, 1590], [4066, 1583], [4062, 1590], [4060, 1585], [4034, 1622], [4011, 1633], [4034, 1584], [4032, 1569], [4022, 1559], [4038, 1549], [4038, 1542], [4035, 1537], [4027, 1544], [4022, 1538], [4011, 1546], [3990, 1510], [3961, 1492], [3938, 1459]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 186}, {"geometry": {"type": "LineString", "coordinates": [[1971, 2809], [1957, 2836], [1957, 2871], [2004, 2879], [2010, 2895], [2025, 2895], [2029, 2901], [2019, 2909], [2026, 2922], [2036, 2931], [2043, 2929], [2044, 2914], [2033, 2893], [2025, 2893], [2011, 2863], [2031, 2856], [2023, 2826], [2032, 2817], [2038, 2796], [2051, 2785], [2056, 2765], [2071, 2758], [2063, 2735], [2069, 2728]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 187}, {"geometry": {"type": "LineString", "coordinates": [[2689, 2362], [2691, 2363]]}, "type": 2, "properties": {"iso_3166_1": "IR-OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 188}, {"geometry": {"type": "LineString", "coordinates": [[3548, 2508], [3549, 2502], [3548, 2508]]}, "type": 2, "properties": {"iso_3166_1": "KR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 189}, {"geometry": {"type": "LineString", "coordinates": [[2518, 2570], [2517, 2585], [2502, 2594]]}, "type": 2, "properties": {"iso_3166_1": "GE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 190}, {"geometry": {"type": "LineString", "coordinates": [[2316, 2780], [2320, 2756], [2312, 2747], [2318, 2743], [2317, 2734]]}, "type": 2, "properties": {"iso_3166_1": "BY-PL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 192}, {"geometry": {"type": "LineString", "coordinates": [[2269, 2793], [2252, 2801], [2210, 2783]]}, "type": 2, "properties": {"iso_3166_1": "PL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 194}, {"geometry": {"type": "LineString", "coordinates": [[3652, 1944], [3651, 1942]]}, "type": 2, "properties": {"iso_3166_1": "ID-PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 195}, {"geometry": {"type": "LineString", "coordinates": [[3278, 2296], [3253, 2269], [3262, 2253], [3292, 2227], [3296, 2193], [3291, 2161], [3262, 2144], [3242, 2141], [3220, 2156]]}, "type": 2, "properties": {"iso_3166_1": "VN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 196}, {"geometry": {"type": "LineString", "coordinates": [[775, 2268], [770, 2268], [775, 2268]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 197}, {"geometry": {"type": "LineString", "coordinates": [[999, 2283], [1004, 2283], [999, 2283]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 198}, {"geometry": {"type": "LineString", "coordinates": [[2169, 2879], [2189, 2825]]}, "type": 2, "properties": {"iso_3166_1": "SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 199}, {"geometry": {"type": "LineString", "coordinates": [[19, 2388], [18, 2383], [19, 2388]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 200}, {"geometry": {"type": "LineString", "coordinates": [[2189, 2825], [2179, 2828], [2170, 2814], [2183, 2836], [2170, 2836], [2170, 2842], [2179, 2845], [2166, 2861], [2138, 2840], [2140, 2802]]}, "type": 2, "properties": {"iso_3166_1": "DK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 201}, {"geometry": {"type": "LineString", "coordinates": [[2192, 2807], [2195, 2798], [2186, 2790], [2164, 2795]]}, "type": 2, "properties": {"iso_3166_1": "DK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 202}, {"geometry": {"type": "LineString", "coordinates": [[2748, 2340], [2749, 2344]]}, "type": 2, "properties": {"iso_3166_1": "IR-PK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 203}, {"geometry": {"type": "LineString", "coordinates": [[2211, 2803], [2221, 2796], [2225, 2808], [2217, 2810], [2211, 2803]]}, "type": 2, "properties": {"iso_3166_1": "DK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 204}, {"geometry": {"type": "LineString", "coordinates": [[2083, 2735], [2075, 2730]]}, "type": 2, "properties": {"iso_3166_1": "BE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 205}, {"geometry": {"type": "LineString", "coordinates": [[1712, 2057], [1716, 2060], [1712, 2057]]}, "type": 2, "properties": {"iso_3166_1": "BR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 206}, {"geometry": {"type": "LineString", "coordinates": [[3099, 2285], [3119, 2250], [3121, 2229], [3134, 2227], [3151, 2243], [3155, 2237], [3159, 2221], [3154, 2183], [3160, 2158]]}, "type": 2, "properties": {"iso_3166_1": "MM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 208}, {"geometry": {"type": "LineString", "coordinates": [[2210, 2783], [2201, 2798], [2184, 2787], [2164, 2795]]}, "type": 2, "properties": {"iso_3166_1": "DE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 209}, {"geometry": {"type": "LineString", "coordinates": [[785, 2272], [790, 2272], [785, 2272]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 210}, {"geometry": {"type": "LineString", "coordinates": [[2275, 2897], [2248, 2871], [2238, 2822], [2228, 2815], [2214, 2816], [2211, 2804], [2192, 2807]]}, "type": 2, "properties": {"iso_3166_1": "SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 211}, {"geometry": {"type": "LineString", "coordinates": [[1979, 2891], [1974, 2884], [1986, 2884], [1979, 2891]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 212}, {"geometry": {"type": "LineString", "coordinates": [[2140, 2802], [2141, 2787], [2120, 2776], [2130, 2768]]}, "type": 2, "properties": {"iso_3166_1": "DE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 213}, {"geometry": {"type": "LineString", "coordinates": [[2279, 2984], [2256, 2964], [2250, 2934], [2266, 2918]]}, "type": 2, "properties": {"iso_3166_1": "SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 214}, {"geometry": {"type": "LineString", "coordinates": [[1717, 1811], [1712, 1808], [1722, 1808], [1717, 1811]]}, "type": 2, "properties": {"iso_3166_1": "BR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 215}, {"geometry": {"type": "LineString", "coordinates": [[2323, 3041], [2296, 3026], [2299, 3014], [2291, 2994]]}, "type": 2, "properties": {"iso_3166_1": "SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 216}, {"geometry": {"type": "LineString", "coordinates": [[2266, 2918], [2284, 2933], [2279, 2984]]}, "type": 2, "properties": {"iso_3166_1": "FI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 217}, {"geometry": {"type": "LineString", "coordinates": [[1972, 2936], [1959, 2956], [1966, 2964], [1978, 2962], [1972, 2936]]}, "type": 2, "properties": {"iso_3166_1": "FO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 218}, {"geometry": {"type": "LineString", "coordinates": [[789, 2266], [782, 2267], [785, 2262], [789, 2266]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 219}, {"geometry": {"type": "LineString", "coordinates": [[2258, 2579], [2267, 2572]]}, "type": 2, "properties": {"iso_3166_1": "ME", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 220}, {"geometry": {"type": "LineString", "coordinates": [[3797, 1793], [3792, 1794], [3798, 1798], [3797, 1793]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 221}, {"geometry": {"type": "LineString", "coordinates": [[0, 2967], [0, 2975]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 222}, {"geometry": {"type": "LineString", "coordinates": [[2284, 2821], [2283, 2808]]}, "type": 2, "properties": {"iso_3166_1": "LT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 223}, {"geometry": {"type": "LineString", "coordinates": [[2249, 2848], [2251, 2837], [2259, 2836], [2273, 2862], [2270, 2874], [2263, 2874], [2264, 2866], [2249, 2848]]}, "type": 2, "properties": {"iso_3166_1": "SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 224}, {"geometry": {"type": "LineString", "coordinates": [[2273, 2544], [2266, 2552], [2267, 2572]]}, "type": 2, "properties": {"iso_3166_1": "AL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 225}, {"geometry": {"type": "LineString", "coordinates": [[2361, 2912], [2303, 2896], [2275, 2897]]}, "type": 2, "properties": {"iso_3166_1": "FI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 226}, {"geometry": {"type": "LineString", "coordinates": [[2323, 3041], [2319, 3021], [2291, 2994]]}, "type": 2, "properties": {"iso_3166_1": "FI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 227}, {"geometry": {"type": "LineString", "coordinates": [[831, 2302], [841, 2294], [836, 2304], [831, 2302]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 228}, {"geometry": {"type": "LineString", "coordinates": [[1001, 2291], [995, 2293], [1001, 2291]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 229}, {"geometry": {"type": "LineString", "coordinates": [[3729, 3452], [3749, 3462], [3759, 3452], [3749, 3436], [3730, 3439], [3729, 3452]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 230}, {"geometry": {"type": "LineString", "coordinates": [[1443, 1638], [1497, 1710], [1504, 1748], [1546, 1774], [1571, 1777], [1584, 1790], [1600, 1838], [1610, 1839], [1605, 1854], [1609, 1896], [1654, 1956], [1648, 1990], [1626, 1994], [1594, 2018], [1561, 2021], [1538, 2036], [1499, 2047], [1461, 2100]]}, "type": 2, "properties": {"iso_3166_1": "BR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 231}, {"geometry": {"type": "LineString", "coordinates": [[1678, 2002], [1681, 2006], [1678, 2002]]}, "type": 2, "properties": {"iso_3166_1": "BR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 232}, {"geometry": {"type": "LineString", "coordinates": [[1993, 2789], [1989, 2781], [1996, 2778], [2002, 2790]]}, "type": 2, "properties": {"iso_3166_1": "IM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 233}, {"geometry": {"type": "LineString", "coordinates": [[1011, 2306], [1005, 2306], [1011, 2306]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 234}, {"geometry": {"type": "LineString", "coordinates": [[1276, 2260], [1277, 2255], [1276, 2260]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 235}, {"geometry": {"type": "LineString", "coordinates": [[3786, 1763], [3786, 1768], [3786, 1763]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 236}, {"geometry": {"type": "LineString", "coordinates": [[125, 3043], [115, 3052], [105, 3038], [97, 3039], [93, 3012], [79, 3005], [49, 3020], [37, 3040], [11, 3036], [0, 3023]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 237}, {"geometry": {"type": "LineString", "coordinates": [[2931, 3688], [2933, 3701], [2949, 3712], [2967, 3707], [2974, 3697], [2970, 3682], [2956, 3673], [2939, 3675], [2931, 3688]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 238}, {"geometry": {"type": "LineString", "coordinates": [[1976, 2783], [1982, 2778]]}, "type": 2, "properties": {"iso_3166_1": "GB-IE", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 239}, {"geometry": {"type": "LineString", "coordinates": [[3359, 3341], [3368, 3351], [3378, 3345], [3378, 3337], [3368, 3330], [3359, 3341]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 240}, {"geometry": {"type": "LineString", "coordinates": [[0, 3156], [76, 3094], [98, 3089], [125, 3057]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 241}, {"geometry": {"type": "LineString", "coordinates": [[2283, 2808], [2269, 2793]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 242}, {"geometry": {"type": "LineString", "coordinates": [[0, 3240], [24, 3238], [36, 3224], [27, 3208], [0, 3204]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 243}, {"geometry": {"type": "LineString", "coordinates": [[2349, 2905], [2361, 2912]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 244}, {"geometry": {"type": "LineString", "coordinates": [[4096, 2975], [4083, 3012], [4096, 3023]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 245}, {"geometry": {"type": "LineString", "coordinates": [[2502, 2594], [2465, 2622]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 246}, {"geometry": {"type": "LineString", "coordinates": [[1030, 2309], [1024, 2313], [1030, 2309]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 247}, {"geometry": {"type": "LineString", "coordinates": [[276, 2812], [282, 2816], [279, 2823], [272, 2819], [276, 2812]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 248}, {"geometry": {"type": "LineString", "coordinates": [[2478, 3653], [2478, 3638], [2471, 3633], [2453, 3639], [2455, 3657], [2470, 3660], [2478, 3653]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 249}, {"geometry": {"type": "LineString", "coordinates": [[2349, 2905], [2297, 2885], [2291, 2869], [2297, 2857]]}, "type": 2, "properties": {"iso_3166_1": "EE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 250}, {"geometry": {"type": "LineString", "coordinates": [[3785, 1794], [3782, 1789], [3779, 1796], [3785, 1794]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 251}, {"geometry": {"type": "LineString", "coordinates": [[2616, 2640], [2584, 2617], [2592, 2615], [2592, 2592], [2603, 2575]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 252}, {"geometry": {"type": "LineString", "coordinates": [[2448, 2429], [2448, 2430]]}, "type": 2, "properties": {"iso_3166_1": "PS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 253}, {"geometry": {"type": "LineString", "coordinates": [[4096, 2967], [4086, 2955], [4064, 2962], [4033, 2944], [3987, 2900], [3974, 2914], [3963, 2915], [3925, 2890], [3926, 2880], [3914, 2872], [3904, 2846], [3910, 2823], [3904, 2817], [3896, 2820], [3892, 2809], [3896, 2793], [3873, 2783], [3872, 2761], [3858, 2759], [3848, 2734], [3814, 2701], [3776, 2648], [3771, 2654], [3785, 2667], [3791, 2691], [3803, 2694], [3801, 2705], [3816, 2717], [3814, 2726], [3827, 2727], [3814, 2805], [3829, 2861], [3851, 2871], [3882, 2910], [3866, 2917], [3862, 2939], [3854, 2944], [3837, 2939], [3811, 2908], [3811, 2900], [3823, 2893], [3819, 2884], [3770, 2876], [3720, 2887], [3671, 2885], [3596, 2801], [3613, 2808], [3625, 2806], [3627, 2791], [3641, 2791], [3657, 2773], [3667, 2778], [3664, 2790], [3674, 2793], [3679, 2784], [3680, 2744], [3698, 2683], [3693, 2680], [3679, 2691], [3673, 2669], [3684, 2653], [3683, 2639], [3678, 2636], [3672, 2645], [3667, 2633], [3660, 2635], [3663, 2726], [3657, 2735], [3646, 2679], [3619, 2636], [3574, 2586], [3548, 2586], [3538, 2578]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 254}, {"geometry": {"type": "LineString", "coordinates": [[3709, 2594], [3722, 2602], [3727, 2616], [3764, 2640], [3766, 2653], [3705, 2611]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 255}, {"geometry": {"type": "LineString", "coordinates": [[1894, 2150], [1898, 2133], [1916, 2125]]}, "type": 2, "properties": {"iso_3166_1": "SL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 256}, {"geometry": {"type": "LineString", "coordinates": [[1168, 2149], [1195, 2177], [1239, 2192]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 257}, {"geometry": {"type": "LineString", "coordinates": [[4096, 3204], [4078, 3200], [4073, 3216], [4096, 3240]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 258}, {"geometry": {"type": "LineString", "coordinates": [[2605, 3130], [2592, 3135], [2590, 3151], [2598, 3166], [2609, 3169], [2627, 3150], [2615, 3131], [2605, 3130]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 259}, {"geometry": {"type": "LineString", "coordinates": [[2901, 3615], [2905, 3624], [2919, 3627], [2940, 3613], [2942, 3599], [2934, 3591], [2917, 3592], [2901, 3615]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 260}, {"geometry": {"type": "LineString", "coordinates": [[2959, 3358], [2959, 3342], [2946, 3342], [2942, 3358], [2948, 3363], [2959, 3358]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 261}, {"geometry": {"type": "LineString", "coordinates": [[1994, 2888], [1993, 2882], [2002, 2884], [2000, 2890], [1994, 2888]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 262}, {"geometry": {"type": "LineString", "coordinates": [[2974, 3485], [2974, 3496], [2981, 3502], [2992, 3500], [2999, 3490], [2990, 3478], [2974, 3485]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 263}, {"geometry": {"type": "LineString", "coordinates": [[107, 1881], [110, 1885], [103, 1886], [107, 1881]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 264}, {"geometry": {"type": "LineString", "coordinates": [[3819, 1773], [3816, 1778], [3819, 1773]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 265}, {"geometry": {"type": "LineString", "coordinates": [[3152, 1912], [3147, 1913], [3149, 1906], [3152, 1912]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 266}, {"geometry": {"type": "LineString", "coordinates": [[1350, 2221], [1346, 2228]]}, "type": 2, "properties": {"iso_3166_1": "DM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 267}, {"geometry": {"type": "LineString", "coordinates": [[2691, 3762], [2696, 3779], [2715, 3787], [2735, 3781], [2738, 3759], [2753, 3773], [2780, 3771], [2789, 3757], [2786, 3743], [2752, 3728], [2763, 3718], [2778, 3734], [2798, 3728], [2806, 3711], [2798, 3681], [2761, 3663], [2742, 3636], [2740, 3621], [2718, 3609], [2706, 3612], [2699, 3627], [2685, 3624], [2671, 3637], [2661, 3625], [2646, 3627], [2636, 3618], [2583, 3629], [2566, 3654], [2548, 3668], [2545, 3680], [2550, 3688], [2580, 3708], [2602, 3706], [2619, 3733], [2640, 3726], [2641, 3702], [2648, 3694], [2653, 3703], [2651, 3739], [2679, 3749], [2691, 3762]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 268}, {"geometry": {"type": "LineString", "coordinates": [[3694, 2205], [3693, 2198], [3700, 2204], [3694, 2205]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 269}, {"geometry": {"type": "LineString", "coordinates": [[3253, 1927], [3247, 1930], [3248, 1925], [3253, 1927]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 270}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2229], [1352, 2222]]}, "type": 2, "properties": {"iso_3166_1": "DM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 271}, {"geometry": {"type": "LineString", "coordinates": [[2986, 3365], [2978, 3365], [2968, 3378], [2970, 3394], [2978, 3400], [2968, 3415], [2991, 3424], [3003, 3419], [3005, 3412], [3001, 3404], [2989, 3400], [2994, 3383], [2986, 3365]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 272}, {"geometry": {"type": "LineString", "coordinates": [[1982, 2778], [1993, 2789]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 273}, {"geometry": {"type": "LineString", "coordinates": [[1971, 2809], [1952, 2810], [1945, 2791], [1936, 2792], [1927, 2784], [1928, 2769], [1936, 2760], [1923, 2746], [1924, 2738], [1940, 2729], [1980, 2744], [1982, 2778]]}, "type": 2, "properties": {"iso_3166_1": "IE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 274}, {"geometry": {"type": "LineString", "coordinates": [[2297, 2857], [2284, 2840], [2284, 2821]]}, "type": 2, "properties": {"iso_3166_1": "LV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 275}, {"geometry": {"type": "LineString", "coordinates": [[3581, 3338], [3587, 3345], [3597, 3343], [3606, 3329], [3604, 3317], [3592, 3316], [3581, 3338]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 276}, {"geometry": {"type": "LineString", "coordinates": [[3634, 2789], [3631, 2797], [3628, 2792], [3634, 2789]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 277}, {"geometry": {"type": "LineString", "coordinates": [[3103, 3529], [3118, 3540], [3126, 3533], [3126, 3521], [3116, 3513], [3109, 3515], [3103, 3529]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 278}, {"geometry": {"type": "LineString", "coordinates": [[1238, 2292], [1228, 2279]]}, "type": 2, "properties": {"iso_3166_1": "DO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 279}, {"geometry": {"type": "LineString", "coordinates": [[3047, 3470], [3063, 3490], [3085, 3490], [3088, 3508], [3105, 3502], [3105, 3491], [3090, 3486], [3090, 3474], [3075, 3454], [3057, 3453], [3047, 3470]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 280}, {"geometry": {"type": "LineString", "coordinates": [[30, 2380], [30, 2386], [30, 2380]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 281}, {"geometry": {"type": "LineString", "coordinates": [[2349, 2905], [2367, 2895]]}, "type": 2, "properties": {"iso_3166_1": "EE-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 282}, {"geometry": {"type": "LineString", "coordinates": [[3652, 2645], [3654, 2639], [3659, 2642], [3652, 2645]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 283}, {"geometry": {"type": "LineString", "coordinates": [[3677, 2826], [3683, 2828], [3679, 2833], [3677, 2826]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 284}, {"geometry": {"type": "LineString", "coordinates": [[2601, 2402], [2599, 2404]]}, "type": 2, "properties": {"iso_3166_1": "IQ-KW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 285}, {"geometry": {"type": "LineString", "coordinates": [[1346, 2228], [1352, 2229]]}, "type": 2, "properties": {"iso_3166_1": "DM-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 286}, {"geometry": {"type": "LineString", "coordinates": [[3774, 3404], [3781, 3411], [3774, 3420], [3777, 3430], [3793, 3432], [3797, 3424], [3787, 3410], [3790, 3397], [3779, 3393], [3774, 3404]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 287}, {"geometry": {"type": "LineString", "coordinates": [[3818, 3470], [3830, 3480], [3839, 3475], [3840, 3466], [3825, 3458], [3818, 3470]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 288}, {"geometry": {"type": "LineString", "coordinates": [[3843, 3444], [3837, 3459], [3851, 3463], [3857, 3452], [3843, 3444]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 289}, {"geometry": {"type": "LineString", "coordinates": [[3934, 2811], [3944, 2809], [3948, 2792], [3942, 2791], [3931, 2803], [3934, 2811]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 290}, {"geometry": {"type": "LineString", "coordinates": [[1889, 2854], [1896, 2852], [1889, 2854]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 291}, {"geometry": {"type": "LineString", "coordinates": [[1948, 2863], [1947, 2855], [1955, 2855], [1955, 2862], [1948, 2863]]}, "type": 2, "properties": {"iso_3166_1": "GB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 292}, {"geometry": {"type": "LineString", "coordinates": [[3962, 2796], [3964, 2788], [3958, 2787], [3949, 2799], [3954, 2802], [3962, 2796]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 293}, {"geometry": {"type": "LineString", "coordinates": [[2446, 2635], [2449, 2635]]}, "type": 2, "properties": {"iso_3166_1": "RU", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 294}, {"geometry": {"type": "LineString", "coordinates": [[68, 2358], [70, 2353], [68, 2358]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 295}, {"geometry": {"type": "LineString", "coordinates": [[1132, 2215], [1139, 2213], [1133, 2210], [1132, 2215]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 296}, {"geometry": {"type": "LineString", "coordinates": [[3823, 1845], [3819, 1849], [3823, 1845]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 297}, {"geometry": {"type": "LineString", "coordinates": [[107, 2350], [106, 2345], [107, 2350]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 298}, {"geometry": {"type": "LineString", "coordinates": [[2422, 1731], [2425, 1730]]}, "type": 2, "properties": {"iso_3166_1": "MZ-ZA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 299}, {"geometry": {"type": "LineString", "coordinates": [[115, 2829], [121, 2828], [123, 2836], [114, 2837], [115, 2829]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 300}, {"geometry": {"type": "LineString", "coordinates": [[118, 1883], [123, 1884], [119, 1888], [118, 1883]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 301}, {"geometry": {"type": "LineString", "coordinates": [[729, 2340], [734, 2341], [729, 2340]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 302}, {"geometry": {"type": "LineString", "coordinates": [[2390, 2624], [2403, 2646], [2421, 2636]]}, "type": 2, "properties": {"iso_3166_1": "UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 303}, {"geometry": {"type": "LineString", "coordinates": [[3788, 1787], [3782, 1787], [3788, 1787]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 304}, {"geometry": {"type": "LineString", "coordinates": [[2474, 2651], [2456, 2646], [2449, 2635]]}, "type": 2, "properties": {"iso_3166_1": "UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 305}, {"geometry": {"type": "LineString", "coordinates": [[3338, 1712], [3345, 1712], [3346, 1701], [3338, 1712]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 306}, {"geometry": {"type": "LineString", "coordinates": [[3448, 1905], [3446, 1910], [3448, 1905]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 307}, {"geometry": {"type": "LineString", "coordinates": [[2390, 2624], [2376, 2602]]}, "type": 2, "properties": {"iso_3166_1": "RO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 308}, {"geometry": {"type": "LineString", "coordinates": [[1137, 2206], [1135, 2201], [1137, 2206]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 310}, {"geometry": {"type": "LineString", "coordinates": [[3780, 1771], [3774, 1772], [3775, 1779], [3780, 1771]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 311}, {"geometry": {"type": "LineString", "coordinates": [[3783, 1800], [3782, 1805], [3783, 1800]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 312}, {"geometry": {"type": "LineString", "coordinates": [[3698, 2281], [3705, 2276], [3698, 2281]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 313}, {"geometry": {"type": "LineString", "coordinates": [[1312, 2256], [1308, 2250], [1315, 2252], [1312, 2256]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 314}, {"geometry": {"type": "LineString", "coordinates": [[3455, 1906], [3451, 1904], [3455, 1906]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 315}, {"geometry": {"type": "LineString", "coordinates": [[3656, 1938], [3658, 1933], [3656, 1938]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 316}, {"geometry": {"type": "LineString", "coordinates": [[4045, 2751], [4054, 2748], [4052, 2754], [4045, 2751]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 317}, {"geometry": {"type": "LineString", "coordinates": [[3685, 1935], [3690, 1934], [3685, 1935]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 318}, {"geometry": {"type": "LineString", "coordinates": [[699, 2394], [704, 2389], [705, 2396], [699, 2394]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 319}, {"geometry": {"type": "LineString", "coordinates": [[1147, 2065], [1135, 2059], [1123, 2035], [1122, 2009]]}, "type": 2, "properties": {"iso_3166_1": "EC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 320}, {"geometry": {"type": "LineString", "coordinates": [[2577, 2529], [2594, 2541], [2594, 2528], [2604, 2522]]}, "type": 2, "properties": {"iso_3166_1": "AZ-IR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 321}, {"geometry": {"type": "LineString", "coordinates": [[3959, 1699], [3958, 1706], [3959, 1699]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 322}, {"geometry": {"type": "LineString", "coordinates": [[1875, 2171], [1894, 2150]]}, "type": 2, "properties": {"iso_3166_1": "GN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 323}, {"geometry": {"type": "LineString", "coordinates": [[3862, 1668], [3855, 1671], [3859, 1664], [3862, 1668]]}, "type": 2, "properties": {"iso_3166_1": "AU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 324}, {"geometry": {"type": "LineString", "coordinates": [[2234, 1706], [2253, 1666], [2248, 1652], [2254, 1633], [2276, 1622], [2358, 1640], [2394, 1674], [2419, 1708], [2425, 1730]]}, "type": 2, "properties": {"iso_3166_1": "ZA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 325}, {"geometry": {"type": "LineString", "coordinates": [[2478, 1438], [2472, 1442], [2482, 1450], [2478, 1438]]}, "type": 2, "properties": {"iso_3166_1": "ZA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 326}, {"geometry": {"type": "LineString", "coordinates": [[3703, 2210], [3697, 2212], [3703, 2210]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 327}, {"geometry": {"type": "LineString", "coordinates": [[1050, 2258], [1054, 2255], [1052, 2262], [1057, 2263], [1055, 2282], [1064, 2287], [1063, 2300], [1057, 2302], [1022, 2297], [1013, 2273], [1003, 2267], [974, 2261], [961, 2267], [937, 2311], [945, 2354]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 328}, {"geometry": {"type": "LineString", "coordinates": [[1140, 2233], [1141, 2227], [1140, 2233]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 329}, {"geometry": {"type": "LineString", "coordinates": [[1012, 2061], [999, 2068], [1005, 2036], [1029, 2030], [1035, 2041], [1012, 2061]]}, "type": 2, "properties": {"iso_3166_1": "EC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 330}, {"geometry": {"type": "LineString", "coordinates": [[712, 2441], [728, 2401], [748, 2385], [740, 2381], [737, 2388], [731, 2382], [744, 2367], [768, 2355], [768, 2338], [796, 2313], [805, 2318], [805, 2325], [767, 2386], [771, 2382], [773, 2388], [802, 2361], [801, 2348], [815, 2341], [842, 2311], [841, 2302], [848, 2297], [843, 2284], [852, 2270], [934, 2230], [954, 2226], [969, 2233], [998, 2214]]}, "type": 2, "properties": {"iso_3166_1": "MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 331}, {"geometry": {"type": "LineString", "coordinates": [[3594, 2286], [3599, 2285], [3594, 2286]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 332}, {"geometry": {"type": "LineString", "coordinates": [[1160, 2128], [1164, 2096], [1147, 2065]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 333}, {"geometry": {"type": "LineString", "coordinates": [[1115, 2190], [1118, 2195], [1124, 2190], [1118, 2185], [1115, 2190]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 334}, {"geometry": {"type": "LineString", "coordinates": [[1117, 2095], [1122, 2094], [1117, 2095]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 335}, {"geometry": {"type": "LineString", "coordinates": [[131, 3033], [133, 3025], [141, 3026], [141, 3033], [131, 3033]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 336}, {"geometry": {"type": "LineString", "coordinates": [[1119, 2201], [1125, 2205], [1124, 2199], [1119, 2201]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 337}, {"geometry": {"type": "LineString", "coordinates": [[1122, 2212], [1127, 2216], [1125, 2208], [1122, 2212]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 338}, {"geometry": {"type": "LineString", "coordinates": [[1152, 2233], [1157, 2232], [1151, 2228], [1152, 2233]]}, "type": 2, "properties": {"iso_3166_1": "CO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 339}, {"geometry": {"type": "LineString", "coordinates": [[118, 2244], [118, 2238], [118, 2244]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 340}, {"geometry": {"type": "LineString", "coordinates": [[0, 2739], [0, 2746]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 341}, {"geometry": {"type": "LineString", "coordinates": [[137, 2339], [135, 2344], [137, 2339]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 342}, {"geometry": {"type": "LineString", "coordinates": [[447, 3174], [422, 3191], [399, 3187], [366, 3203], [330, 3203], [316, 3216], [298, 3217], [267, 3235], [249, 3215], [234, 3216], [213, 3197], [202, 3196], [181, 3154], [153, 3149], [144, 3129], [200, 3070], [192, 3068], [188, 3080], [176, 3080], [132, 3053], [125, 3057]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 343}, {"geometry": {"type": "LineString", "coordinates": [[2432, 2473], [2434, 2473]]}, "type": 2, "properties": {"iso_3166_1": "", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 344}, {"geometry": {"type": "LineString", "coordinates": [[3359, 2176], [3354, 2175], [3359, 2176]]}, "type": 2, "properties": {"iso_3166_1": "PH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 345}, {"geometry": {"type": "LineString", "coordinates": [[626, 2681], [634, 2641], [627, 2588], [633, 2569], [629, 2551], [676, 2458], [698, 2457], [684, 2450], [689, 2446], [696, 2451], [701, 2441], [704, 2453], [712, 2441]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 346}, {"geometry": {"type": "LineString", "coordinates": [[78, 2914], [80, 2907], [93, 2912], [79, 2928], [74, 2923], [78, 2914]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 347}, {"geometry": {"type": "LineString", "coordinates": [[105, 2843], [110, 2838], [119, 2846], [112, 2851], [105, 2843]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 348}, {"geometry": {"type": "LineString", "coordinates": [[103, 1923], [99, 1921], [103, 1923]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 349}, {"geometry": {"type": "LineString", "coordinates": [[945, 2354], [946, 2378], [973, 2397], [987, 2400], [1013, 2391], [1028, 2394], [1031, 2389], [1040, 2406], [1062, 2409], [1080, 2398], [1092, 2404], [1104, 2391], [1104, 2373], [1123, 2343], [1111, 2334], [1135, 2340], [1140, 2365], [1124, 2414], [1128, 2428], [1153, 2454], [1191, 2475], [1186, 2501], [1209, 2551], [1238, 2564], [1254, 2562], [1254, 2576], [1246, 2580], [1249, 2594], [1274, 2603], [1282, 2612]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 350}, {"geometry": {"type": "LineString", "coordinates": [[174, 2322], [174, 2327], [174, 2322]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 351}, {"geometry": {"type": "LineString", "coordinates": [[94, 2354], [94, 2349], [94, 2354]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 352}, {"geometry": {"type": "LineString", "coordinates": [[3706, 2263], [3707, 2268], [3706, 2263]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 353}, {"geometry": {"type": "LineString", "coordinates": [[1309, 2264], [1278, 2261], [1282, 2253], [1291, 2252], [1313, 2258]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 354}, {"geometry": {"type": "LineString", "coordinates": [[45, 2379], [51, 2378], [47, 2374], [45, 2379]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 355}, {"geometry": {"type": "LineString", "coordinates": [[37, 2746], [11, 2743], [7, 2727], [54, 2740], [79, 2740], [92, 2750], [84, 2754], [76, 2749], [66, 2755], [37, 2746]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 356}, {"geometry": {"type": "LineString", "coordinates": [[37, 2055], [41, 2058], [37, 2055]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 357}, {"geometry": {"type": "LineString", "coordinates": [[133, 2984], [114, 3001], [89, 3000], [90, 2984], [103, 2984], [115, 2972], [130, 2976], [133, 2984]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 358}, {"geometry": {"type": "LineString", "coordinates": [[3706, 2226], [3703, 2216], [3710, 2223], [3706, 2226]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 359}, {"geometry": {"type": "LineString", "coordinates": [[159, 2323], [154, 2330], [160, 2329], [159, 2323]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 360}, {"geometry": {"type": "LineString", "coordinates": [[4096, 2746], [4087, 2745], [4088, 2739], [4096, 2739]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 361}, {"geometry": {"type": "LineString", "coordinates": [[200, 2124], [203, 2119], [197, 2120], [200, 2124]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 362}, {"geometry": {"type": "LineString", "coordinates": [[206, 2315], [206, 2320], [206, 2315]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 363}, {"geometry": {"type": "LineString", "coordinates": [[3710, 2248], [3706, 2254], [3705, 2246], [3710, 2248]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 364}, {"geometry": {"type": "LineString", "coordinates": [[279, 2284], [289, 2274], [276, 2265], [270, 2277], [274, 2286], [279, 2284]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 365}, {"geometry": {"type": "LineString", "coordinates": [[134, 1883], [136, 1878], [134, 1883]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 366}, {"geometry": {"type": "LineString", "coordinates": [[222, 2303], [238, 2308], [235, 2301], [220, 2298], [222, 2303]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 367}, {"geometry": {"type": "LineString", "coordinates": [[1192, 2260], [1197, 2262], [1192, 2260]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 368}, {"geometry": {"type": "LineString", "coordinates": [[3705, 2234], [3708, 2243], [3705, 2234]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 369}, {"geometry": {"type": "LineString", "coordinates": [[1216, 1404], [1210, 1404], [1212, 1393]]}, "type": 2, "properties": {"iso_3166_1": "CL-XH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 370}, {"geometry": {"type": "LineString", "coordinates": [[1239, 2192], [1250, 2190]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 371}, {"geometry": {"type": "LineString", "coordinates": [[253, 2293], [247, 2294], [246, 2302], [276, 2288], [265, 2284], [253, 2293]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 372}, {"geometry": {"type": "LineString", "coordinates": [[2079, 2118], [2067, 2117]]}, "type": 2, "properties": {"iso_3166_1": "BJ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 373}, {"geometry": {"type": "LineString", "coordinates": [[227, 2041], [228, 2046], [227, 2041]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 374}, {"geometry": {"type": "LineString", "coordinates": [[206, 2116], [201, 2114], [206, 2116]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 375}, {"geometry": {"type": "LineString", "coordinates": [[257, 2820], [256, 2812], [261, 2814], [257, 2820]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 376}, {"geometry": {"type": "LineString", "coordinates": [[379, 2896], [381, 2889], [389, 2893], [385, 2901], [379, 2896]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 377}, {"geometry": {"type": "LineString", "coordinates": [[1104, 2340], [1103, 2335], [1108, 2336], [1104, 2340]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 378}, {"geometry": {"type": "LineString", "coordinates": [[1245, 1836], [1248, 1798], [1241, 1734], [1231, 1703], [1232, 1655], [1224, 1622], [1207, 1592], [1209, 1577], [1204, 1577], [1212, 1561], [1184, 1445], [1185, 1377], [1190, 1344], [1214, 1300], [1257, 1277], [1282, 1272], [1292, 1278], [1296, 1292]]}, "type": 2, "properties": {"iso_3166_1": "CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 380}, {"geometry": {"type": "LineString", "coordinates": [[3942, 2270], [3946, 2274], [3942, 2270]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 381}, {"geometry": {"type": "LineString", "coordinates": [[3694, 2288], [3699, 2286], [3694, 2288]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 382}, {"geometry": {"type": "LineString", "coordinates": [[4010, 2756], [4024, 2746], [4038, 2755], [4014, 2766], [4006, 2760], [4010, 2756]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 383}, {"geometry": {"type": "LineString", "coordinates": [[2320, 2473], [2323, 2469], [2320, 2473]]}, "type": 2, "properties": {"iso_3166_1": "GR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 384}, {"geometry": {"type": "LineString", "coordinates": [[3708, 2235], [3711, 2230], [3708, 2235]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 385}, {"geometry": {"type": "LineString", "coordinates": [[4073, 2747], [4064, 2749], [4061, 2739], [4093, 2729], [4082, 2746], [4073, 2747]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 386}, {"geometry": {"type": "LineString", "coordinates": [[1287, 2619], [1285, 2611]]}, "type": 2, "properties": {"iso_3166_1": "US", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 387}, {"geometry": {"type": "LineString", "coordinates": [[629, 2681], [626, 2681]]}, "type": 2, "properties": {"iso_3166_1": "CA-US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 388}, {"geometry": {"type": "LineString", "coordinates": [[803, 1724], [807, 1730], [801, 1729], [803, 1724]]}, "type": 2, "properties": {"iso_3166_1": "CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 390}, {"geometry": {"type": "LineString", "coordinates": [[2119, 2706], [2121, 2701]]}, "type": 2, "properties": {"iso_3166_1": "DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 391}, {"geometry": {"type": "LineString", "coordinates": [[1129, 1636], [1129, 1643], [1129, 1636]]}, "type": 2, "properties": {"iso_3166_1": "CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 392}, {"geometry": {"type": "LineString", "coordinates": [[2661, 2507], [2661, 2530], [2651, 2527], [2654, 2543], [2646, 2546], [2649, 2560], [2643, 2571]]}, "type": 2, "properties": {"iso_3166_1": "TM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 393}, {"geometry": {"type": "LineString", "coordinates": [[1139, 1734], [1141, 1739], [1135, 1740], [1139, 1734]]}, "type": 2, "properties": {"iso_3166_1": "CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 394}, {"geometry": {"type": "LineString", "coordinates": [[3962, 2134], [3964, 2142], [3958, 2144], [3962, 2134]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 395}, {"geometry": {"type": "LineString", "coordinates": [[3460, 2540], [3465, 2532], [3471, 2533], [3463, 2517]]}, "type": 2, "properties": {"iso_3166_1": "KP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 396}, {"geometry": {"type": "LineString", "coordinates": [[3460, 2540], [3461, 2543]]}, "type": 2, "properties": {"iso_3166_1": "CN-KP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 397}, {"geometry": {"type": "LineString", "coordinates": [[2275, 2897], [2266, 2913]]}, "type": 2, "properties": {"iso_3166_1": "FI-SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 398}, {"geometry": {"type": "LineString", "coordinates": [[2386, 2486], [2396, 2488], [2399, 2497], [2421, 2485], [2436, 2488], [2443, 2496], [2454, 2488]]}, "type": 2, "properties": {"iso_3166_1": "TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 400}, {"geometry": {"type": "LineString", "coordinates": [[2445, 2398], [2446, 2398]]}, "type": 2, "properties": {"iso_3166_1": "JO-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 401}, {"geometry": {"type": "LineString", "coordinates": [[1150, 1637], [1154, 1643], [1147, 1642], [1150, 1637]]}, "type": 2, "properties": {"iso_3166_1": "CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 402}, {"geometry": {"type": "LineString", "coordinates": [[2523, 2027], [2499, 1995]]}, "type": 2, "properties": {"iso_3166_1": "KE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 403}, {"geometry": {"type": "LineString", "coordinates": [[1071, 2175], [1050, 2199]]}, "type": 2, "properties": {"iso_3166_1": "NI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 404}, {"geometry": {"type": "LineString", "coordinates": [[1266, 1261], [1271, 1265], [1268, 1270], [1262, 1267], [1266, 1261]]}, "type": 2, "properties": {"iso_3166_1": "CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 405}, {"geometry": {"type": "LineString", "coordinates": [[2273, 2544], [2267, 2543], [2282, 2531], [2281, 2513], [2289, 2512], [2295, 2496], [2308, 2495], [2317, 2475], [2346, 2471], [2352, 2480], [2359, 2479], [2359, 2487], [2369, 2487], [2370, 2495]]}, "type": 2, "properties": {"iso_3166_1": "GR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 406}, {"geometry": {"type": "LineString", "coordinates": [[3512, 2525], [3502, 2540], [3526, 2556], [3527, 2569], [3538, 2578]]}, "type": 2, "properties": {"iso_3166_1": "KP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 407}, {"geometry": {"type": "LineString", "coordinates": [[2376, 2602], [2368, 2591], [2370, 2575]]}, "type": 2, "properties": {"iso_3166_1": "BG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 409}, {"geometry": {"type": "LineString", "coordinates": [[2370, 2495], [2381, 2488]]}, "type": 2, "properties": {"iso_3166_1": "TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 410}, {"geometry": {"type": "LineString", "coordinates": [[2386, 2486], [2381, 2488]]}, "type": 2, "properties": {"iso_3166_1": "GR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 411}, {"geometry": {"type": "LineString", "coordinates": [[2518, 2570], [2505, 2562], [2483, 2562], [2462, 2568], [2448, 2580], [2426, 2579], [2400, 2564], [2378, 2567], [2370, 2575]]}, "type": 2, "properties": {"iso_3166_1": "TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 412}, {"geometry": {"type": "LineString", "coordinates": [[2370, 2575], [2367, 2575]]}, "type": 2, "properties": {"iso_3166_1": "BG-TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 414}, {"geometry": {"type": "LineString", "coordinates": [[2013, 2106], [2012, 2104]]}, "type": 2, "properties": {"iso_3166_1": "CI-GH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 416}, {"geometry": {"type": "LineString", "coordinates": [[3099, 2285], [3091, 2309], [3062, 2298]]}, "type": 2, "properties": {"iso_3166_1": "BD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 417}, {"geometry": {"type": "LineString", "coordinates": [[2183, 1989], [2173, 2001]]}, "type": 2, "properties": {"iso_3166_1": "CG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 419}, {"geometry": {"type": "LineString", "coordinates": [[2157, 2076], [2159, 2083], [2152, 2091]]}, "type": 2, "properties": {"iso_3166_1": "CM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 420}, {"geometry": {"type": "LineString", "coordinates": [[2454, 2469], [2454, 2488]]}, "type": 2, "properties": {"iso_3166_1": "SY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 421}, {"geometry": {"type": "LineString", "coordinates": [[1949, 2376], [1949, 2371]]}, "type": 2, "properties": {"iso_3166_1": "-DZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 422}, {"geometry": {"type": "LineString", "coordinates": [[2152, 2057], [2157, 2076]]}, "type": 2, "properties": {"iso_3166_1": "GQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 423}, {"geometry": {"type": "LineString", "coordinates": [[2436, 2305], [2470, 2305]]}, "type": 2, "properties": {"iso_3166_1": "EG-SD", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 424}, {"geometry": {"type": "LineString", "coordinates": [[2445, 2448], [2454, 2469]]}, "type": 2, "properties": {"iso_3166_1": "LB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 425}, {"geometry": {"type": "LineString", "coordinates": [[2208, 2198], [2203, 2205]]}, "type": 2, "properties": {"iso_3166_1": "NG-TD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 426}, {"geometry": {"type": "LineString", "coordinates": [[2457, 2469], [2454, 2469]]}, "type": 2, "properties": {"iso_3166_1": "LB-SY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 428}, {"geometry": {"type": "LineString", "coordinates": [[3659, 2335], [3656, 2330], [3659, 2335]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 429}, {"geometry": {"type": "LineString", "coordinates": [[2014, 2695], [2025, 2705]]}, "type": 2, "properties": {"iso_3166_1": "GG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 430}, {"geometry": {"type": "LineString", "coordinates": [[2022, 2478], [2080, 2502], [2146, 2504]]}, "type": 2, "properties": {"iso_3166_1": "DZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 431}, {"geometry": {"type": "LineString", "coordinates": [[2186, 1980], [2189, 1979]]}, "type": 2, "properties": {"iso_3166_1": "AO-CD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 432}, {"geometry": {"type": "LineString", "coordinates": [[1435, 2116], [1399, 2119]]}, "type": 2, "properties": {"iso_3166_1": "SR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 433}, {"geometry": {"type": "LineString", "coordinates": [[1096, 2174], [1103, 2221]]}, "type": 2, "properties": {"iso_3166_1": "NI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 434}, {"geometry": {"type": "LineString", "coordinates": [[2146, 2504], [2150, 2513], [2153, 2508], [2175, 2506], [2178, 2500], [2170, 2490], [2183, 2472], [2175, 2460], [2181, 2451]]}, "type": 2, "properties": {"iso_3166_1": "TN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 435}, {"geometry": {"type": "LineString", "coordinates": [[4007, 2113], [4008, 2120], [4000, 2121], [4007, 2113]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 436}, {"geometry": {"type": "LineString", "coordinates": [[1856, 2188], [1859, 2175], [1875, 2171]]}, "type": 2, "properties": {"iso_3166_1": "GW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 437}, {"geometry": {"type": "LineString", "coordinates": [[2336, 2430], [2300, 2448], [2280, 2442], [2214, 2442], [2181, 2451]]}, "type": 2, "properties": {"iso_3166_1": "LY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 439}, {"geometry": {"type": "LineString", "coordinates": [[1854, 2288], [1861, 2283], [1858, 2270], [1863, 2261], [1858, 2233]]}, "type": 2, "properties": {"iso_3166_1": "MR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 440}, {"geometry": {"type": "LineString", "coordinates": [[1856, 2204], [1855, 2198]]}, "type": 2, "properties": {"iso_3166_1": "GM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 441}, {"geometry": {"type": "LineString", "coordinates": [[1855, 2198], [1856, 2188]]}, "type": 2, "properties": {"iso_3166_1": "SN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 442}, {"geometry": {"type": "LineString", "coordinates": [[1858, 2233], [1846, 2218], [1856, 2204]]}, "type": 2, "properties": {"iso_3166_1": "SN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 443}, {"geometry": {"type": "LineString", "coordinates": [[2012, 2104], [1983, 2103], [1962, 2095]]}, "type": 2, "properties": {"iso_3166_1": "CI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 444}, {"geometry": {"type": "LineString", "coordinates": [[1916, 2125], [1962, 2095]]}, "type": 2, "properties": {"iso_3166_1": "LR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 445}, {"geometry": {"type": "LineString", "coordinates": [[3653, 2348], [3658, 2346], [3653, 2348]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 446}, {"geometry": {"type": "LineString", "coordinates": [[2012, 2104], [2026, 2100], [2062, 2116]]}, "type": 2, "properties": {"iso_3166_1": "GH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 448}, {"geometry": {"type": "LineString", "coordinates": [[2067, 2117], [2062, 2116]]}, "type": 2, "properties": {"iso_3166_1": "TG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 449}, {"geometry": {"type": "LineString", "coordinates": [[3187, 2091], [3187, 2096], [3187, 2091]]}, "type": 2, "properties": {"iso_3166_1": "MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 450}, {"geometry": {"type": "LineString", "coordinates": [[2538, 2199], [2541, 2195]]}, "type": 2, "properties": {"iso_3166_1": "ER-YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 451}, {"geometry": {"type": "LineString", "coordinates": [[2143, 2098], [2117, 2094], [2098, 2118], [2079, 2118]]}, "type": 2, "properties": {"iso_3166_1": "NG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 452}, {"geometry": {"type": "LineString", "coordinates": [[2148, 2093], [2143, 2098]]}, "type": 2, "properties": {"iso_3166_1": "CM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 453}, {"geometry": {"type": "LineString", "coordinates": [[2470, 2305], [2475, 2271], [2481, 2275], [2491, 2268], [2489, 2257]]}, "type": 2, "properties": {"iso_3166_1": "SD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 455}, {"geometry": {"type": "LineString", "coordinates": [[2112, 2029], [2114, 2034], [2112, 2029]]}, "type": 2, "properties": {"iso_3166_1": "GQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 456}, {"geometry": {"type": "LineString", "coordinates": [[2148, 2093], [2143, 2083], [2152, 2091]]}, "type": 2, "properties": {"iso_3166_1": "GQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 457}, {"geometry": {"type": "LineString", "coordinates": [[2544, 2192], [2542, 2182]]}, "type": 2, "properties": {"iso_3166_1": "DJ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 458}, {"geometry": {"type": "LineString", "coordinates": [[2510, 1930], [2501, 1945], [2505, 1970], [2504, 1993], [2499, 1995]]}, "type": 2, "properties": {"iso_3166_1": "TZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 459}, {"geometry": {"type": "LineString", "coordinates": [[2173, 2001], [2145, 2039], [2152, 2057]]}, "type": 2, "properties": {"iso_3166_1": "GA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 460}, {"geometry": {"type": "LineString", "coordinates": [[2542, 2182], [2558, 2169], [2626, 2188], [2634, 2185], [2635, 2167], [2629, 2165], [2629, 2156], [2595, 2097], [2545, 2054], [2523, 2027]]}, "type": 2, "properties": {"iso_3166_1": "SO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 461}, {"geometry": {"type": "LineString", "coordinates": [[2186, 1980], [2185, 1981]]}, "type": 2, "properties": {"iso_3166_1": "CD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 462}, {"geometry": {"type": "LineString", "coordinates": [[2234, 1706], [2217, 1732], [2210, 1787], [2179, 1849]]}, "type": 2, "properties": {"iso_3166_1": "NA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 463}, {"geometry": {"type": "LineString", "coordinates": [[3653, 2339], [3659, 2339], [3653, 2339]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 464}, {"geometry": {"type": "LineString", "coordinates": [[2276, 1757], [2276, 1791], [2287, 1791], [2287, 1836], [2313, 1840], [2317, 1834], [2335, 1842]]}, "type": 2, "properties": {"iso_3166_1": "BW-NA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 465}, {"geometry": {"type": "LineString", "coordinates": [[2179, 1849], [2188, 1895], [2203, 1913], [2194, 1944], [2198, 1952], [2186, 1980]]}, "type": 2, "properties": {"iso_3166_1": "AO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 466}, {"geometry": {"type": "LineString", "coordinates": [[2185, 1981], [2183, 1989]]}, "type": 2, "properties": {"iso_3166_1": "AO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 467}, {"geometry": {"type": "LineString", "coordinates": [[2323, 3053], [2317, 3066], [2317, 3115], [2282, 3149]]}, "type": 2, "properties": {"iso_3166_1": "FI-SE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 468}, {"geometry": {"type": "LineString", "coordinates": [[2510, 1930], [2514, 1874], [2506, 1858], [2473, 1841], [2446, 1815], [2454, 1799], [2455, 1769], [2449, 1757], [2429, 1749], [2425, 1730]]}, "type": 2, "properties": {"iso_3166_1": "MZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 469}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2229], [1356, 2237], [1348, 2241], [1342, 2237], [1346, 2228]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 470}, {"geometry": {"type": "LineString", "coordinates": [[2198, 2630], [2201, 2619], [2229, 2595], [2221, 2592], [2233, 2588], [2231, 2579], [2237, 2580], [2235, 2584], [2258, 2579]]}, "type": 2, "properties": {"iso_3166_1": "HR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 471}, {"geometry": {"type": "LineString", "coordinates": [[3350, 2168], [3348, 2172], [3350, 2168]]}, "type": 2, "properties": {"iso_3166_1": "PH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 473}, {"geometry": {"type": "LineString", "coordinates": [[2643, 2571], [2644, 2585], [2629, 2593], [2615, 2622], [2645, 2632], [2649, 2649], [2631, 2653], [2616, 2640]]}, "type": 2, "properties": {"iso_3166_1": "KZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 474}, {"geometry": {"type": "LineString", "coordinates": [[3311, 2230], [3315, 2248], [3333, 2241], [3331, 2232], [3311, 2230]]}, "type": 2, "properties": {"iso_3166_1": "CN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 475}, {"geometry": {"type": "LineString", "coordinates": [[3346, 2101], [3346, 2100]]}, "type": 2, "properties": {"iso_3166_1": "BN-MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 476}, {"geometry": {"type": "LineString", "coordinates": [[1284, 2184], [1299, 2184], [1276, 2187], [1284, 2184]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 477}, {"geometry": {"type": "LineString", "coordinates": [[1309, 2264], [1319, 2266], [1313, 2258]]}, "type": 2, "properties": {"iso_3166_1": "VG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 479}, {"geometry": {"type": "LineString", "coordinates": [[3278, 2296], [3286, 2297], [3289, 2289], [3294, 2296], [3296, 2283], [3282, 2274], [3281, 2266], [3286, 2258], [3297, 2256], [3328, 2296], [3383, 2317], [3414, 2346], [3452, 2415], [3416, 2473], [3447, 2507], [3426, 2520], [3439, 2530], [3451, 2529], [3452, 2538], [3460, 2540]]}, "type": 2, "properties": {"iso_3166_1": "CN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 480}, {"geometry": {"type": "LineString", "coordinates": [[1255, 2189], [1275, 2171], [1298, 2174], [1307, 2166], [1314, 2169], [1314, 2177], [1328, 2181], [1333, 2177], [1324, 2172], [1346, 2173]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 481}, {"geometry": {"type": "LineString", "coordinates": [[1368, 2146], [1352, 2161]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 483}, {"geometry": {"type": "LineString", "coordinates": [[1296, 1292], [1319, 1295], [1326, 1302], [1301, 1306], [1283, 1318], [1271, 1342], [1265, 1376], [1279, 1388], [1282, 1404], [1303, 1423], [1308, 1494], [1327, 1507], [1326, 1519], [1342, 1536], [1348, 1562], [1393, 1574], [1406, 1595], [1405, 1604], [1414, 1611]]}, "type": 2, "properties": {"iso_3166_1": "AR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 484}, {"geometry": {"type": "LineString", "coordinates": [[2642, 2352], [2647, 2351], [2642, 2352]]}, "type": 2, "properties": {"iso_3166_1": "QA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 485}, {"geometry": {"type": "LineString", "coordinates": [[1414, 1611], [1443, 1638]]}, "type": 2, "properties": {"iso_3166_1": "UY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 486}, {"geometry": {"type": "LineString", "coordinates": [[1327, 2229], [1321, 2229], [1327, 2229]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 488}, {"geometry": {"type": "LineString", "coordinates": [[1357, 2107], [1349, 2116], [1352, 2125], [1362, 2128], [1357, 2134], [1365, 2145]]}, "type": 2, "properties": {"iso_3166_1": "GY-VE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 489}, {"geometry": {"type": "LineString", "coordinates": [[3366, 2174], [3366, 2168], [3366, 2174]]}, "type": 2, "properties": {"iso_3166_1": "PH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 490}, {"geometry": {"type": "LineString", "coordinates": [[1399, 2119], [1368, 2146]]}, "type": 2, "properties": {"iso_3166_1": "GY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 491}, {"geometry": {"type": "LineString", "coordinates": [[1302, 2176], [1307, 2170], [1302, 2176]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 492}, {"geometry": {"type": "LineString", "coordinates": [[1310, 2184], [1318, 2182], [1310, 2184]]}, "type": 2, "properties": {"iso_3166_1": "VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 493}, {"geometry": {"type": "LineString", "coordinates": [[1398, 2115], [1399, 2119]]}, "type": 2, "properties": {"iso_3166_1": "GY-SR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 494}, {"geometry": {"type": "LineString", "coordinates": [[1104, 2139], [1083, 2160], [1072, 2160], [1071, 2175]]}, "type": 2, "properties": {"iso_3166_1": "CR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 495}, {"geometry": {"type": "LineString", "coordinates": [[1109, 2158], [1096, 2174]]}, "type": 2, "properties": {"iso_3166_1": "CR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 496}, {"geometry": {"type": "LineString", "coordinates": [[1057, 2109], [1059, 2113], [1057, 2109]]}, "type": 2, "properties": {"iso_3166_1": "CR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 497}, {"geometry": {"type": "LineString", "coordinates": [[1160, 2128], [1143, 2144], [1136, 2140], [1140, 2132], [1128, 2128], [1116, 2128], [1104, 2139]]}, "type": 2, "properties": {"iso_3166_1": "PA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 498}, {"geometry": {"type": "LineString", "coordinates": [[1109, 2157], [1109, 2158]]}, "type": 2, "properties": {"iso_3166_1": "CR-PA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 499}, {"geometry": {"type": "LineString", "coordinates": [[1045, 2232], [1072, 2241], [1102, 2224], [1097, 2233], [1101, 2235], [1112, 2223], [1103, 2221]]}, "type": 2, "properties": {"iso_3166_1": "HN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 500}, {"geometry": {"type": "LineString", "coordinates": [[1094, 2252], [1092, 2247], [1094, 2252]]}, "type": 2, "properties": {"iso_3166_1": "HN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 501}, {"geometry": {"type": "LineString", "coordinates": [[1109, 2158], [1123, 2150], [1143, 2161], [1154, 2160], [1168, 2149]]}, "type": 2, "properties": {"iso_3166_1": "PA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 502}, {"geometry": {"type": "LineString", "coordinates": [[2421, 2469], [2421, 2468]]}, "type": 2, "properties": {"iso_3166_1": "-CY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 503}, {"geometry": {"type": "LineString", "coordinates": [[2424, 2469], [2424, 2468]]}, "type": 2, "properties": {"iso_3166_1": "-CY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 504}, {"geometry": {"type": "LineString", "coordinates": [[2431, 2473], [2432, 2473]]}, "type": 2, "properties": {"iso_3166_1": "-CY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 505}, {"geometry": {"type": "LineString", "coordinates": [[1041, 2233], [1054, 2246], [1047, 2253], [1050, 2258]]}, "type": 2, "properties": {"iso_3166_1": "BZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 506}, {"geometry": {"type": "LineString", "coordinates": [[1835, 3085], [1841, 3088], [1838, 3096], [1830, 3093], [1835, 3085]]}, "type": 2, "properties": {"iso_3166_1": "IS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 507}, {"geometry": {"type": "LineString", "coordinates": [[2748, 2340], [2699, 2350], [2691, 2363]]}, "type": 2, "properties": {"iso_3166_1": "IR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 508}, {"geometry": {"type": "LineString", "coordinates": [[1036, 2231], [1041, 2233]]}, "type": 2, "properties": {"iso_3166_1": "BZ-GT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 509}, {"geometry": {"type": "LineString", "coordinates": [[1245, 1836], [1231, 1836], [1209, 1813], [1168, 1840], [1149, 1861], [1121, 1923], [1098, 1947], [1087, 1973], [1087, 2009], [1122, 2009]]}, "type": 2, "properties": {"iso_3166_1": "PE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 510}, {"geometry": {"type": "LineString", "coordinates": [[1944, 2573], [1944, 2549], [1936, 2538], [1943, 2501], [1964, 2501]]}, "type": 2, "properties": {"iso_3166_1": "PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 511}, {"geometry": {"type": "LineString", "coordinates": [[2951, 2157], [2951, 2151]]}, "type": 2, "properties": {"iso_3166_1": "IN-LK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 513}, {"geometry": {"type": "LineString", "coordinates": [[1689, 2538], [1696, 2543], [1696, 2534], [1689, 2538]]}, "type": 2, "properties": {"iso_3166_1": "PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 514}, {"geometry": {"type": "LineString", "coordinates": [[1751, 2515], [1763, 2517], [1769, 2507], [1765, 2484], [1751, 2515]]}, "type": 2, "properties": {"iso_3166_1": "PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 515}, {"geometry": {"type": "LineString", "coordinates": [[2638, 2338], [2635, 2338]]}, "type": 2, "properties": {"iso_3166_1": "AE-QA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 516}, {"geometry": {"type": "LineString", "coordinates": [[2951, 2151], [2932, 2138], [2915, 2150], [2878, 2239], [2873, 2290], [2845, 2290], [2823, 2324]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 517}, {"geometry": {"type": "LineString", "coordinates": [[1717, 2525], [1729, 2535], [1734, 2526], [1736, 2531], [1744, 2526], [1731, 2519], [1717, 2525]]}, "type": 2, "properties": {"iso_3166_1": "PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 518}, {"geometry": {"type": "LineString", "coordinates": [[2604, 2403], [2601, 2402]]}, "type": 2, "properties": {"iso_3166_1": "IQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 519}, {"geometry": {"type": "LineString", "coordinates": [[1849, 2444], [1866, 2447], [1861, 2435], [1849, 2444]]}, "type": 2, "properties": {"iso_3166_1": "PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 520}, {"geometry": {"type": "LineString", "coordinates": [[1868, 2411], [1870, 2406], [1864, 2404], [1868, 2411]]}, "type": 2, "properties": {"iso_3166_1": "PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 521}, {"geometry": {"type": "LineString", "coordinates": [[2535, 2202], [2538, 2199]]}, "type": 2, "properties": {"iso_3166_1": "ER", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 522}, {"geometry": {"type": "LineString", "coordinates": [[3109, 2206], [3109, 2181], [3098, 2166], [3095, 2181], [3107, 2208]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 523}, {"geometry": {"type": "LineString", "coordinates": [[3358, 2104], [3346, 2101]]}, "type": 2, "properties": {"iso_3166_1": "BN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 524}, {"geometry": {"type": "LineString", "coordinates": [[2489, 2257], [2495, 2242], [2506, 2241], [2515, 2230], [2511, 2222], [2533, 2206]]}, "type": 2, "properties": {"iso_3166_1": "ER", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 525}, {"geometry": {"type": "LineString", "coordinates": [[3062, 2298], [3042, 2296], [3043, 2288], [3034, 2278], [3022, 2273], [2983, 2234], [2964, 2226], [2961, 2172], [2951, 2157]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 526}, {"geometry": {"type": "LineString", "coordinates": [[2867, 2159], [2865, 2193], [2890, 2176], [2890, 2161], [2867, 2159]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 527}, {"geometry": {"type": "LineString", "coordinates": [[3651, 1942], [3634, 1951], [3614, 1949], [3620, 1975], [3597, 1993], [3587, 1991], [3580, 1965], [3560, 1976], [3536, 1950], [3499, 1952]]}, "type": 2, "properties": {"iso_3166_1": "ID", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 528}, {"geometry": {"type": "LineString", "coordinates": [[3238, 2064], [3248, 2085], [3277, 2105], [3296, 2072]]}, "type": 2, "properties": {"iso_3166_1": "ID", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 529}, {"geometry": {"type": "LineString", "coordinates": [[1842, 2985], [1813, 2980], [1779, 2992], [1763, 3044], [1780, 3073], [1793, 3076], [1819, 3067], [1840, 3068], [1837, 3074], [1843, 3079], [1848, 3070], [1864, 3078], [1888, 3071], [1899, 3045], [1902, 3016], [1893, 3016], [1842, 2985]]}, "type": 2, "properties": {"iso_3166_1": "IS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 530}, {"geometry": {"type": "LineString", "coordinates": [[2119, 2706], [2121, 2701]]}, "type": 2, "properties": {"iso_3166_1": "LU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 531}, {"geometry": {"type": "LineString", "coordinates": [[3394, 2095], [3400, 2075], [3416, 2062], [3461, 2063], [3474, 2104], [3489, 2114], [3497, 2103], [3494, 2092], [3513, 2079], [3519, 2058], [3535, 2056], [3542, 2063], [3557, 2046], [3577, 2061], [3601, 2038], [3652, 2021]]}, "type": 2, "properties": {"iso_3166_1": "ID", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 532}, {"geometry": {"type": "LineString", "coordinates": [[1867, 2297], [1866, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 533}, {"geometry": {"type": "LineString", "coordinates": [[1869, 2297], [1868, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 534}, {"geometry": {"type": "LineString", "coordinates": [[2639, 2192], [2646, 2186], [2639, 2192]]}, "type": 2, "properties": {"iso_3166_1": "YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 535}, {"geometry": {"type": "LineString", "coordinates": [[3473, 1939], [3447, 1920], [3427, 1922], [3401, 1935], [3395, 1944], [3275, 1957], [3244, 1968], [3229, 1986], [3210, 1983], [3132, 2080], [3128, 2118], [3158, 2110], [3198, 2080]]}, "type": 2, "properties": {"iso_3166_1": "ID", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 536}, {"geometry": {"type": "LineString", "coordinates": [[2873, 2142], [2875, 2138], [2882, 2144], [2873, 2142]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 537}, {"geometry": {"type": "LineString", "coordinates": [[3119, 2204], [3122, 2200], [3119, 2204]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 538}, {"geometry": {"type": "LineString", "coordinates": [[3101, 2152], [3104, 2156], [3106, 2147], [3115, 2147], [3117, 2123], [3101, 2152]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 539}, {"geometry": {"type": "LineString", "coordinates": [[3116, 2191], [3116, 2186], [3116, 2191]]}, "type": 2, "properties": {"iso_3166_1": "IN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 540}, {"geometry": {"type": "LineString", "coordinates": [[1231, 2256], [1233, 2248], [1250, 2257], [1269, 2255], [1273, 2263], [1259, 2290], [1240, 2294]]}, "type": 2, "properties": {"iso_3166_1": "DO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 542}, {"geometry": {"type": "LineString", "coordinates": [[2644, 2340], [2640, 2344], [2645, 2342]]}, "type": 2, "properties": {"iso_3166_1": "QA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 543}, {"geometry": {"type": "LineString", "coordinates": [[2601, 2402], [2606, 2391], [2602, 2389]]}, "type": 2, "properties": {"iso_3166_1": "KW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 544}, {"geometry": {"type": "LineString", "coordinates": [[2608, 2522], [2615, 2546], [2628, 2551], [2615, 2557], [2603, 2575]]}, "type": 2, "properties": {"iso_3166_1": "AZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 545}, {"geometry": {"type": "LineString", "coordinates": [[2748, 2340], [2802, 2346], [2813, 2328], [2823, 2324]]}, "type": 2, "properties": {"iso_3166_1": "PK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 546}, {"geometry": {"type": "LineString", "coordinates": [[2689, 2362], [2675, 2350], [2673, 2358], [2667, 2351], [2665, 2358], [2632, 2376], [2611, 2403], [2604, 2403]]}, "type": 2, "properties": {"iso_3166_1": "IR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 547}, {"geometry": {"type": "LineString", "coordinates": [[2661, 2507], [2661, 2501], [2631, 2499], [2608, 2511], [2608, 2522]]}, "type": 2, "properties": {"iso_3166_1": "IR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 548}, {"geometry": {"type": "LineString", "coordinates": [[2617, 2379], [2621, 2379]]}, "type": 2, "properties": {"iso_3166_1": "IR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 549}, {"geometry": {"type": "LineString", "coordinates": [[2533, 2206], [2534, 2217], [2526, 2219], [2530, 2224], [2523, 2236]]}, "type": 2, "properties": {"iso_3166_1": "YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 550}, {"geometry": {"type": "LineString", "coordinates": [[2538, 2199], [2538, 2206], [2535, 2202]]}, "type": 2, "properties": {"iso_3166_1": "YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 551}, {"geometry": {"type": "LineString", "coordinates": [[2691, 2363], [2691, 2351]]}, "type": 2, "properties": {"iso_3166_1": "OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 552}, {"geometry": {"type": "LineString", "coordinates": [[2653, 2238], [2637, 2222], [2603, 2207], [2568, 2199], [2561, 2192], [2544, 2192]]}, "type": 2, "properties": {"iso_3166_1": "YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 553}, {"geometry": {"type": "LineString", "coordinates": [[2525, 2225], [2523, 2229], [2525, 2225]]}, "type": 2, "properties": {"iso_3166_1": "YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 554}, {"geometry": {"type": "LineString", "coordinates": [[3533, 2509], [3541, 2510], [3539, 2505], [3533, 2509]]}, "type": 2, "properties": {"iso_3166_1": "KR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 555}, {"geometry": {"type": "LineString", "coordinates": [[2653, 2189], [2650, 2193], [2656, 2196], [2671, 2192], [2655, 2185], [2648, 2188], [2653, 2189]]}, "type": 2, "properties": {"iso_3166_1": "YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 556}, {"geometry": {"type": "LineString", "coordinates": [[2627, 2357], [2637, 2356], [2638, 2338]]}, "type": 2, "properties": {"iso_3166_1": "QA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 557}, {"geometry": {"type": "LineString", "coordinates": [[2638, 2338], [2644, 2340]]}, "type": 2, "properties": {"iso_3166_1": "AE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 558}, {"geometry": {"type": "LineString", "coordinates": [[1231, 2256], [1199, 2259], [1199, 2264], [1217, 2269], [1210, 2279], [1228, 2279]]}, "type": 2, "properties": {"iso_3166_1": "HT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 559}, {"geometry": {"type": "LineString", "coordinates": [[2621, 2379], [2617, 2374], [2622, 2362]]}, "type": 2, "properties": {"iso_3166_1": "SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 560}, {"geometry": {"type": "LineString", "coordinates": [[2692, 2342], [2700, 2331], [2715, 2328], [2731, 2307], [2719, 2282], [2708, 2282], [2708, 2267], [2696, 2264], [2691, 2249], [2653, 2238]]}, "type": 2, "properties": {"iso_3166_1": "OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 561}, {"geometry": {"type": "LineString", "coordinates": [[2684, 2356], [2689, 2362]]}, "type": 2, "properties": {"iso_3166_1": "OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 562}, {"geometry": {"type": "LineString", "coordinates": [[3831, 1995], [3837, 1993], [3831, 1995]]}, "type": 2, "properties": {"iso_3166_1": "PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 563}, {"geometry": {"type": "LineString", "coordinates": [[4062, 1902], [4060, 1907], [4066, 1905], [4062, 1902]]}, "type": 2, "properties": {"iso_3166_1": "FJ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 564}, {"geometry": {"type": "LineString", "coordinates": [[3932, 1375], [3942, 1371], [3942, 1384], [3932, 1375]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 565}, {"geometry": {"type": "LineString", "coordinates": [[2592, 1938], [2591, 1930], [2586, 1937], [2592, 1938]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 566}, {"geometry": {"type": "LineString", "coordinates": [[2441, 2376], [2450, 2371], [2469, 2332], [2485, 2317], [2490, 2293], [2523, 2236]]}, "type": 2, "properties": {"iso_3166_1": "SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 567}, {"geometry": {"type": "LineString", "coordinates": [[2602, 2389], [2612, 2377], [2617, 2379]]}, "type": 2, "properties": {"iso_3166_1": "SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 568}, {"geometry": {"type": "LineString", "coordinates": [[3968, 1345], [3971, 1338], [3978, 1343], [3975, 1348], [3968, 1345]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 569}, {"geometry": {"type": "LineString", "coordinates": [[3968, 2136], [3963, 2133], [3971, 2129], [3973, 2137], [3968, 2136]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 570}, {"geometry": {"type": "LineString", "coordinates": [[3463, 2517], [3464, 2511], [3480, 2508], [3474, 2496], [3480, 2483], [3468, 2461], [3484, 2455], [3480, 2450], [3485, 2444], [3494, 2456], [3514, 2465], [3524, 2480], [3524, 2500], [3512, 2525]]}, "type": 2, "properties": {"iso_3166_1": "KR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 571}, {"geometry": {"type": "LineString", "coordinates": [[3864, 1999], [3859, 1994], [3864, 1999]]}, "type": 2, "properties": {"iso_3166_1": "PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 572}, {"geometry": {"type": "LineString", "coordinates": [[2645, 2342], [2650, 2346], [2663, 2336], [2684, 2356]]}, "type": 2, "properties": {"iso_3166_1": "AE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 573}, {"geometry": {"type": "LineString", "coordinates": [[2691, 2351], [2692, 2342]]}, "type": 2, "properties": {"iso_3166_1": "AE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 574}, {"geometry": {"type": "LineString", "coordinates": [[2662, 2345], [2668, 2344], [2662, 2345]]}, "type": 2, "properties": {"iso_3166_1": "AE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 575}, {"geometry": {"type": "LineString", "coordinates": [[3815, 1967], [3804, 1988], [3789, 1990], [3761, 1974], [3733, 1970], [3736, 1957], [3746, 1948], [3764, 1955], [3798, 1944], [3786, 1937], [3790, 1926], [3807, 1918], [3798, 1912], [3728, 1930], [3708, 1954], [3694, 1958], [3685, 1954], [3679, 1941], [3670, 1939]]}, "type": 2, "properties": {"iso_3166_1": "PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 576}, {"geometry": {"type": "LineString", "coordinates": [[2686, 1967], [2691, 1968], [2686, 1967]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 577}, {"geometry": {"type": "LineString", "coordinates": [[2624, 1944], [2632, 1942], [2630, 1928], [2624, 1944]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 578}, {"geometry": {"type": "LineString", "coordinates": [[2160, 2579], [2180, 2574], [2192, 2557], [2225, 2541], [2225, 2523], [2221, 2531], [2209, 2526], [2215, 2521], [2182, 2517], [2191, 2507], [2222, 2495], [2225, 2513], [2232, 2512], [2262, 2548], [2236, 2567], [2228, 2582], [2219, 2579], [2211, 2586], [2206, 2601], [2192, 2612], [2198, 2630]]}, "type": 2, "properties": {"iso_3166_1": "IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 580}, {"geometry": {"type": "LineString", "coordinates": [[2434, 2473], [2438, 2471], [2443, 2486], [2415, 2478], [2414, 2468], [2421, 2468]]}, "type": 2, "properties": {"iso_3166_1": "CY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 581}, {"geometry": {"type": "LineString", "coordinates": [[2424, 2468], [2432, 2473]]}, "type": 2, "properties": {"iso_3166_1": "CY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 582}, {"geometry": {"type": "LineString", "coordinates": [[1169, 2305], [1206, 2281], [1163, 2276], [1138, 2297], [1104, 2295], [1079, 2303], [1089, 2315], [1111, 2322], [1152, 2315]]}, "type": 2, "properties": {"iso_3166_1": "CU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 583}, {"geometry": {"type": "LineString", "coordinates": [[3664, 1940], [3651, 1942]]}, "type": 2, "properties": {"iso_3166_1": "PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 584}, {"geometry": {"type": "LineString", "coordinates": [[3652, 2021], [3668, 2015], [3674, 2033], [3701, 2042], [3728, 2027], [3751, 2035], [3793, 2012], [3809, 2013], [3825, 1975]]}, "type": 2, "properties": {"iso_3166_1": "PG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 585}, {"geometry": {"type": "LineString", "coordinates": [[2208, 2486], [2217, 2486], [2210, 2492], [2208, 2486]]}, "type": 2, "properties": {"iso_3166_1": "MT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 586}, {"geometry": {"type": "LineString", "coordinates": [[2135, 2600], [2149, 2610], [2160, 2604], [2157, 2594]]}, "type": 2, "properties": {"iso_3166_1": "IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 587}, {"geometry": {"type": "LineString", "coordinates": [[2149, 2564], [2140, 2564], [2138, 2557], [2143, 2526], [2160, 2532], [2163, 2553], [2158, 2567]]}, "type": 2, "properties": {"iso_3166_1": "IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 588}, {"geometry": {"type": "LineString", "coordinates": [[3238, 2064], [3237, 2065]]}, "type": 2, "properties": {"iso_3166_1": "MY-SG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 589}, {"geometry": {"type": "LineString", "coordinates": [[3227, 2062], [3226, 2062]]}, "type": 2, "properties": {"iso_3166_1": "MY-SG", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 590}, {"geometry": {"type": "LineString", "coordinates": [[2185, 2502], [2183, 2495], [2185, 2502]]}, "type": 2, "properties": {"iso_3166_1": "IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 591}, {"geometry": {"type": "LineString", "coordinates": [[1760, 2240], [1757, 2245], [1762, 2249], [1772, 2243], [1789, 2245], [1793, 2234], [1787, 2221], [1767, 2216], [1768, 2237], [1760, 2240]]}, "type": 2, "properties": {"iso_3166_1": "CV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 592}, {"geometry": {"type": "LineString", "coordinates": [[58, 1831], [64, 1829], [58, 1831]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 593}, {"geometry": {"type": "LineString", "coordinates": [[2195, 2527], [2201, 2525], [2195, 2527]]}, "type": 2, "properties": {"iso_3166_1": "IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 594}, {"geometry": {"type": "LineString", "coordinates": [[2157, 2594], [2160, 2579]]}, "type": 2, "properties": {"iso_3166_1": "FR-IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 595}, {"geometry": {"type": "LineString", "coordinates": [[3446, 2333], [3448, 2338], [3446, 2333]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 596}, {"geometry": {"type": "LineString", "coordinates": [[2193, 2488], [2187, 2479], [2194, 2479], [2193, 2488]]}, "type": 2, "properties": {"iso_3166_1": "IT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 597}, {"geometry": {"type": "LineString", "coordinates": [[1238, 2292], [1221, 2299]]}, "type": 2, "properties": {"iso_3166_1": "TC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 598}, {"geometry": {"type": "LineString", "coordinates": [[43, 1790], [45, 1785], [43, 1790]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 599}, {"geometry": {"type": "LineString", "coordinates": [[3705, 2611], [3701, 2615], [3694, 2608], [3669, 2630], [3651, 2634], [3653, 2604], [3642, 2598], [3630, 2567], [3639, 2563], [3657, 2571], [3659, 2582], [3679, 2571], [3689, 2588], [3709, 2594]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 600}, {"geometry": {"type": "LineString", "coordinates": [[3524, 2465], [3516, 2459], [3523, 2472], [3524, 2465]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 601}, {"geometry": {"type": "LineString", "coordinates": [[3458, 2337], [3474, 2344], [3478, 2340], [3454, 2328], [3451, 2333], [3458, 2337]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 602}, {"geometry": {"type": "LineString", "coordinates": [[3504, 2379], [3509, 2377], [3504, 2379]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 604}, {"geometry": {"type": "LineString", "coordinates": [[3493, 2357], [3487, 2358], [3489, 2364], [3508, 2370], [3526, 2392], [3530, 2383], [3515, 2373], [3506, 2355], [3493, 2357]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 605}, {"geometry": {"type": "LineString", "coordinates": [[2646, 1968], [2651, 1969], [2649, 1964], [2646, 1968]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 606}, {"geometry": {"type": "LineString", "coordinates": [[3510, 2447], [3509, 2439], [3522, 2431], [3518, 2416], [3525, 2414], [3546, 2426], [3548, 2436], [3580, 2452], [3593, 2449], [3614, 2466], [3629, 2465], [3625, 2458], [3637, 2455], [3636, 2467], [3653, 2482], [3655, 2513], [3667, 2537], [3660, 2569], [3636, 2559], [3630, 2526], [3605, 2517], [3596, 2494], [3570, 2483], [3563, 2485], [3569, 2491], [3563, 2495], [3561, 2485], [3526, 2465], [3510, 2447]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 607}, {"geometry": {"type": "LineString", "coordinates": [[3951, 1938], [3951, 1932], [3946, 1936], [3951, 1938]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 609}, {"geometry": {"type": "LineString", "coordinates": [[3541, 2338], [3542, 2333], [3541, 2338]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 610}, {"geometry": {"type": "LineString", "coordinates": [[3510, 2436], [3503, 2436], [3508, 2430], [3510, 2436]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 611}, {"geometry": {"type": "LineString", "coordinates": [[3635, 2439], [3641, 2439], [3635, 2439]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 612}, {"geometry": {"type": "LineString", "coordinates": [[3528, 2410], [3519, 2405], [3514, 2388], [3530, 2407], [3541, 2410], [3541, 2419], [3528, 2410]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 613}, {"geometry": {"type": "LineString", "coordinates": [[3651, 2373], [3649, 2368], [3651, 2373]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 614}, {"geometry": {"type": "LineString", "coordinates": [[3664, 2372], [3663, 2379], [3669, 2373], [3666, 2359], [3664, 2372]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 615}, {"geometry": {"type": "LineString", "coordinates": [[2580, 1940], [2577, 1934], [2571, 1941], [2580, 1940]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 616}, {"geometry": {"type": "LineString", "coordinates": [[2540, 1910], [2544, 1903], [2557, 1906], [2555, 1912], [2545, 1910], [2542, 1920], [2540, 1910]]}, "type": 2, "properties": {"iso_3166_1": "KM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 617}, {"geometry": {"type": "LineString", "coordinates": [[3380, 2133], [3389, 2119], [3406, 2111], [3407, 2106], [3397, 2102], [3405, 2096], [3440, 2119], [3476, 2107], [3491, 2130], [3478, 2189], [3464, 2212], [3449, 2216], [3441, 2236], [3437, 2296], [3409, 2237], [3409, 2190], [3376, 2141], [3380, 2133]]}, "type": 2, "properties": {"iso_3166_1": "PH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 618}, {"geometry": {"type": "LineString", "coordinates": [[3798, 2335], [3802, 2331], [3798, 2335]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 619}, {"geometry": {"type": "LineString", "coordinates": [[3348, 2177], [3349, 2172], [3348, 2177]]}, "type": 2, "properties": {"iso_3166_1": "PH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 620}, {"geometry": {"type": "LineString", "coordinates": [[3539, 2355], [3545, 2355], [3543, 2350], [3539, 2355]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 621}, {"geometry": {"type": "LineString", "coordinates": [[2549, 1827], [2551, 1816], [2537, 1793], [2542, 1762], [2550, 1749], [2567, 1744], [2587, 1754], [2624, 1869], [2610, 1913], [2599, 1908], [2587, 1882], [2575, 1871], [2546, 1861], [2543, 1836], [2549, 1827]]}, "type": 2, "properties": {"iso_3166_1": "MG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 622}, {"geometry": {"type": "LineString", "coordinates": [[2723, 1856], [2727, 1863], [2729, 1854], [2724, 1851], [2723, 1856]]}, "type": 2, "properties": {"iso_3166_1": "MU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 623}, {"geometry": {"type": "LineString", "coordinates": [[3638, 2444], [3635, 2450], [3640, 2451], [3638, 2444]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 624}, {"geometry": {"type": "LineString", "coordinates": [[3642, 2412], [3647, 2413], [3642, 2412]]}, "type": 2, "properties": {"iso_3166_1": "JP", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 625}, {"geometry": {"type": "LineString", "coordinates": [[3438, 2339], [3434, 2303], [3422, 2299], [3403, 2323], [3436, 2352], [3438, 2339]]}, "type": 2, "properties": {"iso_3166_1": "TW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 628}, {"geometry": {"type": "LineString", "coordinates": [[2125, 2061], [2135, 2069], [2121, 2046], [2125, 2061]]}, "type": 2, "properties": {"iso_3166_1": "ST", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 629}, {"geometry": {"type": "LineString", "coordinates": [[1221, 2299], [1216, 2289], [1210, 2289], [1169, 2305]]}, "type": 2, "properties": {"iso_3166_1": "BS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 630}, {"geometry": {"type": "LineString", "coordinates": [[1339, 2246], [1334, 2252]]}, "type": 2, "properties": {"iso_3166_1": "KN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 631}, {"geometry": {"type": "LineString", "coordinates": [[2693, 1926], [2691, 1932], [2693, 1926]]}, "type": 2, "properties": {"iso_3166_1": "MU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 632}, {"geometry": {"type": "LineString", "coordinates": [[2701, 1817], [2698, 1809], [2704, 1807], [2708, 1819], [2701, 1817]]}, "type": 2, "properties": {"iso_3166_1": "MU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 633}, {"geometry": {"type": "LineString", "coordinates": [[2770, 1816], [2772, 1821], [2766, 1821], [2770, 1816]]}, "type": 2, "properties": {"iso_3166_1": "MU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 634}, {"geometry": {"type": "LineString", "coordinates": [[3277, 2299], [3262, 2304], [3264, 2315], [3246, 2322], [3231, 2311], [3224, 2315], [3210, 2310]]}, "type": 2, "properties": {"iso_3166_1": "CN-VN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 635}, {"geometry": {"type": "LineString", "coordinates": [[2657, 1981], [2652, 1975], [2647, 1978], [2655, 1995], [2661, 1985], [2657, 1981]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 636}, {"geometry": {"type": "LineString", "coordinates": [[1336, 2243], [1337, 2241]]}, "type": 2, "properties": {"iso_3166_1": "AG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 637}, {"geometry": {"type": "LineString", "coordinates": [[1341, 2245], [1339, 2246]]}, "type": 2, "properties": {"iso_3166_1": "AG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 638}, {"geometry": {"type": "LineString", "coordinates": [[2676, 2003], [2676, 2008], [2676, 2003]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 639}, {"geometry": {"type": "LineString", "coordinates": [[2676, 1983], [2680, 1979], [2676, 1983]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 640}, {"geometry": {"type": "LineString", "coordinates": [[1221, 2299], [1223, 2304]]}, "type": 2, "properties": {"iso_3166_1": "BS-TC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 641}, {"geometry": {"type": "LineString", "coordinates": [[2686, 1997], [2678, 1991], [2674, 1999], [2681, 2007], [2686, 1997]]}, "type": 2, "properties": {"iso_3166_1": "SC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 642}, {"geometry": {"type": "LineString", "coordinates": [[2871, 2117], [2877, 2041], [2882, 2038], [2890, 2087], [2883, 2129], [2876, 2131], [2871, 2117]]}, "type": 2, "properties": {"iso_3166_1": "MV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 643}, {"geometry": {"type": "LineString", "coordinates": [[1330, 2254], [1331, 2253]]}, "type": 2, "properties": {"iso_3166_1": "NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 644}, {"geometry": {"type": "LineString", "coordinates": [[2951, 2151], [2958, 2116], [2965, 2113], [2978, 2119], [2982, 2132], [2974, 2149], [2961, 2163], [2951, 2157]]}, "type": 2, "properties": {"iso_3166_1": "LK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 645}, {"geometry": {"type": "LineString", "coordinates": [[1331, 2248], [1336, 2243]]}, "type": 2, "properties": {"iso_3166_1": "KN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 646}, {"geometry": {"type": "LineString", "coordinates": [[1343, 2242], [1349, 2245], [1345, 2255], [1341, 2244]]}, "type": 2, "properties": {"iso_3166_1": "AG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 647}, {"geometry": {"type": "LineString", "coordinates": [[1334, 2252], [1331, 2248]]}, "type": 2, "properties": {"iso_3166_1": "KN-NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 648}, {"geometry": {"type": "LineString", "coordinates": [[1337, 2241], [1341, 2245]]}, "type": 2, "properties": {"iso_3166_1": "AG-MS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 649}, {"geometry": {"type": "LineString", "coordinates": [[1337, 2241], [1343, 2242]]}, "type": 2, "properties": {"iso_3166_1": "MS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 650}, {"geometry": {"type": "LineString", "coordinates": [[2497, 1797], [2503, 1798], [2497, 1797]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 651}, {"geometry": {"type": "LineString", "coordinates": [[1152, 2315], [1130, 2328], [1145, 2342], [1146, 2368], [1158, 2373], [1174, 2364], [1184, 2345], [1202, 2333], [1223, 2304]]}, "type": 2, "properties": {"iso_3166_1": "BS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 652}, {"geometry": {"type": "LineString", "coordinates": [[1223, 2304], [1234, 2305], [1240, 2294]]}, "type": 2, "properties": {"iso_3166_1": "TC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 653}, {"geometry": {"type": "LineString", "coordinates": [[112, 1828], [119, 1826], [112, 1828]]}, "type": 2, "properties": {"iso_3166_1": "NU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 654}, {"geometry": {"type": "LineString", "coordinates": [[1353, 2212], [1352, 2204]]}, "type": 2, "properties": {"iso_3166_1": "LC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 655}, {"geometry": {"type": "LineString", "coordinates": [[1333, 2252], [1334, 2252]]}, "type": 2, "properties": {"iso_3166_1": "NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 656}, {"geometry": {"type": "LineString", "coordinates": [[3980, 1917], [3983, 1914], [3980, 1917]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 657}, {"geometry": {"type": "LineString", "coordinates": [[3982, 1910], [3987, 1911], [3982, 1910]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 658}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2204], [1346, 2192]]}, "type": 2, "properties": {"iso_3166_1": "VC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 659}, {"geometry": {"type": "LineString", "coordinates": [[1154, 2259], [1156, 2264], [1174, 2263], [1186, 2248], [1156, 2240], [1154, 2259]]}, "type": 2, "properties": {"iso_3166_1": "JM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 660}, {"geometry": {"type": "LineString", "coordinates": [[2120, 2698], [2142, 2689], [2134, 2665]]}, "type": 2, "properties": {"iso_3166_1": "DE-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 661}, {"geometry": {"type": "LineString", "coordinates": [[1371, 2195], [1374, 2201], [1368, 2203], [1371, 2195]]}, "type": 2, "properties": {"iso_3166_1": "BB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 662}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2192], [1354, 2203]]}, "type": 2, "properties": {"iso_3166_1": "VC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 663}, {"geometry": {"type": "LineString", "coordinates": [[1354, 2203], [1357, 2211]]}, "type": 2, "properties": {"iso_3166_1": "LC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 664}, {"geometry": {"type": "LineString", "coordinates": [[287, 1791], [289, 1796], [287, 1791]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 665}, {"geometry": {"type": "LineString", "coordinates": [[289, 1863], [291, 1868], [289, 1863]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 666}, {"geometry": {"type": "LineString", "coordinates": [[2870, 1967], [2873, 1961], [2870, 1967]]}, "type": 2, "properties": {"iso_3166_1": "IO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 667}, {"geometry": {"type": "LineString", "coordinates": [[1346, 2192], [1345, 2183], [1352, 2192]]}, "type": 2, "properties": {"iso_3166_1": "GD", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 668}, {"geometry": {"type": "LineString", "coordinates": [[32, 1493], [42, 1479], [50, 1482], [51, 1491], [44, 1497], [34, 1500], [32, 1493]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 669}, {"geometry": {"type": "LineString", "coordinates": [[3951, 2141], [3954, 2145], [3951, 2141]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 670}, {"geometry": {"type": "LineString", "coordinates": [[3999, 1789], [3996, 1785], [3999, 1789]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 671}, {"geometry": {"type": "LineString", "coordinates": [[11, 1671], [16, 1673], [11, 1671]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 672}, {"geometry": {"type": "LineString", "coordinates": [[14, 1683], [17, 1680], [20, 1689], [14, 1683]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 673}, {"geometry": {"type": "LineString", "coordinates": [[20, 1700], [27, 1698], [20, 1700]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 674}, {"geometry": {"type": "LineString", "coordinates": [[3939, 1424], [3947, 1421], [3945, 1427], [3939, 1424]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 675}, {"geometry": {"type": "LineString", "coordinates": [[4009, 1632], [4008, 1637], [4003, 1635], [4009, 1632]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 676}, {"geometry": {"type": "LineString", "coordinates": [[4078, 1394], [4083, 1391], [4086, 1396], [4081, 1399], [4078, 1394]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 677}, {"geometry": {"type": "LineString", "coordinates": [[4083, 1425], [4089, 1428], [4085, 1432], [4083, 1425]]}, "type": 2, "properties": {"iso_3166_1": "NZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 678}, {"geometry": {"type": "LineString", "coordinates": [[63, 1992], [64, 1997], [63, 1992]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 679}, {"geometry": {"type": "LineString", "coordinates": [[307, 1783], [312, 1784], [307, 1783]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 680}, {"geometry": {"type": "LineString", "coordinates": [[1287, 2619], [1282, 2612]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 681}, {"geometry": {"type": "LineString", "coordinates": [[259, 2065], [257, 2074], [253, 2068], [259, 2065]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 682}, {"geometry": {"type": "LineString", "coordinates": [[4014, 2087], [4013, 2080], [4019, 2086], [4014, 2087]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 683}, {"geometry": {"type": "LineString", "coordinates": [[67, 2005], [69, 2009], [67, 2005]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 684}, {"geometry": {"type": "LineString", "coordinates": [[3160, 2158], [3170, 2162]]}, "type": 2, "properties": {"iso_3166_1": "MM-TH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 685}, {"geometry": {"type": "LineString", "coordinates": [[2412, 1742], [2404, 1745], [2398, 1731], [2406, 1725], [2414, 1731]]}, "type": 2, "properties": {"iso_3166_1": "SZ-ZA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 686}, {"geometry": {"type": "LineString", "coordinates": [[294, 1856], [299, 1852], [294, 1856]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 687}, {"geometry": {"type": "LineString", "coordinates": [[4096, 1818], [4071, 1824], [4058, 1849], [4096, 1869]]}, "type": 2, "properties": {"iso_3166_1": "FJ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 688}, {"geometry": {"type": "LineString", "coordinates": [[3860, 1980], [3862, 1974], [3860, 1980]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 689}, {"geometry": {"type": "LineString", "coordinates": [[96, 2005], [97, 2010], [96, 2005]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 690}, {"geometry": {"type": "LineString", "coordinates": [[2441, 2376], [2440, 2357], [2464, 2325], [2470, 2305]]}, "type": 2, "properties": {"iso_3166_1": "EG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 691}, {"geometry": {"type": "LineString", "coordinates": [[89, 1994], [87, 1999], [89, 1994]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 692}, {"geometry": {"type": "LineString", "coordinates": [[0, 1869], [12, 1864], [18, 1851], [23, 1817], [11, 1801], [0, 1818]]}, "type": 2, "properties": {"iso_3166_1": "FJ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 693}, {"geometry": {"type": "LineString", "coordinates": [[95, 2013], [94, 2019], [95, 2013]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 694}, {"geometry": {"type": "LineString", "coordinates": [[2443, 2361], [2446, 2356], [2443, 2361]]}, "type": 2, "properties": {"iso_3166_1": "EG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 695}, {"geometry": {"type": "LineString", "coordinates": [[100, 1995], [100, 2000], [100, 1995]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 696}, {"geometry": {"type": "LineString", "coordinates": [[2438, 2429], [2445, 2448]]}, "type": 2, "properties": {"iso_3166_1": "IL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 697}, {"geometry": {"type": "LineString", "coordinates": [[3895, 2176], [3893, 2184], [3890, 2179], [3895, 2176]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 698}, {"geometry": {"type": "LineString", "coordinates": [[101, 2010], [101, 2015], [101, 2010]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 699}, {"geometry": {"type": "LineString", "coordinates": [[4033, 2036], [4042, 2029], [4029, 2044], [4033, 2036]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 700}, {"geometry": {"type": "LineString", "coordinates": [[106, 2003], [106, 2008], [106, 2003]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 701}, {"geometry": {"type": "LineString", "coordinates": [[3983, 2149], [3986, 2159], [3978, 2158], [3983, 2149]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 702}, {"geometry": {"type": "LineString", "coordinates": [[3929, 2177], [3934, 2179], [3931, 2184], [3926, 2183], [3929, 2177]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 703}, {"geometry": {"type": "LineString", "coordinates": [[2336, 2430], [2378, 2420], [2401, 2430], [2420, 2423], [2436, 2426]]}, "type": 2, "properties": {"iso_3166_1": "EG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 704}, {"geometry": {"type": "LineString", "coordinates": [[164, 1917], [168, 1914], [164, 1917]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 705}, {"geometry": {"type": "LineString", "coordinates": [[3941, 1934], [3949, 1911], [3932, 1922], [3932, 1935], [3941, 1934]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 706}, {"geometry": {"type": "LineString", "coordinates": [[223, 2099], [223, 2104], [223, 2099]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 707}, {"geometry": {"type": "LineString", "coordinates": [[1050, 2199], [1022, 2205]]}, "type": 2, "properties": {"iso_3166_1": "SV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 708}, {"geometry": {"type": "LineString", "coordinates": [[2438, 2422], [2437, 2424]]}, "type": 2, "properties": {"iso_3166_1": "EG-PS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 709}, {"geometry": {"type": "LineString", "coordinates": [[235, 2089], [237, 2095], [235, 2089]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 710}, {"geometry": {"type": "LineString", "coordinates": [[3860, 1983], [3859, 1993], [3867, 1988], [3860, 1983]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 711}, {"geometry": {"type": "LineString", "coordinates": [[274, 1981], [276, 1986], [274, 1981]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 712}, {"geometry": {"type": "LineString", "coordinates": [[3875, 1916], [3874, 1896], [3863, 1920], [3875, 1916]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 713}, {"geometry": {"type": "LineString", "coordinates": [[285, 2000], [286, 2005], [285, 2000]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 714}, {"geometry": {"type": "LineString", "coordinates": [[2436, 2426], [2438, 2429]]}, "type": 2, "properties": {"iso_3166_1": "PS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 715}, {"geometry": {"type": "LineString", "coordinates": [[3900, 1954], [3901, 1949], [3900, 1954]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 716}, {"geometry": {"type": "LineString", "coordinates": [[321, 1915], [321, 1920], [321, 1915]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 717}, {"geometry": {"type": "LineString", "coordinates": [[4022, 2048], [4029, 2050], [4027, 2056], [4019, 2053], [4022, 2048]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 718}, {"geometry": {"type": "LineString", "coordinates": [[2024, 2697], [2025, 2687], [2019, 2693]]}, "type": 2, "properties": {"iso_3166_1": "FR-JE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 719}, {"geometry": {"type": "LineString", "coordinates": [[2870, 1990], [2872, 1985], [2865, 1983], [2863, 1990], [2870, 1990]]}, "type": 2, "properties": {"iso_3166_1": "IO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 720}, {"geometry": {"type": "LineString", "coordinates": [[339, 1931], [338, 1937], [339, 1931]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 721}, {"geometry": {"type": "LineString", "coordinates": [[3825, 1975], [3877, 1960], [3898, 1922], [3837, 1946], [3815, 1967]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 722}, {"geometry": {"type": "LineString", "coordinates": [[3977, 2036], [3977, 2041], [3977, 2036]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 723}, {"geometry": {"type": "LineString", "coordinates": [[4014, 2067], [4017, 2055], [4021, 2073], [4013, 2072], [4014, 2067]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 724}, {"geometry": {"type": "LineString", "coordinates": [[240, 1822], [239, 1827], [240, 1822]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 725}, {"geometry": {"type": "LineString", "coordinates": [[3956, 2145], [3955, 2157], [3944, 2156], [3956, 2145]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 726}, {"geometry": {"type": "LineString", "coordinates": [[4046, 2024], [4044, 2030], [4046, 2024]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 728}, {"geometry": {"type": "LineString", "coordinates": [[3968, 1905], [3970, 1909], [3968, 1905]]}, "type": 2, "properties": {"iso_3166_1": "SB", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 729}, {"geometry": {"type": "LineString", "coordinates": [[4050, 2017], [4050, 2022], [4050, 2017]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 731}, {"geometry": {"type": "LineString", "coordinates": [[4053, 2033], [4048, 2035], [4058, 2031], [4053, 2033]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 732}, {"geometry": {"type": "LineString", "coordinates": [[97, 1884], [80, 1894], [97, 1891], [97, 1884]]}, "type": 2, "properties": {"iso_3166_1": "WS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 733}, {"geometry": {"type": "LineString", "coordinates": [[2856, 1975], [2861, 1970], [2864, 1978], [2856, 1975]]}, "type": 2, "properties": {"iso_3166_1": "IO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 734}, {"geometry": {"type": "LineString", "coordinates": [[4060, 2015], [4058, 2020], [4060, 2015]]}, "type": 2, "properties": {"iso_3166_1": "KI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 735}, {"geometry": {"type": "LineString", "coordinates": [[3880, 2157], [3882, 2161], [3875, 2162], [3880, 2157]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 736}, {"geometry": {"type": "LineString", "coordinates": [[2510, 1786], [2504, 1787], [2510, 1786]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 737}, {"geometry": {"type": "LineString", "coordinates": [[3934, 2148], [3929, 2155], [3934, 2148]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 738}, {"geometry": {"type": "LineString", "coordinates": [[3937, 2160], [3935, 2167], [3937, 2160]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 739}, {"geometry": {"type": "LineString", "coordinates": [[189, 1841], [194, 1838], [189, 1841]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 740}, {"geometry": {"type": "LineString", "coordinates": [[3939, 2148], [3939, 2153], [3939, 2148]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 741}, {"geometry": {"type": "LineString", "coordinates": [[3942, 2173], [3956, 2179], [3943, 2182], [3938, 2177], [3942, 2173]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 742}, {"geometry": {"type": "LineString", "coordinates": [[3210, 2122], [3211, 2133], [3181, 2169], [3188, 2190], [3206, 2190], [3216, 2178]]}, "type": 2, "properties": {"iso_3166_1": "TH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 743}, {"geometry": {"type": "LineString", "coordinates": [[3210, 2310], [3203, 2308], [3207, 2295], [3199, 2299]]}, "type": 2, "properties": {"iso_3166_1": "CN-LA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 744}, {"geometry": {"type": "LineString", "coordinates": [[332, 1844], [337, 1843], [332, 1844]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 745}, {"geometry": {"type": "LineString", "coordinates": [[3160, 2158], [3157, 2144], [3164, 2156], [3164, 2132], [3171, 2133], [3180, 2120]]}, "type": 2, "properties": {"iso_3166_1": "TH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 746}, {"geometry": {"type": "LineString", "coordinates": [[3712, 2136], [3705, 2136], [3710, 2130], [3716, 2133], [3712, 2136]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 747}, {"geometry": {"type": "LineString", "coordinates": [[3961, 2109], [3960, 2115], [3961, 2109]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 749}, {"geometry": {"type": "LineString", "coordinates": [[3198, 2080], [3187, 2115], [3180, 2120]]}, "type": 2, "properties": {"iso_3166_1": "MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 750}, {"geometry": {"type": "LineString", "coordinates": [[0, 1938], [0, 1943]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 751}, {"geometry": {"type": "LineString", "coordinates": [[3967, 2098], [3969, 2104], [3967, 2098]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 752}, {"geometry": {"type": "LineString", "coordinates": [[1327, 2257], [1326, 2266], [1334, 2258]]}, "type": 2, "properties": {"iso_3166_1": "AI", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 753}, {"geometry": {"type": "LineString", "coordinates": [[3978, 2165], [3969, 2160], [3975, 2158], [3984, 2168], [3978, 2165]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 754}, {"geometry": {"type": "LineString", "coordinates": [[194, 1893], [189, 1894], [191, 1899], [194, 1893]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 755}, {"geometry": {"type": "LineString", "coordinates": [[1334, 2258], [1327, 2257]]}, "type": 2, "properties": {"iso_3166_1": "AI-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 756}, {"geometry": {"type": "LineString", "coordinates": [[3970, 2213], [3971, 2219], [3970, 2213]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 757}, {"geometry": {"type": "LineString", "coordinates": [[3978, 2112], [3981, 2117], [3974, 2122], [3978, 2112]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 758}, {"geometry": {"type": "LineString", "coordinates": [[3346, 2101], [3331, 2087], [3312, 2083], [3308, 2070], [3296, 2072]]}, "type": 2, "properties": {"iso_3166_1": "MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 759}, {"geometry": {"type": "LineString", "coordinates": [[3210, 2122], [3230, 2104], [3227, 2082], [3239, 2078], [3234, 2072], [3237, 2065]]}, "type": 2, "properties": {"iso_3166_1": "MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 760}, {"geometry": {"type": "LineString", "coordinates": [[2178, 2884], [2169, 2879]]}, "type": 2, "properties": {"iso_3166_1": "NO-SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 761}, {"geometry": {"type": "LineString", "coordinates": [[3972, 2110], [3973, 2115], [3972, 2110]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 762}, {"geometry": {"type": "LineString", "coordinates": [[3394, 2095], [3407, 2109], [3389, 2119], [3381, 2134], [3358, 2104]]}, "type": 2, "properties": {"iso_3166_1": "MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 763}, {"geometry": {"type": "LineString", "coordinates": [[2276, 2584], [2280, 2588]]}, "type": 2, "properties": {"iso_3166_1": "ME-XK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 764}, {"geometry": {"type": "LineString", "coordinates": [[3983, 2185], [3984, 2191], [3983, 2185]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 765}, {"geometry": {"type": "LineString", "coordinates": [[3998, 2127], [4007, 2129], [3992, 2132], [3998, 2127]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 766}, {"geometry": {"type": "LineString", "coordinates": [[3978, 2173], [3981, 2180], [3975, 2177], [3978, 2173]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 767}, {"geometry": {"type": "LineString", "coordinates": [[3941, 1882], [3941, 1900], [3956, 1898], [3969, 1844], [3987, 1823], [3982, 1811], [3977, 1811], [3943, 1867], [3941, 1882]]}, "type": 2, "properties": {"iso_3166_1": "VU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 768}, {"geometry": {"type": "LineString", "coordinates": [[2340, 3431], [2330, 3427], [2322, 3433], [2324, 3447], [2337, 3460], [2348, 3451], [2340, 3431]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 769}, {"geometry": {"type": "LineString", "coordinates": [[3992, 2163], [3992, 2168], [3992, 2163]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 770}, {"geometry": {"type": "LineString", "coordinates": [[3992, 2145], [3997, 2139], [3999, 2148], [3990, 2152], [3992, 2145]]}, "type": 2, "properties": {"iso_3166_1": "MH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 771}, {"geometry": {"type": "LineString", "coordinates": [[3612, 2140], [3614, 2148], [3612, 2140]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 772}, {"geometry": {"type": "LineString", "coordinates": [[3616, 2156], [3623, 2158], [3616, 2156]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 773}, {"geometry": {"type": "LineString", "coordinates": [[214, 1931], [216, 1936], [219, 1928], [214, 1931]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 774}, {"geometry": {"type": "LineString", "coordinates": [[3637, 2158], [3642, 2162], [3638, 2166], [3637, 2158]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 775}, {"geometry": {"type": "LineString", "coordinates": [[233, 1829], [227, 1829], [233, 1829]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 776}, {"geometry": {"type": "LineString", "coordinates": [[249, 1793], [254, 1791], [249, 1793]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 777}, {"geometry": {"type": "LineString", "coordinates": [[3646, 2138], [3644, 2143], [3646, 2138]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 778}, {"geometry": {"type": "LineString", "coordinates": [[228, 1803], [232, 1799], [228, 1803]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 779}, {"geometry": {"type": "LineString", "coordinates": [[3647, 2157], [3647, 2162], [3647, 2157]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 780}, {"geometry": {"type": "LineString", "coordinates": [[254, 1946], [247, 1945], [254, 1946]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 781}, {"geometry": {"type": "LineString", "coordinates": [[3717, 2138], [3718, 2143], [3717, 2138]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 782}, {"geometry": {"type": "LineString", "coordinates": [[3575, 2127], [3580, 2137], [3575, 2127]]}, "type": 2, "properties": {"iso_3166_1": "PW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 783}, {"geometry": {"type": "LineString", "coordinates": [[3692, 2128], [3691, 2133], [3692, 2128]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 785}, {"geometry": {"type": "LineString", "coordinates": [[3676, 2122], [3675, 2127], [3676, 2122]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 786}, {"geometry": {"type": "LineString", "coordinates": [[3685, 2129], [3686, 2134], [3685, 2129]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 788}, {"geometry": {"type": "LineString", "coordinates": [[251, 1817], [256, 1816], [249, 1813], [245, 1818], [251, 1817]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 790}, {"geometry": {"type": "LineString", "coordinates": [[2133, 2599], [2134, 2599]]}, "type": 2, "properties": {"iso_3166_1": "MC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 792}, {"geometry": {"type": "LineString", "coordinates": [[3692, 2144], [3692, 2149], [3692, 2144]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 793}, {"geometry": {"type": "LineString", "coordinates": [[93, 1946], [94, 1940], [93, 1946]]}, "type": 2, "properties": {"iso_3166_1": "TK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 794}, {"geometry": {"type": "LineString", "coordinates": [[3702, 2151], [3702, 2156], [3702, 2151]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 795}, {"geometry": {"type": "LineString", "coordinates": [[3745, 2130], [3749, 2137], [3745, 2130]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 796}, {"geometry": {"type": "LineString", "coordinates": [[2027, 2600], [1958, 2606], [1939, 2593], [1944, 2573]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 797}, {"geometry": {"type": "LineString", "coordinates": [[1964, 2501], [1979, 2487]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 798}, {"geometry": {"type": "LineString", "coordinates": [[255, 1815], [259, 1811], [255, 1815]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 799}, {"geometry": {"type": "LineString", "coordinates": [[83, 1950], [88, 1951], [83, 1950]]}, "type": 2, "properties": {"iso_3166_1": "TK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 800}, {"geometry": {"type": "LineString", "coordinates": [[3721, 2130], [3721, 2135], [3721, 2130]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 801}, {"geometry": {"type": "LineString", "coordinates": [[3775, 2142], [3783, 2150], [3774, 2149], [3775, 2142]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 802}, {"geometry": {"type": "LineString", "coordinates": [[3728, 2138], [3728, 2143], [3728, 2138]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 803}, {"geometry": {"type": "LineString", "coordinates": [[1123, 2269], [1119, 2273], [1127, 2274], [1123, 2269]]}, "type": 2, "properties": {"iso_3166_1": "KY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 804}, {"geometry": {"type": "LineString", "coordinates": [[3747, 2122], [3747, 2127], [3747, 2122]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 805}, {"geometry": {"type": "LineString", "coordinates": [[3769, 2132], [3780, 2127], [3777, 2138], [3769, 2132]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 806}, {"geometry": {"type": "LineString", "coordinates": [[1839, 2377], [1847, 2378], [1844, 2373], [1839, 2377]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 807}, {"geometry": {"type": "LineString", "coordinates": [[1841, 2390], [1846, 2394], [1847, 2384], [1841, 2390]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 808}, {"geometry": {"type": "LineString", "coordinates": [[3751, 2144], [3752, 2149], [3751, 2144]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 809}, {"geometry": {"type": "LineString", "coordinates": [[3759, 2144], [3755, 2153], [3759, 2144]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 810}, {"geometry": {"type": "LineString", "coordinates": [[1135, 2278], [1143, 2276], [1135, 2278]]}, "type": 2, "properties": {"iso_3166_1": "KY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 811}, {"geometry": {"type": "LineString", "coordinates": [[332, 1856], [324, 1850], [318, 1862], [332, 1856]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 812}, {"geometry": {"type": "LineString", "coordinates": [[1735, 1263], [1739, 1251], [1748, 1250], [1743, 1264], [1735, 1263]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 813}, {"geometry": {"type": "LineString", "coordinates": [[3785, 2124], [3783, 2130], [3785, 2124]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 814}, {"geometry": {"type": "LineString", "coordinates": [[3790, 2113], [3790, 2118], [3790, 2113]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 816}, {"geometry": {"type": "LineString", "coordinates": [[2439, 2101], [2452, 2101]]}, "type": 2, "properties": {"iso_3166_1": "KE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 818}, {"geometry": {"type": "LineString", "coordinates": [[1865, 2379], [1868, 2385], [1876, 2379], [1872, 2374], [1865, 2379]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 819}, {"geometry": {"type": "LineString", "coordinates": [[1371, 1336], [1378, 1338], [1376, 1332], [1371, 1336]]}, "type": 2, "properties": {"iso_3166_1": "FK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 820}, {"geometry": {"type": "LineString", "coordinates": [[3796, 2106], [3800, 2112], [3794, 2114], [3796, 2106]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 821}, {"geometry": {"type": "LineString", "coordinates": [[3804, 2138], [3805, 2143], [3804, 2138]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 822}, {"geometry": {"type": "LineString", "coordinates": [[98, 1943], [101, 1938], [98, 1943]]}, "type": 2, "properties": {"iso_3166_1": "TK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 823}, {"geometry": {"type": "LineString", "coordinates": [[1392, 1367], [1394, 1356], [1378, 1341], [1352, 1347], [1346, 1355], [1348, 1375], [1392, 1367]]}, "type": 2, "properties": {"iso_3166_1": "FK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 824}, {"geometry": {"type": "LineString", "coordinates": [[2058, 2531], [2062, 2523], [2069, 2525], [2068, 2534], [2058, 2531]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 825}, {"geometry": {"type": "LineString", "coordinates": [[3809, 2057], [3809, 2063], [3809, 2057]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 826}, {"geometry": {"type": "LineString", "coordinates": [[1880, 2382], [1896, 2404], [1899, 2396], [1892, 2382], [1880, 2382]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 828}, {"geometry": {"type": "LineString", "coordinates": [[3811, 2089], [3809, 2094], [3811, 2089]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 830}, {"geometry": {"type": "LineString", "coordinates": [[2012, 2484], [2015, 2489], [2012, 2484]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 831}, {"geometry": {"type": "LineString", "coordinates": [[3816, 2130], [3818, 2137], [3812, 2137], [3816, 2130]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 832}, {"geometry": {"type": "LineString", "coordinates": [[3838, 2112], [3838, 2117], [3838, 2112]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 833}, {"geometry": {"type": "LineString", "coordinates": [[3843, 2126], [3852, 2125], [3850, 2131], [3842, 2131], [3843, 2126]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 834}, {"geometry": {"type": "LineString", "coordinates": [[3866, 2122], [3866, 2127], [3866, 2122]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 835}, {"geometry": {"type": "LineString", "coordinates": [[47, 1869], [52, 1867], [47, 1869]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 836}, {"geometry": {"type": "LineString", "coordinates": [[538, 2788], [530, 2787], [531, 2771], [560, 2739], [551, 2770], [554, 2786], [538, 2788]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 837}, {"geometry": {"type": "LineString", "coordinates": [[1368, 2610], [1368, 2602], [1361, 2604], [1368, 2610]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 838}, {"geometry": {"type": "LineString", "coordinates": [[1151, 2065], [1167, 2052], [1192, 2047]]}, "type": 2, "properties": {"iso_3166_1": "CO-EC", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 839}, {"geometry": {"type": "LineString", "coordinates": [[3876, 2116], [3878, 2121], [3876, 2116]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 840}, {"geometry": {"type": "LineString", "coordinates": [[1366, 3801], [1367, 3824], [1340, 3865], [1258, 3899], [1204, 3902], [1168, 3896], [1130, 3881], [1082, 3850], [1059, 3833], [1047, 3812], [1006, 3790], [963, 3740], [938, 3671], [889, 3646], [840, 3607], [739, 3542], [718, 3505], [685, 3489], [641, 3438], [642, 3409], [617, 3343], [626, 3308], [611, 3258], [583, 3205], [530, 3172], [519, 3179], [504, 3173], [494, 3160], [477, 3162], [468, 3174], [447, 3174]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 841}, {"geometry": {"type": "LineString", "coordinates": [[553, 2794], [558, 2769], [590, 2730], [576, 2720], [626, 2681]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 842}, {"geometry": {"type": "LineString", "coordinates": [[2017, 2481], [1996, 2479], [1991, 2485]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 843}, {"geometry": {"type": "LineString", "coordinates": [[1412, 2649], [1429, 2659], [1428, 2651], [1446, 2647], [1453, 2664], [1448, 2684], [1442, 2687], [1440, 2701], [1432, 2706], [1418, 2702], [1417, 2713], [1411, 2714], [1420, 2718], [1423, 2743], [1416, 2776], [1402, 2782], [1404, 2798], [1394, 2798], [1362, 2821], [1354, 2855], [1325, 2900], [1316, 2936], [1328, 2976], [1320, 3010], [1346, 3045], [1356, 3079], [1296, 3136], [1289, 3181], [1274, 3205], [1247, 3223], [1238, 3237], [1216, 3246], [1175, 3313], [1161, 3322], [1145, 3321], [1144, 3349], [1154, 3362], [1160, 3416], [1173, 3446], [1169, 3482], [1194, 3508], [1205, 3531]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 844}, {"geometry": {"type": "LineString", "coordinates": [[13, 1768], [7, 1767], [12, 1774], [13, 1768]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 845}, {"geometry": {"type": "LineString", "coordinates": [[1285, 2611], [1292, 2614], [1294, 2599], [1303, 2594], [1321, 2611], [1369, 2635], [1365, 2655], [1373, 2662], [1405, 2661]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 846}, {"geometry": {"type": "LineString", "coordinates": [[3899, 2108], [3905, 2107], [3899, 2108]]}, "type": 2, "properties": {"iso_3166_1": "FM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 847}, {"geometry": {"type": "LineString", "coordinates": [[2258, 2584], [2259, 2582]]}, "type": 2, "properties": {"iso_3166_1": "HR-ME", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 848}, {"geometry": {"type": "LineString", "coordinates": [[3947, 2039], [3948, 2045], [3947, 2039]]}, "type": 2, "properties": {"iso_3166_1": "NR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 849}, {"geometry": {"type": "LineString", "coordinates": [[3547, 2079], [3548, 2083], [3547, 2079]]}, "type": 2, "properties": {"iso_3166_1": "PW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 851}, {"geometry": {"type": "LineString", "coordinates": [[52, 1811], [52, 1806], [52, 1811]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 852}, {"geometry": {"type": "LineString", "coordinates": [[1991, 2485], [1992, 2491], [2024, 2495], [2043, 2509], [2054, 2526], [2049, 2539], [2060, 2543], [2055, 2549], [2086, 2571], [2087, 2582]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 853}, {"geometry": {"type": "LineString", "coordinates": [[55, 1798], [50, 1802], [58, 1806], [60, 1797], [55, 1798]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 854}, {"geometry": {"type": "LineString", "coordinates": [[2258, 2579], [2259, 2582]]}, "type": 2, "properties": {"iso_3166_1": "HR-ME", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 855}, {"geometry": {"type": "LineString", "coordinates": [[1848, 2382], [1867, 2388], [1861, 2378], [1848, 2382]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 856}, {"geometry": {"type": "LineString", "coordinates": [[2071, 2540], [2084, 2530], [2100, 2544], [2094, 2550], [2071, 2540]]}, "type": 2, "properties": {"iso_3166_1": "ES", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 857}, {"geometry": {"type": "LineString", "coordinates": [[62, 1840], [69, 1837], [62, 1840]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 858}, {"geometry": {"type": "LineString", "coordinates": [[1134, 2009], [1133, 1997], [1149, 1991], [1157, 2010], [1188, 2030], [1192, 2047]]}, "type": 2, "properties": {"iso_3166_1": "EC-PE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 859}, {"geometry": {"type": "LineString", "coordinates": [[439, 1825], [442, 1828], [439, 1825]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 860}, {"geometry": {"type": "LineString", "coordinates": [[67, 1835], [69, 1827], [64, 1830], [67, 1835]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 861}, {"geometry": {"type": "LineString", "coordinates": [[2014, 2695], [1988, 2684], [1987, 2672], [2018, 2656], [2018, 2648], [2027, 2641], [2032, 2630], [2027, 2600]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 863}, {"geometry": {"type": "LineString", "coordinates": [[2158, 2567], [2160, 2579]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 864}, {"geometry": {"type": "LineString", "coordinates": [[1882, 1959], [1884, 1954], [1888, 1958], [1882, 1959]]}, "type": 2, "properties": {"iso_3166_1": "SH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 865}, {"geometry": {"type": "LineString", "coordinates": [[73, 1864], [68, 1865], [73, 1864]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 866}, {"geometry": {"type": "LineString", "coordinates": [[64, 1813], [59, 1807], [54, 1821], [66, 1822], [64, 1813]]}, "type": 2, "properties": {"iso_3166_1": "TO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 867}, {"geometry": {"type": "LineString", "coordinates": [[1901, 1589], [1906, 1585], [1912, 1593], [1906, 1596], [1901, 1589]]}, "type": 2, "properties": {"iso_3166_1": "SH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 868}, {"geometry": {"type": "LineString", "coordinates": [[1334, 2258], [1333, 2252]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 869}, {"geometry": {"type": "LineString", "coordinates": [[1634, 1295], [1645, 1299], [1638, 1312], [1622, 1320], [1609, 1318], [1634, 1295]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 870}, {"geometry": {"type": "LineString", "coordinates": [[1931, 1548], [1939, 1545], [1931, 1548]]}, "type": 2, "properties": {"iso_3166_1": "SH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 871}, {"geometry": {"type": "LineString", "coordinates": [[1919, 2190], [1927, 2184], [1944, 2191], [1957, 2164]]}, "type": 2, "properties": {"iso_3166_1": "GN-ML", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 872}, {"geometry": {"type": "LineString", "coordinates": [[1980, 1862], [1985, 1867], [1980, 1862]]}, "type": 2, "properties": {"iso_3166_1": "SH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 873}, {"geometry": {"type": "LineString", "coordinates": [[3060, 2374], [3060, 2371]]}, "type": 2, "properties": {"iso_3166_1": "BT-CN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 874}, {"geometry": {"type": "LineString", "coordinates": [[1569, 1320], [1574, 1318], [1576, 1324], [1569, 1320]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 875}, {"geometry": {"type": "LineString", "coordinates": [[1427, 1747], [1430, 1767], [1417, 1768], [1413, 1788], [1388, 1790], [1386, 1814]]}, "type": 2, "properties": {"iso_3166_1": "BR-PY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 876}, {"geometry": {"type": "LineString", "coordinates": [[1327, 2257], [1327, 2256]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 877}, {"geometry": {"type": "LineString", "coordinates": [[1330, 2254], [1331, 2253]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 878}, {"geometry": {"type": "LineString", "coordinates": [[466, 1804], [464, 1809], [466, 1804]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 879}, {"geometry": {"type": "LineString", "coordinates": [[1866, 2297], [1854, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 880}, {"geometry": {"type": "LineString", "coordinates": [[1724, 1259], [1731, 1258], [1731, 1264], [1724, 1259]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 881}, {"geometry": {"type": "LineString", "coordinates": [[2421, 2468], [2424, 2468]]}, "type": 2, "properties": {"iso_3166_1": "", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 882}, {"geometry": {"type": "LineString", "coordinates": [[2157, 2594], [2142, 2582], [2149, 2564]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 883}, {"geometry": {"type": "LineString", "coordinates": [[318, 1859], [313, 1858], [318, 1859]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 884}, {"geometry": {"type": "LineString", "coordinates": [[1730, 1271], [1733, 1265], [1739, 1268], [1736, 1274], [1730, 1271]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 885}, {"geometry": {"type": "LineString", "coordinates": [[1435, 2116], [1461, 2100]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 886}, {"geometry": {"type": "LineString", "coordinates": [[1732, 1204], [1736, 1197], [1744, 1201], [1741, 1207], [1732, 1204]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 887}, {"geometry": {"type": "LineString", "coordinates": [[1307, 2437], [1315, 2438], [1310, 2433], [1307, 2437]]}, "type": 2, "properties": {"iso_3166_1": "BM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 888}, {"geometry": {"type": "LineString", "coordinates": [[323, 1786], [329, 1785], [323, 1786]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 889}, {"geometry": {"type": "LineString", "coordinates": [[1740, 1213], [1743, 1206], [1751, 1211], [1747, 1216], [1740, 1213]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 890}, {"geometry": {"type": "LineString", "coordinates": [[1743, 1241], [1743, 1235], [1752, 1236], [1749, 1243], [1743, 1241]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 891}, {"geometry": {"type": "LineString", "coordinates": [[1743, 1227], [1745, 1220], [1753, 1220], [1752, 1229], [1743, 1227]]}, "type": 2, "properties": {"iso_3166_1": "GS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 892}, {"geometry": {"type": "LineString", "coordinates": [[4096, 1938], [4075, 1959], [4096, 1943]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 895}, {"geometry": {"type": "LineString", "coordinates": [[159, 1925], [164, 1924], [159, 1925]]}, "type": 2, "properties": {"iso_3166_1": "CK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 896}, {"geometry": {"type": "LineString", "coordinates": [[4054, 1982], [4049, 1985], [4054, 1982]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 897}, {"geometry": {"type": "LineString", "coordinates": [[4056, 1976], [4052, 1978], [4056, 1976]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 898}, {"geometry": {"type": "LineString", "coordinates": [[1366, 3801], [1414, 3821], [1533, 3904], [1639, 3939], [1695, 3943], [1746, 3929], [1931, 3758], [1939, 3726], [1866, 3632], [1861, 3522], [1864, 3360], [1823, 3277], [1818, 3179], [1796, 3148], [1757, 3120], [1689, 3103], [1656, 3056], [1626, 3036], [1607, 3036], [1597, 3019], [1593, 2991], [1577, 2966], [1564, 2901], [1542, 2896], [1496, 2915], [1448, 3006], [1431, 3060], [1383, 3355], [1366, 3393], [1344, 3405], [1267, 3406], [1207, 3442], [1205, 3531]]}, "type": 2, "properties": {"iso_3166_1": "GL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 899}, {"geometry": {"type": "LineString", "coordinates": [[344, 1774], [351, 1775], [344, 1774]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 900}, {"geometry": {"type": "LineString", "coordinates": [[1236, 2184], [1221, 2173], [1213, 2153], [1220, 2152], [1228, 2128], [1250, 2128], [1259, 2117], [1281, 2119], [1276, 2100], [1282, 2086], [1276, 2080], [1284, 2075], [1287, 2062]]}, "type": 2, "properties": {"iso_3166_1": "CO-VE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 901}, {"geometry": {"type": "LineString", "coordinates": [[4064, 1977], [4068, 1980], [4064, 1977]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 902}, {"geometry": {"type": "LineString", "coordinates": [[1236, 2184], [1241, 2185], [1239, 2192]]}, "type": 2, "properties": {"iso_3166_1": "CO-VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 903}, {"geometry": {"type": "LineString", "coordinates": [[4065, 1968], [4063, 1963], [4065, 1968]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 904}, {"geometry": {"type": "LineString", "coordinates": [[4081, 1965], [4081, 1960], [4081, 1965]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 905}, {"geometry": {"type": "LineString", "coordinates": [[1897, 2151], [1906, 2161], [1921, 2162], [1926, 2143], [1931, 2145]]}, "type": 2, "properties": {"iso_3166_1": "GN-SL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 906}, {"geometry": {"type": "LineString", "coordinates": [[4091, 1927], [4089, 1922], [4091, 1927]]}, "type": 2, "properties": {"iso_3166_1": "TV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 907}, {"geometry": {"type": "LineString", "coordinates": [[2446, 1915], [2439, 1908], [2441, 1895], [2457, 1877], [2450, 1850], [2439, 1861], [2441, 1880], [2431, 1880], [2426, 1887]]}, "type": 2, "properties": {"iso_3166_1": "MW-MZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 908}, {"geometry": {"type": "LineString", "coordinates": [[1350, 2221], [1353, 2212]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 909}, {"geometry": {"type": "LineString", "coordinates": [[1412, 2649], [1403, 2651], [1405, 2661]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 910}, {"geometry": {"type": "LineString", "coordinates": [[19, 1883], [20, 1887], [25, 1882], [19, 1883]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 911}, {"geometry": {"type": "LineString", "coordinates": [[2062, 2722], [2062, 2712], [2045, 2698], [2025, 2705]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 912}, {"geometry": {"type": "LineString", "coordinates": [[2075, 2730], [2069, 2728]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 913}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2222], [1357, 2211]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 914}, {"geometry": {"type": "LineString", "coordinates": [[1866, 2297], [1855, 2297], [1854, 2290]]}, "type": 2, "properties": {"iso_3166_1": "MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 915}, {"geometry": {"type": "LineString", "coordinates": [[2087, 2582], [2086, 2591], [2094, 2596], [2121, 2588], [2133, 2599]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 916}, {"geometry": {"type": "LineString", "coordinates": [[46, 1898], [42, 1892], [41, 1898], [46, 1898]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 917}, {"geometry": {"type": "LineString", "coordinates": [[286, 1860], [290, 1855], [286, 1860]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 918}, {"geometry": {"type": "LineString", "coordinates": [[349, 1852], [344, 1851], [349, 1852]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 919}, {"geometry": {"type": "LineString", "coordinates": [[359, 1866], [364, 1865], [359, 1866]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 920}, {"geometry": {"type": "LineString", "coordinates": [[1867, 2297], [1866, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 921}, {"geometry": {"type": "LineString", "coordinates": [[1869, 2297], [1868, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 922}, {"geometry": {"type": "LineString", "coordinates": [[1875, 2297], [1874, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 923}, {"geometry": {"type": "LineString", "coordinates": [[1915, 2355], [1911, 2355]]}, "type": 2, "properties": {"iso_3166_1": "MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 924}, {"geometry": {"type": "LineString", "coordinates": [[361, 1841], [366, 1842], [361, 1841]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 925}, {"geometry": {"type": "LineString", "coordinates": [[420, 1839], [420, 1844], [420, 1839]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 926}, {"geometry": {"type": "LineString", "coordinates": [[2378, 2159], [2366, 2158]]}, "type": 2, "properties": {"iso_3166_1": "SD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 927}, {"geometry": {"type": "LineString", "coordinates": [[2943, 2430], [2944, 2431]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 928}, {"geometry": {"type": "LineString", "coordinates": [[346, 1848], [353, 1839], [342, 1842], [341, 1848], [346, 1848]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 929}, {"geometry": {"type": "LineString", "coordinates": [[1247, 1836], [1245, 1836]]}, "type": 2, "properties": {"iso_3166_1": "CL-PE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 930}, {"geometry": {"type": "LineString", "coordinates": [[368, 1765], [366, 1771], [371, 1770], [368, 1765]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 931}, {"geometry": {"type": "LineString", "coordinates": [[375, 1870], [354, 1878], [385, 1874], [393, 1864], [389, 1870], [395, 1872], [400, 1865], [405, 1868], [403, 1861], [418, 1863], [426, 1854], [421, 1847], [411, 1854], [405, 1847], [387, 1861], [381, 1859], [375, 1870]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 932}, {"geometry": {"type": "LineString", "coordinates": [[2117, 2720], [2116, 2740], [2126, 2742], [2124, 2755], [2130, 2766]]}, "type": 2, "properties": {"iso_3166_1": "DE-NL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 934}, {"geometry": {"type": "LineString", "coordinates": [[389, 1847], [396, 1845], [389, 1847]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 935}, {"geometry": {"type": "LineString", "coordinates": [[397, 1815], [400, 1820], [397, 1815]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 936}, {"geometry": {"type": "LineString", "coordinates": [[380, 1882], [391, 1883], [383, 1878], [380, 1882]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 937}, {"geometry": {"type": "LineString", "coordinates": [[393, 1880], [402, 1883], [395, 1876], [393, 1880]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 940}, {"geometry": {"type": "LineString", "coordinates": [[2323, 3041], [2323, 3053]]}, "type": 2, "properties": {"iso_3166_1": "FI-SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 941}, {"geometry": {"type": "LineString", "coordinates": [[1353, 2212], [1357, 2211]]}, "type": 2, "properties": {"iso_3166_1": "FR-LC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 942}, {"geometry": {"type": "LineString", "coordinates": [[402, 1874], [405, 1878], [402, 1874]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 943}, {"geometry": {"type": "LineString", "coordinates": [[403, 1721], [409, 1721], [403, 1721]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 944}, {"geometry": {"type": "LineString", "coordinates": [[413, 1845], [418, 1847], [413, 1845]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 945}, {"geometry": {"type": "LineString", "coordinates": [[436, 1846], [439, 1850], [436, 1846]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 946}, {"geometry": {"type": "LineString", "coordinates": [[3236, 2167], [3227, 2166], [3220, 2156]]}, "type": 2, "properties": {"iso_3166_1": "KH-VN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 947}, {"geometry": {"type": "LineString", "coordinates": [[404, 1855], [394, 1863], [404, 1855]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 948}, {"geometry": {"type": "LineString", "coordinates": [[3219, 2181], [3212, 2204], [3222, 2213], [3245, 2213]]}, "type": 2, "properties": {"iso_3166_1": "KH-TH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 949}, {"geometry": {"type": "LineString", "coordinates": [[419, 1805], [414, 1813], [422, 1809], [419, 1805]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 950}, {"geometry": {"type": "LineString", "coordinates": [[422, 1845], [428, 1849], [428, 1842], [422, 1845]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 952}, {"geometry": {"type": "LineString", "coordinates": [[4003, 1787], [4008, 1785], [4003, 1787]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 953}, {"geometry": {"type": "LineString", "coordinates": [[435, 1828], [433, 1834], [435, 1828]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 954}, {"geometry": {"type": "LineString", "coordinates": [[431, 1853], [436, 1854], [431, 1853]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 955}, {"geometry": {"type": "LineString", "coordinates": [[426, 1840], [430, 1843], [433, 1835], [426, 1840]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 956}, {"geometry": {"type": "LineString", "coordinates": [[2307, 2788], [2316, 2780]]}, "type": 2, "properties": {"iso_3166_1": "LT-PL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 957}, {"geometry": {"type": "LineString", "coordinates": [[427, 1867], [433, 1868], [428, 1858], [427, 1867]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 958}, {"geometry": {"type": "LineString", "coordinates": [[3245, 2213], [3255, 2208], [3257, 2215], [3272, 2217]]}, "type": 2, "properties": {"iso_3166_1": "KH-LA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 959}, {"geometry": {"type": "LineString", "coordinates": [[439, 1883], [442, 1888], [439, 1883]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 960}, {"geometry": {"type": "LineString", "coordinates": [[443, 1865], [448, 1867], [443, 1865]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 961}, {"geometry": {"type": "LineString", "coordinates": [[443, 1842], [450, 1844], [449, 1833], [441, 1836], [443, 1842]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 962}, {"geometry": {"type": "LineString", "coordinates": [[445, 1794], [450, 1798], [445, 1794]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 963}, {"geometry": {"type": "LineString", "coordinates": [[445, 1824], [449, 1828], [445, 1824]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 964}, {"geometry": {"type": "LineString", "coordinates": [[448, 1821], [453, 1819], [448, 1821]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 965}, {"geometry": {"type": "LineString", "coordinates": [[2533, 1849], [2534, 1854], [2533, 1849]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 966}, {"geometry": {"type": "LineString", "coordinates": [[3968, 1783], [3973, 1785], [3968, 1783]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 967}, {"geometry": {"type": "LineString", "coordinates": [[451, 1956], [445, 1955], [451, 1961], [451, 1956]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 968}, {"geometry": {"type": "LineString", "coordinates": [[2279, 2641], [2262, 2637]]}, "type": 2, "properties": {"iso_3166_1": "HU-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 969}, {"geometry": {"type": "LineString", "coordinates": [[452, 1943], [447, 1951], [463, 1947], [455, 1938], [452, 1943]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 970}, {"geometry": {"type": "LineString", "coordinates": [[455, 1861], [452, 1866], [455, 1861]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 971}, {"geometry": {"type": "LineString", "coordinates": [[3272, 2217], [3272, 2190], [3252, 2181], [3256, 2172], [3243, 2173], [3236, 2167]]}, "type": 2, "properties": {"iso_3166_1": "KH-VN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 972}, {"geometry": {"type": "LineString", "coordinates": [[471, 1846], [476, 1849], [471, 1846]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 973}, {"geometry": {"type": "LineString", "coordinates": [[467, 1879], [470, 1875], [467, 1879]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 974}, {"geometry": {"type": "LineString", "coordinates": [[2560, 2565], [2579, 2562], [2576, 2574]]}, "type": 2, "properties": {"iso_3166_1": "AZ-GE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 976}, {"geometry": {"type": "LineString", "coordinates": [[462, 1832], [471, 1830], [462, 1832]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 977}, {"geometry": {"type": "LineString", "coordinates": [[463, 1935], [469, 1942], [471, 1932], [463, 1935]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 980}, {"geometry": {"type": "LineString", "coordinates": [[467, 1787], [464, 1794], [470, 1796], [472, 1788], [467, 1787]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 981}, {"geometry": {"type": "LineString", "coordinates": [[469, 1805], [475, 1806], [469, 1805]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 982}, {"geometry": {"type": "LineString", "coordinates": [[473, 1926], [468, 1930], [473, 1926]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 983}, {"geometry": {"type": "LineString", "coordinates": [[468, 1822], [461, 1824], [473, 1823], [468, 1822]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 984}, {"geometry": {"type": "LineString", "coordinates": [[487, 1835], [492, 1836], [487, 1835]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 985}, {"geometry": {"type": "LineString", "coordinates": [[489, 1774], [487, 1780], [489, 1774]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 986}, {"geometry": {"type": "LineString", "coordinates": [[497, 1830], [495, 1837], [497, 1830]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 987}, {"geometry": {"type": "LineString", "coordinates": [[498, 1788], [499, 1794], [498, 1788]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 988}, {"geometry": {"type": "LineString", "coordinates": [[495, 1795], [491, 1802], [499, 1798], [495, 1795]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 989}, {"geometry": {"type": "LineString", "coordinates": [[802, 2166], [809, 2167], [806, 2162], [802, 2166]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 990}, {"geometry": {"type": "LineString", "coordinates": [[502, 1797], [509, 1797], [502, 1797]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 991}, {"geometry": {"type": "LineString", "coordinates": [[2927, 1569], [2933, 1571], [2927, 1569]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 992}, {"geometry": {"type": "LineString", "coordinates": [[518, 1772], [508, 1778], [514, 1781], [518, 1772]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 993}, {"geometry": {"type": "LineString", "coordinates": [[2561, 1906], [2557, 1900], [2563, 1896], [2566, 1902], [2561, 1906]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 994}, {"geometry": {"type": "LineString", "coordinates": [[2587, 1918], [2585, 1913], [2587, 1918]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 995}, {"geometry": {"type": "LineString", "coordinates": [[3099, 2285], [3097, 2294]]}, "type": 2, "properties": {"iso_3166_1": "BD-MM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 996}, {"geometry": {"type": "LineString", "coordinates": [[2927, 1582], [2934, 1583], [2927, 1582]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 997}, {"geometry": {"type": "LineString", "coordinates": [[3936, 1820], [3936, 1815], [3929, 1816], [3936, 1820]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 998}, {"geometry": {"type": "LineString", "coordinates": [[2618, 1459], [2625, 1459], [2623, 1447], [2618, 1459]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 999}, {"geometry": {"type": "LineString", "coordinates": [[2224, 2134], [2260, 2140], [2265, 2151], [2281, 2152], [2295, 2170], [2308, 2173]]}, "type": 2, "properties": {"iso_3166_1": "CF-TD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1000}, {"geometry": {"type": "LineString", "coordinates": [[2640, 1447], [2633, 1449], [2635, 1455], [2646, 1452], [2640, 1447]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1001}, {"geometry": {"type": "LineString", "coordinates": [[1247, 1836], [1258, 1846]]}, "type": 2, "properties": {"iso_3166_1": "CL-PE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1002}, {"geometry": {"type": "LineString", "coordinates": [[2827, 1404], [2825, 1414], [2832, 1419], [2854, 1406], [2853, 1396], [2831, 1385], [2823, 1397], [2827, 1404]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1003}, {"geometry": {"type": "LineString", "coordinates": [[3102, 2304], [3102, 2295], [3097, 2294]]}, "type": 2, "properties": {"iso_3166_1": "BD-MM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1004}, {"geometry": {"type": "LineString", "coordinates": [[2670, 1864], [2666, 1866], [2670, 1864]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1005}, {"geometry": {"type": "LineString", "coordinates": [[2386, 2626], [2387, 2626]]}, "type": 2, "properties": {"iso_3166_1": "RO-UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1006}, {"geometry": {"type": "LineString", "coordinates": [[2684, 1804], [2682, 1796], [2674, 1802], [2678, 1807], [2684, 1804]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1007}, {"geometry": {"type": "LineString", "coordinates": [[3847, 1826], [3856, 1831], [3860, 1827], [3853, 1814], [3848, 1815], [3847, 1826]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1008}, {"geometry": {"type": "LineString", "coordinates": [[3854, 1801], [3857, 1796], [3854, 1801]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1009}, {"geometry": {"type": "LineString", "coordinates": [[3917, 1831], [3921, 1835], [3917, 1831]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1010}, {"geometry": {"type": "LineString", "coordinates": [[1327, 2256], [1331, 2248]]}, "type": 2, "properties": {"iso_3166_1": "NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1011}, {"geometry": {"type": "LineString", "coordinates": [[3931, 1792], [3903, 1820], [3900, 1843], [3957, 1781], [3949, 1776], [3931, 1792]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1012}, {"geometry": {"type": "LineString", "coordinates": [[3936, 1811], [3939, 1815], [3952, 1809], [3963, 1795], [3956, 1794], [3936, 1811]]}, "type": 2, "properties": {"iso_3166_1": "FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1013}, {"geometry": {"type": "LineString", "coordinates": [[1255, 2189], [1251, 2195], [1250, 2190]]}, "type": 2, "properties": {"iso_3166_1": "NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1014}, {"geometry": {"type": "LineString", "coordinates": [[1942, 3216], [1955, 3226], [1965, 3220], [1962, 3209], [1949, 3201], [1938, 3205], [1942, 3216]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1015}, {"geometry": {"type": "LineString", "coordinates": [[2276, 3346], [2264, 3333], [2253, 3348], [2266, 3357], [2276, 3346]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1016}, {"geometry": {"type": "LineString", "coordinates": [[2130, 2768], [2120, 2776], [2105, 2772], [2083, 2735]]}, "type": 2, "properties": {"iso_3166_1": "NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1017}, {"geometry": {"type": "LineString", "coordinates": [[1267, 2188], [1259, 2191], [1266, 2183], [1274, 2185], [1274, 2190], [1267, 2188]]}, "type": 2, "properties": {"iso_3166_1": "NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1018}, {"geometry": {"type": "LineString", "coordinates": [[2406, 3183], [2408, 3197], [2372, 3223], [2319, 3224], [2256, 3192], [2242, 3171], [2216, 3155], [2191, 3123], [2177, 3102], [2183, 3081], [2162, 3027], [2104, 2965], [2095, 2946], [2099, 2889], [2112, 2868], [2136, 2857], [2169, 2879]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1019}, {"geometry": {"type": "LineString", "coordinates": [[2394, 3649], [2405, 3664], [2421, 3671], [2433, 3667], [2443, 3653], [2436, 3636], [2409, 3625], [2393, 3636], [2394, 3649]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1020}, {"geometry": {"type": "LineString", "coordinates": [[2081, 1308], [2085, 1302], [2091, 1306], [2089, 1311], [2081, 1308]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1021}, {"geometry": {"type": "LineString", "coordinates": [[2118, 2709], [2119, 2706]]}, "type": 2, "properties": {"iso_3166_1": "LU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1023}, {"geometry": {"type": "LineString", "coordinates": [[2195, 3492], [2191, 3516], [2174, 3522], [2156, 3558], [2162, 3582], [2158, 3629], [2177, 3643], [2198, 3640], [2208, 3651], [2239, 3656], [2275, 3707], [2286, 3706], [2310, 3687], [2330, 3695], [2341, 3692], [2358, 3674], [2361, 3661], [2378, 3654], [2383, 3642], [2346, 3588], [2305, 3563], [2321, 3532], [2344, 3512], [2343, 3499], [2328, 3487], [2303, 3450], [2294, 3447], [2286, 3452], [2278, 3480], [2258, 3480], [2251, 3438], [2238, 3427], [2228, 3432], [2201, 3469], [2195, 3492]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1024}, {"geometry": {"type": "LineString", "coordinates": [[2362, 3545], [2349, 3541], [2343, 3546], [2336, 3562], [2342, 3573], [2369, 3584], [2399, 3586], [2406, 3575], [2400, 3563], [2379, 3547], [2362, 3545]]}, "type": 2, "properties": {"iso_3166_1": "NO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1025}, {"geometry": {"type": "LineString", "coordinates": [[2546, 2587], [2544, 2579], [2555, 2576], [2551, 2585]]}, "type": 2, "properties": {"iso_3166_1": "GE", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1026}, {"geometry": {"type": "LineString", "coordinates": [[2119, 2706], [2118, 2709]]}, "type": 2, "properties": {"iso_3166_1": "DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1027}, {"geometry": {"type": "LineString", "coordinates": [[1915, 2355], [1911, 2355]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1028}, {"geometry": {"type": "LineString", "coordinates": [[1979, 2487], [1968, 2462], [1940, 2441], [1931, 2399], [1899, 2380], [1882, 2357], [1853, 2302], [1854, 2288]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1029}, {"geometry": {"type": "LineString", "coordinates": [[1875, 2297], [1874, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1030}, {"geometry": {"type": "LineString", "coordinates": [[2453, 2101], [2454, 2101]]}, "type": 2, "properties": {"iso_3166_1": "SS", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1031}, {"geometry": {"type": "LineString", "coordinates": [[2425, 2305], [2436, 2305]]}, "type": 2, "properties": {"iso_3166_1": "SD", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1032}, {"geometry": {"type": "LineString", "coordinates": [[2448, 2429], [2448, 2430]]}, "type": 2, "properties": {"iso_3166_1": "IL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1035}, {"geometry": {"type": "LineString", "coordinates": [[2378, 2159], [2378, 2164], [2365, 2164], [2366, 2158]]}, "type": 2, "properties": {"iso_3166_1": "SS", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1036}, {"geometry": {"type": "LineString", "coordinates": [[2243, 2672], [2241, 2683]]}, "type": 2, "properties": {"iso_3166_1": "AT-SK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1037}, {"geometry": {"type": "LineString", "coordinates": [[2300, 2679], [2281, 2681], [2260, 2668], [2243, 2672]]}, "type": 2, "properties": {"iso_3166_1": "HU-SK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1038}, {"geometry": {"type": "LineString", "coordinates": [[2439, 2101], [2452, 2101]]}, "type": 2, "properties": {"iso_3166_1": "SS", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1039}, {"geometry": {"type": "LineString", "coordinates": [[447, 3174], [444, 3168]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 1040}, {"geometry": {"type": "LineString", "coordinates": [[1292, 3692], [1293, 3693]]}, "type": 2, "properties": {"iso_3166_1": "CA", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 1041}, {"geometry": {"type": "LineString", "coordinates": [[2317, 2734], [2322, 2716], [2305, 2691]]}, "type": 2, "properties": {"iso_3166_1": "PL-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1042}, {"geometry": {"type": "LineString", "coordinates": [[2064, 2585], [2068, 2583]]}, "type": 2, "properties": {"iso_3166_1": "AD-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1044}, {"geometry": {"type": "LineString", "coordinates": [[2387, 2626], [2390, 2624]]}, "type": 2, "properties": {"iso_3166_1": "RO-UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1045}, {"geometry": {"type": "LineString", "coordinates": [[2241, 2683], [2262, 2698]]}, "type": 2, "properties": {"iso_3166_1": "CZ-SK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1046}, {"geometry": {"type": "LineString", "coordinates": [[3187, 2285], [3192, 2274], [3200, 2275], [3198, 2250], [3225, 2262], [3240, 2250], [3240, 2239], [3250, 2228], [3245, 2213]]}, "type": 2, "properties": {"iso_3166_1": "LA-TH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1048}, {"geometry": {"type": "LineString", "coordinates": [[2305, 2691], [2300, 2679]]}, "type": 2, "properties": {"iso_3166_1": "SK-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1049}, {"geometry": {"type": "LineString", "coordinates": [[2231, 2653], [2236, 2655], [2235, 2667], [2243, 2672]]}, "type": 2, "properties": {"iso_3166_1": "AT-HU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1050}, {"geometry": {"type": "LineString", "coordinates": [[2167, 2665], [2164, 2660], [2157, 2664]]}, "type": 2, "properties": {"iso_3166_1": "AT-DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1052}, {"geometry": {"type": "LineString", "coordinates": [[2205, 2685], [2193, 2674], [2196, 2663], [2187, 2668], [2176, 2662], [2167, 2665]]}, "type": 2, "properties": {"iso_3166_1": "AT-DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1054}, {"geometry": {"type": "LineString", "coordinates": [[2205, 2685], [2215, 2682], [2219, 2690], [2241, 2683]]}, "type": 2, "properties": {"iso_3166_1": "AT-CZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1055}, {"geometry": {"type": "LineString", "coordinates": [[2156, 2660], [2157, 2656]]}, "type": 2, "properties": {"iso_3166_1": "AT-LI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1056}, {"geometry": {"type": "LineString", "coordinates": [[2157, 2656], [2167, 2653]]}, "type": 2, "properties": {"iso_3166_1": "AT-CH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1057}, {"geometry": {"type": "LineString", "coordinates": [[3170, 2162], [3182, 2183], [3176, 2208], [3165, 2220], [3174, 2236], [3156, 2263], [3163, 2278], [3174, 2277], [3187, 2285]]}, "type": 2, "properties": {"iso_3166_1": "MM-TH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1058}, {"geometry": {"type": "LineString", "coordinates": [[2231, 2653], [2237, 2647]]}, "type": 2, "properties": {"iso_3166_1": "HU-SI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1059}, {"geometry": {"type": "LineString", "coordinates": [[2300, 2679], [2309, 2671]]}, "type": 2, "properties": {"iso_3166_1": "HU-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1060}, {"geometry": {"type": "LineString", "coordinates": [[2271, 2790], [2307, 2788]]}, "type": 2, "properties": {"iso_3166_1": "PL-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1061}, {"geometry": {"type": "LineString", "coordinates": [[2157, 2664], [2156, 2660]]}, "type": 2, "properties": {"iso_3166_1": "AT-CH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1063}, {"geometry": {"type": "LineString", "coordinates": [[2269, 2793], [2271, 2790]]}, "type": 2, "properties": {"iso_3166_1": "PL-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1066}, {"geometry": {"type": "LineString", "coordinates": [[2204, 2647], [2214, 2645], [2231, 2653]]}, "type": 2, "properties": {"iso_3166_1": "AT-SI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1067}, {"geometry": {"type": "LineString", "coordinates": [[2167, 2653], [2187, 2657], [2190, 2650], [2204, 2647]]}, "type": 2, "properties": {"iso_3166_1": "AT-IT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1068}, {"geometry": {"type": "LineString", "coordinates": [[3199, 2299], [3188, 2298], [3184, 2306], [3176, 2307], [3181, 2316], [3173, 2319], [3173, 2331], [3158, 2329], [3161, 2345], [3171, 2353], [3172, 2368], [3162, 2385], [3156, 2383]]}, "type": 2, "properties": {"iso_3166_1": "CN-MM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1069}, {"geometry": {"type": "LineString", "coordinates": [[3102, 2304], [3108, 2307], [3110, 2331], [3119, 2327], [3131, 2362], [3147, 2372], [3153, 2368], [3150, 2375], [3156, 2383]]}, "type": 2, "properties": {"iso_3166_1": "IN-MM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1071}, {"geometry": {"type": "LineString", "coordinates": [[3109, 2206], [3107, 2208]]}, "type": 2, "properties": {"iso_3166_1": "IN-MM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1072}, {"geometry": {"type": "LineString", "coordinates": [[2309, 2671], [2298, 2663], [2291, 2646], [2279, 2641]]}, "type": 2, "properties": {"iso_3166_1": "HU-RO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1073}, {"geometry": {"type": "LineString", "coordinates": [[2083, 2735], [2086, 2731]]}, "type": 2, "properties": {"iso_3166_1": "BE-NL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1074}, {"geometry": {"type": "LineString", "coordinates": [[2237, 2647], [2251, 2635], [2262, 2637]]}, "type": 2, "properties": {"iso_3166_1": "HR-HU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1075}, {"geometry": {"type": "LineString", "coordinates": [[2543, 2562], [2560, 2565]]}, "type": 2, "properties": {"iso_3166_1": "AM-GE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1076}, {"geometry": {"type": "LineString", "coordinates": [[2217, 2722], [2211, 2726], [2186, 2713], [2193, 2695], [2205, 2685]]}, "type": 2, "properties": {"iso_3166_1": "CZ-DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1077}, {"geometry": {"type": "LineString", "coordinates": [[2146, 2799], [2155, 2797]]}, "type": 2, "properties": {"iso_3166_1": "DE-DK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1078}, {"geometry": {"type": "LineString", "coordinates": [[2551, 2585], [2546, 2587]]}, "type": 2, "properties": {"iso_3166_1": "GE-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1079}, {"geometry": {"type": "LineString", "coordinates": [[2386, 2016], [2389, 2018]]}, "type": 2, "properties": {"iso_3166_1": "BI-RW", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1080}, {"geometry": {"type": "LineString", "coordinates": [[2521, 2568], [2535, 2569], [2543, 2562]]}, "type": 2, "properties": {"iso_3166_1": "GE-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1081}, {"geometry": {"type": "LineString", "coordinates": [[2518, 2570], [2521, 2568]]}, "type": 2, "properties": {"iso_3166_1": "GE-TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1082}, {"geometry": {"type": "LineString", "coordinates": [[3219, 2181], [3216, 2178]]}, "type": 2, "properties": {"iso_3166_1": "KH-TH", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1083}, {"geometry": {"type": "LineString", "coordinates": [[3187, 2285], [3199, 2299]]}, "type": 2, "properties": {"iso_3166_1": "LA-MM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1086}, {"geometry": {"type": "LineString", "coordinates": [[2134, 2665], [2146, 2669], [2157, 2664]]}, "type": 2, "properties": {"iso_3166_1": "CH-DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1087}, {"geometry": {"type": "LineString", "coordinates": [[2117, 2720], [2118, 2709]]}, "type": 2, "properties": {"iso_3166_1": "BE-DE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1089}, {"geometry": {"type": "LineString", "coordinates": [[2121, 2701], [2120, 2698]]}, "type": 2, "properties": {"iso_3166_1": "DE-LU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1093}, {"geometry": {"type": "LineString", "coordinates": [[2279, 2984], [2291, 2994]]}, "type": 2, "properties": {"iso_3166_1": "FI-SE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1094}, {"geometry": {"type": "LineString", "coordinates": [[3463, 2517], [3471, 2511], [3486, 2514]]}, "type": 2, "properties": {"iso_3166_1": "KP-KR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1097}, {"geometry": {"type": "LineString", "coordinates": [[2156, 2660], [2157, 2656]]}, "type": 2, "properties": {"iso_3166_1": "CH-LI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1100}, {"geometry": {"type": "LineString", "coordinates": [[2134, 2665], [2127, 2664], [2116, 2642], [2126, 2646], [2128, 2638]]}, "type": 2, "properties": {"iso_3166_1": "CH-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1101}, {"geometry": {"type": "LineString", "coordinates": [[2369, 2630], [2386, 2626]]}, "type": 2, "properties": {"iso_3166_1": "RO-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1102}, {"geometry": {"type": "LineString", "coordinates": [[2118, 2709], [2114, 2699]]}, "type": 2, "properties": {"iso_3166_1": "BE-LU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1103}, {"geometry": {"type": "LineString", "coordinates": [[2077, 2726], [2096, 2712], [2095, 2706], [2103, 2710], [2103, 2703], [2114, 2699]]}, "type": 2, "properties": {"iso_3166_1": "BE-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1104}, {"geometry": {"type": "LineString", "coordinates": [[2086, 2731], [2105, 2734], [2117, 2720]]}, "type": 2, "properties": {"iso_3166_1": "BE-NL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1105}, {"geometry": {"type": "LineString", "coordinates": [[2284, 2821], [2288, 2822]]}, "type": 2, "properties": {"iso_3166_1": "LT-LV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1106}, {"geometry": {"type": "LineString", "coordinates": [[1386, 1814], [1394, 1837], [1383, 1851], [1385, 1859], [1363, 1860], [1360, 1890], [1310, 1909], [1304, 1937], [1290, 1935], [1270, 1921], [1256, 1923]]}, "type": 2, "properties": {"iso_3166_1": "BO-BR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1117}, {"geometry": {"type": "LineString", "coordinates": [[1357, 2107], [1354, 2099], [1337, 2096], [1332, 2089], [1311, 2097], [1319, 2076], [1327, 2072], [1302, 2055], [1287, 2062]]}, "type": 2, "properties": {"iso_3166_1": "BR-VE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1118}, {"geometry": {"type": "LineString", "coordinates": [[1427, 1747], [1436, 1744], [1436, 1727], [1413, 1713], [1392, 1687]]}, "type": 2, "properties": {"iso_3166_1": "AR-BR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1119}, {"geometry": {"type": "LineString", "coordinates": [[2282, 3149], [2276, 3148], [2275, 3127], [2257, 3134], [2252, 3115], [2245, 3119], [2238, 3113], [2224, 3065], [2213, 3061], [2213, 3038], [2203, 3019], [2209, 3008], [2195, 3005], [2186, 2993], [2186, 2947], [2194, 2934], [2187, 2930], [2191, 2911], [2178, 2884]]}, "type": 2, "properties": {"iso_3166_1": "NO-SE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1120}, {"geometry": {"type": "LineString", "coordinates": [[1441, 1640], [1444, 1653], [1427, 1671], [1416, 1679], [1411, 1676], [1402, 1689], [1392, 1687]]}, "type": 2, "properties": {"iso_3166_1": "BR-UY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1121}, {"geometry": {"type": "LineString", "coordinates": [[2282, 2574], [2287, 2558]]}, "type": 2, "properties": {"iso_3166_1": "AL-MK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1122}, {"geometry": {"type": "LineString", "coordinates": [[2268, 2573], [2272, 2586], [2276, 2584]]}, "type": 2, "properties": {"iso_3166_1": "AL-ME", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1123}, {"geometry": {"type": "LineString", "coordinates": [[2297, 2857], [2306, 2861], [2312, 2853], [2325, 2860]]}, "type": 2, "properties": {"iso_3166_1": "EE-LV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1124}, {"geometry": {"type": "LineString", "coordinates": [[2287, 2558], [2276, 2541]]}, "type": 2, "properties": {"iso_3166_1": "AL-GR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1125}, {"geometry": {"type": "LineString", "coordinates": [[2276, 2541], [2273, 2544]]}, "type": 2, "properties": {"iso_3166_1": "AL-GR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1126}, {"geometry": {"type": "LineString", "coordinates": [[2282, 2574], [2276, 2584]]}, "type": 2, "properties": {"iso_3166_1": "AL-XK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1127}, {"geometry": {"type": "LineString", "coordinates": [[2302, 2580], [2309, 2565]]}, "type": 2, "properties": {"iso_3166_1": "BG-MK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1128}, {"geometry": {"type": "LineString", "coordinates": [[2294, 2580], [2282, 2574]]}, "type": 2, "properties": {"iso_3166_1": "MK-XK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1129}, {"geometry": {"type": "LineString", "coordinates": [[2610, 2643], [2616, 2640]]}, "type": 2, "properties": {"iso_3166_1": "KZ-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1130}, {"geometry": {"type": "LineString", "coordinates": [[2309, 2565], [2287, 2558]]}, "type": 2, "properties": {"iso_3166_1": "GR-MK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1131}, {"geometry": {"type": "LineString", "coordinates": [[2302, 2580], [2294, 2580]]}, "type": 2, "properties": {"iso_3166_1": "MK-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1132}, {"geometry": {"type": "LineString", "coordinates": [[2558, 2504], [2551, 2514], [2549, 2536], [2558, 2540]]}, "type": 2, "properties": {"iso_3166_1": "IR-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1133}, {"geometry": {"type": "LineString", "coordinates": [[2280, 2588], [2267, 2599]]}, "type": 2, "properties": {"iso_3166_1": "ME-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1134}, {"geometry": {"type": "LineString", "coordinates": [[2377, 3148], [2382, 3162], [2366, 3182], [2343, 3170], [2340, 3143], [2331, 3133], [2320, 3142], [2312, 3135], [2303, 3138], [2294, 3156], [2282, 3149]]}, "type": 2, "properties": {"iso_3166_1": "FI-NO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1135}, {"geometry": {"type": "LineString", "coordinates": [[2368, 2824], [2383, 2820], [2384, 2814], [2392, 2818], [2400, 2813], [2398, 2797], [2411, 2783], [2409, 2777], [2421, 2770], [2403, 2762], [2410, 2745]]}, "type": 2, "properties": {"iso_3166_1": "BY-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1136}, {"geometry": {"type": "LineString", "coordinates": [[2267, 2599], [2258, 2584]]}, "type": 2, "properties": {"iso_3166_1": "BA-ME", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1137}, {"geometry": {"type": "LineString", "coordinates": [[2377, 3148], [2371, 3144], [2376, 3143], [2374, 3122], [2390, 3106], [2378, 3084], [2391, 3051], [2385, 3028], [2396, 3006], [2389, 2997], [2407, 2976], [2403, 2964], [2364, 2919]]}, "type": 2, "properties": {"iso_3166_1": "FI-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1139}, {"geometry": {"type": "LineString", "coordinates": [[2364, 2919], [2361, 2912]]}, "type": 2, "properties": {"iso_3166_1": "FI-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1140}, {"geometry": {"type": "LineString", "coordinates": [[2351, 2677], [2362, 2681], [2372, 2674]]}, "type": 2, "properties": {"iso_3166_1": "MD-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1141}, {"geometry": {"type": "LineString", "coordinates": [[2410, 2745], [2400, 2745], [2396, 2729], [2344, 2742], [2325, 2741], [2317, 2734]]}, "type": 2, "properties": {"iso_3166_1": "BY-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1143}, {"geometry": {"type": "LineString", "coordinates": [[2388, 2648], [2378, 2647], [2369, 2630]]}, "type": 2, "properties": {"iso_3166_1": "MD-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1144}, {"geometry": {"type": "LineString", "coordinates": [[1252, 2000], [1219, 1990], [1216, 1974], [1206, 1962], [1218, 1945], [1215, 1940], [1226, 1939], [1227, 1934], [1246, 1940], [1244, 1922], [1256, 1923]]}, "type": 2, "properties": {"iso_3166_1": "BR-PE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1145}, {"geometry": {"type": "LineString", "coordinates": [[2372, 2674], [2380, 2672], [2388, 2648]]}, "type": 2, "properties": {"iso_3166_1": "MD-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1146}, {"geometry": {"type": "LineString", "coordinates": [[2351, 2677], [2368, 2655], [2369, 2630]]}, "type": 2, "properties": {"iso_3166_1": "MD-RO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1147}, {"geometry": {"type": "LineString", "coordinates": [[2368, 2824], [2351, 2814]]}, "type": 2, "properties": {"iso_3166_1": "BY-LV", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1148}, {"geometry": {"type": "LineString", "coordinates": [[2351, 2814], [2353, 2806], [2341, 2798], [2340, 2783], [2338, 2787], [2316, 2780]]}, "type": 2, "properties": {"iso_3166_1": "BY-LT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1149}, {"geometry": {"type": "LineString", "coordinates": [[715, 2440], [743, 2442], [784, 2424], [838, 2429], [872, 2393], [880, 2403], [893, 2404], [916, 2375], [920, 2361], [943, 2354]]}, "type": 2, "properties": {"iso_3166_1": "MX-US", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1150}, {"geometry": {"type": "LineString", "coordinates": [[1406, 2070], [1412, 2069], [1411, 2077], [1427, 2075]]}, "type": 2, "properties": {"iso_3166_1": "BR-SR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1151}, {"geometry": {"type": "LineString", "coordinates": [[1357, 2107], [1364, 2108], [1363, 2099], [1371, 2093], [1365, 2079], [1372, 2065], [1379, 2061], [1396, 2071], [1406, 2070]]}, "type": 2, "properties": {"iso_3166_1": "BR-GY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1152}, {"geometry": {"type": "LineString", "coordinates": [[715, 2440], [712, 2441]]}, "type": 2, "properties": {"iso_3166_1": "MX-US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1153}, {"geometry": {"type": "LineString", "coordinates": [[1461, 2096], [1446, 2073], [1427, 2075]]}, "type": 2, "properties": {"iso_3166_1": "BR-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1154}, {"geometry": {"type": "LineString", "coordinates": [[1461, 2100], [1461, 2096]]}, "type": 2, "properties": {"iso_3166_1": "BR-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1155}, {"geometry": {"type": "LineString", "coordinates": [[943, 2354], [945, 2354]]}, "type": 2, "properties": {"iso_3166_1": "MX-US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1156}, {"geometry": {"type": "LineString", "coordinates": [[2856, 2549], [2868, 2549], [2880, 2558], [2869, 2560], [2864, 2569], [2860, 2562], [2846, 2568], [2859, 2578], [2855, 2580]]}, "type": 2, "properties": {"iso_3166_1": "KG-UZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1157}, {"geometry": {"type": "LineString", "coordinates": [[2359, 2852], [2365, 2848], [2368, 2824]]}, "type": 2, "properties": {"iso_3166_1": "LV-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1158}, {"geometry": {"type": "LineString", "coordinates": [[2307, 2788], [2305, 2802], [2286, 2806]]}, "type": 2, "properties": {"iso_3166_1": "LT-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1159}, {"geometry": {"type": "LineString", "coordinates": [[1212, 1393], [1215, 1374], [1225, 1378], [1228, 1354], [1269, 1346]]}, "type": 2, "properties": {"iso_3166_1": "AR-CL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1160}, {"geometry": {"type": "LineString", "coordinates": [[2367, 2895], [2359, 2879], [2365, 2860], [2359, 2852]]}, "type": 2, "properties": {"iso_3166_1": "EE-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1161}, {"geometry": {"type": "LineString", "coordinates": [[125, 3057], [125, 3043]]}, "type": 2, "properties": {"iso_3166_1": "RU-US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1162}, {"geometry": {"type": "LineString", "coordinates": [[3047, 2692], [3098, 2723], [3120, 2717], [3129, 2706], [3154, 2702], [3167, 2713], [3162, 2731], [3173, 2746], [3210, 2731], [3212, 2719], [3223, 2710], [3261, 2713], [3276, 2706], [3283, 2695], [3308, 2692], [3332, 2698], [3349, 2712], [3376, 2704]]}, "type": 2, "properties": {"iso_3166_1": "MN-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1163}, {"geometry": {"type": "LineString", "coordinates": [[2351, 2814], [2331, 2830], [2299, 2829], [2288, 2822]]}, "type": 2, "properties": {"iso_3166_1": "LT-LV", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1164}, {"geometry": {"type": "LineString", "coordinates": [[3534, 2582], [3535, 2580]]}, "type": 2, "properties": {"iso_3166_1": "KP-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1165}, {"geometry": {"type": "LineString", "coordinates": [[3538, 2578], [3535, 2580]]}, "type": 2, "properties": {"iso_3166_1": "KP-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1166}, {"geometry": {"type": "LineString", "coordinates": [[2410, 2745], [2433, 2750], [2440, 2740], [2437, 2730], [2451, 2726], [2453, 2713], [2475, 2715], [2481, 2705], [2505, 2700], [2499, 2689], [2504, 2688], [2499, 2683], [2501, 2670], [2484, 2666], [2483, 2657]]}, "type": 2, "properties": {"iso_3166_1": "RU-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1167}, {"geometry": {"type": "LineString", "coordinates": [[3047, 2692], [3041, 2691]]}, "type": 2, "properties": {"iso_3166_1": "CN-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1168}, {"geometry": {"type": "LineString", "coordinates": [[1965, 2802], [1955, 2789], [1976, 2783]]}, "type": 2, "properties": {"iso_3166_1": "GB-IE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1169}, {"geometry": {"type": "LineString", "coordinates": [[3376, 2704], [3389, 2698], [3405, 2708], [3403, 2714], [3422, 2744], [3422, 2753], [3414, 2757], [3423, 2767], [3454, 2772], [3476, 2764], [3487, 2748], [3499, 2703], [3535, 2687], [3538, 2667], [3556, 2667], [3581, 2679], [3563, 2625], [3548, 2628], [3538, 2620], [3542, 2597], [3532, 2587], [3534, 2582]]}, "type": 2, "properties": {"iso_3166_1": "CN-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1170}, {"geometry": {"type": "LineString", "coordinates": [[1993, 2789], [2002, 2790]]}, "type": 2, "properties": {"iso_3166_1": "GB-IM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1171}, {"geometry": {"type": "LineString", "coordinates": [[2601, 2573], [2589, 2563], [2576, 2574]]}, "type": 2, "properties": {"iso_3166_1": "AZ-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1172}, {"geometry": {"type": "LineString", "coordinates": [[3709, 2594], [3701, 2602], [3705, 2611]]}, "type": 2, "properties": {"iso_3166_1": "JP-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1173}, {"geometry": {"type": "LineString", "coordinates": [[1971, 2809], [1965, 2802]]}, "type": 2, "properties": {"iso_3166_1": "GB-IE", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 1174}, {"geometry": {"type": "LineString", "coordinates": [[2399, 3172], [2400, 3165], [2390, 3168], [2391, 3162], [2377, 3148]]}, "type": 2, "properties": {"iso_3166_1": "NO-RU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1175}, {"geometry": {"type": "LineString", "coordinates": [[2406, 3183], [2399, 3172]]}, "type": 2, "properties": {"iso_3166_1": "NO-RU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1176}, {"geometry": {"type": "LineString", "coordinates": [[3002, 2372], [3003, 2373]]}, "type": 2, "properties": {"iso_3166_1": "IN-NP", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1177}, {"geometry": {"type": "LineString", "coordinates": [[2421, 2636], [2414, 2629], [2427, 2622], [2425, 2615], [2431, 2610], [2465, 2622]]}, "type": 2, "properties": {"iso_3166_1": "RU-UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1178}, {"geometry": {"type": "LineString", "coordinates": [[2449, 2635], [2453, 2630], [2465, 2633]]}, "type": 2, "properties": {"iso_3166_1": "RU-UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1179}, {"geometry": {"type": "LineString", "coordinates": [[2483, 2657], [2474, 2651]]}, "type": 2, "properties": {"iso_3166_1": "RU-UA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1180}, {"geometry": {"type": "LineString", "coordinates": [[3508, 2525], [3512, 2525]]}, "type": 2, "properties": {"iso_3166_1": "KP-KR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1181}, {"geometry": {"type": "LineString", "coordinates": [[1284, 1781], [1295, 1794], [1313, 1789], [1316, 1780], [1321, 1791], [1335, 1788]]}, "type": 2, "properties": {"iso_3166_1": "AR-BO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1182}, {"geometry": {"type": "LineString", "coordinates": [[2404, 1786], [2412, 1742]]}, "type": 2, "properties": {"iso_3166_1": "MZ-ZA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1183}, {"geometry": {"type": "LineString", "coordinates": [[2414, 1731], [2422, 1731]]}, "type": 2, "properties": {"iso_3166_1": "MZ-ZA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1184}, {"geometry": {"type": "LineString", "coordinates": [[2276, 1757], [2285, 1744], [2283, 1730], [2296, 1731], [2312, 1751], [2338, 1745], [2355, 1771], [2382, 1789]]}, "type": 2, "properties": {"iso_3166_1": "BW-ZA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1185}, {"geometry": {"type": "LineString", "coordinates": [[2355, 1694], [2368, 1681], [2383, 1700], [2374, 1709], [2355, 1694]]}, "type": 2, "properties": {"iso_3166_1": "LS-ZA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1186}, {"geometry": {"type": "LineString", "coordinates": [[1868, 2297], [1867, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1187}, {"geometry": {"type": "LineString", "coordinates": [[2351, 2677], [2333, 2668], [2309, 2671]]}, "type": 2, "properties": {"iso_3166_1": "RO-UA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1188}, {"geometry": {"type": "LineString", "coordinates": [[2325, 2860], [2336, 2864], [2350, 2852], [2359, 2852]]}, "type": 2, "properties": {"iso_3166_1": "EE-LV", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1189}, {"geometry": {"type": "LineString", "coordinates": [[2306, 2610], [2310, 2603], [2339, 2601], [2358, 2609], [2373, 2602]]}, "type": 2, "properties": {"iso_3166_1": "BG-RO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1190}, {"geometry": {"type": "LineString", "coordinates": [[2414, 1731], [2412, 1742]]}, "type": 2, "properties": {"iso_3166_1": "MZ-SZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1191}, {"geometry": {"type": "LineString", "coordinates": [[2382, 1789], [2404, 1786]]}, "type": 2, "properties": {"iso_3166_1": "ZA-ZW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1192}, {"geometry": {"type": "LineString", "coordinates": [[2279, 2641], [2293, 2625], [2291, 2619], [2300, 2614], [2304, 2618], [2306, 2610]]}, "type": 2, "properties": {"iso_3166_1": "RO-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1193}, {"geometry": {"type": "LineString", "coordinates": [[1878, 2174], [1875, 2171]]}, "type": 2, "properties": {"iso_3166_1": "GN-GW", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1194}, {"geometry": {"type": "LineString", "coordinates": [[2235, 1708], [2242, 1716], [2255, 1704], [2276, 1710], [2276, 1757]]}, "type": 2, "properties": {"iso_3166_1": "NA-ZA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1195}, {"geometry": {"type": "LineString", "coordinates": [[2235, 1708], [2234, 1706]]}, "type": 2, "properties": {"iso_3166_1": "NA-ZA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1196}, {"geometry": {"type": "LineString", "coordinates": [[2445, 2399], [2446, 2400]]}, "type": 2, "properties": {"iso_3166_1": "IL-JO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1197}, {"geometry": {"type": "LineString", "coordinates": [[1034, 2254], [1043, 2262]]}, "type": 2, "properties": {"iso_3166_1": "BZ-MX", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1198}, {"geometry": {"type": "LineString", "coordinates": [[1043, 2262], [1050, 2258]]}, "type": 2, "properties": {"iso_3166_1": "BZ-MX", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1199}, {"geometry": {"type": "LineString", "coordinates": [[2199, 2073], [2198, 2062], [2210, 2064], [2213, 2059], [2206, 2051], [2213, 2041], [2212, 2026], [2208, 2020], [2192, 2027], [2180, 2021], [2184, 2007], [2175, 2003]]}, "type": 2, "properties": {"iso_3166_1": "CG-GA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1200}, {"geometry": {"type": "LineString", "coordinates": [[1034, 2254], [1013, 2254], [1013, 2247], [1008, 2247], [1019, 2233], [1004, 2233], [999, 2215]]}, "type": 2, "properties": {"iso_3166_1": "GT-MX", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1201}, {"geometry": {"type": "LineString", "coordinates": [[2445, 2398], [2445, 2399]]}, "type": 2, "properties": {"iso_3166_1": "EG-JO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1202}, {"geometry": {"type": "LineString", "coordinates": [[1162, 2130], [1170, 2138], [1168, 2147]]}, "type": 2, "properties": {"iso_3166_1": "CO-PA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1203}, {"geometry": {"type": "LineString", "coordinates": [[1162, 2130], [1160, 2128]]}, "type": 2, "properties": {"iso_3166_1": "CO-PA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1204}, {"geometry": {"type": "LineString", "coordinates": [[1192, 2047], [1218, 2020], [1232, 2024], [1251, 2018], [1243, 2005], [1252, 2000]]}, "type": 2, "properties": {"iso_3166_1": "CO-PE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1205}, {"geometry": {"type": "LineString", "coordinates": [[1931, 2145], [1917, 2127]]}, "type": 2, "properties": {"iso_3166_1": "LR-SL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1206}, {"geometry": {"type": "LineString", "coordinates": [[1313, 2258], [1309, 2264]]}, "type": 2, "properties": {"iso_3166_1": "US-VG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1207}, {"geometry": {"type": "LineString", "coordinates": [[1282, 2612], [1285, 2611]]}, "type": 2, "properties": {"iso_3166_1": "CA-US", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 1208}, {"geometry": {"type": "LineString", "coordinates": [[3047, 2692], [3049, 2682], [3073, 2670], [3082, 2655], [3082, 2626], [3112, 2622], [3134, 2611], [3145, 2587], [3196, 2586], [3243, 2569], [3271, 2583], [3304, 2587], [3322, 2602], [3316, 2612], [3322, 2624], [3341, 2618], [3351, 2629], [3370, 2634], [3374, 2644], [3413, 2651], [3397, 2672], [3383, 2666], [3363, 2671], [3376, 2704]]}, "type": 2, "properties": {"iso_3166_1": "CN-MN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1209}, {"geometry": {"type": "LineString", "coordinates": [[2745, 2482], [2744, 2497], [2735, 2496], [2723, 2509], [2699, 2520], [2662, 2507]]}, "type": 2, "properties": {"iso_3166_1": "IR-TM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1211}, {"geometry": {"type": "LineString", "coordinates": [[562, 2795], [569, 2821], [548, 2833], [512, 2897], [507, 2902], [498, 2898], [483, 2882], [464, 2909], [466, 2915], [444, 2914], [444, 3168]]}, "type": 2, "properties": {"iso_3166_1": "CA-US", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1212}, {"geometry": {"type": "LineString", "coordinates": [[629, 2681], [646, 2677], [645, 2689], [965, 2689], [968, 2696], [972, 2684], [990, 2683], [1006, 2673], [1043, 2677], [1086, 2646], [1091, 2648], [1091, 2642], [1109, 2628], [1114, 2600], [1102, 2579], [1107, 2571], [1150, 2588], [1147, 2598], [1153, 2601], [1174, 2601], [1197, 2623], [1242, 2626], [1260, 2663], [1277, 2656], [1276, 2634], [1286, 2620]]}, "type": 2, "properties": {"iso_3166_1": "CA-US", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1213}, {"geometry": {"type": "LineString", "coordinates": [[1286, 2620], [1287, 2619]]}, "type": 2, "properties": {"iso_3166_1": "CA-US", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1214}, {"geometry": {"type": "LineString", "coordinates": [[1267, 1298], [1296, 1292]]}, "type": 2, "properties": {"iso_3166_1": "AR-CL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1215}, {"geometry": {"type": "LineString", "coordinates": [[2385, 2032], [2378, 2017]]}, "type": 2, "properties": {"iso_3166_1": "CD-RW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1216}, {"geometry": {"type": "LineString", "coordinates": [[2395, 2036], [2385, 2032]]}, "type": 2, "properties": {"iso_3166_1": "RW-UG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1217}, {"geometry": {"type": "LineString", "coordinates": [[2378, 2017], [2386, 2016]]}, "type": 2, "properties": {"iso_3166_1": "BI-RW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1218}, {"geometry": {"type": "LineString", "coordinates": [[2389, 2018], [2396, 2021]]}, "type": 2, "properties": {"iso_3166_1": "BI-RW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1219}, {"geometry": {"type": "LineString", "coordinates": [[2395, 2036], [2400, 2024], [2396, 2021]]}, "type": 2, "properties": {"iso_3166_1": "RW-TZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1220}, {"geometry": {"type": "LineString", "coordinates": [[3062, 2375], [3070, 2383]]}, "type": 2, "properties": {"iso_3166_1": "BT-CN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1221}, {"geometry": {"type": "LineString", "coordinates": [[2495, 2436], [2469, 2426], [2480, 2413], [2475, 2406], [2458, 2395], [2446, 2398]]}, "type": 2, "properties": {"iso_3166_1": "JO-SA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1222}, {"geometry": {"type": "LineString", "coordinates": [[3077, 2381], [3091, 2377]]}, "type": 2, "properties": {"iso_3166_1": "BT-CN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1223}, {"geometry": {"type": "LineString", "coordinates": [[1267, 1298], [1267, 1341]]}, "type": 2, "properties": {"iso_3166_1": "AR-CL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1224}, {"geometry": {"type": "LineString", "coordinates": [[2745, 2482], [2762, 2477], [2766, 2486], [2782, 2492], [2785, 2504], [2796, 2510], [2805, 2507]]}, "type": 2, "properties": {"iso_3166_1": "AF-TM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1227}, {"geometry": {"type": "LineString", "coordinates": [[2177, 2073], [2177, 2059], [2158, 2060]]}, "type": 2, "properties": {"iso_3166_1": "GA-GQ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1228}, {"geometry": {"type": "LineString", "coordinates": [[1874, 2297], [1869, 2297]]}, "type": 2, "properties": {"iso_3166_1": "MA-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1229}, {"geometry": {"type": "LineString", "coordinates": [[1284, 1781], [1276, 1781], [1266, 1810], [1270, 1823], [1258, 1846]]}, "type": 2, "properties": {"iso_3166_1": "BO-CL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1230}, {"geometry": {"type": "LineString", "coordinates": [[1216, 1404], [1226, 1418], [1223, 1428], [1231, 1438], [1231, 1464], [1237, 1469], [1228, 1477], [1239, 1480], [1231, 1483], [1234, 1495], [1227, 1518], [1232, 1519], [1232, 1557], [1242, 1571], [1238, 1597], [1247, 1606], [1245, 1620], [1254, 1633], [1246, 1676], [1254, 1687], [1255, 1710], [1271, 1728], [1268, 1757], [1282, 1766], [1284, 1781]]}, "type": 2, "properties": {"iso_3166_1": "AR-CL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1231}, {"geometry": {"type": "LineString", "coordinates": [[2348, 2571], [2351, 2566], [2344, 2556]]}, "type": 2, "properties": {"iso_3166_1": "GR-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1233}, {"geometry": {"type": "LineString", "coordinates": [[2856, 2548], [2858, 2544], [2856, 2548]]}, "type": 2, "properties": {"iso_3166_1": "KG-UZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1234}, {"geometry": {"type": "LineString", "coordinates": [[2367, 2575], [2356, 2577], [2348, 2571]]}, "type": 2, "properties": {"iso_3166_1": "BG-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1235}, {"geometry": {"type": "LineString", "coordinates": [[2344, 2556], [2343, 2537], [2352, 2531], [2346, 2518], [2356, 2515], [2360, 2495], [2370, 2495]]}, "type": 2, "properties": {"iso_3166_1": "GR-TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1237}, {"geometry": {"type": "LineString", "coordinates": [[2386, 2486], [2381, 2488]]}, "type": 2, "properties": {"iso_3166_1": "GR-TR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1238}, {"geometry": {"type": "LineString", "coordinates": [[2558, 2504], [2530, 2503]]}, "type": 2, "properties": {"iso_3166_1": "IQ-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1239}, {"geometry": {"type": "LineString", "coordinates": [[2543, 2562], [2545, 2547], [2557, 2541]]}, "type": 2, "properties": {"iso_3166_1": "AM-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1240}, {"geometry": {"type": "LineString", "coordinates": [[2557, 2541], [2558, 2540]]}, "type": 2, "properties": {"iso_3166_1": "AZ-TR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1241}, {"geometry": {"type": "LineString", "coordinates": [[2885, 2537], [2870, 2533], [2861, 2540], [2837, 2538], [2837, 2546], [2845, 2549], [2850, 2544], [2856, 2549]]}, "type": 2, "properties": {"iso_3166_1": "KG-TJ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1243}, {"geometry": {"type": "LineString", "coordinates": [[3534, 2582], [3526, 2591], [3524, 2582], [3505, 2576], [3506, 2566], [3489, 2572], [3483, 2560], [3461, 2543]]}, "type": 2, "properties": {"iso_3166_1": "CN-KP", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1244}, {"geometry": {"type": "LineString", "coordinates": [[3486, 2514], [3508, 2525]]}, "type": 2, "properties": {"iso_3166_1": "KP-KR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1245}, {"geometry": {"type": "LineString", "coordinates": [[2855, 2580], [2859, 2588], [2884, 2582], [2892, 2595], [2907, 2588], [2949, 2588], [2960, 2579]]}, "type": 2, "properties": {"iso_3166_1": "KG-KZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1248}, {"geometry": {"type": "LineString", "coordinates": [[2885, 2537], [2899, 2553], [2917, 2550], [2921, 2560], [2932, 2560], [2960, 2579]]}, "type": 2, "properties": {"iso_3166_1": "CN-KG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1249}, {"geometry": {"type": "LineString", "coordinates": [[3070, 2383], [3077, 2381]]}, "type": 2, "properties": {"iso_3166_1": "BT-CN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1251}, {"geometry": {"type": "LineString", "coordinates": [[2970, 2409], [2982, 2411], [3026, 2379], [3051, 2379]]}, "type": 2, "properties": {"iso_3166_1": "CN-NP", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1252}, {"geometry": {"type": "LineString", "coordinates": [[2455, 2443], [2453, 2438]]}, "type": 2, "properties": {"iso_3166_1": "IL-JO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1253}, {"geometry": {"type": "LineString", "coordinates": [[2970, 2409], [2959, 2391], [3002, 2372]]}, "type": 2, "properties": {"iso_3166_1": "IN-NP", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1254}, {"geometry": {"type": "LineString", "coordinates": [[3003, 2373], [3018, 2364], [3049, 2359], [3051, 2379]]}, "type": 2, "properties": {"iso_3166_1": "IN-NP", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1255}, {"geometry": {"type": "LineString", "coordinates": [[2023, 2475], [2035, 2434], [2015, 2434], [2006, 2428], [2007, 2416], [1985, 2399], [1961, 2398], [1949, 2389], [1949, 2376]]}, "type": 2, "properties": {"iso_3166_1": "DZ-MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1259}, {"geometry": {"type": "LineString", "coordinates": [[3091, 2377], [3095, 2365], [3069, 2363], [3060, 2371]]}, "type": 2, "properties": {"iso_3166_1": "BT-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1260}, {"geometry": {"type": "LineString", "coordinates": [[2022, 2478], [2023, 2475]]}, "type": 2, "properties": {"iso_3166_1": "DZ-MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1261}, {"geometry": {"type": "LineString", "coordinates": [[3062, 2375], [3060, 2374]]}, "type": 2, "properties": {"iso_3166_1": "BT-CN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1262}, {"geometry": {"type": "LineString", "coordinates": [[3062, 2298], [3058, 2333], [3049, 2338], [3061, 2345], [3050, 2352], [3054, 2363], [3069, 2357], [3070, 2346], [3100, 2341], [3085, 2325], [3090, 2316], [3098, 2326], [3102, 2304]]}, "type": 2, "properties": {"iso_3166_1": "BD-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1264}, {"geometry": {"type": "LineString", "coordinates": [[2180, 2448], [2180, 2439], [2163, 2426], [2165, 2418], [2157, 2409]]}, "type": 2, "properties": {"iso_3166_1": "LY-TN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1265}, {"geometry": {"type": "LineString", "coordinates": [[2952, 2420], [2946, 2423]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1267}, {"geometry": {"type": "LineString", "coordinates": [[2447, 2447], [2455, 2451]]}, "type": 2, "properties": {"iso_3166_1": "IL-LB", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1268}, {"geometry": {"type": "LineString", "coordinates": [[1985, 2167], [1994, 2159], [2012, 2162], [2017, 2156]]}, "type": 2, "properties": {"iso_3166_1": "BF-CI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1269}, {"geometry": {"type": "LineString", "coordinates": [[2309, 2565], [2327, 2569], [2338, 2564], [2348, 2571]]}, "type": 2, "properties": {"iso_3166_1": "BG-GR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1270}, {"geometry": {"type": "LineString", "coordinates": [[2525, 2093], [2514, 2080], [2514, 2039], [2521, 2029]]}, "type": 2, "properties": {"iso_3166_1": "KE-SO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1271}, {"geometry": {"type": "LineString", "coordinates": [[2523, 2027], [2521, 2029]]}, "type": 2, "properties": {"iso_3166_1": "KE-SO", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1272}, {"geometry": {"type": "LineString", "coordinates": [[3156, 2383], [3145, 2387], [3142, 2398], [3125, 2397], [3100, 2377], [3091, 2377]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1273}, {"geometry": {"type": "LineString", "coordinates": [[2306, 2610], [2302, 2604], [2310, 2594], [2302, 2580]]}, "type": 2, "properties": {"iso_3166_1": "BG-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1274}, {"geometry": {"type": "LineString", "coordinates": [[2455, 2443], [2467, 2437], [2489, 2451]]}, "type": 2, "properties": {"iso_3166_1": "JO-SY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1276}, {"geometry": {"type": "LineString", "coordinates": [[2495, 2436], [2489, 2451]]}, "type": 2, "properties": {"iso_3166_1": "IQ-JO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1277}, {"geometry": {"type": "LineString", "coordinates": [[2208, 2198], [2217, 2193], [2219, 2172], [2227, 2162], [2207, 2158], [2220, 2147], [2224, 2134]]}, "type": 2, "properties": {"iso_3166_1": "CM-TD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1278}, {"geometry": {"type": "LineString", "coordinates": [[1985, 2167], [1978, 2165], [1977, 2171], [1957, 2164]]}, "type": 2, "properties": {"iso_3166_1": "CI-ML", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1279}, {"geometry": {"type": "LineString", "coordinates": [[2321, 1923], [2326, 1917], [2336, 1920], [2344, 1911], [2358, 1916], [2378, 1894], [2387, 1894], [2387, 1909], [2383, 1905], [2372, 1912], [2371, 1942], [2377, 1951], [2398, 1954]]}, "type": 2, "properties": {"iso_3166_1": "CD-ZM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1280}, {"geometry": {"type": "LineString", "coordinates": [[2896, 2502], [2912, 2495]]}, "type": 2, "properties": {"iso_3166_1": "CN-PK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1281}, {"geometry": {"type": "LineString", "coordinates": [[2455, 2451], [2455, 2443]]}, "type": 2, "properties": {"iso_3166_1": "IL-SY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1282}, {"geometry": {"type": "LineString", "coordinates": [[1949, 2371], [1993, 2342]]}, "type": 2, "properties": {"iso_3166_1": "DZ-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1284}, {"geometry": {"type": "LineString", "coordinates": [[2185, 2323], [2114, 2274], [2097, 2270]]}, "type": 2, "properties": {"iso_3166_1": "DZ-NE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1285}, {"geometry": {"type": "LineString", "coordinates": [[2452, 2426], [2453, 2438]]}, "type": 2, "properties": {"iso_3166_1": "JO-PS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1286}, {"geometry": {"type": "LineString", "coordinates": [[2446, 2400], [2452, 2426]]}, "type": 2, "properties": {"iso_3166_1": "IL-JO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1287}, {"geometry": {"type": "LineString", "coordinates": [[2146, 2501], [2146, 2504]]}, "type": 2, "properties": {"iso_3166_1": "DZ-TN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1288}, {"geometry": {"type": "LineString", "coordinates": [[2360, 2105], [2371, 2097], [2385, 2101], [2399, 2088]]}, "type": 2, "properties": {"iso_3166_1": "CD-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1289}, {"geometry": {"type": "LineString", "coordinates": [[2457, 2469], [2465, 2463], [2455, 2451]]}, "type": 2, "properties": {"iso_3166_1": "LB-SY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1290}, {"geometry": {"type": "LineString", "coordinates": [[2489, 2451], [2514, 2465], [2518, 2493], [2530, 2503]]}, "type": 2, "properties": {"iso_3166_1": "IQ-SY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1293}, {"geometry": {"type": "LineString", "coordinates": [[2157, 2409], [2161, 2363], [2155, 2357], [2164, 2338], [2180, 2333], [2185, 2323]]}, "type": 2, "properties": {"iso_3166_1": "DZ-LY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1295}, {"geometry": {"type": "LineString", "coordinates": [[2334, 2428], [2329, 2408], [2332, 2305]]}, "type": 2, "properties": {"iso_3166_1": "EG-LY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1296}, {"geometry": {"type": "LineString", "coordinates": [[2334, 2428], [2336, 2430]]}, "type": 2, "properties": {"iso_3166_1": "EG-LY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1297}, {"geometry": {"type": "LineString", "coordinates": [[2219, 2317], [2230, 2323], [2321, 2274]]}, "type": 2, "properties": {"iso_3166_1": "LY-TD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1298}, {"geometry": {"type": "LineString", "coordinates": [[1858, 2233], [1860, 2234]]}, "type": 2, "properties": {"iso_3166_1": "MR-SN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1299}, {"geometry": {"type": "LineString", "coordinates": [[1993, 2342], [2068, 2284], [2085, 2278], [2085, 2268], [2097, 2270]]}, "type": 2, "properties": {"iso_3166_1": "DZ-ML", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1300}, {"geometry": {"type": "LineString", "coordinates": [[2260, 2088], [2249, 2041], [2232, 2023], [2229, 2003], [2215, 1992], [2212, 1999], [2197, 1995]]}, "type": 2, "properties": {"iso_3166_1": "CD-CG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1301}, {"geometry": {"type": "LineString", "coordinates": [[2185, 2323], [2210, 2312], [2219, 2317]]}, "type": 2, "properties": {"iso_3166_1": "LY-NE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1302}, {"geometry": {"type": "LineString", "coordinates": [[2332, 2305], [2332, 2280], [2321, 2280], [2321, 2274]]}, "type": 2, "properties": {"iso_3166_1": "LY-SD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1303}, {"geometry": {"type": "LineString", "coordinates": [[1993, 2342], [1973, 2342], [1985, 2227], [1942, 2229], [1924, 2222], [1917, 2228], [1909, 2218]]}, "type": 2, "properties": {"iso_3166_1": "ML-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1304}, {"geometry": {"type": "LineString", "coordinates": [[1860, 2204], [1877, 2207], [1891, 2202], [1857, 2198]]}, "type": 2, "properties": {"iso_3166_1": "GM-SN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1305}, {"geometry": {"type": "LineString", "coordinates": [[2464, 2212], [2469, 2245], [2487, 2256]]}, "type": 2, "properties": {"iso_3166_1": "ER-SD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1306}, {"geometry": {"type": "LineString", "coordinates": [[2457, 2101], [2495, 2087], [2512, 2097], [2525, 2093]]}, "type": 2, "properties": {"iso_3166_1": "ET-KE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1307}, {"geometry": {"type": "LineString", "coordinates": [[1952, 2134], [1950, 2122], [1964, 2115], [1962, 2098]]}, "type": 2, "properties": {"iso_3166_1": "CI-LR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1308}, {"geometry": {"type": "LineString", "coordinates": [[1911, 2354], [1911, 2323], [1898, 2314], [1900, 2297], [1877, 2297]]}, "type": 2, "properties": {"iso_3166_1": "-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1309}, {"geometry": {"type": "LineString", "coordinates": [[1949, 2371], [1949, 2355], [1915, 2355]]}, "type": 2, "properties": {"iso_3166_1": "-MR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1310}, {"geometry": {"type": "LineString", "coordinates": [[2075, 2184], [2080, 2190], [2089, 2182]]}, "type": 2, "properties": {"iso_3166_1": "BJ-NE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1311}, {"geometry": {"type": "LineString", "coordinates": [[1892, 2193], [1858, 2189]]}, "type": 2, "properties": {"iso_3166_1": "GW-SN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1312}, {"geometry": {"type": "LineString", "coordinates": [[2051, 2221], [2052, 2209], [2063, 2201], [2059, 2198], [2072, 2194], [2075, 2184]]}, "type": 2, "properties": {"iso_3166_1": "BF-NE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1313}, {"geometry": {"type": "LineString", "coordinates": [[2046, 2176], [2053, 2166], [2054, 2126], [2062, 2118]]}, "type": 2, "properties": {"iso_3166_1": "GH-TG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1314}, {"geometry": {"type": "LineString", "coordinates": [[2062, 2118], [2062, 2116]]}, "type": 2, "properties": {"iso_3166_1": "GH-TG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1315}, {"geometry": {"type": "LineString", "coordinates": [[2404, 1786], [2424, 1816], [2424, 1848], [2423, 1855], [2394, 1868]]}, "type": 2, "properties": {"iso_3166_1": "MZ-ZW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1316}, {"geometry": {"type": "LineString", "coordinates": [[2530, 2191], [2539, 2194]]}, "type": 2, "properties": {"iso_3166_1": "DJ-ER", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1317}, {"geometry": {"type": "LineString", "coordinates": [[1919, 2190], [1892, 2193]]}, "type": 2, "properties": {"iso_3166_1": "GN-SN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1318}, {"geometry": {"type": "LineString", "coordinates": [[1892, 2193], [1892, 2182], [1878, 2174]]}, "type": 2, "properties": {"iso_3166_1": "GN-GW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1320}, {"geometry": {"type": "LineString", "coordinates": [[1909, 2218], [1919, 2190]]}, "type": 2, "properties": {"iso_3166_1": "ML-SN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1321}, {"geometry": {"type": "LineString", "coordinates": [[2146, 2104], [2143, 2098]]}, "type": 2, "properties": {"iso_3166_1": "CM-NG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1322}, {"geometry": {"type": "LineString", "coordinates": [[2399, 2088], [2435, 2096]]}, "type": 2, "properties": {"iso_3166_1": "SS-UG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1323}, {"geometry": {"type": "LineString", "coordinates": [[2219, 2317], [2230, 2285], [2224, 2243], [2201, 2214], [2203, 2205]]}, "type": 2, "properties": {"iso_3166_1": "NE-TD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1324}, {"geometry": {"type": "LineString", "coordinates": [[2126, 2636], [2130, 2629], [2123, 2624], [2129, 2617], [2126, 2612], [2136, 2608], [2134, 2603]]}, "type": 2, "properties": {"iso_3166_1": "FR-IT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1325}, {"geometry": {"type": "LineString", "coordinates": [[2017, 2156], [2020, 2142], [2011, 2126], [2017, 2112], [2013, 2106]]}, "type": 2, "properties": {"iso_3166_1": "CI-GH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1326}, {"geometry": {"type": "LineString", "coordinates": [[2208, 2198], [2215, 2181], [2204, 2174], [2183, 2129], [2178, 2122], [2168, 2130], [2159, 2125], [2146, 2104]]}, "type": 2, "properties": {"iso_3166_1": "CM-NG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1327}, {"geometry": {"type": "LineString", "coordinates": [[2058, 2174], [2066, 2153], [2067, 2119]]}, "type": 2, "properties": {"iso_3166_1": "BJ-TG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1328}, {"geometry": {"type": "LineString", "coordinates": [[2046, 2176], [2016, 2174], [2017, 2156]]}, "type": 2, "properties": {"iso_3166_1": "BF-GH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1329}, {"geometry": {"type": "LineString", "coordinates": [[2046, 2176], [2058, 2174]]}, "type": 2, "properties": {"iso_3166_1": "BF-TG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1334}, {"geometry": {"type": "LineString", "coordinates": [[2464, 2212], [2436, 2157]]}, "type": 2, "properties": {"iso_3166_1": "ET-SD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1335}, {"geometry": {"type": "LineString", "coordinates": [[2308, 2173], [2318, 2159]]}, "type": 2, "properties": {"iso_3166_1": "CF-SD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1336}, {"geometry": {"type": "LineString", "coordinates": [[2075, 2184], [2058, 2174]]}, "type": 2, "properties": {"iso_3166_1": "BF-BJ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1338}, {"geometry": {"type": "LineString", "coordinates": [[2051, 2221], [2040, 2222], [2016, 2210], [2009, 2199], [2001, 2202], [1998, 2189], [1987, 2184], [1985, 2167]]}, "type": 2, "properties": {"iso_3166_1": "BF-ML", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1339}, {"geometry": {"type": "LineString", "coordinates": [[2089, 2182], [2092, 2169], [2079, 2149], [2079, 2121]]}, "type": 2, "properties": {"iso_3166_1": "BJ-NG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1341}, {"geometry": {"type": "LineString", "coordinates": [[2079, 2121], [2079, 2118]]}, "type": 2, "properties": {"iso_3166_1": "BJ-NG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1342}, {"geometry": {"type": "LineString", "coordinates": [[2097, 2270], [2092, 2229], [2051, 2221]]}, "type": 2, "properties": {"iso_3166_1": "ML-NE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1344}, {"geometry": {"type": "LineString", "coordinates": [[2203, 2205], [2190, 2198], [2178, 2202], [2150, 2195], [2140, 2201], [2127, 2197], [2111, 2208], [2095, 2203], [2089, 2182]]}, "type": 2, "properties": {"iso_3166_1": "NE-NG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1345}, {"geometry": {"type": "LineString", "coordinates": [[2425, 2305], [2332, 2305]]}, "type": 2, "properties": {"iso_3166_1": "EG-SD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1346}, {"geometry": {"type": "LineString", "coordinates": [[2322, 2159], [2343, 2167], [2348, 2157], [2366, 2158]]}, "type": 2, "properties": {"iso_3166_1": "SD-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1347}, {"geometry": {"type": "LineString", "coordinates": [[2378, 2159], [2389, 2166], [2404, 2160], [2417, 2174], [2413, 2185], [2427, 2188], [2426, 2171], [2436, 2157]]}, "type": 2, "properties": {"iso_3166_1": "SD-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1348}, {"geometry": {"type": "LineString", "coordinates": [[2308, 2173], [2304, 2193], [2296, 2195], [2309, 2227], [2321, 2229], [2321, 2274]]}, "type": 2, "properties": {"iso_3166_1": "SD-TD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1349}, {"geometry": {"type": "LineString", "coordinates": [[2335, 1842], [2346, 1821], [2363, 1809], [2366, 1797], [2382, 1789]]}, "type": 2, "properties": {"iso_3166_1": "BW-ZW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1351}, {"geometry": {"type": "LineString", "coordinates": [[2260, 2088], [2238, 2088], [2232, 2073]]}, "type": 2, "properties": {"iso_3166_1": "CF-CG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1352}, {"geometry": {"type": "LineString", "coordinates": [[2360, 2105], [2338, 2109], [2315, 2100], [2309, 2103], [2301, 2095], [2282, 2098], [2270, 2107], [2259, 2097], [2260, 2088]]}, "type": 2, "properties": {"iso_3166_1": "CD-CF", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1353}, {"geometry": {"type": "LineString", "coordinates": [[2224, 2134], [2212, 2117], [2213, 2108], [2232, 2073]]}, "type": 2, "properties": {"iso_3166_1": "CF-CM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1354}, {"geometry": {"type": "LineString", "coordinates": [[2436, 2157], [2436, 2146], [2423, 2139], [2446, 2123], [2457, 2101]]}, "type": 2, "properties": {"iso_3166_1": "ET-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1355}, {"geometry": {"type": "LineString", "coordinates": [[2541, 2195], [2544, 2192]]}, "type": 2, "properties": {"iso_3166_1": "DJ-YE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1356}, {"geometry": {"type": "LineString", "coordinates": [[2318, 2159], [2315, 2148], [2335, 2138], [2360, 2105]]}, "type": 2, "properties": {"iso_3166_1": "CF-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1357}, {"geometry": {"type": "LineString", "coordinates": [[2160, 2075], [2177, 2073]]}, "type": 2, "properties": {"iso_3166_1": "CM-GQ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1359}, {"geometry": {"type": "LineString", "coordinates": [[2152, 2091], [2148, 2093]]}, "type": 2, "properties": {"iso_3166_1": "CM-GQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1360}, {"geometry": {"type": "LineString", "coordinates": [[2160, 2075], [2157, 2076]]}, "type": 2, "properties": {"iso_3166_1": "CM-GQ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1361}, {"geometry": {"type": "LineString", "coordinates": [[2378, 2017], [2383, 1997]]}, "type": 2, "properties": {"iso_3166_1": "BI-CD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1362}, {"geometry": {"type": "LineString", "coordinates": [[2197, 1995], [2187, 1982]]}, "type": 2, "properties": {"iso_3166_1": "AO-CD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1363}, {"geometry": {"type": "LineString", "coordinates": [[2321, 1923], [2301, 1919], [2296, 1965], [2270, 1968], [2269, 1957], [2248, 1955], [2237, 1981], [2189, 1979]]}, "type": 2, "properties": {"iso_3166_1": "AO-CD", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1364}, {"geometry": {"type": "LineString", "coordinates": [[2177, 2073], [2199, 2073]]}, "type": 2, "properties": {"iso_3166_1": "CM-GA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1366}, {"geometry": {"type": "LineString", "coordinates": [[2232, 2073], [2232, 2067], [2199, 2073]]}, "type": 2, "properties": {"iso_3166_1": "CG-CM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1368}, {"geometry": {"type": "LineString", "coordinates": [[2383, 1997], [2384, 1976], [2398, 1954]]}, "type": 2, "properties": {"iso_3166_1": "CD-TZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1369}, {"geometry": {"type": "LineString", "coordinates": [[2885, 2537], [2888, 2525], [2898, 2522], [2900, 2505]]}, "type": 2, "properties": {"iso_3166_1": "CN-TJ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1370}, {"geometry": {"type": "LineString", "coordinates": [[2426, 1887], [2392, 1875], [2394, 1868]]}, "type": 2, "properties": {"iso_3166_1": "MZ-ZM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1371}, {"geometry": {"type": "LineString", "coordinates": [[2530, 2191], [2524, 2174], [2537, 2174]]}, "type": 2, "properties": {"iso_3166_1": "DJ-ET", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1373}, {"geometry": {"type": "LineString", "coordinates": [[2464, 2212], [2475, 2211], [2479, 2219], [2505, 2215], [2530, 2191]]}, "type": 2, "properties": {"iso_3166_1": "ER-ET", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1374}, {"geometry": {"type": "LineString", "coordinates": [[2197, 1995], [2193, 1998], [2185, 1991]]}, "type": 2, "properties": {"iso_3166_1": "AO-CG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1376}, {"geometry": {"type": "LineString", "coordinates": [[2385, 2032], [2389, 2058], [2404, 2072], [2398, 2076], [2399, 2088]]}, "type": 2, "properties": {"iso_3166_1": "CD-UG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1377}, {"geometry": {"type": "LineString", "coordinates": [[2435, 2096], [2446, 2066], [2436, 2055], [2434, 2037]]}, "type": 2, "properties": {"iso_3166_1": "KE-UG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1378}, {"geometry": {"type": "LineString", "coordinates": [[2434, 2037], [2395, 2036]]}, "type": 2, "properties": {"iso_3166_1": "TZ-UG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1379}, {"geometry": {"type": "LineString", "coordinates": [[2494, 1995], [2476, 2008], [2477, 2013], [2434, 2037]]}, "type": 2, "properties": {"iso_3166_1": "KE-TZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1381}, {"geometry": {"type": "LineString", "coordinates": [[2499, 1995], [2494, 1995]]}, "type": 2, "properties": {"iso_3166_1": "KE-TZ", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1382}, {"geometry": {"type": "LineString", "coordinates": [[2435, 2096], [2439, 2101]]}, "type": 2, "properties": {"iso_3166_1": "KE-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1383}, {"geometry": {"type": "LineString", "coordinates": [[2454, 2101], [2457, 2101]]}, "type": 2, "properties": {"iso_3166_1": "KE-SS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1384}, {"geometry": {"type": "LineString", "coordinates": [[2315, 1844], [2298, 1861], [2298, 1899], [2322, 1899], [2321, 1923]]}, "type": 2, "properties": {"iso_3166_1": "AO-ZM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1385}, {"geometry": {"type": "LineString", "coordinates": [[2383, 1997], [2399, 2011], [2396, 2021]]}, "type": 2, "properties": {"iso_3166_1": "BI-TZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1386}, {"geometry": {"type": "LineString", "coordinates": [[2398, 1954], [2423, 1941]]}, "type": 2, "properties": {"iso_3166_1": "TZ-ZM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1387}, {"geometry": {"type": "LineString", "coordinates": [[2446, 1915], [2474, 1914], [2508, 1928]]}, "type": 2, "properties": {"iso_3166_1": "MZ-TZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1388}, {"geometry": {"type": "LineString", "coordinates": [[2537, 2174], [2538, 2161], [2549, 2151], [2594, 2139], [2560, 2104], [2525, 2093]]}, "type": 2, "properties": {"iso_3166_1": "ET-SO", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1390}, {"geometry": {"type": "LineString", "coordinates": [[2315, 1844], [2285, 1839], [2258, 1847], [2182, 1849]]}, "type": 2, "properties": {"iso_3166_1": "AO-NA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1391}, {"geometry": {"type": "LineString", "coordinates": [[2315, 1844], [2335, 1842]]}, "type": 2, "properties": {"iso_3166_1": "NA-ZM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1392}, {"geometry": {"type": "LineString", "coordinates": [[2426, 1887], [2420, 1892], [2430, 1906], [2426, 1923], [2431, 1927], [2423, 1941]]}, "type": 2, "properties": {"iso_3166_1": "MW-ZM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1393}, {"geometry": {"type": "LineString", "coordinates": [[2423, 1941], [2439, 1936], [2446, 1915]]}, "type": 2, "properties": {"iso_3166_1": "MW-TZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1395}, {"geometry": {"type": "LineString", "coordinates": [[2394, 1868], [2377, 1864], [2352, 1839], [2335, 1842]]}, "type": 2, "properties": {"iso_3166_1": "ZM-ZW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1396}, {"geometry": {"type": "LineString", "coordinates": [[2237, 2647], [2225, 2641], [2223, 2630], [2204, 2630]]}, "type": 2, "properties": {"iso_3166_1": "HR-SI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1397}, {"geometry": {"type": "LineString", "coordinates": [[2805, 2507], [2805, 2517], [2759, 2545], [2752, 2562], [2733, 2565], [2731, 2579], [2715, 2588], [2710, 2585], [2714, 2580], [2708, 2583], [2699, 2577], [2697, 2564], [2685, 2565]]}, "type": 2, "properties": {"iso_3166_1": "TM-UZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1400}, {"geometry": {"type": "LineString", "coordinates": [[2900, 2505], [2882, 2508], [2864, 2497], [2863, 2515], [2853, 2523], [2837, 2503], [2819, 2504]]}, "type": 2, "properties": {"iso_3166_1": "AF-TJ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1401}, {"geometry": {"type": "LineString", "coordinates": [[2856, 2549], [2848, 2551], [2854, 2556], [2850, 2561], [2837, 2557], [2837, 2548], [2828, 2547], [2833, 2548], [2828, 2539], [2815, 2539], [2826, 2520], [2819, 2504]]}, "type": 2, "properties": {"iso_3166_1": "TJ-UZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1403}, {"geometry": {"type": "LineString", "coordinates": [[2685, 2565], [2685, 2623], [2715, 2632], [2753, 2599], [2788, 2602], [2800, 2590], [2799, 2575], [2805, 2574], [2807, 2562], [2821, 2563], [2827, 2554], [2833, 2566], [2855, 2580]]}, "type": 2, "properties": {"iso_3166_1": "KZ-UZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1405}, {"geometry": {"type": "LineString", "coordinates": [[2645, 2572], [2665, 2581], [2679, 2564], [2685, 2565]]}, "type": 2, "properties": {"iso_3166_1": "KZ-TM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1406}, {"geometry": {"type": "LineString", "coordinates": [[2019, 2693], [2024, 2697]]}, "type": 2, "properties": {"iso_3166_1": "GG-JE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1407}, {"geometry": {"type": "LineString", "coordinates": [[2960, 2579], [2967, 2598], [2957, 2621], [2978, 2629], [2986, 2625], [2993, 2659], [3021, 2656], [3021, 2675], [3041, 2691]]}, "type": 2, "properties": {"iso_3166_1": "CN-KZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1408}, {"geometry": {"type": "LineString", "coordinates": [[2204, 2630], [2202, 2631]]}, "type": 2, "properties": {"iso_3166_1": "HR-SI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1409}, {"geometry": {"type": "LineString", "coordinates": [[2819, 2504], [2805, 2507]]}, "type": 2, "properties": {"iso_3166_1": "AF-UZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1410}, {"geometry": {"type": "LineString", "coordinates": [[2019, 2693], [2014, 2695]]}, "type": 2, "properties": {"iso_3166_1": "FR-GG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1411}, {"geometry": {"type": "LineString", "coordinates": [[2262, 2637], [2269, 2626], [2264, 2620]]}, "type": 2, "properties": {"iso_3166_1": "HR-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1412}, {"geometry": {"type": "LineString", "coordinates": [[2258, 2584], [2232, 2610], [2227, 2625], [2264, 2620]]}, "type": 2, "properties": {"iso_3166_1": "BA-HR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1413}, {"geometry": {"type": "LineString", "coordinates": [[1335, 1788], [1346, 1820], [1376, 1824], [1386, 1814]]}, "type": 2, "properties": {"iso_3166_1": "BO-PY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1415}, {"geometry": {"type": "LineString", "coordinates": [[1256, 1923], [1267, 1905], [1258, 1868], [1265, 1860], [1258, 1846]]}, "type": 2, "properties": {"iso_3166_1": "BO-PE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1416}, {"geometry": {"type": "LineString", "coordinates": [[2905, 2437], [2866, 2380], [2854, 2376], [2850, 2381], [2840, 2370], [2857, 2334], [2830, 2334]]}, "type": 2, "properties": {"iso_3166_1": "IN-PK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1418}, {"geometry": {"type": "LineString", "coordinates": [[2204, 2647], [2204, 2632]]}, "type": 2, "properties": {"iso_3166_1": "IT-SI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1419}, {"geometry": {"type": "LineString", "coordinates": [[2900, 2505], [2896, 2502]]}, "type": 2, "properties": {"iso_3166_1": "AF-CN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1420}, {"geometry": {"type": "LineString", "coordinates": [[2928, 2481], [2935, 2481]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1421}, {"geometry": {"type": "LineString", "coordinates": [[3385, 2222], [3391, 2222], [3385, 2222]]}, "type": 2, "properties": {"iso_3166_1": "CN-PH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1422}, {"geometry": {"type": "LineString", "coordinates": [[2950, 2440], [2941, 2441], [2941, 2436]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1423}, {"geometry": {"type": "LineString", "coordinates": [[2946, 2423], [2943, 2430]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1424}, {"geometry": {"type": "LineString", "coordinates": [[2944, 2431], [2944, 2432]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1425}, {"geometry": {"type": "LineString", "coordinates": [[2946, 2451], [2949, 2449]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1426}, {"geometry": {"type": "LineString", "coordinates": [[2922, 2483], [2928, 2481]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1427}, {"geometry": {"type": "LineString", "coordinates": [[2955, 2419], [2952, 2420]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1429}, {"geometry": {"type": "LineString", "coordinates": [[2970, 2409], [2961, 2414]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1430}, {"geometry": {"type": "LineString", "coordinates": [[3051, 2379], [3058, 2381], [3060, 2371]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1431}, {"geometry": {"type": "LineString", "coordinates": [[2935, 2481], [2939, 2468], [2947, 2464], [2946, 2451]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1433}, {"geometry": {"type": "LineString", "coordinates": [[2941, 2436], [2944, 2432]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1434}, {"geometry": {"type": "LineString", "coordinates": [[2949, 2449], [2950, 2440]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1435}, {"geometry": {"type": "LineString", "coordinates": [[2961, 2414], [2955, 2419]]}, "type": 2, "properties": {"iso_3166_1": "CN-IN", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1436}, {"geometry": {"type": "LineString", "coordinates": [[2912, 2495], [2914, 2485], [2922, 2483]]}, "type": 2, "properties": {"iso_3166_1": "CN-PK", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1437}, {"geometry": {"type": "LineString", "coordinates": [[1427, 1747], [1425, 1733], [1414, 1723], [1381, 1725], [1391, 1752], [1354, 1769], [1335, 1788]]}, "type": 2, "properties": {"iso_3166_1": "AR-PY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1438}, {"geometry": {"type": "LineString", "coordinates": [[1346, 2173], [1342, 2163], [1352, 2161]]}, "type": 2, "properties": {"iso_3166_1": "TT-VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1441}, {"geometry": {"type": "LineString", "coordinates": [[1255, 2189], [1250, 2190]]}, "type": 2, "properties": {"iso_3166_1": "NL-VE", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1442}, {"geometry": {"type": "LineString", "coordinates": [[2441, 2376], [2445, 2398]]}, "type": 2, "properties": {"iso_3166_1": "EG-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1443}, {"geometry": {"type": "LineString", "coordinates": [[1392, 1687], [1383, 1637], [1389, 1627], [1412, 1614]]}, "type": 2, "properties": {"iso_3166_1": "AR-UY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1444}, {"geometry": {"type": "LineString", "coordinates": [[1216, 1404], [1218, 1393], [1212, 1393]]}, "type": 2, "properties": {"iso_3166_1": "AR-XH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1458}, {"geometry": {"type": "LineString", "coordinates": [[1073, 2175], [1096, 2173]]}, "type": 2, "properties": {"iso_3166_1": "CR-NI", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1459}, {"geometry": {"type": "LineString", "coordinates": [[1964, 2504], [1964, 2501]]}, "type": 2, "properties": {"iso_3166_1": "ES-PT", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1461}, {"geometry": {"type": "LineString", "coordinates": [[1406, 2070], [1387, 2095], [1398, 2115]]}, "type": 2, "properties": {"iso_3166_1": "GY-SR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1462}, {"geometry": {"type": "LineString", "coordinates": [[2905, 2437], [2890, 2449], [2893, 2459], [2887, 2465], [2893, 2471], [2920, 2470], [2925, 2474], [2922, 2483]]}, "type": 2, "properties": {"iso_3166_1": "IN-PK", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1463}, {"geometry": {"type": "LineString", "coordinates": [[1434, 2114], [1428, 2104], [1434, 2087], [1427, 2075]]}, "type": 2, "properties": {"iso_3166_1": "FR-SR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1464}, {"geometry": {"type": "LineString", "coordinates": [[1434, 2114], [1435, 2116]]}, "type": 2, "properties": {"iso_3166_1": "FR-SR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1465}, {"geometry": {"type": "LineString", "coordinates": [[1947, 2573], [1955, 2578], [1955, 2573], [1974, 2575], [1978, 2569], [1969, 2561], [1968, 2540], [1962, 2540], [1969, 2531], [1964, 2504]]}, "type": 2, "properties": {"iso_3166_1": "ES-PT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1466}, {"geometry": {"type": "LineString", "coordinates": [[2830, 2334], [2830, 2329]]}, "type": 2, "properties": {"iso_3166_1": "IN-PK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1467}, {"geometry": {"type": "LineString", "coordinates": [[2621, 2379], [2617, 2379]]}, "type": 2, "properties": {"iso_3166_1": "IR-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1468}, {"geometry": {"type": "LineString", "coordinates": [[1105, 2140], [1104, 2156], [1109, 2157]]}, "type": 2, "properties": {"iso_3166_1": "CR-PA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1469}, {"geometry": {"type": "LineString", "coordinates": [[2644, 2340], [2645, 2342]]}, "type": 2, "properties": {"iso_3166_1": "AE-QA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1470}, {"geometry": {"type": "LineString", "coordinates": [[2626, 2339], [2623, 2349]]}, "type": 2, "properties": {"iso_3166_1": "QA-SA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1471}, {"geometry": {"type": "LineString", "coordinates": [[1031, 2214], [1049, 2208], [1049, 2202]]}, "type": 2, "properties": {"iso_3166_1": "HN-SV", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1472}, {"geometry": {"type": "LineString", "coordinates": [[1049, 2202], [1052, 2199]]}, "type": 2, "properties": {"iso_3166_1": "HN-SV", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1473}, {"geometry": {"type": "LineString", "coordinates": [[1044, 2229], [1031, 2214]]}, "type": 2, "properties": {"iso_3166_1": "GT-HN", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1474}, {"geometry": {"type": "LineString", "coordinates": [[1045, 2232], [1044, 2229]]}, "type": 2, "properties": {"iso_3166_1": "GT-HN", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1475}, {"geometry": {"type": "LineString", "coordinates": [[2623, 2349], [2627, 2357]]}, "type": 2, "properties": {"iso_3166_1": "BH-QA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1476}, {"geometry": {"type": "LineString", "coordinates": [[1036, 2231], [1034, 2254]]}, "type": 2, "properties": {"iso_3166_1": "BZ-GT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1477}, {"geometry": {"type": "LineString", "coordinates": [[2741, 2404], [2752, 2387], [2762, 2384], [2762, 2370], [2769, 2369], [2752, 2358], [2749, 2344]]}, "type": 2, "properties": {"iso_3166_1": "IR-PK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1478}, {"geometry": {"type": "LineString", "coordinates": [[2634, 2337], [2626, 2339]]}, "type": 2, "properties": {"iso_3166_1": "QA-SA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1479}, {"geometry": {"type": "LineString", "coordinates": [[2745, 2482], [2736, 2462], [2741, 2454], [2737, 2447], [2740, 2426], [2752, 2420], [2741, 2404]]}, "type": 2, "properties": {"iso_3166_1": "AF-IR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1480}, {"geometry": {"type": "LineString", "coordinates": [[2741, 2404], [2759, 2398], [2802, 2404], [2803, 2419], [2824, 2430], [2832, 2427], [2840, 2448], [2848, 2451], [2843, 2460], [2857, 2461], [2864, 2476], [2858, 2488], [2862, 2493], [2896, 2502]]}, "type": 2, "properties": {"iso_3166_1": "AF-PK", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1481}, {"geometry": {"type": "LineString", "coordinates": [[3464, 1943], [3459, 1941]]}, "type": 2, "properties": {"iso_3166_1": "ID-TL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1482}, {"geometry": {"type": "LineString", "coordinates": [[2823, 2324], [2830, 2329]]}, "type": 2, "properties": {"iso_3166_1": "IN-PK", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1483}, {"geometry": {"type": "LineString", "coordinates": [[3470, 1946], [3471, 1940]]}, "type": 2, "properties": {"iso_3166_1": "ID-TL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1485}, {"geometry": {"type": "LineString", "coordinates": [[3480, 1954], [3470, 1946]]}, "type": 2, "properties": {"iso_3166_1": "ID-TL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1486}, {"geometry": {"type": "LineString", "coordinates": [[2558, 2504], [2564, 2487], [2575, 2485], [2565, 2459], [2572, 2446], [2589, 2437], [2591, 2419], [2601, 2405]]}, "type": 2, "properties": {"iso_3166_1": "IQ-IR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1487}, {"geometry": {"type": "LineString", "coordinates": [[3226, 2062], [3233, 2063]]}, "type": 2, "properties": {"iso_3166_1": "ID-SG", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1488}, {"geometry": {"type": "LineString", "coordinates": [[2577, 2529], [2578, 2539], [2567, 2545], [2571, 2549], [2560, 2565]]}, "type": 2, "properties": {"iso_3166_1": "AM-AZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1489}, {"geometry": {"type": "LineString", "coordinates": [[3389, 2095], [3366, 2098], [3351, 2064], [3328, 2066], [3305, 2058], [3296, 2072]]}, "type": 2, "properties": {"iso_3166_1": "ID-MY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1490}, {"geometry": {"type": "LineString", "coordinates": [[3198, 2080], [3224, 2062]]}, "type": 2, "properties": {"iso_3166_1": "ID-MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1491}, {"geometry": {"type": "LineString", "coordinates": [[3238, 2064], [3233, 2063]]}, "type": 2, "properties": {"iso_3166_1": "ID-MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1492}, {"geometry": {"type": "LineString", "coordinates": [[3394, 2095], [3389, 2095]]}, "type": 2, "properties": {"iso_3166_1": "ID-MY", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1493}, {"geometry": {"type": "LineString", "coordinates": [[3224, 2062], [3226, 2062]]}, "type": 2, "properties": {"iso_3166_1": "ID-MY", "admin_level": 2, "disputed": 1, "maritime": 1}, "id": 1494}, {"geometry": {"type": "LineString", "coordinates": [[3652, 2018], [3652, 1944]]}, "type": 2, "properties": {"iso_3166_1": "ID-PG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1495}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2192], [1346, 2192]]}, "type": 2, "properties": {"iso_3166_1": "GD-VC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1496}, {"geometry": {"type": "LineString", "coordinates": [[1354, 2203], [1352, 2204]]}, "type": 2, "properties": {"iso_3166_1": "LC-VC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1497}, {"geometry": {"type": "LineString", "coordinates": [[2599, 2404], [2584, 2406], [2578, 2394]]}, "type": 2, "properties": {"iso_3166_1": "IQ-KW", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1498}, {"geometry": {"type": "LineString", "coordinates": [[1352, 2222], [1350, 2221]]}, "type": 2, "properties": {"iso_3166_1": "DM-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1499}, {"geometry": {"type": "LineString", "coordinates": [[2689, 2342], [2683, 2341], [2685, 2330], [2679, 2329], [2676, 2313]]}, "type": 2, "properties": {"iso_3166_1": "AE-OM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1500}, {"geometry": {"type": "LineString", "coordinates": [[2495, 2436], [2537, 2416], [2557, 2396], [2578, 2394]]}, "type": 2, "properties": {"iso_3166_1": "IQ-SA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1501}, {"geometry": {"type": "LineString", "coordinates": [[1232, 2277], [1232, 2257]]}, "type": 2, "properties": {"iso_3166_1": "DO-HT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1502}, {"geometry": {"type": "LineString", "coordinates": [[1240, 2294], [1238, 2292]]}, "type": 2, "properties": {"iso_3166_1": "DO-TC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1503}, {"geometry": {"type": "LineString", "coordinates": [[2573, 2528], [2577, 2529]]}, "type": 2, "properties": {"iso_3166_1": "AM-IR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1505}, {"geometry": {"type": "LineString", "coordinates": [[2558, 2540], [2573, 2528]]}, "type": 2, "properties": {"iso_3166_1": "AZ-IR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1506}, {"geometry": {"type": "LineString", "coordinates": [[2640, 2268], [2607, 2264], [2585, 2244], [2541, 2251], [2535, 2237]]}, "type": 2, "properties": {"iso_3166_1": "SA-YE", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1507}, {"geometry": {"type": "LineString", "coordinates": [[2578, 2394], [2599, 2387]]}, "type": 2, "properties": {"iso_3166_1": "KW-SA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1508}, {"geometry": {"type": "LineString", "coordinates": [[2028, 2597], [2041, 2588], [2064, 2585]]}, "type": 2, "properties": {"iso_3166_1": "ES-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1509}, {"geometry": {"type": "LineString", "coordinates": [[2015, 2477], [2020, 2479]]}, "type": 2, "properties": {"iso_3166_1": "ES-MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1510}, {"geometry": {"type": "LineString", "coordinates": [[2686, 2355], [2688, 2350]]}, "type": 2, "properties": {"iso_3166_1": "AE-OM", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1511}, {"geometry": {"type": "LineString", "coordinates": [[2686, 2355], [2684, 2356]]}, "type": 2, "properties": {"iso_3166_1": "AE-OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1514}, {"geometry": {"type": "LineString", "coordinates": [[2691, 2351], [2688, 2350]]}, "type": 2, "properties": {"iso_3166_1": "AE-OM", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1515}, {"geometry": {"type": "LineString", "coordinates": [[2421, 2469], [2424, 2469]]}, "type": 2, "properties": {"iso_3166_1": "-CY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1516}, {"geometry": {"type": "LineString", "coordinates": [[2573, 2528], [2569, 2539], [2557, 2541]]}, "type": 2, "properties": {"iso_3166_1": "AM-AZ", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1517}, {"geometry": {"type": "LineString", "coordinates": [[2431, 2473], [2434, 2473]]}, "type": 2, "properties": {"iso_3166_1": "-CY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1518}, {"geometry": {"type": "LineString", "coordinates": [[1169, 2305], [1152, 2315]]}, "type": 2, "properties": {"iso_3166_1": "BS-CU", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1520}, {"geometry": {"type": "LineString", "coordinates": [[2128, 2638], [2126, 2636]]}, "type": 2, "properties": {"iso_3166_1": "FR-IT", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1521}, {"geometry": {"type": "LineString", "coordinates": [[3227, 2062], [3233, 2063]]}, "type": 2, "properties": {"iso_3166_1": "MY-SG", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1522}, {"geometry": {"type": "LineString", "coordinates": [[1341, 2244], [1343, 2242]]}, "type": 2, "properties": {"iso_3166_1": "AG-MS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1523}, {"geometry": {"type": "LineString", "coordinates": [[1205, 3531], [1216, 3559], [1212, 3582], [1250, 3615], [1271, 3664], [1292, 3692]]}, "type": 2, "properties": {"iso_3166_1": "CA-GL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1524}, {"geometry": {"type": "LineString", "coordinates": [[1031, 2214], [1023, 2206]]}, "type": 2, "properties": {"iso_3166_1": "GT-SV", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1525}, {"geometry": {"type": "LineString", "coordinates": [[3358, 2104], [3361, 2097], [3357, 2103]]}, "type": 2, "properties": {"iso_3166_1": "BN-MY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1526}, {"geometry": {"type": "LineString", "coordinates": [[2438, 2422], [2440, 2427]]}, "type": 2, "properties": {"iso_3166_1": "IL-PS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1527}, {"geometry": {"type": "LineString", "coordinates": [[2452, 2426], [2445, 2424], [2448, 2429]]}, "type": 2, "properties": {"iso_3166_1": "IL-PS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1528}, {"geometry": {"type": "LineString", "coordinates": [[2448, 2430], [2447, 2439], [2453, 2438]]}, "type": 2, "properties": {"iso_3166_1": "IL-PS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1529}, {"geometry": {"type": "LineString", "coordinates": [[2436, 2426], [2437, 2424]]}, "type": 2, "properties": {"iso_3166_1": "EG-PS", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1530}, {"geometry": {"type": "LineString", "coordinates": [[2280, 2588], [2282, 2594], [2289, 2593], [2296, 2587], [2294, 2580]]}, "type": 2, "properties": {"iso_3166_1": "RS-XK", "admin_level": 2, "disputed": 1, "maritime": 0}, "id": 1531}, {"geometry": {"type": "LineString", "coordinates": [[2264, 2620], [2271, 2608], [2267, 2599]]}, "type": 2, "properties": {"iso_3166_1": "BA-RS", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1532}, {"geometry": {"type": "LineString", "coordinates": [[3187, 2121], [3188, 2125], [3199, 2119], [3199, 2112], [3210, 2119]]}, "type": 2, "properties": {"iso_3166_1": "MY-TH", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1534}, {"geometry": {"type": "LineString", "coordinates": [[3357, 2104], [3352, 2094], [3346, 2100]]}, "type": 2, "properties": {"iso_3166_1": "BN-MY", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1535}, {"geometry": {"type": "LineString", "coordinates": [[2114, 2699], [2120, 2698]]}, "type": 2, "properties": {"iso_3166_1": "FR-LU", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1536}, {"geometry": {"type": "LineString", "coordinates": [[2027, 2600], [2028, 2597]]}, "type": 2, "properties": {"iso_3166_1": "ES-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1538}, {"geometry": {"type": "LineString", "coordinates": [[2084, 2582], [2087, 2582]]}, "type": 2, "properties": {"iso_3166_1": "ES-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1539}, {"geometry": {"type": "LineString", "coordinates": [[2133, 2603], [2132, 2602]]}, "type": 2, "properties": {"iso_3166_1": "FR-MC", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1540}, {"geometry": {"type": "LineString", "coordinates": [[2133, 2603], [2134, 2599]]}, "type": 2, "properties": {"iso_3166_1": "FR-MC", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1541}, {"geometry": {"type": "LineString", "coordinates": [[2068, 2583], [2084, 2582]]}, "type": 2, "properties": {"iso_3166_1": "ES-FR", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1544}, {"geometry": {"type": "LineString", "coordinates": [[2014, 2478], [2015, 2477]]}, "type": 2, "properties": {"iso_3166_1": "ES-MA", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1546}, {"geometry": {"type": "LineString", "coordinates": [[1979, 2487], [1987, 2486]]}, "type": 2, "properties": {"iso_3166_1": "ES-MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1547}, {"geometry": {"type": "LineString", "coordinates": [[1991, 2485], [1987, 2486]]}, "type": 2, "properties": {"iso_3166_1": "ES-MA", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1548}, {"geometry": {"type": "LineString", "coordinates": [[1366, 3801], [1341, 3772], [1293, 3693]]}, "type": 2, "properties": {"iso_3166_1": "CA-GL", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1549}, {"geometry": {"type": "LineString", "coordinates": [[1405, 2661], [1412, 2649]]}, "type": 2, "properties": {"iso_3166_1": "CA-FR", "admin_level": 2, "disputed": 0, "maritime": 1}, "id": 1550}, {"geometry": {"type": "LineString", "coordinates": [[2445, 2399], [2438, 2422]]}, "type": 2, "properties": {"iso_3166_1": "EG-IL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1551}, {"geometry": {"type": "LineString", "coordinates": [[1331, 2257], [1330, 2257]]}, "type": 2, "properties": {"iso_3166_1": "FR-NL", "admin_level": 2, "disputed": 0, "maritime": 0}, "id": 1552}], "extent": 4096}}python-asciimatics-1.15.0/samples/mapscache/1.0.0.jpg000066400000000000000000000327431511423144500221450ustar00rootroot00000000000000JFIFC  !"$"$C" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? g]0IA(&IGjRAjW `9M14:Q@ )sMijqs@ '4T)6R2iy*H.&))SO3N¸sU椐Q6RBR)֤G"i'Q I'R@Fi\vJ34Uv"(P(\mp9>bcɢ pAN J5|9iUI{g}?*$?uN(vJ쓆 -}3-ᇇ4}:[ɗ.y s:T==D5MmQ,i q猌c_Y/(u>#NXM "Mg`N+%%tERu8^5= XoH>%U y9dv1#އ$ F5F-?IS$=4?٧Vi6Z>W̵IJF5sP5=BAy1"4I'h^#Ix¶uլ,D?y)o]t4|>kQ6i=욂 XEe߯ҼǞ|[S Wڶu xX*ì**bT*Kvnk> |0Ϸn.oS;Jח/Pr@g۾kc(_WHOJakw<9KꐬsznViWwWBOu9<lzmí+FhB>j22u =qBWfMm`tf9?|x;+; mBKƑnOe8'5ROkž9[Ye@Y9$G8^o[!es,vvԇ.3rJ8ۀ02GňŨٴa}, jw]YfiQ2988Ox7UQ,d\&AAu)o dU<=Wzh;\<6%QJa9{|=>m/jJ$|ZkwBMX" U>@:^a Ն<}0nأrH}./W}KXĊ08O`'b].1ɆG <WWC5o47ӼA4,}ɘ;ᕃ8E _)n!mȠ z:r1qǤYB-"hm\8fxAl Db@V#qSFҕ>q<+yi]Be "M/ȧ+ۮ+/ 7u%ˎkO)4|p9oyC}Z6 29n~S<> OxMbK(̊3Vbp9$^+眝}q>x )5-F+yEv+V-|Ü_@ 1vNaaX1}kOIu#\|BWRlMԬres޵e6vz MbZ5<"'*EPM`Js_

/kpKh<뜚|cgD6y4edW.*䗑:ihlL//|1 $Ag~7>'|Vmi9-nHԐdI׳~ҏ6Yk2FZ; $C1`tEvr0Ȫ>zzT-ֺa8֓=S'LR棦БBi4 P2QE QNQJ!BBnªz֞&Co=Yk}p:Aޮ+×>'֓Nh$Kq$;ƻm~_6ZER{U'k)'C/fmst0%{ú%qϾX%{(s]_),JS-牬OP q%xyS|@-?cC6)13H͖;# {gC'oƤïk?/z6" EJ<|'Kt5a)_h,potc[\%ݍXq3u>^|==׆n :8OǯN<:;ySövunڲ bļ``ewՖY1 Yas^X+-ԯԦ;K'm1{Ůa:yqjl [[ n~Vmn.Wv EzuTrӒW>_t nC H-',NYykjσuC7-af9 GqsαF(eQ@2V cUEd`#|U]xYԵk; +{+ "XW:aaX~>c?h彶5ֵ:\Py;2(+BJP9g{)U܀j|UդFH5.F>P0)OaF~QCG)cҙJNNi+2QE(cd0*ջhd8!]HUsUGEr$z-9m;m/EL[%y䑾'tu^HEhBHSZx%%!G ;kWB~Oju( vA ןV\o YZo|hZׄUmgF9Ǡq\ea\xKU07:&#m/%ՠ'~nF:3kF?)$Qi-A/)TQ^; -c̒A c yK  3QHr9<[P]O8')Zڈ(4?<֓]OoI0Pr`g[^'T0U[)y<vr{H`T9sATJ+C^iڂE&ER>Y_23jL7SH @3")]χ5EdMrDg%OG鏭be]/m@yZUZAmRx`vpp{t\u T+ rOQD.F)dN^N(a,ҼHhwvql6J0H`܌1g~ |)ekqmhꩱpĜp[0O:l͎O+|4{&B[*ܷ$q]qV9t1aTi%\d?ZMX/ V$qG?ћ06)wrX{jB.-"; eOg({qҺo /SAWvzʘ"p8Zp@\yx #`AөQ3K];D Ԟl̯o4M4d}v}~xziЬ%f{h@T' >Uy.HʛF1Z6MtJybk(e̊N=眒46)k;^ִJԵ+ȭivo2I5#ϧ^9ѹCc53/_i:.o_͵#|c_3xźޤk:nqp G9 y$^h仒I$IRSL$s#bY$iV+S1~Z985,zg IjSO5,('U$<R\Y(Ir3c="QYZpNr*Zǔ<-{ WC̳41j?c_c\[f0I#'Ǡn-!aoeNKyxB5ZM#XN\ߖ˾zc7n# Olx{AY+pFuMQ<`v݆M"9cPr^+m:`ypk9D3aG+1aK tl^6qfͻ^T55Y*qޮ79rj*,Zytuk=Е"˫Fq\'7QdQ>tuTUu-:D?p'g?P)څ=Mc~?B0V''}2{tb)ҕs6/iXXQ"im6P-HB+zI^k洷Us޶/mhtmh\[h\DZ\N+Qj/wO~40KJ<޺xZKI |qO$Vm/p2Mr.y1ڳf3SxgZ,/#m 0,{Wn|]Eok5oQ.@T|v~Rfmn@U222yy+OT: 8ьOQʴu.Zd}SCZcqn.j$dn#8<_sy67&[ke(I$~ѿP?j6Z_Ga&R1ykJi%qM?~M]."XcPlqYOS=_|%j[M:icm#\E`cv:W%KEBֆ4Q10G*Ȩp1j#ֵ(MݸBs,>~Eiv,rI9$-+i x=:f%CAw(íRՍ j[1a&Do G<뺶{ Vy%/냞WVχ72=?=IʼnFoeFJǥh#.+V(ͱPvč9\+?-m =VUh1| AfꄞASݭ́#HG+ejZ^+]QCu0\L֬㉼¶V*|5kP,áFe"'⽕%%tacKm{Duٶ1n~RGNa;[k/įx>Nе;+WěO0+P=K^/Mz&GiFOM??p=M!$ 6sHM!48sҞi`Rz}) ާDOtʹsj=GZ"0)96 {;1P1RJXS .j:/ jo.9~uv5kKq(qy28*y؃zCɤzX*#m2214D&mq"<,N6#zR*K+vhK GsӏiI63շE2:޵]y'ny#×N:d:g^Mm"mheh D`U)#KR0ib`{~}++RPy:ৌ9ҩؾVXpF2H[:[Gk399\ws^)4hTc+nźaDZ֒l|>5bgUY" 5*RжCԤA "NJqǯLwy)2 $O|#Fg#=޳oᾎBb+WTCcb{gIkIutZڠ,OJ*CZ)&ssǂF9t;ff2Sy${|z84f2ǚL`H*S@䀽 f&;OKI}" ّ W<W49gh08 %&{%vpJ ku[K+'t\@Gָjw?.i(Z)-QE0}0u4&HjՃC5Qjƞ1.3=gx+M+ǼV6 R H=1E %$ q֮朚Ŝ4y#~ Lv߫2)/˵F㏔r{WJF=Haŕ/y$T;X 70u3zFnn|;{]$H  zc>ki5]@XFF|̣) 0yJ2Ч( 2I>_8wK̡+.2FkNMQՅǴ:9`' eĤ$w# /&FF3w>ZZYJ~dyNRU=O׷znJ[c{lqV%5`N8V5XYN 6UbtU *yҢ'V|&틫t}Ps6 t^8LO Ǩ!(pq>E p+اIwF-:7DGfUNMAzRNEmXF+X3p5=+M* su"ܜPY"NWsUYcnaԬo oc(' `z|)Y n#A[xpcqxuR-l5Bu4QDQONi)sIE.h4P>-PҀr*_ RotRY-fO6p8$3+֜72]%ᙟQ@38x8>ռEsYΛ8;GN} t[j1Hai ޙ%'{~Gw>6%wQ_NycqA܃cI  ZSIHaKIE0zU=z_LjHЧK*CAIȱN+ c{;mf9WF*}MT(.Wsx|o.ohlS쮄4Ov`qߜgzdܷc^biĦX8;s+}WN&H F9) 2+p9$5 p9澳>ՀyWQ?ZqJ4M^ 5`iR7dg y3^ӋRImEuVB{PoJƥ$eN7V&B3s WkZ/UU4QY )֚)BcىCqM4CsM斑Cw05x7uxr7qA]r@#sЍZUq>s[ºֶyXYWdx8lvbV?^=JhmF;of,HzƗEQBFGvm!J4Mʏ콫+AU;=6ezM_\Eb1F ]|a'=n* 9 )XaJi(E-R%'xpi1̇)8ONi{Vu´9%kT{-6`&l8Tq>̻Bpۼ+ٮ%=v1mזYKQT\֡R3d-x1koE "$qn/"d1(1\ڻ2IY4"URq\꒤(g` ]i]8Jb͉u MKxlgX3_,ȍk(@3`.{cV2YjZ\Zu]̸<֝"nm49~Ҿ ^fY(G^Һ3Ű>nY;K:=%׹FjZ4KG) 8)lҩj&2R0>`ҰĢLi(0)ipKRBE:{}(J%Ӯ[w55rwqm019'a9㵷xKrZOSѼa[Ydoqf8Q&$$)t?^>kI4)mռ.Yr"o..^3_;Uc{ȵrTcT 6pJ KٹFOqڶ{p>wWV吘s[P*2+(G 2#WG ϗfi 0c+Q q޺ D*E SR{H8¸GZ<↰>^DO4 TjE[ QRZ92es~pAZޏr S9>+mWPԑzROP14fryM9ܘHpython-asciimatics-1.15.0/samples/mapscache/1.0.0.json000066400000000000000000011000771511423144500223330ustar00rootroot00000000000000{"water": {"extent": 4096, "version": 2, "features": [{"geometry": {"type": "MultiPolygon", "coordinates": [[[[4186, 1102], [4224, 1092], [4224, 900], [4184, 906], [4120, 894], [4096, 876], [4074, 872], [4056, 856], [3982, 862], [3970, 876], [3978, 890], [3996, 898], [4046, 900], [4064, 922], [4078, 926], [4084, 944], [4098, 954], [4090, 972], [4094, 990], [4120, 1026], [4144, 1032], [4170, 1052], [4166, 1086], [4186, 1102]], [[4170, 990], [4154, 988], [4154, 978], [4168, 976], [4174, 982], [4170, 990]]], [[[4224, 4224], [4224, 1824], [4208, 1802], [4214, 1788], [4206, 1754], [4212, 1728], [4224, 1724], [4214, 1714], [4214, 1688], [4224, 1684], [4224, 1436], [4218, 1432], [4224, 1410], [4214, 1408], [4214, 1422], [4204, 1424], [4186, 1382], [4170, 1366], [4134, 1352], [4130, 1324], [4102, 1310], [4094, 1294], [4074, 1296], [4066, 1306], [4056, 1306], [4058, 1272], [4034, 1270], [4018, 1278], [3988, 1266], [3994, 1246], [4036, 1232], [4048, 1216], [4050, 1202], [4068, 1186], [4068, 1128], [4056, 1098], [3912, 1108], [3886, 1090], [3886, 1080], [3894, 1072], [3898, 1020], [3880, 958], [3894, 946], [3894, 910], [3938, 912], [3968, 876], [3960, 872], [3944, 830], [3888, 790], [3872, 756], [3870, 736], [3876, 720], [3866, 702], [3832, 672], [3796, 658], [3788, 634], [3766, 618], [3756, 580], [3736, 562], [3722, 524], [3710, 514], [3708, 490], [3724, 474], [3722, 444], [3730, 432], [3730, 408], [3718, 360], [3704, 344], [3704, 334], [3716, 320], [3714, 284], [3730, 270], [3742, 268], [3764, 236], [3786, 220], [3804, 174], [3910, 102], [3932, 100], [3984, 118], [4026, 118], [4052, 108], [4132, 142], [4198, 144], [4224, 110], [4224, -128], [3294, -128], [3288, -116], [3264, -116], [3246, -108], [3224, -86], [3188, -64], [3154, -66], [3118, -54], [3086, -56], [3078, -36], [3046, -22], [3024, -14], [2994, -18], [2992, -6], [2972, -2], [2956, 10], [2960, 40], [2942, 52], [2934, 90], [2926, 100], [2890, 126], [2862, 136], [2816, 134], [2788, 144], [2768, 158], [2752, 184], [2714, 200], [2712, 216], [2698, 226], [2708, 232], [2706, 248], [2696, 246], [2694, 228], [2676, 230], [2670, 246], [2638, 244], [2622, 232], [2600, 234], [2590, 244], [2552, 240], [2536, 260], [2510, 266], [2506, 278], [2498, 278], [2496, 260], [2464, 252], [2460, 264], [2476, 274], [2476, 282], [2462, 284], [2430, 260], [2408, 260], [2404, 252], [2382, 248], [2374, 218], [2360, 210], [2346, 190], [2322, 212], [2294, 220], [2252, 202], [2228, 208], [2204, 230], [2190, 254], [2202, 348], [2168, 368], [2078, 368], [2088, 386], [2092, 424], [2104, 438], [2106, 468], [2120, 484], [2116, 502], [2084, 504], [2046, 494], [2038, 486], [2030, 448], [2014, 430], [1994, 434], [1944, 422], [1936, 432], [1910, 442], [1870, 518], [1874, 594], [1886, 604], [1878, 634], [1886, 662], [1904, 680], [1924, 684], [1938, 704], [1964, 710], [1992, 704], [2008, 708], [2020, 696], [2032, 696], [2056, 702], [2058, 718], [2070, 726], [2134, 726], [2148, 720], [2156, 708], [2188, 716], [2214, 688], [2212, 660], [2220, 636], [2252, 592], [2264, 592], [2274, 610], [2276, 632], [2242, 730], [2246, 752], [2260, 776], [2288, 794], [2306, 818], [2324, 822], [2330, 834], [2354, 844], [2356, 858], [2372, 868], [2358, 942], [2370, 938], [2372, 928], [2382, 934], [2388, 946], [2382, 970], [2396, 968], [2408, 982], [2412, 1012], [2442, 1018], [2434, 1030], [2496, 1044], [2484, 1062], [2486, 1086], [2496, 1104], [2522, 1116], [2528, 1126], [2542, 1124], [2568, 1138], [2572, 1150], [2616, 1166], [2624, 1160], [2590, 1128], [2592, 1110], [2608, 1102], [2628, 1118], [2636, 1134], [2648, 1132], [2684, 1146], [2700, 1154], [2704, 1166], [2720, 1168], [2732, 1178], [2732, 1188], [2722, 1192], [2720, 1214], [2708, 1206], [2694, 1174], [2654, 1176], [2626, 1194], [2618, 1218], [2622, 1240], [2602, 1240], [2596, 1246], [2612, 1248], [2634, 1264], [2634, 1278], [2622, 1290], [2578, 1288], [2512, 1248], [2526, 1274], [2546, 1290], [2564, 1294], [2570, 1312], [2584, 1324], [2730, 1326], [2758, 1356], [2780, 1368], [2804, 1370], [2828, 1392], [2826, 1444], [2812, 1456], [2798, 1458], [2782, 1476], [2790, 1484], [2786, 1492], [2760, 1498], [2752, 1510], [2730, 1518], [2722, 1534], [2698, 1556], [2702, 1576], [2688, 1612], [2690, 1620], [2672, 1636], [2672, 1648], [2640, 1702], [2630, 1734], [2620, 1736], [2604, 1704], [2606, 1692], [2596, 1668], [2582, 1662], [2570, 1646], [2558, 1644], [2536, 1668], [2522, 1670], [2520, 1684], [2512, 1690], [2510, 1746], [2518, 1760], [2472, 1772], [2464, 1782], [2466, 1794], [2422, 1832], [2388, 1824], [2332, 1840], [2318, 1828], [2318, 1802], [2328, 1788], [2318, 1754], [2326, 1748], [2334, 1710], [2308, 1668], [2308, 1656], [2346, 1616], [2354, 1554], [2332, 1522], [2284, 1494], [2296, 1464], [2308, 1396], [2298, 1376], [2288, 1376], [2280, 1364], [2266, 1370], [2232, 1418], [2258, 1418], [2260, 1424], [2248, 1436], [2228, 1430], [2222, 1510], [2158, 1518], [2146, 1530], [2106, 1546], [2096, 1564], [2076, 1580], [2038, 1596], [1992, 1592], [1992, 1610], [1976, 1660], [1950, 1662], [1940, 1674], [1944, 1742], [1970, 1804], [1994, 1836], [2002, 1838], [1998, 1848], [2018, 1850], [2034, 1860], [2032, 1884], [2046, 1894], [2052, 1912], [2080, 1910], [2094, 1922], [2118, 1968], [2112, 1984], [2140, 2020], [2140, 2030], [2124, 2044], [2150, 2048], [2160, 2032], [2174, 2028], [2184, 2004], [2198, 2002], [2192, 2018], [2176, 2030], [2188, 2030], [2190, 2044], [2204, 2040], [2244, 2078], [2248, 2106], [2228, 2132], [2224, 2162], [2248, 2174], [2248, 2186], [2240, 2192], [2246, 2208], [2228, 2216], [2218, 2236], [2222, 2250], [2242, 2256], [2276, 2232], [2290, 2242], [2288, 2254], [2306, 2258], [2304, 2280], [2296, 2286], [2302, 2290], [2310, 2278], [2326, 2274], [2328, 2252], [2342, 2250], [2342, 2238], [2374, 2214], [2372, 2202], [2352, 2198], [2352, 2180], [2360, 2178], [2378, 2192], [2392, 2192], [2394, 2180], [2384, 2180], [2380, 2166], [2388, 2158], [2396, 2168], [2410, 2166], [2416, 2154], [2436, 2146], [2450, 2084], [2402, 2030], [2418, 1994], [2386, 1980], [2334, 1988], [2334, 1976], [2318, 1962], [2316, 1942], [2336, 1924], [2358, 1924], [2374, 1936], [2406, 1936], [2418, 1930], [2434, 1918], [2446, 1896], [2466, 1892], [2462, 1872], [2478, 1860], [2488, 1838], [2510, 1848], [2522, 1830], [2538, 1822], [2586, 1804], [2594, 1806], [2596, 1822], [2534, 1886], [2532, 1894], [2538, 1896], [2582, 1860], [2606, 1852], [2622, 1828], [2630, 1830], [2618, 1852], [2624, 1856], [2620, 1872], [2634, 1882], [2632, 1902], [2616, 1918], [2612, 1944], [2576, 1968], [2566, 2000], [2552, 2004], [2552, 2010], [2568, 2016], [2558, 2034], [2580, 2036], [2604, 2016], [2620, 1978], [2650, 1962], [2654, 1996], [2672, 2000], [2684, 2020], [2680, 2032], [2696, 2040], [2702, 2058], [2684, 2076], [2664, 2076], [2662, 2094], [2642, 2094], [2642, 2110], [2620, 2124], [2620, 2136], [2596, 2132], [2588, 2148], [2576, 2150], [2574, 2164], [2544, 2172], [2540, 2184], [2546, 2184], [2552, 2196], [2546, 2210], [2578, 2210], [2572, 2226], [2552, 2234], [2552, 2244], [2568, 2246], [2564, 2270], [2552, 2282], [2538, 2274], [2524, 2278], [2536, 2286], [2542, 2300], [2520, 2316], [2506, 2314], [2500, 2320], [2490, 2314], [2490, 2336], [2480, 2338], [2472, 2332], [2476, 2356], [2462, 2372], [2436, 2376], [2422, 2370], [2418, 2386], [2398, 2380], [2406, 2386], [2410, 2404], [2392, 2414], [2384, 2442], [2360, 2448], [2344, 2460], [2328, 2460], [2312, 2450], [2308, 2430], [2276, 2438], [2260, 2406], [2258, 2424], [2270, 2462], [2264, 2468], [2262, 2492], [2250, 2500], [2252, 2512], [2240, 2536], [2210, 2536], [2158, 2502], [2144, 2456], [2148, 2438], [2162, 2424], [2150, 2420], [2142, 2400], [2156, 2378], [2170, 2374], [2170, 2364], [2154, 2366], [2132, 2400], [2134, 2438], [2124, 2452], [2124, 2466], [2140, 2506], [2162, 2528], [2164, 2540], [2134, 2548], [2098, 2536], [2066, 2494], [2062, 2464], [2048, 2430], [2048, 2360], [2060, 2350], [2096, 2346], [2106, 2334], [2102, 2328], [2088, 2328], [2084, 2334], [2062, 2330], [2070, 2302], [2092, 2282], [2122, 2284], [2142, 2264], [2208, 2262], [2212, 2246], [2194, 2244], [2176, 2254], [2150, 2248], [2152, 2212], [2162, 2194], [2146, 2178], [2140, 2138], [2132, 2136], [2128, 2152], [2118, 2148], [2118, 2124], [2126, 2118], [2128, 2106], [2110, 2092], [2086, 2132], [2088, 2148], [2098, 2152], [2094, 2188], [2072, 2214], [2064, 2214], [2052, 2198], [2048, 2162], [2040, 2158], [2034, 2212], [2044, 2218], [2044, 2226], [2022, 2240], [2004, 2232], [1992, 2244], [2012, 2282], [1984, 2318], [1984, 2348], [1978, 2362], [1960, 2386], [1946, 2388], [1970, 2434], [1960, 2458], [2002, 2458], [2042, 2542], [2042, 2552], [2028, 2560], [1998, 2558], [1976, 2574], [1934, 2564], [1926, 2554], [1930, 2540], [1918, 2534], [1916, 2470], [1930, 2438], [1930, 2396], [1914, 2376], [1920, 2356], [1910, 2360], [1900, 2352], [1898, 2316], [1906, 2298], [1898, 2276], [1910, 2250], [1926, 2238], [1944, 2236], [1954, 2224], [1944, 2184], [1954, 2182], [1964, 2192], [1964, 2168], [1940, 2140], [1922, 2134], [1926, 2094], [1910, 2096], [1906, 2104], [1912, 2146], [1886, 2160], [1886, 2166], [1906, 2164], [1928, 2184], [1916, 2194], [1910, 2214], [1912, 2222], [1926, 2222], [1926, 2234], [1894, 2232], [1874, 2254], [1862, 2252], [1852, 2216], [1832, 2204], [1836, 2190], [1872, 2174], [1862, 2158], [1852, 2156], [1852, 2124], [1806, 2128], [1792, 2120], [1774, 2120], [1752, 2130], [1742, 2142], [1726, 2138], [1700, 2160], [1694, 2188], [1678, 2194], [1656, 2180], [1630, 2174], [1622, 2152], [1632, 2144], [1644, 2144], [1646, 2154], [1670, 2156], [1670, 2150], [1642, 2138], [1636, 2110], [1620, 2110], [1614, 2122], [1602, 2122], [1590, 2136], [1574, 2126], [1538, 2118], [1476, 2126], [1474, 2138], [1480, 2146], [1502, 2152], [1500, 2170], [1484, 2188], [1470, 2196], [1436, 2192], [1414, 2198], [1396, 2214], [1360, 2224], [1344, 2242], [1320, 2252], [1296, 2250], [1292, 2230], [1284, 2222], [1266, 2222], [1270, 2244], [1262, 2272], [1242, 2242], [1242, 2222], [1234, 2222], [1214, 2244], [1208, 2270], [1188, 2298], [1178, 2294], [1184, 2276], [1176, 2272], [1174, 2258], [1164, 2248], [1148, 2252], [1132, 2244], [1120, 2228], [1118, 2236], [1128, 2248], [1150, 2262], [1148, 2274], [1136, 2268], [1122, 2272], [1096, 2248], [1074, 2240], [1066, 2224], [1052, 2222], [1050, 2234], [1040, 2240], [1018, 2228], [998, 2212], [998, 2194], [986, 2190], [954, 2206], [936, 2222], [932, 2234], [882, 2240], [840, 2270], [794, 2262], [774, 2274], [734, 2278], [702, 2296], [646, 2292], [628, 2304], [628, 2320], [616, 2324], [582, 2318], [578, 2330], [566, 2336], [550, 2322], [554, 2342], [530, 2354], [502, 2320], [464, 2318], [436, 2286], [412, 2282], [388, 2250], [384, 2222], [364, 2196], [314, 2188], [308, 2156], [362, 2112], [370, 2086], [396, 2076], [398, 2062], [418, 2052], [416, 2042], [424, 2040], [424, 2034], [410, 2022], [372, 2024], [370, 2050], [350, 2052], [328, 2042], [322, 2028], [304, 2026], [272, 1996], [308, 1978], [302, 1966], [308, 1946], [320, 1938], [342, 1934], [372, 1940], [394, 1932], [406, 1946], [434, 1954], [436, 1944], [424, 1938], [436, 1906], [432, 1890], [422, 1884], [402, 1886], [384, 1864], [366, 1874], [354, 1872], [342, 1840], [324, 1818], [316, 1790], [324, 1774], [338, 1766], [342, 1754], [336, 1740], [356, 1722], [362, 1708], [382, 1708], [404, 1720], [412, 1702], [414, 1656], [436, 1656], [442, 1670], [466, 1664], [476, 1648], [484, 1650], [484, 1664], [494, 1656], [518, 1662], [510, 1646], [508, 1614], [486, 1592], [484, 1582], [454, 1566], [442, 1542], [418, 1544], [382, 1506], [354, 1502], [344, 1482], [376, 1490], [384, 1502], [414, 1510], [418, 1522], [440, 1522], [458, 1536], [486, 1544], [496, 1564], [534, 1586], [538, 1600], [570, 1628], [584, 1632], [592, 1650], [606, 1660], [606, 1670], [590, 1678], [590, 1686], [614, 1704], [634, 1744], [664, 1774], [680, 1774], [686, 1764], [670, 1764], [652, 1752], [652, 1732], [640, 1710], [648, 1700], [638, 1688], [642, 1680], [664, 1684], [694, 1714], [730, 1718], [728, 1752], [754, 1760], [774, 1740], [796, 1734], [820, 1716], [856, 1720], [890, 1704], [918, 1708], [920, 1690], [950, 1674], [976, 1644], [996, 1640], [988, 1626], [1028, 1558], [1034, 1568], [1032, 1588], [1046, 1596], [1054, 1614], [1058, 1592], [1048, 1590], [1036, 1574], [1042, 1568], [1042, 1552], [1056, 1562], [1058, 1522], [1070, 1496], [1092, 1496], [1094, 1514], [1088, 1526], [1094, 1526], [1096, 1514], [1110, 1512], [1118, 1496], [1128, 1494], [1128, 1444], [1136, 1436], [1150, 1436], [1156, 1414], [1178, 1394], [1192, 1352], [1212, 1344], [1208, 1340], [1182, 1350], [1176, 1338], [1218, 1296], [1264, 1264], [1258, 1246], [1272, 1216], [1274, 1150], [1262, 1076], [1270, 1048], [1266, 1002], [1278, 988], [1280, 962], [1308, 932], [1310, 912], [1322, 904], [1322, 888], [1346, 860], [1350, 840], [1400, 822], [1426, 800], [1428, 784], [1464, 708], [1498, 678], [1498, 662], [1484, 660], [1482, 654], [1492, 642], [1520, 632], [1540, 616], [1544, 582], [1580, 556], [1592, 536], [1606, 542], [1598, 564], [1578, 574], [1578, 588], [1560, 628], [1534, 656], [1516, 696], [1490, 716], [1484, 758], [1508, 756], [1520, 748], [1538, 700], [1536, 686], [1546, 686], [1564, 664], [1578, 658], [1580, 648], [1608, 626], [1606, 608], [1630, 594], [1690, 528], [1700, 500], [1694, 464], [1742, 422], [1778, 414], [1804, 394], [1896, 360], [1942, 376], [1962, 368], [2010, 322], [2040, 318], [2078, 302], [2102, 304], [2106, 290], [2142, 258], [2146, 226], [2168, 224], [2190, 208], [2192, 194], [2228, 188], [2240, 176], [2252, 174], [2256, 164], [2272, 168], [2268, 188], [2286, 204], [2302, 202], [2314, 190], [2312, 178], [2334, 150], [2338, 84], [2324, 62], [2308, 58], [2300, 32], [2274, 18], [2272, 0], [2256, -24], [2256, -54], [2274, -68], [2274, -74], [2246, -98], [2252, -128], [-128, -128], [-128, 1802], [-68, 1836], [-20, 1828], [-10, 1838], [-8, 1850], [-14, 1856], [-14, 1870], [-24, 1880], [-32, 1920], [-56, 1932], [-56, 1946], [-24, 1946], [10, 1974], [16, 2000], [6, 2010], [8, 2024], [30, 2030], [26, 2012], [36, 1990], [58, 1988], [76, 1994], [88, 1988], [102, 1954], [120, 1952], [140, 1930], [156, 1924], [172, 1932], [174, 1960], [180, 1968], [176, 1990], [204, 1990], [216, 2000], [218, 2014], [234, 2022], [198, 2056], [188, 2074], [158, 2072], [148, 2082], [134, 2080], [136, 2054], [134, 2044], [128, 2044], [118, 2056], [118, 2098], [112, 2100], [108, 2114], [98, 2122], [90, 2118], [88, 2130], [52, 2152], [32, 2170], [26, 2184], [0, 2196], [-28, 2226], [-68, 2238], [-88, 2254], [-128, 2254], [-128, 4224], [4224, 4224]], [[2016, -2], [2016, -22], [2024, -24], [2028, -12], [2016, -2]], [[1708, 2172], [1708, 2162], [1718, 2160], [1720, 2168], [1708, 2172]], [[1666, 2530], [1662, 2518], [1678, 2504], [1680, 2490], [1668, 2502], [1656, 2498], [1650, 2504], [1638, 2504], [1632, 2492], [1642, 2418], [1652, 2398], [1644, 2382], [1634, 2388], [1626, 2446], [1594, 2478], [1578, 2478], [1578, 2468], [1590, 2460], [1592, 2444], [1578, 2444], [1570, 2434], [1562, 2436], [1564, 2460], [1528, 2480], [1516, 2474], [1512, 2454], [1496, 2452], [1504, 2470], [1504, 2494], [1494, 2508], [1434, 2478], [1398, 2440], [1406, 2420], [1386, 2398], [1386, 2378], [1408, 2374], [1406, 2358], [1444, 2364], [1454, 2360], [1408, 2340], [1402, 2324], [1424, 2302], [1460, 2300], [1506, 2310], [1546, 2292], [1536, 2278], [1480, 2284], [1432, 2272], [1424, 2256], [1446, 2222], [1462, 2214], [1508, 2210], [1510, 2182], [1526, 2164], [1560, 2170], [1578, 2166], [1608, 2176], [1628, 2192], [1652, 2196], [1668, 2224], [1676, 2222], [1678, 2208], [1694, 2208], [1710, 2188], [1758, 2186], [1780, 2200], [1776, 2226], [1770, 2230], [1756, 2222], [1754, 2232], [1764, 2236], [1770, 2250], [1800, 2242], [1802, 2264], [1752, 2306], [1742, 2304], [1718, 2336], [1724, 2368], [1702, 2434], [1700, 2472], [1718, 2500], [1720, 2522], [1706, 2538], [1680, 2538], [1666, 2530]], [[1782, 2184], [1770, 2182], [1774, 2172], [1782, 2176], [1782, 2184]], [[548, 442], [556, 440], [562, 446], [572, 450], [572, 456], [560, 468], [548, 468], [548, 442]], [[534, 486], [536, 480], [542, 482], [534, 486]], [[498, 504], [498, 498], [504, 498], [498, 504]], [[464, 518], [462, 512], [468, 512], [464, 518]], [[1820, 2202], [1806, 2196], [1806, 2184], [1814, 2184], [1820, 2202]], [[70, 1384], [72, 1378], [82, 1382], [70, 1384]], [[130, 1402], [126, 1394], [134, 1396], [130, 1402]], [[1080, 1428], [1102, 1410], [1094, 1452], [1096, 1468], [1066, 1468], [1080, 1428]], [[268, 1448], [262, 1440], [256, 1428], [286, 1442], [268, 1448]], [[300, 1466], [294, 1462], [292, 1444], [304, 1448], [314, 1460], [300, 1466]], [[1808, 2306], [1806, 2300], [1814, 2298], [1808, 2306]], [[1334, 2606], [1272, 2594], [1260, 2588], [1260, 2578], [1276, 2534], [1256, 2492], [1256, 2472], [1234, 2418], [1234, 2402], [1268, 2384], [1284, 2362], [1288, 2342], [1302, 2336], [1324, 2360], [1340, 2358], [1356, 2370], [1362, 2414], [1378, 2424], [1386, 2450], [1446, 2498], [1462, 2504], [1472, 2522], [1422, 2580], [1376, 2576], [1334, 2606]], [[442, 1520], [436, 1518], [444, 1512], [442, 1520]], [[1872, 2568], [1844, 2560], [1834, 2546], [1818, 2554], [1798, 2544], [1798, 2528], [1786, 2520], [1786, 2512], [1798, 2500], [1810, 2498], [1810, 2462], [1790, 2460], [1776, 2484], [1766, 2484], [1760, 2474], [1758, 2456], [1764, 2446], [1774, 2440], [1780, 2424], [1796, 2422], [1808, 2412], [1844, 2352], [1854, 2352], [1864, 2362], [1864, 2376], [1884, 2376], [1900, 2392], [1904, 2448], [1896, 2466], [1884, 2470], [1898, 2474], [1900, 2486], [1890, 2492], [1884, 2476], [1864, 2484], [1870, 2498], [1884, 2506], [1880, 2522], [1890, 2528], [1888, 2542], [1870, 2550], [1872, 2568]], [[2638, 1212], [2632, 1208], [2646, 1188], [2672, 1180], [2676, 1190], [2678, 1198], [2658, 1196], [2644, 1200], [2638, 1212]], [[626, 1652], [618, 1646], [604, 1624], [576, 1606], [580, 1588], [590, 1580], [610, 1588], [632, 1608], [624, 1630], [636, 1642], [626, 1652]], [[2542, 1742], [2540, 1730], [2546, 1728], [2552, 1740], [2542, 1742]], [[2428, 456], [2438, 452], [2444, 432], [2404, 432], [2402, 426], [2410, 420], [2460, 420], [2466, 410], [2474, 410], [2486, 424], [2534, 422], [2540, 428], [2536, 438], [2488, 462], [2428, 462], [2428, 456]], [[2318, 428], [2316, 422], [2330, 412], [2358, 414], [2350, 426], [2318, 428]], [[2568, 418], [2576, 414], [2602, 420], [2598, 428], [2570, 428], [2568, 418]], [[2294, 1566], [2278, 1558], [2280, 1542], [2294, 1550], [2304, 1554], [2294, 1566]], [[2182, 530], [2174, 518], [2176, 510], [2212, 528], [2230, 528], [2238, 516], [2304, 502], [2314, 484], [2338, 478], [2332, 462], [2390, 462], [2406, 468], [2400, 478], [2338, 504], [2322, 520], [2292, 524], [2284, 534], [2262, 542], [2218, 542], [2182, 530]], [[732, 1710], [738, 1710], [740, 1718], [732, 1718], [732, 1710]], [[288, 1726], [294, 1714], [326, 1712], [324, 1732], [300, 1732], [288, 1726]], [[2208, 510], [2206, 504], [2214, 502], [2216, 508], [2208, 510]], [[772, 1740], [760, 1738], [760, 1732], [768, 1734], [772, 1740]], [[2278, 1830], [2272, 1824], [2270, 1802], [2284, 1792], [2292, 1826], [2278, 1830]], [[222, 1896], [186, 1892], [186, 1880], [192, 1876], [210, 1880], [234, 1860], [244, 1868], [256, 1874], [230, 1884], [222, 1896]], [[2316, 588], [2316, 572], [2330, 564], [2324, 586], [2316, 588]], [[2228, 1860], [2212, 1858], [2194, 1852], [2186, 1836], [2192, 1820], [2212, 1822], [2230, 1842], [2228, 1860]], [[3740, 668], [3738, 660], [3744, 662], [3740, 668]], [[3724, 676], [3714, 674], [3714, 666], [3722, 666], [3724, 676]], [[3776, 680], [3774, 672], [3780, 674], [3776, 680]], [[8, 2372], [-28, 2344], [-32, 2330], [-22, 2318], [-4, 2326], [26, 2324], [54, 2338], [58, 2348], [40, 2368], [8, 2372]], [[2266, 2540], [2256, 2532], [2254, 2504], [2270, 2496], [2278, 2464], [2286, 2458], [2310, 2468], [2362, 2464], [2364, 2476], [2342, 2516], [2318, 2532], [2306, 2532], [2286, 2530], [2266, 2540]], [[2126, 2270], [2110, 2268], [2114, 2262], [2126, 2262], [2126, 2270]], [[2832, 1372], [2810, 1370], [2786, 1332], [2770, 1286], [2758, 1270], [2760, 1262], [2744, 1244], [2746, 1236], [2836, 1230], [2824, 1216], [2826, 1210], [2840, 1212], [2848, 1226], [2868, 1236], [2864, 1212], [2888, 1204], [2898, 1234], [2888, 1236], [2888, 1248], [2874, 1238], [2876, 1252], [2888, 1262], [2888, 1268], [2872, 1272], [2876, 1294], [2858, 1302], [2828, 1302], [2828, 1316], [2822, 1320], [2808, 1316], [2828, 1352], [2826, 1364], [2832, 1372]], [[2632, 1316], [2632, 1310], [2654, 1292], [2686, 1286], [2690, 1294], [2672, 1306], [2632, 1316]], [[4022, 1658], [3982, 1654], [3964, 1612], [3950, 1612], [3944, 1606], [3952, 1592], [3962, 1588], [3952, 1564], [3968, 1554], [3960, 1542], [3950, 1540], [3950, 1532], [3964, 1540], [3970, 1520], [3980, 1526], [3982, 1536], [3988, 1522], [3980, 1498], [4016, 1498], [4014, 1482], [4028, 1470], [4024, 1442], [3992, 1442], [4002, 1404], [3978, 1388], [3980, 1378], [3996, 1378], [4024, 1364], [4002, 1362], [3970, 1324], [3976, 1318], [3988, 1328], [4012, 1326], [4026, 1342], [4048, 1338], [4102, 1344], [4128, 1360], [4116, 1374], [4136, 1400], [4134, 1420], [4118, 1428], [4104, 1426], [4092, 1472], [4070, 1492], [4060, 1528], [4042, 1546], [4030, 1548], [4046, 1584], [4054, 1614], [4008, 1616], [4008, 1628], [4026, 1644], [4022, 1658]], [[3900, 1498], [3904, 1484], [3898, 1478], [3870, 1476], [3866, 1446], [3882, 1434], [3880, 1426], [3870, 1402], [3862, 1398], [3862, 1382], [3876, 1372], [3898, 1374], [3926, 1394], [3952, 1400], [3960, 1424], [3954, 1464], [3970, 1476], [3970, 1490], [3958, 1514], [3914, 1514], [3900, 1498]], [[3930, 1614], [3928, 1606], [3932, 1610], [3930, 1614]], [[3954, 1646], [3940, 1642], [3936, 1622], [3950, 1628], [3954, 1646]], [[4022, 1678], [4020, 1666], [4026, 1666], [4028, 1676], [4022, 1678]], [[3372, 3764], [3318, 3772], [3304, 3760], [3284, 3766], [3278, 3758], [3246, 3758], [3238, 3752], [3238, 3742], [3248, 3734], [3248, 3726], [3216, 3748], [3192, 3728], [3190, 3712], [3178, 3720], [3174, 3704], [3194, 3696], [3192, 3686], [3200, 3674], [3182, 3680], [3160, 3706], [3150, 3704], [3150, 3690], [3166, 3684], [3176, 3668], [3204, 3662], [3198, 3654], [3200, 3644], [3190, 3638], [3192, 3624], [3176, 3632], [3186, 3642], [3186, 3656], [3180, 3662], [3168, 3670], [3136, 3670], [3130, 3664], [3116, 3688], [3094, 3688], [3088, 3676], [3080, 3676], [3086, 3660], [3066, 3666], [3044, 3658], [3052, 3634], [3034, 3648], [3020, 3644], [3018, 3628], [3008, 3618], [3014, 3604], [3126, 3604], [3168, 3580], [3176, 3568], [3170, 3550], [3140, 3584], [3124, 3582], [3116, 3592], [3042, 3592], [3040, 3580], [3054, 3566], [3074, 3526], [3084, 3520], [3082, 3504], [3070, 3506], [3058, 3542], [3030, 3570], [3012, 3572], [2996, 3566], [3010, 3512], [3046, 3474], [3064, 3404], [3052, 3404], [3030, 3440], [3022, 3466], [2996, 3484], [2988, 3500], [2970, 3512], [2960, 3538], [2946, 3546], [2922, 3546], [2916, 3538], [2922, 3484], [2944, 3448], [2940, 3438], [2922, 3444], [2910, 3438], [2894, 3448], [2894, 3454], [2906, 3452], [2908, 3462], [2896, 3484], [2884, 3490], [2878, 3510], [2868, 3516], [2860, 3496], [2876, 3466], [2868, 3456], [2868, 3430], [2852, 3412], [2858, 3484], [2842, 3524], [2820, 3518], [2816, 3506], [2802, 3508], [2798, 3500], [2786, 3502], [2756, 3492], [2730, 3476], [2726, 3462], [2744, 3450], [2754, 3412], [2746, 3418], [2742, 3442], [2716, 3454], [2694, 3442], [2686, 3430], [2698, 3392], [2688, 3358], [2710, 3318], [2710, 3308], [2704, 3302], [2692, 3304], [2670, 3340], [2650, 3344], [2618, 3310], [2610, 3284], [2578, 3252], [2574, 3236], [2560, 3224], [2560, 3204], [2572, 3184], [2586, 3186], [2600, 3178], [2614, 3186], [2618, 3174], [2630, 3170], [2632, 3162], [2624, 3148], [2632, 3142], [2632, 3128], [2594, 3068], [2568, 3070], [2536, 3058], [2526, 3050], [2524, 3034], [2502, 3026], [2484, 3008], [2450, 2998], [2440, 2978], [2438, 2950], [2456, 2928], [2472, 2920], [2474, 2912], [2490, 2912], [2490, 2904], [2502, 2900], [2500, 2888], [2518, 2880], [2536, 2886], [2556, 2884], [2574, 2902], [2590, 2890], [2590, 2880], [2578, 2870], [2538, 2870], [2524, 2854], [2490, 2856], [2472, 2838], [2488, 2812], [2502, 2812], [2524, 2798], [2548, 2796], [2530, 2790], [2512, 2774], [2538, 2742], [2580, 2730], [2570, 2754], [2576, 2756], [2580, 2746], [2586, 2746], [2594, 2760], [2602, 2760], [2598, 2740], [2608, 2736], [2630, 2758], [2644, 2748], [2656, 2770], [2668, 2756], [2704, 2754], [2712, 2740], [2728, 2738], [2738, 2730], [2738, 2720], [2764, 2706], [2770, 2694], [2766, 2672], [2778, 2662], [2776, 2650], [2806, 2626], [2808, 2608], [2798, 2608], [2794, 2600], [2810, 2592], [2810, 2576], [2800, 2570], [2816, 2570], [2820, 2552], [2808, 2550], [2808, 2544], [2822, 2538], [2824, 2504], [2834, 2502], [2828, 2478], [2850, 2476], [2856, 2470], [2830, 2470], [2820, 2460], [2836, 2430], [2830, 2368], [2836, 2360], [2858, 2356], [2870, 2364], [2870, 2376], [2878, 2386], [2884, 2386], [2884, 2368], [2896, 2378], [2902, 2376], [2886, 2356], [2886, 2346], [2910, 2342], [2916, 2336], [2910, 2324], [2930, 2322], [2928, 2310], [2934, 2308], [2928, 2292], [2898, 2314], [2864, 2320], [2854, 2312], [2870, 2286], [2888, 2284], [2904, 2266], [2928, 2260], [2928, 2236], [2938, 2230], [2932, 2174], [2918, 2170], [2896, 2180], [2894, 2168], [2884, 2160], [2890, 2146], [2882, 2142], [2882, 2130], [2874, 2124], [2870, 2096], [2870, 2078], [2882, 2066], [2874, 2024], [2886, 2006], [2886, 1994], [2898, 1990], [2904, 1980], [2910, 1924], [2926, 1906], [2924, 1890], [2946, 1858], [2952, 1834], [2966, 1822], [2976, 1788], [3002, 1764], [3000, 1752], [3046, 1762], [3052, 1744], [3064, 1738], [3066, 1724], [3094, 1708], [3114, 1716], [3114, 1738], [3122, 1744], [3122, 1766], [3136, 1800], [3132, 1840], [3150, 1854], [3174, 1896], [3170, 1928], [3180, 1938], [3164, 1966], [3188, 1968], [3194, 1994], [3256, 1998], [3264, 2012], [3274, 2014], [3292, 2034], [3300, 2034], [3322, 2058], [3342, 2114], [3366, 2130], [3368, 2146], [3378, 2140], [3400, 2140], [3494, 2178], [3548, 2230], [3566, 2240], [3576, 2258], [3592, 2266], [3590, 2272], [3556, 2272], [3522, 2288], [3494, 2278], [3498, 2294], [3520, 2306], [3520, 2352], [3534, 2350], [3542, 2338], [3546, 2310], [3558, 2296], [3606, 2294], [3602, 2360], [3598, 2366], [3586, 2364], [3592, 2382], [3580, 2382], [3580, 2400], [3534, 2436], [3528, 2480], [3536, 2478], [3538, 2450], [3574, 2418], [3590, 2412], [3592, 2422], [3584, 2432], [3596, 2438], [3586, 2452], [3596, 2456], [3596, 2472], [3576, 2482], [3562, 2504], [3532, 2514], [3532, 2520], [3540, 2526], [3540, 2536], [3548, 2538], [3550, 2522], [3584, 2498], [3592, 2498], [3608, 2514], [3630, 2514], [3634, 2548], [3608, 2562], [3594, 2560], [3590, 2568], [3598, 2574], [3620, 2564], [3636, 2572], [3636, 2580], [3652, 2578], [3670, 2606], [3668, 2614], [3642, 2612], [3646, 2632], [3640, 2644], [3622, 2650], [3628, 2656], [3626, 2670], [3638, 2670], [3642, 2656], [3650, 2656], [3656, 2668], [3652, 2714], [3638, 2732], [3646, 2740], [3646, 2754], [3634, 2760], [3634, 2774], [3626, 2774], [3624, 2782], [3614, 2778], [3618, 2766], [3604, 2762], [3602, 2790], [3616, 2790], [3612, 2802], [3630, 2824], [3644, 2822], [3668, 2806], [3682, 2818], [3678, 2858], [3664, 2864], [3656, 2856], [3636, 2874], [3640, 2896], [3656, 2886], [3664, 2888], [3660, 2916], [3634, 2932], [3608, 2926], [3620, 2992], [3618, 3022], [3626, 3028], [3628, 3048], [3660, 3066], [3662, 3080], [3652, 3090], [3658, 3136], [3686, 3136], [3704, 3170], [3704, 3182], [3696, 3188], [3666, 3184], [3668, 3202], [3716, 3198], [3738, 3228], [3734, 3238], [3714, 3250], [3686, 3242], [3680, 3250], [3702, 3268], [3740, 3258], [3752, 3274], [3772, 3278], [3770, 3306], [3792, 3310], [3802, 3328], [3834, 3358], [3828, 3394], [3814, 3410], [3788, 3428], [3770, 3426], [3762, 3436], [3734, 3444], [3722, 3426], [3722, 3408], [3714, 3406], [3712, 3388], [3702, 3374], [3682, 3386], [3658, 3378], [3660, 3402], [3644, 3412], [3642, 3390], [3618, 3348], [3570, 3292], [3572, 3306], [3614, 3388], [3620, 3452], [3610, 3478], [3572, 3472], [3566, 3466], [3564, 3426], [3546, 3420], [3492, 3376], [3474, 3376], [3472, 3390], [3494, 3396], [3534, 3428], [3534, 3470], [3476, 3476], [3438, 3468], [3430, 3458], [3416, 3458], [3380, 3440], [3358, 3414], [3354, 3442], [3410, 3478], [3416, 3490], [3454, 3498], [3542, 3492], [3572, 3514], [3610, 3520], [3620, 3542], [3646, 3564], [3646, 3574], [3618, 3610], [3598, 3614], [3590, 3626], [3576, 3622], [3570, 3638], [3538, 3626], [3548, 3660], [3534, 3692], [3490, 3668], [3404, 3676], [3366, 3646], [3326, 3640], [3312, 3630], [3322, 3642], [3340, 3648], [3346, 3660], [3364, 3658], [3392, 3682], [3486, 3684], [3508, 3700], [3516, 3716], [3512, 3728], [3476, 3752], [3448, 3754], [3436, 3746], [3434, 3758], [3420, 3754], [3394, 3772], [3380, 3772], [3372, 3764]], [[4076, 1750], [4070, 1748], [4060, 1734], [4064, 1724], [4072, 1726], [4076, 1750]], [[2608, 1788], [2620, 1782], [2624, 1792], [2618, 1804], [2612, 1804], [2608, 1788]], [[3930, 1814], [3942, 1810], [3946, 1824], [3932, 1824], [3930, 1814]], [[2314, 1872], [2330, 1866], [2332, 1878], [2326, 1884], [2312, 1884], [2314, 1872]], [[2160, 2020], [2156, 2012], [2146, 2012], [2138, 2004], [2130, 1948], [2132, 1916], [2116, 1906], [2112, 1890], [2144, 1894], [2148, 1868], [2160, 1866], [2174, 1876], [2182, 1892], [2194, 1900], [2198, 1916], [2216, 1908], [2220, 1894], [2246, 1884], [2258, 1886], [2268, 1902], [2258, 1914], [2242, 1916], [2226, 1950], [2206, 1960], [2198, 1972], [2186, 1974], [2176, 1988], [2162, 1986], [2160, 1994], [2172, 1998], [2172, 2006], [2160, 2020]], [[3716, 2028], [3704, 2028], [3700, 2022], [3688, 2028], [3678, 2022], [3662, 2028], [3654, 2022], [3652, 2010], [3634, 2024], [3632, 2000], [3612, 1992], [3612, 2016], [3602, 2030], [3586, 2044], [3572, 2044], [3578, 2022], [3562, 2030], [3544, 1992], [3552, 1986], [3572, 1994], [3592, 1988], [3584, 1968], [3550, 1958], [3554, 1950], [3584, 1952], [3594, 1936], [3598, 1922], [3592, 1914], [3580, 1912], [3580, 1904], [3618, 1902], [3630, 1890], [3660, 1880], [3678, 1880], [3694, 1896], [3710, 1900], [3718, 1900], [3736, 1920], [3760, 1928], [3788, 1968], [3786, 1992], [3762, 2010], [3756, 2036], [3740, 2034], [3732, 2048], [3722, 2048], [3716, 2028]], [[2340, 1882], [2352, 1882], [2346, 1894], [2336, 1894], [2340, 1882]], [[2340, 2134], [2338, 2098], [2346, 2088], [2376, 2094], [2388, 2104], [2390, 2146], [2376, 2156], [2358, 2156], [2340, 2134]], [[2410, 2142], [2394, 2138], [2400, 2122], [2422, 2122], [2424, 2136], [2410, 2142]], [[2294, 2156], [2298, 2150], [2302, 2154], [2294, 2156]], [[2308, 2222], [2292, 2202], [2290, 2190], [2306, 2196], [2316, 2214], [2316, 2220], [2308, 2222]], [[2338, 2226], [2336, 2210], [2346, 2208], [2348, 2214], [2352, 2222], [2338, 2226]], [[2854, 2284], [2848, 2278], [2846, 2240], [2866, 2230], [2866, 2216], [2882, 2214], [2912, 2232], [2914, 2248], [2902, 2254], [2884, 2278], [2854, 2284]], [[2314, 2244], [2306, 2232], [2320, 2236], [2322, 2242], [2314, 2244]], [[3908, 2340], [3904, 2330], [3914, 2332], [3908, 2340]], [[2868, 2338], [2878, 2334], [2880, 2346], [2868, 2346], [2868, 2338]], [[3686, 3424], [3686, 3410], [3700, 3400], [3698, 3420], [3686, 3424]], [[3654, 3488], [3650, 3466], [3660, 3442], [3672, 3438], [3674, 3452], [3664, 3482], [3654, 3488]], [[1622, 2816], [1606, 2810], [1598, 2784], [1584, 2776], [1586, 2762], [1606, 2748], [1606, 2736], [1594, 2724], [1616, 2708], [1614, 2692], [1566, 2694], [1562, 2714], [1552, 2732], [1538, 2742], [1536, 2754], [1528, 2760], [1504, 2756], [1496, 2782], [1482, 2784], [1464, 2776], [1460, 2756], [1444, 2750], [1440, 2726], [1448, 2718], [1436, 2716], [1428, 2700], [1434, 2694], [1460, 2692], [1426, 2686], [1418, 2672], [1424, 2658], [1448, 2656], [1458, 2642], [1468, 2644], [1468, 2650], [1476, 2642], [1488, 2644], [1500, 2668], [1506, 2648], [1524, 2650], [1532, 2658], [1560, 2656], [1556, 2646], [1524, 2642], [1518, 2632], [1502, 2628], [1492, 2618], [1494, 2608], [1510, 2594], [1538, 2592], [1620, 2646], [1630, 2636], [1640, 2642], [1662, 2636], [1684, 2650], [1698, 2696], [1696, 2728], [1682, 2740], [1668, 2740], [1662, 2726], [1650, 2726], [1644, 2740], [1632, 2742], [1636, 2768], [1628, 2776], [1628, 2808], [1622, 2816]], [[1892, 2828], [1892, 2802], [1910, 2788], [1910, 2778], [1918, 2770], [1928, 2768], [1928, 2758], [1964, 2760], [1970, 2766], [1978, 2764], [1998, 2722], [2000, 2696], [1992, 2684], [1992, 2660], [1998, 2654], [2000, 2626], [2014, 2612], [2028, 2618], [2044, 2604], [2062, 2604], [2080, 2622], [2084, 2598], [2182, 2600], [2194, 2604], [2200, 2614], [2212, 2602], [2236, 2598], [2246, 2606], [2266, 2606], [2272, 2614], [2270, 2626], [2288, 2632], [2288, 2642], [2274, 2646], [2286, 2662], [2286, 2680], [2270, 2700], [2252, 2702], [2246, 2716], [2220, 2720], [2198, 2712], [2186, 2718], [2170, 2704], [2138, 2692], [2136, 2682], [2128, 2682], [2112, 2698], [2092, 2692], [2076, 2702], [2068, 2692], [2066, 2716], [2034, 2744], [2042, 2750], [2060, 2750], [2066, 2760], [2036, 2774], [2038, 2786], [2030, 2796], [2010, 2802], [1996, 2794], [1978, 2794], [1974, 2812], [1962, 2826], [1926, 2838], [1908, 2838], [1892, 2828]], [[2894, 3506], [2888, 3504], [2890, 3494], [2898, 3496], [2894, 3506]], [[1874, 2600], [1878, 2602], [1880, 2608], [1874, 2608], [1874, 2600]], [[1920, 2612], [1918, 2604], [1928, 2602], [1920, 2612]], [[2970, 3548], [2970, 3536], [2982, 3526], [2984, 3538], [2970, 3548]], [[3132, 3680], [3140, 3678], [3140, 3684], [3134, 3684], [3132, 3680]], [[1918, 2692], [1902, 2700], [1892, 2694], [1892, 2678], [1912, 2686], [1912, 2676], [1898, 2656], [1900, 2640], [1940, 2612], [1966, 2614], [1972, 2630], [1968, 2672], [1954, 2694], [1948, 2700], [1930, 2700], [1918, 2692]], [[2340, 3660], [2334, 3654], [2334, 3640], [2350, 3622], [2360, 3588], [2376, 3574], [2374, 3568], [2356, 3582], [2338, 3622], [2318, 3632], [2300, 3628], [2292, 3636], [2280, 3636], [2270, 3628], [2268, 3616], [2278, 3608], [2282, 3592], [2274, 3590], [2270, 3602], [2258, 3610], [2242, 3608], [2262, 3556], [2248, 3574], [2226, 3582], [2222, 3568], [2230, 3554], [2218, 3552], [2212, 3544], [2214, 3516], [2202, 3516], [2190, 3530], [2178, 3532], [2172, 3548], [2150, 3550], [2134, 3538], [2124, 3520], [2128, 3508], [2118, 3500], [2120, 3488], [2146, 3470], [2130, 3478], [2114, 3472], [2108, 3482], [2088, 3488], [2054, 3464], [2036, 3462], [2034, 3446], [2006, 3416], [2006, 3400], [2016, 3394], [2026, 3396], [2036, 3414], [2050, 3408], [2030, 3382], [2038, 3370], [2074, 3392], [2052, 3366], [2060, 3348], [2048, 3350], [2042, 3344], [2042, 3328], [2050, 3316], [2120, 3326], [2134, 3334], [2140, 3346], [2160, 3354], [2124, 3316], [2086, 3316], [2062, 3304], [2062, 3294], [2086, 3270], [2112, 3260], [2136, 3308], [2148, 3320], [2160, 3320], [2142, 3306], [2124, 3268], [2130, 3250], [2156, 3244], [2188, 3248], [2192, 3272], [2208, 3270], [2206, 3250], [2230, 3252], [2258, 3266], [2286, 3288], [2298, 3330], [2306, 3332], [2316, 3356], [2328, 3364], [2300, 3316], [2300, 3296], [2334, 3300], [2344, 3294], [2312, 3286], [2280, 3264], [2284, 3256], [2306, 3254], [2276, 3250], [2266, 3240], [2204, 3220], [2220, 3186], [2238, 3170], [2240, 3142], [2264, 3130], [2262, 3126], [2238, 3132], [2228, 3160], [2194, 3208], [2152, 3214], [2146, 3220], [2128, 3218], [2128, 3148], [2158, 3130], [2182, 3072], [2168, 3064], [2168, 3054], [2178, 3046], [2216, 3038], [2234, 3046], [2234, 3038], [2204, 3034], [2200, 3026], [2190, 3034], [2154, 3040], [2120, 3024], [2114, 3000], [2104, 2988], [2106, 2952], [2120, 2948], [2132, 2956], [2134, 2946], [2144, 2944], [2162, 2962], [2160, 2944], [2148, 2934], [2160, 2896], [2156, 2884], [2184, 2884], [2188, 2874], [2154, 2874], [2144, 2886], [2134, 2918], [2106, 2926], [2090, 2916], [2088, 2900], [2100, 2884], [2100, 2870], [2112, 2864], [2112, 2852], [2084, 2844], [2064, 2824], [2058, 2816], [2058, 2798], [2050, 2816], [2034, 2808], [2044, 2782], [2060, 2784], [2066, 2776], [2084, 2776], [2092, 2768], [2106, 2774], [2130, 2772], [2162, 2760], [2172, 2764], [2170, 2774], [2178, 2778], [2218, 2770], [2228, 2780], [2252, 2780], [2252, 2750], [2286, 2762], [2302, 2784], [2314, 2782], [2322, 2798], [2328, 2808], [2322, 2832], [2304, 2830], [2290, 2810], [2286, 2824], [2294, 2830], [2298, 2848], [2286, 2858], [2266, 2860], [2306, 2864], [2320, 2878], [2326, 2898], [2314, 2930], [2352, 2928], [2360, 2936], [2372, 2936], [2376, 2950], [2352, 2960], [2382, 2964], [2388, 2978], [2372, 2992], [2390, 2996], [2396, 3012], [2408, 3016], [2394, 3034], [2372, 3040], [2368, 3052], [2338, 3052], [2340, 3058], [2364, 3062], [2356, 3070], [2360, 3074], [2374, 3058], [2400, 3054], [2400, 3078], [2336, 3086], [2336, 3092], [2360, 3092], [2366, 3102], [2390, 3096], [2394, 3104], [2412, 3104], [2418, 3112], [2430, 3114], [2428, 3144], [2392, 3152], [2404, 3160], [2430, 3152], [2442, 3134], [2458, 3134], [2476, 3144], [2482, 3154], [2476, 3168], [2492, 3180], [2492, 3192], [2474, 3194], [2504, 3206], [2502, 3220], [2518, 3228], [2524, 3250], [2542, 3278], [2578, 3314], [2594, 3346], [2606, 3350], [2630, 3380], [2630, 3394], [2618, 3396], [2538, 3356], [2578, 3388], [2580, 3400], [2562, 3402], [2602, 3410], [2610, 3422], [2634, 3424], [2670, 3456], [2684, 3474], [2688, 3492], [2706, 3508], [2706, 3534], [2698, 3548], [2678, 3558], [2662, 3558], [2648, 3588], [2650, 3612], [2626, 3606], [2624, 3624], [2618, 3626], [2610, 3614], [2596, 3614], [2562, 3582], [2544, 3582], [2582, 3614], [2586, 3628], [2548, 3636], [2542, 3644], [2528, 3640], [2524, 3648], [2512, 3650], [2510, 3664], [2482, 3662], [2470, 3640], [2466, 3662], [2438, 3662], [2420, 3654], [2416, 3640], [2422, 3636], [2428, 3608], [2422, 3610], [2406, 3648], [2414, 3658], [2410, 3670], [2362, 3670], [2340, 3660]], [[1976, 3370], [1956, 3368], [1948, 3358], [1954, 3344], [1976, 3342], [1976, 3328], [1954, 3328], [1954, 3316], [1936, 3322], [1926, 3308], [1924, 3286], [1944, 3272], [1948, 3254], [1936, 3258], [1932, 3272], [1914, 3272], [1924, 3260], [1912, 3248], [1918, 3230], [1900, 3222], [1906, 3206], [1926, 3192], [1940, 3194], [1940, 3186], [1922, 3182], [1904, 3196], [1894, 3190], [1898, 3158], [1912, 3132], [1928, 3128], [1946, 3136], [1942, 3128], [1918, 3118], [1918, 3102], [1930, 3086], [1940, 3086], [1948, 3098], [1954, 3084], [1962, 3084], [1982, 3102], [1996, 3094], [1990, 3080], [1998, 3072], [1972, 3072], [1966, 3060], [1952, 3052], [1952, 3042], [1964, 3030], [1962, 3020], [1974, 3002], [1996, 3000], [1982, 2992], [1982, 2982], [2002, 2960], [2040, 2952], [2040, 2970], [2058, 2958], [2060, 2976], [2064, 2962], [2076, 2956], [2082, 2970], [2080, 2998], [2088, 2988], [2094, 2990], [2096, 3012], [2106, 3014], [2118, 3046], [2130, 3052], [2130, 3040], [2140, 3040], [2156, 3050], [2156, 3058], [2146, 3062], [2130, 3054], [2164, 3082], [2164, 3094], [2148, 3126], [2138, 3124], [2132, 3132], [2114, 3126], [2116, 3174], [2108, 3188], [2096, 3190], [2106, 3208], [2102, 3230], [2092, 3236], [2080, 3232], [2078, 3210], [2086, 3200], [2080, 3192], [2068, 3208], [2068, 3246], [2034, 3256], [2036, 3266], [2024, 3280], [2006, 3344], [1976, 3370]], [[3688, 2676], [3666, 2672], [3668, 2642], [3700, 2644], [3700, 2652], [3686, 2660], [3688, 2676]], [[1810, 2808], [1794, 2802], [1784, 2790], [1806, 2794], [1798, 2780], [1816, 2766], [1816, 2742], [1808, 2744], [1792, 2774], [1778, 2778], [1772, 2764], [1778, 2734], [1784, 2730], [1778, 2726], [1762, 2746], [1762, 2762], [1750, 2766], [1750, 2780], [1728, 2800], [1714, 2792], [1720, 2770], [1732, 2764], [1720, 2754], [1720, 2744], [1738, 2736], [1736, 2720], [1744, 2722], [1748, 2712], [1764, 2714], [1756, 2698], [1760, 2690], [1822, 2698], [1818, 2686], [1806, 2678], [1816, 2642], [1862, 2644], [1872, 2654], [1870, 2686], [1880, 2690], [1880, 2706], [1874, 2710], [1874, 2782], [1856, 2798], [1846, 2796], [1840, 2782], [1828, 2796], [1808, 2796], [1810, 2808]], [[1438, 2888], [1432, 2866], [1414, 2872], [1384, 2866], [1354, 2812], [1338, 2800], [1332, 2780], [1306, 2770], [1300, 2748], [1308, 2724], [1320, 2736], [1340, 2730], [1344, 2742], [1354, 2732], [1354, 2720], [1370, 2724], [1378, 2736], [1376, 2750], [1388, 2746], [1398, 2764], [1394, 2784], [1404, 2788], [1406, 2806], [1412, 2806], [1410, 2772], [1420, 2760], [1434, 2764], [1438, 2788], [1456, 2794], [1454, 2822], [1460, 2830], [1452, 2838], [1452, 2850], [1468, 2860], [1468, 2870], [1454, 2886], [1438, 2888]], [[1696, 3090], [1692, 3056], [1712, 3052], [1708, 3030], [1726, 3046], [1726, 3026], [1740, 3022], [1734, 3012], [1738, 2996], [1722, 3002], [1706, 2998], [1710, 2976], [1724, 2964], [1742, 2974], [1756, 2976], [1746, 2954], [1754, 2954], [1766, 2966], [1796, 2956], [1812, 2918], [1832, 2916], [1842, 2922], [1844, 2948], [1826, 2978], [1830, 3006], [1820, 3024], [1814, 3030], [1796, 3030], [1798, 3046], [1782, 3062], [1762, 3052], [1752, 3086], [1734, 3098], [1718, 3098], [1696, 3090]], [[1722, 2684], [1712, 2672], [1710, 2652], [1730, 2646], [1738, 2654], [1736, 2674], [1722, 2684]], [[1862, 3030], [1856, 3022], [1862, 3004], [1856, 2990], [1868, 2962], [1886, 2954], [1872, 2938], [1884, 2930], [1888, 2916], [1898, 2922], [1910, 2922], [1936, 2938], [1930, 2968], [1938, 2982], [1926, 2994], [1910, 2994], [1908, 3006], [1884, 3026], [1862, 3030]], [[1598, 2950], [1560, 2948], [1534, 2938], [1516, 2922], [1520, 2888], [1538, 2868], [1550, 2866], [1574, 2876], [1592, 2890], [1592, 2912], [1576, 2920], [1602, 2934], [1598, 2950]], [[1584, 3024], [1570, 3020], [1558, 3004], [1546, 3002], [1520, 2984], [1520, 2968], [1536, 2976], [1546, 2976], [1552, 2968], [1560, 2968], [1564, 2976], [1580, 2968], [1608, 2974], [1608, 3002], [1584, 3024]], [[1906, 2906], [1904, 2892], [1914, 2880], [1968, 2878], [1976, 2908], [1964, 2914], [1916, 2914], [1906, 2906]], [[1392, 2722], [1380, 2698], [1400, 2690], [1412, 2706], [1422, 2744], [1414, 2744], [1392, 2722]], [[1948, 2730], [1938, 2728], [1938, 2716], [1948, 2712], [1948, 2730]], [[2034, 2900], [2020, 2894], [2024, 2860], [2020, 2850], [2028, 2846], [2034, 2856], [2050, 2854], [2056, 2862], [2054, 2884], [2034, 2900]], [[2300, 2744], [2290, 2738], [2284, 2722], [2294, 2720], [2298, 2734], [2300, 2744]], [[1830, 3196], [1820, 3192], [1816, 3162], [1832, 3160], [1836, 3144], [1848, 3138], [1852, 3162], [1846, 3190], [1830, 3196]], [[1686, 2912], [1682, 2904], [1698, 2850], [1726, 2842], [1728, 2848], [1708, 2878], [1702, 2900], [1686, 2912]], [[1478, 2934], [1490, 2908], [1504, 2906], [1510, 2914], [1512, 2922], [1496, 2942], [1486, 2942], [1478, 2934]], [[1774, 2928], [1764, 2924], [1768, 2906], [1780, 2902], [1798, 2908], [1794, 2922], [1774, 2928]], [[3660, 2800], [3660, 2774], [3674, 2742], [3670, 2798], [3660, 2800]], [[1486, 2806], [1512, 2804], [1512, 2820], [1488, 2820], [1486, 2806]], [[2978, 3612], [2980, 3592], [3000, 3592], [2994, 3608], [2978, 3612]], [[3664, 2982], [3650, 2972], [3648, 2964], [3664, 2958], [3664, 2982]], [[3698, 2920], [3690, 2918], [3682, 2900], [3684, 2894], [3692, 2896], [3698, 2920]], [[3690, 3070], [3684, 3060], [3684, 3052], [3690, 3050], [3696, 3054], [3696, 3068], [3690, 3070]], [[2450, 2878], [2452, 2866], [2470, 2866], [2466, 2876], [2450, 2878]], [[3652, 3036], [3646, 3018], [3658, 3018], [3660, 3034], [3652, 3036]], [[2478, 2880], [2480, 2870], [2488, 2872], [2496, 2876], [2478, 2880]], [[2506, 2786], [2512, 2786], [2512, 2792], [2506, 2792], [2506, 2786]]], [[[3644, 3192], [3652, 3176], [3644, 3168], [3642, 3146], [3632, 3142], [3630, 3152], [3644, 3192]]], [[[2630, 1480], [2642, 1474], [2644, 1462], [2632, 1470], [2618, 1460], [2608, 1464], [2612, 1472], [2624, 1470], [2630, 1480]]], [[[2480, 2074], [2494, 2056], [2508, 2050], [2506, 2034], [2490, 2034], [2482, 2026], [2472, 2052], [2480, 2074]]], [[[2468, 1976], [2488, 1962], [2488, 1954], [2476, 1946], [2462, 1950], [2468, 1958], [2468, 1976]]], [[[2464, 236], [2478, 224], [2474, 210], [2466, 210], [2458, 222], [2464, 236]]], [[[2350, 1122], [2360, 1120], [2360, 1104], [2348, 1096], [2284, 1096], [2300, 1112], [2344, 1114], [2350, 1122]]], [[[2276, 1080], [2296, 1076], [2232, 1040], [2216, 1038], [2200, 1048], [2202, 1054], [2232, 1062], [2244, 1074], [2264, 1072], [2276, 1080]]], [[[2248, 2266], [2274, 2262], [2284, 2252], [2258, 2248], [2248, 2266]]], [[[2190, 1188], [2220, 1186], [2216, 1174], [2226, 1168], [2236, 1170], [2236, 1180], [2252, 1180], [2276, 1152], [2274, 1138], [2266, 1136], [2242, 1154], [2244, 1132], [2236, 1124], [2234, 1096], [2228, 1090], [2220, 1090], [2214, 1118], [2188, 1110], [2200, 1128], [2200, 1154], [2170, 1178], [2184, 1180], [2190, 1188]]], [[[2124, 1274], [2140, 1248], [2162, 1244], [2172, 1202], [2166, 1198], [2160, 1206], [2142, 1206], [2114, 1198], [2088, 1214], [2092, 1228], [2042, 1202], [2032, 1204], [2030, 1212], [2006, 1208], [2032, 1236], [2052, 1242], [2070, 1264], [2094, 1274], [2124, 1274]]], [[[2158, 1182], [2164, 1174], [2152, 1150], [2138, 1146], [2128, 1122], [2132, 1066], [2120, 1048], [2108, 1046], [2098, 1076], [2098, 1100], [2110, 1142], [2102, 1150], [2114, 1170], [2148, 1182], [2158, 1182]]], [[[2086, 1322], [2092, 1314], [2086, 1298], [2072, 1308], [2076, 1322], [2086, 1322]]], [[[2052, 2012], [2078, 1998], [2088, 1982], [2070, 1984], [2052, 2012]]], [[[1850, 1460], [1868, 1456], [1890, 1382], [1884, 1382], [1880, 1392], [1864, 1394], [1848, 1420], [1848, 1430], [1840, 1434], [1844, 1456], [1850, 1460]]], [[[1810, 1446], [1822, 1440], [1826, 1410], [1812, 1424], [1810, 1446]]], [[[1800, 1884], [1802, 1878], [1794, 1870], [1796, 1850], [1780, 1852], [1776, 1870], [1800, 1884]]], [[[1780, 1624], [1782, 1618], [1772, 1606], [1772, 1588], [1764, 1582], [1760, 1608], [1772, 1624], [1780, 1624]]], [[[1604, 1698], [1618, 1690], [1636, 1692], [1640, 1684], [1594, 1674], [1576, 1658], [1580, 1676], [1604, 1698]]], [[[1578, 1852], [1576, 1844], [1590, 1840], [1544, 1810], [1544, 1820], [1570, 1852], [1578, 1852]]], [[[1472, 1834], [1500, 1824], [1516, 1808], [1530, 1810], [1530, 1786], [1514, 1784], [1506, 1764], [1452, 1758], [1444, 1774], [1458, 1774], [1466, 1796], [1484, 1798], [1488, 1804], [1472, 1834]]], [[[1364, 2076], [1374, 2074], [1378, 2064], [1358, 2050], [1358, 2040], [1398, 2036], [1414, 2046], [1414, 2030], [1402, 2006], [1372, 2006], [1366, 1998], [1372, 1984], [1350, 1964], [1342, 1964], [1358, 1984], [1358, 1994], [1350, 1998], [1330, 1986], [1322, 1964], [1294, 1968], [1292, 1974], [1302, 1980], [1304, 1992], [1316, 2004], [1312, 2016], [1332, 2014], [1336, 2022], [1320, 2034], [1298, 2034], [1280, 2026], [1262, 2030], [1256, 2020], [1250, 2030], [1318, 2052], [1364, 2076]]], [[[1252, 1318], [1268, 1302], [1288, 1296], [1302, 1280], [1302, 1252], [1276, 1256], [1290, 1264], [1290, 1274], [1276, 1292], [1254, 1306], [1252, 1318]]]]}, "properties": {}, "id": 0, "type": 3}]}, "admin": {"extent": 4096, "version": 2, "features": [{"geometry": {"type": "LineString", "coordinates": [[3817, 340], [3802, 351], [3792, 370], [3781, 371], [3770, 384], [3729, 382], [3720, 371]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR-SN", "maritime": 0}, "id": 1, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2756, 6], [2756, 28]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 0}, "id": 2, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2146, 254], [2141, 254]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR-NI", "maritime": 1}, "id": 3, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2192, 250], [2192, 252]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR-NI", "maritime": 1}, "id": 4, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2109, 298], [2123, 305], [2122, 316], [2139, 324], [2145, 318], [2158, 328], [2164, 341], [2174, 336], [2204, 345]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN-NI", "maritime": 0}, "id": 5, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2104, 301], [2109, 298]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN-NI", "maritime": 1}, "id": 6, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2204, 345], [2206, 346]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN-NI", "maritime": 1}, "id": 7, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1491, 426], [1484, 430], [1479, 424], [1485, 420], [1491, 426]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 8, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2226, 366], [2221, 371], [2216, 366], [2221, 361], [2226, 366]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN", "maritime": 1}, "id": 9, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2082, 371], [2089, 367]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT", "maritime": 1}, "id": 10, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4129, 1074], [4129, 1068], [4135, 1070]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AD-ES", "maritime": 0}, "id": 11, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4150, 1363], [4154, 1357]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BE-FR", "maritime": 1}, "id": 12, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2301, 33], [2294, 33]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-EC", "maritime": 1}, "id": 13, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1995, 332], [1997, 334]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT-MX", "maritime": 1}, "id": 14, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[250, 1990], [263, 1990], [287, 1976], [305, 1931], [313, 1926], [323, 1930], [342, 1924], [371, 1931], [396, 1919], [406, 1930], [427, 1902], [424, 1898], [394, 1903], [384, 1895], [388, 1881], [382, 1876], [360, 1884], [331, 1868], [334, 1851], [311, 1819], [305, 1793], [310, 1777], [331, 1754], [323, 1743], [313, 1748], [281, 1735], [281, 1715], [314, 1697], [334, 1706], [339, 1718], [346, 1718], [363, 1694], [396, 1703], [404, 1696], [400, 1684], [406, 1667], [397, 1658], [402, 1649], [432, 1644], [442, 1649], [458, 1646], [465, 1653], [474, 1638], [497, 1646], [502, 1636], [495, 1610], [438, 1555], [411, 1549], [390, 1529], [378, 1531], [377, 1518], [346, 1506], [336, 1484], [292, 1472], [284, 1453], [277, 1457], [278, 1469], [268, 1471], [269, 1457], [246, 1432], [234, 1439], [217, 1423], [198, 1419], [191, 1410], [194, 1401], [247, 1412], [268, 1421], [274, 1431], [305, 1438], [326, 1460], [347, 1463], [364, 1483], [381, 1484], [384, 1474], [399, 1470], [424, 1491], [430, 1504], [470, 1489], [482, 1502], [473, 1527], [490, 1532], [515, 1559], [521, 1559], [524, 1539], [538, 1541], [532, 1570], [560, 1607], [577, 1578], [566, 1567], [568, 1558], [576, 1554], [597, 1559], [605, 1575], [639, 1599], [639, 1628], [648, 1631], [651, 1640], [639, 1659], [647, 1669], [678, 1679], [685, 1690], [696, 1688], [706, 1706], [721, 1706], [731, 1698], [745, 1702], [753, 1716], [774, 1726], [801, 1718], [797, 1707], [803, 1698], [818, 1708], [850, 1713], [901, 1695], [945, 1668], [980, 1632], [996, 1601], [997, 1583], [1027, 1546], [1027, 1535], [1044, 1531], [1052, 1490], [1105, 1493]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 15, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3925, 99], [3925, 95]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI-LR", "maritime": 1}, "id": 16, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3716, 283], [3712, 281]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GW-SN", "maritime": 1}, "id": 17, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4050, 1315], [4048, 1299]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-GG", "maritime": 1}, "id": 18, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2736, 197], [2731, 195]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GY-VE", "maritime": 1}, "id": 19, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2100, 301], [2104, 301]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NI-SV", "maritime": 1}, "id": 20, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3888, 1051], [3894, 1051]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-PT", "maritime": 1}, "id": 21, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2457, 463], [2463, 457]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DO-HT", "maritime": 1}, "id": 22, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2463, 417], [2461, 415]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DO-HT", "maritime": 1}, "id": 23, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2044, 313], [2046, 316]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT-SV", "maritime": 1}, "id": 24, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4034, 865], [4040, 862]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 26, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4034, 865], [4029, 860]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-MA", "maritime": 1}, "id": 27, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4045, 859], [4040, 862]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 1}, "id": 28, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2659, 418], [2655, 415]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-NL", "maritime": 1}, "id": 29, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2662, 418], [2661, 412]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-NL", "maritime": 1}, "id": 30, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2628, 1731], [2620, 1729], [2626, 1722], [2619, 1720], [2625, 1714], [2618, 1697], [2624, 1692], [2632, 1695], [2627, 1686], [2634, 1673], [2622, 1676], [2619, 1669], [2633, 1668], [2637, 1661], [2645, 1667], [2652, 1662], [2639, 1659], [2637, 1653], [2644, 1650], [2630, 1631], [2642, 1616], [2649, 1618], [2643, 1581], [2636, 1574], [2643, 1563], [2636, 1563], [2636, 1557], [2643, 1554], [2639, 1548], [2652, 1546], [2643, 1541], [2648, 1531], [2644, 1524], [2655, 1519], [2647, 1516], [2653, 1515], [2642, 1489], [2631, 1497], [2622, 1494], [2615, 1504], [2601, 1493], [2598, 1502], [2576, 1519], [2579, 1493], [2561, 1507], [2570, 1493], [2565, 1485], [2560, 1489], [2554, 1483], [2553, 1466], [2564, 1448], [2574, 1443], [2572, 1431], [2563, 1432], [2564, 1424], [2577, 1415], [2584, 1430], [2586, 1396], [2588, 1402], [2594, 1392], [2606, 1394], [2609, 1384], [2623, 1381], [2627, 1374], [2636, 1394], [2636, 1417], [2648, 1423], [2654, 1415], [2641, 1413], [2638, 1407], [2645, 1402], [2644, 1390], [2796, 1390], [2796, 1367]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 31, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2071, 1580], [1931, 1421], [1931, 1296]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 32, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3156, -64], [3155, -61]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 1}, "id": 33, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2630, 1734], [2628, 1731]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 34, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[988, 2223], [991, 2191]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 35, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3144, -62], [3147, -59]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 1}, "id": 37, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3715, 300], [3710, 300]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GM-SN", "maritime": 1}, "id": 38, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2335, 198], [2336, 201]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-PA", "maritime": 1}, "id": 39, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3789, 205], [3793, 206]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-SL", "maritime": 1}, "id": 40, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3834, 158], [3832, 154]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "LR-SL", "maritime": 1}, "id": 41, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3712, 312], [3719, 312]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GM-SN", "maritime": 1}, "id": 42, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[887, 2239], [893, 2251]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "US", "maritime": 1}, "id": 43, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1105, 1493], [1124, 1493]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-US", "maritime": 1}, "id": 44, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4133, 142], [4134, 138]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BJ-TG", "maritime": 1}, "id": 45, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2209, 181], [2210, 184]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR-PA", "maritime": 1}, "id": 46, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2678, 396], [2673, 390]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AG-KN", "maritime": 1}, "id": 47, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2683, 393], [2682, 393]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MS", "maritime": 1}, "id": 48, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2621, 1166], [2633, 1176]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 49, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1995, 332], [2014, 319], [2044, 313]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT", "maritime": 1}, "id": 50, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2663, 410], [2666, 409]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-NL", "maritime": 1}, "id": 52, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3914, 233], [3911, 218], [3917, 215], [3920, 207], [3915, 202], [3922, 191], [3910, 194], [3908, 188], [3915, 183], [3909, 172], [3903, 172]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI-GN", "maritime": 0}, "id": 53, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3862, 194], [3880, 191], [3880, 168], [3889, 164], [3899, 176], [3903, 172]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-LR", "maritime": 0}, "id": 54, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3754, 497], [3751, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA-MR", "maritime": 0}, "id": 55, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3708, 483], [3709, 480]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA-MR", "maritime": 1}, "id": 57, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1279, 1717], [1365, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 58, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2703, 226], [2712, 229], [2723, 262], [2714, 264], [2691, 250]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "TT", "maritime": 1}, "id": 59, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2575, 28], [2569, 27], [2562, 51], [2551, 41], [2544, 46], [2545, 39], [2507, 39], [2507, 24], [2520, 24], [2523, 15], [2502, 13], [2502, -4], [2512, -11], [2517, -26], [2510, -64]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR-CO", "maritime": 0}, "id": 60, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4139, 1361], [4125, 1347]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-GB", "maritime": 1}, "id": 61, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[80, 0], [85, 4], [81, 9], [75, 5], [80, 0]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 63, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3899, 656], [3796, 656]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "EH-MA", "maritime": 0}, "id": 64, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4004, 1484], [4019, 1461], [4018, 1448], [3995, 1452], [3984, 1447], [3987, 1431], [3979, 1416], [3996, 1407], [3969, 1391], [3964, 1379], [3974, 1372], [3974, 1337], [3958, 1322], [3946, 1321], [3944, 1311], [3954, 1307], [3961, 1315], [3980, 1309], [3996, 1323], [4014, 1318], [4026, 1335], [4039, 1329], [4057, 1335], [4067, 1331], [4125, 1347]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 65, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3943, 1521], [3937, 1546], [3926, 1552], [3914, 1576], [3912, 1616], [3922, 1632], [3914, 1636], [3914, 1645], [3922, 1650], [3931, 1646], [3952, 1660], [4010, 1664], [4020, 1694], [4049, 1695], [4058, 1706], [4056, 1716], [4044, 1714], [4039, 1727], [4057, 1753], [4072, 1765], [4081, 1765], [4088, 1757], [4088, 1733], [4075, 1705], [4067, 1701], [4066, 1690], [4051, 1690], [4033, 1641], [4022, 1630], [4026, 1624], [4053, 1624], [4062, 1616], [4064, 1604], [4047, 1556], [4067, 1534], [4074, 1499], [4101, 1474], [4112, 1435], [4129, 1432], [4141, 1420], [4139, 1391], [4125, 1375], [4134, 1373], [4139, 1361]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 66, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1551, 441], [1546, 436], [1541, 440], [1546, 445], [1551, 441]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 67, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1998, 470], [2003, 465], [2008, 469], [2003, 475], [1998, 470]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 68, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[37, 679], [42, 675], [39, 669], [33, 674], [37, 679]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 69, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4160, 1370], [4150, 1363]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BE", "maritime": 1}, "id": 70, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3425, 18], [3431, 25], [3432, 19], [3425, 18]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR", "maritime": 1}, "id": 71, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1569, 448], [1575, 443], [1579, 449], [1574, 453], [1569, 448]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 72, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3958, 1685], [3948, 1682], [3949, 1671], [3969, 1670], [3971, 1683], [3958, 1685]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 73, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3944, 1777], [3919, 1815], [3931, 1832], [3956, 1828], [3944, 1777]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FO", "maritime": 1}, "id": 74, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1577, 435], [1572, 443], [1564, 438], [1570, 429], [1577, 435]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 75, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[0, 1838], [0, 1854]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "RU", "maritime": 1}, "id": 76, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1663, 507], [1675, 492], [1683, 493], [1671, 512], [1663, 507]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 77, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2002, 487], [1997, 493], [1991, 489], [1996, 482], [2002, 487]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 78, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3195, -64], [3188, -60], [3151, -61], [3122, -53], [3075, -24], [2998, -2], [2941, 67], [2935, 99], [2923, 104]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR", "maritime": 1}, "id": 79, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3985, 1483], [3980, 1462], [3992, 1460], [4003, 1470], [4004, 1484]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "IM", "maritime": 1}, "id": 80, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2021, 517], [2016, 522], [2011, 517], [2016, 512], [2021, 517]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 81, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2553, 424], [2557, 417], [2550, 413], [2545, 422], [2553, 424]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 82, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[250, 1990], [229, 2007], [224, 1991], [210, 1980], [192, 1981], [186, 1927], [159, 1914], [133, 1923], [118, 1939], [97, 1944], [84, 1959], [82, 1978], [74, 1983], [21, 1976], [0, 1951]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "RU", "maritime": 1}, "id": 83, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3953, 1470], [3963, 1461]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "GB-IE", "maritime": 1}, "id": 84, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[0, 2216], [151, 2093], [197, 2082], [209, 2061], [243, 2034], [251, 2018]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "RU", "maritime": 1}, "id": 85, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[0, 2384], [20, 2388], [47, 2381], [72, 2346], [66, 2329], [54, 2320], [13, 2308], [0, 2311]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "RU", "maritime": 1}, "id": 86, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2061, 523], [2056, 532], [2048, 530], [2052, 519], [2061, 523]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 87, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[552, 1528], [565, 1536], [558, 1550], [544, 1541], [552, 1528]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 88, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3789, 205], [3795, 171], [3832, 154]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "SL", "maritime": 1}, "id": 89, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2336, 201], [2359, 218], [2374, 245], [2390, 258], [2463, 290], [2477, 287]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 90, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3988, 1680], [3985, 1672], [3990, 1665], [4004, 1672], [4000, 1684], [3988, 1680]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 91, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2700, 345], [2692, 361]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DM", "maritime": 1}, "id": 92, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2705, 362], [2704, 347]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DM", "maritime": 1}, "id": 93, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3963, 1461], [3980, 1484], [3985, 1483]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 94, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3943, 1521], [3931, 1530], [3905, 1523], [3889, 1498], [3891, 1485], [3872, 1488], [3854, 1472], [3857, 1438], [3872, 1424], [3847, 1396], [3850, 1377], [3859, 1368], [3881, 1362], [3905, 1369], [3930, 1388], [3959, 1392], [3967, 1426], [3963, 1461]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "IE", "maritime": 1}, "id": 95, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2476, 488], [2457, 463]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DO", "maritime": 1}, "id": 96, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[61, 664], [54, 670], [60, 676], [66, 670], [61, 664]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 97, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2692, 361], [2705, 362]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DM-FR", "maritime": 1}, "id": 98, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2367, 895], [2368, 895]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 99, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3777, 1612], [3785, 1619], [3792, 1609], [3784, 1604], [3777, 1612]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 100, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3897, 1630], [3892, 1617], [3907, 1612], [3910, 1628], [3897, 1630]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB", "maritime": 1}, "id": 101, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[136, 620], [142, 615], [137, 609], [131, 614], [136, 620]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 102, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2265, 333], [2271, 337], [2278, 332], [2265, 324], [2265, 333]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 103, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[214, 604], [219, 599], [214, 593], [209, 598], [214, 604]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 104, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[230, 1563], [243, 1561], [247, 1575], [228, 1578], [225, 1570], [230, 1563]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 105, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1458, 583], [1465, 583], [1466, 590], [1459, 591], [1458, 583]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 106, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2273, 317], [2279, 311], [2275, 305], [2269, 311], [2273, 317]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 107, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2624, 416], [2615, 413], [2617, 405], [2631, 408], [2624, 416]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 108, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1397, 693], [1401, 682], [1408, 682], [1409, 699], [1400, 699], [1397, 693]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 109, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2294, 33], [2271, 22], [2247, -27], [2246, -64]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "EC", "maritime": 1}, "id": 110, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3749, 246], [3778, 223], [3777, 214], [3789, 205]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN", "maritime": 1}, "id": 111, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2462, 1055], [2472, 1056], [2478, 1040]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 112, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2099, 419], [2108, 415], [2104, 428], [2114, 429], [2108, 439], [2110, 466], [2119, 467], [2127, 478], [2125, 504], [2115, 509], [2089, 509], [2038, 494], [2027, 451], [2006, 437], [1947, 425], [1941, 434], [1917, 441], [1889, 483], [1884, 495], [1889, 503], [1874, 525], [1878, 574], [1890, 612]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 113, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2281, 369], [2289, 365], [2281, 358], [2276, 363], [2281, 369]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 114, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2024, 26], [1998, 41], [2010, -25], [2059, -36], [2069, -14], [2052, 11], [2024, 26]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "EC", "maritime": 1}, "id": 115, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1423, 785], [1422, 778], [1431, 772], [1450, 734], [1457, 707], [1495, 675], [1490, 664], [1480, 665], [1475, 679], [1462, 677], [1461, 669], [1489, 639], [1539, 610], [1536, 580], [1582, 548], [1589, 532], [1597, 530], [1607, 537], [1610, 554], [1598, 576], [1585, 583], [1579, 608], [1554, 640], [1555, 653], [1536, 661], [1534, 676], [1541, 669], [1545, 680], [1558, 659], [1573, 655], [1576, 643], [1605, 624], [1603, 601], [1625, 590], [1684, 527], [1687, 516], [1681, 508], [1690, 507], [1697, 495], [1686, 472], [1705, 444], [1730, 431], [1738, 420], [1775, 411], [1794, 395], [1869, 363], [1900, 356], [1947, 368], [1995, 332]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX", "maritime": 1}, "id": 116, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2320, 161], [2328, 141], [2327, 97], [2294, 33]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 117, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2230, 283], [2236, 294], [2247, 285], [2234, 274], [2230, 283]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 118, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2235, 93], [2244, 92], [2240, 86], [2235, 93]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 119, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[263, 1970], [265, 1954], [281, 1957], [278, 1973], [263, 1970]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 120, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2239, 306], [2242, 315], [2250, 313], [2247, 302], [2239, 306]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 121, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2244, 328], [2247, 337], [2254, 336], [2252, 321], [2244, 328]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 122, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2304, 370], [2310, 372], [2312, 363], [2301, 361], [2304, 370]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO", "maritime": 1}, "id": 123, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[237, 392], [233, 384], [242, 382], [244, 390], [237, 392]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 124, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[0, 1382], [0, 1395]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 125, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[273, 583], [268, 588], [273, 593], [278, 588], [273, 583]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 126, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[893, 2251], [840, 2287], [802, 2277], [737, 2309], [690, 2316], [660, 2309], [631, 2336], [596, 2338], [575, 2355], [531, 2373], [498, 2334], [485, 2340], [469, 2336], [427, 2299], [404, 2296], [375, 2257], [371, 2225], [363, 2213], [354, 2206], [307, 2201], [300, 2171], [288, 2162], [292, 2148], [307, 2143], [352, 2105], [358, 2078], [384, 2067], [401, 2045], [390, 2037], [383, 2041], [387, 2051], [381, 2061], [352, 2064], [317, 2048], [264, 2010], [251, 2018]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 127, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1251, 1265], [1269, 1184], [1264, 1111], [1254, 1079], [1266, 1039], [1258, 1006], [1272, 986], [1275, 960], [1292, 940], [1290, 927], [1302, 925], [1317, 885], [1345, 851], [1349, 823], [1362, 815], [1396, 819], [1392, 812], [1383, 814], [1382, 807], [1370, 811], [1368, 803], [1381, 797], [1383, 805], [1392, 807], [1392, 794], [1402, 785], [1408, 790], [1403, 799], [1409, 803], [1407, 810], [1421, 798], [1423, 785]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 128, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[155, 1732], [157, 1722], [165, 1718], [182, 1724], [187, 1732], [162, 1759], [149, 1753], [155, 1732]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 129, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[210, 1591], [221, 1581], [235, 1588], [238, 1596], [223, 1606], [213, 1601], [210, 1591]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 130, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1890, 612], [1885, 641], [1893, 659], [1957, 703], [1975, 705], [2026, 686], [2056, 691], [2062, 682], [2076, 691], [2073, 701], [2080, 717], [2131, 721], [2160, 700], [2183, 713], [2208, 687], [2208, 650], [2222, 622], [2244, 597], [2245, 589], [2224, 582], [2223, 573], [2233, 569], [2270, 584], [2280, 634], [2249, 724], [2255, 759], [2299, 798], [2307, 813], [2325, 814], [2343, 836], [2357, 834], [2368, 848], [2382, 854], [2384, 869], [2373, 905], [2390, 937], [2393, 957], [2415, 985], [2419, 1006], [2462, 1020], [2477, 1032], [2484, 1026], [2508, 1028], [2509, 1056], [2492, 1064], [2498, 1092], [2503, 1099], [2532, 1105], [2540, 1113], [2549, 1111], [2550, 1121], [2565, 1129]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 131, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[348, 547], [343, 552], [348, 557], [353, 552], [348, 547]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 132, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[188, 613], [194, 607], [188, 602], [183, 607], [188, 613]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 133, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2618, 431], [2569, 434], [2555, 425], [2567, 410], [2594, 410], [2625, 419]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 134, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[89, 662], [97, 667], [102, 660], [93, 653], [89, 662]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 135, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[73, 1397], [23, 1391], [15, 1378], [14, 1358], [22, 1355], [33, 1367], [41, 1364], [60, 1372], [75, 1369], [108, 1384], [158, 1384], [183, 1403], [172, 1413], [161, 1402], [153, 1402], [133, 1414], [118, 1403], [110, 1406], [73, 1397]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 136, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[75, 14], [81, 16], [79, 23], [73, 20], [75, 14]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 137, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[267, 1871], [264, 1884], [237, 1892], [227, 1905], [205, 1902], [188, 1912], [178, 1905], [175, 1885], [181, 1873], [194, 1866], [207, 1872], [230, 1849], [260, 1856], [267, 1871]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 138, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[318, 549], [308, 554], [308, 563], [320, 561], [318, 549]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 139, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[400, 152], [406, 147], [403, 141], [394, 145], [400, 152]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 140, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[412, 534], [406, 539], [411, 545], [416, 540], [412, 534]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 141, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[557, 473], [568, 468], [578, 452], [553, 434], [544, 439], [540, 459], [546, 475], [557, 473]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 142, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[445, 510], [463, 524], [476, 517], [471, 506], [458, 509], [441, 500], [438, 507], [445, 510]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 143, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2384, 425], [2387, 431], [2394, 427], [2390, 421], [2384, 425]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 144, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2477, 287], [2483, 292], [2488, 281], [2499, 283]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 145, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[507, 490], [495, 493], [491, 507], [503, 511], [513, 497], [532, 497], [549, 488], [551, 481], [530, 472], [512, 492], [507, 490]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 146, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4158, 141], [4134, 138]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BJ", "maritime": 1}, "id": 147, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[454, -13], [460, -9], [456, -4], [450, -8], [454, -13]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 148, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[413, 136], [410, 129], [402, 133], [405, 139], [413, 136]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 149, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[513, 1545], [507, 1535], [516, 1529], [522, 1538], [513, 1545]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 150, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[757, 1696], [756, 1687], [763, 1682], [777, 1689], [772, 1704], [761, 1704], [757, 1696]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 151, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2209, 584], [2204, 577], [2211, 573], [2217, 580], [2209, 584]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 152, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2574, 1142], [2570, 1127]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "US", "maritime": 1}, "id": 153, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1258, 1265], [1251, 1265]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-US", "maritime": 1}, "id": 154, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2141, 254], [2099, 293], [2100, 301]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NI", "maritime": 1}, "id": 155, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4025, 116], [4024, 112]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI-GH", "maritime": 1}, "id": 157, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3899, 656], [3899, 647]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "-DZ", "maritime": 0}, "id": 158, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4029, 1294], [4037, 1313], [4050, 1315]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GG", "maritime": 1}, "id": 159, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4045, 859], [4058, 864], [4068, 877], [4115, 897], [4160, 907]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DZ", "maritime": 1}, "id": 160, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2871, 136], [2799, 142]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "SR", "maritime": 1}, "id": 161, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2192, 252], [2206, 346]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NI", "maritime": 1}, "id": 162, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3712, 281], [3725, 248], [3749, 246]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GW", "maritime": 1}, "id": 163, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3709, 480], [3723, 469], [3715, 449], [3727, 417], [3715, 371]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR", "maritime": 1}, "id": 164, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3712, 312], [3710, 300]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GM", "maritime": 1}, "id": 165, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3710, 300], [3712, 281]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "SN", "maritime": 1}, "id": 166, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3715, 371], [3691, 338], [3700, 335], [3712, 312]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "SN", "maritime": 1}, "id": 167, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4024, 112], [3965, 111], [3925, 95]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI", "maritime": 1}, "id": 168, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3832, 154], [3888, 109], [3925, 95]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "LR", "maritime": 1}, "id": 169, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4024, 112], [4052, 104], [4104, 127], [4119, 128], [4125, 135]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GH", "maritime": 1}, "id": 170, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4134, 138], [4125, 135]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "TG", "maritime": 1}, "id": 171, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4160, 140], [4158, 141]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NG", "maritime": 1}, "id": 172, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2705, 362], [2712, 378], [2697, 386], [2685, 377], [2692, 361]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 173, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2211, 328], [2214, 334], [2211, 328]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NI", "maritime": 1}, "id": 174, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2567, 271], [2575, 264], [2593, 265], [2597, 272], [2580, 280], [2568, 273], [2558, 281], [2552, 278], [2555, 270], [2567, 271]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 175, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2210, 280], [2203, 278], [2207, 284], [2210, 280]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NI", "maritime": 1}, "id": 176, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2618, 431], [2629, 439], [2638, 435], [2636, 425], [2625, 419]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VG", "maritime": 1}, "id": 177, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2509, 281], [2514, 269], [2541, 261], [2552, 245], [2593, 253], [2598, 241], [2614, 236], [2628, 242], [2628, 257], [2661, 267], [2665, 258], [2654, 258], [2649, 249], [2691, 250]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 178, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2736, 197], [2741, 198], [2703, 226]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 179, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2653, 362], [2648, 367], [2643, 362], [2648, 356], [2653, 362]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 180, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2714, 118], [2698, 136], [2705, 141], [2705, 153], [2724, 161], [2714, 172], [2735, 188], [2731, 195]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GY-VE", "maritime": 0}, "id": 181, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2799, 142], [2772, 161], [2754, 187], [2736, 197]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GY", "maritime": 1}, "id": 182, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2605, 256], [2604, 246], [2616, 246], [2615, 255], [2605, 256]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 183, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2620, 272], [2629, 263], [2636, 268], [2627, 278], [2620, 272]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VE", "maritime": 1}, "id": 184, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2796, 135], [2799, 142]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GY-SR", "maritime": 1}, "id": 185, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2209, 181], [2189, 194], [2189, 207], [2167, 223], [2159, 216], [2145, 225], [2139, 236], [2144, 244], [2138, 248], [2141, 254]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR", "maritime": 1}, "id": 186, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2219, 221], [2192, 252]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR", "maritime": 1}, "id": 187, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2113, 122], [2119, 129], [2110, 126], [2113, 122]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR", "maritime": 1}, "id": 188, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2320, 161], [2304, 181], [2291, 185], [2291, 191], [2273, 185], [2280, 169], [2255, 160], [2248, 167], [2232, 161], [2209, 181]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PA", "maritime": 1}, "id": 189, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2217, 219], [2219, 221]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR-PA", "maritime": 1}, "id": 190, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2089, 367], [2143, 386], [2203, 353], [2195, 370], [2202, 374], [2214, 364], [2210, 356], [2224, 348], [2220, 343], [2206, 346]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN", "maritime": 1}, "id": 191, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2188, 407], [2181, 400], [2188, 398], [2188, 407]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN", "maritime": 1}, "id": 192, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2219, 221], [2246, 204], [2286, 226], [2308, 224], [2336, 201]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PA", "maritime": 1}, "id": 193, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2082, 371], [2095, 394], [2109, 398], [2106, 408], [2094, 411], [2099, 419]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BZ", "maritime": 1}, "id": 194, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3671, 2073], [3683, 2085], [3671, 2097], [3659, 2085], [3671, 2073]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "IS", "maritime": 1}, "id": 195, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2073, 367], [2082, 371]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BZ-GT", "maritime": 1}, "id": 196, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3888, 1051], [3891, 1015], [3873, 979], [3875, 955], [3888, 933], [3886, 907], [3892, 899], [3928, 907]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PT", "maritime": 1}, "id": 197, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3378, 980], [3385, 992], [3393, 990], [3390, 971], [3381, 971], [3378, 980]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PT", "maritime": 1}, "id": 198, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3502, 933], [3508, 939], [3525, 937], [3537, 918], [3529, 872], [3522, 875], [3518, 903], [3502, 933]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PT", "maritime": 1}, "id": 199, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3434, 954], [3458, 974], [3466, 969], [3462, 960], [3467, 957], [3473, 965], [3487, 957], [3482, 949], [3470, 951], [3454, 941], [3434, 954]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PT", "maritime": 1}, "id": 200, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3698, 792], [3704, 798], [3718, 795], [3724, 805], [3731, 801], [3722, 791], [3727, 780], [3723, 775], [3704, 783], [3698, 792]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PT", "maritime": 1}, "id": 201, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3737, 725], [3739, 717], [3727, 713], [3727, 721], [3737, 725]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "PT", "maritime": 1}, "id": 202, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3685, 1873], [3623, 1865], [3558, 1888], [3527, 1992], [3564, 2052], [3587, 2057], [3638, 2038], [3679, 2040], [3674, 2051], [3681, 2061], [3697, 2056], [3697, 2043], [3713, 2057], [3728, 2061], [3775, 2046], [3797, 1994], [3800, 1967], [3795, 1952], [3804, 1947], [3803, 1937], [3794, 1931], [3786, 1936], [3761, 1915], [3722, 1891], [3702, 1888], [3685, 1873]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "IS", "maritime": 1}, "id": 203, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3734, 497], [3732, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 0}, "id": 204, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3738, 497], [3736, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 0}, "id": 205, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2461, 415], [2461, 403], [2467, 399], [2501, 417], [2537, 415], [2546, 430], [2536, 465], [2518, 484], [2492, 496], [2481, 493]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DO", "maritime": 1}, "id": 206, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2461, 415], [2424, 420], [2414, 414], [2397, 427], [2402, 435], [2425, 433], [2425, 440], [2436, 445], [2420, 454], [2420, 462], [2438, 470], [2457, 463]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HT", "maritime": 1}, "id": 207, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2339, 514], [2398, 484], [2413, 473], [2413, 466], [2388, 457], [2326, 456], [2277, 499], [2209, 495], [2158, 509], [2170, 529], [2223, 547], [2269, 549], [2303, 535]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CU", "maritime": 1}, "id": 208, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1728, 1149], [1728, 1180]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 209, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3521, 385], [3514, 395], [3524, 402], [3543, 390], [3577, 393], [3585, 373], [3574, 346], [3562, 338], [3530, 337], [3537, 378], [3521, 385]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CV", "maritime": 1}, "id": 210, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2476, 488], [2460, 489], [2442, 502]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "TC", "maritime": 1}, "id": 211, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2442, 502], [2434, 484], [2420, 482], [2339, 514]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BS", "maritime": 1}, "id": 212, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2678, 396], [2667, 407]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KN", "maritime": 1}, "id": 213, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2673, 390], [2675, 387]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AG", "maritime": 1}, "id": 214, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2682, 393], [2678, 396]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AG", "maritime": 1}, "id": 215, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2442, 502], [2445, 512]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BS-TC", "maritime": 1}, "id": 216, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2661, 412], [2663, 410]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NL", "maritime": 1}, "id": 217, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2661, 399], [2673, 390]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KN", "maritime": 1}, "id": 218, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2686, 389], [2698, 394], [2690, 415], [2683, 411], [2688, 401], [2683, 393]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AG", "maritime": 1}, "id": 219, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2667, 407], [2661, 399]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KN-NL", "maritime": 1}, "id": 220, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2675, 387], [2682, 393]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AG-MS", "maritime": 1}, "id": 221, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2675, 387], [2682, 380], [2686, 389]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MS", "maritime": 1}, "id": 222, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2303, 535], [2265, 551], [2260, 561], [2275, 569], [2290, 588], [2286, 604], [2291, 639], [2312, 651], [2348, 631], [2378, 583], [2405, 570], [2446, 524], [2445, 512]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BS", "maritime": 1}, "id": 223, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2445, 512], [2455, 517], [2467, 514], [2481, 504], [2481, 493]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "TC", "maritime": 1}, "id": 224, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2706, 328], [2701, 319], [2705, 312]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "LC", "maritime": 1}, "id": 225, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2666, 409], [2667, 407]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NL", "maritime": 1}, "id": 226, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2705, 312], [2693, 289]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VC", "maritime": 1}, "id": 227, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2308, 423], [2323, 434], [2348, 431], [2363, 423], [2372, 400], [2315, 383], [2308, 423]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "JM", "maritime": 1}, "id": 228, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2741, 295], [2748, 303], [2738, 311], [2734, 300], [2741, 295]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BB", "maritime": 1}, "id": 229, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2704, 287], [2710, 297], [2708, 310]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "VC", "maritime": 1}, "id": 230, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2708, 310], [2715, 315], [2714, 327]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "LC", "maritime": 1}, "id": 231, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2693, 289], [2685, 276], [2689, 270], [2697, 273], [2704, 287]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GD", "maritime": 1}, "id": 232, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2574, 1142], [2565, 1129]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "CA", "maritime": 1}, "id": 233, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[518, 34], [524, 42], [510, 51], [507, 40], [518, 34]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KI", "maritime": 1}, "id": 234, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[193, -64], [194, -61], [187, -59], [185, -64]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KI", "maritime": 1}, "id": 235, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[447, 102], [452, 107], [446, 112], [441, 106], [447, 102]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KI", "maritime": 1}, "id": 236, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2100, 301], [2084, 299], [2044, 313]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "SV", "maritime": 1}, "id": 237, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[471, 82], [477, 88], [469, 94], [464, 88], [471, 82]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KI", "maritime": 1}, "id": 238, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2061, 893], [2060, 893]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 239, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4048, 1299], [4054, 1291], [4051, 1279], [4039, 1280], [4038, 1290]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-JE", "maritime": 1}, "id": 241, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 725], [2085, 726]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 242, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 724], [2085, 725]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 243, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1267, 1055], [1269, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 244, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2654, 418], [2648, 429], [2652, 435], [2667, 427], [2668, 420]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AI", "maritime": 1}, "id": 245, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2668, 420], [2654, 418]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AI-FR", "maritime": 1}, "id": 246, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4055, 1104], [3915, 1116], [3878, 1088], [3888, 1051]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 247, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3928, 907], [3939, 906], [3958, 878]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 248, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2245, 442], [2240, 453], [2254, 453], [2254, 445], [2245, 442]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KY", "maritime": 1}, "id": 249, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3677, 657], [3687, 665], [3694, 660], [3688, 650], [3677, 657]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 250, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3681, 685], [3695, 690], [3694, 672], [3686, 672], [3681, 685]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 251, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2269, 460], [2282, 464], [2287, 458], [2270, 452], [2269, 460]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "KY", "maritime": 1}, "id": 252, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3730, 662], [3737, 673], [3751, 670], [3751, 659], [3743, 652], [3730, 662]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 253, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4116, 965], [4124, 950], [4137, 952], [4136, 973], [4125, 973], [4116, 965]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 254, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3761, 667], [3784, 711], [3791, 713], [3798, 696], [3784, 668], [3770, 660], [3761, 667]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 255, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4024, 873], [4031, 874], [4030, 882], [4022, 880], [4024, 873]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 256, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1077, 1479], [1068, 1483], [1061, 1478], [1062, 1445], [1081, 1415], [1110, 1382], [1117, 1381], [1124, 1395], [1101, 1447], [1107, 1475], [1101, 1480], [1092, 1475], [1077, 1479]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 257, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2735, 1124], [2745, 1121], [2740, 1111], [2722, 1112], [2723, 1121], [2735, 1124]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 258, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2301, 33], [2329, 19], [2332, 9], [2357, 5], [2360, 10], [2383, -3]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-EC", "maritime": 0}, "id": 259, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2731, 3505], [2739, 3518], [2734, 3553], [2675, 3639], [2633, 3661], [2589, 3670], [2517, 3702], [2469, 3700], [2408, 3707], [2336, 3697], [2261, 3666], [2165, 3603], [2119, 3570], [2094, 3528], [2013, 3484], [1927, 3384], [1883, 3277], [1876, 3245], [1812, 3219], [1681, 3118], [1586, 3063], [1483, 2993], [1436, 2914], [1371, 2881], [1303, 2793], [1283, 2781], [1276, 2739], [1283, 2722], [1243, 2599], [1233, 2585], [1245, 2560], [1242, 2536], [1251, 2519], [1232, 2470], [1234, 2454], [1219, 2412], [1166, 2315], [1059, 2249], [1039, 2262], [1007, 2251], [988, 2223], [955, 2229], [936, 2251], [893, 2251]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 260, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1105, 1493], [1117, 1442], [1144, 1418], [1146, 1404], [1165, 1394], [1180, 1363], [1154, 1354], [1152, 1344], [1169, 1337], [1181, 1316], [1195, 1311], [1212, 1291], [1251, 1265]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 261, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4034, 865], [4028, 869], [4021, 863], [3998, 862], [3982, 873]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 1}, "id": 262, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2824, 1203], [2840, 1205], [2859, 1221], [2859, 1203], [2876, 1195], [2892, 1198], [2905, 1228], [2896, 1272], [2890, 1279], [2883, 1277], [2886, 1293], [2877, 1309], [2864, 1316], [2837, 1309], [2841, 1318], [2834, 1330], [2821, 1332], [2841, 1345], [2836, 1359], [2846, 1391], [2834, 1419], [2835, 1450], [2813, 1470], [2803, 1469], [2810, 1495], [2805, 1502], [2788, 1499], [2781, 1509], [2743, 1527], [2724, 1547], [2718, 1578], [2705, 1600], [2709, 1613], [2650, 1704], [2632, 1777], [2638, 1820], [2657, 1855], [2641, 1924], [2692, 1993], [2712, 2061], [2691, 2092], [2667, 2105], [2592, 2175], [2592, 2216], [2579, 2265], [2551, 2311], [2495, 2350], [2476, 2378], [2432, 2397], [2389, 2455], [2375, 2493], [2350, 2531], [2322, 2547], [2291, 2547], [2288, 2603], [2308, 2629], [2305, 2675], [2320, 2715], [2330, 2770], [2345, 2797], [2338, 2868], [2342, 2879], [2388, 2921], [2409, 2965]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 263, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2570, 1127], [2583, 1133], [2579, 1124], [2587, 1103], [2605, 1092], [2642, 1126], [2652, 1125], [2710, 1151], [2715, 1161], [2742, 1177], [2740, 1192], [2728, 1198], [2729, 1214], [2746, 1227], [2810, 1227]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 264, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3982, 873], [3985, 887], [4004, 894], [4049, 894], [4065, 914], [4085, 922], [4092, 943], [4107, 956], [4097, 982], [4104, 993], [4111, 983], [4118, 987], [4117, 997], [4107, 997], [4127, 1022], [4147, 1028], [4160, 1037]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 265, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3696, 667], [3699, 674], [3723, 684], [3734, 681], [3721, 660], [3702, 660], [3696, 667]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 266, "type": 2}, {"geometry": {"type": "MultiLineString", "coordinates": [[[4143, 984], [4144, 977], [4160, 966]], [[4160, 995], [4156, 996], [4143, 984]]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES", "maritime": 1}, "id": 267, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2337, -64], [2352, -59], [2377, -36], [2385, -22], [2375, -3], [2383, -3]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "EC-PE", "maritime": 0}, "id": 268, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2341, 963], [2327, 975]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 269, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4029, 1294], [4025, 1287], [3976, 1272], [3972, 1263], [3977, 1245], [4012, 1230], [4019, 1218], [4036, 1215], [4036, 1201], [4055, 1186], [4063, 1164], [4055, 1104]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 270, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2668, 420], [2672, 413], [2666, 409]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 271, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3837, 285], [3834, 279], [3841, 275], [3847, 280], [3853, 273], [3861, 280], [3875, 276], [3883, 287], [3891, 285], [3895, 267], [3906, 261], [3899, 251], [3906, 254], [3914, 233]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-ML", "maritime": 0}, "id": 272, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2654, 418], [2655, 415]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 273, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2661, 412], [2663, 410]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 274, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3732, 497], [3708, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 0}, "id": 275, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2871, 136], [2902, 124], [2923, 104]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 276, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2614, 778], [2623, 785], [2630, 780], [2621, 771], [2614, 778]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BM", "maritime": 1}, "id": 277, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2731, 3505], [2828, 3547], [3067, 3711], [3277, 3782], [3390, 3791], [3492, 3761], [3862, 3419], [3878, 3356], [3731, 3168], [3722, 2948], [3728, 2624], [3645, 2458], [3636, 2261], [3591, 2201], [3515, 2143], [3378, 2110], [3361, 2095], [3342, 2053], [3312, 2016], [3252, 1977], [3213, 1976], [3193, 1942], [3186, 1886], [3154, 1836], [3129, 1707], [3110, 1695], [3084, 1695], [2992, 1735], [2953, 1796], [2896, 1916], [2862, 2024], [2855, 2108], [2765, 2614], [2733, 2689], [2688, 2715], [2637, 2721], [2582, 2707], [2534, 2716], [2488, 2751], [2414, 2788], [2405, 2825], [2409, 2965]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GL", "maritime": 1}, "id": 278, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2473, 272], [2458, 267], [2446, 254], [2427, 210], [2440, 208], [2450, 186], [2447, 171], [2457, 161], [2500, 159], [2516, 139], [2561, 141], [2552, 121], [2552, 103], [2564, 77], [2552, 64], [2567, 53], [2575, 28]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-VE", "maritime": 0}, "id": 279, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2473, 272], [2482, 274], [2477, 287]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-VE", "maritime": 1}, "id": 280, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3793, 206], [3813, 226], [3841, 229], [3854, 213], [3858, 198], [3852, 189], [3862, 194]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-SL", "maritime": 0}, "id": 281, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2700, 345], [2706, 328]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 282, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2824, 1203], [2807, 1205], [2810, 1227]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 283, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4125, 1347], [4123, 1326], [4096, 1313], [4090, 1300], [4076, 1303], [4070, 1314], [4050, 1315]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 284, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4150, 1363], [4139, 1361]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 285, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2704, 347], [2715, 343], [2714, 327]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 286, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3732, 497], [3710, 497], [3708, 483]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR", "maritime": 0}, "id": 287, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3734, 497], [3732, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR", "maritime": 0}, "id": 288, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3738, 497], [3736, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR", "maritime": 0}, "id": 289, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3751, 497], [3749, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR", "maritime": 0}, "id": 290, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3830, 613], [3823, 613]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR", "maritime": 0}, "id": 291, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2706, 328], [2714, 327]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-LC", "maritime": 1}, "id": 292, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1603, 236], [1611, 243], [1618, 233], [1610, 228], [1603, 236]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR", "maritime": 1}, "id": 293, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2655, 415], [2652, 406], [2661, 399]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NL", "maritime": 1}, "id": 294, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2509, 281], [2503, 294], [2497, 291], [2499, 283]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NL", "maritime": 1}, "id": 295, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3884, 2337], [3910, 2356], [3923, 2354], [3929, 2343], [3924, 2322], [3893, 2305], [3877, 2315], [3884, 2337]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NO", "maritime": 1}, "id": 296, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2534, 280], [2524, 289], [2518, 285], [2521, 276], [2533, 270], [2549, 277], [2541, 287], [2534, 280]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NL", "maritime": 1}, "id": 297, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3830, 613], [3823, 613]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 0}, "id": 298, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3958, 878], [3937, 828], [3899, 808], [3880, 786], [3867, 753], [3866, 732], [3874, 725], [3861, 703], [3829, 674], [3798, 665], [3781, 632], [3763, 618], [3751, 578], [3732, 561], [3706, 508], [3701, 484], [3709, 480]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 1}, "id": 299, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3751, 497], [3749, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA", "maritime": 0}, "id": 300, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[893, 2251], [887, 2252], [887, 2239]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "CA", "maritime": 1}, "id": 301, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2583, 3288], [2585, 3289]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "CA", "maritime": 1}, "id": 302, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4129, 1074], [4135, 1070]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AD-FR", "maritime": 0}, "id": 303, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4154, 1357], [4159, 1344], [4160, 1344]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BE-FR", "maritime": 0}, "id": 304, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2714, 118], [2717, 112], [2708, 103], [2668, 92], [2663, 82], [2658, 90], [2640, 88], [2622, 98], [2636, 81], [2638, 57], [2653, 56], [2653, 49], [2638, 44], [2632, 31], [2631, 35], [2613, 26], [2605, 15], [2604, 23], [2587, 17], [2575, 28]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR-VE", "maritime": 0}, "id": 305, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1431, 784], [1485, 789], [1483, 783], [1568, 751], [1634, 751], [1634, 763], [1674, 763], [1707, 734], [1718, 707], [1746, 689], [1768, 713], [1789, 710], [1832, 653], [1841, 623], [1879, 609], [1885, 612]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX-US", "maritime": 0}, "id": 307, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2811, 44], [2824, 43], [2822, 58], [2845, 59], [2853, 53]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR-SR", "maritime": 0}, "id": 308, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2714, 118], [2728, 120], [2727, 103], [2738, 100], [2742, 90], [2734, 81], [2731, 61], [2736, 42], [2747, 32], [2759, 27], [2792, 45], [2811, 44]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR-GY", "maritime": 0}, "id": 309, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1431, 784], [1423, 785]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX-US", "maritime": 1}, "id": 310, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2921, 96], [2892, 50], [2873, 54], [2865, 48], [2853, 53]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR-FR", "maritime": 0}, "id": 311, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2923, 104], [2921, 96]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BR-FR", "maritime": 1}, "id": 312, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1885, 612], [1890, 612]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MX-US", "maritime": 1}, "id": 313, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[251, 2018], [250, 1990]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "RU-US", "maritime": 1}, "id": 314, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3931, 1508], [3925, 1495], [3916, 1493], [3921, 1489], [3910, 1483], [3924, 1470], [3930, 1470], [3936, 1482], [3945, 1467], [3953, 1470]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB-IE", "maritime": 0}, "id": 315, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3985, 1483], [4004, 1484]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GB-IM", "maritime": 1}, "id": 316, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3943, 1521], [3931, 1508]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "GB-IE", "maritime": 1}, "id": 317, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3736, 497], [3734, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA-MR", "maritime": 0}, "id": 318, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3756, 251], [3749, 246]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-GW", "maritime": 1}, "id": 319, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2067, 412], [2086, 428]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BZ-MX", "maritime": 0}, "id": 320, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2086, 428], [2099, 419]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BZ-MX", "maritime": 1}, "id": 321, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2067, 412], [2026, 412], [2026, 399], [2015, 399], [2040, 378], [2038, 371], [2009, 371], [1998, 351], [1997, 334]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT-MX", "maritime": 0}, "id": 322, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2323, 165], [2327, 176], [2331, 171], [2341, 182], [2335, 198]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-PA", "maritime": 0}, "id": 323, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2323, 165], [2320, 161]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-PA", "maritime": 1}, "id": 324, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2383, -3], [2394, -4], [2406, -22], [2421, -29], [2436, -56], [2454, -56], [2464, -49], [2501, -60], [2499, -64]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CO-PE", "maritime": 0}, "id": 325, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3862, 194], [3855, 177], [3834, 158]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "LR-SL", "maritime": 0}, "id": 326, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2625, 419], [2618, 431]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "US-VG", "maritime": 1}, "id": 327, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2565, 1129], [2570, 1127]]}, "properties": {"admin_level": 2, "disputed": 1, "iso_3166_1": "CA-US", "maritime": 1}, "id": 328, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1124, 1493], [1138, 1516], [1138, 1545], [1096, 1570], [1061, 1647], [1025, 1685], [1019, 1703], [1013, 1708], [993, 1699], [988, 1680], [967, 1668], [965, 1683], [928, 1721], [931, 1733], [917, 1732], [911, 1725], [887, 1731], [887, 2239]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-US", "maritime": 0}, "id": 329, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1258, 1265], [1291, 1258], [1291, 1272], [1297, 1277], [1290, 1283], [1931, 1283], [1935, 1296], [1944, 1273], [1962, 1266], [1981, 1270], [1994, 1256], [2001, 1261], [2012, 1250], [2029, 1257], [2031, 1251], [2063, 1247], [2085, 1259], [2165, 1211], [2172, 1197], [2182, 1199], [2186, 1183], [2194, 1185], [2194, 1176], [2218, 1160], [2227, 1104], [2217, 1072], [2204, 1062], [2206, 1051], [2215, 1045], [2300, 1081], [2294, 1100], [2305, 1106], [2348, 1106], [2359, 1124], [2390, 1149], [2469, 1150], [2474, 1159], [2484, 1157], [2498, 1180], [2503, 1205], [2521, 1230], [2528, 1221], [2543, 1227], [2553, 1217], [2553, 1172], [2562, 1168], [2560, 1158], [2573, 1144]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-US", "maritime": 0}, "id": 330, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2573, 1144], [2574, 1142]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-US", "maritime": 1}, "id": 331, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3749, 497], [3738, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MA-MR", "maritime": 0}, "id": 332, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1728, 1025], [1728, 1086]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 333, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2414, 1021], [2396, 1035]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 336, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4046, 854], [4056, 844], [4058, 804], [4073, 783], [4066, 774], [4070, 772], [4031, 772], [4032, 764], [4013, 759], [4013, 734], [3984, 720], [3970, 703], [3923, 700], [3899, 683], [3899, 656]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DZ-MA", "maritime": 0}, "id": 337, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4045, 859], [4046, 854]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DZ-MA", "maritime": 1}, "id": 338, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3971, 239], [3980, 236], [3989, 221], [3998, 219], [4014, 228], [4035, 217]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BF-CI", "maritime": 0}, "id": 339, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3971, 239], [3956, 234], [3954, 246], [3936, 232], [3927, 239], [3914, 233]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI-ML", "maritime": 0}, "id": 340, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3899, 647], [3986, 588]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DZ-MR", "maritime": 0}, "id": 341, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3715, 371], [3720, 371]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "MR-SN", "maritime": 1}, "id": 342, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3986, 588], [4123, 492], [4123, 483], [4134, 474], [4160, 465]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DZ-ML", "maritime": 0}, "id": 343, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3986, 588], [3946, 588], [3968, 381], [3975, 377], [3971, 357], [3884, 357], [3884, 362], [3882, 356], [3852, 356], [3848, 348], [3834, 360], [3828, 343], [3817, 340]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ML-MR", "maritime": 0}, "id": 344, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3719, 312], [3744, 312], [3753, 318], [3782, 308], [3769, 304], [3753, 312], [3736, 307], [3736, 302], [3715, 300]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GM-SN", "maritime": 0}, "id": 345, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2447, 1077], [2449, 1104], [2456, 1126], [2467, 1133], [2469, 1150]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 346, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3903, 172], [3908, 160], [3900, 148], [3927, 133], [3925, 99]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI-LR", "maritime": 0}, "id": 347, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3823, 613], [3823, 549], [3798, 535], [3800, 497], [3754, 497]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "-MR", "maritime": 0}, "id": 348, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3899, 647], [3899, 613], [3830, 613]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "-MR", "maritime": 0}, "id": 349, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4151, 273], [4150, 281], [4160, 284]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BJ-NE", "maritime": 0}, "id": 350, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3784, 291], [3716, 283]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GW-SN", "maritime": 0}, "id": 351, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4101, 345], [4100, 334], [4110, 314], [4125, 307], [4119, 307], [4119, 301], [4139, 289], [4145, 291], [4148, 285], [4143, 283], [4151, 273]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BF-NE", "maritime": 0}, "id": 352, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4093, 255], [4095, 243], [4105, 236], [4101, 216], [4109, 215], [4105, 200], [4113, 190], [4108, 156], [4123, 139]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GH-TG", "maritime": 0}, "id": 353, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4123, 139], [4125, 135]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GH-TG", "maritime": 1}, "id": 354, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[932, 1717], [1279, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 355, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3837, 285], [3815, 282], [3784, 291]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-SN", "maritime": 0}, "id": 356, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3784, 291], [3785, 283], [3778, 279], [3784, 268], [3762, 264], [3756, 251]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GN-GW", "maritime": 0}, "id": 357, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3817, 340], [3824, 326], [3821, 315], [3838, 298], [3837, 285]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ML-SN", "maritime": 0}, "id": 358, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4035, 217], [4039, 187], [4022, 156], [4034, 117], [4025, 116]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CI-GH", "maritime": 0}, "id": 359, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1593, 1283], [1593, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 360, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4117, 252], [4114, 237], [4127, 229], [4133, 207], [4133, 142]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BJ-TG", "maritime": 0}, "id": 361, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4093, 255], [4082, 250], [4032, 252], [4035, 217]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BF-GH", "maritime": 0}, "id": 362, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4093, 255], [4117, 252]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BF-TG", "maritime": 0}, "id": 363, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4151, 273], [4142, 262], [4129, 263], [4117, 252]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BF-BJ", "maritime": 0}, "id": 364, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4101, 345], [4080, 347], [4051, 333], [4051, 326], [4040, 329], [4031, 323], [4031, 314], [4022, 315], [4018, 302], [4003, 308], [3993, 278], [3973, 271], [3978, 262], [3971, 254], [3971, 239]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BF-ML", "maritime": 0}, "id": 365, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4160, 208], [4159, 207], [4158, 145]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BJ-NG", "maritime": 0}, "id": 366, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4158, 145], [4158, 141]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BJ-NG", "maritime": 1}, "id": 367, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4160, 353], [4101, 345]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ML-NE", "maritime": 0}, "id": 368, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2756, 6], [2730, 6], [2719, -20], [2706, -11], [2698, -14], [2697, -36], [2674, -18], [2681, -8], [2669, 44], [2654, 50]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 0}, "id": 369, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4038, 1290], [4048, 1299]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GG-JE", "maritime": 1}, "id": 370, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4038, 1290], [4029, 1294]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-GG", "maritime": 1}, "id": 371, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2691, 250], [2683, 230], [2703, 226]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "TT-VE", "maritime": 1}, "id": 373, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2509, 281], [2499, 283]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "NL-VE", "maritime": 1}, "id": 374, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2287, 1370], [2280, 1359], [2267, 1366], [2260, 1384], [2244, 1394], [2224, 1425], [2223, 1511], [2161, 1516], [2147, 1528], [2106, 1545], [2094, 1564], [2071, 1580]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 375, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2639, 1181], [2633, 1176]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 376, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2146, 254], [2169, 254], [2186, 245], [2192, 250]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR-NI", "maritime": 0}, "id": 377, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3928, 912], [3928, 907]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-PT", "maritime": 1}, "id": 379, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2811, 44], [2794, 65], [2792, 77], [2784, 77], [2775, 91], [2780, 112], [2795, 118], [2791, 121], [2796, 135]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GY-SR", "maritime": 0}, "id": 380, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2868, 131], [2856, 112], [2859, 92], [2868, 82], [2863, 63], [2853, 53]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-SR", "maritime": 0}, "id": 381, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2868, 131], [2871, 136]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-SR", "maritime": 1}, "id": 382, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3894, 1051], [3909, 1060], [3910, 1049], [3941, 1055], [3955, 1042], [3938, 1025], [3942, 1006], [3936, 1000], [3936, 985], [3924, 985], [3938, 966], [3929, 949], [3938, 942], [3925, 925], [3928, 912]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-PT", "maritime": 0}, "id": 383, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2210, 184], [2206, 190], [2214, 204], [2209, 217], [2217, 219]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CR-PA", "maritime": 0}, "id": 384, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2063, 332], [2083, 318], [2099, 319], [2097, 308]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN-SV", "maritime": 0}, "id": 385, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2097, 308], [2104, 301]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "HN-SV", "maritime": 1}, "id": 386, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2089, 362], [2067, 347], [2063, 332]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT-HN", "maritime": 0}, "id": 387, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2089, 367], [2089, 362]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT-HN", "maritime": 1}, "id": 388, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2073, 367], [2066, 366], [2067, 412]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BZ-GT", "maritime": 0}, "id": 389, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2704, 287], [2693, 289]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GD-VC", "maritime": 1}, "id": 390, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2708, 310], [2705, 312]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "LC-VC", "maritime": 1}, "id": 391, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2704, 347], [2700, 345]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DM-FR", "maritime": 1}, "id": 392, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2463, 457], [2464, 434], [2457, 431], [2465, 425], [2463, 417]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DO-HT", "maritime": 0}, "id": 393, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2481, 493], [2476, 488]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "DO-TC", "maritime": 1}, "id": 394, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4055, 1098], [4065, 1094], [4063, 1087], [4067, 1090], [4083, 1079], [4111, 1076], [4112, 1082], [4129, 1074]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-FR", "maritime": 0}, "id": 396, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4029, 859], [4040, 862]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-MA", "maritime": 1}, "id": 397, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2339, 514], [2303, 535]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "BS-CU", "maritime": 1}, "id": 398, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2683, 393], [2686, 389]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "AG-MS", "maritime": 1}, "id": 399, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2409, 2965], [2432, 3022], [2425, 3068], [2449, 3098], [2499, 3134], [2541, 3232], [2569, 3278], [2583, 3288]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-GL", "maritime": 1}, "id": 400, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2063, 332], [2046, 316]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "GT-SV", "maritime": 0}, "id": 401, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2447, 1077], [2429, 1078]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 402, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4055, 1104], [4055, 1098]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-FR", "maritime": 1}, "id": 404, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3974, 883], [3975, 883]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-GI", "maritime": 0}, "id": 405, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3975, 883], [3974, 883]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-GI", "maritime": 1}, "id": 406, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4135, 1070], [4160, 1069]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-FR", "maritime": 0}, "id": 407, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3974, 877], [3974, 875]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-MA", "maritime": 0}, "id": 408, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[4029, 860], [4029, 859]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-MA", "maritime": 0}, "id": 409, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3958, 878], [3974, 877]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-MA", "maritime": 1}, "id": 410, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3982, 873], [3974, 875]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "ES-MA", "maritime": 1}, "id": 411, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2731, 3505], [2681, 3447], [2636, 3359], [2585, 3289]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-GL", "maritime": 1}, "id": 412, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2810, 1227], [2816, 1225], [2824, 1203]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "CA-FR", "maritime": 1}, "id": 413, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2662, 418], [2659, 418]]}, "properties": {"admin_level": 2, "disputed": 0, "iso_3166_1": "FR-NL", "maritime": 0}, "id": 414, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[991, 2191], [991, 2115], [997, 2110], [998, 2076], [1051, 2076], [1044, 2073], [1052, 2064], [1046, 2059], [1056, 2051], [1050, 2037], [1057, 2030], [1055, 2017], [1070, 2021], [1072, 2013], [1077, 2020], [1085, 2018], [1079, 2010], [1089, 1998], [1074, 1977], [1085, 1968], [1078, 1955], [1099, 1939], [1096, 1931], [1112, 1933], [1120, 1910], [1135, 1904], [1130, 1896], [1142, 1883], [1133, 1873], [1147, 1862], [1143, 1854], [1148, 1839], [1156, 1835], [1154, 1818], [1166, 1813], [1170, 1818], [1188, 1792], [1203, 1785], [1210, 1752], [1232, 1759], [1244, 1753], [1260, 1762], [1260, 1747], [1279, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 415, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2639, 1181], [2648, 1185]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 416, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2648, 1185], [2645, 1189]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 417, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2525, 1225], [2540, 1233], [2540, 1245], [2546, 1248], [2563, 1243], [2583, 1251], [2594, 1249]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 418, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2628, 1731], [2620, 1734], [2604, 1705], [2607, 1690], [2600, 1684], [2597, 1666], [2584, 1666], [2579, 1650], [2557, 1640], [2555, 1649], [2551, 1645], [2549, 1654], [2542, 1655], [2541, 1664], [2522, 1669], [2522, 1679], [2515, 1679], [2521, 1686], [2512, 1688], [2514, 1711], [2507, 1720], [2513, 1726], [2510, 1749], [2518, 1754], [2515, 1766], [2506, 1754], [2500, 1768], [2467, 1773], [2461, 1784], [2467, 1793], [2420, 1834], [2394, 1821], [2334, 1839], [2319, 1828], [2320, 1798], [2331, 1786], [2325, 1785], [2327, 1773], [2316, 1753], [2328, 1752], [2326, 1735], [2335, 1709], [2325, 1704], [2326, 1690], [2307, 1669], [2307, 1658], [2332, 1638], [2346, 1616], [2355, 1561], [2348, 1542], [2326, 1516], [2281, 1491], [2289, 1473], [2299, 1466], [2298, 1428], [2309, 1407], [2297, 1381], [2303, 1371], [2301, 1360], [2293, 1377], [2287, 1370]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 419, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2287, 1370], [2288, 1218], [2305, 1192], [2329, 1188], [2339, 1177], [2349, 1177], [2358, 1164], [2403, 1167], [2405, 1155], [2397, 1149]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 420, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3048, -26], [3051, -17]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 1}, "id": 421, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2847, 56], [2850, 41], [2878, 31], [2891, -3], [2910, -28], [2920, -24], [2931, -3], [2956, 16]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 0}, "id": 422, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2956, 16], [2973, 30]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 1}, "id": 423, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2756, 6], [2756, -8], [2769, -26], [2776, -25], [2777, -32], [2806, -50], [2819, -46], [2810, -64]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 0}, "id": 424, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3033, -64], [3048, -26]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 0}, "id": 425, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[3143, -64], [3144, -62]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "BR", "maritime": 0}, "id": 426, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2071, 1580], [2025, 1598], [1985, 1584], [1993, 1601], [1976, 1660], [1952, 1664], [1947, 1659], [1939, 1673], [1938, 1717], [1775, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 427, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2648, 1185], [2674, 1177]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 428, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1775, 1717], [1593, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 429, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1775, 1717], [1775, 1537], [1789, 1283]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 430, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1365, 1717], [1593, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 431, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1593, 3067], [1593, 2263], [1536, 2263], [1532, 2257], [1540, 2255], [1533, 2252], [1527, 2252], [1527, 2263], [1431, 2263], [1430, 2255], [1442, 2238], [1350, 2234], [1350, 2136], [1536, 1991], [1578, 1991], [1608, 1955], [1775, 1923], [1775, 1717]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 432, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1258, 1265], [1215, 1295], [1199, 1315], [1184, 1321], [1172, 1346], [1157, 1348], [1186, 1353], [1185, 1366], [1165, 1402], [1150, 1407], [1150, 1424], [1121, 1445], [1127, 1455], [1119, 1460], [1110, 1490], [1124, 1493]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 433, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1074, 1442], [1065, 1457], [1066, 1476], [1092, 1468], [1101, 1475], [1095, 1447], [1117, 1399], [1115, 1385], [1079, 1428], [1074, 1442]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 1}, "id": 434, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1365, 1717], [1365, 1458], [1372, 1451], [1368, 1446], [1382, 1434], [1393, 1434], [1406, 1404], [1411, 1409], [1418, 1403], [1415, 1398], [1426, 1397], [1435, 1379], [1441, 1383], [1464, 1348], [1479, 1338], [1487, 1320], [1485, 1303], [1500, 1283]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "CA", "maritime": 0}, "id": 435, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1501, 1055], [1569, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 436, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1429, 784], [1423, 802], [1400, 816], [1398, 823], [1349, 839], [1350, 854], [1321, 887], [1306, 930], [1295, 936], [1293, 947], [1279, 962], [1277, 988], [1263, 1007], [1271, 1033], [1267, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 437, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2058, 721], [2051, 734], [2054, 743], [2011, 743], [2027, 778], [2021, 796]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 438, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2059, 720], [2058, 721]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 439, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2041, 851], [2089, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 440, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2370, 895], [2371, 895]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 441, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 723], [2085, 724]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 442, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2258, 770], [2255, 770]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 443, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2205, 851], [2177, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 444, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2060, 893], [2058, 893]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 445, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1433, 1055], [1501, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 446, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1672, 763], [1670, 769], [1751, 769], [1752, 893]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 447, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1943, 893], [1943, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 448, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 720], [2085, 723]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 449, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2264, 1014], [2264, 1065]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 450, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2287, 986], [2264, 986], [2264, 1014]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 451, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2389, 959], [2406, 977], [2414, 1009]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 454, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2424, 1057], [2424, 1031], [2418, 1028], [2424, 1024]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 456, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1752, 907], [1774, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 457, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1752, 893], [1752, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 458, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1899, 1179], [1884, 1283]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 459, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2388, 949], [2387, 949]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 461, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2390, 949], [2388, 949]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 462, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1774, 995], [1927, 995]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 463, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2490, 1083], [2500, 1102], [2525, 1113], [2530, 1109], [2533, 1115], [2526, 1116], [2535, 1115], [2573, 1142]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 464, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2427, 1149], [2429, 1078]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 465, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2478, 1038], [2484, 1031], [2505, 1032], [2503, 1038], [2492, 1039], [2504, 1040], [2506, 1049], [2502, 1058], [2489, 1060], [2492, 1076], [2486, 1082]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 466, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2429, 1078], [2424, 1057]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 467, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2481, 1104], [2487, 1087]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 468, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2447, 1077], [2474, 1076], [2485, 1082]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 469, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2485, 1082], [2486, 1082]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 470, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2414, 1009], [2447, 1018], [2462, 1030]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 471, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2462, 1055], [2424, 1057]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 472, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2478, 1038], [2478, 1040]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 473, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2281, 1071], [2281, 1055], [2381, 1055], [2396, 1035]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 474, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2424, 1024], [2460, 1034]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 475, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2414, 1021], [2406, 1010], [2414, 1009]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 477, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2460, 1034], [2462, 1030]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 478, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2487, 1087], [2490, 1083]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 479, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2478, 1159], [2481, 1104]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 480, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2486, 1082], [2490, 1083]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 481, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1774, 907], [1774, 995]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 482, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2384, 937], [2375, 935]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 483, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1961, 708], [1890, 663], [1881, 642], [1887, 612]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 484, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1752, 893], [1820, 893], [1820, 839], [1835, 836], [1839, 829], [1863, 828], [1867, 820], [1884, 821], [1886, 816], [1889, 822], [1904, 815], [1929, 823], [1946, 814]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 485, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1956, 797], [1956, 811], [1946, 814]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 487, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1956, 797], [1956, 769], [1968, 747], [1961, 708]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 488, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1956, 797], [2021, 796]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 489, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2016, 1006], [2017, 987], [2035, 961], [2046, 961], [2040, 942], [2059, 927], [2062, 909], [2068, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 490, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1943, 893], [2045, 893], [2039, 879], [2054, 879]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 491, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2033, 1071], [2044, 1059], [2044, 1049], [2037, 1040], [2024, 1037], [2026, 1023], [2016, 1006]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 492, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1943, 907], [1944, 970], [1932, 981], [1936, 991], [1927, 995]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 493, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2068, 907], [2071, 914], [2083, 910], [2093, 930]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 494, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2112, 1048], [2104, 1048], [2105, 958], [2094, 944], [2093, 930]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 495, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2033, 1071], [2116, 1070]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 496, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2112, 1048], [2116, 1070]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 497, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1917, 1012], [1901, 1070]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 498, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1728, 1086], [1855, 1086], [1865, 1079], [1883, 1081], [1901, 1070]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 499, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2068, 907], [2061, 893]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 500, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1398, 797], [1403, 791], [1398, 797]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 501, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2217, 948], [2210, 958], [2192, 954], [2174, 969], [2166, 968]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 502, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1917, 1012], [1927, 995]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 503, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2058, 893], [2054, 879]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 504, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1615, 751], [1615, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 505, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1901, 1101], [1901, 1070]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 507, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1774, 907], [1943, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 508, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2366, 935], [2361, 933]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 509, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2375, 935], [2366, 935]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 510, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1569, 1132], [1561, 1141], [1559, 1134], [1528, 1129], [1522, 1142], [1514, 1145], [1503, 1172], [1494, 1164], [1489, 1167], [1495, 1203], [1484, 1205], [1463, 1229], [1455, 1248], [1455, 1283]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 512, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1946, 814], [1943, 893]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 513, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2390, 949], [2389, 959]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 514, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2054, 879], [2041, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 515, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2112, 1048], [2166, 1046]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 516, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2041, 851], [2020, 815], [2021, 796]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 517, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2020, 1101], [2024, 1078], [2033, 1071]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 518, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2387, 949], [2374, 949], [2371, 986]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 519, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1901, 1101], [2020, 1101]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 520, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2089, 851], [2148, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 521, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2148, 851], [2177, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 522, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1728, 1180], [1899, 1179]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 523, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1728, 1086], [1728, 1149]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 524, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1901, 1101], [1901, 1159], [1892, 1169], [1899, 1179]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 525, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1728, 1180], [1728, 1283]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 526, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2093, 930], [2103, 935], [2124, 932], [2131, 942], [2138, 935], [2152, 957], [2166, 959], [2166, 968]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 527, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2058, 893], [2060, 893]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 528, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2061, 893], [2092, 893], [2092, 898], [2192, 896]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 529, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1615, 1025], [1728, 1025]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 530, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2231, 923], [2215, 941], [2217, 948]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 531, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2075, 724], [2069, 724], [2075, 724]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 532, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2192, 896], [2231, 923]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 533, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2104, 722], [2104, 724]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 534, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2192, 896], [2237, 896]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 535, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2166, 968], [2166, 1046]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 536, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2177, 851], [2187, 866], [2229, 883], [2237, 896]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 537, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 720], [2059, 720]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 538, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 724], [2085, 723]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 539, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1501, 907], [1501, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 540, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2104, 722], [2085, 720]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 541, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2085, 726], [2089, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 542, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1774, 995], [1774, 1025], [1728, 1025]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 543, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2369, 895], [2370, 895]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 544, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2162, 743], [2159, 765], [2164, 776], [2148, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 545, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2104, 724], [2108, 728], [2103, 743], [2162, 743]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 546, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2258, 770], [2245, 735]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 547, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2162, 743], [2165, 735], [2225, 731], [2226, 726], [2231, 738], [2240, 735]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 548, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1569, 1132], [1569, 1149], [1728, 1149]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 549, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2240, 735], [2245, 735]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 550, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2205, 851], [2199, 843], [2242, 797], [2255, 770]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 551, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2622, 423], [2615, 422]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 552, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1615, 907], [1615, 1025]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 553, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1615, 907], [1752, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 554, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1615, 1025], [1569, 1025], [1569, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 555, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1569, 1055], [1569, 1132]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 556, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1501, 907], [1615, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 557, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1487, 851], [1485, 882], [1498, 880], [1501, 907]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 558, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1487, 851], [1499, 831], [1490, 822], [1485, 805], [1491, 792], [1485, 789]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 559, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2245, 735], [2276, 635], [2275, 603], [2265, 587], [2235, 573], [2224, 581], [2249, 587], [2209, 651], [2209, 689], [2190, 711], [2183, 715], [2160, 701], [2131, 722], [2104, 722]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 560, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2327, 975], [2325, 969], [2313, 979], [2312, 970], [2301, 958], [2298, 961], [2292, 948], [2284, 953], [2269, 922], [2237, 913], [2231, 923]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 561, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2208, 577], [2215, 581], [2206, 581], [2208, 577]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 562, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2205, 1054], [2198, 1047], [2166, 1046]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 563, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2625, 423], [2623, 423]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 564, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2614, 427], [2619, 428]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 565, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2217, 948], [2223, 949], [2229, 966], [2235, 963], [2240, 976], [2256, 983], [2264, 1014]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 566, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2343, 959], [2346, 962], [2341, 963]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 567, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2380, 989], [2371, 986]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 568, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2343, 959], [2341, 963]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 569, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2361, 933], [2343, 948], [2337, 946], [2343, 959]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 570, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1917, 1012], [2009, 1013], [2016, 1006]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 571, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2327, 975], [2317, 986], [2310, 980], [2303, 984], [2288, 971], [2287, 986]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 572, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2371, 986], [2287, 986]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 573, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2396, 1035], [2385, 1017], [2396, 999], [2380, 989]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 574, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2384, 937], [2390, 949]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 575, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1433, 1055], [1436, 1122], [1428, 1133], [1446, 1169], [1435, 1181]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 576, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2377, 981], [2380, 989]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 577, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2377, 981], [2389, 959]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 578, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1271, 1190], [1294, 1188], [1302, 1170], [1313, 1167], [1388, 1182], [1435, 1181]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 579, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1404, 806], [1397, 809], [1404, 806]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 580, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1435, 1181], [1433, 1283]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 581, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2309, 819], [2310, 818]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 582, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2020, 1101], [2015, 1117], [1984, 1141], [1988, 1163], [1982, 1168], [1996, 1184], [1996, 1204], [2033, 1225], [2049, 1224]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 583, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2116, 1070], [2116, 1121], [2133, 1157], [2114, 1163], [2101, 1153], [2091, 1179], [2045, 1193], [2038, 1200], [2049, 1224]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 584, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2049, 1224], [2060, 1249]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 585, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1365, 1055], [1365, 965], [1487, 851]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 586, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1365, 1055], [1433, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 587, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1269, 1055], [1365, 1055]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 588, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2384, 937], [2369, 911], [2371, 895]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 589, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1271, 1190], [1268, 1224], [1256, 1248], [1258, 1265]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 590, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2371, 895], [2380, 870], [2378, 856], [2355, 838], [2346, 841], [2332, 834], [2323, 817], [2310, 818]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 591, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[1267, 1055], [1258, 1079], [1269, 1116], [1271, 1190]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 592, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2310, 818], [2258, 770]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 593, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2462, 1055], [2460, 1035]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 594, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2460, 1034], [2460, 1035]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 595, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2368, 895], [2369, 895]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 597, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2059, 720], [2074, 720], [2076, 714], [2068, 701], [2073, 693], [2061, 686], [2057, 695], [2027, 690], [2001, 704], [1961, 707]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 600, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2205, 851], [2224, 857], [2252, 855], [2257, 846], [2283, 846], [2309, 819]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 601, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2366, 895], [2237, 896]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 603, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2366, 895], [2367, 895]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 0}, "id": 604, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2624, 412], [2628, 410], [2618, 408], [2624, 412]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 605, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2615, 422], [2614, 427]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 606, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2614, 427], [2569, 432], [2557, 425], [2563, 423], [2565, 412], [2582, 410], [2612, 416], [2615, 422]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 607, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2552, 423], [2546, 421], [2550, 414], [2556, 418], [2552, 423]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 608, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2462, 1030], [2478, 1038]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 609, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[2466, 1028], [2468, 1033], [2466, 1028]]}, "properties": {"admin_level": 4, "disputed": 0, "iso_3166_1": "US", "maritime": 1}, "id": 610, "type": 2}]}, "country_label": {"extent": 4096, "version": 2, "features": [{"geometry": {"type": "Point", "coordinates": [6415, 865]}, "properties": {"code": "CN", "name": "\u4e2d\u56fd", "name_ar": "\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u0635\u064a\u0646 \u0627\u0644\u0634\u0639\u0628\u064a\u0629", "name_de": "China", "name_en": "China", "name_es": "China", "name_fr": "Chine", "name_ja": "\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u56fd", "name_ko": "\uc911\ud654\uc778\ubbfc\uacf5\ud654\uad6d", "name_pt": "China", "name_ru": "\u041a\u0438\u0442\u0430\u0439", "name_zh": "\u4e2d\u56fd", "scalerank": 1, "type": "country"}, "id": 424313582, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5882, 518]}, "properties": {"code": "IN", "name": "India", "name_ar": "\u0627\u0644\u0647\u0646\u062f", "name_de": "Indien", "name_en": "India", "name_es": "India", "name_fr": "Inde", "name_ja": "\u30a4\u30f3\u30c9", "name_ko": "\uc778\ub3c4", "name_pt": "\u00cdndia", "name_ru": "\u0418\u043d\u0434\u0438\u044f", "name_zh": "\u5370\u5ea6", "scalerank": 1, "type": "country"}, "id": 424314145, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1868, 976]}, "properties": {"code": "US", "name": "United States", "name_ar": "\u0627\u0644\u0648\u0644\u0627\u064a\u0627\u062a \u0627\u0644\u0645\u062a\u062d\u062f\u0629 \u0627\u0644\u0623\u0645\u0631\u064a\u0643\u064a\u0629", "name_de": "Vereinigte Staaten", "name_en": "United States", "name_es": "Estados Unidos", "name_fr": "\u00c9tats-Unis", "name_ja": "\u30a2\u30e1\u30ea\u30ab\u5408\u8846\u56fd", "name_ko": "\ubbf8\uad6d", "name_pt": "Estados Unidos", "name_ru": "\u0421\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0435 \u0428\u0442\u0430\u0442\u044b", "name_zh": "\u7f8e\u56fd", "scalerank": 1, "type": "country"}, "id": 424317935, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6767, -52]}, "properties": {"code": "ID", "name": "Indonesia", "name_ar": "\u0625\u0646\u062f\u0648\u0646\u064a\u0633\u064a\u0627", "name_de": "Indonesien", "name_en": "Indonesia", "name_es": "Indonesia", "name_fr": "Indon\u00e9sie", "name_ja": "\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2", "name_ko": "\uc778\ub3c4\ub124\uc2dc\uc544", "name_pt": "Indon\u00e9sia", "name_ru": "\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u044f", "name_zh": "\u5370\u5ea6\u5c3c\u897f\u4e9a", "scalerank": 1, "type": "country"}, "id": 424311942, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2921, -219]}, "properties": {"code": "BR", "name": "Brasil", "name_ar": "\u0627\u0644\u0628\u0631\u0627\u0632\u064a\u0644", "name_de": "Brasilien", "name_en": "Brazil", "name_es": "Brasil", "name_fr": "Br\u00e9sil", "name_ja": "\u30d6\u30e9\u30b8\u30eb", "name_ko": "\ube0c\ub77c\uc9c8", "name_pt": "Brasil", "name_ru": "\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f", "name_zh": "\u5df4\u897f", "scalerank": 1, "type": "country"}, "id": 424313734, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6296, 1811]}, "properties": {"code": "RU", "name": "\u0420\u043e\u0441\u0441\u0438\u044f", "name_ar": "\u0631\u0648\u0633\u064a\u0627", "name_de": "Russland", "name_en": "Russia", "name_es": "Rusia", "name_fr": "Russie", "name_ja": "\u30ed\u30b7\u30a2", "name_ko": "\ub7ec\uc2dc\uc544", "name_pt": "R\u00fassia", "name_ru": "\u0420\u043e\u0441\u0441\u0438\u044f", "name_zh": "\u4fc4\u7f57\u65af", "scalerank": 1, "type": "country"}, "id": 424314830, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7250, 890]}, "properties": {"code": "JP", "name": "\u65e5\u672c", "name_ar": "\u0627\u0644\u064a\u0627\u0628\u0627\u0646", "name_de": "Japan", "name_en": "Japan", "name_es": "Jap\u00f3n", "name_fr": "Japon", "name_ja": "\u65e5\u672c", "name_ko": "\uc77c\ubcf8", "name_pt": "Jap\u00e3o", "name_ru": "\u042f\u043f\u043e\u043d\u0438\u044f", "name_zh": "\u65e5\u672c", "scalerank": 1, "type": "country"}, "id": 424313451, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1763, 562]}, "properties": {"code": "MX", "name": "M\u00e9xico", "name_ar": "\u0627\u0644\u0645\u0643\u0633\u064a\u0643", "name_de": "Mexiko", "name_en": "Mexico", "name_es": "M\u00e9xico", "name_fr": "Mexique", "name_ja": "\u30e1\u30ad\u30b7\u30b3", "name_ko": "\uba55\uc2dc\ucf54", "name_pt": "M\u00e9xico", "name_ru": "\u041c\u0435\u043a\u0441\u0438\u043a\u0430", "name_zh": "\u58a8\u897f\u54e5", "scalerank": 1, "type": "country"}, "id": 432425036, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4776, 626]}, "properties": {"code": "EG", "name": "\u0645\u0635\u0631", "name_ar": "\u0645\u0635\u0631", "name_de": "\u00c4gypten", "name_en": "Egypt", "name_es": "Egipto", "name_fr": "\u00c9gypte", "name_ja": "\u30a8\u30b8\u30d7\u30c8", "name_ko": "\uc774\uc9d1\ud2b8", "name_pt": "Egito", "name_ru": "\u0415\u0433\u0438\u043f\u0435\u0442", "name_zh": "\u57c3\u53ca", "scalerank": 1, "type": "country"}, "id": 424316018, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4897, 967]}, "properties": {"code": "TR", "name": "T\u00fcrkiye", "name_ar": "\u062a\u0631\u0643\u064a\u0627", "name_de": "T\u00fcrkei", "name_en": "Turkey", "name_es": "Turqu\u00eda", "name_fr": "Turquie", "name_ja": "\u30c8\u30eb\u30b3", "name_ko": "\ud130\ud0a4", "name_pt": "Turquia", "name_ru": "\u0422\u0443\u0440\u0446\u0438\u044f", "name_zh": "\u571f\u8033\u5176", "scalerank": 1, "type": "country"}, "id": 424298326, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5332, 785]}, "properties": {"code": "IR", "name": "\u0627\u06cc\u0631\u0627\u0646", "name_ar": "\u0625\u064a\u0631\u0627\u0646", "name_de": "Iran", "name_en": "Iran", "name_es": "Ir\u00e1n", "name_fr": "Iran", "name_ja": "\u30a4\u30e9\u30f3", "name_ko": "\uc774\ub780", "name_pt": "Ir\u00e3o", "name_ru": "\u0418\u0440\u0430\u043d", "name_zh": "\u4f0a\u6717", "scalerank": 1, "type": "country"}, "id": 424298311, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4640, -674]}, "properties": {"code": "ZA", "name": "South Africa", "name_ar": "\u062c\u0646\u0648\u0628 \u0623\u0641\u0631\u064a\u0642\u064a\u0627", "name_de": "S\u00fcdafrika", "name_en": "South Africa", "name_es": "Sud\u00e1frica", "name_fr": "Afrique du Sud", "name_ja": "\u5357\u30a2\u30d5\u30ea\u30ab\u5171\u548c\u56fd", "name_ko": "\ub0a8\uc544\ud504\ub9ac\uce74 \uacf5\ud654\uad6d", "name_pt": "\u00c1frica do Sul", "name_ru": "\u042e\u0436\u043d\u0430\u044f \u0410\u0444\u0440\u0438\u043a\u0430", "name_zh": "\u5357\u975e", "scalerank": 1, "type": "country"}, "id": 424298167, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2433, 89]}, "properties": {"code": "CO", "name": "Colombia", "name_ar": "\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627", "name_de": "Kolumbien", "name_en": "Colombia", "name_es": "Colombia", "name_fr": "Colombie", "name_ja": "\u30b3\u30ed\u30f3\u30d3\u30a2", "name_ko": "\ucf5c\ub86c\ube44\uc544", "name_pt": "Col\u00f4mbia", "name_ru": "\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u044f", "name_zh": "\u54e5\u4f26\u6bd4\u4e9a", "scalerank": 1, "type": "country"}, "id": 424314631, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2640, -862]}, "properties": {"code": "AR", "name": "Argentina", "name_ar": "\u0627\u0644\u0623\u0631\u062c\u0646\u062a\u064a\u0646", "name_de": "Argentinien", "name_en": "Argentina", "name_es": "Argentina", "name_fr": "Argentine", "name_ja": "\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3", "name_ko": "\uc544\ub974\ud5e8\ud2f0\ub098", "name_pt": "Argentina", "name_ru": "\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430", "name_zh": "\u963f\u6839\u5ef7", "scalerank": 1, "type": "country"}, "id": 249399280, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4780, 318]}, "properties": {"code": "SD", "name": "\u0627\u0644\u0633\u0648\u062f\u0627\u0646", "name_ar": "\u0627\u0644\u0633\u0648\u062f\u0627\u0646", "name_de": "Sudan", "name_en": "Sudan", "name_es": "Sud\u00e1n", "name_fr": "Soudan", "name_ja": "\u30b9\u30fc\u30c0\u30f3", "name_ko": "\uc218\ub2e8", "name_pt": "Sud\u00e3o", "name_ru": "\u0421\u0443\u0434\u0430\u043d", "name_zh": "\u82cf\u4e39", "scalerank": 1, "type": "country"}, "id": 424297973, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1690, 1528]}, "properties": {"code": "CA", "name": "Canada", "name_ar": "\u0643\u0646\u062f\u0627", "name_de": "Kanada", "name_en": "Canada", "name_es": "Canad\u00e1", "name_fr": "Canada", "name_ja": "\u30ab\u30ca\u30c0", "name_ko": "\uce90\ub098\ub2e4", "name_pt": "Canad\u00e1", "name_ru": "\u041a\u0430\u043d\u0430\u0434\u0430", "name_zh": "\u52a0\u62ff\u5927", "scalerank": 1, "type": "country"}, "id": 424313760, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4156, 668]}, "properties": {"code": "DZ", "name": "\u0627\u0644\u062c\u0632\u0627\u0626\u0631", "name_ar": "\u0627\u0644\u062c\u0632\u0627\u0626\u0631", "name_de": "Algerien", "name_en": "Algeria", "name_es": "Argelia", "name_fr": "Alg\u00e9rie", "name_ja": "\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2", "name_ko": "\uc54c\uc81c\ub9ac", "name_pt": "Arg\u00e9lia", "name_ru": "\u0410\u043b\u0436\u0438\u0440", "name_zh": "\u963f\u5c14\u53ca\u5229\u4e9a", "scalerank": 1, "type": "country"}, "id": 432424926, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2382, -232]}, "properties": {"code": "PE", "name": "Per\u00fa", "name_ar": "\u0628\u064a\u0631\u0648", "name_de": "Peru", "name_en": "Peru", "name_es": "Per\u00fa", "name_fr": "P\u00e9rou", "name_ja": "\u30da\u30eb\u30fc", "name_ko": "\ud398\ub8e8", "name_pt": "Peru", "name_ru": "\u041f\u0435\u0440\u0443", "name_zh": "\u79d8\u9c81", "scalerank": 1, "type": "country"}, "id": 249399406, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2599, 174]}, "properties": {"code": "VE", "name": "Venezuela", "name_ar": "\u0641\u0646\u0632\u0648\u064a\u0644\u0627", "name_de": "Venezuela", "name_en": "Venezuela", "name_es": "Venezuela", "name_fr": "Venezuela", "name_ja": "\u30d9\u30cd\u30ba\u30a8\u30e9", "name_ko": "\ubca0\ub124\uc218\uc5d8\ub77c", "name_pt": "Venezuela", "name_ru": "\u0412\u0435\u043d\u0435\u0441\u0443\u044d\u043b\u0430", "name_zh": "\u59d4\u5167\u745e\u62c9", "scalerank": 1, "type": "country"}, "id": 424311890, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5110, 566]}, "properties": {"code": "SA", "name": "\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629", "name_ar": "\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629", "name_de": "Saudi-Arabien", "name_en": "Saudi Arabia", "name_es": "Arabia Saudita", "name_fr": "Arabie saoudite", "name_ja": "\u30b5\u30a6\u30b8\u30a2\u30e9\u30d3\u30a2", "name_ko": "\uc0ac\uc6b0\ub514\uc544\ub77c\ube44\uc544", "name_pt": "Ar\u00e1bia Saudita", "name_ru": "\u0421\u0430\u0443\u0434\u043e\u0432\u0441\u043a\u0430\u044f \u0410\u0440\u0430\u0432\u0438\u044f", "name_zh": "\u6c99\u7279\u963f\u62c9\u4f2f", "scalerank": 1, "type": "country"}, "id": 249399419, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7156, -606]}, "properties": {"code": "AU", "name": "Australia", "name_ar": "\u0623\u0633\u062a\u0631\u0627\u0644\u064a\u0627", "name_de": "Australien", "name_en": "Australia", "name_es": "Australia", "name_fr": "Australie", "name_ja": "\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2", "name_ko": "\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544", "name_pt": "Austr\u00e1lia", "name_ru": "\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f", "name_zh": "\u6fb3\u5927\u5229\u4e9a", "scalerank": 1, "type": "country"}, "id": 424315584, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5627, 1254]}, "properties": {"code": "KZ", "name": "\u049a\u0430\u0437\u0430\u049b\u0441\u0442\u0430\u043d", "name_ar": "\u0643\u0627\u0632\u0627\u062e\u0633\u062a\u0627\u0646", "name_de": "Kasachstan", "name_en": "Kazakhstan", "name_es": "Kazajist\u00e1n", "name_fr": "Kazakhstan", "name_ja": "\u30ab\u30b6\u30d5\u30b9\u30bf\u30f3", "name_ko": "\uce74\uc790\ud750\uc2a4\ud0c4", "name_pt": "Cazaquist\u00e3o", "name_ru": "\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d", "name_zh": "\u54c8\u8428\u514b\u65af\u5766", "scalerank": 1, "type": "country"}, "id": 424311521, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2634, -392]}, "properties": {"code": "BO", "name": "Bolivia", "name_ar": "\u062f\u0648\u0644\u0629 \u0628\u0648\u0644\u064a\u0641\u064a\u0627", "name_de": "Bolivien", "name_en": "Bolivia", "name_es": "Bolivia", "name_fr": "Bolivie", "name_ja": "\u30dc\u30ea\u30d3\u30a2", "name_ko": "\ubcfc\ub9ac\ube44\uc544", "name_pt": "Bol\u00edvia", "name_ru": "\u0411\u043e\u043b\u0438\u0432\u0438\u044f", "name_zh": "\u73bb\u5229\u7ef4\u4e9a", "scalerank": 1, "type": "country"}, "id": 424313730, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4506, 640]}, "properties": {"code": "LY", "name": "\u0644\u064a\u0628\u064a\u0627", "name_ar": "\u0644\u064a\u0628\u064a\u0627", "name_de": "Libyen", "name_en": "Libya", "name_es": "Libia", "name_fr": "Libye", "name_ja": "\u30ea\u30d3\u30a2", "name_ko": "\ub9ac\ube44\uc544", "name_pt": "L\u00edbia", "name_ru": "\u041b\u0438\u0432\u0438\u044f", "name_zh": "\u5229\u6bd4\u4e9a", "scalerank": 1, "type": "country"}, "id": 432425023, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6442, 1209]}, "properties": {"code": "MN", "name": "\u041c\u043e\u043d\u0433\u043e\u043b \u0423\u043b\u0441", "name_ar": "\u0645\u0646\u063a\u0648\u0644\u064a\u0627", "name_de": "Mongolei", "name_en": "Mongolia", "name_es": "Mongolia", "name_fr": "Mongolie", "name_ja": "\u30e2\u30f3\u30b4\u30eb\u56fd", "name_ko": "\ubabd\uace8", "name_pt": "Mong\u00f3lia", "name_ru": "\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u044f", "name_zh": "\u8499\u53e4", "scalerank": 1, "type": "country"}, "id": 432425040, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5636, 669]}, "properties": {"code": "PK", "name": "\u067e\u0627\u0643\u0650\u0633\u062a\u0627\u0646\u00a0\u00b7 Pakistan", "name_ar": "\u0628\u0627\u0643\u0633\u062a\u0627\u0646", "name_de": "Pakistan", "name_en": "Pakistan", "name_es": "Pakist\u00e1n", "name_fr": "Pakistan", "name_ja": "\u30d1\u30ad\u30b9\u30bf\u30f3", "name_ko": "\ud30c\ud0a4\uc2a4\ud0c4", "name_pt": "Paquist\u00e3o", "name_ru": "\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d", "name_zh": "\u5df4\u57fa\u65af\u5766", "scalerank": 2, "type": "country"}, "id": 424314088, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6146, 572]}, "properties": {"code": "BD", "name": "\u09ac\u09be\u0982\u09b2\u09be\u09a6\u09c7\u09b6", "name_ar": "\u0628\u0646\u063a\u0644\u0627\u062f\u064a\u0634", "name_de": "Bangladesch", "name_en": "Bangladesh", "name_es": "Banglad\u00e9s", "name_fr": "Bangladesh", "name_ja": "\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5", "name_ko": "\ubc29\uae00\ub77c\ub370\uc2dc", "name_pt": "Bangladesh", "name_ru": "\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448", "name_zh": "\u5b5f\u52a0\u62c9\u56fd", "scalerank": 2, "type": "country"}, "id": 432424937, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6892, 269]}, "properties": {"code": "PH", "name": "Philippines", "name_ar": "\u0627\u0644\u0641\u0644\u0628\u064a\u0646", "name_de": "Philippinen", "name_en": "Philippines", "name_es": "Filipinas", "name_fr": "Philippines", "name_ja": "\u30d5\u30a3\u30ea\u30d4\u30f3", "name_ko": "\ud544\ub9ac\ud540", "name_pt": "Filipinas", "name_ru": "\u0424\u0438\u043b\u0438\u043f\u043f\u0438\u043d\u044b", "name_zh": "\u83f2\u5f8b\u5bbe", "scalerank": 2, "type": "country"}, "id": 443174, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6561, 329]}, "properties": {"code": "VN", "name": "Vi\u1ec7t Nam", "name_ar": "\u0641\u064a\u062a\u0646\u0627\u0645", "name_de": "Vietnam", "name_en": "Vietnam", "name_es": "Vietnam", "name_fr": "Vi\u00eat Nam", "name_ja": "\u30d9\u30c8\u30ca\u30e0", "name_ko": "\ubca0\ud2b8\ub0a8", "name_pt": "Vietname", "name_ru": "\u0412\u044c\u0435\u0442\u043d\u0430\u043c", "name_zh": "\u8d8a\u5357", "scalerank": 2, "type": "country"}, "id": 424298150, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4324, 1358]}, "properties": {"code": "DE", "name": "Deutschland", "name_ar": "\u0623\u0644\u0645\u0627\u0646\u064a\u0627", "name_de": "Deutschland", "name_en": "Germany", "name_es": "Alemania", "name_fr": "Allemagne", "name_ja": "\u30c9\u30a4\u30c4", "name_ko": "\ub3c5\uc77c", "name_pt": "Alemanha", "name_ru": "\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f", "name_zh": "\u5fb7\u56fd", "scalerank": 2, "type": "country"}, "id": 1683325355, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4997, 197]}, "properties": {"code": "ET", "name": "Ethiopia", "name_ar": "\u0625\u062b\u064a\u0648\u0628\u064a\u0627", "name_de": "\u00c4thiopien", "name_en": "Ethiopia", "name_es": "Etiop\u00eda", "name_fr": "\u00c9thiopie", "name_ja": "\u30a8\u30c1\u30aa\u30d4\u30a2", "name_ko": "\uc5d0\ud2f0\uc624\ud53c\uc544", "name_pt": "Eti\u00f3pia", "name_ru": "\u042d\u0444\u0438\u043e\u043f\u0438\u044f", "name_zh": "\u57c3\u585e\u4fc4\u6bd4\u4e9a", "scalerank": 2, "type": "country"}, "id": 424311222, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4623, -27]}, "properties": {"code": "CD", "name": "R\u00e9publique D\u00e9mocratique du Congo", "name_ar": "\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0627\u0644\u0643\u0648\u0646\u063a\u0648 \u0627\u0644\u062f\u064a\u0645\u0642\u0631\u0627\u0637\u064a\u0629", "name_de": "Demokratische Republik Kongo", "name_en": "Democratic Republic of the Congo", "name_es": "Rep\u00fablica Democr\u00e1tica del Congo", "name_fr": "R\u00e9publique D\u00e9mocratique du Congo", "name_ja": "\u30b3\u30f3\u30b4\u6c11\u4e3b\u5171\u548c\u56fd", "name_ko": "\ucf69\uace0 \ubbfc\uc8fc \uacf5\ud654\uad6d", "name_pt": "Rep\u00fablica Democr\u00e1tica do Congo", "name_ru": "\u0414\u0435\u043c\u043e\u043a\u0440\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u043e\u043d\u0433\u043e", "name_zh": "\u521a\u679c\u6c11\u4e3b\u5171\u548c\u56fd", "scalerank": 2, "type": "country"}, "id": 192795, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4156, 1242]}, "properties": {"code": "FR", "name": "France", "name_ar": "\u0641\u0631\u0646\u0633\u0627", "name_de": "Frankreich", "name_en": "France", "name_es": "Francia", "name_fr": "France", "name_ja": "\u30d5\u30e9\u30f3\u30b9", "name_ko": "\ud504\ub791\uc2a4", "name_pt": "Fran\u00e7a", "name_ru": "\u0424\u0440\u0430\u043d\u0446\u0438\u044f", "name_zh": "\u6cd5\u56fd", "scalerank": 2, "type": "country"}, "id": 1363947712, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6395, 348]}, "properties": {"code": "TH", "name": "\u0e1b\u0e23\u0e30\u0e40\u0e17\u0e28\u0e44\u0e17\u0e22", "name_ar": "\u062a\u0627\u064a\u0644\u0627\u0646\u062f", "name_de": "Thailand", "name_en": "Thailand", "name_es": "Tailandia", "name_fr": "Tha\u00eflande", "name_ja": "\u30bf\u30a4\u738b\u56fd", "name_ko": "\ud0dc\uad6d", "name_pt": "Tail\u00e2ndia", "name_ru": "\u0422\u0430\u0438\u043b\u0430\u043d\u0434", "name_zh": "\u6cf0\u56fd", "scalerank": 2, "type": "country"}, "id": 437146363, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4042, 1475]}, "properties": {"code": "GB", "name": "United Kingdom", "name_ar": "\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629", "name_de": "Vereinigtes K\u00f6nigreich", "name_en": "United Kingdom", "name_es": "Reino Unido", "name_fr": "Royaume-Uni", "name_ja": "\u30a4\u30ae\u30ea\u30b9", "name_ko": "\uc601\uad6d", "name_pt": "Reino Unido", "name_ru": "\u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u044f", "name_zh": "\u82f1\u56fd", "scalerank": 2, "type": "country"}, "id": 838090640, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4384, 1070]}, "properties": {"code": "IT", "name": "Italia", "name_ar": "\u0625\u064a\u0637\u0627\u0644\u064a\u0627", "name_de": "Italien", "name_en": "Italy", "name_es": "Italia", "name_fr": "Italie", "name_ja": "\u30a4\u30bf\u30ea\u30a2", "name_ko": "\uc774\ud0c8\ub9ac\uc544", "name_pt": "It\u00e1lia", "name_ru": "\u0418\u0442\u0430\u043b\u0438\u044f", "name_zh": "\u610f\u5927\u5229", "scalerank": 2, "type": "country"}, "id": 26347360, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6292, 493]}, "properties": {"code": "MM", "name": "Myanmar (Burma)", "name_ar": "\u0645\u064a\u0627\u0646\u0645\u0627\u0631", "name_de": "Myanmar (Birma)", "name_en": "Myanmar (Burma)", "name_es": "Myanmar (Birmania)", "name_fr": "Myanmar (Birmanie)", "name_ja": "\u30df\u30e3\u30f3\u30de\u30fc", "name_ko": "\ubbf8\uc580\ub9c8", "name_pt": "Myanmar", "name_ru": "\u041c\u044c\u044f\u043d\u043c\u0430 (\u0411\u0438\u0301\u0440\u043c\u0430)", "name_zh": "\u7f05\u7538", "scalerank": 2, "type": "country"}, "id": 424316478, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4888, -143]}, "properties": {"code": "TZ", "name": "Tanzania", "name_ar": "\u062a\u0646\u0632\u0627\u0646\u064a\u0627", "name_de": "Tansania", "name_en": "Tanzania", "name_es": "Tanzania", "name_fr": "Tanzanie", "name_ja": "\u30bf\u30f3\u30b6\u30cb\u30a2", "name_ko": "\ud0c4\uc790\ub2c8\uc544", "name_pt": "Tanz\u00e2nia", "name_ru": "\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u044f", "name_zh": "\u5766\u6851\u5c3c\u4e9a", "scalerank": 2, "type": "country"}, "id": 424314335, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4957, 12]}, "properties": {"code": "KE", "name": "Kenya", "name_ar": "\u0643\u064a\u0646\u064a\u0627", "name_de": "Kenia", "name_en": "Kenya", "name_es": "Kenia", "name_fr": "Kenya", "name_ja": "\u30b1\u30cb\u30a2", "name_ko": "\ucf00\ub0d0", "name_pt": "Qu\u00e9nia", "name_ru": "\u041a\u0435\u043d\u0438\u044f", "name_zh": "\u80af\u5c3c\u4e9a", "scalerank": 2, "type": "country"}, "id": 424313903, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4004, 1034]}, "properties": {"code": "ES", "name": "Espa\u00f1a", "name_ar": "\u0625\u0633\u0628\u0627\u0646\u064a\u0627", "name_de": "Spanien", "name_en": "Spain", "name_es": "Espa\u00f1a", "name_fr": "Espagne", "name_ja": "\u30b9\u30da\u30a4\u30f3", "name_ko": "\uc2a4\ud398\uc778", "name_pt": "Espanha", "name_ru": "\u0418\u0441\u043f\u0430\u043d\u0438\u044f", "name_zh": "\u897f\u73ed\u7259", "scalerank": 2, "type": "country"}, "id": 148332300, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4809, 1294]}, "properties": {"code": "UA", "name": "\u0423\u043a\u0440\u0430\u0457\u043d\u0430", "name_ar": "\u0623\u0648\u0643\u0631\u0627\u0646\u064a\u0627", "name_de": "Ukraine", "name_en": "Ukraine", "name_es": "Ucrania", "name_fr": "Ukraine", "name_ja": "\u30a6\u30af\u30e9\u30a4\u30ca", "name_ko": "\uc6b0\ud06c\ub77c\uc774\ub098", "name_pt": "Ucr\u00e2nia", "name_ru": "\u0423\u043a\u0440\u0430\u0438\u043d\u0430", "name_zh": "\u4e4c\u514b\u5170", "scalerank": 2, "type": "country"}, "id": 1648342273, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4535, 1395]}, "properties": {"code": "PL", "name": "Polska", "name_ar": "\u0628\u0648\u0644\u0646\u062f\u0627", "name_de": "Polen", "name_en": "Poland", "name_es": "Polonia", "name_fr": "Pologne", "name_ja": "\u30dd\u30fc\u30e9\u30f3\u30c9", "name_ko": "\ud3f4\ub780\ub4dc", "name_pt": "Pol\u00f3nia", "name_ru": "\u041f\u043e\u043b\u044c\u0448\u0430", "name_zh": "\u6ce2\u5170", "scalerank": 2, "type": "country"}, "id": 432425060, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5084, 798]}, "properties": {"code": "IQ", "name": "\u0627\u0644\u0639\u0631\u0627\u0642", "name_ar": "\u0627\u0644\u0639\u0631\u0627\u0642", "name_de": "Irak", "name_en": "Iraq", "name_es": "Iraq", "name_fr": "Irak", "name_ja": "\u30a4\u30e9\u30af", "name_ko": "\uc774\ub77c\ud06c", "name_pt": "Iraque", "name_ru": "\u0418\u0440\u0430\u043a", "name_zh": "\u4f0a\u62c9\u514b", "scalerank": 2, "type": "country"}, "id": 424316205, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3959, 779]}, "properties": {"code": "MA", "name": "\u0627\u0644\u0645\u063a\u0631\u0628", "name_ar": "\u0627\u0644\u0645\u063a\u0631\u0628", "name_de": "Marokko", "name_en": "Morocco", "name_es": "Marruecos", "name_fr": "Maroc", "name_ja": "\u30e2\u30ed\u30c3\u30b3", "name_ko": "\ubaa8\ub85c\ucf54", "name_pt": "Marrocos", "name_ru": "\u041c\u0430\u0440\u043e\u043a\u043a\u043e", "name_zh": "\u6469\u6d1b\u54e5", "scalerank": 2, "type": "country"}, "id": 432425041, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5598, 819]}, "properties": {"code": "AF", "name": "\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646", "name_ar": "\u0623\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646", "name_de": "Afghanistan", "name_en": "Afghanistan", "name_es": "Afganist\u00e1n", "name_fr": "Afghanistan", "name_ja": "\u30a2\u30d5\u30ac\u30cb\u30b9\u30bf\u30f3", "name_ko": "\uc544\ud504\uac00\ub2c8\uc2a4\ud0c4", "name_pt": "Afeganist\u00e3o", "name_ru": "\u0410\u0444\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d", "name_zh": "\u963f\u5bcc\u6c57", "scalerank": 2, "type": "country"}, "id": 26847706, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6423, 102]}, "properties": {"code": "MY", "name": "Malaysia", "name_ar": "\u0645\u0627\u0644\u064a\u0632\u064a\u0627", "name_de": "Malaysia", "name_en": "Malaysia", "name_es": "Malasia", "name_fr": "Malaisie", "name_ja": "\u30de\u30ec\u30fc\u30b7\u30a2", "name_ko": "\ub9d0\ub808\uc774\uc2dc\uc544", "name_pt": "Mal\u00e1sia", "name_ru": "\u041c\u0430\u043b\u0430\u0437\u0438\u044f", "name_zh": "\u9a6c\u6765\u897f\u4e9a", "scalerank": 2, "type": "country"}, "id": 249399394, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6006, 671]}, "properties": {"code": "NP", "name": "Nepal", "name_ar": "\u0646\u064a\u0628\u0627\u0644", "name_de": "Nepal", "name_en": "Nepal", "name_es": "Nepal", "name_fr": "N\u00e9pal", "name_ja": "\u30cd\u30d1\u30fc\u30eb", "name_ko": "\ub124\ud314", "name_pt": "Nepal", "name_ru": "\u041d\u0435\u043f\u0430\u043b", "name_zh": "\u5c3c\u6cca\u5c14", "scalerank": 2, "type": "country"}, "id": 249399402, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5533, 1047]}, "properties": {"code": "UZ", "name": "O\u2019zbekiston", "name_ar": "\u0623\u0648\u0632\u0628\u0643\u0633\u062a\u0627\u0646", "name_de": "Usbekistan", "name_en": "Uzbekistan", "name_es": "Uzbekist\u00e1n", "name_fr": "Ouzb\u00e9kistan", "name_ja": "\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3", "name_ko": "\uc6b0\uc988\ubca0\ud0a4\uc2a4\ud0c4", "name_pt": "Uzbequist\u00e3o", "name_ru": "\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d", "name_zh": "\u4e4c\u5179\u522b\u514b\u65af\u5766", "scalerank": 2, "type": "country"}, "id": 424317428, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5180, 367]}, "properties": {"code": "YE", "name": "\u0627\u0644\u064a\u064e\u0645\u064e\u0646", "name_ar": "\u0627\u0644\u064a\u0645\u0646", "name_de": "Jemen", "name_en": "Yemen", "name_es": "Yemen", "name_fr": "Y\u00e9men", "name_ja": "\u30a4\u30a8\u30e1\u30f3", "name_ko": "\uc608\uba58", "name_pt": "I\u00e9men", "name_ru": "\u0419\u0435\u043c\u0435\u043d", "name_zh": "\u4e5f\u95e8", "scalerank": 2, "type": "country"}, "id": 305092, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4374, 110]}, "properties": {"code": "CM", "name": "Cameroun\u00a0\u00b7 Cameroon", "name_ar": "\u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0648\u0646", "name_de": "Kamerun", "name_en": "Cameroon", "name_es": "Camer\u00fan", "name_fr": "Cameroun", "name_ja": "\u30ab\u30e1\u30eb\u30fc\u30f3", "name_ko": "\uce74\uba54\ub8ec", "name_pt": "Camar\u00f5es", "name_ru": "\u041a\u0430\u043c\u0435\u0440\u0443\u043d", "name_zh": "\u5580\u9ea6\u9686", "scalerank": 2, "type": "country"}, "id": 424315932, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4972, 852]}, "properties": {"code": "SY", "name": "\u0633\u0648\u0631\u064a\u0629", "name_ar": "\u0633\u0648\u0631\u064a\u0627", "name_de": "Syrien", "name_en": "Syria", "name_es": "Siria", "name_fr": "Syrie", "name_ja": "\u30b7\u30ea\u30a2", "name_ko": "\uc2dc\ub9ac\uc544", "name_pt": "S\u00edria", "name_ru": "\u0421\u0438\u0440\u0438\u044f", "name_zh": "\u53d9\u5229\u4e9a", "scalerank": 2, "type": "country"}, "id": 424311806, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5159, -450]}, "properties": {"code": "MG", "name": "Madagascar", "name_ar": "\u0645\u062f\u063a\u0634\u0642\u0631", "name_de": "Madagaskar", "name_en": "Madagascar", "name_es": "Madagascar", "name_fr": "Madagascar", "name_ja": "\u30de\u30c0\u30ac\u30b9\u30ab\u30eb", "name_ko": "\ub9c8\ub2e4\uac00\uc2a4\uce74\ub974", "name_pt": "Madag\u00e1scar", "name_ru": "\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440", "name_zh": "\u9a6c\u8fbe\u52a0\u65af\u52a0", "scalerank": 2, "type": "country"}, "id": 432425028, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4664, 1176]}, "properties": {"code": "RO", "name": "Rom\u00e2nia", "name_ar": "\u0631\u0648\u0645\u0627\u0646\u064a\u0627", "name_de": "Rum\u00e4nien", "name_en": "Romania", "name_es": "Rumania", "name_fr": "Roumanie", "name_ja": "\u30eb\u30fc\u30de\u30cb\u30a2", "name_ko": "\ub8e8\ub9c8\ub2c8\uc544", "name_pt": "Rom\u00e9nia", "name_ru": "\u0420\u0443\u043c\u044b\u043d\u0438\u044f", "name_zh": "\u7f57\u9a6c\u5c3c\u4e9a", "scalerank": 2, "type": "country"}, "id": 432425064, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4887, -419]}, "properties": {"code": "MZ", "name": "Mozambique", "name_ar": "\u0645\u0648\u0632\u0645\u0628\u064a\u0642", "name_de": "Mosambik", "name_en": "Mozambique", "name_es": "Mozambique", "name_fr": "Mozambique", "name_ja": "\u30e2\u30b6\u30f3\u30d3\u30fc\u30af", "name_ko": "\ubaa8\uc7a0\ube44\ud06c", "name_pt": "Mo\u00e7ambique", "name_ru": "\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a", "name_zh": "\u83ab\u6851\u6bd4\u514b", "scalerank": 2, "type": "country"}, "id": 424311658, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5932, 174]}, "properties": {"code": "LK", "name": "Sri Lanka", "name_ar": "\u0633\u0631\u064a\u0644\u0627\u0646\u0643\u0627", "name_de": "Sri Lanka", "name_en": "Sri Lanka", "name_es": "Sri Lanka", "name_fr": "Sri Lanka", "name_ja": "\u30b9\u30ea\u30e9\u30f3\u30ab", "name_ko": "\uc2a4\ub9ac\ub791\uce74", "name_pt": "Sri Lanka", "name_ru": "\u0428\u0440\u0438-\u041b\u0430\u043d\u043a\u0430", "name_zh": "\u65af\u91cc\u5170\u5361", "scalerank": 2, "type": "country"}, "id": 424311565, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4310, 403]}, "properties": {"code": "NE", "name": "Niger", "name_ar": "\u0627\u0644\u0646\u064a\u062c\u0631", "name_de": "Niger", "name_en": "Niger", "name_es": "N\u00edger", "name_fr": "Niger", "name_ja": "\u30cb\u30b8\u30a7\u30fc\u30eb", "name_ko": "\ub2c8\uc81c\ub974", "name_pt": "N\u00edger", "name_ru": "\u041d\u0438\u0433\u0435\u0440", "name_zh": "\u5c3c\u65e5\u5c14", "scalerank": 2, "type": "country"}, "id": 424311675, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4280, 219]}, "properties": {"code": "NG", "name": "Nigeria", "name_ar": "\u0646\u064a\u062c\u064a\u0631\u064a\u0627", "name_de": "Nigeria", "name_en": "Nigeria", "name_es": "Nigeria", "name_fr": "Nigeria", "name_ja": "\u30ca\u30a4\u30b8\u30a7\u30ea\u30a2", "name_ko": "\ub098\uc774\uc9c0\ub9ac\uc544", "name_pt": "Nig\u00e9ria", "name_ru": "\u041d\u0438\u0433\u0435\u0440\u0438\u044f", "name_zh": "\u5c3c\u65e5\u5229\u4e9a", "scalerank": 2, "type": "country"}, "id": 424316663, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2453, -928]}, "properties": {"code": "CL", "name": "Chile", "name_ar": "\u062a\u0634\u064a\u0644\u064a", "name_de": "Chile", "name_en": "Chile", "name_es": "Chile", "name_fr": "Chili", "name_ja": "\u30c1\u30ea", "name_ko": "\uce60\ub808", "name_pt": "Chile", "name_ru": "\u0427\u0438\u043b\u0438", "name_zh": "\u667a\u5229", "scalerank": 2, "type": "country"}, "id": 424311104, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4068, 401]}, "properties": {"code": "ML", "name": "Mali", "name_ar": "\u0645\u0627\u0644\u064a", "name_de": "Mali", "name_en": "Mali", "name_es": "Mal\u00ed", "name_fr": "Mali", "name_ja": "\u30de\u30ea\u5171\u548c\u56fd", "name_ko": "\ub9d0\ub9ac", "name_pt": "Mali", "name_ru": "\u041c\u0430\u043b\u0438", "name_zh": "\u9a6c\u91cc", "scalerank": 2, "type": "country"}, "id": 424297816, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6484, 286]}, "properties": {"code": "KH", "name": "Cambodia", "name_ar": "\u0643\u0645\u0628\u0648\u062f\u064a\u0627", "name_de": "Kambodscha", "name_en": "Cambodia", "name_es": "Camboya", "name_fr": "Cambodge", "name_ja": "\u30ab\u30f3\u30dc\u30b8\u30a2", "name_ko": "\uce84\ubcf4\ub514\uc544", "name_pt": "Camboja", "name_ru": "\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0430", "name_zh": "\u67ec\u57d4\u5be8", "scalerank": 2, "type": "country"}, "id": 432424952, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2311, -26]}, "properties": {"code": "EC", "name": "Ecuador", "name_ar": "\u0627\u0644\u0625\u0643\u0648\u0627\u062f\u0648\u0631", "name_de": "Ecuador", "name_en": "Ecuador", "name_es": "Ecuador", "name_fr": "\u00c9quateur", "name_ja": "\u30a8\u30af\u30a2\u30c9\u30eb", "name_ko": "\uc5d0\ucf70\ub3c4\ub974", "name_pt": "Equador", "name_ru": "\u042d\u043a\u0432\u0430\u0434\u043e\u0440", "name_zh": "\u5384\u74dc\u591a\u5c14", "scalerank": 2, "type": "country"}, "id": 424298227, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4521, 354]}, "properties": {"code": "TD", "name": "Tchad \u062a\u0634\u0627\u062f", "name_ar": "\u062a\u0634\u0627\u062f", "name_de": "Tschad", "name_en": "Chad", "name_es": "Chad", "name_fr": "Tchad", "name_ja": "\u30c1\u30e3\u30c9", "name_ko": "\ucc28\ub4dc", "name_pt": "Chade", "name_ru": "\u0427\u0430\u0434", "name_zh": "\u4e4d\u5f97", "scalerank": 2, "type": "country"}, "id": 424298076, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3759, 351]}, "properties": {"code": "SN", "name": "S\u00e9n\u00e9gal", "name_ar": "\u0627\u0644\u0633\u0646\u063a\u0627\u0644", "name_de": "Senegal", "name_en": "Senegal", "name_es": "Senegal", "name_fr": "S\u00e9n\u00e9gal", "name_ja": "\u30bb\u30cd\u30ac\u30eb", "name_ko": "\uc138\ub124\uac08", "name_pt": "Senegal", "name_ru": "\u0421\u0435\u043d\u0435\u0433\u0430\u043b", "name_zh": "\u585e\u5185\u52a0\u5c14", "scalerank": 2, "type": "country"}, "id": 432425075, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4504, -277]}, "properties": {"code": "AO", "name": "Angola", "name_ar": "\u0623\u0646\u063a\u0648\u0644\u0627", "name_de": "Angola", "name_en": "Angola", "name_es": "Angola", "name_fr": "Angola", "name_ja": "\u30a2\u30f3\u30b4\u30e9", "name_ko": "\uc559\uace8\ub77c", "name_pt": "Angola", "name_ru": "\u0410\u043d\u0433\u043e\u043b\u0430", "name_zh": "\u5b89\u54e5\u62c9", "scalerank": 2, "type": "country"}, "id": 424310875, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4777, -445]}, "properties": {"code": "ZW", "name": "Zimbabwe", "name_ar": "\u0632\u064a\u0645\u0628\u0627\u0628\u0648\u064a", "name_de": "Simbabwe", "name_en": "Zimbabwe", "name_es": "Zimbabue", "name_fr": "Zimbabwe", "name_ja": "\u30b8\u30f3\u30d0\u30d6\u30a8", "name_ko": "\uc9d0\ubc14\ube0c\uc6e8", "name_pt": "Zimb\u00e1bue", "name_ru": "\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435", "name_zh": "\u6d25\u5df4\u5e03\u97e6", "scalerank": 2, "type": "country"}, "id": 1640880787, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4780, 166]}, "properties": {"code": "SS", "name": "South Sudan", "name_ar": "\u062c\u0646\u0648\u0628 \u0627\u0644\u0633\u0648\u062f\u0627\u0646", "name_de": "S\u00fcdsudan", "name_en": "South Sudan", "name_es": "Sud\u00e1n del Sur", "name_fr": "Soudan du Sud", "name_ja": "\u5357\u30b9\u30fc\u30c0\u30f3", "name_ko": "\ub0a8\uc218\ub2e8", "name_pt": "Sud\u00e3o do Sul", "name_ru": "\u042e\u0436\u044b\u0439 \u0421\u0443\u0434\u0430\u043d", "name_zh": "\u5357\u82cf\u4e39", "scalerank": 2, "type": "country"}, "id": 1656678, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4720, -322]}, "properties": {"code": "ZM", "name": "Zambia", "name_ar": "\u0632\u0627\u0645\u0628\u064a\u0627", "name_de": "Sambia", "name_en": "Zambia", "name_es": "Zambia", "name_fr": "Zambie", "name_ja": "\u30b6\u30f3\u30d3\u30a2", "name_ko": "\uc7a0\ube44\uc544", "name_pt": "Z\u00e2mbia", "name_ru": "\u0417\u0430\u043c\u0431\u0438\u044f", "name_zh": "\u8d5e\u6bd4\u4e9a", "scalerank": 2, "type": "country"}, "id": 432425123, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2293, 512]}, "properties": {"code": "CU", "name": "Cuba", "name_ar": "\u0643\u0648\u0628\u0627", "name_de": "Kuba", "name_en": "Cuba", "name_es": "Cuba", "name_fr": "Cuba", "name_ja": "\u30ad\u30e5\u30fc\u30d0", "name_ko": "\ucfe0\ubc14", "name_pt": "Cuba", "name_ru": "\u041a\u0443\u0431\u0430", "name_zh": "\u53e4\u5df4", "scalerank": 2, "type": "country"}, "id": 249399313, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4638, 953]}, "properties": {"code": "GR", "name": "\u0395\u03bb\u03bb\u03ac\u03b4\u03b1", "name_ar": "\u0627\u0644\u064a\u0648\u0646\u0627\u0646", "name_de": "Griechenland", "name_en": "Greece", "name_es": "Grecia", "name_fr": "Gr\u00e8ce", "name_ja": "\u30ae\u30ea\u30b7\u30e3", "name_ko": "\uadf8\ub9ac\uc2a4", "name_pt": "Gr\u00e9cia", "name_ru": "\u0413\u0440\u0435\u0446\u0438\u044f", "name_zh": "\u5e0c\u814a", "scalerank": 2, "type": "country"}, "id": 432424989, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4314, 827]}, "properties": {"code": "TN", "name": "\u062a\u0648\u0646\u0633", "name_ar": "\u062a\u0648\u0646\u0633", "name_de": "Tunesien", "name_en": "Tunisia", "name_es": "T\u00fanez", "name_fr": "Tunisie", "name_ja": "\u30c1\u30e5\u30cb\u30b8\u30a2", "name_ko": "\ud280\ub2c8\uc9c0", "name_pt": "Tun\u00edsia", "name_ru": "\u0422\u0443\u043d\u0438\u0441", "name_zh": "\u7a81\u5c3c\u65af", "scalerank": 2, "type": "country"}, "id": 424317315, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4540, 1217]}, "properties": {"code": "HU", "name": "Magyarorsz\u00e1g", "name_ar": "\u0627\u0644\u0645\u062c\u0631", "name_de": "Ungarn", "name_en": "Hungary", "name_es": "Hungr\u00eda", "name_fr": "Hongrie", "name_ja": "\u30cf\u30f3\u30ac\u30ea\u30fc", "name_ko": "\ud5dd\uac00\ub9ac", "name_pt": "Hungria", "name_ru": "\u0412\u0435\u043d\u0433\u0440\u0438\u044f", "name_zh": "\u5308\u7259\u5229", "scalerank": 2, "type": "country"}, "id": 249399347, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4734, 1448]}, "properties": {"code": "BY", "name": "\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c", "name_ar": "\u0631\u0648\u0633\u064a\u0627 \u0627\u0644\u0628\u064a\u0636\u0627\u0621", "name_de": "Wei\u00dfrussland", "name_en": "Belarus", "name_es": "Bielorrusia", "name_fr": "Bi\u00e9lorussie", "name_ja": "\u30d9\u30e9\u30eb\u30fc\u30b7", "name_ko": "\ubca8\ub77c\ub8e8\uc2a4", "name_pt": "Bielorr\u00fassia", "name_ru": "\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c", "name_zh": "\u767d\u4fc4\u7f57\u65af", "scalerank": 2, "type": "country"}, "id": 249399300, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5173, 132]}, "properties": {"code": "SO", "name": "\u0627\u0644\u0635\u0648\u0645\u0627\u0644", "name_ar": "\u0627\u0644\u0635\u0648\u0645\u0627\u0644", "name_de": "Somalia", "name_en": "Somalia", "name_es": "Somalia", "name_fr": "Somalie", "name_ja": "\u30bd\u30de\u30ea\u30a2", "name_ko": "\uc18c\ub9d0\ub9ac\uc544", "name_pt": "Som\u00e1lia", "name_ru": "\u0421\u043e\u043c\u0430\u043b\u0438", "name_zh": "\u7d22\u9a6c\u91cc", "scalerank": 2, "type": "country"}, "id": 424317039, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4498, 1962]}, "properties": {"code": "SE", "name": "Sverige", "name_ar": "\u0627\u0644\u0633\u0648\u064a\u062f", "name_de": "Schweden", "name_en": "Sweden", "name_es": "Suecia", "name_fr": "Su\u00e8de", "name_ja": "\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3", "name_ko": "\uc2a4\uc6e8\ub374", "name_pt": "Su\u00e9cia", "name_ru": "\u0428\u0432\u0435\u0446\u0438\u044f", "name_zh": "\u745e\u5178", "scalerank": 2, "type": "country"}, "id": 424313277, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7401, -148]}, "properties": {"code": "PG", "name": "Papua New Guinea", "name_ar": "\u0628\u0627\u0628\u0648\u0627 \u063a\u064a\u0646\u064a\u0627 \u0627\u0644\u062c\u062f\u064a\u062f\u0629", "name_de": "Papua-Neuguinea", "name_en": "Papua New Guinea", "name_es": "Pap\u00faa Nueva Guinea", "name_fr": "Papouasie-Nouvelle-Guin\u00e9e", "name_ja": "\u30d1\u30d7\u30a2\u30cb\u30e5\u30fc\u30ae\u30cb\u30a2", "name_ko": "\ud30c\ud478\uc544\ub274\uae30\ub2c8", "name_pt": "Papua-Nova Guin\u00e9", "name_ru": "\u041f\u0430\u043f\u0443\u0430 \u041d\u043e\u0432\u0430\u044f \u0413\u0432\u0438\u043d\u0435\u044f", "name_zh": "\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a", "scalerank": 2, "type": "country"}, "id": 424297931, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5713, 960]}, "properties": {"code": "TJ", "name": "\u0422\u043e\u04b7\u0438\u043a\u0438\u0441\u0442\u043e\u043d", "name_ar": "\u0637\u0627\u062c\u064a\u0643\u0633\u062a\u0627\u0646", "name_de": "Tadschikistan", "name_en": "Tajikistan", "name_es": "Tayikist\u00e1n", "name_fr": "Tadjikistan", "name_ja": "\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3", "name_ko": "\ud0c0\uc9c0\ud0a4\uc2a4\ud0c4", "name_pt": "Tajiquist\u00e3o", "name_ru": "\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d", "name_zh": "\u5854\u5409\u514b\u65af\u5766", "scalerank": 2, "type": "country"}, "id": 424314276, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2767, -544]}, "properties": {"code": "PY", "name": "Paraguay", "name_ar": "\u0628\u0627\u0631\u0627\u063a\u0648\u0627\u064a", "name_de": "Paraguay", "name_en": "Paraguay", "name_es": "Paraguay", "name_fr": "Paraguay", "name_ja": "\u30d1\u30e9\u30b0\u30a2\u30a4", "name_ko": "\ud30c\ub77c\uacfc\uc774", "name_pt": "Paraguai", "name_ru": "\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439", "name_zh": "\u5df4\u62c9\u572d", "scalerank": 2, "type": "country"}, "id": 287077, "type": 1}, {"geometry": {"type": "Point", "coordinates": [6431, 463]}, "properties": {"code": "LA", "name": "\u0e9b\u0eb0\u0ec0\u0e97\u0e94\u0ea5\u0eb2\u0ea7", "name_ar": "\u0644\u0627\u0648\u0633", "name_de": "Laos", "name_en": "Laos", "name_es": "Laos", "name_fr": "Laos", "name_ja": "\u30e9\u30aa\u30b9", "name_ko": "\ub77c\uc624\uc2a4", "name_pt": "Laos", "name_ru": "\u041b\u0430\u043e\u0441", "name_zh": "\u8001\u631d", "scalerank": 2, "type": "country"}, "id": 424316307, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5793, 1039]}, "properties": {"code": "KG", "name": "\u041a\u044b\u0440\u0433\u044b\u0437\u0441\u0442\u0430\u043d", "name_ar": "\u0642\u0631\u063a\u064a\u0632\u0633\u062a\u0627\u0646", "name_de": "Kirgisistan", "name_en": "Kyrgyzstan", "name_es": "Kirguist\u00e1n", "name_fr": "Kirghizstan", "name_ja": "\u30ad\u30eb\u30ae\u30b9", "name_ko": "\ud0a4\ub974\uae30\uc2a4\uc2a4\ud0c4", "name_pt": "Quirguist\u00e3o", "name_ru": "\u041a\u0438\u0440\u0433\u0438\u0437\u0438\u044f", "name_zh": "\u5409\u5c14\u5409\u65af\u65af\u5766", "scalerank": 2, "type": "country"}, "id": 1700777271, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4325, 1544]}, "properties": {"code": "DK", "name": "Danmark", "name_ar": "\u0627\u0644\u062f\u0646\u0645\u0627\u0631\u0643", "name_de": "D\u00e4nemark", "name_en": "Denmark", "name_es": "Dinamarca", "name_fr": "Danemark", "name_ja": "\u30c7\u30f3\u30de\u30fc\u30af", "name_ko": "\ub374\ub9c8\ud06c", "name_pt": "Dinamarca", "name_ru": "\u0414\u0430\u043d\u0438\u044f", "name_zh": "\u4e39\u9ea6", "scalerank": 2, "type": "country"}, "id": 432424968, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4692, 1849]}, "properties": {"code": "FI", "name": "Suomi", "name_ar": "\u0641\u0646\u0644\u0646\u062f\u0627", "name_de": "Finnland", "name_en": "Finland", "name_es": "Finlandia", "name_fr": "Finlande", "name_ja": "\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9", "name_ko": "\ud540\ub780\ub4dc", "name_pt": "Finl\u00e2ndia", "name_ru": "\u0424\u0438\u043d\u043b\u044f\u043d\u0434\u0438\u044f", "name_zh": "\u82ac\u5170", "scalerank": 2, "type": "country"}, "id": 432424981, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5447, 969]}, "properties": {"code": "TM", "name": "T\u00fcrkmenistan", "name_ar": "\u062a\u0631\u0643\u0645\u0627\u0646\u0633\u062a\u0627\u0646", "name_de": "Turkmenistan", "name_en": "Turkmenistan", "name_es": "Turkmenist\u00e1n", "name_fr": "Turkm\u00e9nistan", "name_ja": "\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3", "name_ko": "\ud22c\ub974\ud06c\uba54\ub2c8\uc2a4\ud0c4", "name_pt": "Turquemenist\u00e3o", "name_ru": "\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u044f", "name_zh": "\u571f\u5e93\u66fc\u65af\u5766", "scalerank": 2, "type": "country"}, "id": 249399440, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4296, 1775]}, "properties": {"code": "NO", "name": "Norge", "name_ar": "\u0627\u0644\u0646\u0631\u0648\u064a\u062c", "name_de": "Norwegen", "name_en": "Norway", "name_es": "Noruega", "name_fr": "Norv\u00e8ge", "name_ja": "\u30ce\u30eb\u30a6\u30a7\u30fc", "name_ko": "\ub178\ub974\uc6e8\uc774", "name_pt": "Noruega", "name_ru": "\u041d\u043e\u0440\u0432\u0435\u0433\u0438\u044f", "name_zh": "\u632a\u5a01", "scalerank": 2, "type": "country"}, "id": 424297198, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3920, 1439]}, "properties": {"code": "IE", "name": "Ireland\u00a0\u00b7 \u00c9ire", "name_ar": "\u062c\u0645\u0647\u0648\u0631\u064a\u0629 \u0623\u064a\u0631\u0644\u0646\u062f\u0627", "name_de": "Irland", "name_en": "Ireland", "name_es": "Irlanda", "name_fr": "Irlande", "name_ja": "\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9", "name_ko": "\uc544\uc77c\ub79c\ub4dc", "name_pt": "Rep\u00fablica da Irlanda", "name_ru": "\u0418\u0440\u043b\u0430\u043d\u0434\u0438\u044f", "name_zh": "\u7231\u5c14\u5170", "scalerank": 2, "type": "country"}, "id": 1420871007, "type": 1}, {"geometry": {"type": "Point", "coordinates": [8005, -1050]}, "properties": {"code": "NZ", "name": "New Zealand", "name_ar": "\u0646\u064a\u0648\u0632\u064a\u0644\u0646\u062f\u0627", "name_de": "Neuseeland", "name_en": "New Zealand", "name_es": "Nueva Zelanda", "name_fr": "Nouvelle-Z\u00e9lande", "name_ja": "\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9", "name_ko": "\ub274\uc9c8\ub79c\ub4dc", "name_pt": "Nova Zel\u00e2ndia", "name_ru": "\u041d\u043e\u0432\u0430\u044f \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f", "name_zh": "\u65b0\u897f\u5170", "scalerank": 2, "type": "country"}, "id": 248120384, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3856, 459]}, "properties": {"code": "MR", "name": "\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627", "name_ar": "\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627", "name_de": "Mauretanien", "name_en": "Mauritania", "name_es": "Mauritania", "name_fr": "Mauritanie", "name_ja": "\u30e2\u30fc\u30ea\u30bf\u30cb\u30a2", "name_ko": "\ubaa8\ub9ac\ud0c0\ub2c8", "name_pt": "Maurit\u00e2nia", "name_ru": "\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0438\u044f", "name_zh": "\u6bdb\u91cc\u5854\u5c3c\u4e9a", "scalerank": 2, "type": "country"}, "id": 424316493, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2821, -791]}, "properties": {"code": "UY", "name": "Uruguay", "name_ar": "\u0627\u0644\u0623\u0648\u0631\u0648\u063a\u0648\u0627\u064a", "name_de": "Uruguay", "name_en": "Uruguay", "name_es": "Uruguay", "name_fr": "Uruguay", "name_ja": "\u30a6\u30eb\u30b0\u30a2\u30a4", "name_ko": "\uc6b0\ub8e8\uacfc\uc774", "name_pt": "Uruguai", "name_ru": "\u0423\u0440\u0443\u0433\u0432\u0430\u0439", "name_zh": "\u4e4c\u62c9\u572d", "scalerank": 2, "type": "country"}, "id": 432425116, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5395, 498]}, "properties": {"code": "OM", "name": "\u0639\u064f\u0645\u0627\u0646", "name_ar": "\u0633\u0644\u0637\u0646\u0629 \u0639\u0645\u0627\u0646", "name_de": "Oman", "name_en": "Oman", "name_es": "Om\u00e1n", "name_fr": "Oman", "name_ja": "\u30aa\u30de\u30fc\u30f3", "name_ko": "\uc624\ub9cc", "name_pt": "Om\u00e3", "name_ru": "\u041e\u043c\u0430\u043d", "name_zh": "\u963f\u66fc", "scalerank": 2, "type": "country"}, "id": 424315291, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4489, -494]}, "properties": {"code": "NA", "name": "Namibia", "name_ar": "\u0646\u0627\u0645\u064a\u0628\u064a\u0627", "name_de": "Namibia", "name_en": "Namibia", "name_es": "Namibia", "name_fr": "Namibie", "name_ja": "\u30ca\u30df\u30d3\u30a2", "name_ko": "\ub098\ubbf8\ube44\uc544", "name_pt": "Nam\u00edbia", "name_ru": "\u041d\u0430\u043c\u0438\u0431\u0438", "name_zh": "\u7eb3\u7c73\u6bd4\u4e9a", "scalerank": 2, "type": "country"}, "id": 424311662, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4649, -519]}, "properties": {"code": "BW", "name": "Botswana", "name_ar": "\u0628\u0648\u062a\u0633\u0648\u0627\u0646\u0627", "name_de": "Botsuana", "name_en": "Botswana", "name_es": "Botsuana", "name_fr": "Botswana", "name_ja": "\u30dc\u30c4\u30ef\u30ca", "name_ko": "\ubcf4\uce20\uc640\ub098", "name_pt": "Botsuana", "name_ru": "\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0430", "name_zh": "\u535a\u8328\u74e6\u7eb3", "scalerank": 2, "type": "country"}, "id": 424313751, "type": 1}, {"geometry": {"type": "Point", "coordinates": [5763, 73]}, "properties": {"code": "MV", "name": "Maldives", "name_ar": "\u062c\u0632\u0631 \u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641", "name_de": "Malediven", "name_en": "Maldives", "name_es": "Maldivas", "name_fr": "Maldives", "name_ja": "\u30e2\u30eb\u30c7\u30a3\u30d6", "name_ko": "\ubab0\ub514\ube0c", "name_pt": "Maldivas", "name_ru": "\u041c\u0430\u043b\u044c\u0434\u0438\u0432\u044b", "name_zh": "\u9a6c\u5c14\u4ee3\u592b", "scalerank": 2, "type": "country"}, "id": 424311641, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3673, 1964]}, "properties": {"code": "IS", "name": "\u00cdsland", "name_ar": "\u0622\u064a\u0633\u0644\u0646\u062f\u0627", "name_de": "Island", "name_en": "Iceland", "name_es": "Islandia", "name_fr": "Islande", "name_ja": "\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9", "name_ko": "\uc544\uc774\uc2ac\ub780\ub4dc", "name_pt": "Isl\u00e2ndia", "name_ru": "\u0418\u0441\u043b\u0430\u043d\u0434\u0438\u044f", "name_zh": "\u51b0\u5c9b", "scalerank": 2, "type": "country"}, "id": 424314784, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3154, 2619]}, "properties": {"code": "GL", "name": "Kalaallit Nunaat", "name_ar": "\u063a\u0631\u064a\u0646\u0644\u0627\u0646\u062f", "name_de": "Gr\u00f6nland", "name_en": "Greenland", "name_es": "Groenlandia", "name_fr": "Groenland", "name_ja": "\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9", "name_ko": "\uadf8\ub9b0\ub780\ub4dc", "name_pt": "Gronel\u00e2ndia", "name_ru": "\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0438\u044f", "name_zh": "\u683c\u9675\u5170", "scalerank": 2, "type": "country"}, "id": 424312026, "type": 1}, {"geometry": {"type": "Point", "coordinates": [4559, 3018]}, "properties": {"code": "SJ", "name": "Svalbard", "name_ar": "\u0633\u0641\u0627\u0644\u0628\u0627\u0631\u062f", "name_de": "Spitzbergen", "name_en": "Svalbard", "name_es": "Svalbard", "name_fr": "Svalbard", "name_ja": "\u30b9\u30f4\u30a1\u30fc\u30eb\u30d0\u30eb\u8af8\u5cf6", "name_ko": "\uc2a4\ubc1c\ubc14\ub974 \uc81c\ub3c4", "name_pt": "Svalbard", "name_ru": "\u0428\u043f\u0438\u0446\u0431\u0435\u0440\u0433\u0435\u043d", "name_zh": "\u65af\u74e6\u5c14\u5df4\u7fa4\u5c9b", "parent": "NO", "scalerank": 2, "type": "territory"}, "id": 1337397, "type": 1}]}, "marine_label": {"extent": 4096, "version": 2, "features": [{"geometry": {"type": "LineString", "coordinates": [[4680, 3703], [5095, 3692], [5510, 3662], [5922, 3611], [6331, 3540], [6705, 3457]]}, "properties": {"labelrank": 1, "name": "Arctic Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0645\u062a\u062c\u0645\u062f \u0627\u0644\u0634\u0645\u0627\u0644\u064a", "name_de": "Arktischer Ozean", "name_en": "Arctic Ocean", "name_es": "Oc\u00e9ano \u00c1rtico", "name_fr": "Oc\u00e9an Arctique", "name_ja": "\u5317\u6975\u6d77", "name_ko": "\ubd81\uadf9\ud574", "name_pt": "Oceano \u00c1rtico", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u041b\u0435\u0434\u043e\u0432\u0438\u0442\u044b\u0439 \u043e\u043a\u0435\u0430\u043d", "name_zh": "\u5317\u51b0\u6d0b", "placement": "line"}, "id": 1, "type": 2}, {"geometry": {"type": "LineString", "coordinates": [[75, 2690], [175, 2689], [372, 2701], [568, 2733], [759, 2784], [945, 2854], [1123, 2941], [1291, 3046], [1412, 3136]]}, "properties": {"labelrank": 1, "name": "Arctic Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0645\u062a\u062c\u0645\u062f \u0627\u0644\u0634\u0645\u0627\u0644\u064a", "name_de": "Arktischer Ozean", "name_en": "Arctic Ocean", "name_es": "Oc\u00e9ano \u00c1rtico", "name_fr": "Oc\u00e9an Arctique", "name_ja": "\u5317\u6975\u6d77", "name_ko": "\ubd81\uadf9\ud574", "name_pt": "Oceano \u00c1rtico", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u041b\u0435\u0434\u043e\u0432\u0438\u0442\u044b\u0439 \u043e\u043a\u0435\u0430\u043d", "name_zh": "\u5317\u51b0\u6d0b", "placement": "line"}, "id": 2, "type": 2}, {"geometry": {"type": "Point", "coordinates": [5912, -544]}, "properties": {"labelrank": 1, "name": "Indian Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0647\u0646\u062f\u064a", "name_de": "Indischer Ozean", "name_en": "Indian Ocean", "name_es": "Oc\u00e9ano \u00cdndico", "name_fr": "Oc\u00e9an Indien", "name_ja": "\u30a4\u30f3\u30c9\u6d0b", "name_ko": "\uc778\ub3c4\uc591", "name_pt": "Oceano \u00cdndico", "name_ru": "\u0418\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043e\u043a\u0435\u0430\u043d", "name_zh": "\u5370\u5ea6\u6d0b", "placement": "point"}, "id": 3, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3263, 1014]}, "properties": {"labelrank": 1, "name": "North Atlantic Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0623\u0637\u0644\u0633\u064a", "name_de": "Nordatlantik", "name_en": "North Atlantic Ocean", "name_es": "Oc\u00e9ano Atl\u00e1ntico Norte", "name_fr": "Oc\u00e9an Atlantique", "name_ja": "\u5317\u5927\u897f\u6d0b", "name_ko": "\ubd81\ub300\uc11c\uc591", "name_pt": "Atl\u00e1ntico Norte", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0410\u0442\u043b\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u0435\u0430\u043d\u0430", "name_zh": "\u5317\u5927\u897f\u6d0b", "placement": "point"}, "id": 4, "type": 1}, {"geometry": {"type": "Point", "coordinates": [408, 884]}, "properties": {"labelrank": 1, "name": "North Pacific Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0647\u0627\u062f\u0626", "name_de": "Nordpazifik", "name_en": "North Pacific Ocean", "name_es": "Oc\u00e9ano Pac\u00edfico Norte", "name_fr": "Oc\u00e9an Pacifique nord", "name_ja": "\u592a\u5e73\u6d0b", "name_ko": "\ud0dc\ud3c9\uc591", "name_pt": "Pac\u00edfico Norte", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0422\u0438\u0445\u043e\u0433\u043e \u043e\u043a\u0435\u0430\u043d\u0443", "name_zh": "\u5317\u592a\u5e73\u6d0b", "placement": "point"}, "id": 5, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3755, -679]}, "properties": {"labelrank": 1, "name": "South Atlantic Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0623\u0637\u0644\u0633\u064a", "name_de": "S\u00fcdatlantik", "name_en": "South Atlantic Ocean", "name_es": "Oc\u00e9ano Atl\u00e1ntico Sur", "name_fr": "Oc\u00e9an Atlantique sud", "name_ja": "\u5357\u5927\u897f\u6d0b", "name_ko": "\ub0a8\ub300\uc11c\uc591", "name_pt": "Atl\u00e2ntico Sul", "name_ru": "\u042e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0410\u0442\u043b\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u0435\u0430\u043d\u0430", "name_zh": "\u5357\u5927\u897f\u6d0b", "placement": "point"}, "id": 6, "type": 1}, {"geometry": {"type": "Point", "coordinates": [774, -811]}, "properties": {"labelrank": 1, "name": "South Pacific Ocean", "name_ar": "\u0627\u0644\u0645\u062d\u064a\u0637 \u0627\u0644\u0647\u0627\u062f\u0626", "name_de": "S\u00fcdpazifik", "name_en": "South Pacific Ocean", "name_es": "Oc\u00e9ano Pac\u00edfico Sur", "name_fr": "Oc\u00e9an Pacifique sud", "name_ja": "\u592a\u5e73\u6d0b", "name_ko": "\ud0dc\ud3c9\uc591", "name_pt": "Pac\u00edfico Sul", "name_ru": "\u042e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0422\u0438\u0445\u043e\u0433\u043e \u043e\u043a\u0435\u0430\u043d\u0430", "name_zh": "\u5357\u592a\u5e73\u6d0b", "placement": "point"}, "id": 7, "type": 1}]}, "state_label": {"extent": 4096, "version": 2, "features": [{"geometry": {"type": "Point", "coordinates": [6876, -600]}, "properties": {"abbr": "W.A.", "area": 2527922.9, "name": "Western Australia", "name_ar": "\u0623\u0633\u062a\u0631\u0627\u0644\u064a\u0627 \u0627\u0644\u063a\u0631\u0628\u064a\u0629", "name_de": "Westaustralien", "name_en": "Western Australia", "name_es": "Australia Occidental", "name_fr": "Australie occidentale", "name_ja": "\u897f\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2\u5dde", "name_ko": "\uc6e8\uc2a4\ud134\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544 \uc8fc", "name_pt": "Austr\u00e1lia Ocidental", "name_ru": "\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f", "name_zh": "\u897f\u6fb3\u5927\u5229\u4e9a\u5dde"}, "id": 304951005, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1990, 1966]}, "properties": {"abbr": "Nun.", "area": 2078337.8, "name": "Nunavut", "name_ar": "\u0646\u0648\u0646\u0627\u0641\u0648\u062a", "name_de": "Nunavut", "name_en": "Nunavut", "name_es": "Nunavut", "name_fr": "Nunavut", "name_ja": "\u30cc\u30ca\u30d6\u30c8\u6e96\u5dde", "name_ko": "\ub204\ub098\ubd80\ud2b8 \uc900\uc8fc", "name_pt": "Nunavut", "name_ru": "\u041d\u0443\u043d\u0430\u0432\u0443\u0442", "name_zh": "\u52aa\u7eb3\u6b66\u7279"}, "id": 305700700, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7385, -527]}, "properties": {"abbr": "Qld.", "area": 1730008.2, "name": "Queensland", "name_ar": "\u0643\u0648\u064a\u0646\u0632\u0644\u0627\u0646\u062f", "name_de": "Queensland", "name_en": "Queensland", "name_es": "Queensland", "name_fr": "Queensland", "name_ja": "\u30af\u30a4\u30fc\u30f3\u30ba\u30e9\u30f3\u30c9\u5dde", "name_ko": "\ud038\uc990\ub79c\ub4dc \uc8fc", "name_pt": "Queensland", "name_ru": "\u041a\u0432\u0438\u043d\u0441\u043b\u0435\u043d\u0434", "name_zh": "\u6606\u58eb\u5170\u5dde"}, "id": 1971329414, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2623, -95]}, "properties": {"area": 1565464.7, "name": "Amazonas", "name_ar": "\u0646\u0647\u0631 \u0627\u0644\u0623\u0645\u0627\u0632\u0648\u0646", "name_de": "Amazonas", "name_en": "Amazonas", "name_es": "Amazonas", "name_fr": "Amazonas", "name_ja": "\u30a2\u30de\u30be\u30f3\u5ddd", "name_ko": "\uc544\ub9c8\uc874 \uac15", "name_pt": "Amazonas", "name_ru": "\u0410\u043c\u0430\u0437\u043e\u043d\u0430\u0441", "name_zh": "\u4e9a\u9a6c\u5b59\u5dde"}, "id": 539684663, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2459, 1327]}, "properties": {"abbr": "Que.", "area": 1511614.4, "name": "Qu\u00e9bec", "name_ar": "\u0643\u064a\u0628\u0643", "name_de": "Qu\u00e9bec", "name_en": "Qu\u00e9bec", "name_es": "Qu\u00e9bec", "name_fr": "Qu\u00e9bec", "name_ja": "\u30b1\u30d9\u30c3\u30af\u5dde", "name_ko": "\ud018\ubca1 \uc8fc", "name_pt": "Quebec", "name_ru": "\u041a\u0432\u0435\u0431\u0435\u043a", "name_zh": "\u9b41\u5317\u514b\u7701"}, "id": 305700701, "type": 1}, {"geometry": {"type": "Point", "coordinates": [610, 1945]}, "properties": {"abbr": "Alaska", "area": 1505052.0, "name": "Alaska", "name_ar": "\u0623\u0644\u0627\u0633\u0643\u0627", "name_de": "Alaska", "name_en": "Alaska", "name_es": "Alaska", "name_fr": "Alaska", "name_ja": "\u30a2\u30e9\u30b9\u30ab\u5dde", "name_ko": "\uc54c\ub798\uc2a4\uce74\uc8fc", "name_pt": "Alasca", "name_ru": "\u0410\u043b\u044f\u0441\u043a\u0430", "name_zh": "\u963f\u62c9\u65af\u52a0\u5dde"}, "id": 474582475, "type": 1}, {"geometry": {"type": "Point", "coordinates": [610, 1945]}, "properties": {"abbr": "Alaska", "area": 1505052.0, "name": "Alaska", "name_ar": "\u0623\u0644\u0627\u0633\u0643\u0627", "name_de": "Alaska", "name_en": "Alaska", "name_es": "Alaska", "name_fr": "Alaska", "name_ja": "\u30a2\u30e9\u30b9\u30ab\u5dde", "name_ko": "\uc54c\ub798\uc2a4\uce74\uc8fc", "name_pt": "Alasca", "name_ru": "\u0410\u043b\u044f\u0441\u043a\u0430", "name_zh": "\u963f\u62c9\u65af\u52a0\u5dde"}, "id": 316938511, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7131, -451]}, "properties": {"abbr": "N.T.", "area": 1348630.2, "name": "Northern Territory", "name_ar": "\u0625\u0642\u0644\u064a\u0645 \u0634\u0645\u0627\u0644\u064a", "name_de": "Nordterritorium", "name_en": "Northern Territory", "name_es": "Territorio del Norte", "name_fr": "Territoire du Nord", "name_ja": "\u30ce\u30fc\u30b6\u30f3\u30c6\u30ea\u30c8\u30ea\u30fc", "name_ko": "\ub178\ub358 \uc900\uc8fc", "name_pt": "Territ\u00f3rio do Norte", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0422\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f", "name_zh": "\u5317\u90e8\u5730\u533a"}, "id": 304951006, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1399, 1896]}, "properties": {"abbr": "N.W.T.", "area": 1348299.7, "name": "Northwest Territories", "name_ar": "\u0627\u0644\u0623\u0642\u0627\u0644\u064a\u0645 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629 \u0627\u0644\u063a\u0631\u0628\u064a\u0629", "name_de": "Nordwest-Territorien", "name_en": "Northwest Territories", "name_es": "Territorios del Noroeste", "name_fr": "Territoires du Nord-Ouest", "name_ja": "\u30ce\u30fc\u30b9\u30a6\u30a8\u30b9\u30c8\u6e96\u5dde", "name_ko": "\ub178\uc2a4\uc6e8\uc2a4\ud2b8 \uc900\uc8fc", "name_pt": "Territ\u00f3rios do Noroeste", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043e-\u0417\u0430\u043f\u0430\u0434\u043d\u044b\u0435 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438", "name_zh": "\u897f\u5317\u5730\u533a"}, "id": 305700696, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2887, -92]}, "properties": {"area": 1229349.4, "name": "Par\u00e1", "name_ar": "\u0628\u0627\u0631\u0627", "name_de": "Par\u00e1", "name_en": "Par\u00e1", "name_es": "Par\u00e1", "name_fr": "Par\u00e1", "name_ja": "\u30d1\u30e9\u30fc\u5dde", "name_ko": "\ud30c\ub77c \uc8fc", "name_pt": "Par\u00e1", "name_ru": "\u041f\u0430\u0440\u0430", "name_zh": "\u5e15\u62c9\u5dde"}, "id": 539676406, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2179, 1298]}, "properties": {"abbr": "Ont.", "area": 1077703.8, "name": "Ontario", "name_ar": "\u0623\u0648\u0646\u062a\u0627\u0631\u064a\u0648", "name_de": "Ontario", "name_en": "Ontario", "name_es": "Ontario", "name_fr": "Ontario", "name_ja": "\u30aa\u30f3\u30bf\u30ea\u30aa\u5dde", "name_ko": "\uc628\ud0c0\ub9ac\uc624 \uc8fc", "name_pt": "Ont\u00e1rio", "name_ru": "\u041e\u043d\u0442\u0430\u0440\u0438\u043e", "name_zh": "\u5b89\u5927\u7565\u7701"}, "id": 305700702, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7187, -719]}, "properties": {"abbr": "S.A.", "area": 983805.3, "name": "South Australia", "name_ar": "\u062c\u0646\u0648\u0628 \u0623\u0633\u062a\u0631\u0627\u0644\u064a\u0627", "name_de": "S\u00fcdaustralien", "name_en": "South Australia", "name_es": "Australia Meridional", "name_fr": "Australie m\u00e9ridionale", "name_ja": "\u5357\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2\u5dde", "name_ko": "\uc0ac\uc6b0\uc2a4\uc624\uc2a4\ud2b8\ub808\uc77c\ub9ac\uc544 \uc8fc", "name_pt": "Austr\u00e1lia Meridional", "name_ru": "\u042e\u0436\u043d\u0430\u044f \u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f", "name_zh": "\u5357\u6fb3\u5927\u5229\u4e9a\u5dde"}, "id": 304951007, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1251, 1512]}, "properties": {"abbr": "B.C.", "area": 944936.1, "name": "British Columbia", "name_ar": "\u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627 \u0627\u0644\u0628\u0631\u064a\u0637\u0627\u0646\u064a\u0629", "name_de": "Britisch-Kolumbien", "name_en": "British Columbia", "name_es": "Columbia Brit\u00e1nica", "name_fr": "Colombie-Britannique", "name_ja": "\u30d6\u30ea\u30c6\u30a3\u30c3\u30b7\u30e5\u30b3\u30ed\u30f3\u30d3\u30a2\u5dde", "name_ko": "\ube0c\ub9ac\ud2f0\uc2dc\uceec\ub7fc\ube44\uc544 \uc8fc", "name_pt": "Col\u00fambia Brit\u00e2nica", "name_ru": "\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430\u044f \u041a\u043e\u043b\u0443\u043c\u0431\u0438\u044f", "name_zh": "\u4e0d\u5217\u98a0\u54e5\u4f26\u6bd4\u4e9a\u7701"}, "id": 305700699, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2822, -314]}, "properties": {"area": 903220.3, "name": "Mato Grosso", "name_ar": "\u0645\u0627\u062a\u0648 \u063a\u0631\u0648\u0633\u0648", "name_de": "Mato Grosso", "name_en": "Mato Grosso", "name_es": "Mato Grosso", "name_fr": "Mato Grosso", "name_ja": "\u30de\u30c3\u30c8\u30b0\u30ed\u30c3\u30bd\u5dde", "name_ko": "\ub9c8\ud22c\uadf8\ub85c\uc218 \uc8fc", "name_pt": "Mato Grosso", "name_ru": "\u041c\u0430\u0442\u0443-\u0413\u0440\u043e\u0441\u0443", "name_zh": "\u9a6c\u6258\u683c\u7f57\u7d22\u5dde"}, "id": 565543876, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7441, -774]}, "properties": {"abbr": "N.S.W.", "area": 802395.0, "name": "New South Wales", "name_ar": "\u0646\u064a\u0648\u0633\u0627\u0648\u062b \u0648\u064a\u0644\u0632", "name_de": "Neus\u00fcdwales", "name_en": "New South Wales", "name_es": "Nueva Gales del Sur", "name_fr": "Nouvelle Galles du Sud", "name_ja": "\u30cb\u30e5\u30fc\u30b5\u30a6\u30b9\u30a6\u30a7\u30fc\u30eb\u30ba\u5dde", "name_ko": "\ub274\uc0ac\uc6b0\uc2a4\uc6e8\uc77c\uc2a4 \uc8fc", "name_pt": "Nova Gales do Sul", "name_ru": "\u041d\u043e\u0432\u044b\u0439 \u042e\u0436\u043d\u044b\u0439 \u0423\u044d\u043b\u044c\u0441", "name_zh": "\u65b0\u5357\u5a01\u5c14\u58eb\u5dde"}, "id": 304951004, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1847, 764]}, "properties": {"abbr": "Tex.", "area": 685284.7, "name": "Texas", "name_ar": "\u062a\u0643\u0633\u0627\u0633", "name_de": "Texas", "name_en": "Texas", "name_es": "Texas", "name_fr": "Texas", "name_ja": "\u30c6\u30ad\u30b5\u30b9\u5dde", "name_ko": "\ud14d\uc0ac\uc2a4 \uc8fc", "name_pt": "Texas", "name_ru": "\u0422\u0435\u0445\u0430\u0441", "name_zh": "\u5f97\u514b\u8428\u65af\u5dde"}, "id": 316998356, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1485, 1491]}, "properties": {"abbr": "Alta.", "area": 663726.9, "name": "Alberta", "name_ar": "\u0623\u0644\u0628\u0631\u062a\u0627", "name_de": "Alberta", "name_en": "Alberta", "name_es": "Alberta", "name_fr": "Province d\u2019 Alberta", "name_ja": "\u30a2\u30eb\u30d0\u30fc\u30bf\u5dde", "name_ko": "\uc568\ubc84\ud0c0 \uc8fc", "name_pt": "Alberta", "name_ru": "\u0410\u043b\u044c\u0431\u0435\u0440\u0442\u0430", "name_zh": "\u827e\u4f2f\u5854\u7701"}, "id": 305700703, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1855, 1445]}, "properties": {"abbr": "Man.", "area": 652596.7, "name": "Manitoba", "name_ar": "\u0645\u0627\u0646\u064a\u062a\u0648\u0628\u0627", "name_de": "Manitoba", "name_en": "Manitoba", "name_es": "Manitoba", "name_fr": "Manitoba", "name_ja": "\u30de\u30cb\u30c8\u30d0\u5dde", "name_ko": "\ub9e4\ub2c8\ud1a0\ubc14 \uc8fc", "name_pt": "Manitoba", "name_ru": "\u041c\u0430\u043d\u0438\u0442\u043e\u0431\u0430", "name_zh": "\u66fc\u5c3c\u6258\u5df4\u7701"}, "id": 305700705, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1681, 1462]}, "properties": {"abbr": "Sask.", "area": 650843.7, "name": "Saskatchewan", "name_ar": "\u0633\u0627\u0633\u0643\u0627\u062a\u0634\u0648\u0627\u0646", "name_de": "Saskatchewan", "name_en": "Saskatchewan", "name_es": "Saskatchewan", "name_fr": "Saskatchewan", "name_ja": "\u30b5\u30b9\u30ab\u30c1\u30e5\u30ef\u30f3\u5dde", "name_ko": "\uc11c\uc2a4\uce90\ucc98\uc6d0 \uc8fc", "name_pt": "Saskatchewan", "name_ru": "\u0421\u0430\u0441\u043a\u0430\u0447\u0435\u0432\u0430\u043d", "name_zh": "\u8428\u65af\u5580\u5f7b\u6e29\u7701"}, "id": 305700698, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3088, -423]}, "properties": {"area": 586372.6, "name": "Minas Gerais", "name_ar": "\u0645\u064a\u0646\u0627\u0633 \u062c\u064a\u0631\u0627\u064a\u0633", "name_de": "Minas Gerais", "name_en": "Minas Gerais", "name_es": "Minas Gerais", "name_fr": "Minas Gerais", "name_ja": "\u30df\u30ca\u30b9\u30b8\u30a7\u30e9\u30a4\u30b9\u5dde", "name_ko": "\ubbf8\ub098\uc2a4\uc81c\ub77c\uc774\uc2a4 \uc8fc", "name_pt": "Minas Gerais", "name_ru": "\u041c\u0438\u043d\u0430\u0441-\u0416\u0435\u0440\u0430\u0439\u0441", "name_zh": "\u7c73\u7eb3\u65af\u5409\u62c9\u65af\u5dde"}, "id": 502334045, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3138, -269]}, "properties": {"area": 559906.3, "name": "Bahia", "name_ar": "\u0628\u0627\u0647\u064a\u0627", "name_de": "Bahia", "name_en": "Bahia", "name_es": "Bahia", "name_fr": "Bahia", "name_ja": "\u30d0\u30a4\u30fc\u30a2\u5dde", "name_ko": "\ubc14\uc774\uc544 \uc8fc", "name_pt": "Bahia", "name_ru": "\u0411\u0430\u0438\u044f", "name_zh": "\u5df4\u4f0a\u4e9a\u5dde"}, "id": 539691270, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1044, 1842]}, "properties": {"abbr": "Yuk.", "area": 484317.7, "name": "Yukon", "name_ar": "\u064a\u0648\u0643\u0648\u0646", "name_de": "Yukon", "name_en": "Yukon", "name_es": "Yukon", "name_fr": "Yukon", "name_ja": "\u30e6\u30fc\u30b3\u30f3\u6e96\u5dde", "name_ko": "\uc720\ucf58 \uc900\uc8fc", "name_pt": "Yukon", "name_ru": "\u042e\u043a\u043e\u043d", "name_zh": "\u80b2\u7a7a\u5730\u533a"}, "id": 305700707, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1372, 910]}, "properties": {"abbr": "Calif.", "area": 409437.5, "name": "California", "name_ar": "\u0643\u0627\u0644\u064a\u0641\u0648\u0631\u0646\u064a\u0627", "name_de": "Kalifornien", "name_en": "California", "name_es": "California", "name_fr": "Californie", "name_ja": "\u30ab\u30ea\u30d5\u30a9\u30eb\u30cb\u30a2\u5dde", "name_ko": "\uce98\ub9ac\ud3ec\ub2c8\uc544\uc8fc", "name_pt": "Calif\u00f3rnia", "name_ru": "\u041a\u0430\u043b\u0438\u0444\u043e\u0440\u043d\u0438\u044f", "name_zh": "\u52a0\u5229\u798f\u5c3c\u4e9a\u5dde"}, "id": 671022, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2730, 1418]}, "properties": {"abbr": "N.L.", "area": 396313.3, "name": "Newfoundland and Labrador", "name_ar": "\u0646\u064a\u0648\u0641\u0627\u0648\u0646\u062f\u0644\u0627\u0646\u062f \u0648\u0627\u0644\u0644\u0627\u0628\u0631\u0627\u062f\u0648\u0631", "name_de": "Neufundland und Labrador", "name_en": "Newfoundland and Labrador", "name_es": "Terranova y Labrador", "name_fr": "Terre-Neuve-et-Labrador", "name_ja": "\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u30fb\u30e9\u30d6\u30e9\u30c9\u30fc\u30eb\u5dde", "name_ko": "\ub274\ud380\ub4e4\ub79c\ub4dc \ub798\ube0c\ub77c\ub3c4 \uc8fc", "name_pt": "Terra Nova e Labrador", "name_ru": "\u041d\u044c\u044e\u0444\u0430\u0443\u043d\u0434\u043b\u0435\u043d\u0434 \u0438 \u041b\u0430\u0431\u0440\u0430\u0434\u043e\u0440", "name_zh": "\u7d10\u82ac\u862d-\u62c9\u5e03\u62c9\u591a\u7701"}, "id": 305700706, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1612, 1217]}, "properties": {"abbr": "Mont.", "area": 380424.6, "name": "Montana", "name_ar": "\u0645\u0648\u0646\u062a\u0627\u0646\u0627", "name_de": "Montana", "name_en": "Montana", "name_es": "Montana", "name_fr": "Montana", "name_ja": "\u30e2\u30f3\u30bf\u30ca\u5dde", "name_ko": "\ubaac\ud0dc\ub098\uc8fc", "name_pt": "Montana", "name_ru": "\u041c\u043e\u043d\u0442\u0430\u043d\u0430", "name_zh": "\u8499\u5927\u62ff\u5dde"}, "id": 316970920, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2844, -455]}, "properties": {"area": 356081.4, "name": "Mato Grosso do Sul", "name_ar": "\u0645\u0627\u062a\u0648 \u063a\u0631\u0648\u0633\u0648 \u062f\u0648 \u0633\u0648\u0644", "name_de": "Mato Grosso do Sul", "name_en": "Mato Grosso do Sul", "name_es": "Mato Grosso del Sur", "name_fr": "Mato Grosso do Sul", "name_ja": "\u30de\u30c3\u30c8\u30b0\u30ed\u30c3\u30bd\u30fb\u30c9\u30fb\u30b9\u30eb\u5dde", "name_ko": "\ub9c8\ud22c\uadf8\ub85c\uc218\ub450\uc220 \uc8fc", "name_pt": "Mato Grosso do Sul", "name_ru": "\u041c\u0430\u0442\u0443-\u0413\u0440\u043e\u0441\u0443-\u0434\u0443-\u0421\u0443\u043b", "name_zh": "\u5357\u9a6c\u6258\u683c\u7f57\u7d22\u5dde"}, "id": 539693378, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2967, -370]}, "properties": {"area": 341246.6, "name": "Goi\u00e1s", "name_ar": "\u063a\u0648\u064a\u0627\u0633", "name_de": "Goi\u00e1s", "name_en": "Goi\u00e1s", "name_es": "Goi\u00e1s", "name_fr": "Goi\u00e1s", "name_ja": "\u30b4\u30a4\u30a2\u30b9\u5dde", "name_ko": "\uace0\uc774\uc544\uc2a4 \uc8fc", "name_pt": "Goi\u00e1s", "name_ru": "\u0413\u043e\u044f\u0441", "name_zh": "\u6208\u4e9a\u65af\u5dde"}, "id": 415522239, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3065, -116]}, "properties": {"area": 325614.3, "name": "Maranh\u00e3o", "name_ar": "\u0645\u0627\u0631\u0627\u0646\u0647\u0627\u0648", "name_de": "Maranh\u00e3o", "name_en": "Maranh\u00e3o", "name_es": "Maranh\u00e3o", "name_fr": "Maranh\u00e3o", "name_ja": "\u30de\u30e9\u30cb\u30e7\u30f3\u5dde", "name_ko": "\ub9c8\ub77c\ub0e5 \uc8fc", "name_pt": "Maranh\u00e3o", "name_ru": "\u041c\u0430\u0440\u0430\u043d\u044c\u044f\u043d", "name_zh": "\u9a6c\u62c9\u5c3c\u6602\u5dde"}, "id": 541426952, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1684, 832]}, "properties": {"abbr": "N.M.", "area": 315064.8, "name": "New Mexico", "name_ar": "\u0646\u064a\u0648\u0645\u0643\u0633\u064a\u0643\u0648", "name_de": "Neumexiko", "name_en": "New Mexico", "name_es": "Nuevo M\u00e9xico", "name_fr": "Nouveau Mexique", "name_ja": "\u30cb\u30e5\u30fc\u30e1\u30ad\u30b7\u30b3\u5dde", "name_ko": "\ub274\uba55\uc2dc\ucf54\uc8fc", "name_pt": "Novo M\u00e9xico", "name_ru": "\u041d\u044c\u044e-\u041c\u0435\u043a\u0441\u0438\u043a\u043e", "name_zh": "\u65b0\u58a8\u897f\u54e5\u5dde"}, "id": 316973967, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1561, 830]}, "properties": {"abbr": "Ariz.", "area": 295063.1, "name": "Arizona", "name_ar": "\u0623\u0631\u064a\u0632\u0648\u0646\u0627", "name_de": "Arizona", "name_en": "Arizona", "name_es": "Arizona", "name_fr": "Arizona", "name_ja": "\u30a2\u30ea\u30be\u30ca\u5dde", "name_ko": "\uc560\ub9ac\uc870\ub098\uc8fc", "name_pt": "Arizona", "name_ru": "\u0410\u0440\u0438\u0437\u043e\u043d\u0430", "name_zh": "\u4e9a\u5229\u6851\u90a3\u5dde"}, "id": 316940520, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1443, 997]}, "properties": {"abbr": "Nev.", "area": 287088.9, "name": "Nevada", "name_ar": "\u0646\u064a\u0641\u0627\u062f\u0627", "name_de": "Nevada", "name_en": "Nevada", "name_es": "Nevada", "name_fr": "Nevada", "name_ja": "\u30cd\u30d0\u30c0\u5dde", "name_ko": "\ub124\ubc14\ub2e4\uc8fc", "name_pt": "Nevada", "name_ru": "\u041d\u0435\u0432\u0430\u0434\u0430", "name_zh": "\u5185\u534e\u8fbe\u5dde"}, "id": 316971669, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2996, -232]}, "properties": {"area": 278972.9, "name": "Tocantins", "name_ar": "\u062a\u0648\u0643\u0627\u0646\u062a\u064a\u0646\u0633", "name_de": "Tocantins", "name_en": "Tocantins", "name_es": "Tocantins", "name_fr": "Tocantins", "name_ja": "\u30c8\u30ab\u30f3\u30c6\u30a3\u30f3\u30b9\u5dde", "name_ko": "\ud1a0\uce78\uce6d\uc2a4 \uc8fc", "name_pt": "Tocantins", "name_ru": "\u0422\u043e\u043a\u0430\u043d\u0442\u0438\u043d\u0441", "name_zh": "\u6258\u574e\u5ef7\u65af\u5dde"}, "id": 565545457, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2873, -690]}, "properties": {"area": 272324.7, "name": "Rio Grande do Sul", "name_ar": "\u0631\u064a\u0648 \u063a\u0631\u0627\u0646\u062f\u064a \u062f\u0648 \u0633\u0648\u0644", "name_de": "Rio Grande do Sul", "name_en": "Rio Grande do Sul", "name_es": "Rio Grande do Sul", "name_fr": "Rio Grande do Sul", "name_ja": "\u30ea\u30aa\u30b0\u30e9\u30f3\u30c7\u30fb\u30c9\u30fb\u30b9\u30eb\u5dde", "name_ko": "\ud788\uc6b0\uadf8\ub780\uc9c0\ub450\uc220 \uc8fc", "name_pt": "Rio Grande do Sul", "name_ru": "\u0420\u0438\u0443-\u0413\u0440\u0430\u043d\u0434\u0438-\u0434\u0443-\u0421\u0443\u043b", "name_zh": "\u5357\u91cc\u5965\u683c\u5170\u5fb7\u5dde"}, "id": 504800252, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1693, 971]}, "properties": {"abbr": "Colo.", "area": 270233.0, "name": "Colorado", "name_ar": "\u0643\u0648\u0644\u0648\u0631\u0627\u062f\u0648", "name_de": "Colorado", "name_en": "Colorado", "name_es": "Colorado", "name_fr": "Colorado", "name_ja": "\u30b3\u30ed\u30e9\u30c9\u5dde", "name_ko": "\ucf5c\ub85c\ub77c\ub3c4 \uc8fc", "name_pt": "Colorado", "name_ru": "\u041a\u043e\u043b\u043e\u0440\u0430\u0434\u043e", "name_zh": "\u79d1\u7f57\u62c9\u591a\u5dde"}, "id": 316945104, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1649, 1103]}, "properties": {"abbr": "Wyo.", "area": 254387.8, "name": "Wyoming", "name_ar": "\u0648\u0627\u064a\u0648\u0645\u0646\u063a", "name_de": "Wyoming", "name_en": "Wyoming", "name_es": "Wyoming", "name_fr": "Wyoming", "name_ja": "\u30ef\u30a4\u30aa\u30df\u30f3\u30b0\u5dde", "name_ko": "\uc640\uc774\uc624\ubc0d\uc8fc", "name_pt": "Wyoming", "name_ru": "\u0412\u0430\u0439\u043e\u043c\u0438\u043d\u0433", "name_zh": "\u6000\u4fc4\u660e\u5dde"}, "id": 317007393, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3118, -169]}, "properties": {"area": 252017.5, "name": "Piau\u00ed", "name_ar": "\u0628\u064a\u0627\u0648\u064a", "name_de": "Piau\u00ed", "name_en": "Piau\u00ed", "name_es": "Piau\u00ed", "name_fr": "Piau\u00ed", "name_ja": "\u30d4\u30a2\u30a6\u30a4\u5dde", "name_ko": "\ud53c\uc544\uc6b0\uc774 \uc8fc", "name_pt": "Piau\u00ed", "name_ru": "\u041f\u0438\u0430\u0443\u0438", "name_zh": "\u76ae\u5967\u4f0a\u5dde"}, "id": 541425925, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1359, 1118]}, "properties": {"abbr": "Ore.", "area": 251792.6, "name": "Oregon", "name_ar": "\u0623\u0648\u0631\u064a\u063a\u0648\u0646", "name_de": "Oregon", "name_en": "Oregon", "name_es": "Oreg\u00f3n", "name_fr": "Oregon", "name_ja": "\u30aa\u30ec\u30b4\u30f3\u5dde", "name_ko": "\uc624\ub9ac\uac74 \uc8fc", "name_pt": "Oregon", "name_ru": "\u041e\u0440\u0435\u0433\u043e\u043d", "name_zh": "\u4fc4\u52d2\u5188\u5dde"}, "id": 316984338, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2173, 1147]}, "properties": {"abbr": "Mich.", "area": 250046.7, "name": "Michigan", "name_ar": "\u0645\u064a\u0634\u064a\u063a\u0627\u0646", "name_de": "Michigan", "name_en": "Michigan", "name_es": "Michigan", "name_fr": "Michigan", "name_ja": "\u30df\u30b7\u30ac\u30f3\u5dde", "name_ko": "\ubbf8\uc2dc\uac04 \uc8fc", "name_pt": "Michigan", "name_ru": "\u041c\u0438\u0447\u0438\u0433\u0430\u043d", "name_zh": "\u5bc6\u6b47\u6839\u5dde"}, "id": 316966612, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2979, -516]}, "properties": {"area": 248640.3, "name": "S\u00e3o Paulo", "name_ar": "\u0633\u0627\u0648 \u0628\u0627\u0648\u0644\u0648", "name_de": "S\u00e3o Paulo", "name_en": "S\u00e3o Paulo", "name_es": "S\u00e3o Paulo", "name_fr": "S\u00e3o Paulo", "name_ja": "\u30b5\u30f3\u30d1\u30a6\u30ed", "name_ko": "\uc0c1\ud30c\uc6b8\ub8e8", "name_pt": "S\u00e3o Paulo", "name_ru": "\u0421\u0430\u043d-\u041f\u0430\u0443\u043b\u0443", "name_zh": "\u5723\u4fdd\u7f57\u5dde"}, "id": 504798993, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2653, -230]}, "properties": {"area": 237962.0, "name": "Rond\u00f4nia", "name_ar": "\u0631\u0648\u0646\u062f\u0648\u0646\u064a\u0627", "name_de": "Rond\u00f4nia", "name_en": "Rond\u00f4nia", "name_es": "Rond\u00f4nia", "name_fr": "Rond\u00f4nia", "name_ja": "\u30ed\u30f3\u30c9\u30cb\u30a2\u5dde", "name_ko": "\ud63c\ub3c4\ub2c8\uc544 \uc8fc", "name_pt": "Rond\u00f4nia", "name_ru": "\u0420\u043e\u043d\u0434\u043e\u043d\u0438\u044f", "name_zh": "\u6717\u591a\u5c3c\u4e9a\u5dde"}, "id": 565543192, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7402, -911]}, "properties": {"abbr": "Vic.", "area": 227944.0, "name": "Victoria", "name_ar": "\u0641\u0643\u062a\u0648\u0631\u064a\u0627 \u060c \u0643\u0648\u0644\u0648\u0645\u0628\u064a\u0627 \u0627\u0644\u0628\u0631\u064a\u0637\u0627\u0646\u064a\u0629", "name_de": "Victoria", "name_en": "Victoria", "name_es": "Victoria", "name_fr": "Victoria", "name_ja": "\u30d3\u30af\u30c8\u30ea\u30a2", "name_ko": "\ube45\ud1a0\ub9ac\uc544", "name_pt": "Victoria", "name_ru": "\u0412\u0438\u043a\u0442\u043e\u0440\u0438\u044f", "name_zh": "\u7ef4\u591a\u5229\u4e9a\u5dde"}, "id": 304951009, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1952, 1193]}, "properties": {"abbr": "Minn.", "area": 224797.4, "name": "Minnesota", "name_ar": "\u0645\u064a\u0646\u064a\u0633\u0648\u062a\u0627", "name_de": "Minnesota", "name_en": "Minnesota", "name_es": "Minnesota", "name_fr": "Minnesota", "name_ja": "\u30df\u30cd\u30bd\u30bf\u5dde", "name_ko": "\ubbf8\ub124\uc18c\ud0c0 \uc8fc", "name_pt": "Minnesota", "name_ru": "\u041c\u0438\u043d\u043d\u0435\u0441\u043e\u0442\u0430", "name_zh": "\u660e\u5c3c\u82cf\u8fbe\u5dde"}, "id": 316967611, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2699, 47]}, "properties": {"area": 224751.7, "name": "Roraima", "name_ar": "\u0631\u0648\u0631\u0627\u064a\u0645\u0627", "name_de": "Roraima", "name_en": "Roraima", "name_es": "Roraima", "name_fr": "Roraima", "name_ja": "\u30ed\u30e9\u30a4\u30de\u5dde", "name_ko": "\ud638\ub77c\uc774\ub9c8 \uc8fc", "name_pt": "Roraima", "name_ru": "\u0420\u043e\u0440\u0430\u0439\u043c\u0430", "name_zh": "\u7f57\u8d56\u9a6c\u5dde"}, "id": 539689822, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1556, 973]}, "properties": {"abbr": "Utah", "area": 219762.4, "name": "Utah", "name_ar": "\u064a\u0648\u062a\u0627", "name_de": "Utah", "name_en": "Utah", "name_es": "Utah", "name_fr": "Utah", "name_ja": "\u30e6\u30bf\u5dde", "name_ko": "\uc720\ud0c0 \uc8fc", "name_pt": "Utah", "name_ru": "\u042e\u0442\u0430", "name_zh": "\u72b9\u4ed6\u5dde"}, "id": 316999551, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1487, 1130]}, "properties": {"abbr": "Idaho", "area": 216075.5, "name": "Idaho", "name_ar": "\u0623\u064a\u062f\u0627\u0647\u0648", "name_de": "Idaho", "name_en": "Idaho", "name_es": "Idaho", "name_fr": "Idaho", "name_ja": "\u30a2\u30a4\u30c0\u30db\u5dde", "name_ko": "\uc544\uc774\ub2e4\ud638\uc8fc", "name_pt": "Idaho", "name_ru": "\u0410\u0439\u0434\u0430\u0445\u043e", "name_zh": "\u7231\u8fbe\u8377\u5dde"}, "id": 316950582, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1849, 952]}, "properties": {"abbr": "Kans.", "area": 212045.4, "name": "Kansas", "name_ar": "\u0643\u0627\u0646\u0633\u0627\u0633", "name_de": "Kansas", "name_en": "Kansas", "name_es": "Kansas", "name_fr": "Kansas", "name_ja": "\u30ab\u30f3\u30b6\u30b9\u5dde", "name_ko": "\uce94\uc790\uc2a4 \uc8fc", "name_pt": "Kansas", "name_ru": "\u041a\u0430\u043d\u0437\u0430\u0441", "name_zh": "\u582a\u8428\u65af\u5dde"}, "id": 316956038, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1821, 1051]}, "properties": {"abbr": "Nebr.", "area": 200208.4, "name": "Nebraska", "name_ar": "\u0646\u0628\u0631\u0627\u0633\u0643\u0627", "name_de": "Nebraska", "name_en": "Nebraska", "name_es": "Nebraska", "name_fr": "Nebraska", "name_ja": "\u30cd\u30d6\u30e9\u30b9\u30ab\u5dde", "name_ko": "\ub124\ube0c\ub798\uc2a4\uce74 \uc8fc", "name_pt": "Nebraska", "name_ru": "\u041d\u0435\u0431\u0440\u0430\u0441\u043a\u0430", "name_zh": "\u5185\u5e03\u62c9\u65af\u52a0\u5dde"}, "id": 316971452, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1817, 1145]}, "properties": {"abbr": "S.D.", "area": 198632.5, "name": "South Dakota", "name_ar": "\u062f\u0627\u0643\u0648\u062a\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629", "name_de": "S\u00fcddakota", "name_en": "South Dakota", "name_es": "Dakota del Sur", "name_fr": "Dakota du Sud", "name_ja": "\u30b5\u30a6\u30b9\u30c0\u30b3\u30bf\u5dde", "name_ko": "\uc0ac\uc6b0\uc2a4\ub2e4\ucf54\ud0c0\uc8fc", "name_pt": "Dakota do Sul", "name_ru": "\u042e\u0436\u043d\u0430\u044f \u0414\u0430\u043a\u043e\u0442\u0430", "name_zh": "\u5357\u8fbe\u79d1\u4ed6\u5dde"}, "id": 316990807, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2921, -574]}, "properties": {"area": 198592.3, "name": "Paran\u00e1", "name_ar": "\u0628\u0627\u0631\u0627\u0646\u0627", "name_de": "Paran\u00e1", "name_en": "Paran\u00e1", "name_es": "Paran\u00e1", "name_fr": "Paran\u00e1", "name_ja": "\u30d1\u30e9\u30ca\u5dde", "name_ko": "\ud30c\ub77c\ub098 \uc8fc", "name_pt": "Paran\u00e1", "name_ru": "\u041f\u0430\u0440\u0430\u043d\u0430", "name_zh": "\u5df4\u62c9\u90a3\u5dde"}, "id": 539672077, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1810, 1230]}, "properties": {"abbr": "N.D.", "area": 182147.6, "name": "North Dakota", "name_ar": "\u062f\u0627\u0643\u0648\u062a\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629", "name_de": "Norddakota", "name_en": "North Dakota", "name_es": "Dakota del Norte", "name_fr": "Dakota du Nord", "name_ja": "\u30ce\u30fc\u30b9\u30c0\u30b3\u30bf\u5dde", "name_ko": "\ub178\uc2a4\ub2e4\ucf54\ud0c0\uc8fc", "name_pt": "Dakota do Norte", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0414\u0430\u043a\u043e\u0442\u0430", "name_zh": "\u5317\u8fbe\u79d1\u4ed6\u5dde"}, "id": 316979718, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1989, 942]}, "properties": {"abbr": "Mo.", "area": 181398.7, "name": "Missouri", "name_ar": "\u0645\u064a\u0632\u0648\u0631\u064a", "name_de": "Missouri", "name_en": "Missouri", "name_es": "Misuri", "name_fr": "Missouri", "name_ja": "\u30df\u30ba\u30fc\u30ea\u5dde", "name_ko": "\ubbf8\uc8fc\ub9ac \uc8fc", "name_pt": "Missouri", "name_ru": "\u041c\u0438\u0441\u0441\u0443\u0440\u0438", "name_zh": "\u5bc6\u8607\u91cc\u5dde"}, "id": 473849775, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1876, 876]}, "properties": {"abbr": "Okla.", "area": 180637.2, "name": "Oklahoma", "name_ar": "\u0623\u0648\u0643\u0644\u0627\u0647\u0648\u0645\u0627", "name_de": "Oklahoma", "name_en": "Oklahoma", "name_es": "Oklahoma", "name_fr": "Oklahoma", "name_ja": "\u30aa\u30af\u30e9\u30db\u30de\u5dde", "name_ko": "\uc624\ud074\ub77c\ud638\ub9c8\uc8fc", "name_pt": "Oklahoma", "name_ru": "\u041e\u043a\u043b\u0430\u0445\u043e\u043c\u0430", "name_zh": "\u4fc4\u514b\u62c9\u4f55\u9a6c\u5dde"}, "id": 316983705, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1363, 1249]}, "properties": {"abbr": "Wash.", "area": 174113.2, "name": "Washington", "name_ar": "\u0648\u0627\u0634\u0646\u0637\u0646 \u0627\u0644\u0639\u0627\u0635\u0645\u0629", "name_de": "Washington", "name_en": "Washington", "name_es": "Washington", "name_fr": "Washington", "name_ja": "\u30ef\u30b7\u30f3\u30c8\u30f3D.C.", "name_ko": "\uc6cc\uc2f1\ud134 D.C.", "name_pt": "Washington", "name_ru": "\u0412\u0430\u0448\u0438\u043d\u0433\u0442\u043e\u043d", "name_zh": "\u534e\u76db\u987f\u5dde"}, "id": 34724864, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2053, 1140]}, "properties": {"abbr": "Wis.", "area": 169349.3, "name": "Wisconsin", "name_ar": "\u0648\u064a\u0633\u0643\u0648\u0646\u0633\u0646", "name_de": "Wisconsin", "name_en": "Wisconsin", "name_es": "Wisconsin", "name_fr": "Wisconsin", "name_ja": "\u30a6\u30a3\u30b9\u30b3\u30f3\u30b7\u30f3\u5dde", "name_ko": "\uc704\uc2a4\ucf58\uc2e0 \uc8fc", "name_pt": "Wisconsin", "name_ru": "\u0412\u0438\u0441\u043a\u043e\u043d\u0441\u0438\u043d", "name_zh": "\u5a01\u65af\u5eb7\u661f\u5dde"}, "id": 317007239, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2489, -203]}, "properties": {"area": 154032.6, "name": "Acre", "name_ar": "\u0623\u0643\u0631\u064a", "name_de": "Acre", "name_en": "Acre", "name_es": "Acre", "name_fr": "Acre", "name_ja": "\u30a2\u30af\u30ec\u5dde", "name_ko": "\uc544\ud06c\ub9ac \uc8fc", "name_pt": "Acre", "name_ru": "\u0410\u043a\u0440\u0438", "name_zh": "\u963f\u514b\u91cc\u5dde"}, "id": 539687471, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2201, 778]}, "properties": {"abbr": "Ga.", "area": 152651.9, "name": "Georgia", "name_ar": "\u062c\u0648\u0631\u062c\u064a\u0627", "name_de": "Georgia", "name_en": "Georgia", "name_es": "Georgia", "name_fr": "G\u00e9orgie", "name_ja": "\u30b8\u30e7\u30fc\u30b8\u30a2", "name_ko": "\uc870\uc9c0\uc544", "name_pt": "Ge\u00f3rgia", "name_ru": "\u0414\u0436\u043e\u0440\u0434\u0436\u0438\u044f", "name_zh": "\u4f50\u6cbb\u4e9a\u5dde"}, "id": 316949496, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3195, -110]}, "properties": {"area": 150233.4, "name": "Cear\u00e1", "name_ar": "\u0633\u064a\u0627\u0631\u0627", "name_de": "Cear\u00e1", "name_en": "Cear\u00e1", "name_es": "Cear\u00e1", "name_fr": "Cear\u00e1", "name_ja": "\u30bb\u30a2\u30e9\u30fc\u5dde", "name_ko": "\uc138\uc544\ub77c \uc8fc", "name_pt": "Cear\u00e1", "name_ru": "\u0421\u0435\u0430\u0440\u0430", "name_zh": "\u585e\u963f\u814a\u5dde"}, "id": 539832191, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2064, 999]}, "properties": {"abbr": "Ill.", "area": 150070.0, "name": "Illinois", "name_ar": "\u0625\u0644\u064a\u0646\u0648\u064a", "name_de": "Illinois", "name_en": "Illinois", "name_es": "Illinois", "name_fr": "Illinois", "name_ja": "\u30a4\u30ea\u30ce\u30a4\u5dde", "name_ko": "\uc77c\ub9ac\ub178\uc774 \uc8fc", "name_pt": "Illinois", "name_ru": "\u0418\u043b\u043b\u0438\u043d\u043e\u0439\u0441", "name_zh": "\u4f0a\u5229\u8afe\u4f0a\u5dde"}, "id": 553784069, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2229, 689]}, "properties": {"abbr": "Fla.", "area": 146797.9, "name": "Florida", "name_ar": "\u0641\u0644\u0648\u0631\u064a\u062f\u0627", "name_de": "Florida", "name_en": "Florida", "name_es": "Florida", "name_fr": "Florida", "name_ja": "\u30d5\u30ed\u30ea\u30c0\u5dde", "name_ko": "\ud50c\ub85c\ub9ac\ub2e4\uc8fc", "name_pt": "Fl\u00f3rida", "name_ru": "\u0424\u043b\u043e\u0440\u0438\u0434\u0430", "name_zh": "\u4f5b\u7f57\u91cc\u8fbe\u5dde"}, "id": 313943132, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1968, 1058]}, "properties": {"abbr": "Iowa", "area": 144523.3, "name": "Iowa", "name_ar": "\u0622\u064a\u0648\u0627", "name_de": "Iowa", "name_en": "Iowa", "name_es": "Iowa", "name_fr": "Iowa", "name_ja": "\u30a2\u30a4\u30aa\u30ef\u5dde", "name_ko": "\uc544\uc774\uc624\uc640 \uc8fc", "name_pt": "Iowa", "name_ru": "\u0410\u0439\u043e\u0432\u0430", "name_zh": "\u827e\u5965\u74e6\u5dde"}, "id": 316955537, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2913, 33]}, "properties": {"area": 139325.3, "name": "Amap\u00e1", "name_ar": "\u0623\u0645\u0627\u0628\u0627", "name_de": "Amap\u00e1", "name_en": "Amap\u00e1", "name_es": "Amap\u00e1", "name_fr": "Amap\u00e1", "name_ja": "\u30a2\u30de\u30d1\u30fc\u5dde", "name_ko": "\uc544\ub9c8\ud30c \uc8fc", "name_pt": "Amap\u00e1", "name_ru": "\u0410\u043c\u0430\u043f\u0430", "name_zh": "\u963f\u9a6c\u5e15\u5dde"}, "id": 539680936, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1993, 854]}, "properties": {"abbr": "Ark.", "area": 137540.5, "name": "Arkansas", "name_ar": "\u0623\u0631\u0643\u0646\u0633\u0627\u0633", "name_de": "Arkansas", "name_en": "Arkansas", "name_es": "Arkansas", "name_fr": "Arkansas", "name_ja": "\u30a2\u30fc\u30ab\u30f3\u30bd\u30fc\u5dde", "name_ko": "\uc544\uce78\uc18c \uc8fc", "name_pt": "Arkansas", "name_ru": "\u0410\u0440\u043a\u0430\u043d\u0437\u0430\u0441", "name_zh": "\u963f\u80af\u8272\u5dde"}, "id": 316942960, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2379, 1078]}, "properties": {"abbr": "N.Y.", "area": 136819.2, "name": "New York", "name_ar": "\u0646\u064a\u0648\u064a\u0648\u0631\u0643", "name_de": "New York", "name_en": "New York", "name_es": "Nueva York", "name_fr": "New York", "name_ja": "\u30cb\u30e5\u30fc\u30e8\u30fc\u30af\u5dde", "name_ko": "\ub274\uc695 \uc8fc", "name_pt": "Nova Iorque", "name_ru": "\u041d\u044c\u044e-\u0419\u043e\u0440\u043a", "name_zh": "\u7ebd\u7ea6\u5dde"}, "id": 316976734, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2121, 792]}, "properties": {"abbr": "Ala.", "area": 134048.9, "name": "Alabama", "name_ar": "\u0623\u0644\u0627\u0628\u0627\u0645\u0627", "name_de": "Alabama", "name_en": "Alabama", "name_es": "Alabama", "name_fr": "Alabama", "name_ja": "\u30a2\u30e9\u30d0\u30de\u5dde", "name_ko": "\uc568\ub77c\ubc30\ub9c8\uc8fc", "name_pt": "Alabama", "name_ru": "\u0410\u043b\u0430\u0431\u0430\u043c\u0430", "name_zh": "\u963f\u62c9\u5df4\u9a6c\u5dde"}, "id": 316647532, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2289, 867]}, "properties": {"abbr": "N.C.", "area": 128874.2, "name": "North Carolina", "name_ar": "\u0643\u0627\u0631\u0648\u0644\u0627\u064a\u0646\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064a\u0629", "name_de": "North Carolina", "name_en": "North Carolina", "name_es": "Carolina del Norte", "name_fr": "Caroline du Nord", "name_ja": "\u30ce\u30fc\u30b9\u30ab\u30ed\u30e9\u30a4\u30ca\u5dde", "name_ko": "\ub178\uc2a4\uce90\ub864\ub77c\uc774\ub098\uc8fc", "name_pt": "Carolina do Norte", "name_ru": "\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u041a\u0430\u0440\u043e\u043b\u0438\u043d\u0430", "name_zh": "\u5317\u5361\u7f57\u6765\u7eb3\u5dde"}, "id": 316979074, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2054, 792]}, "properties": {"abbr": "Miss.", "area": 123805.7, "name": "Mississippi", "name_ar": "\u0645\u0633\u064a\u0633\u064a\u0628\u064a", "name_de": "Mississippi", "name_en": "Mississippi", "name_es": "Misisipi", "name_fr": "Mississippi", "name_ja": "\u30df\u30b7\u30b7\u30c3\u30d4\u5dde", "name_ko": "\ubbf8\uc2dc\uc2dc\ud53c\uc8fc", "name_pt": "Mississippi", "name_ru": "\u041c\u0438\u0441\u0441\u0438\u0441\u0438\u043f\u0438", "name_zh": "\u5bc6\u897f\u897f\u6bd4\u5dde"}, "id": 316968897, "type": 1}, {"geometry": {"type": "Point", "coordinates": [1996, 741]}, "properties": {"abbr": "La.", "area": 119413.7, "name": "Louisiana", "name_ar": "\u0644\u0648\u064a\u0632\u064a\u0627\u0646\u0627", "name_de": "Louisiana", "name_en": "Louisiana", "name_es": "Luisiana", "name_fr": "Louisiane", "name_ja": "\u30eb\u30a4\u30b8\u30a2\u30ca\u5dde", "name_ko": "\ub8e8\uc774\uc9c0\uc560\ub098 \uc8fc", "name_pt": "Luisiana", "name_ru": "\u041b\u0443\u0438\u0437\u0438\u0430\u043d\u0430", "name_zh": "\u8def\u6613\u65af\u5b89\u90a3\u5dde"}, "id": 316961033, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2314, 1027]}, "properties": {"abbr": "Pa.", "area": 119322.5, "name": "Pennsylvania", "name_ar": "\u0628\u0646\u0633\u064a\u0644\u0641\u0627\u0646\u064a\u0627", "name_de": "Pennsylvanien", "name_en": "Pennsylvania", "name_es": "Pensilvania", "name_fr": "Pennsylvanie", "name_ja": "\u30da\u30f3\u30b7\u30eb\u30d9\u30cb\u30a2\u5dde", "name_ko": "\ud39c\uc2e4\ubca0\uc774\ub2c8\uc544\uc8fc", "name_pt": "Pensilv\u00e2nia", "name_ru": "\u041f\u0435\u043d\u0441\u0438\u043b\u044c\u0432\u0430\u043d\u0438\u044f", "name_zh": "\u5bbe\u5915\u6cd5\u5c3c\u4e9a\u5dde"}, "id": 316987717, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2214, 1007]}, "properties": {"abbr": "Ohio", "area": 116153.9, "name": "Ohio", "name_ar": "\u0623\u0648\u0647\u0627\u064a\u0648", "name_de": "Ohio", "name_en": "Ohio", "name_es": "Ohio", "name_fr": "Ohio", "name_ja": "\u30aa\u30cf\u30a4\u30aa\u5dde", "name_ko": "\uc624\ud558\uc774\uc624 \uc8fc", "name_pt": "Ohio", "name_ru": "\u041e\u0433\u0430\u0439\u043e", "name_zh": "\u4fc4\u4ea5\u4fc4\u5dde"}, "id": 316982774, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2139, 879]}, "properties": {"abbr": "Tenn.", "area": 108908.4, "name": "Tennessee", "name_ar": "\u062a\u064a\u0646\u064a\u0633\u064a", "name_de": "Tennessee", "name_en": "Tennessee", "name_es": "Tennessee", "name_fr": "Tennessee", "name_ja": "\u30c6\u30cd\u30b7\u30fc\u5dde", "name_ko": "\ud14c\ub124\uc2dc \uc8fc", "name_pt": "Tennessee", "name_ru": "\u0422\u0435\u043d\u043d\u0435\u0441\u0441\u0438", "name_zh": "\u7530\u7eb3\u897f\u5dde"}, "id": 316994008, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2155, 923]}, "properties": {"abbr": "Ky.", "area": 104410.6, "name": "Kentucky", "name_ar": "\u0643\u0646\u062a\u0627\u0643\u064a", "name_de": "Kentucky", "name_en": "Kentucky", "name_es": "Kentucky", "name_fr": "Kentucky", "name_ja": "\u30b1\u30f3\u30bf\u30c3\u30ad\u30fc\u5dde", "name_ko": "\ucf04\ud130\ud0a4 \uc8fc", "name_pt": "Kentucky", "name_ru": "\u041a\u0435\u043d\u0442\u0443\u043a\u043a\u0438", "name_zh": "\u80af\u5854\u57fa\u5dde"}, "id": 316959037, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2307, 927]}, "properties": {"abbr": "Va.", "area": 102867.5, "name": "Virginia", "name_ar": "\u0641\u064a\u0631\u062c\u064a\u0646\u064a\u0627", "name_de": "Virginia", "name_en": "Virginia", "name_es": "Virginia", "name_fr": "Virginie", "name_ja": "\u30d0\u30fc\u30b8\u30cb\u30a2\u5dde", "name_ko": "\ubc84\uc9c0\ub2c8\uc544 \uc8fc", "name_pt": "Virg\u00ednia", "name_ru": "\u0412\u0438\u0440\u0433\u0438\u043d\u0438\u044f", "name_zh": "\u5f17\u5409\u5c3c\u4e9a\u5dde"}, "id": 317004702, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3228, -192]}, "properties": {"area": 97586.7, "name": "Pernambuco", "name_ar": "\u0628\u064a\u0631\u0646\u0627\u0645\u0628\u0648\u0643\u0648", "name_de": "Pernambuco", "name_en": "Pernambuco", "name_es": "Pernambuco", "name_fr": "Pernambouc", "name_ja": "\u30da\u30eb\u30ca\u30f3\u30d6\u30fc\u30b3\u5dde", "name_ko": "\ud398\ub974\ub0a8\ubd80\ucfe0 \uc8fc", "name_pt": "Pernambuco", "name_ru": "\u041f\u0435\u0440\u043d\u0430\u043c\u0431\u0443\u043a\u0443", "name_zh": "\u4f2f\u5357\u5e03\u54e5\u5dde"}, "id": 539831949, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2945, -640]}, "properties": {"area": 95106.7, "name": "Santa Catarina", "name_ar": "\u0633\u0627\u0646\u062a\u0627 \u0643\u0627\u062a\u0627\u0631\u064a\u0646\u0627", "name_de": "Santa Catarina", "name_en": "Santa Catarina", "name_es": "Santa Catarina", "name_fr": "Santa Catarina", "name_ja": "\u30b5\u30f3\u30bf\u30ab\u30bf\u30ea\u30fc\u30ca\u5dde", "name_ko": "\uc0b0\ud0c0\uce74\ud0c0\ub9ac\ub098 \uc8fc", "name_pt": "Santa Catarina", "name_ru": "\u0421\u0430\u043d\u0442\u0430-\u041a\u0430\u0442\u0430\u0440\u0438\u043d\u0430", "name_zh": "\u5723\u5361\u5854\u7433\u5a1c\u5dde"}, "id": 539668890, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2133, 992]}, "properties": {"abbr": "Ind.", "area": 94362.6, "name": "Indiana", "name_ar": "\u0625\u0646\u062f\u064a\u0627\u0646\u0627", "name_de": "Indiana", "name_en": "Indiana", "name_es": "Indiana", "name_fr": "Indiana", "name_ja": "\u30a4\u30f3\u30c7\u30a3\u30a2\u30ca\u5dde", "name_ko": "\uc778\ub514\uc560\ub098 \uc8fc", "name_pt": "Indiana", "name_ru": "\u0418\u043d\u0434\u0438\u0430\u043d\u0430", "name_zh": "\u5370\u7b2c\u5b89\u7eb3\u5dde"}, "id": 316954434, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2520, 1162]}, "properties": {"abbr": "Maine", "area": 83585.4, "name": "Maine", "name_ar": "\u0645\u064a\u0646", "name_de": "Maine", "name_en": "Maine", "name_es": "Maine", "name_fr": "Maine", "name_ja": "\u30e1\u30a4\u30f3\u5dde", "name_ko": "\uba54\uc778 \uc8fc", "name_pt": "Maine", "name_ru": "\u041c\u044d\u043d", "name_zh": "\u7f05\u56e0\u5dde"}, "id": 316961875, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2255, 821]}, "properties": {"abbr": "S.C.", "area": 80192.6, "name": "South Carolina", "name_ar": "\u0643\u0627\u0631\u0648\u0644\u0627\u064a\u0646\u0627 \u0627\u0644\u062c\u0646\u0648\u0628\u064a\u0629", "name_de": "South Carolina", "name_en": "South Carolina", "name_es": "Carolina del Sur", "name_fr": "Caroline du Sud", "name_ja": "\u30b5\u30a6\u30b9\u30ab\u30ed\u30e9\u30a4\u30ca\u5dde", "name_ko": "\uc0ac\uc6b0\uc2a4\uce90\ub864\ub77c\uc774\ub098\uc8fc", "name_pt": "Carolina do Sul", "name_ru": "\u042e\u0436\u043d\u0430\u044f \u041a\u0430\u0440\u043e\u043b\u0438\u043d\u0430", "name_zh": "\u5357\u5361\u7f57\u6765\u7eb3\u5dde"}, "id": 316990225, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2586, 1202]}, "properties": {"abbr": "N.B.", "area": 72648.0, "name": "New Brunswick", "name_ar": "\u0646\u064a\u0648 \u0628\u0631\u0648\u0646\u0632\u0648\u064a\u0643", "name_de": "Neubraunschweig", "name_en": "New Brunswick", "name_es": "Nuevo Brunswick", "name_fr": "Nouveau-Brunswick", "name_ja": "\u30cb\u30e5\u30fc\u30d6\u30e9\u30f3\u30ba\u30a6\u30a3\u30c3\u30af\u5dde", "name_ko": "\ub274\ube0c\ub7f0\uc988\uc705 \uc8fc", "name_pt": "Nova Brunswick", "name_ru": "\u041d\u044c\u044e-\u0411\u0440\u0430\u043d\u0441\u0443\u0438\u043a", "name_zh": "\u65b0\u4e0d\u4f26\u745e\u514b\u7701"}, "id": 305700708, "type": 1}, {"geometry": {"type": "Point", "coordinates": [7433, -1056]}, "properties": {"abbr": "Tas.", "area": 68115.3, "name": "Tasmania", "name_ar": "\u062a\u0633\u0645\u0627\u0646\u064a\u0627", "name_de": "Tasmanien", "name_en": "Tasmania", "name_es": "Tasmania", "name_fr": "Tasmanie", "name_ja": "\u30bf\u30b9\u30de\u30cb\u30a2\u5dde", "name_ko": "\ud0dc\uc988\uba54\uc774\ub2c8\uc544 \uc8fc", "name_pt": "Tasm\u00e2nia", "name_ru": "\u0422\u0430\u0441\u043c\u0430\u043d\u0438\u044f", "name_zh": "\u5854\u65af\u9a6c\u5c3c\u4e9a\u5dde"}, "id": 304951008, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2259, 958]}, "properties": {"abbr": "W.Va.", "area": 62735.2, "name": "West Virginia", "name_ar": "\u0641\u064a\u0631\u062c\u064a\u0646\u064a\u0627 \u0627\u0644\u063a\u0631\u0628\u064a\u0629", "name_de": "West Virginia", "name_en": "West Virginia", "name_es": "Virginia Occidental", "name_fr": "Virginie Occidentale", "name_ja": "\u30a6\u30a7\u30b9\u30c8\u30d0\u30fc\u30b8\u30cb\u30a2\u5dde", "name_ko": "\uc6e8\uc2a4\ud2b8\ubc84\uc9c0\ub2c8\uc544\uc8fc", "name_pt": "Virg\u00ednia Ocidental", "name_ru": "\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0412\u0438\u0440\u0433\u0438\u043d\u0438\u044f", "name_zh": "\u897f\u5f17\u5409\u5c3c\u4e9a\u5dde"}, "id": 317006365, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3258, -162]}, "properties": {"area": 56517.8, "name": "Para\u00edba", "name_ar": "\u0628\u0627\u0631\u0627\u064a\u0628\u0627", "name_de": "Para\u00edba", "name_en": "Para\u00edba", "name_es": "Para\u00edba", "name_fr": "Para\u00edba", "name_ja": "\u30d1\u30e9\u30a4\u30d0\u5dde", "name_ko": "\ud30c\ub77c\uc774\ubc14 \uc8fc", "name_pt": "Para\u00edba", "name_ru": "\u041f\u0430\u0440\u0430\u0438\u0431\u0430", "name_zh": "\u5e15\u62c9\u4f0a\u5df4\u5dde"}, "id": 539830692, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2661, 1155]}, "properties": {"abbr": "N.S.", "area": 55090.4, "name": "Nova Scotia", "name_ar": "\u0646\u0648\u0641\u0627 \u0633\u0643\u0648\u0634\u0627", "name_de": "Neuschottland", "name_en": "Nova Scotia", "name_es": "Nueva Escocia", "name_fr": "Nouvelle-\u00c9cosse", "name_ja": "\u30ce\u30d0\u30b9\u30b3\u30b7\u30a2\u5dde", "name_ko": "\ub178\ubc14\uc2a4\ucf54\uc0e4 \uc8fc", "name_pt": "Nova Esc\u00f3cia", "name_ru": "\u041d\u043e\u0432\u0430\u044f \u0428\u043e\u0442\u043b\u0430\u043d\u0434\u0438\u044f", "name_zh": "\u65b0\u65af\u79d1\u820d\u7701"}, "id": 305700704, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3259, -132]}, "properties": {"area": 52816.0, "name": "Rio Grande do Norte", "name_ar": "\u0631\u064a\u0648 \u063a\u0631\u0627\u0646\u062f\u064a \u062f\u0648 \u0646\u0648\u0631\u062a\u064a", "name_de": "Rio Grande do Norte", "name_en": "Rio Grande do Norte", "name_es": "Rio Grande do Norte", "name_fr": "Rio Grande do Norte", "name_ja": "\u30ea\u30aa\u30b0\u30e9\u30f3\u30c7\u30fb\u30c9\u30fb\u30ce\u30eb\u30c6\u5dde", "name_ko": "\ud788\uc6b0\uadf8\ub780\uc9c0\ub450\ub178\ub974\uce58 \uc8fc", "name_pt": "Rio Grande do Norte", "name_ru": "\u0420\u0438\u0443-\u0413\u0440\u0430\u043d\u0434\u0438-\u0434\u0443-\u041d\u043e\u0440\u0442\u0438", "name_zh": "\u5317\u91cc\u7ea6\u683c\u6717\u5fb7\u5dde"}, "id": 539830860, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3178, -445]}, "properties": {"area": 45758.0, "name": "Esp\u00edrito Santo", "name_ar": "\u0625\u0633\u0628\u064a\u0631\u064a\u062a\u0648 \u0633\u0627\u0646\u062a\u0648", "name_de": "Esp\u00edrito Santo", "name_en": "Esp\u00edrito Santo", "name_es": "Esp\u00edrito Santo", "name_fr": "Esp\u00edrito Santo", "name_ja": "\u30a8\u30b9\u30d4\u30ea\u30c8\u30b5\u30f3\u30c8\u5dde", "name_ko": "\uc774\uc2a4\ud53c\ub9ac\ud22c\uc0b0\ud22c \uc8fc", "name_pt": "Esp\u00edrito Santo", "name_ru": "\u042d\u0441\u043f\u0438\u0440\u0438\u0442\u0443-\u0421\u0430\u043d\u0442\u0443", "name_zh": "\u5723\u57c3\u65af\u76ae\u91cc\u56fe\u5dde"}, "id": 504800102, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3136, -514]}, "properties": {"area": 43967.6, "name": "Rio de Janeiro", "name_ar": "\u0631\u064a\u0648 \u062f\u064a \u062c\u0627\u0646\u064a\u0631\u0648", "name_de": "Rio de Janeiro", "name_en": "Rio de Janeiro", "name_es": "Rio de Janeiro", "name_fr": "Rio de Janeiro", "name_ja": "\u30ea\u30aa\u30c7\u30b8\u30e3\u30cd\u30a4\u30ed", "name_ko": "\ub9ac\uc6b0\ub370\uc790\ub124\uc774\ub8e8", "name_pt": "Rio de Janeiro", "name_ru": "\u0420\u0438\u043e-\u0434\u0435-\u0416\u0430\u043d\u0435\u0439\u0440\u043e", "name_zh": "\u91cc\u7ea6\u70ed\u5185\u5362\u5dde"}, "id": 504799970, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3263, -218]}, "properties": {"area": 27621.2, "name": "Alagoas", "name_ar": "\u0623\u0644\u0627\u063a\u0648\u0627\u0633", "name_de": "Alagoas", "name_en": "Alagoas", "name_es": "Alagoas", "name_fr": "Alagoas", "name_ja": "\u30a2\u30e9\u30b4\u30a2\u30b9\u5dde", "name_ko": "\uc54c\ub77c\uace0\uc544\uc2a4 \uc8fc", "name_pt": "Alagoas", "name_ru": "\u0410\u043b\u0430\u0433\u043e\u0430\u0441", "name_zh": "\u963f\u62c9\u6208\u65af\u5dde"}, "id": 541429445, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2347, 979]}, "properties": {"abbr": "Md.", "area": 25260.5, "name": "Maryland", "name_ar": "\u0645\u0627\u0631\u064a\u0644\u0627\u0646\u062f", "name_de": "Maryland", "name_en": "Maryland", "name_es": "Maryland", "name_fr": "Maryland", "name_ja": "\u30e1\u30ea\u30fc\u30e9\u30f3\u30c9\u5dde", "name_ko": "\uba54\ub9b4\ub79c\ub4dc \uc8fc", "name_pt": "Maryland", "name_ru": "\u041c\u044d\u0440\u0438\u043b\u0435\u043d\u0434", "name_zh": "\u9a6c\u91cc\u5170\u5dde"}, "id": 316964668, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2441, 1119]}, "properties": {"abbr": "Vt.", "area": 24621.9, "name": "Vermont", "name_ar": "\u0641\u064a\u0631\u0645\u0648\u0646\u062a", "name_de": "Vermont", "name_en": "Vermont", "name_es": "Vermont", "name_fr": "Vermont", "name_ja": "\u30d0\u30fc\u30e2\u30f3\u30c8\u5dde", "name_ko": "\ubc84\ubaac\ud2b8 \uc8fc", "name_pt": "Vermont", "name_ru": "\u0412\u0435\u0440\u043c\u043e\u043d\u0442", "name_zh": "\u4f5b\u8499\u7279\u5dde"}, "id": 317000170, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2467, 1107]}, "properties": {"abbr": "N.H.", "area": 24269.5, "name": "New Hampshire", "name_ar": "\u0646\u064a\u0648\u0647\u0627\u0645\u0634\u064a\u0631", "name_de": "New Hampshire", "name_en": "New Hampshire", "name_es": "Nuevo Hampshire", "name_fr": "New Hampshire", "name_ja": "\u30cb\u30e5\u30fc\u30cf\u30f3\u30d7\u30b7\u30e3\u30fc\u5dde", "name_ko": "\ub274\ud584\ud504\uc154 \uc8fc", "name_pt": "Nova Hampshire", "name_ru": "\u041d\u044c\u044e-\u0413\u044d\u043c\u043f\u0448\u0438\u0440", "name_zh": "\u65b0\u7f55\u5e03\u4ec0\u5c14\u5dde"}, "id": 316971821, "type": 1}, {"geometry": {"type": "Point", "coordinates": [3247, -240]}, "properties": {"area": 21608.2, "name": "Sergipe", "name_ar": "\u0633\u064a\u0631\u062c\u064a\u0628\u064a", "name_de": "Sergipe", "name_en": "Sergipe", "name_es": "Sergipe", "name_fr": "Sergipe", "name_ja": "\u30bb\u30eb\u30b8\u30da\u5dde", "name_ko": "\uc138\ub974\uc9c0\ud53c \uc8fc", "name_pt": "Sergipe", "name_ru": "\u0421\u0435\u0440\u0436\u0438\u043f\u0438", "name_zh": "\u585e\u5c14\u5e0c\u57f9\u5dde"}, "id": 541429632, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2459, 1065]}, "properties": {"abbr": "Mass.", "area": 21279.5, "name": "Massachusetts", "name_ar": "\u0645\u0627\u0633\u0627\u062a\u0634\u0648\u0633\u062a\u0633", "name_de": "Massachusetts", "name_en": "Massachusetts", "name_es": "Massachusetts", "name_fr": "Massachusetts", "name_ja": "\u30de\u30b5\u30c1\u30e5\u30fc\u30bb\u30c3\u30c4\u5dde", "name_ko": "\ub9e4\uc0ac\ucd94\uc138\uce20 \uc8fc", "name_pt": "Massachusetts", "name_ru": "\u041c\u0430\u0441\u0441\u0430\u0447\u0443\u0441\u0435\u0442\u0441", "name_zh": "\u9a6c\u8428\u8bf8\u585e\u5dde"}, "id": 316965734, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2403, 999]}, "properties": {"abbr": "N.J.", "area": 19717.8, "name": "New Jersey", "name_ar": "\u0646\u064a\u0648 \u062c\u064a\u0631\u0633\u064a", "name_de": "New Jersey", "name_en": "New Jersey", "name_es": "Nueva Jersey", "name_fr": "New Jersey", "name_ja": "\u30cb\u30e5\u30fc\u30b8\u30e3\u30fc\u30b8\u30fc\u5dde", "name_ko": "\ub274\uc800\uc9c0 \uc8fc", "name_pt": "Nova J\u00e9rsia", "name_ru": "\u041d\u044c\u044e-\u0414\u0436\u0435\u0440\u0441\u0438", "name_zh": "\u65b0\u6cfd\u897f\u5dde"}, "id": 316973311, "type": 1}, {"geometry": {"type": "Point", "coordinates": [538, 471]}, "properties": {"abbr": "Hawaii", "area": 16656.7, "name": "Hawaii", "name_ar": "\u0647\u0627\u0648\u0627\u064a", "name_de": "Hawaii", "name_en": "Hawaii", "name_es": "Haw\u00e1i", "name_fr": "Hawa\u00ef", "name_ja": "\u30cf\u30ef\u30a4\u5dde", "name_ko": "\ud558\uc640\uc774\uc8fc", "name_pt": "Hava\u00ed", "name_ru": "\u0413\u0430\u0432\u0430\u0439\u0438", "name_zh": "\u590f\u5a01\u5937\u5dde"}, "id": 316949921, "type": 1}, {"geometry": {"type": "Point", "coordinates": [2441, 1044]}, "properties": {"abbr": "Conn.", "area": 12652.9, "name": "Connecticut", "name_ar": "\u0643\u0648\u0646\u064a\u062a\u064a\u0643\u062a", "name_de": "Connecticut", "name_en": "Connecticut", "name_es": "Connecticut", "name_fr": "Connecticut", "name_ja": "\u30b3\u30cd\u30c1\u30ab\u30c3\u30c8\u5dde", "name_ko": "\ucf54\ub124\ud2f0\ucef7 \uc8fc", "name_pt": "Connecticut", "name_ru": "\u041a\u043e\u043d\u043d\u0435\u043a\u0442\u0438\u043a\u0443\u0442", "name_zh": "\u5eb7\u6d85\u72c4\u683c\u5dde"}, "id": 316945353, "type": 1}]}}python-asciimatics-1.15.0/samples/noise.py000077500000000000000000000011421511423144500205420ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import RandomNoise from asciimatics.renderers import FigletText, Rainbow from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): effects = [ RandomNoise(screen, signal=Rainbow(screen, FigletText("ASCIIMATICS"))) ] screen.play([Scene(effects, -1)], stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/pacman.png000066400000000000000000000542351511423144500210300ustar00rootroot00000000000000PNG  IHDR /I.sRGBgAMA a pHYsttfxX2IDATx^݁Uȶ !t@!!   ,.IUZ޽wmY%[S$I$)r>?>?ߦO~?I$4Z$I$3}M%I*g-I$Ib56[Qtb-IT%I$I4:|cI_"hI,IR_$IROϏ鿑4z/}H'Jr%X$5xL$Ie@ZRE'꫿}(Ei]5F,m:]%̗[%I+щ4x?humku5+m8k,NI$I74:1QtbzNn@ZK۞Y_I$I4:1(:1V/u{cNKC6{IR;n_J$I3@ZlW2V/ϯl;7R}_] Jۼ$~6i)xi;$ޙ+,2I\r2.ܟiIwe -Qtb[yV ȥ\{b.HϿv+Iht(:1V˥3[cV{8jlEHKaK[$iH|c>I}M/=N:}2]>$^گKx=4Z-w(ߤBR-IڷN$@e2-I#eNnFٞߓZ)[Ed -,mے{NI*ks<uWa˾iWhYZ/=KGRSeo h [W@bNҿzȽ{5~!:HzˇHKu(:1Vl]]33E Uڪ%I{Y˹4`ǃ+Buw3A/$It, qީފu9H픭6iI.pq/4Hkq7XZzit|Eh5-dӟ!_rβ&)mϒ]zե@E ;"ޒrOC@iZ+hdkEqϪs ;`R,Iھtp}:x/r;ߦSJUM;ri7,lX[u[𪑲5s!/mɒa{HztFIjZRE'j*zw|S eBvK[$i^Gu z/P=0넦$^ů|9*5XQtbM^h1}J.mƒ-:vJICSiIڷ·JMUwF|Bɋ:.mÒ-uJꨯ;CWV }yt,I{T`·JT}ةҪ7:L[:ytg.66j+ji)&uQt[d=J;?iGY7{+{OņYii/?iоe+]ux+M>b߄}oU"HMZ7Z.}vu_i;CJQ&YiZh5'-[!c WN48Sz uW:V-Kmr8f,|voҾIZ΂9*zv/}ÄlͬqKƫ(qF@lZ]D*ᒚIKҪzPiVE'ڽthuӄ*[ovE0f5݂Q\եBR Cs53iIZςHK(:1־ducQڥlUwi8LĹSZ׻I+ҾCS$Uo`m0NLo:?.e 4zьXZvs%O_(i̡LZ*Y0iiնE'ڱe+J,m_Va x0ftw$ګb\{Hj͚fҒ,[J+u~Qŭ$XV8e+a-~r0=O+Q⦿N6]ja^NtM[~dT-GщiXW6+IqJXCfslѐSimkmKG #I׶Y0ib{\ڥW6.[2n3qF(.M8Zel/$? TGщivXaזe_u7i8Lz8:/G}cZ1%Ir@Z]Fщ᜶X7s?=io Z0yfҪ^:qjjS boiO{q-I s@ZFщioM'EYٺّ>ANΧ42Vlc|IUiD:snImdz`v˥+'ڸe+A{+1n*qFeNSik^\rIuVQ;r4J5bEڑ^=Z `E~o3fkaFk:αֺȻg=hI)t@K8M]7={]ޛ\=G$wҙE'vY/+.[6` {0 빏Ih"#iI^;63~Qtb mz+ֽ&Um@zLa uҙދզi] |Op<%IJ5Ao -3NLMm:UַͤM{e=h)}t#O 2$).{.V{)VFc"zeۖgv4zPY-evlUii,cv ptit:t w>kҡX4=L~ʶ1]2i4WߚX)={Kfщii+]֬t,U/[vxLa [7beh{hغ>l$ U@ZCMsL^ֲss骲ul_d=h؈3c{hzlw$S;ޓ5H]|C4Z+7|6v:;od=h؎K_VGWXΞ*OOB\G'`wn#-)v^@Z!k4Z{/V*]0^5qF> cN҃wK{*V{ 4:1Viլ/ZeV;)]/qFn ^SQKPwщ>hխǭ sJeVS}i8LaO|Ex;*4WzM٪,eB4:yqiNjFnbѹljF4vc,^=Qz"Rތi ujFNGщi*\`J(AW4zѰ10o~vANR::sh#QvM~S7qFCDQ:qtQ4y$cIuW5VwXF5WLa 1>'z)j{/b4:n p"6UXpGXFWLa 1u@"/ӓrQ4ދ>Nb=4ZU #7-eS}U4zC aػRE6|LH#Hqd4ZZWa7v麲թ}ߞi8L9Ecp4{qz.Vc`=Ғ.KŒGǺC^Eb>֥.1qFCtW+,'(uTk@ BREڙwJT i8caolEꅽ[2i4x;%R^Za/Ғ:-WKhR"=}4躲#4z(s{i`TEþHx:rJT h8G]QOˮ4zЮiS y3Cj hhEJR7śF'ڽČMWVlu 0=i邲/uz]05{?jbu8mG!щX'c0EePw 4z:9- ?WECk %uTSڱW-rF5Akr]T ץF4Zg׭نwZF&iIjNjb@xl]ӴEeOdLa 3mjwZ ATF2iI]ҩڸأ4ZW4g<7^i8LUs ŽH6[9Ȑ~oi ?NLuilEhy5酙F4A;$Qiһ["ej%Oim4ZPEy4S@zI0n:_<=K'o0^tѹjr1i~˧ɥ^%'Mek iqFCaGc앪v07ciHWhc+8l iqFC~F3[,\70&7W%WS(GxcbUa Ic(Ma .9ڟiJW0#3iLSno:yXyi4qncK8u #}&Id{f}i\Ft*[74 i4v|Ut@F~ߦz+%`4nV*iL00LX$\fcL Ma q8MP+U~i/ s>Ig}#ѲO~ևl iqjcXC i4a׭Jłj bt?+HFF2~'es| IJek.i8L!E@iJF9 lH2wTQpE^ՃRZ1AҦ0PFDês%cCs IetrV符UҦ0h|HTZ]O s:CHF/d 8L5l} ?^:h}V.-laRuRKG:xu4z9E_4ZbŠ􉬑^0h>¤` tbd-iL/b ,KF+P I# |e=hȩ+z*#+k9}3t_4Zi *:8.le$i8L! KK2iaKVlUb-Lpݻ^%L^k;7P5Ma X9Q̡%ÁHwQL϶t' c dBzF4brٴKf0,shIe}5N3Niȥw+qZl5o4zu/P,=VWMd-Loa ]F72b}`=~l4z|mܧFX7̡%i ;(v&d^ ,[M]/'a aXlc6UP̡%i m06{F)[8#Ma aۼu,}lg lz0shIdPô8hoZi=[؀4Vp^S0 W?@bG~?r.n#0WѵiEWd=fbM`~l3T٫Ϭ^0Ȝ>SN;J _fӃ=I}e"34zՀ-O◽,i8L!iUKؘ{k@l0ة"I=f]tSEWg=Z68e/= u}4z?$\aiw%˹s2uvQs(HFk0􆖭lv7HrMa mWɇ\#})b~ !CK i w(z%bCl` e;t D8L!8??zw@ތB` k@0Вdik>Û ю5QK86i4Y"bG3Ni8{~CK azaE4z^We/:J۴,4zoυH~0b02UHoQRڔƶIe8Wn m=hϴ9&o{FCВg62ހi !I첗5f;hO_5ɩF9tZRL7`a=Bixi_.{Zz(4z_wXtX@YI/V[/shId U3ތiue5H{]n5i4:mCT,rH.ZP]ٌzY7cg/:M9L/ܨi8L!>sb c9CK0cu#Î;-FχBZBsҦ0n95d>9aDz%Eo4:v/+N-j Mm4qFC|_O3;>X.Kx04v3Q))^٫L--o/0!ܡX4˽3d*ޅ}HH{i4 abQи)Fŋ 4ZNF@ƌb*j.՝`e/1u96i4 ã%WXQz'F&YВe{*&ⵦ}/ӫ e/եrp01ojpHW" shI16-ٛ YzY.|*{}YCk0i4 ܦb!5e-Ig2׽Y%E>UQBӋy.{qYISiqFڼ-Ī9ԵlshIͮ f{Vz.^e:rwbi8La.3"q`j0F@z6Fؿ Vz+^e2pS0!6vҋN{*^M`cВtQэ0>Qt;el 6e/+kV0!Oqƹ(5̡%La cFM)W #}|(@ZH;?h  WX #NEu^̡%LbV,"e+R#i>5eMa 5鮇Ef-I7fG|ߺ=ICהmm}zv4z0JDŽٳ&X9$U4A)6 Lsnԡ^P6RLa xY˪^rC;،9$UqDHE7>X?'dK{ 4Fx,0饴皽v@uE%I3nְi薙F&"˲W26i4"RtҋbJo#IkdݲFэ3Pzc^V"[R.qF(b ǕxՀZ̡%iL7@O6g{okJ0Ib.ga |psnX9$mit*xv{`{G0ȧFבl96i4"Cd ɽZΗB:shI,.X4itץw%;w|udG Ma zWL aL7Td-Ig݋FqXoiCK{ JTOˮ^DunvX/qF(/9bJzfDZv4#!?(bofqǷ^Av~wqF(B/9ixKCKҎF%'QtwL;x$^AZ~i8LaAOe33NNFwcR2We/Xu4z0xKOsdZk,a-IdݣGc=2e#H\}F4F6mAz/ Cqr9$5it.hFѝ21!ٹ+{hz]0Q O;9\ZEHE4w"2w|쵣)+wF4F)/5a!shݞuN|3nt m5}q|^DFuE Gkr;hEųc@Hx9@躙FwQtL_l]j4(wս؀wqF"|Dq<ڭ(w8-}l.je/躙FQtfZ^| ˾SemzA8Laav\aOZ(shuNQit] ML;x V_Ѭi0!9]dg4JZ/ꜘF4:ԩKit/W*{aZe/- w0i#yA]9΁:'u3فQt$ѽt(^;87 QerH w0;[N#gcx-`X&HHEcE.ϏҁŲ׋~J0!3rFZ=}JH̡e91it0M 1nҳϴN2,sh="NLf&Ү$9V/d,{'fJ&Б{w%H+{l\̡o91itT;^al\э-%0dD_۬4\cG7ާDZ-@]1Qtl-,ޥ5X2ѝ+ra }KyӁ3جbCTj'ꜘF4:F9lCzoESkD.H;i4ޕC\ęrF`rΉ}9oQL͞rǷ^ :uqR: #,&'mZm@ٱiAFYur);T@t*9i4Hp mP!Go#j58yZ7A:6it|ױE7UЯi0[(j>TC-sѵv81i8׼rETfW ^eJ&^p wôv{D"IZ,p9ȁ:'u3J;E4si=e/ [rK0m P<H%{Dbˉit݌1FSq m= J[tE ̴MKCi7 w\ID3`rΉit @(zL4*m5KcCPqFCp=@*ҾVI7zgNsΉitLt@(zXMeZVk(qf m|YӸYg 1V9P4núz m=2vJ;w ױsBًB$TA8L!itH@gފ ]0VsiLGv@:32vz(^fiW`~$qFCd#=Onw2/d g09P4n&#i"Cit#92ôriWxʁqFCd}^<~nv9躙FQ4эjܰD뗽 4f +qnv9B7us$Q4it  T>HXr/0k" *t-3Vsb]77$ih8ܽ.PKMmYZ;i4׹C"ӵ4ZsΉit@(ݳGl{5>h~jȧ8K%tdAĉitL9q T1վhUBދܑFCL]FZʦ,)8IZ7hܞ}6N֖e#x(2:+=C0hNLfA߁Q4%;~rJ~ҰG٫Db utê~CkL91i4tX\ݱCrz NNKDb utn}ؘS7f;̡5xќإ`9{ "lkO([@$P/J.z.^PCK)hNLf ,gt>t^ XôjDb $\a]-=sh7aNLf ,gta߲lFC4/zNs~:--CKYބ91i4{+^jDb Mk뽻J{\/ shL91i4.;zO%Db v"1 S4W88ͮ'u3+Mi9gKvo.[@$A;CÆFEIV./ݒi4'u33&̴OV-[@$A'HЬi%|٢̡*Fsb]7*rpǷU˖6i4tFsBaarYRL91i4ǵ8Dd8_HL{]w AVG e 0g͉itLL{VU.[@$з.FhÆUe ~d-F4X4zދ 'Rr"1xKaCgIBKe͉su33^t4-phΪfB"1uaCeK ~>}CZ!hNLf ,g^ifK{V/[@$бފ {V^\G۔T5hNLf ,g^҆課% Db :tǹe HIU2K˙Fsqw~]l FCy-3tLٲ\[=hNLf ,gF0XоiV Db ]:6ӡxЅ.ȾWٲK}]mZ$]i4'u33^b9C/'T,[@$ПC-su]\˴ZIZ+NLf ,gTb!CGU,[@$П/# K.'c6m:wFmnL9q޳nr&L|ӺVق"1go91i4i-o-RǮue4}j?H0 *[,К>*f͉Su33byBT\𲩲eDb -gT #*-: hhE_P&0l@.߭r&躙F˙F_ZΖ! nEDb Mk K0ފ:RәFsfLL/X0NX܀HLaA$=) bIJE1=pni4'u33(ւ$l:\R܀HLagݍ,NfќF4X4<—sc[ЀHLaO=z֙8DFsVkFs2NJٷ3^s`XwlFnzek,`pcCwrb]7h`9腥]bȺ@eK 4(: KIŀwl9@l.߭F24nr {* |"1u;v~t4h)[0?.߭]3ƉitL ^,7 6\HLaSwoY@GiB.߭34nrK GJ۔-+ h}ctвJ~1hNLfj,g=kЀ;llYFF᪼0kS'#۵MќF4X4zCЀ΍d.[P@$Ѱ7 s`p.߭ z?ąxX. L<K xǷ%eK 4uϞ~|$ui4i>%FI²Db +:>ځ,6~=}?.-Id ,g}&wt弙e4b. Kps/>|IRF [3ѢEDb ;=ͣprv~{)\* e4*tȇ҆3HsK; .-I f,gci/7[P6[|HLHMWٳ'u\[4X4xlAKh`9jKK#[>&5zb"14)%h9wb%i4\Գdi?-{@L'DbgCx~޳w,Y2Wn߲DbJ#yWIj7h`FΒn.Pa4d4yV,y*b߫@Z 1d ,YCnwn\~ك"1fi69{Zڛɞ2hIX XdţxO i4L7X7ع(ZRGF~8.@-ӛe4yk$\a XUz 4~IEF~xHuF= hFk8%ihQ2,{xKt= hFZ:p%`g a_Fђz4Xn߳dޯmL:= hF An}b-Lwvh`ϒy<^F34zBXz#WGƹ2,oo Db<躥-a]f EK i4ܖQkf`{\+KHLg]b "֛7aq;`Fmyoe#o"1fitŞ NpEK i4fg] hI_Zo"1fit>H?X, Q.$i4fg`_Zei4LkT,[mss Xqn$)frۜ%KK0EUF34JłhDzW2, m:7O"1fitl_J#kr)@#V[wF3YK0[M>G%p2[)вnE@$3=?/eF%L>KhJDb<s t>4|qhIe ,YhJw| hFߒ+,X?~:qd`%iLV=KU"1fi-=Y%#xIf,Y'g@+?fi4LXȯ\Ѹ:3[,١ZVoٟDbr+%{."Oaup hF_K$:9+DlO-I%8K\ 6V"1fi WX:ƽl)AIҿF˭T-@$sҦ-F?5oDK'-h`gފ#ӛY?4yї K@қX{ȏ mݮ/IYrϒy z2ZF34eНV#i'ђcFAruϒ>@w*if,i4L/*-lto49آ%LSvSٟ Db<./|Ʀ{v_:'ђt6h`g\u ;e i4LR,=պOұCРǟKg ,W,ه"1fiHԺO+њ>Ok$i&h`Zg?w7Cfi4L K@H|'F<$]i4\dXӛܕei4L^,70n 'KsKFU9Kmktei4L価@`-NK.J.7g^? [Q@$3--l^L}Wԗ[2awqٟDb<Hxa{v3iV"Zn4XƳdi-RDb<=K [3r-3i{tOwIi4-g[v(CHLg}`GfTd-Iu3,CD:]P'F34LO,̤9$i4gҿQ.IC'F34ފeIIsshIZ/h`ϒ@lO?@$3-,]wIDZC̡%i]wsKdzf:i4LXP?:VBtܞ/$L8K| F"1fiJoޫS+mb/Вa>8KT!X@$3.K[NrnB7vp]GrPҎ²4yΊf@zJ68В_r%2#Δ[@$35{^??%O$%IeV,wY?u-ICoF34{$NަF糟JВTr%e߲iY}U"pɻ$IQ@ $??%IP/ݛ+rۺ$I$Ig$IXyǫ$I$ICL$IRKZ$I$I韒$Iꠏ=[z/.-I$I$-韒$IꬷϿ~R%I$I$IOI$uscTvϠ][$I$IJ$)B&@?t.I$I$BL$IR&Oqr $I$ITJ$)xwKcZ0$I$I韒$IEl#IL%I$Ig$IO$I$I$??%IqD5No߇t|H/ϒ$I$IR3S$I$j_c/_/$I$I:4Z$I$I$IT?hI$I$I$IRL%I$I$I$I3$I$I$I$Ea\IENDB`python-asciimatics-1.15.0/samples/pacman.py000077500000000000000000000437401511423144500206760ustar00rootroot00000000000000#!/usr/bin/env python3 from copy import deepcopy import sys from asciimatics.exceptions import ResizeScreenError from asciimatics.paths import Path from asciimatics.renderers import StaticRenderer, ColourImageFile, FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.effects import Print, Sprite, BannerText namco = """ 88888888b. 8888888b. 8888888888b. .d88888888 .d888888b. 88 88 88 88 88 88 88 88 88 88 88 .d88888888 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 88 `888888888 88 88 88 `888888888 `8888888P' """ dot = """${7,2,7}#### ${7,2,7}#### """ pac_man = """ {0}########## {0}################## {0}############${{7,2,7}} {0}###### {0}############${{4,2,0}} ${{7,2,7}} {0}###### {0}########################## {0}########################## {0}########################## {0}########################## {0}########################## {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}############${{7,2,7}} {0}###### {0}############${{4,2,0}} ${{7,2,7}} {0}###### {0}########################## {0}########################## {0}############ {0}########################## {0}########################## {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}############${{7,2,7}} {0}###### {0}############${{4,2,0}} ${{7,2,7}} {0}###### {0}########################## {0}#################### {0}############ {0}#################### {0}########################## {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}############${{7,2,7}} {0}###### {0}############${{4,2,0}} ${{7,2,7}} {0}###### {0}#################### {0}################ {0}############ {0}################ {0}#################### {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}############${{7,2,7}} {0}###### {0}##########${{4,2,0}} ${{7,2,7}} {0}###### {0}################## {0}############## {0}############ {0}############## {0}################## {0}#################### {0}###################### {0}################## {0}########## """ pac_man_right = """ {0}########## {0}################## {0}######${{7,2,7}} {0}############ {0}######${{7,2,7}} ${{4,2,0}} {0}############ {0}########################## {0}########################## {0}########################## {0}########################## {0}########################## {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}######${{7,2,7}} {0}############ {0}######${{7,2,7}} ${{4,2,0}} {0}############ {0}########################## {0}########################## {0}############ {0}########################## {0}########################## {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}######${{7,2,7}} {0}############ {0}######${{7,2,7}} ${{4,2,0}} {0}############ {0}########################## {0}#################### {0}############ {0}#################### {0}########################## {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}######${{7,2,7}} {0}############ {0}######${{7,2,7}} ${{4,2,0}} {0}############ {0}#################### {0}################ {0}############ {0}################ {0}##################### {0}###################### {0}###################### {0}################## {0}########## """, """ {0}########## {0}################## {0}######${{7,2,7}} {0}############ {0}######${{7,2,7}} ${{4,2,0}} {0}########## {0}################## {0}############## {0}############ {0}############## {0}################## {0}#################### {0}###################### {0}################## {0}########## """ ghost = """ {0}######## {0}################ {0}#################### {0}##${{7,2,7}}....{0}########${{7,2,7}}....{0}###### ${{7,2,7}}........{0}####${{7,2,7}}........{0}#### ${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}#### {0}##${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}###### {0}####${{7,2,7}}....{0}########${{7,2,7}}....{0}######## {0}############################ {0}############################ {0}########################## {0}####${{7,2,0}} {0}########${{7,2,0}} {0}######## {0}##${{7,2,0}} {0}####${{7,2,0}} {0}#### """, """ {0}######## {0}################ {0}#################### {0}##${{7,2,7}}....{0}########${{7,2,7}}....{0}###### ${{7,2,7}}........{0}####${{7,2,7}}........{0}#### ${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}#### {0}##${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}###### {0}####${{7,2,7}}....{0}########${{7,2,7}}....{0}######## {0}############################ {0}############################ {0}############################ {0}######${{7,2,0}} {0}########${{7,2,0}} {0}######## {0}####${{7,2,0}} {0}####${{7,2,0}} {0}#### """, """ {0}######## {0}################ {0}#################### {0}##${{7,2,7}}....{0}########${{7,2,7}}....{0}###### ${{7,2,7}}........{0}####${{7,2,7}}........{0}#### ${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}#### {0}##${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}###### {0}####${{7,2,7}}....{0}########${{7,2,7}}....{0}######## {0}############################ {0}############################ {0}############################ {0}########${{7,2,0}} {0}########${{7,2,0}} {0}######## {0}####${{7,2,0}} {0}####${{7,2,0}} {0}#### """, """ {0}######## {0}################ {0}#################### {0}##${{7,2,7}}....{0}########${{7,2,7}}....{0}###### ${{7,2,7}}........{0}####${{7,2,7}}........{0}#### ${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}#### {0}##${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}###### {0}####${{7,2,7}}....{0}########${{7,2,7}}....{0}######## {0}############################ {0}############################ {0}############################ {0}########${{7,2,0}} {0}########${{7,2,0}} {0}###### {0}####${{7,2,0}} {0}####${{7,2,0}} {0}#### """, """ {0}######## {0}################ {0}#################### {0}##${{7,2,7}}....{0}########${{7,2,7}}....{0}###### ${{7,2,7}}........{0}####${{7,2,7}}........{0}#### ${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}#### {0}##${{4,2,4}} ${{7,2,7}}....{0}####${{4,2,4}} ${{7,2,7}}....{0}###### {0}####${{7,2,7}}....{0}########${{7,2,7}}....{0}######## {0}############################ {0}############################ {0}############################ {0}##${{7,2,0}} {0}########${{7,2,0}} {0}########${{7,2,0}} {0}#### {0}####${{7,2,0}} {0}####${{7,2,0}} {0}## """ scared_ghost = """ ${4,2,4}######## ${4,2,4}################ ${4,2,4}#################### ${4,2,4}######################## ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}############################ ${4,2,4}############################ ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}#### ${4,2,4}##${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}## ${4,2,4}############################ ${4,2,4}####${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}## ${4,2,4}##${7,2,0} ${4,2,4}####${7,2,0} ${4,2,4}#### """, """ ${4,2,4}######## ${4,2,4}################ ${4,2,4}#################### ${4,2,4}######################## ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}############################ ${4,2,4}############################ ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}#### ${4,2,4}##${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}## ${4,2,4}############################ ${4,2,4}##${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}#### ${4,2,4}####${7,2,0} ${4,2,4}####${7,2,0} ${4,2,4}## """, """ ${4,2,4}######## ${4,2,4}################ ${4,2,4}#################### ${4,2,4}######################## ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}############################ ${4,2,4}############################ ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}#### ${4,2,4}##${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}## ${4,2,4}############################ ${4,2,4}########${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}###### ${4,2,4}####${7,2,0} ${4,2,4}####${7,2,0} ${4,2,4}#### """, """ ${4,2,4}######## ${4,2,4}################ ${4,2,4}#################### ${4,2,4}######################## ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}############################ ${4,2,4}############################ ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}#### ${4,2,4}##${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}## ${4,2,4}############################ ${4,2,4}########${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}######## ${4,2,4}####${7,2,0} ${4,2,4}####${7,2,0} ${4,2,4}#### """, """ ${4,2,4}######## ${4,2,4}################ ${4,2,4}#################### ${4,2,4}######################## ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}####${7,2,7} ${4,2,4}########${7,2,7} ${4,2,4}#### ${4,2,4}############################ ${4,2,4}############################ ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}#### ${4,2,4}##${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}####${7,2,7} ${4,2,4}## ${4,2,4}############################ ${4,2,4}######${7,2,0} ${4,2,4}########${7,2,0} ${4,2,4}######## ${4,2,4}####${7,2,0} ${4,2,4}####${7,2,0} ${4,2,4}#### """ eyes = """ ${4,2,4}####${4,2,0} ${4,2,4}#### ${7,2,7}..${4,2,4}####${7,2,7}..${7,2,0} ${7,2,7}..${4,2,4}####${7,2,7}.. ${7,2,7}........${7,2,0} ${7,2,7}........ ${7,2,7}........${7,2,0} ${7,2,7}........ ${7,2,7}....${7,2,0} ${7,2,7}.... """ # Globals used for pacman animation direction = 1 value = 0 def cycle(): global value, direction value += direction if value <= 0 or value >= 4: direction = -direction return value class PacMan(Sprite): def __init__(self, screen, path, start_frame=0, stop_frame=0): images = [] images_right = [] colour = Screen.COLOUR_YELLOW if screen.colours <= 16 else 11 for image in pac_man: images.append(image.format("${%d,2,%d}" % (colour, colour))) for image in pac_man_right: images_right.append(image.format("${%d,2,%d}" % (colour, colour))) super(PacMan, self).__init__( screen, renderer_dict={ "default": StaticRenderer(images=images, animation=cycle), "left": StaticRenderer(images=images, animation=cycle), "right": StaticRenderer(images=images_right, animation=cycle), }, path=path, start_frame=start_frame, stop_frame=stop_frame) def _update(self, frame_no): super(PacMan, self)._update(frame_no) for effect in self._scene.effects: if isinstance(effect, ScaredGhost) and self.overlaps(effect): effect.eaten() class Ghost(Sprite): def __init__(self, screen, path, colour=1, start_frame=0, stop_frame=0): images = [] for image in ghost: images.append(image.format("${%d,2,%d}" % (colour, colour))) super(Ghost, self).__init__( screen, renderer_dict={ "default": StaticRenderer(images=images), }, colour=colour, path=path, start_frame=start_frame, stop_frame=stop_frame) class ScaredGhost(Sprite): def __init__(self, screen, path, start_frame=0, stop_frame=0): super(ScaredGhost, self).__init__( screen, renderer_dict={ "default": StaticRenderer(images=scared_ghost), }, colour=Screen.COLOUR_BLUE, path=path, start_frame=start_frame, stop_frame=stop_frame) self._eaten = False def eaten(self): # Already eaten - just ignore if self._eaten: return # Allow one more iteration for this Sprite to clear itself up. self._eaten = True self._delete_count = 2 # Spawn the eyes to run away path = Path() path.jump_to(self._old_x + 12, self._old_y + 4) path.move_straight_to( self._old_x + 12, -8, (self._old_y + 12) // 2) path.wait(10000) self._scene.add_effect(Eyes(self._screen, path)) class Eyes(Sprite): def __init__(self, screen, path, start_frame=0, stop_frame=0): super(Eyes, self).__init__( screen, renderer_dict={ "default": StaticRenderer(images=[eyes]), }, colour=Screen.COLOUR_BLUE, path=path, start_frame=start_frame, stop_frame=stop_frame) class EatingScene(Scene): def __init__(self, screen): super(EatingScene, self).__init__([], 240 + screen.width) self._screen = screen self._reset_count = 0 def reset(self, old_scene=None, screen=None): super(EatingScene, self).reset(old_scene, screen) # Recreate all the elements. centre = (self._screen.width // 2, self._screen.height // 2) path = Path() path.jump_to(-16, centre[1]) path.move_straight_to( self._screen.width + 16, centre[1], (self._screen.width + 16) // 3) path.wait(100) path2 = Path() path2.jump_to(-16, centre[1]) path2.move_straight_to( self._screen.width + 16, centre[1], self._screen.width + 16) path2.wait(100) # Take a copy of the list before using it to remove all effects. for effect in self.effects[:]: self.remove_effect(effect) self.add_effect( ScaredGhost(self._screen, deepcopy(path2))) self.add_effect( ScaredGhost(self._screen, deepcopy(path2), start_frame=60)) self.add_effect( ScaredGhost(self._screen, deepcopy(path2), start_frame=120)) self.add_effect( ScaredGhost(self._screen, deepcopy(path2), start_frame=180)) self.add_effect(PacMan(self._screen, path, start_frame=240)) def demo(screen): scenes = [] centre = (screen.width // 2, screen.height // 2) # Title effects = [ BannerText(screen, ColourImageFile(screen, "pacman.png", 16, 0, True), (screen.height - 16) // 2, Screen.COLOUR_WHITE), Print(screen, StaticRenderer(images=["A tribute to the classic 80's " "video game by Namco."]), screen.height - 1) ] scenes.append(Scene(effects, 0)) # Scene 1 - run away, eating dots path = Path() path.jump_to(screen.width + 16, centre[1]) path.move_straight_to(-16, centre[1], (screen.width + 16) // 3) path.wait(100) if screen.colours <= 16: inky = 6 pinky = 5 blinky = 1 clyde = 2 else: inky = 14 pinky = 201 blinky = 9 clyde = 208 effects = [ PacMan(screen, path), Ghost(screen, deepcopy(path), inky, start_frame=40), Ghost(screen, deepcopy(path), pinky, start_frame=60), Ghost(screen, deepcopy(path), blinky, start_frame=80), Ghost(screen, deepcopy(path), clyde, start_frame=100), ] for x in range(5, screen.width, 16): effects.insert(0, Print(screen, StaticRenderer(images=[dot]), screen.height // 2, x=x, speed=1, stop_frame=4)) scenes.append(Scene(effects, 100 + screen.width)) # Scene 2 - Chase ghosts after a power pill scenes.append(EatingScene(screen)) # Scene 3 - Thanks... effects = [ Print(screen, FigletText("Thank you,"), screen.height // 3 - 3, colour=Screen.COLOUR_RED), Print(screen, StaticRenderer(images=[namco]), screen.height * 2 // 3 - 2, colour=Screen.COLOUR_RED), Print(screen, StaticRenderer(images=["< Press X to exit. >"]), screen.height - 1) ] scenes.append(Scene(effects, 0)) screen.play(scenes, stop_on_resize=True, repeat=False) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/particles.py000077500000000000000000000102601511423144500214140ustar00rootroot00000000000000#!/usr/bin/env python3 from random import randint from asciimatics.effects import Print from asciimatics.particles import Explosion, StarFirework, DropScreen, Rain, ShootScreen from asciimatics.renderers import SpeechBubble, FigletText, Rainbow from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys def demo(screen): screen.set_title("ASCIIMATICS demo") scenes = [] # First scene: title page effects = [ Print(screen, Rainbow(screen, FigletText("ASCIIMATICS", font="big")), y=screen.height // 4 - 5), Print(screen, FigletText("Particle System"), screen.height // 2 - 3), Print(screen, FigletText("Effects Demo"), screen.height * 3 // 4 - 3), Print(screen, SpeechBubble("Press SPACE to continue..."), screen.height - 3, transparent=False, start_frame=70) ] scenes.append(Scene(effects, -1)) # Next scene: just dissolve the title. effects = [] for i in range(8): effects.append(ShootScreen( screen, randint(screen.width // 3, screen.width * 2 // 3), randint(screen.height // 4, screen.height * 3 // 4), 100, diameter=randint(8, 12), start_frame=i * 10)) effects.append(ShootScreen( screen, screen.width // 2, screen.height // 2, 100, start_frame=90)) scenes.append(Scene(effects, 120, clear=False)) # Next scene: sub-heading. effects = [ DropScreen(screen, 100), Print(screen, Rainbow(screen, FigletText("Explosions", font="doom")), y=screen.height // 2 - 5, stop_frame=30), DropScreen(screen, 100, start_frame=30) ] scenes.append(Scene(effects, 80)) # Next scene: explosions effects = [] for _ in range(20): effects.append( Explosion(screen, randint(3, screen.width - 4), randint(1, screen.height - 2), randint(20, 30), start_frame=randint(0, 250))) effects.append(Print(screen, SpeechBubble("Press SPACE to continue..."), screen.height - 6, speed=1, transparent=False, start_frame=100)) scenes.append(Scene(effects, -1)) # Next scene: sub-heading. effects = [ Print(screen, Rainbow(screen, FigletText("Rain", font="doom")), y=screen.height // 2 - 5, stop_frame=30), DropScreen(screen, 100, start_frame=30) ] scenes.append(Scene(effects, 80)) # Next scene: rain storm. effects = [ Rain(screen, 200), Print(screen, SpeechBubble("Press SPACE to continue..."), screen.height - 6, speed=1, transparent=False, start_frame=100) ] scenes.append(Scene(effects, -1)) # Next scene: sub-heading. effects = [ Print(screen, Rainbow(screen, FigletText("Fireworks", font="doom")), y=screen.height // 2 - 5, stop_frame=30), DropScreen(screen, 100, start_frame=30) ] scenes.append(Scene(effects, 80)) # Next scene: fireworks effects = [] for _ in range(20): effects.append( StarFirework(screen, randint(3, screen.width - 4), randint(1, screen.height - 2), randint(20, 30), start_frame=randint(0, 250))) effects.append(Print(screen, SpeechBubble("Press SPACE to continue..."), screen.height - 6, speed=1, transparent=False, start_frame=100)) scenes.append(Scene(effects, -1)) screen.play(scenes, stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/plasma.py000077500000000000000000000040471511423144500207110ustar00rootroot00000000000000#!/usr/bin/env python3 from random import choice from asciimatics.renderers import Plasma, Rainbow, FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.effects import Print from asciimatics.exceptions import ResizeScreenError import sys class PlasmaScene(Scene): # Random cheesy comments _comments = [ "Far out!", "Groovy", "Heavy", "Right on!", "Cool", "Dude!" ] def __init__(self, screen): self._screen = screen effects = [ Print(screen, Plasma(screen.height, screen.width, screen.colours), 0, speed=1, transparent=False), ] super(PlasmaScene, self).__init__(effects, 200, clear=False) def _add_cheesy_comment(self): msg = FigletText(choice(self._comments), "banner3") self._effects.append( Print(self._screen, msg, (self._screen.height // 2) - 4, x=(self._screen.width - msg.max_width) // 2 + 1, colour=Screen.COLOUR_BLACK, stop_frame=80, speed=1)) self._effects.append( Print(self._screen, Rainbow(self._screen, msg), (self._screen.height // 2) - 4, x=(self._screen.width - msg.max_width) // 2, colour=Screen.COLOUR_BLACK, stop_frame=80, speed=1)) def reset(self, old_scene=None, screen=None): super(PlasmaScene, self).reset(old_scene, screen) # Make sure that we only have the initial Effect and add a new cheesy # comment. self._effects = [self._effects[0]] self._add_cheesy_comment() def demo(screen): screen.play([PlasmaScene(screen)], stop_on_resize=True) if __name__ == "__main__": while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/player.py000077500000000000000000000027421511423144500207300ustar00rootroot00000000000000#!/usr/bin/env python3 import sys import logging from asciimatics.effects import Print from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.renderers import AnsiArtPlayer, AsciinemaPlayer, SpeechBubble from asciimatics.exceptions import ResizeScreenError logging.basicConfig(filename="debug.log", level=logging.DEBUG) def demo(screen, scene): with AsciinemaPlayer("test.rec", max_delay=0.1) as player, \ AnsiArtPlayer("fruit.ans") as player2: screen.play( [ Scene( [ Print(screen, player, 0, speed=1, transparent=False), Print(screen, SpeechBubble("Press space to see ansi art"), y=screen.height - 3, speed=0, transparent=False) ], -1), Scene( [ Print(screen, player2, 0, speed=1, transparent=False), Print(screen, SpeechBubble("Press space to see asciinema"), y=screen.height - 3, speed=0, transparent=False) ], -1) ], stop_on_resize=True, start_scene=scene, allow_int=True) last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/python.png000066400000000000000000000766061511423144500211200ustar00rootroot00000000000000PNG  IHDRrgsRGB pHYs B(xtIME  "#W IDATxy$u}NuYaGEEQaQѸ=j%k"3=j\O LG%j4b\b\"w MAa{[v/o1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1cS`16m:nÆ wgØAݧc[$ϐ$'1c1pسg%=<jkUV,cm1Ƙ)ؼy!Z~bbd\kH WϘ1c)qt:O#y&$`-@IHϚ1fyܛ?dukN}b%U cMNĻ{~tϘ1,8~$8@-R&6쒨sXD}x) hkvK5!BD H&cXzgß}i;H&7vsʉy>37HZE@I4X`Q9-P{G:! bQ@(5 d2'* 5&$!خXW\ߌ1̞jjc,^q_r>'=I"HkZ$h`&D_GPwN^9N۬CZMJ%tGHS^JN-wc1X`/,8;K!# d* ZbNuzS-ݵ^8(8dw"q8^ҳVy)1\/4c76uD8SKЉI@kŮvf7,vvFX~+ӨvwA Sh9 %J$"u(coG;? 7oc1{NxnuK !PK]!::q(TbgWf-!Q4BLnl' T"Sϳ)*G8ЃxS_g|c1Ƙ!| |Q޺\ #T53Q(4Ԭb%$iZ*Ff)⚹N?? DJTjf ?H fl/?5yuc1Ƙp{(B}4:#XB QkLk Al7{wߛB< tGi?A1Ϯiϯx9J0cGoQC:Tq?JQ뒸VI&I^qE iuS(Q\\weZ;]GR2 ERJ+8Jҋ;}~1c,V\?6Jϡ<حq 뙶}o,!R.sSv͢Dq%YJǽC/Ua1c=/Op Sn a:$` aZ($B[Brӵ2Z؉.XBŨuW6ef{֝ >5c1{(9M;(*)N$2Rd¶LZB8%EyoZM%D&i^"-?F=c1{ 6cA) H4iI\Kd uBo%2 /:IiWF%Zx/-!@Xe 'JpQo#QrLF౾Z1c,qo*(M*YBnsDz_h1m\PJ,!]E>%*~),!|&/&qbG|coxxg3_8pʛ/3FA\'jyAq];u/\%D)chKR%KHN'I4&Eu[wco9F-[lݱc{Ƙϊ1{ <ʛUBU}w"! e_LƘh u76LS[XcN b}²x#H.q7a7þk髄Mjzu) B :yN;N& |38p1%ʚdcVZ `%aFuK-ȏpҰG8UBڝX%AN& Zg:LLIH$kl ZacfX]wv{1X`/A\(EʢEaD  xnDeButC!k IiI>TYBalG\3l:Z~eQ<ݍ5"d1cuIV<ة=?ٓQ\ZB8%$ "UZB %$d¤6o1c4`[$#& ႓ɗLS#%DSXBE}V1r5)3Z"c1$6΄%PZQ8 yˁWo^wk;\0K<4"Q*!e,o};@"PA4rnm1c @\o:-m\ HMBOpob%d1a:Qymkb!jMEl iEk'c1X`A6 0/G0jPP^7)[B @eUZB6dpAvc1Ԗr%9(D&RZ[Ԥ~ i5 Dc1 n a^'%:jYvDn9J]:c1!3l ZϢ%$no"c 53vQk6`c1X`Z"(,E|(8mS d {n )߫Z;%$>%`;A;6cN!D]R\m QfHRMd 5JQrGD[rKHN:HXB rFQhKHɦT@I'yc }c1X`@' 鼚JP\I~he΅jf5py$!pB Ds%-!BO{%X$}K|9zm1cp<~P?t4%DWѶ\(gH2HJӇQ 1cY<ҁ";Yre?K;KR.g ]ˈظqU۶m{9g,Pnnݺ]^xlڴiتk$Zvݻ>$C mB|d8^RTT -!+yKHbM$sNV^/uU$WJZ`e%ݒMwnx{/|uY<j$uRjfSb|IɎϠbZ[׏pxEJ:,q(Z ;vl6w`[(tn%\r&y$$y8(@Xj+q[i4;H`;_KwY`^hrb5c ]é01j$VjQ"VC\A _ڲ D8^wFTKSn*J:6qTd`zE u&&k0g{;jYBГȈ 1D˸o3{Xt  9\`b{^mmvYzr5I+!K֭qnӦMb*Vߵ;oN|T!y/8Z"p}V;><zG$p"W~#7w:(ݺuϖ˸qqt,8*98d=$ &h6WKխV6  >_-C0IX%=V_y(슿tf;{N ̥b`{Z AO¬znPbP7&.D^=Mj2Ema-!rr"DQ'ˏSg+{dn vY1nj?7ϫ^}:Ή$O0ܿIu9˜^f2y`I&j<,#%O;}lG_4bX|  iT]kYDbz(4 UhVɟŢ0 a.4A9-T㴖)j[g#ĠtP4׈ӨbzO Jd>+Ix_ O_Zܹ/}i}}}$w:4*+*tπZ18β* p_IlW5/b|-[' E8 ,~OIz0QcI +Ix1ؾ8%~#HnH͛&yIz($QJbIL ƷGضmۢplܸq]V{gJ:]+~=bW)I#gon޼_|a||Wu߲eK$aNt:KCIob2X_55pI/$fuZ`ɣ/ੀ틠J7N%XyB\*/W5?<gz\rɢy^m޼@I:-p `MiVd!fӯmh]ǟݶmۯ-oC"XUXUP.h%NU;UΓHv#^I5Oyڼy<_~P! q$d2}+W\xID,IPQW}zK2_l6$[.Ѽ .? D̥+law$,ZB+Ig 3KA,Zt;"uYM#R8Y[+} ~FBUY(,!V^CA?=_bI\+߲Nޔ&@I(FbRT*yBdOӭϳA~g."t @OHq Cnw=$'8t .%~}-|O>> %KD|EeYFGyƱ$.16pBlP+xOqoaJ96 <19aŊo4ltU+vp?svwR:א%`2]4k 2x`B51K* IDAT hCOYP v1%<%$JKHP]c,!Aq-!g b aP-E  Ot/MeQkUtݻ*?sϭqL R<(._I5_SҝnpgmH]p<&l3y8 o:gtsѡC>`eXch4x$7]SSy~YtMz fV>Y[lyx$a ƬTnF]~G2J~9X >$BRas $l6j}i'%|zb{B~~:֦{ѭ#[ܚ;wܑ}z'h֣[om0*LHrl4w-k}?S^1I*-!ZBR"#Qk̢%$t22%m*KswLd U6K$o~q^es9gN Oާ$\҇N?CnOI^ 8m۶q$!MG3H6yWno{aԨ2yHS|HW нSҏn?jKr\b$7!/ٷp{COw+&vOrv*<$W3g"$OuFOOT[pt5q| kI4㛷mvwI`=ɇHzm<;'''.Ft_B68{+OI_pe=xg+$rCC}o߸qY]vټe͋>͟}ݮ=Ȫ,JKHm KH(3KHYd=[XWOXe )>˘(QğR ,a*NVg2U$+$}?Pǿ ໍFJJzJ1D,<@sӦMm۶{/,nݪD N'\;VX/xOL-JMuޝoMLL|ĀDtnK>c ^266f\mٲ8R4A 񱱱w\c۶mwOmٲ*!LV88%.{%6[R 4UH&jKnЇ>t7ߴi?GQJ$ad#Oe'8~=c3F8Ɩ-!Aw,!} OI>7|l͟a6ƍWq*gbJ/Yϒ9>>>V[~l~Kҵ$_4A=]z3&`)AAMpL_ ]Vul۶m F]E22,Rk7{Ϋ<͗d7B*!*!L%\E R%D#W ֤ӘJ4]tΕG'`>F^) W QE)~ .%fys9\4uh(k!'Ӕt:Si%]Nr, mVQh3D^>ݢ*VL'DbyE.[KQA8h`E-CǭV[n~E]ij=I] i7o>zOơ0@k;$o֭olۻ@~|P)6m*6"g?eպnKJפqy`y-#9{ßHwTj#\"70jR\ۅB:mINAToDkC9j+l۶-tfA)%=uh8~&(H0$}nx||[nwMhXI/زeyne֐e$g!F%/O}' tHz{K%Q,!yɼd*UZ>J}KR)B9g_.=RbB(MH:ah6c"zVy85CFLf`skI>7ov$?`${K,kI'~x(v<= l%7jr g );,!Ab(g@X4ƴ:} ĵ$2N,/}0GW?i fIp饗n'Q{bm f^lu%^}7/}.։HOFc?$AAKǯY  ́^e˖M>iDN3oAO7B-ZBKHڂֳg BrWv}6Ҋ$8~Vߒ,0Tt>=X5ٴiCrmS+V|l~ssmANt+ T)- :Öy`IDS7%2dɾtH:zΘAd#Vd;s$7H:fh/-}w5k=뇨(j}*,w0ܛ&hLZB)ޜ[BzgRZWXB%$YBJQ-!=31k7b >/ 鄶Jb_,h ]uL![a,{ې1/7FHZ)i1 %TB^]z$a>1~w;pc)Pu?D5LΡ%$=S.YBPa 0Q,!#~{wauHTj2540M v#؋m`KHh4%a̔.gF M.)*PIz%ݰm۶ꉌmEax$eo݋ig]`׀I"IKH!Zc YB4%iKH*dD'NYמVZk"/]fv,OL/cuxp<+69M${$6fv?gvQ˚(`Őe_M=$e˖8෋8[҉֤ddKA,!gԶRhwKE:AHD>\P,iITIS4Y{]!Yw~d.m9H"HI6f lG h𿆘47~IPN'!8QR,ib9κPIk2j2e"#[B;GuzKBGXB0%dĨu>)ٷۇZ|u B:^K5 WzKFzDyW` X{i)_ y|}-_< wQxlXx+Ej+%$\c `bYO/D,#YB8%Ze AEފ$C[BwB3g ]Tvp]"UlVb:Id߃ 6bEQX z)C$Gfs(c Yb$%t@IjX^=CV?J ˹ b0w+ieyPdXKHAN'j=%SZBzs` AY #=&nTH(-IŨ5$1m"#Өzn!t_Nj[zkIN 9覷#0fjvQ=lB%Nes饗&!bj91e+lZrLqh+KCKLZB8Kj[ϊ%D%! +Vžc$m e_rv X2WWiF]\*=BK+"9pu|^ `Z%<孯Bg ԙLWz,!Aks*̲%idx_; k٫EyBP1$8I B9S,ijw~2}H.V'UבLÜIڏcWvQnZ,S5!Ruc єVSXB8{3b WUBYBXh@3(tlԫo~dQeA'~MdLd,\*qG=,#C^T}LV#[1 fZI*Œn\DzFK;Z`g}Mi YBj[Ϥ%0[%$km>!5" _ Y 5I7B&2-!eA\3j2^~=C۴iSgј%}% X|k|]Qt=CN$z؇wy5_-Y}0Ɓj D3s1/j d iz#Ɂd Hr v33Kl7o^h-FY.~asSQ.'M涘d;~3 U D*KϞSE뿶ٮ9P%nF2Dd?be]eu(G]ofeq2N/r}~naƳD7d΋&''6-Y7jZD{ |;jW QŨu(;mdV k,%(vC!T(T$AGèue  T~H*(ۘ݋x;# kb&*Ad Hd+KHY ݂IHwFBߖ#R?crbkw}{v- %{N&Md݃X%5X &$2v `LT`GQu<V}$9+ߘ#|O:YlKr׈,STL[%$Hd7 p$˕D v@ +%?} / Huh ؃,+De^lI{F(핲 ^3H`}ի^%\h%M ;'_a-n=d- K` d:oy+.yOY5Դ/j8 z"4fʫt%9,pdWe+D3G$Y?1w ImhXt*trnvbhn-!g!t/r%$]/ZZ_;E|ۿ-Y?ScVZ-ŏN,PQvJ&2i랊!Ж׬j^S,[/_BT~iA2LZ G{X#x8^+}bBu,-5 2XB2є\7]dpzK%N»0:BbDԭ+փ+ AKM*VQZ7쌈 Z5}qnܭƗHLQȃA$$TRXnV~:]"c&`FUh-O]0lRV%Z]ŘBӉ(dj5kǺ;y).;@ IDATB%eZ3 /wnwKHw?bWU^&:#< au@V .SeeaZ-YѭM)R|y^.[+Y,7E"cMd0#e٤yFakK05T< %a<1Fof7d?mo'I_1ؠ09%Dya,!YqLR%3~7_{sx_8x?8F2zUL@#ݍ_#g!" &Vo2_PSek#iۘLjrGzDFׅvI1E9Yn")pop7Ng2Frb9֗jʰI&6{zJu(U^hWv1Qon7u.Eo!yΤT@dժk vbs~;;G Dx(U2#ȥ3QlL2U"|^L]?4pmEE`;mv={ܒSv7˱^z?ѰvdX`/f9ɅPRIu:*Jky 6\BT\BD~.z^qrͻ@+'$ssTl_߲¿XVȒ.+=%a_} .GQ ;2Et,JU? 1. I:|$CN~K/tW"Ly;YB:Z ab%D PI$Q,j_[_=̕ L8V Ru!X#Qm8)_)fBuUŐeJITTdID`/=}Yra'8c}5TL&QE[,YO:Τv_)؉n#`2M+ZBd4jӖicr8`BqB:E:R@}R#_o=~ %=$K<)f֪:T (6+UF]Ym QՖPVZB0]ϲPhH9/[g:\>GyaO['&u['-,s}!j#5" lc_` `Fn5IZDF$o,vxwȰ_*bt3)u9+4 ש8,rS̤WC p #uQA=^~BFu>Bt%v3$ׯ;㍾Tk`'2;&$]DZ=3Ngk&XM/ʑȋOSaFvrAj7mvDȸP%$qo"c_m KH&*,!5?,\0 j891iZU"ciY$2r Lp 6穊TQr;=Z7z^rmo{[d1w_6d-:\$ BtEz+`5~;'Z+CXBc aa8ZLm %$I?&/Eg;cH/f@t5]),_!=Q~ꩼׁZ9e`bl Q.K^ؾ}q$><&i4fa0>>>A;9\YRmrrEx a,"WJ|@^ NjN$7M"DFKmƸ%$t B_|20yALƒjs>Fo{Ir& qNSTVI|/X7zV[lx\גǀ1 ~wGHnXǷiӦ#S  [7 .^QkuOXBҊ :_,!ZB`w*O @3OP{0UjVJd{{gY210CՋ+sղKH_Rq ;q=40Ɣxo NK:m:Ar=%;b]::?^%$Ș[Bm'-sKH81Oa |T̮ߛWI 7-/z'tAKƸ"R=ղ $2bzWX^V89À%++.@|oSHUr(6#$8 yɯ%Q[x?Z}l޼yA7t s@?.;E?Sg%$c[BT$%* #fc m#_oۡ:OMV@bj0Iy"ܨNd4v6Idh^99DFLEĞe8m6mڐ[n벍+%Y`SA՚$y%&,5O]S%fJ_oZ!.] >B1mk )FYB$2*Ӈ%k? ,!K(T|}L<Z2+m2xԚxS9DmkLa{=t"#zbd_ h H<$&!u<$ KɃ}>1 {`?x>Ώcl"cPk˖-x`9t+8Wvx烈@׶.EQ$:䖐|%$n_/Wz #t\"YX%S4D7T$Md{A`$Ǽxa2 bYJd#%2Vn3?[ΰQAX~@sZ s/HE~>S9ĽU#M6@ :^EQt ꇻx%cRhwֶ$D-ғD\I o8Z[B O#F,7FE"#0D"#J?T'2NuFb:N3(fea t6=T-K΋ ;,n6'8?yFM}׻޵W*L=&i,dİlZH nW \x7IHnL"E+A c$)qJ^j s\n~ɉ={w&YU}ou &A$@A&1F4la1jb~j$MEKbQEPgpAT}Gf:֭[[O~Un}ϩ9'`S`F03X^q60w;9lN-t13#c^`]jhtN~~rHu>2y&Y=Bj[%_&y/?}8~\tnNgC$O_,mqa$Zbx.I_!!DP2 6Sw# mg-&q&0F+Y^}{Z@D:o͜CsBcX+q,/Ll?B0XҷVfFwɟytkA%Av'3w( gkЕKsϯ9f_mue%:쥭\.?V(Y4*Sm+^&0Бld%#H-z1H%>C&ὣX,b49')sGQLr5p./D-X?55uRn='C>Vx #[TҬOYRϵm^&G;Ww ڈnec=Fraپt,;jΣ0ݶ_ǐs,ZJ2H~HIDG_1F3mWN+J-P, @\qjj9n+H*ڹQ'yzXо{Jz,v||\nɌlG_tFK$oJJeA؇Hn=+Y%s%!$eҥQۙ#7J@#n+w&+f~]&9"g>dp^CGN`ffSf/K=_(^13~Ò[/"yKGFF..JZp.VĝQdF!|РP2IPZL&wby նgyfattu!OYdnp'or׆j:E|U{uQ`_$5k7WKGVA9z-[!W*m~6TGHZ"0) ͎^~I+ I6ͦ(gW/51bKItIo ee>KЮ# 'yum ơf%ɷ8::N;myY}?ɏ=5rWiH|A7V};sG㏰x$$'FFF]QcmUI _ߏc> $5HvjDi~5/}r$2Uk%<_(~=|I~}j[EVw+..g<*6k8pV%!j/ $Ta MdrlA'2fJB :˱KBR%=)h'Dх`cek25˾ب_7tW mb#W~BG-/HSG2qfVu?gffKf:t^FQѷ>{ިT**J_p%WSʌ/ 3,!,}$&N`_8cǎ866ZN:z ķ[;33si2-_WB5_uzJ(YMu6+=39|&2f,0lin!<;R~ 5u}/95,C{n)\fo-m6sI+ $ϑj:DyOKcT}aᓥRѣ~;:::e˖k\5P/Rc/֩ε!J^* ɯ~^gI1~$K˟W*(5/JQt{M6/[n]ǂ81mP#%H$Ȕ!Z1SYz,P^LwZ;ӣϝvdds uDd:= y]&fڳ]r~.fX['#;sKj[68vfT )i !{K(T*~PTf[O}S(0$wC!OF|'&&3='%'J IM3LVfGCsem8%t=Xި51&9p( r)?L-3hGn oo3"ALHvtf0wvg+-N!II`],"yH扉4wMOO?'pPV;)eW pBcz2/('RVpEϏ2^bV8 !-bfߋ:I&'' [v}׻޵ԳE}Օo1Z~Q|Ծ|Nɣ>N}|X,+zُْ^% k Ic׏GJ2'cccB{ǯ~^[$/xOs;w8!EIn) iī6plIHcQVevrAn:mor,}V%}7N@K0ӱQkuct1Q"H t~Y熌a'3C@KIp2@T+JJ!$arr 1"Y@}{B#:$otĦlu=X*Έw묳ZJ57/o:P((VHʾguy=(uJs[O Ǎ}|lH|,GY"4啄5/eFDNrCyNFQ0ͼ@(u6he.e$$7Lw;Ο E6[tpj n3Knfd0u6 -u !qZ]]-kG4}h8pvjs7I89Gesxw$:7ӣ"9Z,1(z`ffe˖7<jsV Nn"m"zOdLMtMYo{4jn %MI>Z sd;}$JAwo\ȶH~+Ԡ{}ڴS{ۺS[e.;Y3 QG۞{p@^e:|şN^o|*U|z]`IG[%m`'py4$i=$-I$=I4ӫZ/CNg/O}BUB^%%ꃺvXگq #w>KfC!Jfٹm"[wh; x^_ϖc J-']w_=lF/%"y& fXc[S/orys$'YKFRItNRtwZ+vĿkzwRTE}Bi2^gmMI=  PpKflQ#,{ƒN6ɫC8_[IDAT`ϫ+g<0Y[6IKz kZ׶N/[KB֛=+"4! :ZQ7Rr,_ÿSŴZkvzY?z[tu2/`UzfVT878C ˼E.Iot^Lm^VLF[AN28]((~Oҗ%mB'9$sN8?W@IA_dz1=ڟRB4kI/iS|'o Lqk ~ϘҔJp LlZCy`=/t̙;\WKBD%!B璐f;HT}e8>o/f~ryj||$?$; Jje1E]4Eѿ^)Jrj'.;LSo_BEӅBa&=|mR;!I  *0Az|6I%jhhC~\W߭9ඓלWj7z#! 3$'\s1,!Y/{'::͝&[D*F-m#ӹ6p[Ȯf.B%5-'xM[%@YqYm Gefyhw¯FGGP퉩Ps1R7g rybogb].PǨ4>SBԄ$`l'y !|P( `\.Oe~`ŀu Ѷ{npIC$B249ἼFs n:W,@k b}Z?˞L6Ovη 7%=\T&MUNxLE|'8cYpQ޻U#g}BR B3GEfF5m!l,ڷeS{2?9ZԲ710Hۤh3_ {6+B!\wNLLL\x#8I~޴S[F#Ing $LLL,NVR*%[IWwky $"y[BV;<R_h;1l(Jj. pUca6$wh"`EWƯ~%YZEz95x8p޶V*΍=Osa@ҥF->G*B?q~FvC9Iң.]^|>BXmN\Q}$xϪCanw'aCF5m#j.I]MzS[~Ihx+n{`$e*̹#Xjvv9g?*ԜzEz=:;  x)$xI: P( wH$'m[nݒdU*xbK rGxܳ+ q{tI>IQ('qg^ET3$m_ [.:::zQ? ^ P/"4H=ĥ # `lБ3I[9+Z8τu{ωIϑoII: $_4rTGt Mx.J2pɀKQ-`̸3cB) @~O( LE^v&0oms@2SLlJ}|P_;21T*k{k֬. +H.,jgx6%-'7;6n'y(Gf[$MEQcbbbbdddYES<5^: ~tEţLUN+pSIEZo;-[IXl% RC~||E8"g 9>/BdYH Qp9`>~jI#'\7VDFIؼdI~U*#;½]tE 2`pl3fKxΕ9`^%!5 tFm[2w^F-uJGO ZʟdF;69ҵҊo[K-}B]Fs|~cZ(jL$b=8O_3W#̝r^2sIH1zG/^c-9+d[sI%QhC"2ׅ= olfݖ׃9j=sY(0[TNǑ lpy۾Byp{XfEQ4$i>!y[a5$S}un@Ƭ&2KB2?GCsY0o{m@'{eg<;afK3vrffP Od1ɱ΋tKڳ \GKA4z+$ǙxS33En4G%tuym:|oeCenXg[3;9tmK]h8hkگrffؙDfSF1u8Z8ߋcB:S;h霠\gr]駟I/E}T2;<"bf N=֫N9ر߹%!y׾Iy;W畀:ɿDFnV8 >g9Qrff9Ktvc[鉌 W#'gkNRMtii`m'+oMrff=0@1-\gB3;HZ3{?;k>4ofE)b=\- !A~:cqmrffݮA;[ޱ.^$VI R=`Q%\+ R($Cvt["GG-$mp[]WNYI_*gȺm1m0#ֺ[*Ex;IeTx %̯0-wHy"I$chhF7v޵5DƼCkPzHDhd~p{ķZEԺzvu'X,lN{9x3 /ӗ\J:htZ~j?iml_۱hz/pCtwg\{+RQK%!,՗Nq??bEO#~ΕxtqIw˙9`wJ0 ~v(&ҳklgF1cLL&xatU<;$ֽf3Xq': ! w5c$/u˙9`w^bQ 7;m"W&LgC⚤j،GQF0S_oR֬Y/ٺߏ;EQt[Cd<=LϺ$XŠ2N!>T_/y1p [MAN6L7S3h|4U@n3`Թҵ{n=33W6u*$#}B&%S\[̬7` z(|нsB{&qwZ1$T4)J1CHy<>na_CQH 'QNr\pO`?$p/H>P|ŷcGGBexBʋ_B'z9D~.ݗ- ڍRଡ଼ߓs-g_7x_y;XpC]SHxuxG8fIldƞZՎp,鍷{:;_$˺u<{vC/{P7-h^ͶaX7}~>'mVE'w_rmXAl$Mcvv"#:nir%3ŴflT'2*?FbVcK9]OYD}֭[txx&g8@o<( 'X#ulI_g{nK/6r&BR(Awdd=t`qm1lz1Mdz 7r_B/H0ok_.^$_mc E7X2@c- ju33yn:yx]Dn`{nȘ `RFZK0Y>C\咐]$@fCO -; (YӚ5ITm~'+^(TAɚ}MdvL95ݝ&9l0Z @ Md1{A\^uv?NFkU~?k!<+˓Rֹ (C.(x-of怽A+ N.pW:²paf'&2vn=%8gCҥ"uMt҆,b,Et4#IZۣڋ'$ screen.height: y_start = (height - screen.height) // 2 y_end = y_start + screen.height + 1 # Draw the stripe for the required region. for sy in range(y_start, y_end): try: y = int((screen.height - height) / 2) + sy image_y = int(sy * IMAGE_HEIGHT / height) char = self._frame[0][image_y][image_x] # Unicode images use . for background only pixels; ascii ones use space. if char not in (" ", "."): fg, attr, bg = self._frame[1][image_y][image_x] attr = 0 if attr is None else attr bg = 0 if bg is None else bg screen.print_at(char, x, y, fg, attr, bg) except IndexError: pass class Sprite(): """ Dynamically sized sprite. """ def __init__(self, state, x, y, images): self._state = state self.x, self.y = x, y self._images = images def next_frame(self): for image in self._images: image.next_frame() def draw_stripe(self, height, x, image_x): # Resize offset in image for the expected height of this stripe. self._images[self._state.mode % 2].draw_stripe( self._state.screen, height, x, int(image_x * IMAGE_HEIGHT / height)) class GameState(): """ Persistent state for this application. """ def __init__(self): self.player_angle = pi / 2 self.x, self.y = 1.5, 1.5 self.map = LEVEL_MAP self.mode = 0 self.show_mini_map = True self.images = {} self.sprites = [] self.screen = None def load_image(self, screen, filename): self.images[filename] = [None, None] self.images[filename][0] = Image(ColourImageFile(screen, filename, IMAGE_HEIGHT, uni=False)) self.images[filename][1] = Image(ColourImageFile(screen, filename, IMAGE_HEIGHT, uni=True)) def update_screen(self, screen): # Save off active screen. self.screen = screen # Images only need initializing once - they don't actually use the screen after construction. if len(self.images) <= 0: self.load_image(screen, "grumpy_cat.jpg") self.load_image(screen, "colour_globe.gif") self.load_image(screen, "wall.png") # Demo uses static sprites, so can reset every time now we have images loaded. self.sprites = [ Sprite(self, 3.5, 6.5, self.images["grumpy_cat.jpg"]), Sprite(self, 14.5, 11.5, self.images["colour_globe.gif"]), Sprite(self, 0, 0, self.images["wall.png"]) ] @property def map_x(self): return int(floor(self.x)) @property def map_y(self): return int(floor(self.y)) def safe_update_x(self, new_x): new_x += self.x if 0 <= self.y < len(self.map) and 0 <= new_x < len(self.map[0]): if self.map[self.map_y][int(floor(new_x))] == "X": return self.x = new_x def safe_update_y(self, new_y): new_y += self.y if 0 <= new_y < len(self.map) and 0 <= self.x < len(self.map[0]): if self.map[int(floor(new_y))][self.map_x] == "X": return self.y = new_y def safe_update_angle(self, new_angle): self.player_angle += new_angle if self.player_angle < 0: self.player_angle += 2 * pi if self.player_angle > 2 * pi: self.player_angle -= 2 * pi class MiniMap(Effect): """ Class to draw a small map based on the one stored in the GameState. """ # Translation from angle to map directions. _DIRECTIONS = [ (0, pi / 4, ">>"), (pi / 4, 3 * pi / 4, "vv"), (3 * pi / 4, 5 * pi / 4, "<<"), (5 * pi / 4, 7 * pi / 4, "^^") ] def __init__(self, screen, game_state, size=5): super(MiniMap, self).__init__(screen) self._state = game_state self._size = size self._x = self._screen.width - 2 * (self._size + 1) self._y = self._screen.height - (self._size + 1) def _update(self, _): # Draw the miniature map. for mx in range(self._size): for my in range(self._size): px = self._state.map_x + mx - self._size // 2 py = self._state.map_y + my - self._size // 2 if (0 <= py < len(self._state.map) and 0 <= px < len(self._state.map[0]) and self._state.map[py][px] != " "): colour = Screen.COLOUR_RED else: colour = Screen.COLOUR_BLACK self._screen.print_at(" ", self._x + 2 * mx, self._y + my, colour, bg=colour) # Draw the player text = ">>" for a, b, direction in self._DIRECTIONS: if a < self._state.player_angle <= b: text = direction break self._screen.print_at( text, self._x + self._size // 2 * 2, self._y + self._size // 2, Screen.COLOUR_GREEN) @property def frame_update_count(self): # No animation required. return 0 @property def stop_frame(self): # No specific end point for this Effect. Carry on running forever. return 0 def reset(self): # Nothing special to do. Just need this to satisfy the ABC. pass class RayCaster(Effect): """ Raycaster effect - will draw a 3D rendition of the map stored in the GameState. This class follows the logic from https://lodev.org/cgtutor/raycasting.html. """ # Textures to emulate h distance. _TEXTURES = "@&#$AHhwai;:. " def __init__(self, screen, game_state): super(RayCaster, self).__init__(screen) # Controls for rendering. # # Ideally we'd just use a field of vision (FOV) to represent the screen aspect ratio. However, this # looks wrong for very wide screens. So, limit to 4:1 aspect ratio, then calculate FOV. self.width = min(screen.height * 4, screen.width) self.FOV = self.width / screen.height / 4 # Remember game state for later. self._state = game_state # Set up raycasting sizes and colours self._block_size = screen.height // 3 if screen.colours >= 256: self._colours = [x for x in zip(range(255, 232, -1), [0] * 24, range(255, 232, -1))] else: self._colours = [(Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_WHITE) for _ in range(6)] self._colours.extend([(Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_WHITE) for _ in range(9)]) self._colours.extend([(Screen.COLOUR_BLACK, Screen.A_BOLD, Screen.COLOUR_BLACK) for _ in range(9)]) self._colours.append((Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_BLACK)) def _update(self, _): # First draw the background - which is theoretically the floor and ceiling. self._screen.clear_buffer(Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_BLACK) # Now do the ray casting across the visible canvas. # Compensate for aspect ratio by treating 2 cells as a single pixel. x_offset = int((self._screen.width - self.width ) // 2) last_side = None z_buffer = [999999 for _ in range(self.width + 1)] camera_x = cos(self._state.player_angle + pi / 2) * self.FOV camera_y = sin(self._state.player_angle + pi / 2) * self.FOV for sx in range(0, self.width, 2 - self._state.mode // 2): # Calculate the ray for this vertical slice. camera_segment = 2 * sx / self.width - 1 ray_x = cos(self._state.player_angle) + camera_x * camera_segment ray_y = sin(self._state.player_angle) + camera_y * camera_segment # Representation of the ray within our map map_x = self._state.map_x map_y = self._state.map_y hit = False hit_side = False # Logical length along the ray from one x or y-side to next x or y-side try: ratio_to_x = abs(1 / ray_x) except ZeroDivisionError: ratio_to_x = 999999 try: ratio_to_y = abs(1 / ray_y) except ZeroDivisionError: ratio_to_y = 999999 # Calculate block step direction and initial partial step to the next side (on same # logical scale as the previous ratios). step_x = int(copysign(1, ray_x)) step_y = int(copysign(1, ray_y)) side_x = (self._state.x - map_x) if ray_x < 0 else (map_x + 1.0 - self._state.x) side_x *= ratio_to_x side_y = (self._state.y - map_y) if ray_y < 0 else (map_y + 1.0 - self._state.y) side_y *= ratio_to_y # Give up if we'll never intersect the map while (((step_x < 0 and map_x >= 0) or (step_x > 0 and map_x < len(self._state.map[0]))) and ((step_y < 0 and map_y >= 0) or (step_y > 0 and map_y < len(self._state.map)))): # Move along the ray to the next nearest side (measured in distance along the ray). if side_x < side_y: side_x += ratio_to_x map_x += step_x hit_side = False else: side_y += ratio_to_y map_y += step_y hit_side = True # Check whether the ray has now hit a wall. if 0 <= map_x < len(self._state.map[0]) and 0 <= map_y < len(self._state.map): if self._state.map[map_y][map_x] == "X": hit = True break # Draw wall if needed. if hit: # Figure out textures and colours to use based on the distance to the wall. if hit_side: dist = (map_y - self._state.y + (1 - step_y) / 2) / ray_y else: dist = (map_x - self._state.x + (1 - step_x) / 2) / ray_x z_buffer[sx], z_buffer[sx + 1] = dist, dist # Are we drawing block colours or ray traced walls? if self._state.mode < 2: # Simple block colours - get height and text attributes wall = min(self._screen.height, int(self._screen.height / dist)) colour, attr, bg = self._colours[min(len(self._colours) - 1, int(3 * dist))] text = self._TEXTURES[min(len(self._TEXTURES) - 1, int(2 * dist))] # Now draw the wall segment for sy in range(wall): self._screen.print_at( text * 2, x_offset + sx, (self._screen.height - wall) // 2 + sy, colour, attr, bg=0 if self._state.mode == 0 else bg) else: # Ray casting - get wall texture image = self._state.images["wall.png"][self._state.mode % 2] # Get texture height and stripe offset bearing in mind pixels are 1x2 aspect ratio. wall = int(self._screen.height / dist) if hit_side: wall_x = self._state.x + dist * ray_x; else: wall_x = self._state.y + dist * ray_y; wall_x -= int(wall_x); texture_x = int(wall_x * IMAGE_HEIGHT * 2); if (not hit_side) and ray_x > 0: texture_x = IMAGE_HEIGHT * 2 - texture_x - 1; if hit_side and ray_y < 0: texture_x = IMAGE_HEIGHT * 2 - texture_x - 1; # Now draw it image.next_frame() image.draw_stripe(self._screen, wall, x_offset + sx, texture_x) # Draw a line when we change surfaces to help make it easier to see the 3d effect if hit_side != last_side: last_side = hit_side for sy in range(wall): self._screen.print_at("|", x_offset + sx, (self._screen.height - wall) // 2 + sy, 0, bg=0) # Now draw sprites ray_x = cos(self._state.player_angle) ray_y = sin(self._state.player_angle) for sprite in self._state.sprites: # Translate sprite position to relative to camera sprite_x = sprite.x - self._state.x sprite_y = sprite.y - self._state.y inv_det = 1.0 / (camera_x * ray_y - ray_x * camera_y) transform_x = inv_det * (ray_y * sprite_x - ray_x * sprite_y); transform_y = inv_det * (-camera_y * sprite_x + camera_x * sprite_y) # Sprite location on camera plane. sprite_screen_x = int((self.width / 2) * (1 + transform_x / transform_y)); # Calculate height (and width) of the sprite on screen sprite_height = abs(int(self._screen.height / (transform_y))) # Don't bother if behind the viewing plane (or too big to render). if transform_y > 0: # Update for animation sprite.next_frame() # Loop through every vertical stripe of the sprite on screen start = max(0, sprite_screen_x - sprite_height) end = min(self.width, sprite_screen_x + sprite_height) for stripe in range(start, end): if stripe > 0 and stripe < self.width and transform_y < z_buffer[stripe]: texture_x = int(stripe - (-sprite_height + sprite_screen_x) * sprite_height / sprite_height) sprite.draw_stripe(sprite_height, x_offset + stripe, texture_x) @property def frame_update_count(self): # Animation required - every other frame should be OK for demo. return 2 @property def stop_frame(self): # No specific end point for this Effect. Carry on running forever. return 0 def reset(self): # Nothing special to do. Just need this to satisfy the ABC. pass class GameController(Scene): """ Scene to control the combined Effects for the demo. This class handles the user input, updating the game state and updating required Effects as needed. Drawing of the Scene is then handled in the usual way. """ def __init__(self, screen, game_state): # Standard setup for every screen. self._screen = screen self._state = game_state self._mini_map = MiniMap(screen, self._state, self._screen.height // 4) effects = [ RayCaster(screen, self._state) ] super(GameController, self).__init__(effects, -1) # Add minimap if required. if self._state.show_mini_map: self.add_effect(self._mini_map) def process_event(self, event): # Allow standard event processing first if super(GameController, self).process_event(event) is None: return # If that didn't handle it, check for a key that this demo understands. if isinstance(event, KeyboardEvent): c = event.key_code if c in (ord("x"), ord("X")): raise StopApplication("User exit") elif c in (ord("a"), Screen.KEY_LEFT): self._state.safe_update_angle(-pi / 45) elif c in (ord("d"), Screen.KEY_RIGHT): self._state.safe_update_angle(pi / 45) elif c in (ord("w"), Screen.KEY_UP): self._state.safe_update_x(cos(self._state.player_angle) / 5) self._state.safe_update_y(sin(self._state.player_angle) / 5) elif c in (ord("s"), Screen.KEY_DOWN): self._state.safe_update_x(-cos(self._state.player_angle) / 5) self._state.safe_update_y(-sin(self._state.player_angle) / 5) elif c in (ord("1"), ord("2"), ord("3"), ord("4")): self._state.mode = c - ord("1") elif c in (ord("m"), ord("M")): self._state.show_mini_map = not self._state.show_mini_map if self._state.show_mini_map: self.add_effect(self._mini_map) else: self.remove_effect(self._mini_map) elif c in (ord("h"), ord("H")): self.add_effect(PopUpDialog(self._screen, HELP, ["OK"])) else: # Not a recognised key - pass on to other handlers. return event else: # Ignore other types of events. return event def demo(screen, game_state): game_state.update_screen(screen) screen.play([GameController(screen, game_state)], stop_on_resize=True) if __name__ == "__main__": game_state = GameState() while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[game_state]) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/rendering.py000077500000000000000000000031131511423144500214020ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.renderers import BarChart from asciimatics.screen import Screen import sys import math import time from random import randint def fn(): return randint(0, 40) def wv(x): return lambda: 1 + math.sin(math.pi * (2*time.time()+x) / 5) def demo(): chart = BarChart(10, 40, [fn, fn], char="=", gradient=[(20, Screen.COLOUR_GREEN), (30, Screen.COLOUR_YELLOW), (40, Screen.COLOUR_RED)]) print(chart) chart = BarChart(13, 60, [wv(1), wv(2), wv(3), wv(4), wv(5), wv(7), wv(8), wv(9)], colour=Screen.COLOUR_GREEN, axes=BarChart.BOTH, scale=2.0) print(chart) chart = BarChart(7, 60, [lambda: time.time() * 10 % 101], gradient=[(10, 234), (20, 236), (30, 238), (40, 240), (50, 242), (60, 244), (70, 246), (80, 248), (90, 250), (100, 252)], char=">", scale=100.0, labels=True, axes=BarChart.X_AXIS) print(chart) chart = BarChart(10, 60, [wv(1), wv(2), wv(3), wv(4), wv(5), wv(7), wv(8), wv(9)], colour=[c for c in range(1, 8)], scale=2.0, axes=BarChart.X_AXIS, intervals=0.5, labels=True, border=False) print(chart) demo() sys.exit(0) python-asciimatics-1.15.0/samples/simple.py000077500000000000000000000011201511423144500207120ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Cycle, Stars from asciimatics.renderers import FigletText from asciimatics.scene import Scene from asciimatics.screen import Screen def demo(screen): effects = [ Cycle( screen, FigletText("ASCIIMATICS", font='big'), screen.height // 2 - 8), Cycle( screen, FigletText("ROCKS!", font='big'), screen.height // 2 + 3), Stars(screen, (screen.width + screen.height) // 2) ] screen.play([Scene(effects, 500)]) Screen.wrapper(demo) python-asciimatics-1.15.0/samples/tab_demo.py000066400000000000000000000067471511423144500212140ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.widgets import Frame, Layout, Divider, Button from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError, NextScene, StopApplication import sys class TabButtons(Layout): def __init__(self, frame, active_tab_idx): cols = [1, 1, 1, 1, 1] super().__init__(cols) self._frame = frame for i,_ in enumerate(cols): self.add_widget(Divider(), i) btns = [Button("Btn1", self._on_click_1), Button("Btn2", self._on_click_2), Button("Btn3", self._on_click_3), Button("Btn4", self._on_click_4), Button("Quit", self._on_click_Q)] for i, btn in enumerate(btns): self.add_widget(btn, i) btns[active_tab_idx].disabled = True def _on_click_1(self): raise NextScene("Tab1") def _on_click_2(self): raise NextScene("Tab2") def _on_click_3(self): raise NextScene("Tab3") def _on_click_4(self): raise NextScene("Tab4") def _on_click_Q(self): raise StopApplication("Quit") class RootPage(Frame): def __init__(self, screen): super().__init__(screen, screen.height, screen.width, can_scroll=False, title="Root Page") layout1 = Layout([1], fill_frame=True) self.add_layout(layout1) # add your widgets here layout2 = TabButtons(self, 0) self.add_layout(layout2) self.fix() class AlphaPage(Frame): def __init__(self, screen): super().__init__(screen, screen.height, screen.width, can_scroll=False, title="Alpha Page") layout1 = Layout([1], fill_frame=True) self.add_layout(layout1) # add your widgets here layout2 = TabButtons(self, 1) self.add_layout(layout2) self.fix() class BravoPage(Frame): def __init__(self, screen): super().__init__(screen, screen.height, screen.width, can_scroll=False, title="Bravo Page") layout1 = Layout([1], fill_frame=True) self.add_layout(layout1) # add your widgets here layout2 = TabButtons(self, 2) self.add_layout(layout2) self.fix() class CharliePage(Frame): def __init__(self, screen): super().__init__(screen, screen.height, screen.width, can_scroll=False, title="Charlie Page") layout1 = Layout([1], fill_frame=True) self.add_layout(layout1) # add your widgets here layout2 = TabButtons(self, 3) self.add_layout(layout2) self.fix() def demo(screen, scene): scenes = [ Scene([RootPage(screen)], -1, name="Tab1"), Scene([AlphaPage(screen)], -1, name="Tab2"), Scene([BravoPage(screen)], -1, name="Tab3"), Scene([CharliePage(screen)], -1, name="Tab4"), ] screen.play(scenes, stop_on_resize=True, start_scene=scene, allow_int=True) last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=True, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/terminal.py000077500000000000000000000254221511423144500212470ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.widgets import Frame, Layout, Widget from asciimatics.effects import Background from asciimatics.scene import Scene from asciimatics.screen import Screen, Canvas from asciimatics.exceptions import ResizeScreenError, StopApplication from asciimatics.parsers import AnsiTerminalParser, Parser from asciimatics.event import KeyboardEvent import sys import subprocess import threading try: import select import pty import os import fcntl import curses import struct import termios except Exception: print("This demo only runs on Unix systems.") sys.exit(0) class Terminal(Widget): """ Widget to handle ansi terminals running a bash shell. The widget will start a bash shell in the background and use a pseudo TTY to control it. It then starts a thread to transfer any data between the two processes (the one running this widget and the bash shell). """ def __init__(self, name, height): super(Terminal, self).__init__(name) self._required_height = height self._parser = AnsiTerminalParser() self._canvas = None self._current_colours = None self._cursor_x, self._cursor_y = 0, 0 self._show_cursor = True # Supported key mappings self._map = {} for k, v in [ (Screen.KEY_LEFT, "kcub1"), (Screen.KEY_RIGHT, "kcuf1"), (Screen.KEY_UP, "kcuu1"), (Screen.KEY_DOWN, "kcud1"), (Screen.KEY_PAGE_UP, "kpp"), (Screen.KEY_PAGE_DOWN, "knp"), (Screen.KEY_HOME, "khome"), (Screen.KEY_END, "kend"), (Screen.KEY_DELETE, "kdch1"), (Screen.KEY_BACK, "kbs"), ]: self._map[k] = curses.tigetstr(v) self._map[Screen.KEY_TAB] = "\t".encode() # Open a pseudo TTY to control the interactive session. Make it non-blocking. self._master, self._slave = pty.openpty() fl = fcntl.fcntl(self._master, fcntl.F_GETFL) fcntl.fcntl(self._master, fcntl.F_SETFL, fl | os.O_NONBLOCK) # Start the shell and thread to pull data from it. self._shell = subprocess.Popen( ["bash", "-i"], preexec_fn=os.setsid, stdin=self._slave, stdout=self._slave, stderr=self._slave) self._lock = threading.Lock() self._thread = threading.Thread(target=self._background) self._thread.daemon = True self._thread.start() def set_layout(self, x, y, offset, w, h): """ Resize the widget (and underlying TTY) to the required size. """ super(Terminal, self).set_layout(x, y, offset, w, h) self._canvas = Canvas(self._frame.canvas, h, w, x=x, y=y) winsize = struct.pack("HHHH", h, w, 0, 0) fcntl.ioctl(self._slave, termios.TIOCSWINSZ, winsize) def update(self, frame_no): """ Draw the current terminal content to screen. """ if self._shell.poll() is not None: raise StopApplication("Process ended") # Don't allow background thread to update values mid screen refresh. with self._lock: # Push current terminal output to screen. self._canvas.refresh() # Draw cursor if needed. if frame_no % 10 < 5 and self._show_cursor: origin = self._canvas.origin x = self._cursor_x + origin[0] y = self._cursor_y + origin[1] - self._canvas.start_line details = self._canvas.get_from(self._cursor_x, self._cursor_y) if details: char, colour, attr, bg = details attr |= Screen.A_REVERSE self._frame.canvas.print_at(chr(char), x, y, colour, attr, bg) def process_event(self, event): """ Pass any recognised input on to the TTY. """ if isinstance(event, KeyboardEvent): if event.key_code > 0: os.write(self._master, chr(event.key_code).encode()) return elif event.key_code in self._map: os.write(self._master, self._map[event.key_code]) return return event def _add_stream(self, value): """ Process any output from the TTY. """ lines = value.split("\n") for i, line in enumerate(lines): self._parser.reset(line, self._current_colours) for offset, command, params in self._parser.parse(): if command == Parser.DISPLAY_TEXT: # Just display the text... allowing for line wrapping. if self._cursor_x + len(params) > self._w: part_1 = params[:self._w - self._cursor_x] part_2 = params[self._w - self._cursor_x:] self._print_at(part_1, self._cursor_x, self._cursor_y) self._print_at(part_2, 0, self._cursor_y + 1) self._cursor_x = len(part_2) self._cursor_y += 1 if self._cursor_y - self._canvas.start_line >= self._h: self._canvas.scroll() else: self._print_at(params, self._cursor_x, self._cursor_y) self._cursor_x += len(params) elif command == Parser.CHANGE_COLOURS: # Change current text colours. self._current_colours = params elif command == Parser.NEXT_TAB: # Move to next tab stop - hard-coded to default of 8 characters. self._cursor_x = (self._cursor_x // 8) * 8 + 8 elif command == Parser.MOVE_RELATIVE: # Move cursor relative to current position. self._cursor_x += params[0] self._cursor_y += params[1] if self._cursor_y < self._canvas.start_line: self._canvas.scroll(self._cursor_y - self._canvas.start_line) elif command == Parser.MOVE_ABSOLUTE: # Move cursor relative to specified absolute position. if params[0] is not None: self._cursor_x = params[0] if params[1] is not None: self._cursor_y = params[1] + self._canvas.start_line elif command == Parser.DELETE_LINE: # Delete some/all of the current line. if params == 0: self._print_at(" " * (self._w - self._cursor_x), self._cursor_x, self._cursor_y) elif params == 1: self._print_at(" " * self._cursor_x, 0, self._cursor_y) elif params == 2: self._print_at(" " * self._w, 0, self._cursor_y) elif command == Parser.DELETE_CHARS: # Delete n characters under the cursor. for x in range(self._cursor_x, self._w): if x + params < self._w: cell = self._canvas.get_from(x + params, self._cursor_y) else: cell = (ord(" "), self._current_colours[0], self._current_colours[1], self._current_colours[2]) self._canvas.print_at( chr(cell[0]), x, self._cursor_y, colour=cell[1], attr=cell[2], bg=cell[3]) elif command == Parser.SHOW_CURSOR: # Show/hide the cursor. self._show_cursor = params elif command == Parser.CLEAR_SCREEN: # Clear the screen. self._canvas.clear_buffer( self._current_colours[0], self._current_colours[1], self._current_colours[2]) # Move to next line, scrolling buffer as needed. if i != len(lines) - 1: self._cursor_x = 0 self._cursor_y += 1 if self._cursor_y - self._canvas.start_line >= self._h: self._canvas.scroll() def _print_at(self, text, x, y): """ Helper function to simplify use of the canvas. """ self._canvas.print_at( text, x, y, colour=self._current_colours[0], attr=self._current_colours[1], bg=self._current_colours[2]) def _background(self): """ Backround thread running the IO between the widget and the TTY session. """ while True: ready, _, _ = select.select([self._master], [], []) for stream in ready: value = "" while True: try: data = os.read(stream, 102400) data = data.decode("utf8", "replace") value += data # Python 2 and 3 raise different exceptions when they would block except Exception: with self._lock: self._add_stream(value) self._frame.screen.force_update() break def reset(self): """ Reset the widget to a blank screen. """ self._canvas = Canvas(self._frame.canvas, self._h, self._w, x=self._x, y=self._y) self._cursor_x, self._cursor_y = 0, 0 self._current_colours = (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK) def required_height(self, offset, width): """ Required height for the terminal. """ return self._required_height @property def frame_update_count(self): """ Frame update rate required. """ # Force refresh for cursor. return 5 @property def value(self): """ Terminal value - not needed for demo. """ return @value.setter def value(self, new_value): return class DemoFrame(Frame): def __init__(self, screen): super(DemoFrame, self).__init__(screen, screen.height, screen.width) # Create the widgets for the demo. layout = Layout([100], fill_frame=True) self.add_layout(layout) layout.add_widget(Terminal("term", Widget.FILL_FRAME)) self.fix() self.set_theme("monochrome") def demo(screen, scene): screen.play([ Scene([ Background(screen), DemoFrame(screen) ], -1) ], stop_on_resize=True, start_scene=scene, allow_int=True) last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/test.rec000066400000000000000000000714051511423144500205330ustar00rootroot00000000000000{"version": 2, "width": 134, "height": 18, "timestamp": 1621173258, "env": {"SHELL": "/data/data/com.termux/files/usr/bin/bash", "TERM": "xterm-256color"}} [0.019859, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [1.250708, "o", "l"] [1.712982, "o", "s"] [2.399548, "o", "\r\n\u001b[?2004l\r"] [2.419356, "o", "\u001b[0m\u001b[01;32m256colour.py\u001b[0m colour_globe.gif \u001b[01;32mfireworks.py\u001b[0m\t \u001b[01;32mimages.py\u001b[0m\t \u001b[01;34mmapscache\u001b[0m\t\u001b[01;32mplasma.py\u001b[0m\t\u001b[01;32mrendering.py\u001b[0m test2.rec\r\n\u001b[01;32mbars.py\u001b[0m \u001b[01;32mcontact_list.py\u001b[0m\t forms.log\t \u001b[01;32minteractive.py\u001b[0m \u001b[01;32mnoise.py\u001b[0m\t\u001b[01;32mplayer.py\u001b[0m\t\u001b[01;32msimple.py\u001b[0m tests.py\r\n\u001b[01;32mbasics.py\u001b[0m \u001b[01;32mcredits.py\u001b[0m\t \u001b[01;32mforms.py\u001b[0m\t \u001b[01;32mjulia.py\u001b[0m\t pacman.png\tpython.png\ttab_demo.py \u001b[01;32mtop.py\u001b[0m\r\n\u001b[01;32mbg_colours.py\u001b[0m \u001b[01;32mexperimental.py\u001b[0m\t globe.gif\t \u001b[01;32mkaleidoscope.py\u001b[0m \u001b[01;32mpacman.py\u001b[0m\t\u001b[01;32mquick_model.py\u001b[0m\t\u001b[01;32mterminal.py\u001b[0m \u001b[01;32mtreeview.py\u001b[0m\r\n\u001b[01;32mcogs.py\u001b[0m \u001b[01;32mfire.py\u001b[0m\t\t grumpy_cat.jpg \u001b[01;32mmaps.py\u001b[0m\t \u001b[01;32mparticles.py\u001b[0m\t\u001b[01;32mray_casting.py\u001b[0m\ttest.rec \u001b[01;32mxmas.py\u001b[0m\r\n"] [2.420405, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [3.291134, "o", "p"] [3.723948, "o", "w"] [4.089975, "o", "d"] [4.339859, "o", "\r\n\u001b[?2004l\r/data/data/com.termux/files/home/asciimatics/samples\r\n\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [5.75625, "o", "m"] [6.114739, "o", "a"] [6.215725, "o", "n"] [6.474956, "o", " "] [6.757042, "o", "m"] [6.964953, "o", "a"] [7.066012, "o", "n"] [7.725575, "o", "\r\n\u001b[?2004l\r"] [7.753202, "o", "\u001b[?1049h\u001b[22;0;0t\u001b[?1h\u001b=\rMAN(1) General Commands Manual MAN(1)\r\n\r\n\u001b[1mNAME\u001b[0m\r\n \u001b[1mman\u001b[0m - display manual pages\r\n\r\n\u001b[1mSYNOPSIS\u001b[0m\r\n \u001b[1mman\u001b[0m [\u001b[1m-acfhklw\u001b[0m] [\u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m] [\u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-m\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-S\u001b[0m \u001b[4msubsection\u001b[24m]\r\n"] [7.753587, "o", " [[\u001b[1m-s\u001b[0m] \u001b[4msection\u001b[24m] \u001b[4mname\u001b[24m \u001b[4m...\u001b[24m\r\n\r\n\u001b[1mDESCRIPTION\u001b[0m\r\n The \u001b[1mman\u001b[0m utility displays the manual pages entitled \u001b[4mname\u001b[24m. Pages may be\r\n selected according to a specific category (\u001b[4msection\u001b[24m) or machine\r\n architecture (\u001b[4msubsection\u001b[24m).\r\n\r\n The options are as follows:\r\n\r\n \u001b[1m-a\u001b[0m Display all matching manual pages. Normally, only the first page\r\n\u001b[7m/data/data/com.termux/files/usr/tmp/man.kqC5sqeeyc\u001b[27m\u001b[K"] [9.701868, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"] [9.702787, "o", " found is displayed.\r\n:\u001b[K"] [9.780307, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [9.861673, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m\r\n:\u001b[K"] [9.942769, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K Use the specified \u001b[4mfile\u001b[24m instead of the default configuration file.\r\n:\u001b[K"] [10.021966, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K This permits users to configure their own manual environment.\r\n:\u001b[K"] [10.103063, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K See man.conf(5) for a description of the contents of this file.\r\n:\u001b[K"] [10.18515, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [10.264708, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-c\u001b[0m Copy the manual page to the standard output instead of using\r\n:\u001b[K"] [10.347327, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K more(1) to paginate it. This is done by default if the standard\r\n:\u001b[K"] [10.427565, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K output is not a terminal device.\r\n:\u001b[K"] [10.509204, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [10.587453, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K When using \u001b[1m-c\u001b[0m, most terminal devices are unable to show the\r\n:\u001b[K"] [10.670466, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K markup. To print the output of \u001b[1mman\u001b[0m to the terminal with markup\r\n:\u001b[K"] [10.749388, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K but without using a pager, pipe it to ul(1). To remove the\r\n:\u001b[K"] [10.828832, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K markup, pipe the output to col(1) \u001b[1m-b\u001b[0m instead.\r\n:\u001b[K"] [10.910584, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [10.991994, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-f\u001b[0m A synonym for whatis(1). It searches for \u001b[4mname\u001b[24m in manual page\r\n:\u001b[K"] [11.0726, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K names and displays the header lines from all matching pages. The\r\n:\u001b[K"] [11.151735, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K search is case insensitive and matches whole words only.\r\n:\u001b[K"] [11.234139, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [11.314078, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-h\u001b[0m Display only the SYNOPSIS lines of the requested manual pages.\r\n:\u001b[K"] [11.398806, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K Implies \u001b[1m-a\u001b[0m and \u001b[1m-c\u001b[0m.\r\n:\u001b[K"] [11.476523, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [11.557542, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-k\u001b[0m A synonym for apropos(1). Instead of \u001b[4mname\u001b[24m, an expression can be\r\n:\u001b[K"] [11.63895, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K provided using the syntax described in the apropos(1) manual. By\r\n:\u001b[K"] [11.719532, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K default, it displays the header lines of all matching pages.\r\n:\u001b[K"] [11.799522, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [11.880865, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-l\u001b[0m A synonym for mandoc(1). The \u001b[4mname\u001b[24m arguments are interpreted as\r\n:\u001b[K"] [11.963442, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K filenames. No search is done and \u001b[4mfile\u001b[24m, \u001b[4mpath\u001b[24m, \u001b[4msection\u001b[24m,\r\n:\u001b[K"] [12.044153, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[4msubsection\u001b[24m, and \u001b[1m-w\u001b[0m are ignored. This option implies \u001b[1m-a\u001b[0m.\r\n:\u001b[K"] [12.125334, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [12.205019, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m\r\n:\u001b[K"] [12.285408, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K Override the list of standard directories which \u001b[1mman\u001b[0m searches for\r\n:\u001b[K"] [12.366733, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K manual pages. The supplied \u001b[4mpath\u001b[24m must be a colon (`:') separated\r\n:\u001b[K"] [12.445534, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K list of directories. This search path may also be set using the\r\n:\u001b[K"] [12.526631, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K environment variable MANPATH.\r\n:\u001b[K"] [12.610492, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [13.803836, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [13.883987, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM search is case insensitive and matches whole words only.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [13.964723, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM names and displays the header lines from all matching pages. The\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.045606, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-f\u001b[0m A synonym for whatis(1). It searches for \u001b[4mname\u001b[24m in manual page\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.124753, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.204879, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM markup, pipe the output to col(1) \u001b[1m-b\u001b[0m instead.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.28782, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM but without using a pager, pipe it to ul(1). To remove the\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.369442, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM markup. To print the output of \u001b[1mman\u001b[0m to the terminal with markup\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.450291, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM When using \u001b[1m-c\u001b[0m, most terminal devices are unable to show the\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.530452, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.611802, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM output is not a terminal device.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.692119, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM more(1) to paginate it. This is done by default if the standard\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.772232, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-c\u001b[0m Copy the manual page to the standard output instead of using\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.853491, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.934578, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM See man.conf(5) for a description of the contents of this file.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.015897, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM This permits users to configure their own manual environment.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.093496, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM Use the specified \u001b[4mfile\u001b[24m instead of the default configuration file.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.174149, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.254275, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.33536, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM found is displayed.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.417012, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-a\u001b[0m Display all matching manual pages. Normally, only the first page\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.499824, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.581504, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM The options are as follows:\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.658728, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.740908, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM architecture (\u001b[4msubsection\u001b[24m).\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.82092, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM selected according to a specific category (\u001b[4msection\u001b[24m) or machine\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.89982, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM The \u001b[1mman\u001b[0m utility displays the manual pages entitled \u001b[4mname\u001b[24m. Pages may be\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.978964, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K"] [15.979826, "o", "\u001b[H\u001bM\u001b[1mDESCRIPTION\u001b[0m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.063722, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.141131, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM [[\u001b[1m-s\u001b[0m] \u001b[4msection\u001b[24m] \u001b[4mname\u001b[24m \u001b[4m...\u001b[24m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.222417, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1mman\u001b[0m [\u001b[1m-acfhklw\u001b[0m] [\u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m] [\u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-m\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-S\u001b[0m \u001b[4msubsection\u001b[24m]\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.301378, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\u001b[1mSYNOPSIS\u001b[0m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.381868, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.463502, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1mman\u001b[0m - display manual pages\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.546415, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\u001b[1mNAME\u001b[0m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.624787, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.706582, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bMMAN(1) General Commands Manual MAN(1)\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.788295, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [16.870117, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [16.948122, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [17.030957, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [17.112315, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [17.193514, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [18.346965, "o", "\r\u001b[K found is displayed.\r\n\r\n \u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m\r\n Use the specified \u001b[4mfile\u001b[24m instead of the default configuration file.\r\n This permits users to configure their own manual environment.\r\n See man.conf(5) for a description of the contents of this file.\r\n\r\n \u001b[1m-c\u001b[0m Copy the manual page to the standard output instead of using\r\n more(1) to paginate it. This is done by default if the standard\r\n output is not a terminal device.\r\n\r\n When using \u001b[1m-c\u001b[0m, most terminal devices are unable to show the\r\n markup. To print the output of \u001b[1mman\u001b[0m to the terminal with markup\r\n but without using a pager, pipe it to ul(1). To remove the\r\n markup, pipe the output to col(1) \u001b[1m-b\u001b[0m instead.\r\n\r\n \u001b[1m-f\u001b[0m A synonym for whatis(1). It searches for \u001b[4mname\u001b[24m in manual page\r\n:\u001b[K"] [18.714415, "o", "\r\u001b[K names and displays the header lines from all matching pages. The\r\n search is case insensitive and matches whole words only.\r\n\r\n \u001b[1m-h\u001b[0m Display only the SYNOPSIS lines of the requested manual pages.\r\n Implies \u001b[1m-a\u001b[0m and \u001b[1m-c\u001b[0m.\r\n\r\n \u001b[1m-k\u001b[0m A synonym for apropos(1). Instead of \u001b[4mname\u001b[24m, an expression can be\r\n provided using the syntax described in the apropos(1) manual. By\r\n default, it displays the header lines of all matching pages.\r\n\r\n \u001b[1m-l\u001b[0m A synonym for mandoc(1). The \u001b[4mname\u001b[24m arguments are interpreted as\r\n filenames. No search is done and \u001b[4mfile\u001b[24m, \u001b[4mpath\u001b[24m, \u001b[4msection\u001b[24m,\r\n \u001b[4msubsection\u001b[24m, and \u001b[1m-w\u001b[0m are ignored. This option implies \u001b[1m-a\u001b[0m.\r\n\r\n \u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m\r\n Override the list of standard directories which \u001b[1mman\u001b[0m searches for\r\n manual pages. The supplied \u001b[4mpath\u001b[24m must be a colon "] [18.71458, "o", "(`:') separated\r\n:\u001b[K"] [19.155672, "o", "\r\u001b[K list of directories. This search path may also be set using the\r\n environment variable MANPATH.\r\n\r\n \u001b[1m-m\u001b[0m \u001b[4mpath\u001b[24m\r\n Augment the list of standard directories which \u001b[1mman\u001b[0m searches for\r\n manual pages. The supplied \u001b[4mpath\u001b[24m must be a colon (`:') separated\r\n list of directories. These directories will be searched before\r\n the standard directories or the directories specified using the\r\n \u001b[1m-M\u001b[0m option or the MANPATH environment variable.\r\n\r\n \u001b[1m-S\u001b[0m \u001b[4msubsection\u001b[24m\r\n Only show pages for the specified machine(1) architecture.\r\n \u001b[4msubsection\u001b[24m is case insensitive.\r\n\r\n By default manual pages for all architectures are installed.\r\n Therefore this option can be used to view pages for one\r\n architecture whilst using another.\r\n:\u001b[K"] [19.707572, "o", "\r\u001b[K\r\n This option overrides the MACHINE environment variable.\r\n\r\n [\u001b[1m-s\u001b[0m] \u001b[4msection\u001b[24m\r\n Only select manuals from the specified \u001b[4msection\u001b[24m. The currently\r\n available sections are:\r\n\r\n 1 General commands (tools and utilities).\r\n 2 System calls and error numbers.\r\n 3 Library functions.\r\n 3p perl(1) programmer's reference guide.\r\n 4 Device drivers.\r\n 5 File formats.\r\n 6 Games.\r\n 7 Miscellaneous information.\r\n 8 System maintenance and operation commands.\r\n 9 Kernel internals.\r\n:\u001b[K"] [20.156555, "o", "\r\u001b[K\r\n If not specified and a match is found in more than one section,\r\n the first match is selected from the following list: 1, 8, 6, 2,\r\n 3, 5, 7, 4, 9, 3p.\r\n\r\n \u001b[1m-w\u001b[0m List the pathnames of all matching manual pages instead of\r\n displaying any of them.\r\n\r\n The options \u001b[1m-IKOTW\u001b[0m are also supported and are documented in mandoc(1).\r\n The options \u001b[1m-fkl\u001b[0m are mutually exclusive and override each other.\r\n\r\n Guidelines for writing man pages can be found in mdoc(7).\r\n\r\n The mandoc.db(5) database is used for looking up manual page entries. In\r\n cases where the database is absent, outdated, or corrupt, \u001b[1mman\u001b[0m falls back\r\n to looking for files called \u001b[4mname\u001b[24m.\u001b[4msection\u001b[24m. If both a formatted and an\r\n unformatted version of the same manual page, for example \u001b[4mcat1/foo.0\u001b[24m and\r\n:\u001b[K"] [20.574445, "o", "\r\u001b[K"] [20.574631, "o", " \u001b[4mman1/foo.1\u001b[24m, exist in the same directory, only the unformatted version is\r\n used. The database is kept up to date with makewhatis(8), which is run\r\n by the weekly(8) maintenance script.\r\n\r\n\u001b[1mENVIRONMENT\u001b[0m\r\n MACHINE As some manual pages are intended only for specific\r\n architectures, \u001b[1mman\u001b[0m searches any subdirectories, with the same\r\n name as the current architecture, in every directory which it\r\n searches. Machine specific areas are checked before general\r\n areas. The current machine type may be overridden by setting\r\n the environment variable MACHINE to the name of a specific\r\n architecture, or with the \u001b[1m-S\u001b[0m option. MACHINE is case\r\n insensitive.\r\n\r\n MANPAGER Any non-empty value of the environment variable MANPAGER is\r\n used instead of the standard pagination program, more(1). If\r\n less(1) is used, the interactive \u001b[1m:t\u001b[0m command "] [20.5747, "o", "can be used to go\r\n:\u001b[K"] [21.015069, "o", "\r\u001b[K to the definitions of various terms, for example command line\r\n options, command modifiers, internal commands, environment\r\n variables, function names, preprocessor macros, errno(2)\r\n values, and some other emphasized words. Some terms may have\r\n defining text at more than one place. In that case, the\r\n less(1) interactive commands \u001b[1mt\u001b[0m and \u001b[1mT\u001b[0m can be used to move to the\r\n next and to the previous place providing information about the\r\n term last searched for with \u001b[1m:t\u001b[0m. The \u001b[1m-O\u001b[0m \u001b[1mtag\u001b[0m[=\u001b[4mterm\u001b[24m] option\r\n documented in the mandoc(1) manual opens a manual page at the\r\n definition of a specific \u001b[4mterm\u001b[24m rather than at the beginning.\r\n\r\n MANPATH The standard search path used by \u001b[1mman\u001b[0m may be changed by\r\n specifying a path in the MANPATH environment variable. The\r\n format of the path is a co"] [21.015225, "o", "lon (`:') separated list of\r\n directories. Invalid paths are ignored. Overridden by \u001b[1m-M\u001b[0m,\r\n ignored if \u001b[1m-l\u001b[0m is specified.\r\n\r\n:\u001b[K"] [21.440711, "o", "\r\u001b[K If MANPATH begins with a colon, it is appended to the default\r\n list; if it ends with a colon, it is prepended to the default\r\n list; or if it contains two adjacent colons, the standard\r\n search path is inserted between the colons. If none of these\r\n conditions are met, it overrides the standard search path.\r\n\r\n PAGER Specifies the pagination program to use when MANPAGER is not\r\n defined. If neither PAGER nor MANPAGER is defined, more(1) \u001b[1m-s\u001b[0m\r\n is used.\r\n\r\n\u001b[1mFILES\u001b[0m\r\n \u001b[4m/etc/man.conf\u001b[24m default man configuration file\r\n\r\n\u001b[1mEXIT\u001b[0m \u001b[1mSTATUS\u001b[0m\r\n The \u001b[1mman\u001b[0m utility exits 0 on success, and >0 if an error occurs. See\r\n mandoc(1) for details.\r\n\r\n:\u001b[K"] [21.891186, "o", "\r\u001b[K\u001b[1mEXAMPLES\u001b[0m\r\n Format a page for pasting extracts into an email message -- avoid\r\n printing any UTF-8 characters, reduce the width to ease quoting in\r\n replies, and remove markup:\r\n\r\n $ man -T ascii -O width=65 pledge | col -b\r\n\r\n Read a typeset page in a PDF viewer:\r\n\r\n $ MANPAGER=mupdf man -T pdf lpd\r\n\r\n\u001b[1mSEE\u001b[0m \u001b[1mALSO\u001b[0m\r\n apropos(1), col(1), mandoc(1), ul(1), whereis(1), man.conf(5), mdoc(7)\r\n\r\n\u001b[1mSTANDARDS\u001b[0m\r\n The \u001b[1mman\u001b[0m utility is compliant with the IEEE Std 1003.1-2008 (\"POSIX.1\")\r\n specification.\r\n:\u001b[K"] [22.338984, "o", "\r\u001b[K\r\n The flags [\u001b[1m-aCcfhIKlMmOSsTWw\u001b[0m], as well as the environment variables\r\n MACHINE, MANPAGER, and MANPATH, are extensions to that specification.\r\n\r\n\u001b[1mHISTORY\u001b[0m\r\n A \u001b[1mman\u001b[0m command first appeared in Version 3 AT&T UNIX.\r\n\r\n The \u001b[1m-w\u001b[0m option first appeared in Version 7 AT&T UNIX; \u001b[1m-f\u001b[0m and \u001b[1m-k\u001b[0m in 4BSD;\r\n \u001b[1m-M\u001b[0m in 4.3BSD; \u001b[1m-a\u001b[0m in 4.3BSD-Tahoe; \u001b[1m-c\u001b[0m and \u001b[1m-m\u001b[0m in 4.3BSD-Reno; \u001b[1m-h\u001b[0m in\r\n 4.3BSD-Net/2; \u001b[1m-C\u001b[0m in NetBSD 1.0; \u001b[1m-s\u001b[0m and \u001b[1m-S\u001b[0m in OpenBSD 2.3; and \u001b[1m-I\u001b[0m, \u001b[1m-K\u001b[0m, \u001b[1m-l\u001b[0m,\r\n \u001b[1m-O\u001b[0m, and \u001b[1m-W\u001b[0m in OpenBSD 5.7. The \u001b[1m-T\u001b[0m option first appeared in AT&T\r\n System III UNIX and was also added in OpenBSD 5.7.\r\n\r\nLinux 4.19.113-21375755 $Mdocdate: March 9 2019 $ Linux 4.19.113-21375755\r\n\u001b[7m(END)\u001b[27m\u001b[K"] [22.740865, "o", "\r\u001b[K\u0007\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"] [24.767147, "o", "\r\u001b[K\u001b[?1l\u001b>\u001b[?1049l\u001b[23;0;0t"] [24.769592, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [27.248747, "o", "l"] [27.389971, "o", "s"] [28.16309, "o", "\r\n\u001b[?2004l\r"] [28.175501, "o", "\u001b[0m\u001b[01;32m256colour.py\u001b[0m colour_globe.gif \u001b[01;32mfireworks.py\u001b[0m\t \u001b[01;32mimages.py\u001b[0m\t \u001b[01;34mmapscache\u001b[0m\t\u001b[01;32mplasma.py\u001b[0m\t\u001b[01;32mrendering.py\u001b[0m test2.rec\r\n\u001b[01;32mbars.py\u001b[0m \u001b[01;32mcontact_list.py\u001b[0m\t forms.log\t \u001b[01;32minteractive.py\u001b[0m \u001b[01;32mnoise.py\u001b[0m\t\u001b[01;32mplayer.py\u001b[0m\t\u001b[01;32msimple.py\u001b[0m tests.py\r\n\u001b[01;32mbasics.py\u001b[0m \u001b[01;32mcredits.py\u001b[0m\t \u001b[01;32mforms.py\u001b[0m\t \u001b[01;32mjulia.py\u001b[0m\t pacman.png\tpython.png\ttab_demo.py \u001b[01;32mtop.py\u001b[0m\r\n\u001b[01;32mbg_colours.py\u001b[0m \u001b[01;32mexperimental.py\u001b[0m\t globe.gif\t \u001b[01;32mkaleidoscope.py\u001b[0m \u001b[01;32mpacman.py\u001b[0m\t\u001b[01;32mquick_model.py\u001b[0m\t\u001b[01;32mterminal.py\u001b[0m \u001b[01;32mtreeview.py\u001b[0m\r\n\u001b[01;32mcogs.py\u001b[0m \u001b[01;32mfire.py\u001b[0m\t\t grumpy_cat.jpg \u001b[01;32mmaps.py\u001b[0m\t \u001b[01;32mparticles.py\u001b[0m\t\u001b[01;32mray_casting.py\u001b[0m\ttest.rec \u001b[01;32mxmas.py\u001b[0m\r\n"] [28.17728, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [34.340603, "o", "\u001b[?2004l\r\r\nexit\r\n"] python-asciimatics-1.15.0/samples/top.py000077500000000000000000000144401511423144500202340ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.event import KeyboardEvent from asciimatics.widgets import Frame, Layout, MultiColumnListBox, Widget, Label, TextBox from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError, StopApplication from asciimatics.parsers import AsciimaticsParser import sys from collections import defaultdict try: import psutil except ImportError: print("This sample requires the psutil package.") print("Please run `pip install psutil` and try again.") sys.exit(0) def readable_mem(mem): for suffix in ["", "K", "M", "G", "T"]: if mem < 10000: return "{}{}".format(int(mem), suffix) mem /= 1024 return "{}P".format(int(mem)) def readable_pc(percent): if percent < 100: return str(round(percent * 10, 0) / 10) else: return str(int(percent)) class DemoFrame(Frame): def __init__(self, screen): super(DemoFrame, self).__init__(screen, screen.height, screen.width, has_border=False, name="My Form") # Internal state required for doing periodic updates self._last_frame = 0 self._sort = 5 self._reverse = True # Create the basic form layout... layout = Layout([1], fill_frame=True) self._header = TextBox(1, as_string=True) self._header.disabled = True self._header.custom_colour = "label" self._list = MultiColumnListBox( Widget.FILL_FRAME, [">6", 10, ">4", ">7", ">7", ">5", ">5", "100%"], [], titles=["PID", "USER", "NI", "VIRT", "RSS", "CPU%", "MEM%", "CMD"], name="mc_list", parser=AsciimaticsParser()) self.add_layout(layout) layout.add_widget(self._header) layout.add_widget(self._list) layout.add_widget( Label("Press `<`/`>` to change sort, `r` to toggle order, or `q` to quit.")) self.fix() # Add my own colour palette self.palette = defaultdict( lambda: (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK)) for key in ["selected_focus_field", "label"]: self.palette[key] = (Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_BLACK) self.palette["title"] = (Screen.COLOUR_BLACK, Screen.A_NORMAL, Screen.COLOUR_WHITE) def process_event(self, event): # Do the key handling for this Frame. if isinstance(event, KeyboardEvent): if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]: raise StopApplication("User quit") elif event.key_code in [ord("r"), ord("R")]: self._reverse = not self._reverse elif event.key_code == ord("<"): self._sort = max(0, self._sort - 1) elif event.key_code == ord(">"): self._sort = min(7, self._sort + 1) # Force a refresh for improved responsiveness self._last_frame = 0 # Now pass on to lower levels for normal handling of the event. return super(DemoFrame, self).process_event(event) def _update(self, frame_no): # Refresh the list view if needed if frame_no - self._last_frame >= self.frame_update_count or self._last_frame == 0: self._last_frame = frame_no # Create the data to go in the multi-column list... last_selection = self._list.value last_start = self._list.start_line list_data = [] for process in psutil.process_iter(): try: memory = process.memory_info() data = [ process.pid, process.username(), int(process.nice()), memory.vms, memory.rss, process.cpu_percent(), process.memory_percent(), (" ".join(process.cmdline()) if process.cmdline() else "[{}]".format(process.name())) ] list_data.append(data) except psutil.AccessDenied: # Some platforms don't allow querying of all processes... pass # Apply current sort and reformat for humans list_data = sorted(list_data, key=lambda f: f[self._sort], reverse=self._reverse) new_data = [ ([ str(x[0]), x[1], str(x[2]), readable_mem(x[3]), readable_mem(x[4]), readable_pc(x[5]), readable_pc(x[6]), x[7] ], x[0]) for x in list_data ] # Add colours... coloured_data = [] for cols, val in new_data: cpu = float(cols[5]) if cpu < 40: colour = "" elif cpu < 60: colour = "${3}" elif cpu < 80: colour = "${1}" else: colour = "${1,1}" coloured_data.append(([colour + x for x in cols], val)) # Update the list and try to reset the last selection. self._list.options = coloured_data self._list.value = last_selection self._list.start_line = last_start self._header.value = ( "CPU usage: {}% Memory available: {}M".format( str(round(psutil.cpu_percent() * 10, 0) / 10), str(int(psutil.virtual_memory().available / 1024 / 1024)))) # Now redraw as normal super(DemoFrame, self)._update(frame_no) @property def frame_update_count(self): # Refresh once every 2 seconds by default. return 40 def demo(screen): screen.play([Scene([DemoFrame(screen)], -1)], stop_on_resize=True) while True: try: Screen.wrapper(demo, catch_interrupt=True) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/samples/treeview.py000077500000000000000000000056601511423144500212700ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.event import KeyboardEvent from asciimatics.widgets import Frame, Layout, FileBrowser, Widget, Label, PopUpDialog, Text, \ Divider from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError, StopApplication import sys import os try: import magic except ImportError: pass class DemoFrame(Frame): def __init__(self, screen): super(DemoFrame, self).__init__( screen, screen.height, screen.width, has_border=False, name="My Form") # Create the (very simple) form layout... layout = Layout([1], fill_frame=True) self.add_layout(layout) # Now populate it with the widgets we want to use. self._details = Text() self._details.disabled = True self._details.custom_colour = "field" self._list = FileBrowser(Widget.FILL_FRAME, os.path.abspath("."), name="mc_list", on_select=self.popup, on_change=self.details) layout.add_widget(Label("Local disk browser sample")) layout.add_widget(Divider()) layout.add_widget(self._list) layout.add_widget(Divider()) layout.add_widget(self._details) layout.add_widget(Label("Press Enter to select or `q` to quit.")) # Prepare the Frame for use. self.fix() def popup(self): # Just confirm whenever the user actually selects something. self._scene.add_effect( PopUpDialog(self._screen, "You selected: {}".format(self._list.value), ["OK"])) def details(self): # If python magic is installed, provide a little more detail of the current file. if self._list.value: if os.path.isdir(self._list.value): self._details.value = "Directory" elif os.path.isfile(self._list.value): try: self._details.value = magic.from_file(self._list.value) except NameError: self._details.value = "File (run 'pip install python-magic' for more details)" else: self._details.value = "--" def process_event(self, event): # Do the key handling for this Frame. if isinstance(event, KeyboardEvent): if event.key_code in [ord('q'), ord('Q'), Screen.ctrl("c")]: raise StopApplication("User quit") # Now pass on to lower levels for normal handling of the event. return super(DemoFrame, self).process_event(event) def demo(screen, old_scene): screen.play([Scene([DemoFrame(screen)], -1)], stop_on_resize=True, start_scene=old_scene) last_scene = None while True: try: Screen.wrapper(demo, catch_interrupt=False, arguments=[last_scene]) sys.exit(0) except ResizeScreenError as e: last_scene = e.scene python-asciimatics-1.15.0/samples/wall.png000066400000000000000000000143331511423144500205230ustar00rootroot00000000000000PNG  IHDR@@iqbKGDf| pHYs  tIME F[qiTXtCommentCreated with GIMPd.e?IDATxŚis?h q @$HDl)DG2q93Qyy;^vy:Y&شIJ%Y% qF=5bP^~;+Ͳb4"2i" Ԫ5zh˲FR.G:gNt?zܽ{`x^s!">^GFe(9 q=z6_!rʷqXlp80  `&&ofmmx~ϕ+/yv}E$I zq8x^,B <\JB 0z=m?~6, 01,d0 `0H nH$z=ڐ`ih(|AE^#rxxH([F)q8Z-DfIrn^eeYMݦ,--ŋYY] 4  SY__ R)JnxiT*daa5?N5IR0 TUrq)iMzu]Ɵ'zNӥ\R m8DdYp >}TUe4N\\4Msss,,,PVzt]DlEѰhV4M!NpHfVţGܾ}eRj̹sx뭷Ft]>Bu b9+%3QUO"Z3uh"g\~L&>i"I!2( BJ"… r9 `<3 nhŋy!>'_h`YjWr |駸nsxL?!m4MC,..bYG0Á$I8 1hHD  GMlft:M  NŰ,VE'fy$I4HRL[m$TUrY c&iR(r8N~ӟӟ* DH$@VCUUt]@ZZZÇfooYi`YL}?K$%666}6KKK jߧRשˤiAnsyej:eHIЎmuu fIvm677YZZ?9/_&ϳ tz~|H$>}d%>|gt1v&+?4M.nI\әpnJ`0^$|>d쳻TU˲S.|t:ZшheYiΞ=4 DQi8- 2x,˨ @:Mv#If}4iK6E{3"/_f~~2z\.csLr"Hd>|>& q%z`ej6MWQer dfbţ"GQz jr ~0x^c7 a:z|>O8fyy+Wv4B>>MvZEEp8ȭ۷i6lll0MR<^vͽ{> r0 M3A*BUU2JCEٳgbz=~?RiBNenn&=]|$ BOvT*}L3bVh4ikul#wץhRב$h4O>!JZammhD2da!NÁ묮 z=rL\.Nj/t]~?躎BQ,˲8q\ȲL IJ,LӤja(Mr9Ν;G&! i4N~& 21 (Jz= @DBݣP(p8p:,--qԩc^S,1 YdE^gshDTRjH&n|>ck> .n#,ˢ34Mc0PV,rbڙ5sIA`<eN'(NHpB\~@ƃfI… iE! 1?xlJ( p|E'duugϞ1q:nvwwj$ 2 ~Ǐ#9$Ο?&,W_}8~733i|~^VE*js  5jCFaksUUQU'H4:nw}Y,b}}USt1vCMCxqu.re$A,6c.+++7|cS{EQpܸy~o;@'3338]n>F0VS988i왍R ,hm +˶xt:k;5a&\.G,#3jtɓt2,rtt\jEB0X\.>GӡlꫯW{c7G$~?`ǃyLN2~V$g HbP,IǤ)O   >SE7eyBd2Ȳn7K^T*qElux^DQv)r6Ǐ 5 ˅o" Lr0O>y89BW^yŖf$!"jM0 gOtϟ?tR5JtիSöGGG믳j fht:mlK&$I0_~ ^/7od6^l6iE*,s% BCӴcl6ݻwm 7t:TU%?| 6C"NɳgP@ sxB g&  QA&{4jQV Blll % n0 t:1 P,qb1,^md'E$~򓟐L&|V/1ǦTUwX40<8K,..a|;! |W~:M%IO|qhx^8hIx<}vwwy>SN/cD3~؂@͛ Cf!{&dJJѠppp(h4:0O=E!sUzPcXE۵4G1I&Hq\xN* 14MFzYr iFm?NAE!7nv&f.?jً{t]Dz,t|<1:v5RwWx<6\__plvm<91_e9R)Ex<DQSl=$ yR_XYYak)N[y7&O>jzm;m0j5'l{{R+xe(1Hu[[$ɔx'[[^wn{B R Dm±e~ ׮v9ƍ7ߧP(rIx^reށeYD3D"fBH2i2ԆO(w!cYd2FÞ(Mp z=W\Aunbh4 G]7FȲlIPTzL˽{ؠP(fyݮ-aOIW_F }jHd|>ϩS8wJO?xjMb*//?A¾ȎE!B!vvvh6\.b33p'r׿4{"ʴ-2+++ha&J @t:t:i2nYr ,ܹÙ3g?fww(,#c߿nQUv{ܺu ?NB8^k׮i[[[en!,--qϏF#N>M\޽{vt|{Ν;~|>}J5M#J( ϟK/~ A. ~NM._<T L+v?A*JSOO M;/S'HSOϷZi'H5Mj?Av>tki|כj?AvTsZҥKHGp\|v.L+Wp8P(jlx?~M3L,iO>ew5iSO>=~4|S'HO7ͩV>ooZ<~vk6~TwN M;v?Av> Oϋ8~3b- IENDB`python-asciimatics-1.15.0/samples/xmas.py000077500000000000000000000026461511423144500204070ustar00rootroot00000000000000#!/usr/bin/env python3 from asciimatics.effects import Cycle, Snow, Print from asciimatics.renderers import FigletText, StaticRenderer from asciimatics.scene import Scene from asciimatics.screen import Screen from asciimatics.exceptions import ResizeScreenError import sys # Tree definition tree = r""" ${3,1}* / \ /${1}o${2} \ /_ _\ / \${4}b / \ / ${1}o${2} \ /__ __\ ${1}d${2} / ${4}o${2} \ / \ / ${4}o ${1}o${2}.\ /___________\ ${3}||| ${3}||| """, r""" ${3}* / \ /${1}o${2} \ /_ _\ / \${4}b / \ / ${1}o${2} \ /__ __\ ${1}d${2} / ${4}o${2} \ / \ / ${4}o ${1}o${2} \ /___________\ ${3}||| ${3}||| """ def demo(screen): effects = [ Print(screen, StaticRenderer(images=tree), x=screen.width - 15, y=screen.height - 15, colour=Screen.COLOUR_GREEN), Snow(screen), Cycle( screen, FigletText("HAPPY"), screen.height // 2 - 6, start_frame=300), Cycle( screen, FigletText("XMAS!"), screen.height // 2 + 1, start_frame=300), ] screen.play([Scene(effects, -1)], stop_on_resize=True) while True: try: Screen.wrapper(demo) sys.exit(0) except ResizeScreenError: pass python-asciimatics-1.15.0/setup.cfg000066400000000000000000000002431511423144500172260ustar00rootroot00000000000000[bdist_wheel] # Only support Python 3 now. universal=0 [metadata] # include the license file in the wheel license_files = LICENSE [flake8] max-line-length = 110 python-asciimatics-1.15.0/setup.py000066400000000000000000000047771511423144500171370ustar00rootroot00000000000000""" A setuptools based setup module for asciimatics. Based on the sample Python packages at: https://packaging.python.org/en/latest/distributing.html https://github.com/pypa/sampleproject """ from codecs import open as file_open from os import path from setuptools import setup, find_packages # Get the long description from the relevant file and strip any pre-amble (i.e. badges) from it. here = path.abspath(path.dirname(__file__)) with file_open(path.join(here, 'README.rst'), encoding='utf-8') as f: long_description = f.read().split("\n") while long_description[0] not in ("ASCIIMATICS", "ASCIIMATICS\r"): long_description = long_description[1:] long_description = "\n".join(long_description) setup( name='asciimatics', use_scm_version={ "write_to": "asciimatics/version.py", "local_scheme": "no-local-version" }, description='A cross-platform package to replace curses (mouse/keyboard ' 'input & text colours/positioning) and create ASCII ' 'animations', long_description=long_description, url='https://github.com/peterbrittain/asciimatics', author='Peter Brittain', author_email='peter.brittain.os@gmail.com', license='Apache 2.0', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Environment :: Console :: Curses', 'Intended Audience :: Developers', 'Topic :: Text Processing :: General', 'License :: OSI Approved :: Apache Software License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Software Development :: User Interfaces', 'Topic :: Terminals', ], keywords='ascii ansi art credits titles animation curses ' 'ncurses windows xterm mouse keyboard terminal tty ' 'color colour crossplatform console', packages=find_packages(exclude=['contrib', 'docs', 'tests*']), install_requires=[ 'pyfiglet >= 0.7.2', 'Pillow >= 2.7.0', 'wcwidth', ], extras_require={ ':sys_platform == "win32"': ['pywin32'], }, setup_requires=['setuptools_scm'], python_requires=">= 3.8", ) python-asciimatics-1.15.0/tests/000077500000000000000000000000001511423144500165505ustar00rootroot00000000000000python-asciimatics-1.15.0/tests/__init__.py000066400000000000000000000000001511423144500206470ustar00rootroot00000000000000python-asciimatics-1.15.0/tests/mock_objects.py000066400000000000000000000034301511423144500215640ustar00rootroot00000000000000from asciimatics.effects import Effect from asciimatics.exceptions import StopApplication, NextScene class MockEffect(Effect): """ Dummy Effect use for some UTs. """ def __init__(self, count=10, stop=True, swallow=False, next_scene=None, frame_rate=1, stop_frame=5, **kwargs): """ :param count: When to stop effect :param stop: Whether to stop the application or skip to next scene. :param swallow: Whether to swallow any events or not. :param next_scene: The next scene to move to (if stop=False) :param frame_rate: The frame rate for updates. """ super().__init__(None, **kwargs) self.stop_called = False self.reset_called = False self.event_called = False self.save_called = False self.update_called = False self._count = count self._stop = stop self._swallow = swallow self._next_scene = next_scene self._frame_rate = frame_rate # Ugly hack to stop clash with underlying Effect definition. Sorry. self._my_stop_frame = stop_frame @property def stop_frame(self): self.stop_called = True return self._my_stop_frame @property def frame_update_count(self): return self._frame_rate def _update(self, frame_no): self.update_called = True self._count -= 1 if self._count <= 0: if self._stop: raise StopApplication("End of test") else: raise NextScene(self._next_scene) def reset(self): self.reset_called = True def process_event(self, event): self.event_called = True return None if self._swallow else event def save(self): self.save_called = True python-asciimatics-1.15.0/tests/renderers/000077500000000000000000000000001511423144500205415ustar00rootroot00000000000000python-asciimatics-1.15.0/tests/renderers/__init__.py000066400000000000000000000000001511423144500226400ustar00rootroot00000000000000python-asciimatics-1.15.0/tests/renderers/globe.gif000066400000000000000000000273211511423144500223250ustar00rootroot00000000000000GIF89a((ŴݬrzzzմQYYYbbAIIrjzz8AA088zIYYAQQ ((8IIIbb (88 00(II(QQ((Arz8jrbAjr IQ8A0Yb80z rQbݬդ̓IIYYzbAz(brAQYr՛zrjzr8QYYQ0br(r j (8IA8z bzYrbYQ0Yj(QbQj0Ab AQ(8ݤbrzrIYb(8A0AzYbj (Ջbjr (0! NETSCAPE2.0! ,((H`3gިPQbD9w JHQBO4tq̼Cd6*΄KBL+t0YrC$0P@K c'?<*:Z2?rHSFDaBU(@DqGRrV-OgR1`41Ρ[mc G I83&Q?=WH"2ZJ H `܈]o+2hO@x@0wX@u)Xa iwk @_ dncXQZ l@} ւia"DGuC8@F#9";pBb1B1YЅ$c@ $PB \4ф\XyyGqdo%aN eYpѦA6'`%Xuq ha6| 8zb9QS$fbHC W(@r18e.P0%)[@W_d*XPwPѦhPE]; ? jye!!CP0`EZ^\P/W`qsEQu,[lq:` T9j@yj'Nh̠HaEGgQ10\AU@Frgd|_DlXx39϶EKHMCyp <{TZ14A5ߌsΥq{@ Dc=P6mE?@aMDs|)ϽpA ~ 2ˬ Q\|0AoP(ua*!@v  8EXhǞ`?_yUEG%<pqOf` A1)_'6 AF$ І6@rO! ,((H3ϸQQ;#J(ʙ1)RX  v80dA "F%v&Hb5LF,  %@@)Fvr pޘ&ZattaP Gj ԆEN?G "@ c19'atVJ@*dE 1$TP9 \ G+1].DFk\ ֛q@ VYA DD![,6E@*= ;]oHHP;AP5GPqZ[PADIED|'Ud( ~Eċ[p]PƭeP Hdyax jb`+3:[$%; &vPcĈV8P! ;'Ň/:E{Cv!A}Sm=B8t|l!=FCVdZP|~ϭaҍ6 =d`VP@f!nd>V ip )BQ ChTY-bB0+,)E m{881?bOxVAD' {>0m>VD BH+H]9P:#kA%j ZQ P8NB@bjB!I {"thH%,?FHE {@=ho`QAci=(Ǭ<Xd!opA0riP4=F7Af&E0Zjbd=L{ahsU@$4n0qkEQhW$bAXIDB!iZD PpY qW e_̣ 1ɏFIJ'w{$Cܥ8XxTّ}[ 94|Gy?GV`DUԎL|VFiKp`C 0.D$Y}H AA Ϡ%!0',ASA Fd y WH=Ѡ3 TH DA)!O` "0!0<dBP@ pzB\?! ,((H7)Τ#Jxp 3ODF%LYp p\r'z `#Z8`:6qp4!/6ӠjUE]!G) SjpU G@4.př!,e ` ߿BL6#5Tgpg *;ۃ+x$"p \`arʘc[v"VI .%e˱y ?(Xa3A C+Jb9 `rfp&H X ܵp~a[@YA ^Ň9WD V`o@ax)bZ9k¨:t( qtLj N(*D*@\<4X*lSQ Dހ:aD8ma(cqn$8iB ¿+G0 Eoe0̙l.<V@6<+H<AAn :aE?[<<DD $AjX#[4`Xѕ@[ `(əkfQ@EDDB5`3ua=2ɬ[OD=a(lp 40X^qGt ۊa@H %quL6*|QXmM#1(a k9N@/1s< VGq 8YPC' 5_J!нBg0D@2>|Vi(OKi8<Ѐ 91Hh (LFBJ0 ! ,((H 7oRXqF < JHO4RF0KQcɂ%Z 0LBC@OJؐF ;v gFִiANΘ1h h5tx Ù&\ؑVȝˀ+Қ*jË́4  e+jLjƀ.a(أ %&`5K$`aH {~`4B Oc᥋ z0I+N#{\ xRPv@,#&J:~nqZj` 1 h\\ Yp X p4(} 0&E %XX1#֨p F  6X <0q 6(A` |PD>C}q_4 !*9G%T!`G ) wZtT ښ? #iY1&ׄFpхhtdC`@B/2:X|!(pMhA_ƃ9hWQP..c)wعjZdQbaDk(!ƕ֖wH`A) n1D1 *e %MǒX`b b#pV!|'0D=@ǁ 8Q mpT\)nƮj.`.EVaX۩jѴ`'8L.r 豅j1p_j L# 4m9pm2kAb3!@]d)qm7@oZBF7w9@nExuC-VihC-㤗.e L>;K5 4RnkAOJ6㾷A)p|b{oTK4h?|G &C @/~dMbTaza`520(YթmjL!i3@|#$H LxBp!$-t! c( X{X)@D0A1 ! ,((H nRy3J 5v JHB jX"5Vp`ɂ4QSã0L0E 0ppx :aLPMµ!fM5Cpr$  s]09a. D ٧Y lmfAvE ^DX$mzd"o Bht(Vj_R.=v8^ H6x-{\klCXADix9 W\9l5}tU)$n>v9F` xC uWQQQ zHw9ThDbhER(C@hѪg8 0`ڗ鯚r(Њ.C 1`0@k!@fP[CѬj`El轋t䊁+g4Drk>0Dn,g%Gja9DV\r ƞL<<ΐ1;rkrz7c1^@=l/gĨ+ta= S‰iXXw1^rǐP4h0 kmamJDj !zGnyV8ie[.ITRd1[6E6Y!oDR`UۜUW)1ze`f{[4pSק`;gAk[ TKh@"! ,((H %JXcE<i%K9)Lh@rz!ج"ƈesX@O;$` "8& *A."Eb4hDʖʓ@A AL oٷG_Æ80L6jv [xgZ aX`fGT}5ؠ8G!0sPA_kɉ("^( !P)XVPFe蚍#⠃ DA.VP /0CRNe~>A%`y@$ Q5ɅQPm ,`5T$TdEkYyq+Wyұ&Ps VR x&TH)qZFJB6Ô:$lb:Yj&Eqker& 0@%:xOUVyVA"i :Ń5DD@-{+A H>Dlz'A 6 ]ۭܲ`ȅ!++|-tkP)в[T5`?EȠ}u @V#uEa\v}Ԁ d~xvT3AP3KL` Bb7ﭣː?bЃTSVh 9~a`;}n#@+joU4N8nr?cpTQžOEAV$F3onHN@$9T 487AI A6p JA P?S"%҆<̡Vƭp*wC20s !This GIF file was assembled with GIF Construction Set from: Alchemy Mindworks Inc. P.O. Box 500 Beeton, Ontario L0G 1A0 CANADA. This comment block will not appear in files created with a registered version of GIF Construction Set! GIFCONnb1.0   td4a.gif  td4b.gif  td4c.gif  td4d.gif  td4e.gif  td4f.gif  td4g.gif  td4h.gif  td4i.gif  td4j.gif  td4k.gif;python-asciimatics-1.15.0/tests/renderers/test.ans000066400000000000000000000003231511423144500222210ustar00rootroot00000000000000This is a test file with ansi codes... Check here 2nd abcdefghaab cdde[?25h[?25l abcdeabcdeabcdeabcdeaZbc d 123 python-asciimatics-1.15.0/tests/renderers/test.rec000066400000000000000000000714051511423144500222220ustar00rootroot00000000000000{"version": 2, "width": 134, "height": 18, "timestamp": 1621173258, "env": {"SHELL": "/data/data/com.termux/files/usr/bin/bash", "TERM": "xterm-256color"}} [0.019859, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [1.250708, "o", "l"] [1.712982, "o", "s"] [2.399548, "o", "\r\n\u001b[?2004l\r"] [2.419356, "o", "\u001b[0m\u001b[01;32m256colour.py\u001b[0m colour_globe.gif \u001b[01;32mfireworks.py\u001b[0m\t \u001b[01;32mimages.py\u001b[0m\t \u001b[01;34mmapscache\u001b[0m\t\u001b[01;32mplasma.py\u001b[0m\t\u001b[01;32mrendering.py\u001b[0m test2.rec\r\n\u001b[01;32mbars.py\u001b[0m \u001b[01;32mcontact_list.py\u001b[0m\t forms.log\t \u001b[01;32minteractive.py\u001b[0m \u001b[01;32mnoise.py\u001b[0m\t\u001b[01;32mplayer.py\u001b[0m\t\u001b[01;32msimple.py\u001b[0m tests.py\r\n\u001b[01;32mbasics.py\u001b[0m \u001b[01;32mcredits.py\u001b[0m\t \u001b[01;32mforms.py\u001b[0m\t \u001b[01;32mjulia.py\u001b[0m\t pacman.png\tpython.png\ttab_demo.py \u001b[01;32mtop.py\u001b[0m\r\n\u001b[01;32mbg_colours.py\u001b[0m \u001b[01;32mexperimental.py\u001b[0m\t globe.gif\t \u001b[01;32mkaleidoscope.py\u001b[0m \u001b[01;32mpacman.py\u001b[0m\t\u001b[01;32mquick_model.py\u001b[0m\t\u001b[01;32mterminal.py\u001b[0m \u001b[01;32mtreeview.py\u001b[0m\r\n\u001b[01;32mcogs.py\u001b[0m \u001b[01;32mfire.py\u001b[0m\t\t grumpy_cat.jpg \u001b[01;32mmaps.py\u001b[0m\t \u001b[01;32mparticles.py\u001b[0m\t\u001b[01;32mray_casting.py\u001b[0m\ttest.rec \u001b[01;32mxmas.py\u001b[0m\r\n"] [2.420405, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [3.291134, "o", "p"] [3.723948, "o", "w"] [4.089975, "o", "d"] [4.339859, "o", "\r\n\u001b[?2004l\r/data/data/com.termux/files/home/asciimatics/samples\r\n\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [5.75625, "o", "m"] [6.114739, "o", "a"] [6.215725, "o", "n"] [6.474956, "o", " "] [6.757042, "o", "m"] [6.964953, "o", "a"] [7.066012, "o", "n"] [7.725575, "o", "\r\n\u001b[?2004l\r"] [7.753202, "o", "\u001b[?1049h\u001b[22;0;0t\u001b[?1h\u001b=\rMAN(1) General Commands Manual MAN(1)\r\n\r\n\u001b[1mNAME\u001b[0m\r\n \u001b[1mman\u001b[0m - display manual pages\r\n\r\n\u001b[1mSYNOPSIS\u001b[0m\r\n \u001b[1mman\u001b[0m [\u001b[1m-acfhklw\u001b[0m] [\u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m] [\u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-m\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-S\u001b[0m \u001b[4msubsection\u001b[24m]\r\n"] [7.753587, "o", " [[\u001b[1m-s\u001b[0m] \u001b[4msection\u001b[24m] \u001b[4mname\u001b[24m \u001b[4m...\u001b[24m\r\n\r\n\u001b[1mDESCRIPTION\u001b[0m\r\n The \u001b[1mman\u001b[0m utility displays the manual pages entitled \u001b[4mname\u001b[24m. Pages may be\r\n selected according to a specific category (\u001b[4msection\u001b[24m) or machine\r\n architecture (\u001b[4msubsection\u001b[24m).\r\n\r\n The options are as follows:\r\n\r\n \u001b[1m-a\u001b[0m Display all matching manual pages. Normally, only the first page\r\n\u001b[7m/data/data/com.termux/files/usr/tmp/man.kqC5sqeeyc\u001b[27m\u001b[K"] [9.701868, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"] [9.702787, "o", " found is displayed.\r\n:\u001b[K"] [9.780307, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [9.861673, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m\r\n:\u001b[K"] [9.942769, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K Use the specified \u001b[4mfile\u001b[24m instead of the default configuration file.\r\n:\u001b[K"] [10.021966, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K This permits users to configure their own manual environment.\r\n:\u001b[K"] [10.103063, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K See man.conf(5) for a description of the contents of this file.\r\n:\u001b[K"] [10.18515, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [10.264708, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-c\u001b[0m Copy the manual page to the standard output instead of using\r\n:\u001b[K"] [10.347327, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K more(1) to paginate it. This is done by default if the standard\r\n:\u001b[K"] [10.427565, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K output is not a terminal device.\r\n:\u001b[K"] [10.509204, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [10.587453, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K When using \u001b[1m-c\u001b[0m, most terminal devices are unable to show the\r\n:\u001b[K"] [10.670466, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K markup. To print the output of \u001b[1mman\u001b[0m to the terminal with markup\r\n:\u001b[K"] [10.749388, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K but without using a pager, pipe it to ul(1). To remove the\r\n:\u001b[K"] [10.828832, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K markup, pipe the output to col(1) \u001b[1m-b\u001b[0m instead.\r\n:\u001b[K"] [10.910584, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [10.991994, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-f\u001b[0m A synonym for whatis(1). It searches for \u001b[4mname\u001b[24m in manual page\r\n:\u001b[K"] [11.0726, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K names and displays the header lines from all matching pages. The\r\n:\u001b[K"] [11.151735, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K search is case insensitive and matches whole words only.\r\n:\u001b[K"] [11.234139, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [11.314078, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-h\u001b[0m Display only the SYNOPSIS lines of the requested manual pages.\r\n:\u001b[K"] [11.398806, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K Implies \u001b[1m-a\u001b[0m and \u001b[1m-c\u001b[0m.\r\n:\u001b[K"] [11.476523, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [11.557542, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-k\u001b[0m A synonym for apropos(1). Instead of \u001b[4mname\u001b[24m, an expression can be\r\n:\u001b[K"] [11.63895, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K provided using the syntax described in the apropos(1) manual. By\r\n:\u001b[K"] [11.719532, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K default, it displays the header lines of all matching pages.\r\n:\u001b[K"] [11.799522, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [11.880865, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-l\u001b[0m A synonym for mandoc(1). The \u001b[4mname\u001b[24m arguments are interpreted as\r\n:\u001b[K"] [11.963442, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K filenames. No search is done and \u001b[4mfile\u001b[24m, \u001b[4mpath\u001b[24m, \u001b[4msection\u001b[24m,\r\n:\u001b[K"] [12.044153, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[4msubsection\u001b[24m, and \u001b[1m-w\u001b[0m are ignored. This option implies \u001b[1m-a\u001b[0m.\r\n:\u001b[K"] [12.125334, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [12.205019, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K \u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m\r\n:\u001b[K"] [12.285408, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K Override the list of standard directories which \u001b[1mman\u001b[0m searches for\r\n:\u001b[K"] [12.366733, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K manual pages. The supplied \u001b[4mpath\u001b[24m must be a colon (`:') separated\r\n:\u001b[K"] [12.445534, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K list of directories. This search path may also be set using the\r\n:\u001b[K"] [12.526631, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K environment variable MANPATH.\r\n:\u001b[K"] [12.610492, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\n:\u001b[K"] [13.803836, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [13.883987, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM search is case insensitive and matches whole words only.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [13.964723, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM names and displays the header lines from all matching pages. The\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.045606, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-f\u001b[0m A synonym for whatis(1). It searches for \u001b[4mname\u001b[24m in manual page\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.124753, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.204879, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM markup, pipe the output to col(1) \u001b[1m-b\u001b[0m instead.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.28782, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM but without using a pager, pipe it to ul(1). To remove the\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.369442, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM markup. To print the output of \u001b[1mman\u001b[0m to the terminal with markup\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.450291, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM When using \u001b[1m-c\u001b[0m, most terminal devices are unable to show the\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.530452, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.611802, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM output is not a terminal device.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.692119, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM more(1) to paginate it. This is done by default if the standard\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.772232, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-c\u001b[0m Copy the manual page to the standard output instead of using\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.853491, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [14.934578, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM See man.conf(5) for a description of the contents of this file.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.015897, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM This permits users to configure their own manual environment.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.093496, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM Use the specified \u001b[4mfile\u001b[24m instead of the default configuration file.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.174149, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.254275, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.33536, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM found is displayed.\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.417012, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1m-a\u001b[0m Display all matching manual pages. Normally, only the first page\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.499824, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.581504, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM The options are as follows:\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.658728, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.740908, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM architecture (\u001b[4msubsection\u001b[24m).\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.82092, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM selected according to a specific category (\u001b[4msection\u001b[24m) or machine\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.89982, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM The \u001b[1mman\u001b[0m utility displays the manual pages entitled \u001b[4mname\u001b[24m. Pages may be\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [15.978964, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K"] [15.979826, "o", "\u001b[H\u001bM\u001b[1mDESCRIPTION\u001b[0m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.063722, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.141131, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM [[\u001b[1m-s\u001b[0m] \u001b[4msection\u001b[24m] \u001b[4mname\u001b[24m \u001b[4m...\u001b[24m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.222417, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1mman\u001b[0m [\u001b[1m-acfhklw\u001b[0m] [\u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m] [\u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-m\u001b[0m \u001b[4mpath\u001b[24m] [\u001b[1m-S\u001b[0m \u001b[4msubsection\u001b[24m]\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.301378, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\u001b[1mSYNOPSIS\u001b[0m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.381868, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.463502, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM \u001b[1mman\u001b[0m - display manual pages\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.546415, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\u001b[1mNAME\u001b[0m\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.624787, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bM\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.706582, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u001b[H\u001bMMAN(1) General Commands Manual MAN(1)\r\n\u001b[18;1H\r\u001b[K:\u001b[K"] [16.788295, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [16.870117, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [16.948122, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [17.030957, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [17.112315, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [17.193514, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KA\bA\r\u001b[K\u0007\r\u001b[K:\u001b[K"] [18.346965, "o", "\r\u001b[K found is displayed.\r\n\r\n \u001b[1m-C\u001b[0m \u001b[4mfile\u001b[24m\r\n Use the specified \u001b[4mfile\u001b[24m instead of the default configuration file.\r\n This permits users to configure their own manual environment.\r\n See man.conf(5) for a description of the contents of this file.\r\n\r\n \u001b[1m-c\u001b[0m Copy the manual page to the standard output instead of using\r\n more(1) to paginate it. This is done by default if the standard\r\n output is not a terminal device.\r\n\r\n When using \u001b[1m-c\u001b[0m, most terminal devices are unable to show the\r\n markup. To print the output of \u001b[1mman\u001b[0m to the terminal with markup\r\n but without using a pager, pipe it to ul(1). To remove the\r\n markup, pipe the output to col(1) \u001b[1m-b\u001b[0m instead.\r\n\r\n \u001b[1m-f\u001b[0m A synonym for whatis(1). It searches for \u001b[4mname\u001b[24m in manual page\r\n:\u001b[K"] [18.714415, "o", "\r\u001b[K names and displays the header lines from all matching pages. The\r\n search is case insensitive and matches whole words only.\r\n\r\n \u001b[1m-h\u001b[0m Display only the SYNOPSIS lines of the requested manual pages.\r\n Implies \u001b[1m-a\u001b[0m and \u001b[1m-c\u001b[0m.\r\n\r\n \u001b[1m-k\u001b[0m A synonym for apropos(1). Instead of \u001b[4mname\u001b[24m, an expression can be\r\n provided using the syntax described in the apropos(1) manual. By\r\n default, it displays the header lines of all matching pages.\r\n\r\n \u001b[1m-l\u001b[0m A synonym for mandoc(1). The \u001b[4mname\u001b[24m arguments are interpreted as\r\n filenames. No search is done and \u001b[4mfile\u001b[24m, \u001b[4mpath\u001b[24m, \u001b[4msection\u001b[24m,\r\n \u001b[4msubsection\u001b[24m, and \u001b[1m-w\u001b[0m are ignored. This option implies \u001b[1m-a\u001b[0m.\r\n\r\n \u001b[1m-M\u001b[0m \u001b[4mpath\u001b[24m\r\n Override the list of standard directories which \u001b[1mman\u001b[0m searches for\r\n manual pages. The supplied \u001b[4mpath\u001b[24m must be a colon "] [18.71458, "o", "(`:') separated\r\n:\u001b[K"] [19.155672, "o", "\r\u001b[K list of directories. This search path may also be set using the\r\n environment variable MANPATH.\r\n\r\n \u001b[1m-m\u001b[0m \u001b[4mpath\u001b[24m\r\n Augment the list of standard directories which \u001b[1mman\u001b[0m searches for\r\n manual pages. The supplied \u001b[4mpath\u001b[24m must be a colon (`:') separated\r\n list of directories. These directories will be searched before\r\n the standard directories or the directories specified using the\r\n \u001b[1m-M\u001b[0m option or the MANPATH environment variable.\r\n\r\n \u001b[1m-S\u001b[0m \u001b[4msubsection\u001b[24m\r\n Only show pages for the specified machine(1) architecture.\r\n \u001b[4msubsection\u001b[24m is case insensitive.\r\n\r\n By default manual pages for all architectures are installed.\r\n Therefore this option can be used to view pages for one\r\n architecture whilst using another.\r\n:\u001b[K"] [19.707572, "o", "\r\u001b[K\r\n This option overrides the MACHINE environment variable.\r\n\r\n [\u001b[1m-s\u001b[0m] \u001b[4msection\u001b[24m\r\n Only select manuals from the specified \u001b[4msection\u001b[24m. The currently\r\n available sections are:\r\n\r\n 1 General commands (tools and utilities).\r\n 2 System calls and error numbers.\r\n 3 Library functions.\r\n 3p perl(1) programmer's reference guide.\r\n 4 Device drivers.\r\n 5 File formats.\r\n 6 Games.\r\n 7 Miscellaneous information.\r\n 8 System maintenance and operation commands.\r\n 9 Kernel internals.\r\n:\u001b[K"] [20.156555, "o", "\r\u001b[K\r\n If not specified and a match is found in more than one section,\r\n the first match is selected from the following list: 1, 8, 6, 2,\r\n 3, 5, 7, 4, 9, 3p.\r\n\r\n \u001b[1m-w\u001b[0m List the pathnames of all matching manual pages instead of\r\n displaying any of them.\r\n\r\n The options \u001b[1m-IKOTW\u001b[0m are also supported and are documented in mandoc(1).\r\n The options \u001b[1m-fkl\u001b[0m are mutually exclusive and override each other.\r\n\r\n Guidelines for writing man pages can be found in mdoc(7).\r\n\r\n The mandoc.db(5) database is used for looking up manual page entries. In\r\n cases where the database is absent, outdated, or corrupt, \u001b[1mman\u001b[0m falls back\r\n to looking for files called \u001b[4mname\u001b[24m.\u001b[4msection\u001b[24m. If both a formatted and an\r\n unformatted version of the same manual page, for example \u001b[4mcat1/foo.0\u001b[24m and\r\n:\u001b[K"] [20.574445, "o", "\r\u001b[K"] [20.574631, "o", " \u001b[4mman1/foo.1\u001b[24m, exist in the same directory, only the unformatted version is\r\n used. The database is kept up to date with makewhatis(8), which is run\r\n by the weekly(8) maintenance script.\r\n\r\n\u001b[1mENVIRONMENT\u001b[0m\r\n MACHINE As some manual pages are intended only for specific\r\n architectures, \u001b[1mman\u001b[0m searches any subdirectories, with the same\r\n name as the current architecture, in every directory which it\r\n searches. Machine specific areas are checked before general\r\n areas. The current machine type may be overridden by setting\r\n the environment variable MACHINE to the name of a specific\r\n architecture, or with the \u001b[1m-S\u001b[0m option. MACHINE is case\r\n insensitive.\r\n\r\n MANPAGER Any non-empty value of the environment variable MANPAGER is\r\n used instead of the standard pagination program, more(1). If\r\n less(1) is used, the interactive \u001b[1m:t\u001b[0m command "] [20.5747, "o", "can be used to go\r\n:\u001b[K"] [21.015069, "o", "\r\u001b[K to the definitions of various terms, for example command line\r\n options, command modifiers, internal commands, environment\r\n variables, function names, preprocessor macros, errno(2)\r\n values, and some other emphasized words. Some terms may have\r\n defining text at more than one place. In that case, the\r\n less(1) interactive commands \u001b[1mt\u001b[0m and \u001b[1mT\u001b[0m can be used to move to the\r\n next and to the previous place providing information about the\r\n term last searched for with \u001b[1m:t\u001b[0m. The \u001b[1m-O\u001b[0m \u001b[1mtag\u001b[0m[=\u001b[4mterm\u001b[24m] option\r\n documented in the mandoc(1) manual opens a manual page at the\r\n definition of a specific \u001b[4mterm\u001b[24m rather than at the beginning.\r\n\r\n MANPATH The standard search path used by \u001b[1mman\u001b[0m may be changed by\r\n specifying a path in the MANPATH environment variable. The\r\n format of the path is a co"] [21.015225, "o", "lon (`:') separated list of\r\n directories. Invalid paths are ignored. Overridden by \u001b[1m-M\u001b[0m,\r\n ignored if \u001b[1m-l\u001b[0m is specified.\r\n\r\n:\u001b[K"] [21.440711, "o", "\r\u001b[K If MANPATH begins with a colon, it is appended to the default\r\n list; if it ends with a colon, it is prepended to the default\r\n list; or if it contains two adjacent colons, the standard\r\n search path is inserted between the colons. If none of these\r\n conditions are met, it overrides the standard search path.\r\n\r\n PAGER Specifies the pagination program to use when MANPAGER is not\r\n defined. If neither PAGER nor MANPAGER is defined, more(1) \u001b[1m-s\u001b[0m\r\n is used.\r\n\r\n\u001b[1mFILES\u001b[0m\r\n \u001b[4m/etc/man.conf\u001b[24m default man configuration file\r\n\r\n\u001b[1mEXIT\u001b[0m \u001b[1mSTATUS\u001b[0m\r\n The \u001b[1mman\u001b[0m utility exits 0 on success, and >0 if an error occurs. See\r\n mandoc(1) for details.\r\n\r\n:\u001b[K"] [21.891186, "o", "\r\u001b[K\u001b[1mEXAMPLES\u001b[0m\r\n Format a page for pasting extracts into an email message -- avoid\r\n printing any UTF-8 characters, reduce the width to ease quoting in\r\n replies, and remove markup:\r\n\r\n $ man -T ascii -O width=65 pledge | col -b\r\n\r\n Read a typeset page in a PDF viewer:\r\n\r\n $ MANPAGER=mupdf man -T pdf lpd\r\n\r\n\u001b[1mSEE\u001b[0m \u001b[1mALSO\u001b[0m\r\n apropos(1), col(1), mandoc(1), ul(1), whereis(1), man.conf(5), mdoc(7)\r\n\r\n\u001b[1mSTANDARDS\u001b[0m\r\n The \u001b[1mman\u001b[0m utility is compliant with the IEEE Std 1003.1-2008 (\"POSIX.1\")\r\n specification.\r\n:\u001b[K"] [22.338984, "o", "\r\u001b[K\r\n The flags [\u001b[1m-aCcfhIKlMmOSsTWw\u001b[0m], as well as the environment variables\r\n MACHINE, MANPAGER, and MANPATH, are extensions to that specification.\r\n\r\n\u001b[1mHISTORY\u001b[0m\r\n A \u001b[1mman\u001b[0m command first appeared in Version 3 AT&T UNIX.\r\n\r\n The \u001b[1m-w\u001b[0m option first appeared in Version 7 AT&T UNIX; \u001b[1m-f\u001b[0m and \u001b[1m-k\u001b[0m in 4BSD;\r\n \u001b[1m-M\u001b[0m in 4.3BSD; \u001b[1m-a\u001b[0m in 4.3BSD-Tahoe; \u001b[1m-c\u001b[0m and \u001b[1m-m\u001b[0m in 4.3BSD-Reno; \u001b[1m-h\u001b[0m in\r\n 4.3BSD-Net/2; \u001b[1m-C\u001b[0m in NetBSD 1.0; \u001b[1m-s\u001b[0m and \u001b[1m-S\u001b[0m in OpenBSD 2.3; and \u001b[1m-I\u001b[0m, \u001b[1m-K\u001b[0m, \u001b[1m-l\u001b[0m,\r\n \u001b[1m-O\u001b[0m, and \u001b[1m-W\u001b[0m in OpenBSD 5.7. The \u001b[1m-T\u001b[0m option first appeared in AT&T\r\n System III UNIX and was also added in OpenBSD 5.7.\r\n\r\nLinux 4.19.113-21375755 $Mdocdate: March 9 2019 $ Linux 4.19.113-21375755\r\n\u001b[7m(END)\u001b[27m\u001b[K"] [22.740865, "o", "\r\u001b[K\u0007\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"] [24.767147, "o", "\r\u001b[K\u001b[?1l\u001b>\u001b[?1049l\u001b[23;0;0t"] [24.769592, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [27.248747, "o", "l"] [27.389971, "o", "s"] [28.16309, "o", "\r\n\u001b[?2004l\r"] [28.175501, "o", "\u001b[0m\u001b[01;32m256colour.py\u001b[0m colour_globe.gif \u001b[01;32mfireworks.py\u001b[0m\t \u001b[01;32mimages.py\u001b[0m\t \u001b[01;34mmapscache\u001b[0m\t\u001b[01;32mplasma.py\u001b[0m\t\u001b[01;32mrendering.py\u001b[0m test2.rec\r\n\u001b[01;32mbars.py\u001b[0m \u001b[01;32mcontact_list.py\u001b[0m\t forms.log\t \u001b[01;32minteractive.py\u001b[0m \u001b[01;32mnoise.py\u001b[0m\t\u001b[01;32mplayer.py\u001b[0m\t\u001b[01;32msimple.py\u001b[0m tests.py\r\n\u001b[01;32mbasics.py\u001b[0m \u001b[01;32mcredits.py\u001b[0m\t \u001b[01;32mforms.py\u001b[0m\t \u001b[01;32mjulia.py\u001b[0m\t pacman.png\tpython.png\ttab_demo.py \u001b[01;32mtop.py\u001b[0m\r\n\u001b[01;32mbg_colours.py\u001b[0m \u001b[01;32mexperimental.py\u001b[0m\t globe.gif\t \u001b[01;32mkaleidoscope.py\u001b[0m \u001b[01;32mpacman.py\u001b[0m\t\u001b[01;32mquick_model.py\u001b[0m\t\u001b[01;32mterminal.py\u001b[0m \u001b[01;32mtreeview.py\u001b[0m\r\n\u001b[01;32mcogs.py\u001b[0m \u001b[01;32mfire.py\u001b[0m\t\t grumpy_cat.jpg \u001b[01;32mmaps.py\u001b[0m\t \u001b[01;32mparticles.py\u001b[0m\t\u001b[01;32mray_casting.py\u001b[0m\ttest.rec \u001b[01;32mxmas.py\u001b[0m\r\n"] [28.17728, "o", "\u001b[?2004h\u001b[0;32m~/asciimatics/samples\u001b[0m \u001b[0;97m$\u001b[0m "] [34.340603, "o", "\u001b[?2004l\r\r\nexit\r\n"] python-asciimatics-1.15.0/tests/renderers/test_base.py000066400000000000000000000051101511423144500230610ustar00rootroot00000000000000import unittest from asciimatics.renderers import StaticRenderer from asciimatics.screen import Screen class TestRenderers(unittest.TestCase): def test_height(self): """ Check that the max_height property works. """ # Max height should match largest height of any entry. renderer = StaticRenderer(images=["A\nB", "C "]) self.assertEqual(renderer.max_height, 2) def test_width(self): """ Check that the max_width property works. """ # Max width should match largest width of any entry. renderer = StaticRenderer(images=["A\nB", "C "]) self.assertEqual(renderer.max_width, 3) def test_images(self): """ Check that the images property works. """ # Images should be the parsed versions of the original strings. renderer = StaticRenderer(images=["A\nB", "C "]) images = renderer.images self.assertEqual(next(images), ["A", "B"]) self.assertEqual(next(images), ["C "]) def test_repr(self): """ Check that the string representation works. """ # String presentation should be the first image as a printable string. renderer = StaticRenderer(images=["A\nB", "C "]) self.assertEqual(str(renderer), "A\nB") def test_colour_maps(self): """ Check that the ${} syntax is parsed correctly. """ # Check the ${fg, attr, bg} variant renderer = StaticRenderer(images=["${3,1,2}*"]) output = renderer.rendered_text self.assertEqual(len(output[0]), len(output[1])) self.assertEqual(output[0], ["*"]) self.assertEqual( output[1][0][0], (Screen.COLOUR_YELLOW, Screen.A_BOLD, Screen.COLOUR_GREEN)) # Check the ${fg, attr} variant renderer = StaticRenderer(images=["${3,1}*"]) output = renderer.rendered_text self.assertEqual(len(output[0]), len(output[1])) self.assertEqual(output[0], ["*"]) self.assertEqual(output[1][0][0], (Screen.COLOUR_YELLOW, Screen.A_BOLD, None)) # Check the ${fg} variant renderer = StaticRenderer(images=["${1}XY${2}Z"]) output = renderer.rendered_text self.assertEqual(len(output[0]), len(output[1])) self.assertEqual(output[0], ["XYZ"]) self.assertEqual(output[1][0][0], (Screen.COLOUR_RED, 0, None)) self.assertEqual(output[1][0][1], (Screen.COLOUR_RED, 0, None)) self.assertEqual(output[1][0][2], (Screen.COLOUR_GREEN, 0, None)) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/renderers/test_charts.py000066400000000000000000000426521511423144500234470ustar00rootroot00000000000000import unittest from asciimatics.constants import ASCII_LINE, SINGLE_LINE from asciimatics.renderers import BarChart, VBarChart from asciimatics.screen import Screen # Internal test function for rendering def fn(x): return lambda: x class TestBarChart(unittest.TestCase): def test_defaults(self): renderer = BarChart(7, 17, [fn(10), fn(5)]) expected = ( "╔═══════════════╗\n" "║ ║\n" "║ │########## ║\n" "║ │ ║\n" "║ │##### ║\n" "║ ║\n" "╚═══════════════╝") self.assertEqual(str(renderer), expected) self.assertEqual("\n".join(renderer.images[0]), expected) def test_styles(self): renderer = BarChart(7, 17, [fn(10), fn(5)]) renderer.border_style = SINGLE_LINE self.assertEqual(str(renderer), "┌───────────────┐\n" "│ │\n" "│ │########## │\n" "│ │ │\n" "│ │##### │\n" "│ │\n" "└───────────────┘") renderer.border_style = ASCII_LINE renderer.axes_style = ASCII_LINE self.assertEqual(str(renderer), "+---------------+\n" "| |\n" "| |########## |\n" "| | |\n" "| |##### |\n" "| |\n" "+---------------+") def test_args_no_scale(self): renderer = BarChart(3, 10, [fn(10), fn(5)], char='=', border=False, axes=BarChart.NO_AXIS) self.assertEqual(str(renderer), "==========\n" + " \n" + "===== ") renderer = BarChart(7, 16, [fn(10), fn(5)], char='=', axes=BarChart.NO_AXIS) self.assertEqual(str(renderer), "╔══════════════╗\n" "║ ║\n" "║ ========== ║\n" "║ ║\n" "║ ===== ║\n" "║ ║\n" "╚══════════════╝") renderer = BarChart(7, 17, [fn(10), fn(5)], char='=', axes=BarChart.Y_AXIS) self.assertEqual(str(renderer), "╔═══════════════╗\n" "║ ║\n" "║ │========== ║\n" "║ │ ║\n" "║ │===== ║\n" "║ ║\n" "╚═══════════════╝") renderer = BarChart(8, 17, [fn(10), fn(5)], char='=', axes=BarChart.BOTH) self.assertEqual(str(renderer), "╔═══════════════╗\n" "║ ║\n" "║ │========== ║\n" "║ │ ║\n" "║ │===== ║\n" "║ └────────── ║\n" "║ ║\n" "╚═══════════════╝") renderer = BarChart(8, 21, [fn(10), fn(5)], char='=', axes=BarChart.BOTH, keys=['a', 'bbb']) self.assertEqual(str(renderer), "╔═══════════════════╗\n" "║ ║\n" "║ a │========== ║\n" "║ │ ║\n" "║ bbb │===== ║\n" "║ └────────── ║\n" "║ ║\n" "╚═══════════════════╝") renderer = BarChart(9, 21, [fn(10), fn(5)], char='=', axes=BarChart.BOTH, keys=['a', 'bbb'], labels=True) self.assertEqual(str(renderer), "╔═══════════════════╗\n" "║ ║\n" "║ a │========== ║\n" "║ │ ║\n" "║ bbb │===== ║\n" "║ └────────── ║\n" "║ 0 10 ║\n" "║ ║\n" "╚═══════════════════╝") renderer = BarChart(9, 21, [fn(10), fn(4)], char='=', axes=BarChart.BOTH, keys=['a', 'bbb'], labels=True, intervals=5) self.assertEqual(str(renderer), "╔═══════════════════╗\n" "║ ║\n" "║ a │========== ║\n" "║ │ │ ║\n" "║ bbb │====│ ║\n" "║ └────┴───── ║\n" "║ 0 5 10 ║\n" "║ ║\n" "╚═══════════════════╝") renderer = BarChart(8, 21, [fn(10), fn(4)], char='=', axes=BarChart.BOTH, keys=['a', 'bbb'], labels=True, intervals=5, gap=0) self.assertEqual(str(renderer), "╔═══════════════════╗\n" "║ ║\n" "║ a │========== ║\n" "║ bbb │====│ ║\n" "║ └────┴───── ║\n" "║ 0 5 10 ║\n" "║ ║\n" "╚═══════════════════╝") def test_scale(self): renderer = BarChart(5, 41, [fn(5), fn(10)], scale=10.0, axes=BarChart.BOTH, intervals=2.5, labels=True, border=False) self.assertEqual( str(renderer), # 1234567890123456789!12345678901234567890 "│#################### │ \n" + "│ │ │ │ \n" + "│########################################\n" + "└─────────┴─────────┴─────────┴──────────\n" + " 0 2.5 5.0 7.5 10.0") def test_gradients(self): gradients = [ (2, Screen.COLOUR_GREEN, Screen.COLOUR_BLUE), (4, Screen.COLOUR_YELLOW), (5, Screen.COLOUR_RED), ] renderer = BarChart(3, 5, [fn(5), fn(3), fn(1)], border=False, axes=BarChart.NO_AXIS, gap=0, gradient=gradients) self.assertEqual( renderer.rendered_text, ( #12345 ['#####', '### ', '# '], [ [ # First bar colour sets (2, 2, 4), # 2 ticks of green with blue background (2, 2, 4), (3, 2, 0), # 2 ticks of yellow with black background (3, 2, 0), (1, 2, 0) # 1 tick of red with black background ], [ # Second bar colour sets (2, 2, 4), # 2 ticks of green with blue background (2, 2, 4), (3, 2, 0), # 2 ticks of yellow with black background (None, 0, 0), # 2 ticks empty (None, 0, 0), ], [ # Third bar colour sets (2, 2, 4), # 1 tick of green with blue background (None, 0, 0), # 4 ticks empty (None, 0, 0), (None, 0, 0), (None, 0, 0), ], ] ) ) class TestVBarChart(unittest.TestCase): def test_defaults(self): renderer = VBarChart(15, 9, [fn(10), fn(5)]) expected = ( "╔═══════╗\n" "║ ║\n" "║ # ║\n" # 1 "║ # ║\n" # 2 "║ # ║\n" # 3 "║ # ║\n" # 4 "║ # ║\n" # 5 "║ # # ║\n" # 6 "║ # # ║\n" # 7 "║ # # ║\n" # 8 "║ # # ║\n" # 9 "║ # # ║\n" # 10 "║ ─── ║\n" "║ ║\n" "╚═══════╝") self.assertEqual(str(renderer), expected) self.assertEqual("\n".join(renderer.images[0]), expected) def test_args_no_scale(self): renderer = VBarChart(10, 3, [fn(10), fn(5)], border=False, axes=BarChart.NO_AXIS) self.assertEqual(str(renderer), "# \n" + # 1 "# \n" + # 2 "# \n" + # 3 "# \n" + # 4 "# \n" + # 5 "# #\n" + # 6 "# #\n" + # 7 "# #\n" + # 8 "# #\n" + # 9 "# #") # 10 renderer = VBarChart(14, 9, [fn(10), fn(5)], char="*", axes=BarChart.NO_AXIS) self.assertEqual(str(renderer), "╔═══════╗\n" + "║ ║\n" + "║ * ║\n" + # 1 "║ * ║\n" + # 2 "║ * ║\n" + # 3 "║ * ║\n" + # 4 "║ * ║\n" + # 5 "║ * * ║\n" + # 6 "║ * * ║\n" + # 7 "║ * * ║\n" + # 8 "║ * * ║\n" + # 9 "║ * * ║\n" + # 10 "║ ║\n" "╚═══════╝") renderer = VBarChart(15, 9, [fn(10), fn(5)], char="*", axes=BarChart.X_AXIS) self.assertEqual(str(renderer), "╔═══════╗\n" + "║ ║\n" + "║ * ║\n" + # 1 "║ * ║\n" + # 2 "║ * ║\n" + # 3 "║ * ║\n" + # 4 "║ * ║\n" + # 5 "║ * * ║\n" + # 6 "║ * * ║\n" + # 7 "║ * * ║\n" + # 8 "║ * * ║\n" + # 9 "║ * * ║\n" + # 10 "║ ─── ║\n" "║ ║\n" "╚═══════╝") renderer = VBarChart(15, 10, [fn(10), fn(5)], char="*", axes=BarChart.BOTH_AXES) self.assertEqual(str(renderer), "╔════════╗\n" + "║ ║\n" + "║ │* ║\n" + # 1 "║ │* ║\n" + # 2 "║ │* ║\n" + # 3 "║ │* ║\n" + # 4 "║ │* ║\n" + # 5 "║ │* * ║\n" + # 6 "║ │* * ║\n" + # 7 "║ │* * ║\n" + # 8 "║ │* * ║\n" + # 9 "║ │* * ║\n" + # 10 "║ └─── ║\n" "║ ║\n" "╚════════╝") renderer = VBarChart(16, 10, [fn(10), fn(5)], char="*", axes=BarChart.BOTH_AXES, keys=['a', 'b']) self.assertEqual(str(renderer), "╔════════╗\n" + "║ ║\n" + "║ │* ║\n" + # 1 "║ │* ║\n" + # 2 "║ │* ║\n" + # 3 "║ │* ║\n" + # 4 "║ │* ║\n" + # 5 "║ │* * ║\n" + # 6 "║ │* * ║\n" + # 7 "║ │* * ║\n" + # 8 "║ │* * ║\n" + # 9 "║ │* * ║\n" + # 10 "║ └─── ║\n" "║ a b ║\n" "║ ║\n" "╚════════╝") renderer = VBarChart(16, 13, [fn(10), fn(5)], char="*", axes=BarChart.BOTH_AXES, keys=['a', 'b'], labels=True) self.assertEqual(str(renderer), "╔═══════════╗\n" + "║ ║\n" + "║ 10│* ║\n" + # 1 "║ │* ║\n" + # 2 "║ │* ║\n" + # 3 "║ │* ║\n" + # 4 "║ │* ║\n" + # 5 "║ │* * ║\n" + # 6 "║ │* * ║\n" + # 7 "║ │* * ║\n" + # 8 "║ │* * ║\n" + # 9 "║ 0│* * ║\n" + # 10 "║ └─── ║\n" "║ a b ║\n" "║ ║\n" "╚═══════════╝") renderer = VBarChart(16, 13, [fn(10), fn(4)], char="*", axes=BarChart.BOTH_AXES, keys=['a', 'b'], labels=True, intervals=5) self.assertEqual(str(renderer), "╔═══════════╗\n" + "║ ║\n" + "║ 10├*── ║\n" + # 1 "║ │* ║\n" + # 2 "║ │* ║\n" + # 3 "║ │* ║\n" + # 4 "║ │* ║\n" + # 5 "║ 5├*── ║\n" + # 6 "║ │* * ║\n" + # 7 "║ │* * ║\n" + # 8 "║ │* * ║\n" + # 9 "║ 0│* * ║\n" + # 10 "║ └─── ║\n" "║ a b ║\n" "║ ║\n" "╚═══════════╝") renderer = VBarChart(16, 12, [fn(10), fn(4)], char="*", axes=BarChart.BOTH_AXES, keys=['a', 'b'], labels=True, intervals=5, gap=0) self.assertEqual(str(renderer), "╔══════════╗\n" + "║ ║\n" + "║ 10├*─ ║\n" + # 1 "║ │* ║\n" + # 2 "║ │* ║\n" + # 3 "║ │* ║\n" + # 4 "║ │* ║\n" + # 5 "║ 5├*─ ║\n" + # 6 "║ │** ║\n" + # 7 "║ │** ║\n" + # 8 "║ │** ║\n" + # 9 "║ 0│** ║\n" + # 10 "║ └── ║\n" "║ ab ║\n" "║ ║\n" "╚══════════╝") def test_scale(self): unittest.util._MAX_LENGTH = 160 renderer = VBarChart(11, 6, [fn(15), fn(5)], axes=BarChart.BOTH, labels=True, intervals=10, border=False, scale=20, gap=0) self.assertEqual(str(renderer), #123456 " 20├──\n" + # 10 " │ \n" + # 9 " │# \n" + # 8 " │# \n" + # 7 " │# \n" + # 6 " 10├#─\n" + # 5 " │# \n" + # 4 " │##\n" + # 3 " │##\n" + # 2 " 0│##\n" + # 1 " └──") renderer = VBarChart(11, 7, [fn(1.5), fn(0.5)], axes=BarChart.BOTH, labels=True, intervals=0.5, border=False, scale=2.0, gap=0) self.assertEqual(str(renderer), #1234567 ' 2.0├──\n' + # 10 ' │ \n' + # 9 ' 1.5├#─\n' + # 8 ' │# \n' + # 7 ' │# \n' + # 6 ' 1.0├#─\n' + # 5 ' │# \n' + # 4 ' 0.5├#─\n' + # 3 ' │##\n' + # 2 ' 0│##\n' + # 1 ' └──') def test_gradients(self): gradients = [ (2, Screen.COLOUR_GREEN, Screen.COLOUR_BLUE), (4, Screen.COLOUR_YELLOW), (5, Screen.COLOUR_RED), ] renderer = VBarChart(5, 3, [fn(5), fn(3), fn(1)], border=False, axes=BarChart.NO_AXIS, gap=0, gradient=gradients) # Gradient vertical bar chart, 3 bars turns into 5 rows: # # R00 # Y00 # GG0 <- background on Green squares is Blue # GG0 # GGG # unittest.util._MAX_LENGTH = 160 self.assertEqual( renderer.rendered_text, ( ['# ', '# ', '## ', '## ', '###'], [ [ (1, 2, 0), (None, 0, 0), (None, 0, 0) ], [ (3, 2, 0), (None, 0, 0), (None, 0, 0) ], [ (2, 2, 4), (2, 2, 4), (None, 0, 0) ], [ (2, 2, 4), (2, 2, 4), (None, 0, 0) ], [ (2, 2, 4), (2, 2, 4), (2, 2, 4) ] ] ) ) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/renderers/test_images.py000066400000000000000000000145011511423144500234200ustar00rootroot00000000000000import unittest import os import sys from unittest.mock import MagicMock from asciimatics.renderers import ImageFile, ColourImageFile from asciimatics.screen import Screen, Canvas if sys.platform != "win32": import curses class TestRendererImages(unittest.TestCase): def test_image_files(self): """ Check that the ImageFile renderer works. """ renderer = ImageFile( os.path.join(os.path.dirname(__file__), "globe.gif"), height=10) # Check renderer got all images from the file. count = 0 for image in renderer.images: count += 1 self.assertIsNotNone(image) self.assertIsNotNone(len(image) <= renderer.max_height) self.assertEqual(count, 11) # Check an image looks plausible image = next(renderer.images) self.maxDiff = None self.assertEqual( image, [' sA3h3h3Hr2 ', ' ;:;G#99G@&3;;;r ', ' :::#9&&@@G;rrrr;;3 ', '.:;;A&@AAGsssssrr;#H', '::;;;r39@srssssrr;A2', '.::;;rrrrr@@@@9;r;;A', 's::;;;;rr2@@@@@@#;; ', ' s:::;;;;;;9&&&3;: ', ' .:::;;;;9#r::2 ', ' s.::r:; ']) def test_image_files_256(self): """ Check that the ImageFile renderer works. """ renderer = ImageFile( os.path.join(os.path.dirname(__file__), "globe.gif"), height=10, colours=256) # Check an image looks plausible image = next(renderer.images) self.maxDiff = None self.assertEqual( image, [' sA3h3h3Hr2 ', ' ;:;G#99G@&3;;;r ', ' :::#9&&@@G;rrrr;;3 ', '.:;;A&@AAGsssssrr;#H', '::;;;r39@srssssrr;A2', '.::;;rrrrr@@@@9;r;;A', 's::;;;;rr2@@@@@@#;; ', ' s:::;;;;;;9&&&3;: ', ' .:::;;;;9#r::2 ', ' s.::r:; ']) def test_colour_image_file(self): """ Check that the ColourImageFile renderer works. """ def internal_checks(screen): # Check the original FG only rendering renderer = ColourImageFile( screen, os.path.join(os.path.dirname(__file__), "globe.gif"), height=10) # Check renderer got all images from the file. count = 0 for image in renderer.images: count += 1 self.assertIsNotNone(image) self.assertIsNotNone(len(image) <= renderer.max_height) self.assertEqual(count, 11) # Check an image looks plausible image = next(renderer.images) self.maxDiff = None self.assertEqual( image, [' ########## ', ' ############### ', ' ################## ', '####################', '####################', '####################', '################### ', ' ################# ', ' ############## ', ' ####### ']) # Also check the BG rendering renderer2 = ColourImageFile( screen, os.path.join(os.path.dirname(__file__), "globe.gif"), fill_background=True, height=10) # Check BG rendering doesn't change the visible text output. # Note that BG rendering needs to print dots for some terminals. image2 = [x.replace(".", " ") for x in next(renderer2.images)] self.assertEqual(image, image2) # Check BG rendering gives same colours for FG and BG as original # rendering for a, b in zip(renderer.rendered_text[1], renderer2.rendered_text[1]): for attr1, attr2 in zip(a, b): if attr1[0] is None: self.assertEqual(0, attr2[0]) self.assertEqual(0, attr2[2]) else: self.assertEqual(attr1[0], attr2[0]) self.assertEqual(attr2[0], attr2[2]) # Mock screen for better coverage. screen = MagicMock(spec=Screen, colours=16, unicode_aware=True, palette=Screen._8_palette) canvas = Canvas(screen, 15, 40, 0, 0) internal_checks(screen) def test_uni_image_files(self): """ Check that the unicode ColourImageFile rendering works. """ def internal_checks(screen): # Check the original FG only rendering renderer = ColourImageFile( screen, os.path.join(os.path.dirname(__file__), "globe.gif"), height=10, uni=True, dither=True) # Check renderer got all images from the file. count = 0 for image in renderer.images: count += 1 self.assertIsNotNone(image) self.assertIsNotNone(len(image) <= renderer.max_height) self.assertEqual(count, 11) # Check an image looks plausible image = next(renderer.images) self.assertEqual( image, ['....▄▄▄▄▄▄▄▄▄▄▄▄.....', '..▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄...', '.▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄..', '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄.', '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄.', '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄.', '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄..', '.▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄..', '..▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄....', '.....▄▄▄▄▄▄▄▄▄▄......']) # Mock screen for better coverage. screen = MagicMock(spec=Screen, colours=16, unicode_aware=True, palette=Screen._8_palette) canvas = Canvas(screen, 15, 40, 0, 0) internal_checks(screen) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/renderers/test_other.py000066400000000000000000000205261511423144500233000ustar00rootroot00000000000000import unittest import os import sys from asciimatics.renderers import (StaticRenderer, FigletText, SpeechBubble, Box, Rainbow, Fire, Plasma, Kaleidoscope, RotatedDuplicate, Scale, VScale) from asciimatics.screen import Screen if sys.platform != "win32": import curses class TestRendererOthers(unittest.TestCase): def test_figlet(self): """ Check that the Figlet renderer works. """ renderer = FigletText("hello") self.assertEqual( str(renderer), " _ _ _ \n" + "| |__ ___| | | ___ \n" + "| '_ \\ / _ \\ | |/ _ \\ \n" + "| | | | __/ | | (_) |\n" + "|_| |_|\\___|_|_|\\___/ \n" + " \n") def test_bubble(self): """ Check that the SpeechBubble renderer works. """ # Standard rendering. renderer = SpeechBubble("hello") self.assertEqual(str(renderer), ".-------.\n" + "| hello |\n" + "`-------`") # Left bubble. renderer = SpeechBubble("world", tail="L") self.assertEqual(str(renderer), ".-------.\n" + "| world |\n" + "`-------`\n" + " )/ \n" + "-\"`\n") # Right bubble renderer = SpeechBubble("bye!", tail="R") self.assertEqual(str(renderer), ".------.\n" + "| bye! |\n" + "`------`\n" + " \\( \n" + " `\"-\n") # Unicode rendering. renderer = SpeechBubble("hello", uni=True) self.assertEqual(str(renderer), "╭───────╮\n" "│ hello │\n" "╰───────╯") # Multiline text rendering text = "Hello\n" \ "World! \n" \ "Hello World!" renderer = SpeechBubble(text, uni=True) self.assertEqual(str(renderer), "╭──────────────╮\n" + "│ Hello │\n" + "│ World! │\n" + "│ Hello World! │\n" + "╰──────────────╯") # Test render height renderer = SpeechBubble("Hello World", uni=True) self.assertEqual(renderer.max_height, 3) def test_box(self): """ Check that the Box renderer works. """ renderer = Box(10, 3) self.assertEqual(str(renderer), "+--------+\n" + "| |\n" + "+--------+\n") # Unicode rendering. renderer = Box(10, 3, uni=True) self.assertEqual(str(renderer), "┌────────┐\n" + "│ │\n" + "└────────┘\n") def test_rainbow(self): """ Check that the Rainbow renderer works. """ # Skip for non-Windows if the terminal definition is incomplete. # This typically means we're running inside a non-standard terminal. # For example, this happens when embedded in PyCharm. if sys.platform != "win32": if not (("FORCE_TTY" in os.environ and os.environ["FORCE_TTY"] == "Y") or sys.stdout.isatty()): self.skipTest("Not a valid TTY") curses.initscr() if curses.tigetstr("ri") is None: self.skipTest("No valid terminal definition") def internal_checks(screen): # Create a base renderer plain_text = (".-------.\n" + "| hello |\n" + "`-------`") renderer = SpeechBubble("hello") self.assertEqual(str(renderer), plain_text) # Pretend that we always have an 8 colour palette for the test. screen.colours = 8 # Check that the Rainbow renderer doesn't change this. rainbow = Rainbow(screen, renderer) self.assertEqual(str(rainbow), plain_text) # Check rainbow colour scheme. self.assertEqual( rainbow.rendered_text[1], [ [(1, 1, None), (1, 1, None), (3, 1, None), (3, 1, None), (2, 1, None), (2, 1, None), (6, 1, None), (6, 1, None), (4, 1, None)], [(1, 1, None), (3, 1, None), (3, 1, None), (2, 1, None), (2, 1, None), (6, 1, None), (6, 1, None), (4, 1, None), (4, 1, None)], [(3, 1, None), (3, 1, None), (2, 1, None), (2, 1, None), (6, 1, None), (6, 1, None), (4, 1, None), (4, 1, None), (5, 1, None)]]) Screen.wrapper(internal_checks, height=15) def test_fire(self): """ Check that the Fire renderer works. """ # Allow the fire to burn for a bit... renderer = Fire(5, 10, "xxxxxxxx", 1.0, 20, 8) output = None for _ in range(100): output = renderer.rendered_text # Output should be something like this, but we can't check exactly due # to the random nature of the effect and the difference in RNG between # Python2 and Python3. # # " .:... \n" + # " .::. \n" + # " .:$$::.. \n" + # "..::$$$$. \n" + # " ..:$&&: " for char in "\n".join(output[0]): self.assertIn(char, " .:$&@\n") # Check dimensions self.assertEqual(renderer.max_height, 5) self.assertEqual(renderer.max_width, 10) # Check multi-line seeds work too... renderer = Fire(5, 10, "xxxx\nxxxx\nxxxx", 1.0, 20, 8) for _ in range(100): output = renderer.rendered_text for char in "\n".join(output[0]): self.assertIn(char, " .:$&@\n") # Check BG flag renders to BG colours only... renderer = Fire(5, 10, "xxxx\nxxxx\nxxxx", 1.0, 20, 8, bg=True) for _ in range(100): output = renderer.rendered_text for char in "\n".join(output[0]): self.assertIn(char, " \n") def test_plasma(self): """ Check that the Plasma renderer works. """ # Check basic content of the renderer renderer = Plasma(5, 10, 8) # Check several renderings for _ in range(10): output = renderer.rendered_text for char in "\n".join(output[0]): self.assertIn(char, ' .:;rsA23hHG#9&@\n') # Check dimensions self.assertEqual(renderer.max_height, 5) self.assertEqual(renderer.max_width, 10) def test_kaleidoscope(self): """ Check that the Kaleidoscope renderer works. """ # Check basic content of the renderer renderer = Kaleidoscope(5, 10, StaticRenderer(["# # #\n" * 5]), 3) # Check several renderings for _ in range(180): output = renderer.rendered_text for char in "\n".join(output[0]): self.assertIn(char, ' #\n') # Check dimensions self.assertEqual(renderer.max_height, 5) self.assertEqual(renderer.max_width, 10) def test_rotated_dup(self): """ Check that the RotatedDuplicate renderer works. """ # Check zero padding renderer = RotatedDuplicate(5, 2, StaticRenderer(["ASCII"])) self.assertEqual(renderer.rendered_text[0], ['ASCII', 'IICSA']) # Check negative padding renderer = RotatedDuplicate(3, 2, StaticRenderer(["ASCII\nRULES"])) self.assertEqual(renderer.rendered_text[0], ['ULE', 'ELU']) # Check positive padding renderer = RotatedDuplicate(7, 4, StaticRenderer(["ASCII"])) self.assertEqual(renderer.rendered_text[0], [' ', ' ASCII ', ' IICSA ', ' ']) def test_scale(self): renderer = Scale(25) self.assertEqual(str(renderer), "----+----1----+----2----+") def test_vscale(self): renderer = VScale(5) self.assertEqual(str(renderer), "1\n2\n3\n4\n5") if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/renderers/test_players.py000066400000000000000000000112501511423144500236300ustar00rootroot00000000000000import unittest import os from asciimatics.renderers import AnsiArtPlayer, AsciinemaPlayer class TestRendererPlayers(unittest.TestCase): def test_ansi_art(self): """ Check that ansi art player works. """ with AnsiArtPlayer(os.path.join(os.path.dirname(__file__), "test.ans"), height=5, width=20) as renderer: self.assertEqual( str(renderer), "This is a test file \n" + "with ansi codes... \n" + " \n" + " \n" + " ") self.assertEqual( str(renderer), "This is a test file \n" + "with ansi codes... \n" + "Check \n" + "here 2nd \n" + " ") self.assertEqual( str(renderer), "This is a test file \n" + " abab c \n" + "dheck \n" + "here 2nd \n" + "cbdeefghab ") self.assertEqual( str(renderer), " \n" + " \n" + " \n" + "123 \n" + " ") def test_asciinema(self): """ Check that asciinema player works. """ with AsciinemaPlayer(os.path.join(os.path.dirname(__file__), "test.rec"), max_delay=0.1) as renderer: self.assertEqual(renderer.max_height, 18) self.assertEqual(renderer.max_width, 134) # Check can play the file to the end. for _ in range(700): a = str(renderer) self.assertEqual(a, "~/asciimatics/samples $ ls \n" + "256colour.py colour_globe.gif fireworks.py images.py mapscache plasma.py rendering.py test2.rec \n" + "bars.py contact_list.py forms.log interactive.py noise.py player.py simple.py tests.py \n" + "basics.py credits.py forms.py julia.py pacman.png python.png tab_demo.py top.py \n" + "bg_colours.py experimental.py globe.gif kaleidoscope.py pacman.py quick_model.py terminal.py treeview.py \n" + "cogs.py fire.py grumpy_cat.jpg maps.py particles.py ray_casting.py test.rec xmas.py \n" + "~/asciimatics/samples $ \n" + "exit \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " ") if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_effects.py000066400000000000000000000502301511423144500216000ustar00rootroot00000000000000import unittest from datetime import datetime from unittest.mock import MagicMock, patch from random import randint import os import sys from asciimatics.effects import Print, Cycle, BannerText, Mirage, Scroll, \ Stars, Matrix, Snow, Wipe, Clock, Cog, RandomNoise, Julia, Sprite from asciimatics.paths import Path from asciimatics.renderers import FigletText, StaticRenderer from asciimatics.scene import Scene from asciimatics.screen import Screen, Canvas from asciimatics.sprites import Sam from tests.mock_objects import MockEffect if sys.platform != "win32": import curses class TestEffects(unittest.TestCase): def assert_blank(self, canvas): """ Check that a specified canvas is blank. """ for x in range(canvas.width): for y in range(canvas.height): self.assertEqual(canvas.get_from(x, y), (32, 7, 0, 0)) @staticmethod def check_canvas(canvas, my_buffer, assert_fn): changed = False for x in range(canvas.width): for y in range(canvas.height): value = canvas.get_from(x, y) assert_fn(value) if value != my_buffer[y][x]: changed = True my_buffer[y][x] = value return changed def test_text_effects(self): """ Check effects can be played. """ # Skip for non-Windows if the terminal definition is incomplete. # This typically means we're running inside a non-standard termina;. # For example, thi happens when embedded in PyCharm. if sys.platform != "win32": if not (("FORCE_TTY" in os.environ and os.environ["FORCE_TTY"] == "Y") or sys.stdout.isatty()): self.skipTest("Not a valid TTY") curses.initscr() if curses.tigetstr("ri") is None: self.skipTest("No valid terminal definition") # A lot of effects are just about the visual output working when played # so check that playing a load of text effects doesn't crash. # # It's really not a great test, but it's important to show Effects are # dynamically compatible with Screen.play(). def internal_checks(screen): screen.play([ Scene([ MockEffect(count=5), Print(screen, FigletText("hello"), 2), Cycle(screen, FigletText("world"), 6), BannerText(screen, FigletText("world"), 10, 3), Mirage(screen, FigletText("huh?"), 14, 2)], 0)]) Screen.wrapper(internal_checks, height=25) def test_scroll(self): """ Check that Scroll works. """ # Check that it will attempt to scroll the screen at the required rate. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) effect = Scroll(screen, 2) effect.reset() effect.update(1) screen.scroll.assert_not_called() effect.update(2) screen.scroll.assert_called_once() # Check there is no stop frame self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_cycle(self): """ Check that Cycle works. """ # Check that cycle swaps colours every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) effect = Cycle(screen, StaticRenderer(images=["hello"]), 2) effect.reset() # First 2 calls should do nothing and use black. effect.update(0) screen.centre.assert_not_called() effect.update(1) screen.centre.assert_called_with("hello", 2, 0) # Next 2 calls should do nothing and use red. screen.centre.reset_mock() effect.update(2) screen.centre.assert_not_called() effect.update(3) screen.centre.assert_called_with("hello", 2, 1) # Check there is no stop frame self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_banner(self): """ Check that BannerText works. """ # Check that banner redraws every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 10, 0, 0) effect = BannerText(canvas, StaticRenderer(images=["hello"]), 2, 3) effect.reset() effect.update(0) self.assertEqual(canvas.get_from(canvas.width - 1, 2), (ord("h"), 3, 0, 0)) effect.update(1) self.assertEqual(canvas.get_from(canvas.width - 1, 2), (ord("e"), 3, 0, 0)) my_buffer = [[(32, 7, 0, 0) for _ in range(10)] for _ in range(10)] for i in range(2, 12): effect.update(i) self.assertTrue(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), " helo"))) # Check there is some stop frame - will vary according to screen width self.assertGreater(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_print(self): """ Check that the Print Effect works. """ # Check that print only redraws on specified rate. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) effect = Print(screen, StaticRenderer(images=["hello"]), 2, 1) effect.reset() effect.update(0) screen.paint.assert_called_with( "hello", 1, 2, 7, attr=0, bg=0, colour_map=[(None, None, None) for _ in range(5)], transparent=True) screen.paint.reset_mock() effect.update(1) effect.update(2) effect.update(3) screen.paint.assert_not_called() # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_print_clear(self): """ Check that clear option works on Print. """ # Check that Stars randomly updates the Screen every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Print(canvas, StaticRenderer(images=["hello"]), 2, 1, clear=True, stop_frame=20) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] # Should only update on first iteration for i in range(20): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), " helo")), i in (0,19), f"Stopped on {i}") # Should be clear by now. self.assert_blank(canvas) def test_mirage(self): """ Check that Mirage works. """ # Check that Mirage randomly updates the Screen every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Mirage(canvas, FigletText("hello"), 3, 1) effect.reset() effect.update(0) self.assert_blank(canvas) effect.update(1) changed = False for x in range(canvas.width): for y in range(canvas.height): if canvas.get_from(x, y) != (32, 7, 0, 0): changed = True self.assertTrue(changed) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_stars(self): """ Check that Stars works. """ # Check that Stars randomly updates the Screen every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Stars(canvas, 100) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(10): effect.update(i) self.assertTrue(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), " .+x*"))) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_stars_pattern(self): """ Check that Stars custom pattern value works. """ # Check that Stars randomly updates the Screen every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Stars(canvas, 100, "TESTTESTTEST") effect.reset() my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(10): effect.update(i) self.assertTrue(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), " TES"))) def test_matrix(self): """ Check that the Matrix works. """ # Check that Matrix randomly updates the Screen every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Matrix(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(10): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertTrue(value[0] == 32 or value[1] == 2)), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_snow(self): """ Check that Snow works. """ # Check that Snow randomly updates the Screen every 3rd frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Snow(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(60): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), ".+* ,;#@")), i % 3 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_wipe(self): """ Check that Wipe works. """ # Check that Wipe clears lines going down the screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Wipe(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for x in range(canvas.width): for y in range(canvas.height): canvas.print_at(chr(randint(1, 128)), x, y) my_buffer[y][x] = canvas.get_from(x, y) for i in range(10): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) @patch("datetime.datetime") def test_clock(self, mock_datetime): """ Check that Clock works. """ # Check that Clock updates every second. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) mock_datetime.now.return_value = datetime mock_datetime.side_effect = lambda *args, **kw: datetime(*args, **kw) canvas = Canvas(screen, 10, 40, 0, 0) effect = Clock(canvas, 10, 5, 5) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] # Set a time for the next update and check it is drawn. mock_datetime.now.return_value = \ datetime(1900, 1, 2, 3, 59, 40) effect.update(0) mock_datetime.now.assert_called() self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), True) # Check redrawing with the same time has no effect. mock_datetime.now.reset_mock() mock_datetime.now.return_value = \ datetime(1900, 1, 2, 3, 59, 40) effect.update(1) mock_datetime.now.assert_called() self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), False) # Check a new time results in an update. mock_datetime.now.reset_mock() mock_datetime.now.return_value = \ datetime(1900, 1, 2, 3, 59, 41) effect.update(2) mock_datetime.now.assert_called() self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), True) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_sprite(self): """ Check that Sprites work. """ # Check that we can move a Sprite around the screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) path = Path() path.jump_to(10, 5) path.move_straight_to(20, 10, 5) path.move_straight_to(30, 5, 5) path.move_straight_to(20, 0, 5) path.move_straight_to(10, 5, 5) effect = Sam(canvas, path) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(30): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), i % 2 == 0, "Bad update on frame %d" % i) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # Static paths should pay no attention to events. event = object() self.assertEqual(event, effect.process_event(event)) def test_sprite_speed(self): """ Check that Sprites speed parameter . """ # Check that sprite only redraws on specified rate. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) path = Path() path.jump_to(10, 5) effect = Sprite( screen, renderer_dict={ "default": StaticRenderer(images=["X"]) }, path=path) effect.reset() effect.update(0) screen.paint.assert_called_with('X', 10, 5, 7, colour_map=[(None, None, None)]) screen.paint.reset_mock() effect.update(1) screen.paint.assert_not_called() # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_sprite_overlap(self): """ Check that Sprites detect overlap. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) path = Path() path.jump_to(10, 5) effect1 = Sam(canvas, path) effect2 = Sam(canvas, path) # These 2 sprites should overlap! effect1.reset() effect1.update(0) effect2.reset() effect2.update(0) self.assertTrue(effect1.overlaps(effect2)) # Now create a sprite that shouldn't quite overlap width = effect1.last_position()[2] path = Path() path.jump_to(10 + width, 5) effect2 = Sam(canvas, path) effect2.reset() effect2.update(0) self.assertFalse(effect1.overlaps(effect2)) def test_cog(self): """ Check that Cog works. """ # Check that Cog updates the Screen every other frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Cog(canvas, 10, 5, 5) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(20): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn( chr(value[0]), " ''^.|/7.\\|Ywbd#")), i % 2 == 0) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_noise(self): """ Check that RandomNoise works. """ # Check that RandomNoise updates every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = RandomNoise(canvas, signal=StaticRenderer(images=["hello world!"])) effect.reset() effect._step = 0.1 effect2 = RandomNoise(canvas) effect2.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(30): effect.update(i) effect2.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertLess(value[0], 129)), True) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) def test_julia(self): """ Check that Julia works. """ # Check that Julia updates every frame. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) effect = Julia(canvas) effect.reset() self.assert_blank(canvas) my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] for i in range(20): effect.update(i) self.assertEqual(self.check_canvas( canvas, my_buffer, lambda value: self.assertIn(chr(value[0]), '@&9#GHh32As;:. ')), True) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) # This effect should ignore events. event = object() self.assertEqual(event, effect.process_event(event)) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_events.py000066400000000000000000000015101511423144500214620ustar00rootroot00000000000000import unittest from asciimatics.event import KeyboardEvent, MouseEvent class TestEvents(unittest.TestCase): def test_keyboard_event(self): """ Check Keyboard event is consistent. """ code = 123 event = KeyboardEvent(code) self.assertEqual(event.key_code, code) self.assertIn(str(code), str(event)) def test_mouse_event(self): """ Check Mouse event is consistent. """ x = 1 y = 2 buttons = MouseEvent.DOUBLE_CLICK event = MouseEvent(x, y, buttons) self.assertEqual(event.x, x) self.assertEqual(event.y, y) self.assertEqual(event.buttons, buttons) self.assertIn(f"({x}, {y})", str(event)) self.assertIn(str(buttons), str(event)) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_exceptions.py000066400000000000000000000014361511423144500223460ustar00rootroot00000000000000import unittest from asciimatics.exceptions import ResizeScreenError, StopApplication from asciimatics.scene import Scene from tests.mock_objects import MockEffect class TestExceptions(unittest.TestCase): def test_resize(self): """ Check that we can create a ResizeScreenError """ scene = Scene([MockEffect()]) message = "Test message" error = ResizeScreenError(message, scene) self.assertEqual(error.scene, scene) self.assertEqual(str(error), message) def test_stop_app(self): """ Check that we can create a StopApplication. """ message = "Test message" error = StopApplication(message) self.assertEqual(str(error), message) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_parsers.py000066400000000000000000000327141511423144500216470ustar00rootroot00000000000000import unittest from asciimatics.parsers import AsciimaticsParser, AnsiTerminalParser, ControlCodeParser, Parser import asciimatics.constants as constants class TestParsers(unittest.TestCase): def test_controlcode_parser(self): """ Check ControlCodeParser works as expected """ parser = ControlCodeParser() parser.reset("\0\b\ra[", colours=(1, 2, 3)) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.CHANGE_COLOURS, (1, 2, 3))) self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "^@")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "^H")) self.assertEqual(next(tokens), (2, Parser.DISPLAY_TEXT, "^M")) self.assertEqual(next(tokens), (3, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, "[")) def test_asciimatics_parser(self): """ Check AsciimaticsParser works as expected. """ parser = AsciimaticsParser() parser.reset("a${1}b${2,1}c${3,2,4}de${7}", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.CHANGE_COLOURS, (1, 0, None))) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) self.assertEqual(next(tokens), (6, Parser.CHANGE_COLOURS, (2, 1, None))) self.assertEqual(next(tokens), (6, Parser.DISPLAY_TEXT, "c")) self.assertEqual(next(tokens), (13, Parser.CHANGE_COLOURS, (3, 2, 4))) self.assertEqual(next(tokens), (13, Parser.DISPLAY_TEXT, "d")) self.assertEqual(next(tokens), (22, Parser.DISPLAY_TEXT, "e")) self.assertEqual(next(tokens), (23, Parser.CHANGE_COLOURS, (7, 0, None))) with self.assertRaises(StopIteration): next(tokens) def test_ansi_terminal_parser_colours(self): """ Check AnsiTerminalParser basic colours work as expected. """ parser = AnsiTerminalParser() parser.reset("a\x1B[23ab\x1B[0mc\x1B[1md\x1B[2me\x1B[7mf\x1B[27mg\x1B[31;42mh\x1B[m", None) tokens = parser.parse() # Normal text self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) # Unknown escape code self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) # Reset self.assertEqual(next(tokens), (7, Parser.CHANGE_COLOURS, (7, constants.A_NORMAL, 0))) self.assertEqual(next(tokens), (7, Parser.DISPLAY_TEXT, "c")) # Bold self.assertEqual(next(tokens), (12, Parser.CHANGE_COLOURS, (7, constants.A_BOLD, 0))) self.assertEqual(next(tokens), (12, Parser.DISPLAY_TEXT, "d")) # Normal self.assertEqual(next(tokens), (17, Parser.CHANGE_COLOURS, (7, constants.A_NORMAL, 0))) self.assertEqual(next(tokens), (17, Parser.DISPLAY_TEXT, "e")) # Inverse self.assertEqual(next(tokens), (22, Parser.CHANGE_COLOURS, (7, constants.A_REVERSE, 0))) self.assertEqual(next(tokens), (22, Parser.DISPLAY_TEXT, "f")) # Unset inverse self.assertEqual(next(tokens), (27, Parser.CHANGE_COLOURS, (7, constants.A_NORMAL, 0))) self.assertEqual(next(tokens), (27, Parser.DISPLAY_TEXT, "g")) # Standard colours, using multiple parameters self.assertEqual(next(tokens), (33, Parser.CHANGE_COLOURS, (constants.COLOUR_RED, constants.A_NORMAL, constants.COLOUR_GREEN))) self.assertEqual(next(tokens), (33, Parser.DISPLAY_TEXT, "h")) # Final escape sequence with no visible text is returned with no text. self.assertEqual(next(tokens), (42, Parser.CHANGE_COLOURS, (constants.COLOUR_WHITE, constants.A_NORMAL, constants.COLOUR_BLACK))) with self.assertRaises(StopIteration): next(tokens) def test_ansi_terminal_parser_def_colours(self): """ Check AnsiTerminalParser default colours work as expected. """ parser = AnsiTerminalParser() parser.reset("a\x1B[39mb\x1B[49mc", None) tokens = parser.parse() # Normal text self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) # Default foreground colour self.assertEqual(next(tokens), (1, Parser.CHANGE_COLOURS, (constants.COLOUR_DEFAULT, None, None))) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) # Default background colour self.assertEqual(next(tokens), (7, Parser.CHANGE_COLOURS, (constants.COLOUR_DEFAULT, None, constants.COLOUR_DEFAULT))) self.assertEqual(next(tokens), (7, Parser.DISPLAY_TEXT, "c")) def test_ansi_terminal_parser_palette(self): """ Check AnsiTerminalParser colour palettes work as expected. """ parser = AnsiTerminalParser() parser.reset( "\x1B[38;1ma\x1B[38;5;17mb\x1B[48;2;1;2;3mc\x1B[48;5;54md\x1B[999me\x1B[93m\x1B[104m", None) tokens = parser.parse() # Bad colour scheme - ignore self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) # Standard colour palette self.assertEqual(next(tokens), (8, Parser.CHANGE_COLOURS, (17, None, None))) self.assertEqual(next(tokens), (8, Parser.DISPLAY_TEXT, "b")) # RGB colour scheme - ignore self.assertEqual(next(tokens), (19, Parser.DISPLAY_TEXT, "c")) # Standard colour palette self.assertEqual(next(tokens), (33, Parser.CHANGE_COLOURS, (17, None, 54))) self.assertEqual(next(tokens), (33, Parser.DISPLAY_TEXT, "d")) # Unknown parameter self.assertEqual(next(tokens), (44, Parser.DISPLAY_TEXT, "e")) # Intense colour palette self.assertEqual(next(tokens), (51, Parser.CHANGE_COLOURS, (11, None, 54))) self.assertEqual(next(tokens), (51, Parser.CHANGE_COLOURS, (11, None, 12))) def test_ansi_terminal_parser_cursor(self): """ Check AnsiTerminalParser cursor movement work as expected. """ parser = AnsiTerminalParser() parser.reset("aa\x08b\rc\x1B[Cdd\x1B[De\x1B[A\x1B[B\x1B[1;2H\x1B[?25h\x1B[?25l\r", None) tokens = parser.parse() # Normal text... self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "a")) # Backspace and overwrite. self.assertEqual(next(tokens), (2, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (2, Parser.DISPLAY_TEXT, "b")) # Carriage return and overwrite self.assertEqual(next(tokens), (4, Parser.MOVE_ABSOLUTE, (0, None))) self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, "c")) # Move cursor forwards and append. self.assertEqual(next(tokens), (6, Parser.MOVE_RELATIVE, (1, 0))) self.assertEqual(next(tokens), (6, Parser.DISPLAY_TEXT, "d")) self.assertEqual(next(tokens), (10, Parser.DISPLAY_TEXT, "d")) # Move cursor backwards and overwrite. self.assertEqual(next(tokens), (11, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (11, Parser.DISPLAY_TEXT, "e")) # Move cursor up and down. self.assertEqual(next(tokens), (15, Parser.MOVE_RELATIVE, (0, -1))) self.assertEqual(next(tokens), (15, Parser.MOVE_RELATIVE, (0, 1))) # Move cursor to location self.assertEqual(next(tokens), (15, Parser.MOVE_ABSOLUTE, (1, 0))) # Show/hide cursor self.assertEqual(next(tokens), (15, Parser.SHOW_CURSOR, True)) self.assertEqual(next(tokens), (15, Parser.SHOW_CURSOR, False)) # Trailing Carriage return self.assertEqual(next(tokens), (15, Parser.MOVE_ABSOLUTE, (0, None))) def test_ansi_terminal_parser_delete(self): """ Check AnsiTerminalParser delete operations work as expected. """ parser = AnsiTerminalParser() # Delete to end of line parser.reset("abcde\x08\x08\x08\x1B[K", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) self.assertEqual(next(tokens), (2, Parser.DISPLAY_TEXT, "c")) self.assertEqual(next(tokens), (3, Parser.DISPLAY_TEXT, "d")) self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, "e")) self.assertEqual(next(tokens), (5, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (5, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (5, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (5, Parser.DELETE_LINE, 0)) with self.assertRaises(StopIteration): next(tokens) # Delete to start of line parser.reset("abcde\x1B[1K", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) self.assertEqual(next(tokens), (2, Parser.DISPLAY_TEXT, "c")) self.assertEqual(next(tokens), (3, Parser.DISPLAY_TEXT, "d")) self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, "e")) self.assertEqual(next(tokens), (5, Parser.DELETE_LINE, 1)) with self.assertRaises(StopIteration): next(tokens) # Delete line parser.reset("abcde\x1B[2K", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) self.assertEqual(next(tokens), (2, Parser.DISPLAY_TEXT, "c")) self.assertEqual(next(tokens), (3, Parser.DISPLAY_TEXT, "d")) self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, "e")) self.assertEqual(next(tokens), (5, Parser.DELETE_LINE, 2)) with self.assertRaises(StopIteration): next(tokens) # Delete char parser.reset("abcde\x08\x08\x08\x1B[P", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) self.assertEqual(next(tokens), (2, Parser.DISPLAY_TEXT, "c")) self.assertEqual(next(tokens), (3, Parser.DISPLAY_TEXT, "d")) self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, "e")) self.assertEqual(next(tokens), (5, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (5, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (5, Parser.MOVE_RELATIVE, (-1, 0))) self.assertEqual(next(tokens), (5, Parser.DELETE_CHARS, 1)) with self.assertRaises(StopIteration): next(tokens) def test_ansi_terminal_parser_errors(self): """ Check AnsiTerminalParser handles unsupported encodings gracefully. """ parser = AnsiTerminalParser() parser.reset("a\x1BZb\x01c", None) tokens = parser.parse() # Ignore unknown escape and next letter self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) # ANSI art uses control codes for special characters - check we just blank them. self.assertEqual(next(tokens), (4, Parser.DISPLAY_TEXT, " ")) # Back to normal. self.assertEqual(next(tokens), (5, Parser.DISPLAY_TEXT, "c")) def test_ansi_terminal_parser_tab(self): """ Check AnsiTerminalParser handles tabs. """ parser = AnsiTerminalParser() parser.reset("\x09", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.NEXT_TAB, None)) def test_ansi_terminal_parser_clear(self): """ Check AnsiTerminalParser clears screen. """ parser = AnsiTerminalParser() parser.reset("\x1B[2J", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.CLEAR_SCREEN, None)) def test_ansi_terminal_parser_os_cmd(self): """ Check AnsiTerminalParser removes OS commands. """ parser = AnsiTerminalParser() parser.reset("a\x1B]do something;stuff:to^ignore\x07b", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) self.assertEqual(next(tokens), (1, Parser.DISPLAY_TEXT, "b")) def test_ansi_terminal_parser_bell(self): """ Check AnsiTerminalParser handles bell. """ parser = AnsiTerminalParser() parser.reset("\x07", None) tokens = parser.parse() with self.assertRaises(StopIteration): next(tokens) def test_ansi_terminal_parser_start_colour(self): """ Check AnsiTerminalParser uses the starting colours. """ parser = AnsiTerminalParser() parser.reset("a", colours=(1,2,3)) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.CHANGE_COLOURS, (1, 2, 3))) self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) def test_ansi_terminal_parser_unknown(self): """ Check AnsiTerminalParser ignores unknown codes. """ parser = AnsiTerminalParser() parser.reset("a\x1B[2345£", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) with self.assertRaises(StopIteration): next(tokens) parser.reset("a\x1B", None) tokens = parser.parse() self.assertEqual(next(tokens), (0, Parser.DISPLAY_TEXT, "a")) with self.assertRaises(StopIteration): next(tokens) python-asciimatics-1.15.0/tests/test_particles.py000066400000000000000000000133531511423144500221540ustar00rootroot00000000000000import random import unittest from unittest.mock import MagicMock from asciimatics.particles import ShootScreen, DropScreen, Explosion, Rain, \ StarFirework, PalmFirework, RingFirework, SerpentFirework from asciimatics.screen import Screen, Canvas class TestParticles(unittest.TestCase): def setUp(self): random.seed(42) def check_effect(self, canvas, effect, assert_fn, is_blank=True, iterations=40, warm_up=0): """ Basic checks for all effects. Since they are all randomised to a certain extent, just check the overall content for expected values. """ # Asciimatics always calls reset on entering a new Scene. effect.reset() # Check canvas is in desired starting state. if is_blank: for x in range(canvas.width): for y in range(canvas.height): self.assertEqual(canvas.get_from(x, y), (32, 7, 0, 0)) # Set up blank my_buffer - OK this should copy the existing screen, but # we just lose one iteration on the checks (when not really blank). my_buffer = [[(32, 7, 0, 0) for _ in range(40)] for _ in range(10)] # Re-draw comparing the my_buffer with what's on the canvas for i in range(iterations): effect.update(i) changed = False if i >= warm_up: view = "" for y in range(canvas.height): for x in range(canvas.width): value = canvas.get_from(x, y) assert_fn(value) if value != my_buffer[y][x]: changed = True my_buffer[y][x] = value view += chr(value[0]) view += "\n" self.assertTrue(changed, "failed at step %d %s" % (i, view)) # Check there is no stop frame by default. self.assertEqual(effect.stop_frame, 0) def test_shoot_screen(self): """ Test that ShootScreen works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) canvas.centre("Hello World!", 5) effect = ShootScreen(canvas, canvas.width // 2, canvas.height // 2, 100, diameter=10) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), 'HeloWrd! '), is_blank=False, iterations=4) def test_drop_screen(self): """ Test that DropScreen works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) canvas.centre("Hello World!", 0) effect = DropScreen(canvas, 100) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), 'HeloWrd! '), is_blank=False, warm_up=3, iterations=10) def test_explosion(self): """ Test that Explosion works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) effect = Explosion(canvas, 4, 4, 25) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), ' #'), iterations=25) def test_rain(self): """ Test that Rain works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) effect = Rain(canvas, 200) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), ' `\\v')) def test_star_firework(self): """ Test that StarFirework works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) effect = StarFirework(canvas, 4, 4, 25) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), '|+:,. '), iterations=25) def test_palm_firework(self): """ Test that PalmFirework works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) effect = PalmFirework(canvas, 4, 4, 25) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), '|*+:,. '), iterations=26) def test_ring_firework(self): """ Test that RingFirework works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) effect = RingFirework(canvas, 4, 4, 25) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), '|*:. '), iterations=15) def test_serpent_firework(self): """ Test that SerpentFirework works as expected. """ screen = MagicMock(spec=Screen, colours=8) canvas = Canvas(screen, 10, 40, 0, 0) effect = SerpentFirework(canvas, 4, 4, 25) self.check_effect(canvas, effect, lambda value: self.assertIn(chr(value[0]), '|+- '), iterations=20) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_paths.py000066400000000000000000000053431511423144500213050ustar00rootroot00000000000000import unittest from asciimatics.event import MouseEvent from asciimatics.paths import Path, DynamicPath class TestPaths(unittest.TestCase): def assert_path_equals(self, path, oracle): path.reset() positions = [] while not path.is_finished(): positions.append(path.next_pos()) self.assertEqual(positions, oracle) def test_jump_and_wait(self): """ Check basic movement of cursor works. """ path = Path() path.jump_to(10, 10) path.wait(3) self.assert_path_equals(path, [(10, 10), (10, 10), (10, 10), (10, 10)]) def test_straight_lines(self): """ Check a path works in straight lines. """ # Horizontal path = Path() path.jump_to(10, 10) path.move_straight_to(15, 10, 5) self.assert_path_equals( path, [(10, 10), (11, 10), (12, 10), (13, 10), (14, 10), (15, 10)]) # Vertical path = Path() path.jump_to(5, 5) path.move_straight_to(5, 10, 5) self.assert_path_equals( path, [(5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (5, 10)]) # Diagonal spaced path = Path() path.jump_to(5, 5) path.move_straight_to(15, 15, 5) self.assert_path_equals( path, [(5, 5), (7, 7), (9, 9), (11, 11), (13, 13), (15, 15)]) def test_spline(self): """ Check a path works with a spline curve. """ path = Path() path.jump_to(0, 10) path.move_round_to([(0, 10), (20, 0), (40, 10), (20, 20), (0, 10)], 20) self.assert_path_equals( path, [(0, 10), (0, 10), (0, 10), (0, 10), (0, 10), (5, 7), (10, 4), (15, 1), (20, 0), (25, 1), (30, 3), (35, 7), (40, 10), (35, 12), (30, 16), (25, 18), (20, 20), (15, 18), (10, 15), (5, 12), (0, 10)]) def test_dynamic_path(self): """ Check a dynamic path works as expected. """ class TestPath(DynamicPath): def process_event(self, event): # Assume that we're always passing in a MouseEvent. self._x = event.x self._y = event.y # Initial path should start at specified location. path = TestPath(None, 0, 0) self.assertEqual(path.next_pos(), (0, 0)) self.assertFalse(path.is_finished()) # Process event should move location. path.process_event(MouseEvent(10, 5, 0)) self.assertEqual(path.next_pos(), (10, 5)) # Reset should return to original location. path.reset() self.assertEqual(path.next_pos(), (0, 0)) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_scene.py000066400000000000000000000041141511423144500212560ustar00rootroot00000000000000import unittest from asciimatics.event import MouseEvent from asciimatics.scene import Scene from tests.mock_objects import MockEffect class TestScene(unittest.TestCase): def test_properties(self): """ Check properties work as expected. """ effect = MockEffect() scene = Scene([effect], duration=10, clear=False, name="blah") self.assertEqual(scene.name, "blah") self.assertEqual(scene.duration, 10) self.assertFalse(scene.clear) def test_dynamic_effects(self): """ Check adding and removing effects works. """ # Start with no effects effect = MockEffect() scene = Scene([], duration=10) self.assertEqual(scene.effects, []) # Add one - check internals for presence scene.add_effect(effect) self.assertEqual(scene.effects, [effect]) # Remove it - check it's gone scene.remove_effect(effect) self.assertEqual(scene.effects, []) def test_events(self): """ Check event processing is queued correctly. """ # Check that the scene passes events through to the effects effect1 = MockEffect() effect2 = MockEffect() scene = Scene([effect1, effect2], duration=10) scene.process_event(MouseEvent(10, 5, 0)) self.assertTrue(effect1.event_called) self.assertTrue(effect2.event_called) # Check that the scene passes stops event processing when required effect1 = MockEffect() effect2 = MockEffect(swallow=True) scene = Scene([effect1, effect2], duration=10) scene.process_event(MouseEvent(10, 5, 0)) self.assertFalse(effect1.event_called) self.assertTrue(effect2.event_called) def test_save(self): """ Check scene will save data on exit if needed. """ effect = MockEffect() scene = Scene([effect], duration=10) self.assertFalse(effect.save_called) scene.exit() self.assertTrue(effect.save_called) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_screen.py000066400000000000000000001201361511423144500214430ustar00rootroot00000000000000import os from random import randint import unittest from unittest.mock import MagicMock import sys import time from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import StopApplication, NextScene try: from asciimatics.screen import _SignalState except ImportError: pass from asciimatics.scene import Scene from asciimatics.screen import Screen, Canvas, ManagedScreen, _DoubleBuffer from tests.mock_objects import MockEffect if sys.platform == "win32": import win32console import win32con else: import signal import curses def check_screen_and_canvas(screen, fn): """ Helper function to check that a Screen and Canvas work identically. :param screen: The screen object to use for the test. :param fn: The function to call for the test. """ for test_object in (screen, Canvas(screen, screen.height, screen.width)): fn(test_object) class TestScreen(unittest.TestCase): def setUp(self): # Skip for non-Windows if the terminal definition is incomplete. # This typically means we're running inside a non-standard terminal. # For example, this happens when embedded in PyCharm. if sys.platform != "win32": if not (("FORCE_TTY" in os.environ and os.environ["FORCE_TTY"] == "Y") or sys.stdout.isatty()): self.skipTest("Not a valid TTY") curses.initscr() if curses.tigetstr("ri") is None: self.skipTest("No valid terminal definition") def assert_canvas_equals(self, canvas, expected, height=10, width=75): """ Assert output to canvas/screen is as expected. """ # TODO: Merge with widget test function of the same name. output = "" for y in range(height): for x in range(width): try: char, _, _, _ = canvas.get_from(x, y) except Exception: raise RuntimeError(f"{x} {y}") output += chr(char) output += "\n" self.assertEqual(output, expected) def test_wrapper(self): """ Check that you can create a blank Screen. """ def internal_checks(screen): # Check screen basically exists self.assertIsNotNone(screen) self.assertGreater(screen.width, 0) self.assertGreater(screen.height, 0) self.assertGreater(screen.colours, 0) # Check that the Screen is cleared ready for use. for x in range(screen.width): for y in range(screen.height): char, fg, attr, bg = screen.get_from(x, y) self.assertEqual(char, ord(" ")) self.assertEqual(fg, Screen.COLOUR_WHITE) self.assertEqual(attr, 0) self.assertEqual(bg, Screen.COLOUR_BLACK) Screen.wrapper(internal_checks) def test_wrapper_return(self): """ Check that you get the result back from the wrapped function. """ def internal_checks(_): return True self.assertTrue(Screen.wrapper(internal_checks)) def test_print_and_get(self): """ Check that basic print_at and get_from work as expected. """ def internal_checks(screen): for x in range(screen.width): for y in range(15): char = randint(0, 255) fg = randint(Screen.COLOUR_DEFAULT, Screen.COLOUR_WHITE) bg = randint(Screen.COLOUR_DEFAULT, Screen.COLOUR_WHITE) attr = randint(0, Screen.A_UNDERLINE) screen.print_at(chr(char), x, y, fg, attr, bg) char2, fg2, attr2, bg2 = screen.get_from(x, y) self.assertEqual(char, char2) self.assertEqual(fg, fg2) self.assertEqual(attr, attr2) self.assertEqual(bg, bg2) Screen.wrapper( check_screen_and_canvas, height=15, arguments=[internal_checks]) def test_highlight(self): """ Check that highlight works as expected. """ def internal_checks(screen): for x in range(screen.width): for y in range(15): char = randint(0, 255) fg = randint(Screen.COLOUR_RED, Screen.COLOUR_WHITE) bg = randint(Screen.COLOUR_RED, Screen.COLOUR_WHITE) attr = randint(0, Screen.A_UNDERLINE) screen.print_at(chr(char), x, y, fg, attr, bg) # Check BG highlight first. screen.highlight(-1, -1, screen.width + 2, screen.height + 2, bg=0) for x in range(screen.width): for y in range(15): _, fg2, _, bg2 = screen.get_from(x, y) self.assertEqual(bg2, 0) self.assertNotEqual(fg2, 0) # Now check FG highlighting. screen.highlight(-1, -1, screen.width + 2, screen.height + 2, fg=0) for x in range(screen.width): for y in range(15): _, fg2, _, bg2 = screen.get_from(x, y) self.assertEqual(bg2, 0) self.assertEqual(fg2, 0) # Now check blending. screen.print_at("*" * screen.width, 0, 0, Screen.COLOUR_CYAN, Screen.A_NORMAL, Screen.COLOUR_YELLOW) screen.highlight(0, 0, screen.width, 1, fg=0, bg=0, blend=50) for x in range(screen.width): _, fg2, _, bg2 = screen.get_from(x, 0) self.assertEqual(bg2, 0) self.assertEqual(fg2, 0) Screen.wrapper( check_screen_and_canvas, height=15, arguments=[internal_checks]) def test_visible(self): """ Check that is_visible works as expected. """ def internal_checks(screen): # Check some points that must always be visible self.assertTrue(screen.is_visible(0, 0)) self.assertTrue(screen.is_visible( screen.width - 1, screen.height - 1)) # Check some points that cannot be visible self.assertFalse(screen.is_visible(-1, -1)) self.assertFalse(screen.is_visible( screen.width, screen.height)) Screen.wrapper( check_screen_and_canvas, height=15, arguments=[internal_checks]) def test_paint(self): """ Check that paint with colour map works. """ def internal_checks(screen): # Put a simple colour map to screen. screen.paint( "Text", 0, 0, colour_map=((1, 0, 4), (2, 0, 3), (3, 0, 2), (4, 0, 1))) # Check it is rendered as expected. char, fg, _, bg = screen.get_from(0, 0) self.assertEqual(fg, 1) self.assertEqual(bg, 4) char, fg, _, bg = screen.get_from(3, 0) self.assertEqual(fg, 4) self.assertEqual(bg, 1) Screen.wrapper( check_screen_and_canvas, height=15, arguments=[internal_checks]) def test_limits(self): """ Check that get_from and print_at limit checking works. """ def internal_checks(screen): # Check we have some canvas dimensions self.assertEqual(screen.dimensions[1], screen.width) self.assertEqual(screen.dimensions[0], screen.height) # Basic limit checking self.assertIsNone(screen.get_from(-1, -1)) self.assertIsNone(screen.get_from(screen.width, screen.height)) # Printing off-screen should not fail, but do nothing. screen.print_at("hello", 0, -1) screen.print_at("hello", 0, screen.height) # Printing across screen edge should crop. screen.print_at("12345", -1, 0) char, fg, _, bg = screen.get_from(0, 0) self.assertEqual(char, ord("2")) self.assertEqual(fg, Screen.COLOUR_WHITE) self.assertEqual(bg, Screen.COLOUR_BLACK) Screen.wrapper( check_screen_and_canvas, height=15, arguments=[internal_checks]) def test_scroll(self): """ Check that scrolling works as expected. """ def internal_checks(screen): # New screen is not scrolled. self.assertEqual(screen.start_line, 0) # Scroll and check it has moved screen.scroll() self.assertEqual(screen.start_line, 1) # Scroll to specific location and check it has moved screen.scroll_to(0) self.assertEqual(screen.start_line, 0) Screen.wrapper(internal_checks, height=15) def test_centre(self): """ Check that centre works as expected. """ def internal_checks(screen): screen.centre("1234", 0) char, fg, _, bg = screen.get_from((screen.width - 4) // 2, 0) self.assertEqual(char, ord("1")) self.assertEqual(fg, Screen.COLOUR_WHITE) self.assertEqual(bg, Screen.COLOUR_BLACK) Screen.wrapper(internal_checks, height=15) def test_draw(self): """ Check that line drawing works as expected. """ def internal_checks(screen): # Draw thick and thin lines for line_type in (True, False): # Draw in opposite directions for start in range(0, 11, 10): screen.print_at(str(start), 11, 2) # Horizontal line screen.move(start, 0) screen.draw(10 - start, 0, thin=line_type) res = screen.get_from(1, 0) self.assertEqual(res[0], ord("^" if line_type else "#")) # Check clearing works too screen.draw(start, 0, char=" ", thin=line_type) res = screen.get_from(1, 0) self.assertEqual(res[0], ord(" ")) # Vertical line screen.move(0, start) screen.draw(0, 10 - start, thin=line_type) res = screen.get_from(0, 1) self.assertEqual(res[0], ord("|" if line_type else "#")) # Check clearing works too screen.draw(0, start, char=" ", thin=line_type) res = screen.get_from(0, 1) self.assertEqual(res[0], ord(" ")) # Diagonal line screen.move(0, start) screen.draw(10, 10 - start, thin=line_type) res = screen.get_from(1, 9 if start else 1) if line_type: self.assertEqual(res[0], ord("'" if start else "\\")) else: self.assertEqual(res[0], ord("7" if start else "Y")) # Check clearing works too screen.move(0, start) screen.draw(10, 10 - start, char=" ", thin=line_type) res = screen.get_from(1, 9 if start else 1) self.assertEqual(res[0], ord(" ")) Screen.wrapper( check_screen_and_canvas, height=15, unicode_aware=False, arguments=[internal_checks]) def test_polygons(self): """ Check that filled polygons work as expected. """ def internal_checks(screen): screen.fill_polygon([[(0, 0), (10, 0), (0, 10), (10, 10)]]) screen.fill_polygon([[(20, 0), (30, 0), (30, 10), (25, 5), (20, 10)]]) screen.fill_polygon([[(40, 0), (45, 5), (50, 0), (50, 10), (40, 10)]]) screen.fill_polygon([[(60, 0), (70, 0), (70, 10), (60, 10)], [(63, 2), (67, 2), (67, 8), (63, 8)]]) self.maxDiff = None self.assert_canvas_equals( screen, "Y########7 ########## . . ########## \n" + " Y######7 ########## #. .# ########## \n" + " Y####7 ########## ##. .## ### ### \n" + " Y##7 ########## ###. .### ### ### \n" + " Y7 ########## ####..#### ### ### \n" + " .. ####7Y#### ########## ### ### \n" + " .##. ###7 Y### ########## ### ### \n" + " .####. ##7 Y## ########## ### ### \n" + " .######. #7 Y# ########## ########## \n" + ".########. 7 Y ########## ########## \n") Screen.wrapper( check_screen_and_canvas, height=10, unicode_aware=False, arguments=[internal_checks]) def test_last_pos(self): """ Check that screen drawing is efficient and unaffected by draw. """ def internal_checks(screen): # Should start with no known location. screen.reset() self.assertEqual(screen._cur_x, None) self.assertEqual(screen._cur_y, None) # Drawing should not affect latest update. This was previously # bugged - hence this test case! screen.move(0, 0) screen.draw(10, 10) self.assertEqual(screen._cur_x, None) self.assertEqual(screen._cur_y, None) # Printing should not affect latest update. screen.print_at("Hi", 12, 12) self.assertEqual(screen._cur_x, None) self.assertEqual(screen._cur_y, None) # Refresh should update the last drawn character. screen.refresh() self.assertEqual(screen._cur_x, 14) self.assertEqual(screen._cur_y, 12) Screen.wrapper( internal_checks, height=15, unicode_aware=False) def test_palette(self): """ Check that we have a valid colour palette. """ def internal_checks(screen): # Check basic length self.assertGreater(screen.colours, 0) self.assertEqual(len(screen.palette), 256 * 3) # Should always have fundamental console colours for i, c in enumerate((0, 0, 0)): self.assertEqual(screen.palette[i], c) for i, c in enumerate((128, 0, 0)): self.assertEqual(screen.palette[i+3], c) for i, c in enumerate((0, 128, 0)): self.assertEqual(screen.palette[i+6], c) for i, c in enumerate((128, 128, 0)): self.assertEqual(screen.palette[i+9], c) for i, c in enumerate((0, 0, 128)): self.assertEqual(screen.palette[i+12], c) for i, c in enumerate((128, 0, 128)): self.assertEqual(screen.palette[i+15], c) for i, c in enumerate((0, 128, 128)): self.assertEqual(screen.palette[i+18], c) for i, c in enumerate((192, 192, 192)): self.assertEqual(screen.palette[i+21], c) Screen.wrapper(internal_checks, height=15) def test_putch_and_getch(self): """ Check deprecated features still work. """ def internal_checks(screen): for x in range(screen.width): for y in range(15): char = randint(0, 255) fg = randint(0, Screen.COLOUR_WHITE) bg = randint(0, Screen.COLOUR_WHITE) attr = randint(0, Screen.A_UNDERLINE) screen.putch(chr(char), x, y, fg, attr, bg) char2, fg2, attr2, bg2 = screen.getch(x, y) self.assertEqual(char, char2) self.assertEqual(fg, fg2) self.assertEqual(attr, attr2) self.assertEqual(bg, bg2) Screen.wrapper(internal_checks, height=15) def test_open_close(self): """ Check Screen.open works. """ def check_screen(local_screen): # If we get here there's not much new to test. Check that we can # draw something without hitting an Exception. local_screen.print_at("Hello world!", 0, 0, colour=Screen.COLOUR_CYAN, attr=Screen.A_BOLD, bg=Screen.COLOUR_BLUE) local_screen.refresh() screen = Screen.open() check_screen(screen) screen.close() def test_refresh(self): """ Check that refresh works. """ def internal_checks(screen): # Not much we can do here as refresh will draw to a screen we can't # query. Check that we don't hit an Exception on refresh(). screen.print_at("Hello world!", 0, 0, colour=Screen.COLOUR_CYAN, attr=Screen.A_BOLD, bg=Screen.COLOUR_BLUE) screen.refresh() Screen.wrapper( check_screen_and_canvas, height=15, arguments=[internal_checks]) def test_origin(self): """ Check that Canvas origin is correct. """ def internal_checks(screen): canvas = Canvas(screen, 5, 5, 1, 2) self.assertEqual(canvas.origin, (1, 2)) Screen.wrapper(internal_checks, height=15) def test_play(self): """ Check that we can play a basic Effect in a Scene. """ def internal_checks(screen): # Since the Screen draws things, there's not too much we can do # to genuinely verify this without verifying all Scene and Effect # function too. Just play a dummy Effect for now. test_effect = MockEffect() screen.play([Scene([test_effect], 0)]) self.assertTrue(test_effect.stop_called) self.assertTrue(test_effect.reset_called) # Now check that the desired duration is used. test_effect = MockEffect(count=6) screen.play([Scene([test_effect], 15)]) self.assertFalse(test_effect.stop_called) self.assertTrue(test_effect.reset_called) # Now check that delete_count works. test_effect = MockEffect(count=6) test_effect2 = MockEffect(delete_count=3) scene = Scene([test_effect, test_effect2], 15) self.assertEqual(len(scene.effects), 2) screen.play([scene]) self.assertEqual(len(scene.effects), 1) self.assertEqual(scene.effects[0], test_effect) Screen.wrapper(internal_checks, height=15) def test_next_scene(self): """ Check that we can play multiple Scenes. """ def internal_checks(screen): # First check that we can move between screens. test_effect1 = MockEffect(stop=False) test_effect2 = MockEffect(count=5) screen.play([ Scene([test_effect1], 5), Scene([test_effect2], 0)]) self.assertTrue(test_effect1.update_called) self.assertTrue(test_effect2.update_called) # Now check that we can start at the second scene. test_effect1 = MockEffect(stop=False) scene1 = Scene([test_effect1], 5, name="1") test_effect2 = MockEffect(count=3) scene2 = Scene([test_effect2], 0, name="2") screen.play([scene1, scene2], start_scene=scene2) self.assertFalse(test_effect1.update_called) self.assertTrue(test_effect2.update_called) # Now check that we can move to named scenes. test_effect1 = MockEffect(stop=False, next_scene="B") test_effect2 = MockEffect(count=5) screen.play([ Scene([test_effect1], 15, name="A"), Scene([test_effect2], 0, name="B")]) self.assertTrue(test_effect1.update_called) self.assertTrue(test_effect2.update_called) # Now check that bad names cause an exception. with self.assertRaises(RuntimeError): test_effect1 = MockEffect(stop=False, next_scene="C") test_effect2 = MockEffect(count=5) screen.play([ Scene([test_effect1], 15, name="A"), Scene([test_effect2], 0, name="B")]) self.assertTrue(test_effect1.update_called) self.assertFalse(test_effect2.update_called) # Now check that play stops at the end when repeat=False test_effect1 = MockEffect(stop=False) scene1 = Scene([test_effect1], 5, name="1") screen.play([scene1], repeat=False) self.assertTrue(test_effect1.update_called) Screen.wrapper(internal_checks, height=15) def test_forced_update(self): """ Check that forcing an update works as expected. """ def internal_checks(screen): # First check that Effects are always drawn at Scene start test_effect = MockEffect(count=101, stop_frame=101, frame_rate=100) screen.set_scenes([Scene([test_effect], 0)]) screen.draw_next_frame() self.assertTrue(test_effect.update_called) # Now check that the Screen honours the long frame rate... test_effect.update_called = False for _ in range(90): screen.draw_next_frame() self.assertFalse(test_effect.update_called) # Now check that the forced update works as expected. screen.force_update() screen.draw_next_frame() self.assertTrue(test_effect.update_called) # Now check that a full refresh works. self.assertEqual(len(list(screen._buffer.deltas(0, 100))), 0) screen.force_update(full_refresh=True) self.assertGreater(len(list(screen._buffer.deltas(0, 100))), 0) Screen.wrapper(internal_checks, height=15) def test_catch_exceptions(self): """ Check that we can catch exceptions (e.g. for ctrl-c). """ def internal_checks(screen): # Not much we can do here as refresh will draw to a screen we can't # query. Check that we don't hit an Exception on refresh(). if sys.platform == "win32": # Strictly speaking, this doesn't test catching ctrl-c as # it isn't possible to trigger the control handler (even if # we don't catch interrupts). Still a good basic check for # input, though. event = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) event.Char = "\03" event.KeyDown = 1 event.RepeatCount = 1 event.ControlKeyState = win32con.LEFT_CTRL_PRESSED event.VirtualKeyCode = 67 event.VirtualScanCode = 46 screen._stdin.WriteConsoleInput([event]) event.KeyDown = 0 screen._stdin.WriteConsoleInput([event]) ch = screen.get_event() self.assertEqual(ch.key_code, 3) self.assertIsNone(screen.get_event()) else: # Check Ctrl-c (and no other input) os.kill(os.getpid(), signal.SIGINT) ch = screen.get_event() self.assertEqual(ch.key_code, 3) self.assertIsNone(screen.get_event()) # Check Ctrl-z (and no other input) os.kill(os.getpid(), signal.SIGTSTP) ch = screen.get_event() self.assertEqual(ch.key_code, 26) self.assertIsNone(screen.get_event()) Screen.wrapper(internal_checks, height=15, catch_interrupt=True) def test_scroll_redraw(self): """ Check that scrolling works with screen locations. """ def internal_checks(screen): # New screen is not scrolled. self.assertEqual(screen.start_line, 0) # Scroll and check it has not moved screen.print_at("Hello", 0, 1) for i, c in enumerate("Hello"): self.assertEqual(screen.get_from(i, 1)[0], ord(c)) screen.scroll() for i, c in enumerate("Hello"): self.assertEqual(screen.get_from(i, 1)[0], ord(c)) screen.refresh() for i, c in enumerate("Hello"): self.assertEqual(screen.get_from(i, 1)[0], ord(c)) Screen.wrapper(internal_checks) @staticmethod def _inject_key(screen, char): """ Inject a specified character into the input buffers. """ if sys.platform == "win32": event = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) event.RepeatCount = 1 event.ControlKeyState = 0 event.VirtualScanCode = 0 if char >= 0: event.Char = chr(char) event.VirtualKeyCode = ord(chr(char).upper()) else: # Lookup in mapping dicts reverse = {v: k for k, v in screen._EXTRA_KEY_MAP.items()} if char in reverse: event.VirtualKeyCode = reverse[char] else: # Fudge key state required for BACK_TAB if needed. if char == Screen.KEY_BACK_TAB: char = Screen.KEY_TAB event.ControlKeyState = win32con.SHIFT_PRESSED reverse = {v: k for k, v in screen._KEY_MAP.items()} event.VirtualKeyCode = reverse[char] event.KeyDown = 1 screen._stdin.WriteConsoleInput([event]) event.KeyDown = 0 screen._stdin.WriteConsoleInput([event]) else: if char > 0: # Curses uses a LIFO stack for key injection, so reverse the # byte string to be injected. Note that this still works for # ASCII as it is a single char subset of UTF-8. for c in reversed(bytes(chr(char).encode("utf-8"))): curses.ungetch(c) else: reverse = {v: k for k, v in screen._KEY_MAP.items()} curses.ungetch(reverse[char]) @staticmethod def _inject_mouse(screen, x, y, button): """ Inject a mouse event into the input buffers. """ if sys.platform == "win32": event = win32console.PyINPUT_RECORDType(win32console.MOUSE_EVENT) event.MousePosition.X = x event.MousePosition.Y = y if button & MouseEvent.LEFT_CLICK != 0: event.ButtonState |= win32con.FROM_LEFT_1ST_BUTTON_PRESSED if button & MouseEvent.RIGHT_CLICK != 0: event.ButtonState |= win32con.RIGHTMOST_BUTTON_PRESSED if button & MouseEvent.DOUBLE_CLICK != 0: event.EventFlags |= win32con.DOUBLE_CLICK screen._stdin.WriteConsoleInput([event]) else: # Curses doesn't like no value in some cases - use a dummy button # click which we don't use instead. bstate = curses.BUTTON4_CLICKED if button & MouseEvent.LEFT_CLICK != 0: bstate |= curses.BUTTON1_CLICKED if button & MouseEvent.RIGHT_CLICK != 0: bstate |= curses.BUTTON3_CLICKED if button & MouseEvent.DOUBLE_CLICK != 0: bstate |= curses.BUTTON1_DOUBLE_CLICKED curses.ungetmouse(0, x, y, 0, bstate) def test_key_input(self): """ Check that keyboard input works. """ def internal_checks(screen): # Inject a letter and check it is picked up self._inject_key(screen, ord("a")) ch = screen.get_event() self.assertEqual(ch.key_code, ord("a")) self.assertIsNone(screen.get_event()) # Inject a letter and check it is picked up self._inject_key(screen, Screen.KEY_BACK_TAB) ch = screen.get_event() self.assertEqual(ch.key_code, Screen.KEY_BACK_TAB) self.assertIsNone(screen.get_event()) # Check that get_key also works. self._inject_key(screen, ord("b")) ch = screen.get_key() self.assertEqual(ch, ord("b")) self.assertIsNone(screen.get_key()) # Check that unicode input also works self._inject_key(screen, ord("├")) ch = screen.get_event() self.assertEqual(ch.key_code, ord("├")) self.assertIsNone(screen.get_event()) # Check that unicode input colliding with curses KEY_MAP also works (code: 263) self._inject_key(screen, ord("ć")) ch = screen.get_event() self.assertEqual(ch.key_code, ord("ć")) self.assertIsNone(screen.get_event()) Screen.wrapper(internal_checks, height=15, unicode_aware=True) def test_mouse_input(self): """ Check that mouse input works. """ def internal_checks(screen): # Inject a mouse move and check it is picked up self._inject_mouse(screen, 1, 2, 0) ev = screen.get_event() self.assertEqual(ev.x, 1) self.assertEqual(ev.y, 2) self.assertEqual(ev.buttons, 0) self.assertIsNone(screen.get_event()) # Check left click self._inject_mouse(screen, 2, 3, MouseEvent.LEFT_CLICK) ev = screen.get_event() self.assertEqual(ev.x, 2) self.assertEqual(ev.y, 3) self.assertEqual(ev.buttons, MouseEvent.LEFT_CLICK) self.assertIsNone(screen.get_event()) # Check right click self._inject_mouse(screen, 0, 0, MouseEvent.RIGHT_CLICK) ev = screen.get_event() self.assertEqual(ev.x, 0) self.assertEqual(ev.y, 0) self.assertEqual(ev.buttons, MouseEvent.RIGHT_CLICK) self.assertIsNone(screen.get_event()) # Check double click self._inject_mouse(screen, 0, 0, MouseEvent.DOUBLE_CLICK) ev = screen.get_event() self.assertEqual(ev.x, 0) self.assertEqual(ev.y, 0) self.assertEqual(ev.buttons, MouseEvent.DOUBLE_CLICK) self.assertIsNone(screen.get_event()) Screen.wrapper(internal_checks, height=15) def test_windows_input(self): """ Check that extended keyboard input works on Windows. """ def internal_checks(screen): if sys.platform != "win32": self.skipTest("Only valid for Windows platforms") # Test no mapping by default self._inject_key(screen, Screen.KEY_NUMPAD0) self.assertIsNone(screen.get_event()) # Test switching on mapping picks up keys screen.map_all_keys(True) self._inject_key(screen, Screen.KEY_NUMPAD0) ch = screen.get_key() self.assertEqual(ch, Screen.KEY_NUMPAD0) self.assertIsNone(screen.get_key()) Screen.wrapper(internal_checks, height=15) def test_unhandled_events(self): """ Check that default handling of events works as documented. """ def internal_checks(screen): # Check for exit for char in ("X", "x", "Q", "q"): with self.assertRaises(StopApplication): event = KeyboardEvent(ord(char)) screen._unhandled_event_default(event) for char in (" ", "\n"): with self.assertRaises(NextScene): event = KeyboardEvent(ord(char)) screen._unhandled_event_default(event) Screen.wrapper(internal_checks, height=15) def test_title(self): """ Check that we can change the screen title. """ def internal_checks(screen): # It's not possible to read values back, so just check code doesn't # crash. screen.set_title("Asciimatics test") Screen.wrapper(internal_checks, height=15) def test_wait(self): """ Check that wait_for_input delays as requested when no input. """ if sys.platform == "win32": self.skipTest("Broken on github runner.") if not sys.stdout.isatty(): self.skipTest("Not a valid TTY") def internal_checks(screen): # Clear any outstanding events - sometimes windows has system events waiting. for _ in range (10): screen.get_event() start = time.time() screen.wait_for_input(0.1) self.assertGreaterEqual(time.time() - start, 0.1) Screen.wrapper(internal_checks, height=15) def test_ctrl(self): """ Check that ctrl returns the right values. """ # Check standard alphabetical range for i, char in enumerate(range(ord('@'), ord('Z'))): self.assertEqual(Screen.ctrl(char), i) self.assertEqual(Screen.ctrl(chr(char)), i) self.assertEqual(Screen.ctrl(chr(char).lower()), i) # Check last few options - which mostly aren't actually returned in # Linux and so probably only of limited value, but what the heck! for i, char in enumerate(["[", "\\", "]", "^", "_"]): self.assertEqual(Screen.ctrl(char), i + 27) # Check other things return None - pick boundaries for checks. for char in ["?", "`", "\x7f"]: self.assertIsNone(Screen.ctrl(char)) def assert_line_equals(self, canvas, expected, y=0, length=None): """ Assert first line of output to canvas is as expected. """ output = "" for x in range(canvas.width): char, _, _, _ = canvas.get_from(x, y) output += chr(char) if length: self.assertEqual(output[:length], expected[:length]) else: self.assertEqual(output, expected) def test_cjk_glyphs(self): """ Check that CJK languages track double-width glyphs as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected for CJK languages. # These languages actually use two characters for some glyphs, so when you query the # contents, you will see the value for both characters. Also, most terminals don't like # displaying half glyphs, so asciimatics doesn't even allow it. canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c") canvas.reset() canvas.print_at("你確", -1, 0) canvas.print_at("你確", canvas.width - 1, 0) self.assert_line_equals(canvas, " 確確 ") def test_cjk_glyphs_overwrite(self): """ Check that CJK languages delete half-glyphs correctly. """ screen = Screen.open(unicode_aware=True) screen.print_at("aaaa", 0, 0) screen.print_at("你確", 0, 1) screen.print_at("bbbb", 0, 2) screen.refresh() screen.print_at("cccc", 0, 0) screen.print_at("你確", 1, 1) screen.print_at("dddd", 0, 2) screen.refresh() # Half-glyph appears as an "x" to show error and then double-width glyphs are returned # twice, reflecting their extra width. self.assert_line_equals(screen, "x你你確確 ", y=1, length=6) screen.close() def test_zero_width(self): """ Check that zero width modifiers are ignored. """ screen = Screen.open(unicode_aware=True) screen.print_at("Xx🛡️🍀🍀xX", 0, 0) self.assert_line_equals(screen, "Xx🛡🍀🍀🍀🍀xX", length=9) screen.close() def test_save_signal_state(self): """Tests that the signal state class works properly. The _SignalState class must set, save, and restore signals when needed. """ if sys.platform == "win32": self.skipTest("Windows does not have signals.") def dummy_handler(): """Assign dummy handler to an arbitrary signal.""" pass self.assertNotEqual(signal.getsignal(signal.SIGWINCH), dummy_handler) signal_state = _SignalState() signal_state.set(signal.SIGWINCH, dummy_handler) self.assertEqual(signal.getsignal(signal.SIGWINCH), dummy_handler) signal_state.restore() self.assertNotEqual(signal.getsignal(signal.SIGWINCH), dummy_handler) def test_signal(self): """ Check that signals are restored after using _CursesScreen """ if sys.platform == "win32": self.skipTest("Windows does not have signals.") def dummy_signal_handler(): """Dummy previous signal handler.""" pass outer_state = _SignalState() self.assertNotEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler) outer_state.set(signal.SIGWINCH, dummy_signal_handler) self.assertEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler) Screen.wrapper(self.signal_check) self.assertEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler) outer_state.restore() self.assertNotEqual(signal.getsignal(signal.SIGWINCH), dummy_signal_handler) def signal_check(self, screen): """Dummy callback for screen wrapper.""" self.assertEqual(signal.getsignal(signal.SIGWINCH), screen._resize_handler) def test_function_decorator(self): """ Check ManagedScreen function decorator works. """ @ManagedScreen def demo(screen=None): canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c") demo() @ManagedScreen def test_class_method_decorator(self, screen=None): """ Check ManagedScreen method decorator works. """ canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c") def test_double_buffer(self): """ Check _DoubleBuffer works. """ buffer = _DoubleBuffer(20, 10) # Check clear works self.assertEqual(buffer._double_buffer[0][0], (' ', 7, 0, 0, 1)) self.assertEqual(buffer._double_buffer[19][9], (' ', 7, 0, 0, 1)) buffer.clear(1, 0, 2) self.assertEqual(buffer._double_buffer[0][0], (' ', 1, 0, 2, 1)) self.assertEqual(buffer._double_buffer[19][9], (' ', 1, 0, 2, 1)) # Check clear clips as needed. buffer.clear(3, 1, 4, x=1, y=1, w=100, h=100) self.assertEqual(buffer._double_buffer[0][0], (' ', 1, 0, 2, 1)) self.assertEqual(buffer._double_buffer[19][9], (' ', 3, 1, 4, 1)) def test_context_manager(self): """ Check ManagedScreen context manager works. """ with ManagedScreen() as screen: canvas = Canvas(screen, 10, 40, 0, 0) # Check underflow and overflow work as expected canvas.print_at("ab", -1, 0) canvas.print_at("cd", canvas.width - 1, 0) self.assert_line_equals(canvas, "b c") if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_sprites.py000066400000000000000000000007641511423144500216610ustar00rootroot00000000000000import unittest from asciimatics.paths import Path from asciimatics.sprites import Sam, Arrow, Plot class TestSprites(unittest.TestCase): def test_init(self): # Most of the function in these classes is actually in the Sprite # base Effect - so just check we can build these classes self.assertIsNotNone(Sam(None, Path())) self.assertIsNotNone(Arrow(None, Path())) self.assertIsNotNone(Plot(None, Path())) if __name__ == '__main__': unittest.main() python-asciimatics-1.15.0/tests/test_strings.py000066400000000000000000000041411511423144500216520ustar00rootroot00000000000000from datetime import datetime import time import unittest from asciimatics.strings import ColouredText from asciimatics.parsers import AsciimaticsParser class TestUtilities(unittest.TestCase): def test_coloured_text(self): """ Check ColouredText works as expected. """ # No specified start colour ct = ColouredText("Some ${1}text", AsciimaticsParser()) self.assertEqual(str(ct), "Some text") self.assertEqual(ct.raw_text, "Some ${1}text") self.assertEqual(len(ct), 9) self.assertEqual(ct.first_colour, None) self.assertEqual(ct.last_colour, (1, 0, None)) self.assertEqual(ct.colour_map[0], (None, None, None)) # Specified start colour ct = ColouredText("Some ${1}text", AsciimaticsParser(), colour=(2, 1, 0)) self.assertEqual(str(ct), "Some text") self.assertEqual(ct.raw_text, "Some ${1}text") self.assertEqual(len(ct), 9) self.assertEqual(ct.first_colour, (2, 1, 0)) self.assertEqual(ct.last_colour, (1, 0, None)) self.assertEqual(ct.colour_map[0], (2, 1, 0)) # Slicing self.assertEqual(ct[0], ColouredText("S", AsciimaticsParser())) self.assertEqual(ct[1:-1], ColouredText("ome ${1}tex", AsciimaticsParser())) self.assertNotEqual(ct[1:-1], ColouredText("ome tex", AsciimaticsParser())) self.assertEqual(ct[100:101], ColouredText("", AsciimaticsParser())) # Adding self.assertEqual( ColouredText("Some ", AsciimaticsParser()) + ColouredText("${3}Text", AsciimaticsParser()), ColouredText("Some ${3}Text", AsciimaticsParser())) # Joining self.assertEqual(ColouredText(" ", AsciimaticsParser()).join([ ColouredText("Hello", AsciimaticsParser()), ColouredText("${3}World", AsciimaticsParser())]), ColouredText("Hello ${3}World", AsciimaticsParser())) # Bad data comparisons self.assertNotEqual(ct, 1) self.assertFalse(ct == "Some text") # Startswith self.assertTrue(ct.startswith("Some")) python-asciimatics-1.15.0/tests/test_utilities.py000066400000000000000000000046531511423144500222040ustar00rootroot00000000000000from datetime import datetime import time import unittest from asciimatics.constants import ASCII_LINE, SINGLE_LINE, DOUBLE_LINE from asciimatics.utilities import readable_mem, readable_timestamp, BoxTool class TestUtilities(unittest.TestCase): def test_readable_mem(self): """ Check readable_mem works as expected. """ # Check formatting works as expected. self.assertEqual("9999", readable_mem(9999)) self.assertEqual("10K", readable_mem(10240)) self.assertEqual("1024K", readable_mem(1024*1024)) self.assertEqual("10M", readable_mem(1024*1024*10)) self.assertEqual("10G", readable_mem(1024*1024*1024*10)) self.assertEqual("10T", readable_mem(1024*1024*1024*1024*10)) self.assertEqual("10P", readable_mem(1024*1024*1024*1024*1024*10)) def test_readable_timestamp(self): """ Check readable_timestamp works as expected. """ # Check formatting works as expected. self.assertEqual("12:01:02AM", readable_timestamp( time.mktime(datetime.now().replace(hour=0, minute=1, second=2).timetuple()))) self.assertEqual("1999-01-02", readable_timestamp( time.mktime(datetime.now().replace(year=1999, month=1, day=2).timetuple()))) def test_boxtool(self): # SINGLE_LINE tool = BoxTool(True) self.assertEqual("┌───┐", tool.box_top(5)) self.assertEqual("└───┘", tool.box_bottom(5)) self.assertEqual("│ │", tool.box_line(5)) self.assertEqual( tool.box(5, 3), "┌───┐\n" + "│ │\n" + "└───┘\n") # DOUBLE_LINE self.assertEqual(tool.style, SINGLE_LINE) tool.style = DOUBLE_LINE self.assertEqual("╔═══╗", tool.box_top(5)) self.assertEqual("╚═══╝", tool.box_bottom(5)) self.assertEqual("║ ║", tool.box_line(5)) self.assertEqual( tool.box(5, 3), "╔═══╗\n" + "║ ║\n" + "╚═══╝\n") # ASCII_LINE tool = BoxTool(False) self.assertEqual("+---+", tool.box_top(5)) self.assertEqual("+---+", tool.box_bottom(5)) self.assertEqual("| |", tool.box_line(5)) self.assertEqual( tool.box(5, 3), "+---+\n" + "| |\n" + "+---+\n") python-asciimatics-1.15.0/tests/test_widgets.py000066400000000000000000004456611511423144500216470ustar00rootroot00000000000000from datetime import date, time from time import sleep import unittest import sys from unittest.mock import MagicMock, patch from asciimatics.event import KeyboardEvent, MouseEvent from asciimatics.exceptions import NextScene, StopApplication, InvalidFields from asciimatics.scene import Scene from asciimatics.screen import Screen, Canvas from asciimatics.widgets import Frame, Layout, Button, Label, TextBox, Text, \ Divider, RadioButtons, CheckBox, PopUpDialog, ListBox, Widget, MultiColumnListBox, \ FileBrowser, DatePicker, TimePicker, Background, DropdownList, PopupMenu, \ _find_min_start, VerticalDivider from asciimatics.parsers import AsciimaticsParser, AnsiTerminalParser from asciimatics.strings import ColouredText class _TestFrame(Frame): def __init__(self, screen, has_border=True, can_scroll=True, reduce_cpu=False, label_height=1): super().__init__(screen, screen.height, screen.width, name="Test Form", has_border=has_border, can_scroll=can_scroll, hover_focus=True, reduce_cpu=reduce_cpu) layout = Layout([1, 18, 1]) self.add_layout(layout) self._reset_button = Button("Reset", self._reset) # Test that layout.add_widget returns the widget self.label = layout.add_widget( Label("Group 1:", height=label_height), 1) layout.add_widget(TextBox(5, label="My First Box:", name="TA", on_change=self._on_change), 1) layout.add_widget( Text(label="Text1:", name="TB", on_change=self._on_change), 1) layout.add_widget( Text(label="Text2:", name="TC", on_change=self._on_change, validator="^[0-9]*$"), 1) layout.add_widget( Text(label="Text3:", name="TD", on_change=self._on_change, validator=lambda x: x in ("", "a")), 1) layout.add_widget(Divider(height=2), 1) layout.add_widget(Label("Group 2:"), 1) layout.add_widget(RadioButtons([("Option 1", 1), ("Option 2", 2), ("Option 3", 3)], label="A Longer Selection:", name="Things", on_change=self._on_change), 1) layout.add_widget(CheckBox("Field 1", label="A very silly long name for fields:", name="CA", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 2", name="CB", on_change=self._on_change), 1) layout.add_widget( CheckBox("Field 3", name="CC", on_change=self._on_change), 1) layout.add_widget(Divider(height=3), 1) layout2 = Layout([1, 1, 1]) self.add_layout(layout2) layout2.add_widget(self._reset_button, 0) layout2.add_widget(Button("View Data", self._view), 1) layout2.add_widget(Button("Quit", self._quit), 2) layout2.add_widget(Button("One", self._view), 0) layout2.add_widget(Button("Two", self._view), 1) layout2.add_widget(Button("Three", self._view), 2) self.fix() def _on_change(self): changed = False self.save() for key, value in self.data.items(): if isinstance(value, bool): if value: changed = True break if isinstance(value, int): if value != 1: changed = True break elif value is None: continue elif len(value) != 0: changed = True break self._reset_button.disabled = not changed def _reset(self): self.reset() raise NextScene() def _view(self): # Build result of this form and display it. self.save() raise NextScene() @staticmethod def _quit(): raise StopApplication("User requested exit") class _TestFrame2(Frame): def __init__(self, screen, init_values): super().__init__(screen, screen.height, screen.width, data={"selected": "None"}, title="Test Frame 2") # Create the form for displaying the list of contacts. self._list_view = ListBox( Widget.FILL_FRAME, init_values, name="contacts", on_change=self._on_pick, on_select=self._on_select) self._edit_button = Button("Edit", self._edit) self._delete_button = Button("Delete", self._delete) layout = Layout([100], fill_frame=True) self.add_layout(layout) layout.add_widget(self._list_view) layout.add_widget(Divider(line_char="#")) layout2 = Layout([1, 1, 1, 1]) self.add_layout(layout2) layout2.add_widget(Button("Add", self._add), 0) layout2.add_widget(self._edit_button, 1) layout2.add_widget(self._delete_button, 2) layout2.add_widget(Button("Quit", self._quit), 3) layout3 = Layout([100]) self.add_layout(layout3) self._info_text = Text(label="Selected:", name="selected") self._info_text.disabled = True layout3.add_widget(self._info_text) self.fix() self._on_pick() def _on_select(self): self._info_text.value = str(self._list_view.value) self.save() def _on_pick(self): self._edit_button.disabled = self._list_view.value is None self._delete_button.disabled = self._list_view.value is None @staticmethod def _add(): raise NextScene("Add") @staticmethod def _edit(): raise NextScene("Edit") @staticmethod def _delete(): raise NextScene("Delete") @staticmethod def _quit(): raise StopApplication("User pressed quit") class _TestFrame3(Frame): def __init__(self, screen): super().__init__(screen, 10, 20, name="Blank", has_shadow=True) self.fix() class _TestFrame4(Frame): def __init__(self, screen, file_filter=None): super().__init__( screen, screen.height, screen.width, has_border=False, can_scroll=False, name="My Form") # State tracking for callbacks self.selected = None self.highlighted = None # Simple full-page Widget layout = Layout([1], fill_frame=True) self.add_layout(layout) self.file_list = FileBrowser(Widget.FILL_FRAME, "/", name="file_list", on_select=self.select, on_change=self.change, file_filter=file_filter) layout.add_widget(self.file_list) self.fix() def select(self): self.selected = self.file_list.value def change(self): self.highlighted = self.file_list.value class _TestFrame5(Frame): def __init__(self, screen): super().__init__( screen, screen.height, screen.width, has_border=True, name="My Form") # Simple full-page Widget layout = Layout([1], fill_frame=True) self.add_layout(layout) self.date_widget = DatePicker( label="Date:", name="date", on_change=self._changed) self.date_widget.value = date(2017, 1, 2) layout.add_widget(self.date_widget) self.time_widget = TimePicker( label="Time:", name="time", seconds=True, on_change=self._changed) self.time_widget.value = time(12, 0, 59) layout.add_widget(self.time_widget) self.time_widget2 = TimePicker( label="Tim2:", name="time", seconds=False, on_change=self._changed) self.time_widget2.value = time(11, 2, 58) layout.add_widget(self.time_widget2) self.fix() # State tracking for widgets self.changed = False def _changed(self): self.changed = True class _TestFrame6(Frame): def __init__(self, screen): super().__init__( screen, screen.height, screen.width, has_border=True, name="My Form") # Simple full-page Widget layout = Layout([1], fill_frame=True) self.add_layout(layout) self.lbl = Label("TstFrm6Lbl", name="tf6_lbl") layout.add_widget(self.lbl) self.fix() class TestWidgets(unittest.TestCase): def setUp(self): self.maxDiff = None self.epoch_date = str(date.fromtimestamp(0)) def _canvas_to_string(self, canvas): output = "" for y in range(canvas.height): for x in range(canvas.width): char, _, _, _ = canvas.get_from(x, y) output += chr(char) output += "\n" return output def assert_canvas_equals(self, canvas, expected): """ Assert output to canvas is as expected. """ output = self._canvas_to_string(canvas) self.assertEqual(output, expected) @staticmethod def process_keys(form, values, separator=None): """ Inject a set of key events separated by a common key separator. """ for new_value in values: if isinstance(new_value, int): form.process_event(KeyboardEvent(new_value)) else: for char in new_value: form.process_event(KeyboardEvent(ord(char))) if separator: form.process_event(KeyboardEvent(separator)) @staticmethod def process_mouse(form, values): """ Inject a set of mouse events. """ for x, y, buttons in values: form.process_event(MouseEvent(x, y, buttons)) def test_form_data(self): """ Check Frame.data works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) # Should be empty on construction self.assertEqual(form.data, {}) # Should be blank values after saving. form.reset() form.save() self.assertEqual( form.data, { 'CA': False, 'CB': False, 'CC': False, 'TA': [''], 'TB': '', 'TC': '', 'TD': '', 'Things': 1 }) def test_rendering(self): """ Check Frame renders as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check initial rendering form.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| Group 1: |\n" + "| My First O\n" + "| Box: |\n" + "| |\n" + "| |\n" + "| |\n" + "| Text1: |\n" + "| Text2: |\n" + "+--------------------------------------+\n") # Check scrolling works. Should also test label splitting and ellipsis. form.move_to(0, 9, 8) form.update(1) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| Text3: |\n" + "| |\n" + "| ---------------------------------- |\n" + "| Group 2: O\n" + "| A Longer (X) Option 1 |\n" + "| Selection: ( ) Option 2 |\n" + "| ( ) Option 3 |\n" + "| A very... [ ] Field 1 |\n" + "+--------------------------------------+\n") # Now check button rendering. form.move_to(0, 18, 8) form.update(2) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| [ ] Field 3 |\n" + "| |\n" + "| ---------------------------------- |\n" + "| |\n" + "| < Reset > < View Data > < Quit > |\n" + "| < One > < Two > < Three > |\n" + "| O\n" + "| |\n" + "+--------------------------------------+\n") def test_unicode_rendering(self): """ Check Frame renders as expected for unicode environments. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check initial rendering form.update(0) self.assert_canvas_equals( canvas, "┌──────────────────────────────────────┐\n" + "│ Group 1: │\n" + "│ My First █\n" + "│ Box: ░\n" + "│ ░\n" + "│ ░\n" + "│ ░\n" + "│ Text1: ░\n" + "│ Text2: │\n" + "└──────────────────────────────────────┘\n") # Check scrolling works. Should also test label splitting and ellipsis. form.move_to(0, 9, 8) form.update(1) self.assert_canvas_equals( canvas, "┌──────────────────────────────────────┐\n" + "│ Text3: │\n" + "│ ░\n" + "│ ────────────────────────────────── ░\n" + "│ Group 2: █\n" + "│ A Longer (•) Option 1 ░\n" + "│ Selection: ( ) Option 2 ░\n" + "│ ( ) Option 3 ░\n" + "│ A very... [ ] Field 1 │\n" + "└──────────────────────────────────────┘\n") # Now check button rendering. form.move_to(0, 18, 8) form.update(2) self.assert_canvas_equals( canvas, "┌──────────────────────────────────────┐\n" + "│ [ ] Field 3 │\n" + "│ ░\n" + "│ ────────────────────────────────── ░\n" + "│ ░\n" + "│ < Reset > < View Data > < Quit > ░\n" + "│ < One > < Two > < Three > ░\n" + "│ █\n" + "│ │\n" + "└──────────────────────────────────────┘\n") def test_no_border(self): """ Check that a Frame with no border works """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas, has_border=False, can_scroll=False) scene.add_effect(form) form.reset() # Check initial rendering form.update(0) self.assert_canvas_equals( canvas, " Group 1: \n" + " My First \n" + " Box: \n" + " \n" + " \n" + " \n" + " Text1: \n" + " Text2: \n" + " Text3: \n" + " \n") # Check scrolling works. Should also test label splitting and ellipsis. form.move_to(0, 10, 10) form.update(1) self.assert_canvas_equals( canvas, " ------------------------------------ \n" + " Group 2: \n" + " A Longer (X) Option 1 \n" + " Selection: ( ) Option 2 \n" + " ( ) Option 3 \n" + " A very si...[ ] Field 1 \n" + " [ ] Field 2 \n" + " [ ] Field 3 \n" + " \n" + " ------------------------------------ \n") def test_no_border_can_scroll(self): """ Check that a Frame with scroll bar but without border renders """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas, has_border=False, can_scroll=True) scene.add_effect(form) form.reset() # Check initial rendering form.update(0) self.assert_canvas_equals( canvas, " Group 1: \n" + " My First O\n" + " Box: |\n" + " |\n" + " |\n" + " |\n" + " Text1: |\n" + " Text2: |\n" + " Text3: |\n" + " \n") def test_form_input(self): """ Check Frame input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() self.process_keys(form, ["ABC\nDEF", "GHI", "jkl", "MN", " ", " ", "", " "], Screen.KEY_TAB) form.save() self.assertEqual( form.data, { 'CA': True, 'CB': False, 'CC': True, 'TA': ['ABC', 'DEF'], 'TB': 'GHI', 'TC': 'jkl', 'TD': 'MN', 'Things': 1 }) # Check that forms ignore unrecognised events. event = object() self.assertEqual(event, form.process_event(event)) # Check forms don't want global input handling. self.assertFalse(form.safe_to_default_unhandled_input) def test_textbox_input(self): """ Check TextBox input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check basic movement keys self.process_keys(form, ["ABC", Screen.KEY_LEFT, "D"]) form.save() self.assertEqual(form.data["TA"], ["ABDC"]) self.process_keys(form, [Screen.KEY_RIGHT, Screen.KEY_RIGHT, "E"]) form.save() self.assertEqual(form.data["TA"], ["ABDCE"]) self.process_keys(form, ["\nFGH", Screen.KEY_UP, Screen.KEY_UP, "I"]) form.save() self.assertEqual(form.data["TA"], ["ABDICE", "FGH"]) self.process_keys(form, [Screen.KEY_DOWN, Screen.KEY_DOWN, "J"]) form.save() self.assertEqual(form.data["TA"], ["ABDICE", "FGHJ"]) self.process_keys(form, [Screen.KEY_HOME, "K"]) form.save() self.assertEqual(form.data["TA"], ["ABDICE", "KFGHJ"]) self.process_keys(form, [Screen.KEY_END, "L"]) form.save() self.assertEqual(form.data["TA"], ["ABDICE", "KFGHJL"]) # Backspace - normal and wrapping lines self.process_keys(form, [Screen.KEY_BACK]) form.save() self.assertEqual(form.data["TA"], ["ABDICE", "KFGHJ"]) self.process_keys(form, [Screen.KEY_HOME, Screen.KEY_BACK]) form.save() self.assertEqual(form.data["TA"], ["ABDICEKFGHJ"]) # Check cursor line-wrapping self.process_keys(form, ["\n"]) form.save() self.assertEqual(form.data["TA"], ["ABDICE", "KFGHJ"]) self.process_keys(form, [Screen.KEY_LEFT, "M"]) form.save() self.assertEqual(form.data["TA"], ["ABDICEM", "KFGHJ"]) self.process_keys(form, [Screen.KEY_RIGHT, "N"]) form.save() self.assertEqual(form.data["TA"], ["ABDICEM", "NKFGHJ"]) # Delete - normal and wrapping lines and at end of all data. self.process_keys(form, [Screen.KEY_DELETE]) form.save() self.assertEqual(form.data["TA"], ["ABDICEM", "NFGHJ"]) self.process_keys(form, [Screen.KEY_UP, Screen.KEY_END, Screen.KEY_DELETE]) form.save() self.assertEqual(form.data["TA"], ["ABDICEMNFGHJ"]) self.process_keys(form, [Screen.KEY_END, Screen.KEY_DELETE]) form.save() self.assertEqual(form.data["TA"], ["ABDICEMNFGHJ"]) # Check that page up/down work as expected. self.process_keys(form, [Screen.ctrl("m"), Screen.ctrl("m"), Screen.KEY_PAGE_UP, "O"]) form.save() self.assertEqual(form.data["TA"], ["OABDICEMNFGHJ", "", ""]) self.process_keys(form, [Screen.KEY_PAGE_DOWN, "P"]) form.save() self.assertEqual(form.data["TA"], ["OABDICEMNFGHJ", "", "P"]) # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) def test_text_input(self): """ Check Text input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check basic movement keys self.process_keys(form, [Screen.KEY_TAB, "ABC"]) form.save() self.assertEqual(form.data["TB"], "ABC") self.process_keys(form, [Screen.KEY_HOME, "D"]) form.save() self.assertEqual(form.data["TB"], "DABC") self.process_keys(form, [Screen.KEY_END, "E"]) form.save() self.assertEqual(form.data["TB"], "DABCE") self.process_keys(form, [Screen.KEY_LEFT, "F"]) form.save() self.assertEqual(form.data["TB"], "DABCFE") self.process_keys(form, [Screen.KEY_RIGHT, "G"]) form.save() self.assertEqual(form.data["TB"], "DABCFEG") # Backspace self.process_keys(form, [Screen.KEY_BACK]) form.save() self.assertEqual(form.data["TB"], "DABCFE") # Delete - including at end of data self.process_keys(form, [Screen.KEY_DELETE]) form.save() self.assertEqual(form.data["TB"], "DABCFE") self.process_keys(form, [Screen.KEY_HOME, Screen.KEY_DELETE]) form.save() self.assertEqual(form.data["TB"], "ABCFE") # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) def test_validation(self): """ Check free-form text validation works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check that save still works with no validation. self.process_keys(form, [Screen.KEY_TAB, Screen.KEY_TAB, "ABC"]) form.save() self.assertEqual(form.data["TC"], "ABC") # Check that enforced validation throws exceptions as needed. with self.assertRaises(InvalidFields) as cm: form.save(validate=True) self.assertEqual(cm.exception.fields, ["TC"]) # Check valid data doesn't throw anything. self.process_keys(form, [Screen.KEY_BACK, Screen.KEY_BACK, Screen.KEY_BACK]) form.save(validate=True) # Check functions work as well as regexp strings. self.process_keys(form, [Screen.KEY_TAB, "ABC"]) with self.assertRaises(InvalidFields) as cm: form.save(validate=True) self.assertEqual(cm.exception.fields, ["TD"]) def test_checkbox_input(self): """ Check Checkbox input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check basic selection keys self.process_keys( form, [Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, " "]) form.save() self.assertEqual(form.data["CA"], True) self.process_keys(form, ["\n"]) form.save() self.assertEqual(form.data["CA"], False) self.process_keys(form, ["\r"]) form.save() self.assertEqual(form.data["CA"], True) # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) def test_radiobutton_input(self): """ Check RadioButton input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check basic selection keys - including limit checking self.process_keys( form, [Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB]) form.save() self.assertEqual(form.data["Things"], 1) self.process_keys(form, [Screen.KEY_UP]) form.save() self.assertEqual(form.data["Things"], 1) self.process_keys(form, [Screen.KEY_DOWN]) form.save() self.assertEqual(form.data["Things"], 2) self.process_keys(form, [Screen.KEY_DOWN]) form.save() self.assertEqual(form.data["Things"], 3) self.process_keys(form, [Screen.KEY_DOWN]) form.save() self.assertEqual(form.data["Things"], 3) self.process_keys(form, [Screen.KEY_UP]) form.save() self.assertEqual(form.data["Things"], 2) # Check that a radio button ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) # Check that setting an unknown value resets to first radio button. form.focussed_widget.value = "Nonexistent value" form.save() self.assertEqual(form.data["Things"], 1) # Check mouse clicks change selection self.process_mouse(form, [(14, 7, MouseEvent.LEFT_CLICK)]) form.save() self.assertEqual(form.data["Things"], 2) def test_mouse_input(self): """ Check mouse input works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check focus moves when clicked on a text or textbox self.process_mouse(form, [(29, 7, MouseEvent.LEFT_CLICK)]) self.assertEqual(form._layouts[form._focus]._live_widget, 2) self.process_mouse(form, [(29, 2, MouseEvent.LEFT_CLICK)]) self.assertEqual(form._layouts[form._focus]._live_widget, 1) # Check focus doesn't change on scroll or click outside of widgets self.process_mouse(form, [(0, 0, 0)]) self.assertEqual(form._focus, 0) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 1) self.process_mouse(form, [(39, 7, MouseEvent.LEFT_CLICK)]) self.assertEqual(form._layouts[form._focus]._live_widget, 1) # Check focus moves when clicked on a checkbox or radiobutton self.process_mouse(form, [(29, 1, MouseEvent.LEFT_CLICK)]) self.assertEqual(form._layouts[form._focus]._live_widget, 8) # Note that the above changes the Frame start-line. self.process_mouse(form, [(29, 5, MouseEvent.LEFT_CLICK)]) self.assertEqual(form._layouts[form._focus]._live_widget, 11) # Check focus moves when hovering over a widget self.process_mouse(form, [(39, 7, MouseEvent.LEFT_CLICK), (3, 8, 0)]) self.assertEqual(form._focus, 1) self.assertEqual(form._layouts[form._focus]._live_col, 0) self.assertEqual(form._layouts[form._focus]._live_widget, 1) # Check button click triggers an event. with self.assertRaises(StopApplication): self.process_mouse(form, [(30, 7, MouseEvent.LEFT_CLICK)]) # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) def test_frame_focus_widget_property(self): """ Check the frame exposes the focussed widget """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # If the Frame loses the focus it must not return a focussed widget. form._has_focus = False self.assertIsNone(form.focussed_widget) # If the Frame focus is undefined, it must not return a focussed widget. form._has_focus = True form._focus = 9999 self.assertIsNone(form.focussed_widget) # Refixing frame resets focus when needed. form._focus = 0 old_focus = form.focussed_widget self.assertIsNotNone(old_focus) form._layouts[0].clear_widgets() form.fix() self.assertNotEqual(form.focussed_widget, old_focus) # Moving focus to undefined widget has no effect. old_focus = form.focussed_widget form.switch_focus(None, 0, 0) self.assertEqual(form.focussed_widget, old_focus) # Blurring removes focus. form.blur() self.assertIsNone(form.focussed_widget) def test_frame_focus_widget_property_when_frame_focussed(self): """ check the frame exposes nothing when frame is foccused """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # A Frame with a valid focus should return the widget in focus. layout = form._layouts[form._focus] layout._has_focus = True form._has_focus = True self.assertEqual(layout._columns[layout._live_col][layout._live_widget], form.focussed_widget) def test_widget_navigation(self): """ Check widget tab stops work as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # Check default focus at start is first visible widget self.assertEqual(form._focus, 0) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 1) # Check BACK_TAB reverses TAB. self.process_keys(form, [Screen.KEY_TAB]) self.assertEqual(form._layouts[form._focus]._live_widget, 2) self.process_keys(form, [Screen.KEY_BACK_TAB]) self.assertEqual(form._layouts[form._focus]._live_widget, 1) # Check BACK_TAB/TAB wraps around the form. self.process_keys(form, [Screen.KEY_BACK_TAB]) self.assertEqual(form._focus, 1) self.process_keys(form, [Screen.KEY_TAB]) self.assertEqual(form._focus, 0) # Tab out into text fields and check UP/DOWN keys. self.process_keys(form, [Screen.KEY_TAB, Screen.KEY_DOWN]) self.assertEqual(form._layouts[form._focus]._live_widget, 3) self.process_keys(form, [Screen.KEY_UP]) self.assertEqual(form._layouts[form._focus]._live_widget, 2) # Tab out into buttons and check LEFT/RIGHT keys. self.process_keys(form, [Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB, Screen.KEY_TAB]) self.assertEqual(form._focus, 1) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 0) self.process_keys(form, [Screen.KEY_RIGHT]) self.assertEqual(form._layouts[form._focus]._live_col, 2) self.process_keys(form, [Screen.KEY_LEFT]) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.process_keys(form, [Screen.KEY_LEFT]) # Reset will be disabled, but move down to "One" self.assertEqual(form._layouts[form._focus]._live_col, 0) self.assertEqual(form._layouts[form._focus]._live_widget, 1) self.process_keys(form, [Screen.KEY_RIGHT]) self.assertEqual(form._layouts[form._focus]._live_col, 1) # Check up and down stay in column. self.process_keys(form, [Screen.KEY_UP]) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 0) self.process_keys(form, [Screen.KEY_DOWN]) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 1) # Check up and down find nearest widget across Layouts # - Up to checkbox self.process_keys(form, [Screen.KEY_UP, Screen.KEY_UP]) self.assertEqual(form._focus, 0) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 10) # - Down to first button row self.process_keys(form, [Screen.KEY_DOWN]) self.assertEqual(form._focus, 1) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 0) # - Down to wrap to top of form self.process_keys(form, [Screen.KEY_DOWN, Screen.KEY_DOWN]) self.assertEqual(form._focus, 0) self.assertEqual(form._layouts[form._focus]._live_col, 1) self.assertEqual(form._layouts[form._focus]._live_widget, 1) def test_list_box(self): """ Check ListBox widget works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame2( canvas, [("One", 1), ("Two is now quite a bit longer than before", 2)]) scene.add_effect(form) form.reset() # Check we have a default value for our list. form.save() self.assertEqual(form.data, {"selected": "None", "contacts": 1}) # Check that UP/DOWN change selection. self.process_keys(form, [Screen.KEY_DOWN]) form.save() self.assertEqual(form.data, {"selected": "None", "contacts": 2}) self.process_keys(form, [Screen.KEY_UP]) form.save() self.assertEqual(form.data, {"selected": "None", "contacts": 1}) # Check that the listbox is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "+------------ Test Frame 2 ------------+\n" + "|One |\n" + "|Two is now quite a bit longer than ...O\n" + "| |\n" + "| |\n" + "| |\n" + "|######################################|\n" + "| < Add > < Edit > < Delete < Quit > |\n" + "|Selected: None |\n" + "+--------------------------------------+\n") # Check that mouse input changes selection. self.process_mouse(form, [(2, 2, MouseEvent.LEFT_CLICK)]) form.save() self.assertEqual(form.data, {"selected": "None", "contacts": 2}) self.process_mouse(form, [(2, 1, MouseEvent.LEFT_CLICK)]) form.save() self.assertEqual(form.data, {"selected": "None", "contacts": 1}) # Check that enter key handles correctly. self.process_keys(form, [Screen.ctrl("m")]) form.save() self.assertEqual(form.data, {"selected": "1", "contacts": 1}) form.update(0) self.assert_canvas_equals( canvas, "+------------ Test Frame 2 ------------+\n" + "|One |\n" + "|Two is now quite a bit longer than ...O\n" + "| |\n" + "| |\n" + "| |\n" + "|######################################|\n" + "| < Add > < Edit > < Delete < Quit > |\n" + "|Selected: 1 |\n" + "+--------------------------------------+\n") # Check that mouse double click handles correctly. self.process_mouse(form, [(2, 2, MouseEvent.DOUBLE_CLICK)]) form.save() self.assertEqual(form.data, {"selected": "2", "contacts": 2}) form.update(0) self.assert_canvas_equals( canvas, "+------------ Test Frame 2 ------------+\n" + "|One |\n" + "|Two is now quite a bit longer than ...O\n" + "| |\n" + "| |\n" + "| |\n" + "|######################################|\n" + "| < Add > < Edit > < Delete < Quit > |\n" + "|Selected: 2 |\n" + "+--------------------------------------+\n") # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) def test_title(self): """ Check Frame titles work as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame2(canvas, [("One", 1), ("Two", 2)]) scene.add_effect(form) form.reset() # Check that the title is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "+------------ Test Frame 2 ------------+\n" + "|One |\n" + "|Two O\n" + "| |\n" + "| |\n" + "| |\n" + "|######################################|\n" + "| < Add > < Edit > < Delete < Quit > |\n" + "|Selected: None |\n" + "+--------------------------------------+\n") # Check that a new title is rendered correctly. form.title = "A New Title!" form.update(1) self.assert_canvas_equals( canvas, "+------------ A New Title! ------------+\n" + "|One |\n" + "|Two O\n" + "| |\n" + "| |\n" + "| |\n" + "|######################################|\n" + "| < Add > < Edit > < Delete < Quit > |\n" + "|Selected: None |\n" + "+--------------------------------------+\n") # Note that the actual stored title includes spaces for margins self.assertEqual(form.title, " A New Title! ") def test_focus_callback(self): """ Check that the _on_focus & _on_blur callbacks work as expected. """ def _on_focus(): self._did_focus += 1 def _on_blur(): self._did_blur += 1 # Reset state for test self._did_blur = 0 self._did_focus = 0 # Create a dummy screen screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 2, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) scene.add_effect(form) layout = Layout([100]) form.add_layout(layout) layout.add_widget(Text("Test")) layout2 = Layout([100], fill_frame=True) form.add_layout(layout2) layout2.add_widget(Text("Test2", on_blur=_on_blur, on_focus=_on_focus)) form.fix() form.reset() # Check state after reset self.assertEqual(self._did_blur, 1) self.assertEqual(self._did_focus, 0) # Tab round to move the focus - check it has called the right function. self.process_keys(form, [Screen.KEY_TAB]) self.assertEqual(self._did_blur, 1) self.assertEqual(self._did_focus, 1) # Now move the focus away with the mouse. self.process_mouse(form, [(0, 0, MouseEvent.LEFT_CLICK)]) self.assertEqual(self._did_blur, 2) self.assertEqual(self._did_focus, 1) # Now check cursor keys call the right function. self.process_keys(form, [Screen.KEY_DOWN]) self.assertEqual(self._did_blur, 2) self.assertEqual(self._did_focus, 2) self.process_keys(form, [Screen.KEY_UP]) self.assertEqual(self._did_blur, 3) self.assertEqual(self._did_focus, 2) def test_load_callback(self): """ Check that the _on_load callback works as expected. """ def _on_load(): self._did_load = True # Reset state for test self._did_load = False # Create a dummy screen screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 2, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, on_load=_on_load) form.fix() scene = Scene([form], -1) # Check only called on reset. self.assertEqual(self._did_load, False) scene.reset() self.assertEqual(self._did_load, True) def test_multi_column_list_box(self): """ Check MultiColumnListBox works as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) mc_list = MultiColumnListBox( Widget.FILL_FRAME, [3, "4", ">4", "<4", "^10%", "100%"], [ (["1", "2", "3", "4", "5", "6"], 1), (["11", "222", "333", "444", "555", "6"], 2), (["111", "2", "3", "4", "5", "6"], 3), (["1", "2", "33333", "4", "5", "6"], 4), (["1", "2", "3", "4", "5", "6666666666666666666666"], 5), ], titles=["A", "B", "C", "D", "E", "F"], name="mc_list") form.add_layout(layout) layout.add_widget(mc_list) form.fix() scene.add_effect(form) form.reset() # Check we have a default value for our list. form.save() self.assertEqual(form.data, {"mc_list": 1}) # Check that UP/DOWN change selection. self.process_keys(form, [Screen.KEY_DOWN]) form.save() self.assertEqual(form.data, {"mc_list": 2}) self.process_keys(form, [Screen.KEY_UP]) form.save() self.assertEqual(form.data, {"mc_list": 1}) # Check that PGUP/PGDN change selection. self.process_keys(form, [Screen.KEY_PAGE_DOWN]) form.save() self.assertEqual(form.data, {"mc_list": 5}) self.process_keys(form, [Screen.KEY_PAGE_UP]) form.save() self.assertEqual(form.data, {"mc_list": 1}) # Check that the widget is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "A B C D E F \n" + "1 2 3 4 5 6 \n" + "11 222 333 444 555 6 \n" + "1112 3 4 5 6 \n" + "1 2 3... 4 5 6 \n" + "1 2 3 4 5 66666666666666666666\n" + " \n" + " \n" + " \n" + " \n") # Check that mouse input changes selection. self.process_mouse(form, [(2, 2, MouseEvent.LEFT_CLICK)]) form.save() self.assertEqual(form.data, {"mc_list": 2}) self.process_mouse(form, [(2, 1, MouseEvent.LEFT_CLICK)]) form.save() self.assertEqual(form.data, {"mc_list": 1}) # Check that the start_line can be read and set - and enforces good behaviour mc_list.start_line = 0 self.assertEqual(mc_list.start_line, 0) mc_list.start_line = len(mc_list.options) - 1 self.assertEqual(mc_list.start_line, len(mc_list.options) - 1) mc_list.start_line = 10000000 self.assertEqual(mc_list.start_line, len(mc_list.options) - 1) # Check that options can be read and set. mc_list.options = [(["a", "b", "c", "d", "e", "f"], 0)] self.assertEqual(mc_list.options, [(["a", "b", "c", "d", "e", "f"], 0)]) mc_list.options = [] self.assertEqual(mc_list.options, []) # Check that the form re-renders correctly afterwards. form.update(1) self.assert_canvas_equals( canvas, "A B C D E F \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check that the current focus ignores unknown events. event = object() self.assertEqual(event, form.process_event(event)) # Check that options retain the current value where possible. mc_list.options = [ (["a", "b", "c", "d", "e", "f"], 0), (["b", "b", "c", "d", "e", "f"], 1), (["c", "b", "c", "d", "e", "f"], 2), ] mc_list.value = 1 mc_list.options = [ (["a", "b", "c", "d", "e", "f"], 0), (["b", "b", "c", "d", "e", "f"], 1), (["c", "b", "c", "d", "e", "f"], 2), (["d", "b", "c", "d", "e", "f"], 3), ] self.assertEqual(mc_list.value, 1) mc_list.options = [ (["a", "b", "c", "d", "e", "f"], 0), (["c", "b", "c", "d", "e", "f"], 2), (["d", "b", "c", "d", "e", "f"], 3), ] self.assertEqual(mc_list.value, 0) def test_multi_column_list_box_delimiter(self): """ Check MultiColumnListBox works as expected with space_delimiter """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) mc_list = MultiColumnListBox( Widget.FILL_FRAME, [3, "4", ">4", "<4", "^10%", "100%"], [ (["1", "2", "3", "4", "5", "6"], 1), (["11", "222", "333", "444", "555", "6"], 2), (["111", "2", "3", "4", "5", "6"], 3), (["1", "2", "33333", "4", "5", "6"], 4), (["1", "2", "3", "4", "5", "6666666666666666666666"], 5), ], titles=["A", "B", "C", "D", "E", "F"], name="mc_list", space_delimiter='|') form.add_layout(layout) layout.add_widget(mc_list) form.fix() scene.add_effect(form) form.reset() # Check that the widget is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "A |B | C|D | E |F \n" + "1 |2 | 3|4 | 5 |6 \n" + "11 |222 | 333|444 |555 |6 \n" + "111|2 | 3|4 | 5 |6 \n" + "1 |2 |3...|4 | 5 |6 \n" + "1 |2 | 3|4 | 5 |6666666666666666\n" + " \n" + " \n" + " \n" + " \n") def test_list_box_scrollbar(self): """ Check ListBox scrollbar works. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) simple_list = ListBox( 3, [ ("Some", 1), ("Stuff", 2), ("To", 3), ("See", 4), ], add_scroll_bar=True, name="simple_list") form.add_layout(layout) layout.add_widget(simple_list) form.fix() scene.add_effect(form) form.reset() # Check that the widget is rendered correctly with the scrollbar form.update(0) self.assert_canvas_equals( canvas, "Some O\n" + "Stuff |\n" + "To |\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check that mouse input works self.process_mouse(form, [(39, 2, MouseEvent.LEFT_CLICK)]) form.update(0) self.assert_canvas_equals( canvas, "Stuff |\n" + "To |\n" + "See O\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check that options can be set and hide scrollbar simple_list.options = [("New list", 1)] form.update(0) self.assert_canvas_equals( canvas, "New list \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") def test_multi_column_list_box_scrollbar(self): """ Check MultiColumnListBox scrollbar works. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) mc_list = MultiColumnListBox( 3, [3, 0, ">4"], [ (["1", "2", "3"], 1), (["11", "222", "333"], 2), (["111", "2", "3"], 3), ], titles=["A", "B", "C"], add_scroll_bar=True, name="mc_list") form.add_layout(layout) layout.add_widget(mc_list) form.fix() scene.add_effect(form) form.reset() # Check that the widget is rendered correctly with the scrollbar form.update(0) self.assert_canvas_equals( canvas, "A B C \n" + "1 2 3O\n" + "11 222 333|\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check that search works self.process_keys(form, ["111"]) form.update(0) self.assert_canvas_equals( canvas, "A B C \n" + "11 222 333O\n" + "1112 3|\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") def test_disabled_layout(self): """ Check disabled layout cannot be tabstop. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100]) form.add_layout(layout) text_box = TextBox(1, as_string=True) text_box.disabled = True layout.add_widget(text_box) layout2 = Layout([100], fill_frame=True) form.add_layout(layout2) text_box2 = TextBox(1, as_string=True) layout2.add_widget(text_box2) form.fix() scene.add_effect(form) form.reset() # Check that input cannot get focus on disabled layout. text_box.value = "A test" text_box2.value = "Another test" self.process_keys(form, ["A", Screen.KEY_TAB, Screen.KEY_UP, "B"]) form.save() self.assertEqual(text_box.value, "A test") self.assertEqual(text_box2.value, "Another testAB") def test_disabled_text(self): """ Check disabled TextBox can be used for pre-formatted output. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) text_box = TextBox(1, as_string=True) text_box.disabled = True layout.add_widget(text_box) form.fix() scene.add_effect(form) form.reset() # Check that input has no effect on the programmed value. text_box.value = "A test" self.process_keys(form, ["A"]) form.save() self.assertEqual(text_box.value, "A test") # Check that we can provide a custom colour. Since the default palette has no "custom" # key, this will throw an exception. self.assertEqual(text_box._pick_colours("blah"), form.palette["disabled"]) with self.assertRaises(KeyError) as cm: text_box.custom_colour = "custom" text_box._pick_colours("blah") self.assertIn("custom", str(cm.exception)) # Also check the value is returned as set self.assertEqual(text_box.custom_colour, "custom") def test_line_flow(self): """ Check TextBox line-flow editing works as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) text_box = TextBox(5, as_string=True, line_wrap=True) layout.add_widget(text_box) form.fix() scene.add_effect(form) form.reset() # start with some text that will wrap and check display works. text_box.value = "A\nSome very long text that will wrap across multiple lines\nB\n" # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "A \n" + "Some very long text that will wrap acros\n" + "s multiple lines \n" + "B \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check keyboard logic still works and display reflows on demand. self.process_mouse(form, [(0, 0, MouseEvent.LEFT_CLICK)]) self.process_keys(form, [Screen.KEY_DOWN, "A", Screen.KEY_END, "B"]) form.update(1) self.assert_canvas_equals( canvas, "A \n" + "ASome very long text that will wrap acro\n" + "ss multiple linesB \n" + "B \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") self.assertEqual(text_box.value, "A\nASome very long text that will wrap across multiple linesB\nB\n") # Check mouse logic still works. self.process_mouse(form, [(0, 2, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["Z"]) self.process_mouse(form, [(3, 3, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["Y"]) form.update(1) self.assertEqual(text_box.value, "A\nASome very long text that will wrap acroZss multiple linesB\nBY\n") def test_pop_up_widget(self): """ Check popup dialog work as expected. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = PopUpDialog(canvas, "Message", ["Yes", "No"], test_on_click) scene.add_effect(form) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, " \n" + " \n" + " +------------------+ \n" + " |Message | \n" + " | | \n" + " | < Yes > < No > | \n" + " +------------------+ \n" + " \n" + " \n" + " \n") # Check that mouse input triggers the close function. with self.assertRaises(NextScene): self.process_mouse(form, [(14, 5, MouseEvent.LEFT_CLICK)]) # Check that the pop-up swallows all events. event = object() self.assertIsNone(form.process_event(event)) def test_pop_up_no_buttons(self): """ Check dialog with nobuttons work as expected. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = PopUpDialog(canvas, "Message", [], test_on_click) scene.add_effect(form) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, " \n" + " \n" + " \n" + " +-------+ \n" + " |Message| \n" + " +-------+ \n" + " \n" + " \n" + " \n" + " \n") def test_cjk_popup(self): """ Check PopUpDialog widgets work with CJK double-width characters. """ # Apologies to anyone who actually speaks this language! I just need some double-width # glyphs so have re-used the ones from the original bug report. screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = PopUpDialog(canvas, "你確定嗎? 你確定嗎? 你確定嗎?", ["是", "否"]) scene.add_effect(form) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, " \n" + " \n" + " ┌────────────────────────┐ \n" + " │你你確確定定嗎嗎?? 你你確確定定嗎嗎?? │ \n" + " │你你確確定定嗎嗎?? █ \n" + " │ ░ \n" + " │ < 是是 > < 否否 > │ \n" + " └────────────────────────┘ \n" + " \n" + " \n") def test_cjk_forms(self): """ Check form widgets work with CJK characters. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) mc_list = MultiColumnListBox( 4, [3, 5, 0], [ (["1", "2", "3"], 1), (["你", "確", "定"], 2), ], titles=["你確定嗎?", "你確定嗎?", "你確定嗎?"]) text = Text() text_box = TextBox(3) form.add_layout(layout) layout.add_widget(mc_list) layout.add_widget(text) layout.add_widget(text_box) form.fix() scene.add_effect(form) form.reset() # Set some interesting values... text.value = "你確定嗎? 你確定嗎? 你確定嗎?" text_box.value = ["你確定嗎", "?"] # Check that the CJK characters render correctly - no really this is correctly aligned! form.update(0) self.assert_canvas_equals( canvas, "你你 你你確確 你你確確定定嗎嗎?? \n" + "1 2 3 \n" + "你你 確確 定定 \n" + " \n" + "你你確確定定嗎嗎?? 你你確確定定嗎嗎?? 你你確確定定嗎嗎?? \n" + "你你確確定定嗎嗎 \n" + "?? \n" + " \n" + " \n" + " \n") # Check that mouse input takes into account the glyph width self.process_mouse(form, [(5, 4, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["b"]) self.process_mouse(form, [(2, 4, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["p"]) form.save() self.assertEqual(text.value, "你p確b定嗎? 你確定嗎? 你確定嗎?") self.process_mouse(form, [(2, 5, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["p"]) self.process_mouse(form, [(1, 6, MouseEvent.LEFT_CLICK)]) self.process_keys(form, ["b"]) form.save() self.assertEqual(text_box.value, ["你p確定嗎", "b?"]) def test_shadow(self): """ Check Frames support shadows. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) for y in range(10): canvas.print_at("X" * 40, 0, y) form = PopUpDialog( canvas, "Message", ["Yes", "No"], test_on_click, has_shadow=True) scene.add_effect(form) form.reset() # Check that the pop-up is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXX+------------------+XXXXXXXXXX\n" + "XXXXXXXXXX|Message |XXXXXXXXXX\n" + "XXXXXXXXXX| |XXXXXXXXXX\n" + "XXXXXXXXXX| < Yes > < No > |XXXXXXXXXX\n" + "XXXXXXXXXX+------------------+XXXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n") def test_clone(self): """ Check Frame cloning works. """ def test_on_click(selection): raise NextScene(str(selection)) screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) # Check that pop-up dialogs get copied to the new Scene scene = Scene([], -1) scene2 = Scene([], 10) form = PopUpDialog( canvas, "Message", ["Yes", "No"], test_on_click, has_shadow=True) scene.add_effect(form) form.clone(canvas, scene2) self.assertEqual(len(scene2.effects), 1) self.assertEqual(scene2.effects[0]._text, "Message") self.assertEqual(scene2.effects[0]._buttons, ["Yes", "No"]) # Check that normal Frame data gets copied to the new Scene. frame = _TestFrame(canvas) frame2 = _TestFrame(canvas) scene = Scene([frame], 10) scene2 = Scene([frame2], 10) frame.data = {"TA": ["something"]} frame2.data = {} self.assertEqual(frame2.data, {}) self.assertNotEqual(frame2.data, frame.data) frame.clone(canvas, scene2) self.assertEqual(frame2.data, frame.data) def test_frame_rate(self): """ Check Frame rate limiting works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas) scene.add_effect(form) form.reset() # With no special CPU consideration, and a cursor to animate, there # should be a 5 frame pause. self.assertEqual(form.reduce_cpu, False) self.assertEqual(form.frame_update_count, 5) # Shift focus away from a text input (to get no cursor animation). self.process_keys(form, [Screen.KEY_BACK_TAB]) # With no special CPU consideration, and no cursors to animate, there # should be a (very!) long pause. self.assertEqual(form.reduce_cpu, False) self.assertEqual(form.frame_update_count, 1000000) def test_cpu_saving(self): """ Check Frame rate limiting is even more extreme when in cpu saving mode. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame(canvas, reduce_cpu=True) scene.add_effect(form) form.reset() # In this mode, it shouldn't matter where we are on the Frame - all # widgets will basically say they don't need animation. self.assertEqual(form.reduce_cpu, True) self.assertEqual(form.frame_update_count, 1000000) # Shift focus away from a text input, just to be sure. self.process_keys(form, [Screen.KEY_BACK_TAB]) self.assertEqual(form.frame_update_count, 1000000) def test_stop_frame(self): """ Check Frames always request no end to the Scene. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame(canvas, reduce_cpu=True) self.assertEqual(form.stop_frame, -1) def test_empty_frame(self): """ Check empty Frames still work. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) scene = Scene([], -1) form = _TestFrame3(canvas) scene.add_effect(form) form.reset() # Check all keyboard events get swallowed self.assertIsNone(form.process_event(KeyboardEvent(ord("A")))) # Check Mouse events over the Frame are swallowed and others allowed # to bubble down the input stack. self.assertIsNone( form.process_event(MouseEvent(20, 5, MouseEvent.LEFT_CLICK))) self.assertIsNotNone( form.process_event(MouseEvent(5, 5, MouseEvent.LEFT_CLICK))) # Check form data is empty. form.save() self.assertEqual(form.data, {}) def test_label_change(self): """ Check Labels can be dynamically updated. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame(canvas) form.reset() # Check initial rendering form.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| Group 1: |\n" + "| My First O\n" + "| Box: |\n" + "| |\n" + "| |\n" + "| |\n" + "| Text1: |\n" + "| Text2: |\n" + "+--------------------------------------+\n") # Check dynamic updates change the rendering. form.label.text = "New text here:" form.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| New text here: |\n" + "| My First O\n" + "| Box: |\n" + "| |\n" + "| |\n" + "| |\n" + "| Text1: |\n" + "| Text2: |\n" + "+--------------------------------------+\n") self.assertEqual(form.label.text, "New text here:") # And check that values are unaffected (and still not set). self.assertEqual(form.label.value, None) def test_label_height(self): """ Check Labels can be dynamically updated. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame(canvas, label_height=2) form.reset() # Check Label obeys required height form.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| Group 1: |\n" + "| O\n" + "| My First |\n" + "| Box: |\n" + "| |\n" + "| |\n" + "| |\n" + "| Text1: |\n" + "+--------------------------------------+\n") # Now check wrapping works too... form.label.text = "A longer piece of text that should wrap across multiple lines:" form.update(1) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| A longer piece of text that should |\n" + "| wrap across multiple lines: O\n" + "| My First |\n" + "| Box: |\n" + "| |\n" + "| |\n" + "| |\n" + "| Text1: |\n" + "+--------------------------------------+\n") def test_label_alignment(self): """ Check Label alignment works. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([1]) form.add_layout(layout) layout.add_widget(Label("Left", align="<")) layout.add_widget(Label("Middle", align="^")) layout.add_widget(Label("Right", align=">")) form.fix() scene.add_effect(form) scene.reset() # Check that the frame is rendered correctly. for effect in scene.effects: effect.update(0) # Check Label obeys required height form.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Left |\n" + "| Middle O\n" + "| Right|\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") def test_label_colours(self): """ Check Label custom colour works. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([1]) form.add_layout(layout) label = Label("Some text") label.custom_colour = "disabled" layout.add_widget(label) form.fix() scene.add_effect(form) scene.reset() # Check that the label is rendered in the correct colour palette. for effect in scene.effects: effect.update(0) self.assertEqual(label.custom_colour, "disabled") self.assertEqual(canvas.get_from(1, 1), (ord("S"), 0, 1, 4)) # Cheeky test that Labels always pass on events. event = object() self.assertEqual(event, label.process_event(event)) @patch("os.stat") @patch("os.listdir") def test_file_browser_stat_err(self, mock_list, mock_stat): """ Check FileBrowser widget copes with permissions error on stat. """ # First we need to mock out the file system calls to have a regressible test if sys.platform == "win32": self.skipTest("File names wrong for windows") mock_list.return_value = ["A Directory", "A File", "A Lnk"] mock_stat.side_effect = OSError("Fake error") # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame4(canvas) scene.add_effect(form) form.reset() # Check that the Frame is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "/ Size Last modified\n" + "|-- A Directory 0 %s\n" % self.epoch_date + "|-- A File 0 %s\n" % self.epoch_date + "|-- A Lnk 0 %s\n" % self.epoch_date + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") @patch("os.listdir") def test_file_browser_list_err(self, mock_list): """ Check FileBrowser widget copes with permissions error on list. """ # First we need to mock out the file system calls to have a regressible test if sys.platform == "win32": self.skipTest("File names wrong for windows") mock_list.side_effect = OSError("Fake error") # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame4(canvas) scene.add_effect(form) form.reset() # Check that the Frame is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "/ Size Last modified\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") @patch("os.path.exists") @patch("os.path.realpath") @patch("os.path.islink") @patch("os.path.isdir") @patch("os.lstat") @patch("os.stat") @patch("os.listdir") def test_file_browser(self, mock_list, mock_stat, mock_lstat, mock_dir, mock_link, mock_real_path, mock_exists): """ Check FileBrowser widget works as expected. """ # First we need to mock out the file system calls to have a regressible test if sys.platform == "win32": self.skipTest("File names wrong for windows") mock_list.return_value = ["A Directory", "A File", "A Lnk", str(b"oo\xcc\x88o\xcc\x88O\xcc\x88.txt", 'utf-8'), "Lnk Directory"] mock_result = MagicMock() mock_result.st_mtime = 0 mock_result.st_size = 10000 mock_stat.return_value = mock_result mock_lstat.return_value = mock_result mock_dir.side_effect = lambda x: x.endswith("Directory") mock_link.side_effect = lambda x: "Lnk" in x mock_real_path.return_value = "A Tgt" mock_exists.return_value = True # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame4(canvas) scene.add_effect(form) form.reset() # Check we have a default value for our list. form.save() self.assertIsNone(form.selected) self.assertIsNone(form.highlighted) self.assertEqual(form.data, {"file_list": None}) # Check that the Frame is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "/ Size Last modified\n" + "|-+ A Directory 9K %s\n" % self.epoch_date + "|-+ Lnk Directo... 9K %s\n" % self.epoch_date + "|-- A File 9K %s\n" % self.epoch_date + "|-- A Lnk -> A Tgt 9K %s\n" % self.epoch_date + "|-- oööÖ.txt 9K %s\n" % self.epoch_date + " \n" + " \n" + " \n" + " \n") # Check that mouse inpput changes selection. self.process_mouse(form, [(2, 3, MouseEvent.LEFT_CLICK)]) form.save() self.assertEqual(form.data, {"file_list": "/A File"}) self.assertEqual(form.highlighted, "/A File") self.assertIsNone(form.selected) # Check that UP/DOWN change selection. self.process_keys(form, [Screen.KEY_UP, Screen.KEY_UP]) form.save() self.assertEqual(form.data, {"file_list": "/A Directory"}) self.assertEqual(form.highlighted, "/A Directory") self.assertIsNone(form.selected) # Check that enter key handles correctly on directories. self.process_keys(form, [Screen.ctrl("m")]) self.assertEqual(form.highlighted, "/") self.assertIsNone(form.selected) form.update(1) self.assert_canvas_equals( canvas, "/A Directory Size Last modified\n" + "|-+ .. \n" + "|-+ A Directory 9K %s\n" % self.epoch_date + "|-+ Lnk Directo... 9K %s\n" % self.epoch_date + "|-- A File 9K %s\n" % self.epoch_date + "|-- A Lnk -> A Tgt 9K %s\n" % self.epoch_date + "|-- oööÖ.txt 9K %s\n" % self.epoch_date + " \n" + " \n" + " \n") # Check that enter key handles correctly on files. self.process_keys(form, [Screen.KEY_DOWN, Screen.KEY_DOWN, Screen.KEY_DOWN, Screen.ctrl("m")]) self.assertEqual(form.highlighted, "/A Directory/A File") self.assertEqual(form.selected, "/A Directory/A File") @patch("os.path.exists") @patch("os.path.realpath") @patch("os.path.islink") @patch("os.path.isdir") @patch("os.lstat") @patch("os.stat") @patch("os.listdir") def test_file_filter(self, mock_list, mock_stat, mock_lstat, mock_dir, mock_link, mock_real_path, mock_exists): """ Check FileBrowser widget with a file_filter works as expected. """ # First we need to mock out the file system calls to have a regressible test if sys.platform == "win32": self.skipTest("File names wrong for windows") mock_list.return_value = ["A Directory", "A File", "A Lnk", str(b"oo\xcc\x88o\xcc\x88O\xcc\x88.txt", 'utf-8'), "hello.bmp"] mock_result = MagicMock() mock_result.st_mtime = 0 mock_result.st_size = 10000 mock_stat.return_value = mock_result mock_lstat.return_value = mock_result mock_dir.side_effect = lambda x: x.endswith("Directory") mock_link.side_effect = lambda x: "Lnk" in x mock_real_path.return_value = "A Tgt" mock_exists.return_value = True # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame4(canvas, file_filter=r".*\.bmp$") scene.add_effect(form) form.reset() # Check we have a default value for our list. form.save() self.assertIsNone(form.selected) self.assertIsNone(form.highlighted) self.assertEqual(form.data, {"file_list": None}) # Check that the Frame is rendered correctly. form.update(0) self.assert_canvas_equals( canvas, "/ Size Last modified\n" + "|-+ A Directory 9K %s\n" % self.epoch_date + "|-- hello.bmp 9K %s\n" % self.epoch_date + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check that enter key handles correctly on files. self.process_keys(form, [Screen.KEY_DOWN, Screen.KEY_DOWN, Screen.ctrl("m")]) self.assertEqual(form.highlighted, "/hello.bmp") self.assertEqual(form.selected, "/hello.bmp") def test_date_picker(self): """ Check DatePicker widget works as expected. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame5(canvas) scene.add_effect(form) scene.reset() # Check that the Frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Date: 02/Jan/2017 |\n" + "|Time: 12:00:59 O\n" + "|Tim2: 11:02 |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that enter key brings up edit pop-up self.process_keys(scene, [Screen.ctrl("m")]) self.assertFalse(form.changed) for effect in scene.effects: effect.update(1) self.assert_canvas_equals( canvas, "+-----|01 2016|--------------------+\n" + "|Date:|02/Jan/2017| |\n" + "|Time:|03 Feb 2018| O\n" + "|Tim2:+-----------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that you can't select an invalid date. self.process_keys(scene, ["31", "Feb", Screen.ctrl("m")], separator=Screen.KEY_TAB) self.assertFalse(form.changed) for effect in scene.effects: effect.update(2) self.assert_canvas_equals( canvas, "+-----|30 Jan 2016|--------------------+\n" + "|Date:|31/Feb/2017| |\n" + "|Time:| Mar 2018| O\n" + "|Tim2:+-----------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that a valid date updates the value - wait one second to allow search to reset. sleep(1) self.process_keys(scene, ["15", "Jun", Screen.ctrl("m")], separator=Screen.KEY_TAB) self.assertTrue(form.changed) for effect in scene.effects: effect.update(2) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Date: 15/Jun/2017 |\n" + "|Time: 12:00:59 O\n" + "|Tim2: 11:02 |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") self.assertEqual(form.date_widget.value, date(2017, 6, 15)) # Check the mouse works too - pass mouse events to top-level effect self.process_mouse(scene.effects[-1], [(10, 1, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(3) self.assert_canvas_equals( canvas, "+-----|14 May 2016|--------------------+\n" + "|Date:|15/Jun/2017| |\n" + "|Time:|16 Jul 2018| O\n" + "|Tim2:+-----------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") self.process_mouse(scene.effects[-1], [(11, 2, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(4) self.assert_canvas_equals( canvas, "+-----|14 Jun 2016|--------------------+\n" + "|Date:|15/Jul/2017| |\n" + "|Time:|16 Aug 2018| O\n" + "|Tim2:+-----------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") def test_time_picker(self): """ Check TimePicker widget works as expected. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame5(canvas) scene.add_effect(form) scene.reset() # Check that the Frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assertFalse(form.changed) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Date: 02/Jan/2017 |\n" + "|Time: 12:00:59 O\n" + "|Tim2: 11:02 |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that enter key brings up edit pop-up self.process_keys(scene, [Screen.KEY_DOWN, Screen.ctrl("m")]) for effect in scene.effects: effect.update(1) self.assertFalse(form.changed) self.assert_canvas_equals( canvas, "+-----+--------+-----------------------+\n" + "|Date:|11 58|17 |\n" + "|Time:|12:00:59| O\n" + "|Tim2:|13 01 | |\n" + "| +--------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that no match on search changes nothing. self.process_keys(scene, ["99"]) for effect in scene.effects: effect.update(1) self.assertFalse(form.changed) self.assert_canvas_equals( canvas, "+-----+--------+-----------------------+\n" + "|Date:|11 58|17 |\n" + "|Time:|12:00:59| O\n" + "|Tim2:|13 01 | |\n" + "| +--------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that we can change the time with cursors keys and mouse selection - and click out # to exit. self.process_mouse(scene, [(7, 1, MouseEvent.LEFT_CLICK)]) self.process_keys(scene, [Screen.KEY_TAB, Screen.KEY_DOWN, Screen.KEY_TAB, Screen.KEY_UP]) self.process_mouse(scene, [(10, 10, MouseEvent.LEFT_CLICK)]) self.assertTrue(form.changed) for effect in scene.effects: effect.update(2) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Date: 02/Jan/2017 |\n" + "|Time: 11:01:58 O\n" + "|Tim2: 11:02 |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") self.assertEqual(form.time_widget.value, time(11, 1, 58)) # Check that small time pops correctly. self.process_keys(scene, [Screen.KEY_TAB, Screen.ctrl('m')]) for effect in scene.effects: effect.update(3) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Date:+-----+/2017 |\n" + "|Time:|10 01|58 O\n" + "|Tim2:|11:02| |\n" + "| |12 03| |\n" + "| +-----+ |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check the mouse works too self.process_mouse(scene, [(30, 3, MouseEvent.LEFT_CLICK), (7, 2, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(4) self.assert_canvas_equals( canvas, "+-----+--------+-----------------------+\n" + "|Date:|10 00 57|17 |\n" + "|Time:|11:01:58| O\n" + "|Tim2:|12 02 59| |\n" + "| +--------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") self.process_mouse(scene.effects[-1], [(7, 1, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(5) self.assert_canvas_equals( canvas, "+-----+--------+-----------------------+\n" + "|Date:|09 00 57|17 |\n" + "|Time:|10:01:58| O\n" + "|Tim2:|11 02 59| |\n" + "| +--------+ |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") def test_background(self): """ Check Background widget works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) form = Background(canvas, bg=7) scene.add_effect(form) form.reset() # Check that the widget is rendered correctly. form.update(0) for y in range(canvas.height): for x in range(canvas.width): char, _, _, bg = canvas.get_from(x, y) self.assertEqual(char, ord(" ")) self.assertEqual(bg, 7) # Check properties self.assertEqual(form.stop_frame, 0) self.assertGreater(form.frame_update_count, 1000) def test_dropdown_list(self): """ Check DropdownList widget works as expected. """ def _click(): self._clicked = True # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100], fill_frame=True) form.add_layout(layout) layout.add_widget(DropdownList([("Item 1", 1), ("Item 2", 3), ("Item 3", 5)], on_change=_click)) form.fix() scene.add_effect(form) scene.reset() self._clicked = False # Check that the Frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|[ Item 1 ]|\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check it opens as expected self.process_mouse(scene, [(7, 1, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(1) self.assert_canvas_equals( canvas, "++------------------------------------++\n" + "|| Item 1 ||\n" + "||------------------------------------|O\n" + "|| Item 1 ||\n" + "|| Item 2 ||\n" + "|| Item 3 ||\n" + "|+------------------------------------+|\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check ESC works as expected self.process_keys(scene, [Screen.KEY_DOWN, Screen.KEY_ESCAPE]) for effect in scene.effects: effect.update(2) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|[ Item 1 ]|\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") self.assertFalse(self._clicked) # Check key selection works as expected self.process_keys(scene, [" ", Screen.KEY_DOWN]) for effect in scene.effects: effect.update(3) self.assert_canvas_equals( canvas, "++------------------------------------++\n" + "|| Item 2 ||\n" + "||------------------------------------|O\n" + "|| Item 1 ||\n" + "|| Item 2 ||\n" + "|| Item 3 ||\n" + "|+------------------------------------+|\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check Enter works as expected self.process_keys(scene, [Screen.ctrl("m")]) for effect in scene.effects: effect.update(4) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|[ Item 2 ]|\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") self.assertTrue(self._clicked) def test_dropdown_list_options(self): """ Check DropdownList widget extra features work. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100], fill_frame=True) form.add_layout(layout) layout.add_widget(Divider(draw_line=False, height=7)) dd_list = DropdownList([(f"Item {i}", i) for i in range(10)]) layout.add_widget(dd_list) form.fix() scene.add_effect(form) scene.reset() # Check that the Frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| |\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "|[ Item 0 ]|\n" + "+--------------------------------------+\n") # Check it opens as expected self.process_mouse(scene, [(7, 8, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(1) self.assert_canvas_equals( canvas, "++------------------------------------++\n" + "|| Item 0 O||\n" + "|| Item 1 ||O\n" + "|| Item 2 |||\n" + "|| Item 3 |||\n" + "|| Item 4 |||\n" + "|| Item 5 |||\n" + "||------------------------------------||\n" + "|| Item 0 ||\n" + "++------------------------------------++\n") # Check that options can be read and set. dd_list.options = [(["a", "b", "c", "d", "e", "f"], 0)] self.assertEqual(dd_list.options, [(["a", "b", "c", "d", "e", "f"], 0)]) dd_list.options = [] self.assertEqual(dd_list.options, []) # Check that the fit to option width option works screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100], fill_frame=True) form.add_layout(layout) layout.add_widget(Divider(draw_line=False, height=7)) dd_list = DropdownList([(f"Item {i}", i) for i in range(10)], fit=True) layout.add_widget(dd_list) form.fix() scene.add_effect(form) scene.reset() # Check that the Frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| |\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "|[ Item 0 ] |\n" + "+--------------------------------------+\n") # Check it opens as expected self.process_mouse(scene, [(7, 8, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(1) self.assert_canvas_equals( canvas, "++--------+----------------------------+\n" + "|| Item 0O| |\n" + "|| Item 1|| O\n" + "|| Item 2|| |\n" + "|| Item 3|| |\n" + "|| Item 4|| |\n" + "|| Item 5|| |\n" + "||--------| |\n" + "|| Item 0 | |\n" + "++--------+----------------------------+\n") def test_divider(self): """ Check Divider widget sundry features work. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100], fill_frame=True) form.add_layout(layout) divider = Divider(draw_line=False, height=7) layout.add_widget(divider) form.fix() scene.add_effect(form) form.reset() # Check events are ignored event = object() self.assertEqual(event, divider.process_event(event)) # Check value is None self.assertIsNone(divider.value) def test_find_widget(self): """ Check find_widget works as expected. """ # Set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame5(canvas) scene.add_effect(form) scene.reset() # Can't find a non-existent widget self.assertIsNone(form.find_widget("ABLAH")) # Can find a defined widget self.assertEqual(form.find_widget("date"), form.date_widget) def test_password(self): """ Check that we can do password input on Text widgets. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 2, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) text = Text("Password", hide_char="*") layout.add_widget(text) form.fix() scene.add_effect(form) form.reset() # Check that input still saves off values as expected self.process_keys(form, ["1234"]) form.save() self.assertEqual(text.value, "1234") # Check that it is drawn with the obscuring character, though. form.update(0) self.assert_canvas_equals( canvas, "Password **** \n" + " \n") def test_change_values(self): """ Check changing Text values resets cursor position. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) text = Text() layout.add_widget(text) form.fix() scene.add_effect(form) form.reset() # Check that input is put at the end of the new text text.value = "A test" self.process_keys(form, ["A"]) form.save() self.assertEqual(text.value, "A testA") # Check that growing longer still puts it at the end. text.value = "A longer test" self.process_keys(form, ["A"]) form.save() self.assertEqual(text.value, "A longer testA") def test_popup_meu(self): """ Check PopupMenu widget works as expected. """ # Simple function to test which item is selected. def click(x): self.clicked = self.clicked or x # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) # Reset menu for test self.clicked = 0 popup = PopupMenu(canvas, [ ("First", lambda: click(1)), ("Second", lambda: click(2)), ("Third", lambda: click(4)) ], 0, 0) scene.add_effect(popup) scene.reset() # Check that the menu is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "First \n" + "Second \n" + "Third \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n") # Check it handles a selection as expected self.process_mouse(scene, [(0, 1, MouseEvent.LEFT_CLICK)]) self.assertEqual(len(scene.effects), 0) self.assertEqual(self.clicked, 2) # Check choice of location at bottom right self.clicked = 0 canvas.reset() popup = PopupMenu(canvas, [ ("First", lambda: click(1)), ("Second", lambda: click(2)), ("Third", lambda: click(4)) ], 39, 9) scene.add_effect(popup) scene.reset() # Check that the menu is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " First \n" + " Second\n" + " Third \n") # Check it handles a selection as expected self.process_mouse(scene, [(39, 7, MouseEvent.LEFT_CLICK)]) self.assertEqual(len(scene.effects), 0) self.assertEqual(self.clicked, 1) # Check clicking outside menu dismisses it - wrong X location. self.clicked = 0 canvas.reset() popup = PopupMenu(canvas, [("A", lambda: click(1)), ("B", lambda: click(2))], 39, 9) scene.add_effect(popup) scene.reset() self.process_mouse(scene, [(10, 9, MouseEvent.LEFT_CLICK)]) self.assertEqual(len(scene.effects), 0) self.assertEqual(self.clicked, 0) # Check clicking outside menu dismisses it - wrong Y location. self.clicked = 0 canvas.reset() popup = PopupMenu(canvas, [("A", lambda: click(1)), ("B", lambda: click(2))], 39, 9) scene.add_effect(popup) scene.reset() self.process_mouse(scene, [(39, 1, MouseEvent.LEFT_CLICK)]) self.assertEqual(len(scene.effects), 0) self.assertEqual(self.clicked, 0) # Check clicking outside menu dismisses it. self.clicked = 0 canvas.reset() popup = PopupMenu(canvas, [("A", lambda: click(1)), ("B", lambda: click(2))], 39, 9) scene.add_effect(popup) scene.reset() self.process_keys(popup, [Screen.KEY_ESCAPE]) self.assertEqual(len(scene.effects), 0) self.assertEqual(self.clicked, 0) def test_find_min_start(self): """ Check _find_min_start works as expected. """ # Normal operation will find last characters. self.assertEqual(_find_min_start("ABCDEF", 3), 3) # Allow extra space for cursor loses another self.assertEqual(_find_min_start("ABCDEF", 3, at_end=True), 4) def test_vertical_divider(self): """ Check VerticalDivider widget works as expected. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([5, 1, 26, 1, 5]) form.add_layout(layout) layout.add_widget(Label("A"), 1) layout.add_widget(VerticalDivider(), 1) layout.add_widget(Label("B"), 1) layout.add_widget(TextBox(5), 2) divider = VerticalDivider() layout.add_widget(divider, 3) layout.add_widget(Label("END"), 4) form.fix() scene.add_effect(form) scene.reset() # Check that the frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| A |END |\n" + "| | | O\n" + "| | | |\n" + "| | | |\n" + "| B | |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that a vertcial divider ignores unknown events. event = object() self.assertEqual(event, divider.process_event(event)) # Check that it has no value. self.assertEqual(divider.value, None) def test_value_defaults(self): """ Check Widgets can set default values from code. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100]) form.add_layout(layout) textbox = TextBox(2, label="TB") textbox.value = ["Hello"] text = Text(label="B") text.value = "World" listbox = ListBox(2, [("A", 1), ("B", 2), ("C", 3), ("D", 4)], label="LB") listbox.value = 3 layout.add_widget(textbox) layout.add_widget(text) layout.add_widget(listbox) form.fix() scene.add_effect(form) scene.reset() # Check that the frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|TB Hello |\n" + "| O\n" + "|B World |\n" + "|LB C |\n" + "| D |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") def test_frame_themes(self): """ Check we can set a colour theme for a Frame. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) # Check colour changes work... self.assertEqual( form.palette["background"], (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLUE)) form.set_theme("monochrome") self.assertEqual( form.palette["background"], (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK)) # Check that a bad theme name has no effect. form.set_theme("blah - this doesn't exist") self.assertEqual( form.palette["background"], (Screen.COLOUR_WHITE, Screen.A_NORMAL, Screen.COLOUR_BLACK)) def test_max_len(self): """ Check that the max_length setting works as expected. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100]) form.add_layout(layout) # Simple form with a limited length Text field. text = Text(label="Text", name="max_len_text", max_length=4) layout.add_widget(text) form.fix() scene.add_effect(form) scene.reset() # Check it stops accepting text after hitting limit. self.process_keys(form, "123456") form.save() self.assertEqual(form.data["max_len_text"], "1234") def test_clear_widgets(self): """ Check that clear_widgets works as expected. """ screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100], fill_frame=True) form.add_layout(layout) layout.add_widget(Text("Test")) form.fix() scene.add_effect(form) scene.reset() # Check that the frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Test |\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check removing widgets clears Frame and safely resets focus. self.process_mouse(form, [(0, 0, 0)]) layout.clear_widgets() form.fix() self.process_mouse(form, [(0, 0, 0)]) scene.reset() for effect in scene.effects: effect.update(1) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "| |\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check adding another widget now adds it back into the Frame. self.process_mouse(form, [(0, 0, 0)]) layout.add_widget(Text("Another One")) form.fix() self.process_mouse(form, [(0, 0, 0)]) scene.reset() for effect in scene.effects: effect.update(2) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Another One |\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") def test_inline_colours(self): """ Check inline colours work as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) scene.add_effect(form) layout = Layout([100], fill_frame=True) form.add_layout(layout) text_box = TextBox(3, as_string=False, parser=AsciimaticsParser()) layout.add_widget(text_box) listbox = ListBox(2, [("P", 1), ("${9,2}Q", 2), ("R", 3), ("S", 4)], parser=AsciimaticsParser()) layout.add_widget(listbox) mc_list = MultiColumnListBox( Widget.FILL_FRAME, [3, "100%"], [(["1", "\x1B[32m2"], 1)], titles=["A", "\x1B[31mB"], parser=AnsiTerminalParser()) layout.add_widget(mc_list) form.fix() form.reset() # Check that the Asciimatics colour parsing worked. text_box.value = ["A${1}B"] form.update(0) self.assertEqual(canvas.get_from(0, 0), (ord("A"), 7, 1, 6)) self.assertEqual(canvas.get_from(1, 0), (ord("B"), 1, 0, 6)) self.assertEqual(canvas.get_from(0, 3), (ord("P"), 3, 1, 4)) self.assertEqual(canvas.get_from(0, 4), (ord("Q"), 9, 2, 4)) # Check that using ColouredText preserves colour data text_box.value = [ColouredText("B${2}A", AsciimaticsParser())] form.update(0) self.assertEqual(canvas.get_from(0, 0), (ord("B"), 7, 1, 6)) self.assertEqual(canvas.get_from(1, 0), (ord("A"), 2, 0, 6)) # Check that keys work on parsed text. self.process_keys(form, [Screen.KEY_END, "\n1", Screen.KEY_UP, Screen.KEY_END, Screen.KEY_DELETE]) form.update(0) self.assertEqual(canvas.get_from(0, 0), (ord("B"), 7, 1, 6)) self.assertEqual(canvas.get_from(1, 0), (ord("A"), 2, 0, 6)) self.assertEqual(canvas.get_from(2, 0), (ord("1"), 7, 3, 6)) # Check that the Ansi terminal colour parsing worked. self.assertEqual(canvas.get_from(0, 5), (ord("A"), 7, 1, 4)) self.assertEqual(canvas.get_from(3, 5), (ord("B"), 1, 1, 4)) self.assertEqual(canvas.get_from(0, 6), (ord("1"), 3, 1, 4)) self.assertEqual(canvas.get_from(3, 6), (ord("2"), 2, 1, 4)) def test_list_box_options(self): """ Check setting listbox options works as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) listbox = ListBox(2, []) options = [("P", 1), ("Q", 2), ("R", 3), ("S", 4)] listbox.options = options layout.add_widget(listbox) self.assertEqual(listbox.options, options) def test_list_box_color_options(self): """ Check setting listbox options with inline colors works as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=True) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) listbox = ListBox(2, [], parser=AsciimaticsParser()) options = [("P", 1), ("${9,2}Q", 2), ("R", 3), ("${10,3}S", 4)] listbox.options = options layout.add_widget(listbox) color_options = listbox.options self.assertIsInstance(color_options[0][0], ColouredText) self.assertEqual(color_options[0][0].raw_text, options[0][0]) self.assertIsInstance(color_options[1][0], ColouredText) self.assertEqual(color_options[1][0].raw_text, options[1][0]) self.assertIsInstance(color_options[2][0], ColouredText) self.assertEqual(color_options[2][0].raw_text, options[2][0]) self.assertIsInstance(color_options[3][0], ColouredText) self.assertEqual(color_options[3][0].raw_text, options[3][0]) def test_readonly(self): """ Check readonly widgets work as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([100], fill_frame=True) form.add_layout(layout) text_box = TextBox(3, as_string=True, readonly=True) layout.add_widget(text_box) text = Text(readonly=True) layout.add_widget(text) form.fix() scene.add_effect(form) form.reset() # Check that entering text has no effect. text_box.value = "Untouchable" text.value = "You can't touch this..." self.process_keys(form, ["1234\r\n", Screen.KEY_BACK, Screen.KEY_DELETE]) form.save() self.assertEqual(text_box.value, "Untouchable") self.process_keys(form, [Screen.KEY_TAB, "123", Screen.KEY_BACK, Screen.KEY_DELETE]) form.save() self.assertEqual(text.value, "You can't touch this...") # Check property works. self.assertTrue(text.readonly) self.assertTrue(text_box.readonly) text.readonly = False text_box.readonly = False self.assertFalse(text.readonly) self.assertFalse(text_box.readonly) # Check that entering text now has an effect. self.process_keys(form, [Screen.KEY_TAB, "1234\r\n", Screen.KEY_BACK, Screen.KEY_DELETE]) form.save() self.assertEqual(text_box.value, "Untouchable1234\n") self.process_keys(form, [Screen.KEY_TAB, "123", Screen.KEY_BACK, Screen.KEY_DELETE]) form.save() self.assertEqual(text.value, "You can't touch this...12") def test_layout_disable(self): """ Check en/disable on layouts work as expected. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], -1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. form = Frame(canvas, canvas.height, canvas.width, has_border=False, can_scroll=False) layout = Layout([1, 1], fill_frame=True) form.add_layout(layout) for col in range(2): layout.add_widget(Label("A field"), col) layout.add_widget(Text(), col) layout.add_widget(Button("OK", None), col) form.fix() scene.add_effect(form) form.reset() def _assert_disabled(cols): for i, widgets in enumerate(layout._columns): for widget in widgets: self.assertEqual(widget.disabled, i in cols) # Check focus moves away from disabled widgets. self.assertEqual(layout._live_col, 0) self.assertEqual(layout._live_widget, 1) layout.disable([0]) self.assertEqual(layout._live_col, 1) self.assertEqual(layout._live_widget, 1) layout.enable([1]) self.assertEqual(layout._live_col, 1) self.assertEqual(layout._live_widget, 1) # Check that disabling only disables specified columns. for col in range(2): layout.disable([col]) _assert_disabled([col]) layout.enable([col]) _assert_disabled([]) # Check that no parameter disables everything layout.disable() _assert_disabled(range(2)) layout.enable() _assert_disabled([]) def test_widget_labels(self): """ Check various widgets and labels interact correctly. """ # Create a dummy screen. screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) # Create the form we want to test. self.clicked = False def click(): self.clicked = True form = Frame(canvas, canvas.height, canvas.width, has_border=True) layout = Layout([80, 20], fill_frame=True) form.add_layout(layout) layout.add_widget(Button("one", None, label="Buttons")) layout.add_widget(Button("two", click)) listbox = ListBox(1, [("12345678901234567890", 1)], label="List") layout.add_widget(listbox) text = Text(label="Text") layout.add_widget(text) form.fix() scene.add_effect(form) form.reset() # Check widgets are displayed correctly for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|Buttons < one > |\n" + "| < two > O\n" + "|List 12345678901234567890 |\n" + "|Text |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # check specfic bug with Listbox overflow on selection self.process_mouse(form, [(20, 3, MouseEvent.LEFT_CLICK)]) for effect in scene.effects: effect.update(1) self.assertEqual(canvas.get_from(28, 3), (ord("0"), 7, 1, 6)) self.assertEqual(canvas.get_from(29, 3), (ord(" "), 7, 1, 6)) self.assertEqual(canvas.get_from(30, 3), (ord(" "), 7, 1, 6)) self.assertEqual(canvas.get_from(31, 3), (ord(" "), 7, 2, 4)) # Check that clicking just outside the button has no effect. self.process_mouse(form, [(8, 2, MouseEvent.LEFT_CLICK)]) self.process_mouse(form, [(16, 2, MouseEvent.LEFT_CLICK)]) self.assertFalse(self.clicked) # Check that clicking just inside the button works. self.process_mouse(form, [(9, 2, MouseEvent.LEFT_CLICK)]) self.assertTrue(self.clicked) self.clicked = False self.process_mouse(form, [(15, 2, MouseEvent.LEFT_CLICK)]) self.assertTrue(self.clicked) # Check that pressing space on a button works self.clicked = False self.process_keys(form, [" "]) self.assertTrue(self.clicked) def test_button_name1(self): """ Check Button name can be set in the constructor. """ def _on_click(): pass btn = Button("Run", _on_click, name="btn_run") self.assertEqual(btn.name, "btn_run") def test_button_text(self): """ Check Button text can be set as an attribute. """ def _on_click(): pass btn = Button("Before", _on_click) self.assertEqual(btn.text, "Before") btn.text = "After" self.assertEqual(btn.text, "After") def test_label_name1(self): """ Check Label name can be set in the constructor. """ lbl = Label("Winner", name="my_lbl") self.assertEqual(lbl.name, "my_lbl") def test_label_name2(self): """ Check Label can be found by its containing Frame """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = _TestFrame6(canvas) scene.add_effect(form) scene.reset() # Check that the Label is found by its name # by confirming the label's value l = form.find_widget("tf6_lbl") self.assertEqual(l.text, "TstFrm6Lbl") def test_textbox_hide_cursor(self): """ Check hide cursor works as expected. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100]) form.add_layout(layout) textbox = TextBox(4, label="TB") layout.add_widget(textbox) form.fix() scene.add_effect(form) scene.reset() # Check we default to showing the cursor. self.assertFalse(textbox.hide_cursor) # Check that the cursor is hidden when set off. for effect in scene.effects: effect.update(0) self.assertEqual(canvas.get_from(4, 1), (32, Screen.COLOUR_WHITE, Screen.A_REVERSE, Screen.COLOUR_CYAN)) textbox.hide_cursor = True for effect in scene.effects: effect.update(1) self.assertEqual(canvas.get_from(4, 1), (32, Screen.COLOUR_WHITE, Screen.A_BOLD, Screen.COLOUR_CYAN)) def test_textbox_autoscroll(self): """ Check autoscroll works as expected. """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([100]) form.add_layout(layout) textbox = TextBox(4, label="TB") textbox.value = ["Hello", "World", "Full", "Box"] layout.add_widget(textbox) form.fix() scene.add_effect(form) scene.reset() # Check that the frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|TB Hello |\n" + "| World O\n" + "| Full |\n" + "| Box |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that switching off autoscroll will not move line textbox.auto_scroll = False textbox.value = ["Hello", "World", "Full", "Box", "New"] for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|TB Hello |\n" + "| World O\n" + "| Full |\n" + "| Box |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") # Check that turning it back on scrolls to bottom. textbox.auto_scroll = True textbox.value = ["Hello", "World", "Full", "Box", "New"] for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|TB World |\n" + "| Full O\n" + "| Box |\n" + "| New |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") def test_layout_gutters(self): """ Validate that the gutters parameter works for Layouts """ # Now set up the Frame ready for testing screen = MagicMock(spec=Screen, colours=8, unicode_aware=False) scene = Scene([], duration=-1) canvas = Canvas(screen, 10, 40, 0, 0) form = Frame(canvas, canvas.height, canvas.width) layout = Layout([18, 4, 18], gutter=3) form.add_layout(layout) # 0 text = "ABCDEFGHIJKLMNOP" box1 = TextBox(1) box1.value = [text] layout.add_widget(box1, 0) box2 = TextBox(1) box2.value = [text] layout.add_widget(box2, 1) box3 = TextBox(1) box3.value = [text] layout.add_widget(box3, 2) form.fix() scene.add_effect(form) scene.reset() # Check that the frame is rendered correctly. for effect in scene.effects: effect.update(0) self.assert_canvas_equals( canvas, "+--------------------------------------+\n" + "|DEFGHIJKLMNOP OP DEFGHIJKLMNOP |\n" + "| O\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "| |\n" + "+--------------------------------------+\n") if __name__ == '__main__': unittest.main()

CӼ5hrS?p8y«/qa?tw]6)$%! {NsbPGԆ1oX>8@|UM) 6)%-Y~[30}!XE0vA8m[ҝ ml>nSdOjylPZ+t. `^:DF\zp qRE-Ct'KBZ2= { u<#l9P|y5N(p{L](xq|Ʋ̘ +}֬b,j eBk m Mw%an=@sø$j{yrGdFqtxA_mQ=b`fj/6FvN㡘 =RNS #MSB? Tkd*^g2"o^|%tkӫWX&˓=>%z3{6)sk*pT BA䤑! =Z`q9W pw(bg9!kj: : )gˤZ]ZW0L PJ9l:HP"B!1w=e12SjByZ90AU(.xRDSZWCm6 k]&6yR3i#_ۉuʬ%WUV"ڄ{0 ZpA*`cd jF]`JzuF$ Ty9OO?~?99gϞ1@ݼy1M~:?/5n8µxZOЩUYB9{yb @yNE'Bx)DԚs׎;IgKۆq=+*:c3i{AZOXUEPA]Bͯe 6jp.`5Dhw% *{eDnols_ Bf:ES0z)N0#pM Gbetxkghs)A!EiLDz{ ey{=+ja+qy @\;hH2!%@EUda9X:]!DtB.+uӆ[bJ{|iy-f80b W1ƞCm9[v$c1U!q1ER)БfUHqGӍ4/,E!sD䒕k٫ wƖWĐ;U)%t-35ZKAs\ HT A<Zv gDu0*D*Ҥ]#1%;^Z3Q >Kro>)q)r8J /^^IXow{}W~ˮ FaH7>=A#׿O~}N˯>Cjeŋɳg?!GYo&74Ey,q]䔾7缥)pb*'+bNm u<`pCG4蘣K{]xhJO#%'U͉VȃsW"'fO@,$Fz4戸XU+44K_?W,p8`&{`RRhs;7 v6%4c߯yu:Ǘi_̷h r,dO\wMƪu[ѫ3vݽ'os8 S.^AA DM)Yx|y=`5C!|Z"u b%vaI8'i,nD²x{wi0 Vxn dQz6 yǖue&|-of/$ۺox+H!>ČpCL]@7׆\g.h#\iCT0VKz7FCUSJeժxPe},ZSHK2BUZC+5CD. Vi!tOdROmdQ9K*wzh6a-U'P5H183m޼y8Պu [p<p)jӃ4zvk6Ϙˆ+?US_i =w:!q46#yVd#@]ɆJTyǢ0]"AjOpLPs6L>ڍ$eE~FWpiuK Ԭ @XRvEo ׼"ѨMߵxj %`r *0ǀa|`Yg 〴{q@~f` 4ޢl lNy0x@D D@2 0M,6{oEOa@EȬhژIqЉo 1b6ܾUli}ļ5zW ] i:E!щ0mheǽ*N)X,J;,mSQpjқC'*"v"ck-~#(NߗMcݽbMQ~Dvy\Y6ڃ:|Nk˗ϞO>~|3!0s71{"B#r| r|; (8HwMzv{"B݇8afG"{#r/r!ܖQj=̺˾л`L#4"YP7 6{! \.Dc^V8NU*/"b'PKyzWt}߻z;X7l@5wQ{.hǒSzCɣs&!k#:ka 2#b:|}ZdvҚ:̻zeFyUmC޾xj( AQJQfժ]}f~CGʉM)@-72 R4fU^XJm):D;7䌚3e3I8I7l[ƶi.0 d0a& WL{Pr|^.+88?P@oX/Oj4=f%ߍCº6jyݢO6 Phw tY#Ԋ=k6a)ȭ+LiS.$c*m¥'#JW+A@,n[f q1!ŀ%Qɤ O' 4p:1S;\9~# IEJCP1.g)!LTz$ٱ,d m9ҳ}Z;{ ZtPy8D|67lGAQ}7' 6mTB[Nn##B*$vWG2B%f2Z9ůiAӼ:Z%*8|}s5i uT.f.V8J3> l3i7_xYK@~s.M;fu.rGM}VC Jz:HCL𜷼@Y_fj^*ԻiH͞}-Nֶ)Duz Y#prVXՕazs_}B{<|"vt'ŇEZ+HS֞a,ņXTN}4HFcjy]ԧH*nNЩ X:q#րց;5U!.P:WqoZfТ +w&P y*8]eݼOo_jEW?韾uQsbPoR~ QGOO>'O|/ߖo~cۿag_yk#~pJ]ULbC-RR`w0zZzTΑ{˵c89Rfj>GGN`.<HDG9~ V#N iMmm]Й*-<Ȭ`8i6vb~4:%˥˗/qZWsƘMs,NdIc'+y;fw j$\F> ۖ1e©<9B:h?},g _?-w_]A-viI2jR| ?1|/^[9}+ԎUUJ+zkJK6wΣ$n A[2F qU(H^J.07x8NR[G)4|"#;7ADgM><Izq> (@l!t\p9!@kUJ.]vOS-"T}R!pȊt#hxsTNG%Y^+L ]fTi/dtALD8&t58yIe%>9xO(EwBMfv}!r`'@ѿ/2شqW7CiP)W7C/U呤9Iۚf墇K1YDlz! LΥy^R99 iк tK]D"l!bŤ뼡~JT:b0ytM=Gf= Z= w@A޶KIi)&M`MPi&I,;f+Br#g!a]Q {{#F`ix8NcJfe^ab ‚-҅p)U @:evF)1aˤQ r:ink 3`8wV=~uiu'00Wȵ:mś7oj t@*ۊW_ v08M#q{vmW\mJCϧԌVѺz̧~ Nսd>AͶ!UWkLӨ*Zl`qBn\PN5_ Xp1HzlDI5Pgp"j_,VC=JtY PuNI ޺cH @4{mh3uXFjD^;`Z!,8XdN8^!g[e ;A'PNI^4SY{xDΊ bv 0 )0 G&GaWE=$o/ |خJix|FR'Eb=GeJjݖ/ZwZ{ w>&yh"B̎Cx_DcI]1@]rʐ䃏f#EKF.r'[Q!G=CsL7"-ىv|!DxJ-wxJo-eh-D>0抗_TmP2e^c؁Q{l?=(Dஸ` K7-šE9oAПEjԃO/薻ႇn4cI'ZLZ/h8/wzT 6ToP ;YstB"0oz+Ar;p @uukAoU1Ȃ>^2|=\ M95178;͞Vx7&/s1N7!zVUp@:maˋz%YrVim lZ b9|Q2Rf,3J);$x-HS^nxo]af%7fދ?,R\2M >}#5)mj[7?SJ=f|LCS>88q jv,kȲ!E0N~BuCpѫw0ZhC4PMڼm=B^g+'{`YW0+no_x8]%Js-&x~x#*nr՛yIoڤi>uX}SH!kE6 s| (2tWtn<\vWa:7 Y!Ti ^WX0pN3K*l `9v:"1<3uU/tNE~CLLeQkx<ڳMNdnjI IDATU)31ՏW+Y3*Zf1OW8LAe^ljDWV?6g{Wxؿ' Ρ9A>o߼nU *upmRl+ i\t?=PK ]R~m^F,H!2ôGիW xsz+B7+5tjuuC DxxfQ%1 sp"Q8B{w8[wv'憞ЫHC.}u-vwܵGN7xh_?{_?𱚩ߝ'(w+>T.3z?O<|)?Cyyw㣧O#>mO?Ls9ϟ|ԟ}o'yj̓G]zr^mR#zE; KM[璼?7?n{8{"DK#P<;_ٹx Q1EJ 18&Zoib^y D ^2DjB)e <5KF΂ͤn[6 _ \ݠGmz|?[起bJ#tk)"X=:tz@x943| r>T)v9Ԟq^VEp`S\@ .K.*ѣwjK״YFy ٩5z*չfM2 k"À!ZSOR5t#T,yэJP0AM*{)pg8ƉY}B]A һe&@sZ0Mh]'PkD'Էu nҌ]<;,v!!_B{m˲y1Gj١lYՃcr1aa,cK'Nk)vcx+Djþ{D8`+7}ECցeJexJn ;)S{MK@z^U(_jTqaZquu@( !L 4<|G-q w&_sA CZ0N/@37sF4+gr^{֬yYv[R1 X &AiRQ7I&]]w &յv6!Ī`E3ꯒY2w3#2ZR?tyd@V/ frEMԜ)IpkOeOiT ^Āz'0ֺl:9㉱ދ@H=И7טW<-Ңu-Dh r)ZNT9b\{Q Ne]T* my(ĊŭfxJnڐ u]cTLvrѮ40Iܞ0V3@PM౜gHe0wW'}VDO"w[c'|gyh5l'Uߋ!4يi߶u⢜s $F!X 2`*J༇EhtŶn`&xQ7=9ͫe0$$lpŤ,̮t0H|]s[zRhKm ٨[8r_~}?#|&?ﻌ;过;̷zn=ɧSOЧGOO? }ֿ{_?? Ώ09-e nLxt"u,\HE̵}ߟbZ뚆!Xme]0MξE(Gh"}4☣$D#hp"@O(`&vyG`ffZk" f&fBA]@;91(Ƥ ZG1E E ?tJ/Noen˪ j cSNtS7UL)&+YХ_<[DyX`QDұe(8r6< nKg8Q0uaHW_#-A3vOлH.z0I1@s EiB|#*CNd |6Ҽ,v5c5 jRH )%]1j^!q8 ԣ$}jWdm]+~9gĨ]qq<MgŐpuwzô]ּ_"ׯ^Clb@Iϻ4o{ӄk%Zog6=Twt7F`5@ckͼZ.x4bG)@B#`+Njm4V%g:0Bt!z4^ ilHG1PWyRv'9zA.+IMэnp8L)]Nb:cNZCB6v[ <1eT2TR Rw0wO2fb CML+=5!Fn'Bb,%瀝̚Hp .^F3\F dѭfR|‚ \ZnPo"@Trٛ &;-޾y۷<ϗGqt/$SUMb[Ic[iI:m ~pEѢ˲`Y2F DX.D`0F8I/uCv uWZ獃,lզ {^jPq_8&q9_sb DtRr{~636VՃz?F>_w% Fxf^$[mDޔlIػq[>ZCW?ub 3weC8 9 AnZoέVm&z>VU9?o'6GyB~s&'旅woM7!_|?~OW?p/_?_e_I{"s CХwstCܗ޿Z߄Zy0Rʉ -Yn)nn~N%CuN{X2-w" %K%J`fb-"޻xpyP]#AFccf&;).ZRh*:) FЬ{+Wx{FKpΤB4 5T Pb5+Msk)fnS&m*]@Mv.H/)ۃ qCbv0$x0 J. ǡ-[Pۺ*e"VT Zߌv)4akA9/ Z 8 d DB! ۺ Q{< ø )ŝfRpY6eТ)y k=&d`A?cyփwPIHǼ5/E%PךvK騥!ƀtihUmڙL7Ya_~R}N8 m֐7HcD)}}Yl=*ctiAyI}AX뼁6v# sS KF#iG"M &@jGZhZdn+J΀0RuYs Ә0*w)!i!g:i@p3U:=4^ϸ:Nxp9=[kUѨ30/*;!hϔ=4"o,6Fay7!m^ b0H]:NMڎߟ{A5k=0yvDqT {BrIHžG؋cK.zRZR71ӸrIj a!n_~Y~xA)9^x.x iw_]A-~3g?gۖBĶ-֙ N.קkqw{e^/]G&1HT]ud*+l"V*ec^0@]tVBu0%"S9TzU h)ifBi98y0$lLut~FXY-b́bPlcYf}q!5Wa)E-jr$.AKzW1jhm& v21>)\!9e31!hwwlǼ/Gb,8G)F0C#jk8ߟ} 2BǝdM%ht6Z v⌓`]VQ[8M@X!5 2\W^3rşDLJc]02#&HZrQ4=Wk\/O6b-dk1%䮡˖UNUt!P⤴!ƀ S E'˔![4Yg!`:N:ˬUJF%bY b R`INƃE8Ϩ9Çhv`^ 30{mp 4Cƨ0NLK1BcHZKNr&[AH}ԪNd8S:,!E+#zU_rۊlvP*m)&;ڶN']\5BZ@9)J(Tg,bF5EE ѦJp)jN+XH `Y my0P;_Ҙ{Ry>#׵~^Kthh:kn8!]d3urU`D˗$"xRϖ ri(BHU ](V+Vwݩb8q}YvA ȊgjkA5V%&5jUH,&GZUz{/^Ԧ2Jf6:F=՞"6ټw"hRXk#םFhC/H4YTœ*16aB+&&Cږ 1۷@.fBԥjAJ[oc1annH\j}Lr'h.=[\;U¿& &q;_d[p @ߜ~?K P`~6яƑқ]ߖzɧ OѯFC9cH!/1#lR+Er0Vk-"B t?z=O{QjMvO4$`A "} IT_)ڈED*E9@V A'fKIrH T Z`$&S^}c<3N_$ .xL㨺}+ҔJ@ZZ4it`馹χtj{а.մ4r觤ғu(B^n5f$L=h]&ρ |t)扩k/rq.d1m_]{`bb"tDɘѠ>8Ĥa0:SRUE )@CrۆfMvHCR̷7޿â3텘oaDpz7Z2PNԂi.0#i WrXDò|Fm ̸G:w9VkF(LCd~ MyM,鸺0 tas^mok=/IҺ)h:jHQ'-|4$Rjƺ?hNN5](ZkXU.>lZfq]f/1M"u3·SJJv{3&eψ{c]~%˲o8732lG[դLP`!&a@@y <K_9^_*?צ~Q\L777ϡ'v>KyF?#:?{37w1 ܽ=ȧЏ}[!rWvJ7ﵣqsEv6) VJ2x1R[ )9CY˲90)b%Z]ߖCB (iVѐrRhro~5%^BveT!!h34h (PXuA ٕ; D (Eo,=za~Yp:l_}۶wF !Pv@F\xF')φR[ `m_9jVavY9U"[OJjάe[޺X8ȧCۆb CJG79TL<S{n!u }BBLH!k5/'IC-+cVK|#G,4j'GS(}L͚ VnϲVpfd'j$WJWOg{`bˊp ޶nNo X-WV{/nXe/  r3{\6(y! {UQ UH18%0U=Ew)#~ K޾ 0jiFL1f_b>^/DAC )MyTc?7#e6ifpRQjc<~ت%x@f#v@}t`؁lrF? \k>fpuLa?4@Z}Z 1fJoCM {Nt90 ,(ں `,t>$Z0rABگoJ1mqF.0ƹف}erf!+T~)C{JJ IDATZ+%wCi:#ƌ3fql9+}88; ,0e_ F J:sjNɾ42K&:r&+ v ' ΞA](v;BX+ԅ2; @UH*7e$,Re-5nA^PH=W~J~﷟8W@՛߉O@?WZ ٽT/*T/g=S/_ҳ^ 憟zx?#O~=+/_b}MC{ן+ޝ՚T҂zܝb˃zw>w `BIę8R iZk% CDSʹGY(1D[n-k2L̙&'0fMoߦ1F bL[KeRL35&[)ltY ӌ5 fr326[Ֆ-SqEeSzSjEhĵ/6޶j[Vf@%ȾfqBcFg2n m9ZlM0`S^2cb;Szl"nw:R/kˍn-5՘:6ԊZ1|BdTLr5}C_zkVs-P\Jf^-?0=D0PU>s#mGq: ں Vc`% f4B,{-g*H* WoӀu^̮*ʲ$7ˊFP,6<4Zfl ^j5rߋȲmSr_(J7='c\p[65(55`[H<͠J)Dp4+&W:\_?vG`J2¦ڛTTՒ )cGMeGww df MlY5dVs+;߮##ihCo9ܾW2PAtZeJ c?X-XN-9lvӆ.pZ{f9Eh8fX0V*BN8+sVquu*mդٵ朱4-2KF%ۨŞ13$0_D7 N Fݾn*^"$EŸ=)w`$pJJ!5bnA)t۔T± Nk)緟=Mb:S#Zhɳ?|-?oO>@_=}WO> ~|}^A3;!pٟ?ϱ=h1نÛR?}F>{܀{OݏAi?U='cm]wu? gWhOBץY8HKpYq]k2P "bRauPZe3%bP4B,:3Ȍ,5ƐՆBXnp7zbۊkZ(} fb~ eH2{_BI0ׂ_Ç9_,=H ee&RF%Cb눘`<"QɬY`ZJ){h[ZHe؍;d8%\ܥV'r6фijA6؉ ck1Ў򑓑BbpVԭ۬@\YAр/л+]YRJF«) ~@ NF%X|Ygf¸p<]vd ?l۾n0nM}kĨv09Ҧ Xѷ %lk]q:1/*bQ@HF*DkVp8q8PꊷoMö,fvw gm+b80S8GD#޼uK/Y6V |۠gP SkiHd+-FW[`N"bط=%nafkuŘ+r<-N3~1NI`nN]aC}C? kYqB%Ru}W"R@zUb;U{<%wxh QSrB%,Z7@Z *$H}2"ZP /!_Fy-" )䟙i9c'\S1F ehpS *!BO SmQh1 {&*" ay2Z1lT t!(`/ Bz(E"3"1qT ,*L1]wFX}}>j _?A />RG.<×*K'BI|Q%B?O?[ߢ_m!G AE{7>M{J^| _>TWkDIN]I[R[#H)a\*"DtZk] H֠,8J1e ! CkR1+"D*!=3&9jU" BJ9͏LtQ6[c-:|O /om` n*b]V|zwt>#9n~u u,dt;C.i´-`?Hu9!ň!K CZ])D([6v8O^Tqûg1EFSKC׃HsƸ߹3A:R`PkC ٔU2z]d&3Yn[Lf3rq{S=JՐ"v:f;oXo'yߙ9f .`Ҍ[A,Gju%BNdlt(R*AlLN^T^؂CB{-QB`Ra'ö>&2&:8?Ds^P Ze U sq9$w;0!qbB5lVW"du"klƀҊevi^W+ ˵ uj)]DF\X7`]˺"2s7%ޢ6s,=76ҼxWoJk)R,e bd;5kƉ!"&{mjM4\1 #8j1R"P1a?^v+ԆV+'?Xaܞ1 df! 5(}V D 0صR%\$۵۵ᾮ,Ԧr>ʲ&^"D4^cK 8 kj!R! 6UUԾy'>s3S}|(~ovQۿ7x8ןk/ֿ|k_CwG\?$xzиG=D?݁ SjZր5 5"k`#R$LRǞT3Puʔ)1=֔"$)Ҥ*H._syY:*4ن5;lѺ,Ѭ6W5z5J! :٦ُQ,0QlbʝYJat>a;drҬ*=,K35FTANg+63W6!"$ F6C 8݀n7[/-LTpl!8eZ,ZJx4XHSb`σ^`HU*JvC>Lj.3O 4 }ey!$۰A-  iㄦ }skJ< 3S F](=8|0Nx{9>f`<)^>rN?Z;.YQa67R>#u-vdeE )03,Z:M(ˊ~0@-OZWKVhԵbe1S,Dz~9xZJh4j6J ju&$\ zj`Smu `Xf"PjCUxlϣ UU +44'Tt̊W軭5RwW5&jm#|gUB|>Y_^YwQHxa  Ag/0e``-)k1 e#yNP>mIňW ڳ\{$ܿ!ﱫr Dn5K*%{3-4 9K> "vܾVɗ =u]]Ab[W-)Zj1uo-(!OPeU) B~gpnEdOʖĖ6@eeܴ]8 [X@N{ERTP*iHTU q@)a" s1.EֲRޭ0tUJ6_oHK(s&yc __?6 ~zAdڋ>2=#}ys^z? /Ҁmssol/?%O翺Ƿg=_إ\}7R?YOJH̡NCKںHw3EI)Vɩ8JC`ԥ߫3@-M#0.LB8*7)TT$rB 8K 5B!rhT^jN!5zWpQl4\]]xu}3tT-5K\ua(9Z0`[!L*(KeL)VvdĘpwxtlj.ܸSb`|갖-,C'\QbSn4t.";}-:c*UUy-@wlHCLE=`WIj'tۑ]PFفP+ВA8-lA)Yh^+ڰgNȾ7(\\.ap<8`gl6bA Y#(|)?+8'r 2e-8΀+f[l^f,ZҚU*NX/Ͳ&n7[}yqhD{QVjQQyȜBVE@`645**l`z3Cg*jo#Z\f+dφu]2sŞųKֲ|z:at+gF蝱ŇV,Kw.GPq:!pѥ7Xۛ?9\z@A󭞥Z@?"C`-ơG ŠTXd ]gV=f݋=bGv𙱜'19p-匮m}-)K65X[+ܱCF9DV$=ޭJ-Kb`U`c<*M[UBc:Ah r̗3ɐ hf-5;//#Vd(9Z @ rd}}sWF"=v~q''O/C;|m>^3a_@xB wzea777s&~mVxϞ4n-Ɯԩ6BH[Gkh%K ܁Cǯ"gRs#1a!8(t*P Lq`T4<#CjmJDDT1&&֐rGQL gjNm\C QQzO9] ۷ WΆ<ֲV#ܩ#Z}݁i, l:u"v*UsTc&HUXVr%p=0bBf)P7;2J H%&3mDJ>EL-cEtG٪6=(*u b'5<ڲLHپRC&b խ: f+qf 6Szz])Ŝs?O!B`PC[aXv-Xe]ףiX.`s}Ňӆqtp^̂|JV &wWh~?`܏ez]foQʂ~6sދ:lÇ__w6XĈn2,9"%1$.V!b7JTDz2X }כ)m-`ȶh@`*4˭I ڀꃌ M-EpC~vK~k`esQBgTԂabj=QY7[%j;V7rHÜʀ]>䊪,Z=pNA{RPU9RnTYlP,!KH*ZUp?@jYg4QՇy^lt//TY[@G֑KHǺ.s$B:`ń}~e=jԔ*#~jRRrFd4ȹǖEfB[^T(İj[&$7HEIHIBҜrOk`.VS?oo1FH5_`[pn.%Ր*V@Ѫ Za`֐wYv)XzaEɺ9}y0M0=49b>u(uXquuuQf1 R6fʦ hk WH9c?0͓Qk:Cdڡ_cY Jix XA`pa7"}RGw"ň"˼ZJUk/Vgx+1 v`f㈜ :Bg9f1%Y}&Vm 3Ɔߍ#i)[$ouzw7S> xF藯/2ί?9>ǻBg77S?_Tx 'O~Ozzsÿ__߅W飧Oߐ"wU-XeY13Χu:/h8g -JU1Z9 rDK=Q^ARIlM0zZZ^KYZĠž>l%rp'j* ;426Ca17.EKF,Če Cg fa )mkj=rNdHf+Ͱ VBCzg@|]¼)U À+tw=vц#4dqհre2C9,Yߛ4=lBTiP1A[Rp.a7~ޠ9_SSDd*g 9#焔 m90=ft]1&<~+\__cߣ`JVMy؈mbȋ-'8Mkd9 `o@6VxQtZD1xj]mz+1h{ZkU25y^'PayрSi;|oVeٽƆ`ԭv# rfe 뱅9A䰗 U'n[<1l/0?yqUW-\Li$Ц^uɕpXUš),VcYrqCmg ~Ct[;%˝R̕<[x!uX,!VDѪR@'5/c`xdisΨx:Śi] \.R%qZ/ݰKՔ%mV͘..λ x˦jyE5,.//@YJ1BdB 4ESJ ZZ=ֲdӈ~oCR>J0WN|gG7ڏo >~!^0OM|}}9^H>?K|~m_cކG2)a{toͦ[&2znhwFl2Z ߍ~mCúΘ}!iRfL yzGt{F `ZSPT! rt*rg8JgjmDd&6mLpußxx`:~* lu%KlиZ :`FD Uz&#)rƣޣ1X 49ݯԂlndZ+pΗ.32f`"|;$rfN9ݟSmip@@eĦňqA.+`~oCZQ 8#`_Y ц:\! +m6tx|PJk*F$ޖ1zyYP~7fmfpuuGu=0=<| ^QnM}YU_0O> CJ,famʼnwwF\I4uCnb`y7k -NLe2u]}icvz EKBFB&N>Wޑ?m2r"pnu/" .KMulM{Qϻ)M7gD|#ϛ/ՉF܄—kv/ r Ihc[&} 4-i+KLf ѯ#º.h2v3j+Buk{VA Q7"fSJUfd[ngn}yq{w3R|>-,K'bm{j< b>|pkKYҍRP~3Sq@Nٖ-DX9D{~"0M7PlYg1 f٬\6oWkky2ESa`vf ~ 1!~nnhd[VUbܹRUB b*&麖e/ N@:-RϕUkݿھ {ū~#?L׿KOP"<]3Qa+<MO77Lϟ[?~]-Wwo>K%뮣nOjk~<,rZ TJݰLS10宨܏hK9\[QJ,OR"PU"H؛bDsd7(VND`VR& kkBa]Ăy6xߌ RV-ddm{uuyxNl;{wy/pMdN֕forƲ D+Z* E  ۦֵ@AsɆQhr-X2'a MŌ1Zj6\Cu젧$6l;둣FTU(a/ïhz5,*t~g#&;4B.ڟMbڣa?Eۏ̸5YVdCȔvZF! e uEj˼,ljOt)!òsGX} ^f #޻fO bN)cc^ɆIkCbu|>":[KAяV2=OfU/g?uAkbEd5YjV@x($wn˝0M+GP\RLįl x Lg?F d`v6w9#'<LU@ u]{֨ F"q6Amhm)eauTmѮטm)!Bv _}pa;̶bh}M{#UAa+/l]Ӳ:[ +lD2,Yk1x-(H:H )UaSY1  H^mi35N"=9HLNer;q@"bN3BUNٲe)὇ATqR0:/ nܹŽ!ªZknq1?yo߼.X7o!A`N h8N+P!wxf sYb&0;Ean7tGaDbw6Mb"Srl}lޖ>-3o׶+;Ƙs/_2,,81P'$PPViIGH6q+$ H& $@i$6lH"{{=c.#Ĉ.*$޻^{9L\$a)in1#eh gkj"[Q֍1E)Qf/ jbGN )p˲b qB (fP_'Zo>E.6;̫KaZAAFݰJ%Hnܫ5Fuo rچ]L!2MBm^Vom}@MP ~o] 4˚{?H|Q`rDsqVk _;89z-dW.z>OzBT"< V4 eiB, 5R"em_cjdNYD`.@|iuF7m#%/t>3R4,v8wm(pMpYX&S^7 ]RQ~Mפ?=@b++JX4 ṘG)@*7vg!xlGiL ݝ)^{מMΩm, imYpg3`pӄ=s /jm1N#(Z}jgfP+3i*ewu+ѽ>g;N=˺aoxnU1(U=p $04+460F$hl\.wlOc@v)OBwd 3)O_OΗ qBmT`ci;j!"#ӈ4D/p7!ƤTP{E!:RpuF+e6g=nET;o"DnaN~110|0J k!ʻUEsq1C ar:&g 66@ëҞpO8 Ĉ!3WP&PLkqDJl??wo7g;o>k~om]Տ;??i|gG~{/->KR1+-O,rypg䡕-өZKZ!S }lJiBAtր)4ڋ%D"1 rALCp 1>@AC(" D y\rs'A lus\9Yx4zflP)cΘ}ڻIdռ(eUGviA"g/@8($ĘQGD+( Nk؋_lBPm$a2KE< =p^*=Q=_G)ܼd7q9 쐓pj+(ÅP$⽷qon.2 IDATݿe n!a!/g?<7\cN#)C:c谛; #yPhɡ8`F 9a9A`$gy)8?q$"Qɽ58د OH=P K)%E7BL֏kH{&̛XkA1`w]z< XbsA=Kz^`5 8O0Y>5@vecPj+t%VY$vsu87-zIy$Ap4ߎ_p΂^!/Pr8~eV !4M!AaYͽkuLoq/'&̾uLU$|K2w'/w`Z.oB[ x[zxÂ_{:e6BJSj|kz M.zr"bv}zXo?ww46Б_M;)˜^ȉ4(dUV^F4 դgvoE!z AC 0JR Z)Rͬc̩}ͧZ1M^7eeȂu[4Z9%n[Ezk~vQ)ֽjׅO?) 4BC@ l]UQB>;- ޽S83ѫ{Zau(ߨ7<>$12x^V #]"uY1ւ>! aэл6<@F[Z0 NE0/(ۆyY8N,@zÐ82~kwwhT 9ck\)^|OnbT_G(Tc/G8 'ѥfJ( hZHY5wҰE1wDQ:ًNSWkE {!a>1c]VfƄ wiaַoi/7m?7 Uxh??а.=|E{uKJ>Ѧ˛1sBKT;Rw)Jb2wq[[ɸ"ҙR߭uS)ƓQ(LZo)f!$ :D5uH=_\B ZQ 9A4 l՛0Ŋ/Pf`HA,Lu !HWBC( ΍RxW.ԋ8 h.20"T[8 yU,T&ؖ Jww V1qěo/wX0va6H uWò,x A7JT (9[zePJc 涉w{8gezTF) 2#J>nVy "4 7W4c,.e^+.\Wv%F< u+Ȟե#CcSv$zGNOӈR+P[px YxC $ઁNa8+QKCJ/^DJoQtԊ8i>Ѯ Rk9wap-)za]eؒG!3ZǺn(ۆ8dېָ1ۊ6 Vm1)JBAALM݈hR¼^͠U:.3&tnۂ۶3W<=?"x7=>BN 9xxq;rCo)s vracU <@2YcՀGD pw[D׊9f;ubp8N' | 8!iw-iqSmNi绮+yE!=)6u/?h yY^O)|+4+wp+qpQe; a.[9n>?ـ P5"(AF mF0\Mi+8qkʔ'׾aP\+i) nrw:c*{-bbk&z$$m:Mkvrq/0flCHW_}&)7'Czj6u!'0/8LzL7jS\ !P鲕Y L譋'{ OZ{ò,,hK41U(G s >5.~ 8@@"@JٰW?Raa`Һy<5eLOGi Hm& }]Xh2W< :T1Lt@AA{,A`SzjAeK[4Yq{Z$Z_O? |-MAs3Mu~ g~n`&?^ ?O ׫=5hoNTWe)V~:'}t}p;pl5[Z޵_ GՔZ ab<)"a:j@f/ÝbR#K!eEMMD@ APSQiQ1 6*̶U!RYD#UӐ h(B'L;=%& R{9av !(`mZ!%HPÀl[4RB  ɬ]hеZPf EԳ $  4P+eY)a; ĉdbv67J9r\Iް.V1.1֪P;DIҹgaDЀo[x^1nX;ק'/ԶgE 1¸" m[q:cA Tm ˶PM23u\[""s}n3dr&M\1 qi۱wo*>ޘe NjHs5Uq+/QCTd͐`Z#@ve֙۬- 333ulЏ?~? 边e^?^`?Iz?}(R}Sx4{n9|,~鼵^ru|l5x>lYC ERZOOݚ!ӹ3+ljcqi^Kݢ")jE!W~Ei3I{GjtdHU!n=&t0A(v1&Ĉ5"!ZC;Aiޖ{3:8z+ ÜkND2M7,SZ ƍgؑXVq.xۈQ1M!?Ǽ"'e+.W-΃o{IOA*P`h.isNDmBbÁRouBDuOTV6nH)6Pv?c HaD^x+ܻЀ [HLqO轢6E pSkAFʶ;Nyx0CG,ib]gX LՂ/>֫KhVv:gEJnQ$톭x||EB]V+*QQBp`]l:R ΐ'J;P+7.WPUʕKe!VZEw;`~$P{ drHAU0\ͲՂ{#c^m?{KX< ACfa~W?#LGuKOb3aLHuy136aŋ,*l 7xZ8Arp*v]q'V'rHLN\a'>+ V,{-{AE4gI鶱auGJ1tm@gq>Q86[mLy)|N%φiyUzt=@Z`M m9 r1+X2rL?Gvl͛Y:ra>DYönHJ*.|]k^vl){ToM! {DCD/;ǧ'Đ\`7ƛo/a uCۊ QŸǀ)#TZN틇t3+TT>v᧟ 9>|93 0a#F#ʆGLy@-j7 ʐKnl w'O>[><9e4lZIj).}˼pdWԲ?R! L !ϲuYACL3:zih:6D̄ A$JMlSv-Z?eЛ`F[ }}~|k9R\2o2*ߗ~}??_~zK߾$[gk}蛙ԖC87bMbo-yki}:ŵ.ҥoyJA84XCpZ#V;QQQ , ZggK*֌֑4ވ%h#FֺvP w X8ܼ3A=pڪO*C`QY`8:08(^=3NkZjQ(ft9{`]X)#q)4l1XL&FL3)r8MOCʼn8` RdNb_h4rwA 30yi!iQ>37+a̞G(~kiEm+,jEإJʓ` {̻+qHDFas3.w桸9d$8T"48_Έ9b<ߞI 4tPȩ<.Bw G4MaS %:Z辦V N}0u(eEEkաR[޻ەVHXƌs=VoU¯9Ea /\*%q^]6(ܜ"e{1$^ c7̷:^@CbJ0 W4`: DPA\vn$_:5qd^|9#DzuoB ۺ })#(۶`]6Rڀ]&RkK=79 Pə"&kc9;0&{v$m>?z=|GC?SS󛿉O$¯JO=ÝU_O/!?O([;aZ3أuYܶZ՚"BzAbvWߺzTՊ5gA ]cmQU5f*[.PEҘTI "ʅެ7"UMBZͻ\bBp`&QIKݷDP@%nGwx'rN8-"ZY+^T'ީrʶn _=26k$* ucAki<<7v\sp[;P*%3<_,>@W60tDitA#z1M(a`<9:赢׆m{$0 8]H [~3Vq:SUⶬjeg 1@rb3G+n+e)-R[80iD={ᆆ2n+…Ԡ@N !#8fL1]LL IDAT751q=8=GRX haw3N~_S8rAk؜~vW>}yhAFDQʶRij']|N?|x ;u;cVk pI.8un àNyb-Qr_gJ#}_{;|ܶ ۼ s;ΜlA0#zkДI:yjoP1')\1LC Ge<T 4#h wp'(0 #+ AaxH)$!T>ym+[EkOϸf㹤s5 8{xC^\SPcyRm@`qi:S~##eE6TY]#ވM!r9ğ{GV聎A(!>(-Sok G*(?f"7A@o)!)Nm[ʹ GVmv`s@%MBa1ACBH4)DDD$ť+vPf)'Lbj^kTM?s)^Hw{nwKy0MuՐߐ/30,ڤL/ֻ޺J.q^BVb1-Ŗy V1-[bkROȶ: ZX^j] 0 u+֥VŚtQf(:x Y%&\% "b֭fAtcg- P/{7;#n9a4/|qČnd; >Į`eǜuDexB㿹4'9ܓOURx&7٥n ewیӼ r"HD܇`qcɢr[W,Ҭxx.O|1_$B/l~PbăJ4q`Njꓗ#uS=3V0Nٽ?""\Ng'3 r8|:9:ƀLl|LTr8=p;_`v(Nym6Kk11ŽvcqYA,v3\چVq(WK ׾WM ZʩV?yh]g Cӽѝ2Z pbj=v'!EoG tuT ɵա"&{"DP0/Z(#UN'>9䘢 U5T~d p'Ṭas#2J͛&P @eo"="eY^u&ܦD0U1*_j'2DfLaNDu<{~!oy* 9P¡~82Kc<&:ڥ؁P=0& 1ghH$| ,R0IQ4DH]Df3[zoDH,OG[_Ij?G]Ko:%@wIe@WUjU|)R1\ޖ卮U on/qٸ|ZޝsYnɮ[<[=Zjm^t ڲ5mقYKTjs"2K﵄eо9 muԀ޷ڷ9ؑ`f`B{.SS wX^кYk͢&gw9DYx!f}M7a۱ȖCaC1 @y!, 2*s:ra'H`zЌ:K3wR6wËLP0'z kSB@w_AJ}m1~VØ'@^  vw Tϛk"} :: u0~r)>}}V!SUQ 7 -Zq`1Sx 1:2GaOV  U([~T l[E3ㅾnn3pl|) 3~VR zQkC^.muo.3SǴ|Wl[ta!3#I$<0 -(ecVZTO[Gg,廽wNnɆD{N/C)4ag(.i[穥0MC¬Q4 À?Hj!%J3wm [n "okw#fՊ*Ð Y:ZJ{xQH# !hÐ|l[6QP׆˙Ϩ !Qν- bCBJ4nP0NPNM%!Tz=A^gmUzPYy-kzinlx$oNTjRm@XWQK YxZpAB;ducCh[n\s!xrLNg,jYhB8 r~#xOIQ}7pwu/13ܠQ31fLqDc0矣Նa?߮ȌmS~Nsf3ԂH ygU2MX5 Q/ _G3* I]#Fm::8GSXi##1WM$X_uQR*zT4ӓ4"ӈ TKxcS9Ǻb88t? f݋|E΄}p$7WXe0"Ikߛ{5 3ya.BmȆ+ nI]L[Ky[۫jkk wKt2x8{qz;M}fB?w?ľ'O~W?]5!Rbk dUbHAUu)$nLCTe[ku)o$ܙS8ALDÐ{ΠX.ޔS}"d.>`F@vGag*mE;f| afً8M'9̐a\)yNA=B‹CFߏn;JeQ|<;,€|# |vi.ؖ4yAی|)}*+'P2^cekvu}@\ wvxHOօEorl z5|9}ްnţR. |:ӽK6˺2O! v"%QQyA;Χ N!b3U`xP29:޷e$EN5(_xq?뺮!`'ӈ8OGhuÁ!D4rr9r>/|/ xyqpN8NXzCo٥w9~|C#WfX5eN35(NCN8/&e"?f *]!07"xsMJ ^m](.gjv>ɾNH#sע[n҇?'M𺯳0QU8=|rr<_(<4 >f煅Yxz|:5W?!P$ђl*S9t>l$ . g̷u9"87$ǚ+:()#湥#%֕Y}||ƶ9lj%[3Mܥ_{mq kO_ZشKm~}?Gҝ9A;BT6ƑXf0 Sh_DbfW[`]'TѬ H1!fd]_3e[ݽAUTUa"ĚTvmv}c4[VZYƵ]DO);3:ӯӻ~i˿?{^}?~gB}YGo/o Ů_u|}~?OU} GE)ŵ. &B~&y< =b+jo}5ZMZdt\K\^X^i4 Cam FCBw[:Ґ5hP0cDTZ]kU "Z@34֪unĸ3^uZF@/]x ,p䳙ue! y1ݶ}B)\cA(a$,ƻb p-a9{4 hhn>0u1[.%;cvI nؾYHrXY] ycmн@l*1`F8BTDИfm)ҶPjAJRC qW~!l_8YDz˯p ZGWvk1F'c>7),p?b̸|#=fʹR 0nh7N+&cm~I)C@ζ̷+Jȑ/tƐb$Nʎ 4ALt3s9~K.I 9ѿjsT!P4A=Rwjtr_>! A LdYsk\r= i<oxq1#Η NӉS$嚁sk܋pVSƘ(wE7n(5Aw"!<,y I{OG%R0R< E6R(97N 6sI%~C9%;2p NvFXş1|Y bޡ5ś`D{Q``Y= 9 ;0`umXO%ֶ4ssq̤lD lTKenӢCݍvInep hv*+LJ2I""F9{Ӎ9uXBĖ ^ks1̸hE[|FAR0^9@~=Yy%=j΋`Sj68`5a1*QmbϽ4 ,ؗUUlZ&U;Z.Кs;(l^U9O6fVR*s2gU vZ#B!ڽ! q)8Z^_*H{Blpmll[̂R+[&?r /Td(B?:t5Rɡby\fPtW#&BJ5J[ZKeny]KkKC{)iDg~«#ܔgٟ={wٳg?#3o׫ Ю/ />?gKz#\=9:I&iƶඃvyYi, G:M p\*|\ޟO  &8bDV 9wdZQ" iرk ,[^$Vi$D@"B S*be1Zwkݤ炪ϱY'}Դ܂Ԓv6B 5!k~Zq@)YfdPfxVxK+ELm`̌8!&i<* {ND˼{=$ )Vv>w`p&q< = f<:FE R:^iJjIm[YکMQߐq\\QP(fS1If.-@0 iciuȴѲn!&jDj0i˗;Y|ǣ*4ta@q3#!F6 @Tnђ@3E)LA0 zК"N0 ^,Y1X#/\4c E7Za6b6ViJZPԦYrƲjUZVLt^TLݫ!ZB(V/En!U'A qRnCi>hfڰ`j>Qd@T)}bevuO~>yˠny>cpT?[vQ6H >z˫Ǡ ۚeal tq6`ҵJ%G0I $J [ίjV1smCJ2 ömZn~g,;ov6?'O1=7+oR)sGB._ W%z=o{0\pf[ȧ}zesO~ P.u PꖇV>h/h эt7D +:WfFmz/HOBV"ةrsw{Frs`BBHHv4!+6{S1u (֊yѤ!=i6n[=Fs)o%c+yWD`jj*\X)FY5Ӥ@TiVXDz5ws9:Z2 +o:0|21p8hMIJmj&݉4lۆeF Ä`1E8pՂmZAb {DL4B)!GEpV6Z^.3ֲbkfeBJþ1'J /R,Aqc]g,+nN']Xfm.hU!,.F【cQٛBTJ\!`S\/W̳*U,UtYbu[R2t0xqw{]NR*ʶYV+Z]r%ggL0 .92k"lD4ѺSiQT-1+4hgP[:)/k]DDoYVZͺ@*0( UBMWKEіlzMẙ6g].P SCM/7e`EbUf-keL]j@k7'|O>DaN-Bp6,yсEFUZ^f͔l28ܨuyJc!&w8jŨڢpy IDATA1N>1;SҠ1F$W32^cHS֌4^b)"+rH˼WE1Ҙtyzo>ooop89Ʋx'bWO7,ˌ\6\QtXgkǖ.e]TglŖ.Ǜ]>z5j+PV>cBK$l r`ɹ@}lĮHOMpmRWV)- TqZa!ZupruϞ= ?/ =ݿ~~+O?x}ʇ_d'4J???x,O?m~ᣏwwj+{}5~_{>G{$^--ctxdUZuE45sl۷|x,1JLDMǫԇעw+Sɵ1z" pՊDFk>zT%0J\78OX ݴ:fŰF@Q/!wZj&;˻Ywj5q֛Z3uv Åvd-Rc8Nxsso>}ۛǨ]ZlcV 4QͽJwmۦ6=˲zeE7UɦOW2VW5%.-pqPJŲ 'j=JacV, ff|*`|i0NZ)a"shdZ1!Y%- f8O?È0p0&bP4pr=cg\9Η u5%Լ URP5x<"x|qQQ_i \2qaʤˍ-o6V!)-w@.0vKֱ׽[ֲ 1gz) S(ZZi$VԼb0XPmjpRk>RRY/]MvAY/f}(ɪ{m¢]=Qa,eJOv-Y3={YAkoqԃg9]y%^dsT;w {ޡi@81I J2f.w8ήxo>¾4H6|@}F^9u2[vGgۧuP[gc= x܃AGoJ.bCLaJS:[OIg?d3MY,[dG?س 8 z]0:Y7E&`q3P5:yN-m}KPj|q_Lcr$&1 kሠZsâǣ0q_1ƨabH+8N/T\ΙKtz{]GF𵋼zy~~uq?O?@0w~}5~_"Bx}w_<wolT?v$ Pu<(W5 灋s)\|r.P9 [\V'Zsi8x¶\Q؇n.#iH䜻kҚ4&ޅ$`̂ ĜA@9fU4g:`ǦػBtO8hnlցH-G\m2gk_@{,slPH Jϊ^ 9{cZD KUeIKمPyqyY4dS-jh vxATD}ᷫ| ܫH6f0 J ^$qR2Yyà 8io 3uvs2S[u 6m[=cH [ցI9qA,qX,h'@(}U횝 8!Zt *] DjdVq1NNNe-nnnƲ, Vx5$7C,kF vͭid%6p N{038JUݜUc}Z:߫1y* QD-|jJs˼gS,֤s}ְ\]1b>5?خ;68{XFyɝ:]JF%P<Ϫ8zg!nzw[lԪ#P5~^Ȭ=m]bHEO> 43Zi vdz5jt2SI[$?COB1Bz<1\Ed [7{CE}<}糌ȟ'OprG?jj {={ } Gۿ|+珩]ƙ;C^2:^R`! 膺q. "'}H̎E@ޓg}nzTN3q :{RmsdPU4P̪'M:+α&cRٷ+U:,s+uЃCy]V:BX#L! P݊a63)[``O- et8"/ Z;.F7:͕;2nn/F! pexaw}ulIQL`w{!Pe\4={?x{[Wb94$h[A! )`pu]q!`]gSנy 6 9Pk#FkŲ+nŬf}5#עEfEBB TEEM@  +&hvW?$OZ4<>3 1u{. ۡ*B m`ﱬf`ymyAG]kUYD:8u/ jKjDeiT {s)JgC`i $cGL/MVlO"T)"#H#娝smq`Ѧ(0=ZK4ZfA C#BLJ/ӊfhII=']Nh_"  b!Pc@dDpL1V@fH*N nEJ%H!e6 nJoW?a{.gH/^#~8uW/'=㷎GŻ__.Ʒ=:os}o?)gpp\ׄ:F<63 KJe_y-xJч)ȉ):xḴ9Bkq-yCzT""b78x&|p΅&";'ĔRJ;ǞV1g:_MĆp> R6<,sX'̞%@-z\`+ŕ ެNۆRt_L=y)J^ΚL= f3~<*sA찮 U˪붙(*YOImk%g̡9j-JEJ$S߶}+hM;y101 mMlvUVni> INMuBa_xoZp˼ /+Η3:guYBjCzv H|],YI\/r1T]e'j"/y2l, {{LU;-9B:Q;JiҀQC庮:JcÛhhxB<7;XA^UB9v#oXƶ-VتrC"6l;5gl1д qQʶw:uZLeE5#U-ywl`cT"um-x12x p9#H[FbſiH;_(J !hN)$p<u3Žoj,̊- o*0;#VpAdk}_ZyäY-SsazSH[[p:\?Cj4 L8ÝXpm!P`2 av6 V"*Q4brYY@6ٔTZCEB4r͏`r@vFYyި[t! )M%A'C !T|~W|߼||A~?2-ׯ/'";-xg9[{\r}BNQŗEuܼLյZ2rhmN"o6D! ~Cuշcr"Χtم;&wH ^'p7 bDsVm!nBA{ ϵث:;=TG,,@˳a2Mm7ޙͧ熚t¹n"ܻ|{9`3l5=hyU 626Zgaiol!6l`]g<Ϟ}q`@to)sm]R᠁vk?))%h)Udۣj3ЌBΫ^nە=om߬h*gC bȤISɶ:_jŴ[niJ[9oxxϟW/X4SXJ <_gT>V! ap<AKԧQיOb/ ꯭j7!!퇽qjmrm;Cr|>Å/SăosQhb6;4uYպ;psIIQ!("~G'-&nE=b {gZf&%Ңè6O񄛛[ i^E,6(vPsgUQ ҃*7D)fYW H!!u^ !c|1W:yƶS۟^ t8` [^1TJALp5{QrU:neHYm;C!@HU*|Fl:b5Mو P% t,}}e'OfzSJV1avJd::*"snS#1XO4(H*UqaB4AYϜO󼃸D/vyu%RMLjB;0՚s6KVäZfO}}Uä=tI#&DrΩ=*t {ہ7 Q3;F5sNkP~BЮfCcuuX眽?WdWY'BS5Y .@DA<*XZTZ%;&Qi&J ]$giW"r#=k]3$Kƀ__0ߐ~~“'=~@7__s~M6QWB Cn, IDATOsEB`'F(BccSB|K! h9,Dl!^\WnyӃyLj,*AZSV4,^j `t^u qdh5Ʃ-k.@j* j|ܳNZrp|!8Oضv,@s(c+z0#s|JE@u-˿Gxo# `f) %˗ϰd逯z(vFcrtKR- iwwU'ZCVh){{"-It^AUZÙgk R:Ю+Und;\V1/eCEE0 4!f,ی= ^|#L#P˲i齕FrZ= )bfT08OA8OyNmP fwmuZQ7z {aBPsߩuw.FAff-e3D{kq<!@rqzNQc)PJhMpjʢ }Xd͹@!˂ 2֫ک87^{bpCFqstDF0hmV0+p{(`[\q~h,"Z;3G([J`,jzߨeC JYњ|kܕR2RyC+Η P<ְ抚7P0mX$ARm˲0na[{MP!8UZKP $9cXsS˒ h0UĬ R7˼آN+FjSk' V a74E(3=kɸ}֠J'ȊU%yCOgΕOlǣl=9KHrl)RUM#vJ&>da .:܌#aK a..HP{R"h] 0 iR6үz pC-Wչ UL:WۖCo8v8r9gO~W/H} |~iExw}@_ _x}~_>;6}4?Ig432掛< 5I|C|#̗:O4O>?y0͓NXc<#OׇŇ@(Uqi<Ń2 @L1N"-73ȹ1c7ID0֪DX,I3r3 :"F˶#VN)C!xԝc8ub"۲M=U8B y'µZw}>d#S]sv Zn'%Nv{# M)D;lY#Jw[,?{g=Q1ED0)UtsϼNhj.TӍh˶, u|! j`ι} t*C10*nem6t9';&1`AiBTzxYǍU5b<;nb)hneq~x??LF!q81#BT+Q节 غ`U,8"͡D?8׳K"!ЌX4; UEC׆<زn7pVa!.^z"ƾм2_}!%Q!>޻=g֊}U KV^.WZ,SXw9qpwyHBjF(\PB=Ea傇WXWηm㈔"eݯ>XPv/!z`:jT ߐaWWy]-3] 9U͍`S25ϲM=܌H`ЩHrޣWm,@5+Byv!Ae믤nծj R eƚ$RΫhDz ߗ% uYp>in0!QU%{rFyz.gUSjMO+B\vՊքX@z>'eZ%]nk$W&f-,~y6Nm U6cHj=߯]ϸg`0օGj+-l9(ֽ3wTpݞw=jN}}AAs)t?Bӌݪ %u-HW.٣ҏôѰepm2 U碪/Tr0?[:&DNĵF @#*D$hMZp I\gRdeHv^h.@׭xfq>S;>9?{/t s}gx;oo}߳O?>|MHwܛo~oM߻Wޡ׾{# $NK6ppIjI3bDǟ C?<^-<78 !|'?SL)S>40Sj*9xLngǣwᎈYB~dGv.2֪s5#1sɥsNsb @w>lm͋MMZvԶ,vPb>ځ)ESK|ƲfQ mՃJu=WޘMJ >ѭ$gI Ynj;`P5kJLp!-~r{:0MHNdVS =5`]W\po:ϻ}QvŞtU2]mn1']a4ʆWxU+ՎCg :&=Wxߘ[) BŘ9Q) .- " BBH!.hUjkT}prb9jnŻ-+!bۆU{VN'Q>"GLa,!M, e"hs1<- Flπ"iĨwلni 3;鬣yA.YAm{X79áwKARV^]852&i=cT Ki4ր< Vn/}U Vm,èq}LW“0=k 7{- Q;f`MKV(aљr\fu3rU<$`b'k6Y43 8wEe r>є2j3rd]]E'TچYDp4J(;iåbYkaѺt5Jik Dg_q>]FAvFLs`˼ٶzQk|KC%cT[4$cqH85:hdU7x- ㈻'wx nnnx<@HJKEt: :U0V]5ˌ8a24`gg?)9)"V8 G†h͋yי'm !0XEM9R+r^ʇSȶ *'oZK;krP`&֊VS؆="Ôj-S֤wM E /^rr:O@ZIr<_pنN{&f<\θ\/U8ӧÀU$Xge)!hybSYm .eꤪ{t0`K+t-eײ"o`LA:dMLVZ!͜ҚFVO Z0/+ԡ .fy˘=0WѷKl3K,Xj,֕4 ez'u;TxX@@Ι i*+M+Tzj#e >C Ѻg}&s28b[ ޝZ="p8Pjأ*"DD EW ĭI+h@"=av7޻ve}k}ιOV$T)$$+0@C@:Fdne!R3V2lAdB<ϽzHc؂l$@*s}2+j-Oܜ% ɐsN!]Ji..?y'TsM#W?p>Gn?z8}AzT6 O={&;u LGݗwtz}零?OS. x-7]\!_SzsWnѣׯq0Ia1vu2 " ;7۶8sA b̎rS:Vs~]cs<9Ͼ)Vo̵'L+:Mh gP QTE4H1߃8f΄q+A,iZЂbk7+U#q;yƓMlTxlĔl6vzy=m{8wMvf!c~SVJWLZjEFH(d),@ak\monD4-jtA92ҌMLAGŶ@ ](tA/3 PFK8a kH0ɻŧTPʰJQmIe5?c&p:iQ_WEK^A4d*۴1 U5}`:jMӌk\/03sy}\+MĮ\2R)xnG)M%?;a%_"Z3dƲ]P˨"j%YeF"(d)Yۦ*rXi,C`fN1s։B%,ųTAhNӺmB޼"\DBJ]lg&%–ly|i|NQ–]U]E BSfUp3_Wt8"DKmA e" 9!SUPT5 .pQ%PDB@!4%qeJdG(%nؒxXs.?)uGᄏϷ?Ow ! uS >Sz<{l.}̈́ߙK>s| zj:{o_;i{]!O2G@h]b}v2c,[?'?);Osm׶{qw%froښJUHC*k a""^D"y:sVKλ N(JD*RH&B5 4-o}N^TEe/բ1~֕օ7>k!)KfUHyV'-]?uS)"yMj [C"qN= w^3թ'Ȧ&}7`Nv^Sئ\-lyR\mJV5sz ?qww@߫sޣ4=nr; h7TV-U%F!T4Q +хV}hMC5I&4cno-Limڧ֔C^9EGüJ4XY0<9 zҬ JI&+z]xwiE3tr[H.uD#Vh &zJz(_&*C=(Lp>`&"ك}Oc3|-6UE.xlwە(f6_@47vJG Z̏sl6MVrnĈZ ڶ5rm@X'Ź(*6z/d5CG K>|ʢ"b2aN'{){}3w{֫U3i);ԄWˤbj3)9TJ@ )zmRߵL=rJ(RQM:304P[3y?35 kx/_<Ǐ~#|/^_a85|aqssWqysQOwmƖv;l6ʽ\:"g[U Y hckW7?7h6Ŷrz.|Py9J.&1-D]1˄[r]ckՑ2]w:It1v`t 39#LB9H֨RA IDATIPVȄ\a &rBw~jS駟ʧ~M)/>'7w>r?_w?yY^w֣pğg&ʩpJO^w]J=y︫ozqk=x "?T;vTbL*s䒐8axQj>*5~' `·RSör21Ʊs={;W<ٴꏡe2]7y-n1˜kAN7EJz.պLw 9-z Ϋl,|~)z&c.%㙄 VQJe]%ub%v&2K.h&.( &Y y0#./ ˓S^ov=}ߣm-ΰn=`` " Zu YCģVx/l) I֊N=m;0{-("Ox:W-}kiܟƶvC-BӶ*ΓAЬ1#I.ڔXѪ -`TS<{᭷ӧOcDcm9L'`v`opA׍ɐ۶]%bK!f#I˖uzm"UrQw_bZ"qkQFP"oӺߨ'qkbUh{[.` Wi^Tc( 4m3mfY? 8W8 94z&]!B@}jb{kD_1(8-ƀAd¡Z4VC ɭc&fzjStIKx{no(u913,j%`Ƕ(}L/- MhpƦDZ" kѢ^صT`ưŸj *IJ*\'@8UH U"*@!1%Z+2'YΔYRro3'ϟǏ+;\7џk.>exjn? S3)0;;=p%R&>nA>Ὓ6ۚ\m?ŷx]iiHmŇRT]7mq璉0QA"ywHQs\/R Rq<87 " 5]D DۢU A74+@s+ eR[ZPsTuC)+d<\PRB)bjf8( n!LAmӀ'ѩWu?$?RsapNAI[gp Z0<qssq8"ƈ9h(RR4` V*z?C:Aݧ1| 8nᬠ8N'MhB,l)I'aVi#M%V\Xd1Jo68c<'*gpճB[ʱBdJ.ٚE@2PJ垎*:kuYhafWMA n( ߨjDhxYΠr5Bj59cF5*XF%UYCE.t?<^@8dӈ!x),&t=@)?^&Ky*BlpBUiJz1 &b'B$$R\@☸J 193@<貖9݌PyEi۶|Wqek3ma#fBSz}1o}W> xvF/'p?f8,52=a9\={wY?̛@? "/Ńĥ~=4ccp:q-^8GŽZGL0vy 9R λ%Fr9N4i nQ@x3r pJփv% &Ab9`#btn:js9%5/uud%D9ggA:lw;\fY1Fm EevsNvT a<Ϩ"+k{~qڀtͣi۽,0*qEdc*) A%6=봁)`{yĨ^;:].<:g*z#3|NHYǣN*QU-?6Y%;>L|? SJ J[5߽HjlLT#s4MghV0+,J%l*#A.ѵNcMd˱i4"kJRM}@k9o>s DsIEk+҆f)zkE۩'p"l!u36mJED; 8Zp UJ 5EWe 3t<&Q8bikys^Wo%|}7onn1#^z4Ohm`F8͵&l}r0j]%%]{zVh53`dy7۵iAR_1ٔ@n3Lv{pRM_yʡ᫫W*^} ~lq,oo&?+"xaϟe>ܗSrG.ձ>/[w'?z} Aʹ[DD<ǐ(2 {jE(8Se$UǙ*wB\xWq sn; 24#;ꙹJ*mU} )EV`yKmbuV,:|T{c a\\zPH g)(>6a+%g햖lV9J6"j_w1FC\!. i1'}̤{ЃY`r g;L" \*H,@\R/4?R4˘ӈjD>Կu;>~4] z "Dru;JKZXW ֢':%i`rh'{sU gLSx9GqkTmp8IUQC]"(o=}0`ZZ~nR]tJO sCiǔtklo=}y-ӧO*{L`O֩S0OelIAITN|`L-b9 ws[\*$kyjvCN vm#6-6M5m"p~C@H[aYHΚ<`\2T h" Jcc \%tiϡ~.٩?TO"`ux/ ̔n7[>`4iMMfd6MTEhn8`G  W7H9i :LMG53a&:/ !bQzsθF}!VU)e?OJIJ5_gR2d*y UM@Mu5_J`SI&jk@m+9mfZ3AyƜf(PEY*e-A @`HXQ% ٹ B„ P ^!؁(%ʕS2zysX697{>{{M} oy}3] o Ÿk!>{!{G>:+Ψ;WW?|9o}{s?^:G\#,s(r9]? ;0ג[Ę!si|HόcT8/:k.P ZЁq1%#4 p{{";?xS<'H5_ BKȺz%% &ZtXw9'<|fv`" %:L#R͈5_LB}"F#6n4RAQu{Rpt}5KR=h4cffsxxɏDJr"nqhf+R K0 psucYa# =* !AT7x Hy?߁_3Dд&-{Ԝ$"2ûLM本by`f~_}Jn-<4ԊGa讱@kvWY W@ gk:s25c5, `, :%hlH^ ͮo1遟 QS KrysUQֵ8ݷ<;L{bԍfn[0./u}$d'ۻ;H餿\= GcXB P9i2Т˩4DN!W{c:i"yTBct6Mb`htC@:4bhU,hY2jkqZP$5K$=DRԔr-e8ɚoȕ@&M2I"[)(@nH=n>XijN?Kq?n]B?m tKM1\?eG?{{? _=~|r u7M޸GCwqw|L[i\go-v ^o wZ~V%]*p@ɩKhN0ssVLU0nWkA8!8f# DMў8R}!hna G0X.#dN hbT2Gʊ·>0AHQE- *ZĨP;H(R̜@H?䤹^1H5.\X^$jhͦ<>4#z v;ꚍN>KPɖ2joɦ~䜂4(5C6 !Es}#kBD4qFĦ7$v<<* 0kf-ゔ* hf ֒Z APId^NKf$fvyN@TxY4^aC\UMhn*uDdš9\sDm 6T8H{*fֆ(+Q3p8 *P%A)|qTWDL$b%7%+ ϵb^χ4aw%zp%R|?)^O>_~ PZ &K}~)={lo + >|>_܌缏45ysjbڪxW>+wQ3:`PjFI.IDE9ڮN|εG!{ve^T"B%;\K;*wyu&Zw޹5쉙 =9afOr-Ub,S3CS G&RҼp% ϼ"^?. +%u԰!Ѓt-, RK謍 rNAFV$%q5Jg#5:g( 4jA\ManU_wDQؑ#F̬)'O%~o̬@{]0o^_t.%9"i{@<3nwMu_P$$wvPޣ{yg4Ql`Jӥa0NN`tL t 6{(Y,2@s!M Z.ͅ\2bit\ ;X̃Z!6lz3$b9cl2%pyC#XLNz)ml@&a5miBslCL & k@4QnEQ' t y߯͊ k_ R}M<>  Q38kj}*_t|ș?Y3 y* "/qv~G#}h5noops{ wwӌK:78+qߓUrZ p4s!ac\JE}#ƫL2`"䌒t<)aoP)kň5ûE81RYmfGѶ%UZg TLY8ok/4>ni*hD/.#͂TJkr|PԸ ^>~b#b@۞%TtK,yM Vtm\H0\1r-aaeYj5)XU Ǹ~fzk!xt]6Mh;.Uc"5F忴RH-s6Xh%Ng-‘AR5sڀT5Dk(1<,TMy_ 4-U4tJ2:l8Ø f`dQ5ҟlk.oderR@4 dJV;wEoEp v7Unڸ;}{簕SW~Ww}OO$Q~̟~;/^G5_1f]ڬȔǷL^s{vK+$}mQ//4b+tw'״ gLoݞ%6: C3ʮy1mdesAʕ#,5V3! g' w{r#:qO 3CJλoD3A}p(P@ BZ&b tŰ6!y-r7IyB5=+ET*jW!Ϥ4# dQxLlS=buڧ`a`J@.hgZ4.^@s,+K."A@&fQuN>G=@\<8/EX \TNv:V0xsWo X%L9m6(IYvHi^@|x;$:PEMuS^7agLYEmDhx6*cy,Z2aU[jA0K4l6 f<|fqNj/ƻDJX" mqN  ccnJ7n JGߥl&8߬>xfYgq,kv+`)$p*`NT܇qws7/_ 4#MN;x"lRGjjz_—_w7pѶJs0G #8@T xUI޴}&D1c`zD"tMæmcC% ivϺ0tdZ]__aGH)hI\ -6 NȩWqt: &li1zϝCiU:x4]%|Ƭ'r] W*_M~ X rZ"aǀ0xILHݣLaYEXܥO(yFf^y b5_^Ògf.iQ=:yPrp8 8pMR5҈q:ʬHnyRl;J`1^Ib%W&Yj8YQUVme:OF/mZm.urjSi:hHW3 9ޕ6i1DȚbSO7, E4%M+3أ ,%YbBU%32Onṭwn`|Y+npė!p pm.SLx\ß?Rw>3gk6$# x{|_~{{t}}ٳ߯o$?Ew~C'>DER r.'|PO=γs13nH,K'K8n\:i~p[arQwcH K]r̕}FJqK9aQud OY\j%Gb*"q ahT)tsKPb  UhwOV&30φ8N*dFf~jL`ɊK=b R1 i4V4^7qa<4 NcPLIssAe Ulh5PVoAbH8zi &fԒP2$&Rށ+n6hc<Ϙ޳I\:QΩ C͖N1 rIM85悱 (9TxD4x-G.sNJl#Rl6 ^١Z|Js9M3¢~dSd~EhhP"EA[ >R,6AK'x'HsfN+99LM^¶Aip< rńD勗mӴzRT";L`=MD`uLK)8 J̄ 4ZIa<<~[=%B&%pp>JIA`@`xpa!7m̤vo22h|*)B-+bhN LZɸ9Σ&p*;3^ǀkm(Bmmq 1r1괮yߊhb5Yɦq-^~1O8QKFnpSӀ4 0qv iA^azbD'M#hl\pWY1ӵ߮~ݻgG`<6o}+~O~7o~I5{ok GsѣG䓷ӧG䓷t~I|}=G>_v}֟dIo5oo[<j:9j1JPNCs%.=uWO+b#*1D Yo PUJ R"9^88?)F`!!jS%819@jgR\NRm*^ eShyr0\2|G?Wx=߿k|q]p8pqsqu}e%1jq }fܿ93WWlҥRHC,^"n&OhɿRHֈѶ$b[\I!E V,0 @,=na]W鵋T:`9&d7Χѩt8lI c?\dY>`m k^0/rs}md1! vΥa"0u!@F,{ :"[|#`~9 bK.bu?\&55f4U ÈLvPUD`;h b0_!lDSS d 7ADxwoWW{h+\ڡ{ܻݸ1a{H}Č>@ aE"Gq ?9ߍެbmIFݶ9ń@qJ+"}' "h:3dėVR@:Hgv"c4}A"(- ضR `9d` sgڬ۳LPBkb0mQVgrXɖePT'4.u'""u S1i݀M:jxjM1Lr?I^m{ZJH`7#]#qXgX 66,tϮ"4ŢKo X}. RQs-YݴXs)H1"v ՂUAM1 eu 䄾7|.A5aыHEyc94K]2/V(`2 5{F$"je~0WL ܗEZ `UZ9TQv]'my!"ׯ2{.b\`㭷5RKwR(8m8;:L3&{ sɸ~o"ZǍX[³e/p}s )΀&0 *~nA%Wf~e˒R6Z0-+h6ɲ*Z dP\q>A~oۘ Z];rhK^=/_7Ą+`)b]Vl1P!~n^a-ˊy6BlwM=#ubYk )K[[x}1v)]BlaQE cLPr$|]Wd;~ `0UdC߸W/_|>M j|>}T0 G ţ:Ј7 :N'F%ftTh>Z\Z0I3 kV#ub4ݤv3mƷ m@3PH ;%9|evtdpi+ 잻Ǩ[)<=gXWh`X'簒5?'z6LMި} |se1wx<"yσ0RC,ľC^ţ[u~mY9!a;OMڽ Pb `4#T4QyZˌb2p)ʞGdEi Fev!F~QK-@vF~wHeԁi xR%j{Y3݀a!g,  8ƀF!vD (*զ2;b3) l^m&Qb%Ƽ52i2ZN77W^__Sk N?v=ᅦV1 _'O{UXÇw2P_ 淾}Z~}o+Ç-y} ƿ~(|O#_#_ϿǗ;K/O4w'rL>#yo_?wЩ@b]ˏ?~>wP.ZBѧzOvPn+RkI(N((ki ՊB\kmTTA8opp=D}q&7}t⋳Ϛ@Bkj5}/ܫ)b}(~@Clu~>4 9^ZBok-t@9K m Z^xů<*l՛9Tjzn36AijEH0 =?kL $ ?|^@Aə@$%c]QBC &l?t)}ܻAL 8 ヒqz-GC猾l[܌8;;_T/mm d/VѪMs.[O [kC17ͳI .(3TYPjjuۄF m`|$#ZPm bPj< ךm BeݻCjr k^+呱Ka 4@Yw. ;o'Iŕ1Tm{R!o PERS$ ]Vh)^6;Aba+rEimM?4􃁖A{pdQ,(`*moQFi#6m՟Y)5hL6UX965@b.Ğm7{C2쬵Ap[62ӷUu6k`͘B"|s]JX ZϺiLomh $:/1b{0Mӵxźh]gЂmF9ԙRPJQI05E?Ė/@˨}Y)݁Zkaš A jڝeޟoyWoC(d[f+G*H z=,nDծ-),"nK=B C^g5pR B*BLd'ShԨ"4 STզJ ؔzCOJ-߁)dvwp)\__$nJ!={ggxӧoOϔz{wwgdgPރ_ ;@]Dko kD[Br{uXdxz' =Tb,-H)V @8$44Uj#.yAաN1sW t.yy6e }Q]ZE ][E^WtYCo7iQ,YQ5Ջ`3~ۇ=A#t|GDޛM636͚z; uI Zjm>ڊcMӪSLm#6|sM NV|y]3yk Хf%gzCjkd`Xy^k>ޚ~B !5_$ڶaż3/_6k.@}ΝC:$'d Rr4)8^>BwVoq:"=ag^{+ "sp˱n^U#,ek.hЋu ׋  'qj5݈E9"2brWŽk:VD޷mO))uq[–Hb2Mjt==Z)W]3 ũ XŞ!1{&:X!muUѡ5beЊŶtt!w6U[Nk5 B#js(}X$:v $N$J @3UC߃/*{*7)%]|DKa48QkS-VL=B̞ |}BjUK֭ foLʹ}ڞj=~ nN݆ۀ)Pj]zZq!hG} o2~D,^0L6Mjn0K_kE:->1t] S65qt! WtbgRHdFޝ av.|bi%3 +Ą.&{3ߍ@aPpM6+`q<]w!n1EĮ0\l5 'PHJVk+MVPa 212ZQ41jlO)bfg|ٓ ΧO/+_ٳ_ӧOW5?~xٳk|Cz}|/_H?GKkqI >'|?y{% Au;I.tu5Zx~ȓĹ|J9Z2hWKkX?% -`$&ƾ4¾WI@)TK 1\bz"9"" @ԃH0HJYG`AaԘ,j[*5>PڝB}c@`8TQƼ$ }&u0lbR C--#@@t:}(jU@׉,9[aEwы}[|`dM3KR($yIDu 72ҭhv "t槄57lw=r^1/@5zUZ! \#ruٰCRRjiƾ4tf@}#6`-Зh7ЅM&>Vr8;@[5I5kuM R-H1!{2 6j)eunSxሪ y39 O|ƶdOg+.򭵻b.&y F#1U+lb?M-V]__aFԒV 2#v !J.x&͏hÇ?O^ 3>'ァ|lSKǏgE7Ue6^F#t&fv?u:yA-^mR6G% mo0d议sKh >9~۷vij2݊{7#H|2-gmYBY l!"y@P V0 (ƈp08K -l Tmp==EǓ/@ ج6 m_ȲcFZ>mZ` )ug9%EvI (7 z?:Zw=nn 1g&ƄF=&z (%C8b,N֤O *eA B1-rV"H-+Ʃ` b(~A]NETvѐъ:G4=1ɚkA+jDuY\ۙ Ċ\2[ 6OnЧaA$ -e~GE&yvk}R_3ֵ@"@BWYmT0HHwi m0[f.C7F+WC6By>YnΧ3gÃgov_[X"&VZZ0g+$%HcFxF|GB0- ^ݾB``ذ*ndBE8OX9 N+F@mx70NX3kBgۜ/ryެ!ZZaC!>t@uD,ktvi]1 ZHRDHJﭰO64[=b `׭a#ւݿDTBNFuƭRՎZh)Jc&DQ'#㐮*45+L[LjHQ C` SКҖC4EZȗ)8}-8<*2x>A'5/ⲿ6y{fĶ6Zn0M&kЪmrFγ!QQ\$1Xaq{noR(dIYk1yȗ6,]P=A/ގ AAq(ϼ1- bT#4X5R R'S@UӄvMji>|>b'ߖZ0| l,r|)6zFGcz "D l_a"`R0?l۔V/zy* D&^~(E xwŤwA@O|v=`$9uZ "TK٥w^Z eWtJ[a~@rRĽklJY B"Jؼ[D&مVH,4Ѽ/ b18mT/KB@{ Èq0&w<Q6`C2qu2ϖar.Ep{:# p8\͍7CȌKy~v9uyI]0D|F)4l*o\XBI:[SPdŚn!շ,(5gσq=1 )D7O⠊R3e۳V v! -gLkFzӴOݨ.%1Dbqz+#Z8Oț X+bB kkdГ6t _bD7<}gA Jl^P%+5ks!,v '1te CDRߡ9D\I=feAzVbVX=OTa]%hx.Ԃ @l&ol Nl^P2ͶEuOVUL#rRѪNrH+ǚ3uf *yw;t]Hĺ.~]t}oRM6o[mVƺ.؍#8URn@=O#ꍪ&Xw| [axb@#ZkxIŪ1W=mkU`v&Iunن `l~,kJP R5m%:+S[KemcwX J@5 w%v ̯T\DmJ:Cdm^Z_W[]Vy*K|WzsfWBDMIFx{)?և{ァ_ gO=}W?{GB#~Gmw뾗t魼[w;H m_ ֚jkF+ֶJJS Q%JHmLF-!JD!a"\ZՅY9$RbRbQB#u@d7@"-B6iGLO7`V&/kyfͲܷ۔m~m*/ ּPk^m.%$lکC * 벺G'G1ctٚ}C5ERf[F=, .8lޑi0)%˼tP/^@o&n!w1~ΊĒVAkl7s|403Mƴ,3Ь9%SjZ ;d`X\ P,qvjtL|BdrRQթ]8cz|Dfjˊi:#zE̡hJ}J)WaY2Pj=5,$Toɶs]gAZo8ŇVXm,vj IɳSDda8ϗLnoÅΞ+ M1:sؠ[ J(Z[<$g1%7E4vlQK1үD) ָ>-sH3qu : z69 64c`GlH_$"*th]!ѧ`Y\Q\2\C.YT\4ʭї;;g8Xs26KT8|l>e"Ґ Zvyyj͟Y;׊K2aA "kh'o,|Sx#i'vx M8/d 2@0)u("4qZCA{ARCmk51$uGAf芘X 0"Fqhq:%/\p~m Ehv.؆0v3 ^F-]y38ˌ#+7x9I'Ъ"ueG3ԃΛ6ZK _AhQc 14 豔rJ];^ XU ZVV0'EBD І"Hϑߨ*AZ9N+ ;o' }KgxiѣG!@O>6_|CWgG/㧊9~?}+߿ sxٮC~W?8G]osKcXJ;\+&2ZKWp.TIIjI Պ"xmtJkC!rMѺhS$7Hio@ܩjcBqFDH% Bݩ"vP@M`N+-08vv,cRK/(y7q6Z9t1 IDAT&*r.5LԲa[F-!3 k2ojCVsm*I@"';QRKnoX ]2IJ?)ibJ,%+@ـVnB:kF؊F)TP3 `g+ŨL0D#3Zu((oylB*.jM&p@ъ 8w;{u;hU,3j vvP/ B̴nrߏqDFSnC F%M޴؛m~y^ŧRxO$ˌy^,ߎC{`ELE ju]e'C _"X> h`UԊ׷*7׶z1rͨŞ%< "=ѩum2iU Rwhi)ў9cb.Ft.ce j@e6X4ٽZlkU#R02 W`k8J8 &ut&+|aY&#"mt6d<`Pm{w )8XLNTO,R҅9 ȭ9uÍ($)$aܲȾJcmmUV±Ct&!vUsIRJ~.:/Oy8쏪~Cw?>'6vBУGٳgd>xg/z ~!+z?&G@Xᆵ7f'mx<.~5'K'έ*q!ɹ S2BJ! "#СI5/)IL $qRK0+Q&=3% 6yنʊHA$(֬{3!>iM\P$8P߸y M nm 2*?}.Mv_DsRqS `#Yq+D,xT.QL Zu+xk5_֌6 ] 1% B] `VSua@Gm$F0UR/2iR,"H@ɋkX`<Ŷ=%v'A(*trelLccYVL u],jR2eWݥk-ϫyAQyi1?J6Ko6tSlyYCj8%c`X2PI)&(\ ]zcV1e#H[1I u-&/MP´-$s9ɞ0^VŞZ Ъ2#ms)x9#cVBI ov*PgV\C;u.5#EZ1L]Y&׶aFŕ?6涱t`YJ 2ECbdAag%rE]Q`g<6 Iem rCSM Z b[.1B.JBbcø> VSmJåaV)y& b^U"`wr<3q&a( 5R6g, ~錔z1]">f]fUY6$ښ=?FزNզY2 >+>s[pZ)RB"$MK^U9\TZ[ps>"Օ M&F]D$K{~s)F&i)MVT鼮L~'ѣ֟?O>lx<}Ǐ՚_]E/>{|a(~;W1ɳ O'OeZܖ_>>DhJc]{;ۈN_N-v}^ЍZAjV%Bi 'UV Zvb2ǽHK;R BTЎ PRmPP 0ZhPh"p 4!BRO% XD|e9UCVz'pQmWk|FR\dYۤz~Fk.mbAAAHAA b<˲b ZSKfe|Te^ж6~nej%w_кn k /n(}А}c` o\-JZ8,8x&gg@3;EȞ}?Ŧ]7 2h[3Dqq}uapuu7k y]: {׌ڊo7/R=qeDd{p >. hV6[޻Z^aZc?9֭.6ɖrw"đRY$@ =PF6VMd 2@Lԣrz0C"(G]u眽ZO5eBd g4zTT?.Qsk̿IZC$M=[yLBSߏZ / r.'F$6`QӉMvZ0iY>SZ:/jE9ic(8gb oE#baՊlJ\R#h;"Ġ2eX^ҌZX/\lC ^k,H?jk T,0*PUf 2BNEE دTo1pc&YU$)-XYDuX\ZAD!`AY]ҳ+~m&w]Fg :hb@ND=M ،Yb] uR}h솓{ ~:hŎW`慭^HQ*-&"`<}^TW L 'b fTH9crV4,eIOJ˓4MdnނyOι0ƮBC7{"4x<9'BD"S _+?q՟iko7?T~lo)?,Oo^]vizo>܏>~}㋴l /{ w%zO>ϷvS9C}`q6O;7⪿B_x》rVLҢx]܅R<-WΝ!2<&ag@Vca֪]bAE;8ɕ@^r"91#生86U={re VkTqHZs1TaZ604_`oD5&AU\S]XƥCC; ʌ6GT1 II*Xe>E %סBC;i0kMM fؾFނt'{c؛\|4LӬZQ+` 9}+QVTɎOky՗Ahbs-"5t],; BSO)MnV5l lgW(E\4`S0jt6,'BZ9cMC$vDjmeR\Qe}οcp7|k늶/K23{qC0]޾yvNuG H:_~~3 ?} |Q\ev_G pU6ǟq?$Gr| pK,I7ޠ}|/}o-^yQ^0 5vH~d5f>2AlCV"P'O8Uym|wiMNРڪiu][AI2˧|r%+g)q̬ & zZRV mrZ %Q}|?@(gʃjQ#C20<ľ3#ׂ"iznȦ+TҺT4@)Q-Zm80|'OS~:b'\\p<@ZCK(Y=U9gQt_4d7-lԼ{Kg6-6 qh G{qeoQ{dJf@nlYu^MN1",ŏ1)]rҁE*yIhpPp\__ 7\_] wT478xs۳a b*hY:Υ}9~9v-qlL3&Mh#C? }?`ܝ718k&[4〝;s!zj膨{VY8s&YIYK5 }`"' j:Vnr)2oVoez%|x7Ddr@qMd@֞ҷ&S4K__<C/~o=B~7ސ|Ә?~t'o>z~'~~~yjz;Wѣ? ք/QW~|x>=$K9~W{>opܿZ#c?\=~v<]Zt宺t[|( ևIK枥QBj c9RkaiHyM ̡ڜs] Yjs ѝ5bF"`-(q`v1O1V9P`b +,*Vy4X5hM &b= .$s*~=Hl$"l뼦a2HԚ5(%[Qv3 p KA9AԓUB@ U4,{\Ki,a^tO[In_*=i^ j- KCVnL9I4p%"xBc@$,^و$G* p|2!ty2N, $XС6A? #Ós9!}'O RyՋLD?WM*8]ߓO1k*_?a)E5'0eEh|L D2փnnÝwbN -E{Oq8quWW`&vQtbI4e<1`L[P)sxrrtDmW =1:*5xɖ(ӿJUvC*}3ԻYkת*b]ed5h+Mӵ?E#MC]P#: :dGX 65eKmK[ҤQd5UA6Y3%{rЛDpsue~\Ui޵ef Y8ḨiIMWJk8oԚ&Q+ȘBp;̨5Z[0)3 q)ifrɗ[TvT4ӽ5AtIRks@%ʲ"ZW>+YLM^Ո`Qzrdl$MU-, z IDATA1U_O}0?dTN0 fw |gߩ%MԻ_Է[KK'aכL C2|DZO+K[3yZU:t >r^X)ޯ:|]1 cgt>j2=o* 6}r]5d`Z3U(ɬ7 ZEj-B.ƒK=4 }+- Q6չ|QXH,RK&BeׂC-v*p{Λ{n{n؜@w?ЊLx9TVBg߹C~[oݾ5{{(~^ u󸼤>lW^)_y?|H vikS>ov=| {(xg?7po/K"ʥ{h~ {ez_qwm~34u0?ړ|:ݗv1x=\ߓ";稔Cļe TfPG%5"x28+hM$Trɱ4j\[e|CL!߰#~T'.hy!98=Rdy;lTÒEn5W@n ){-{ :iAN iřGQRF ٯ%#3 ΢хjŅGiY7Րv&dGR=*5"Yؤtl] L3K'-tMtJܹs5G>d2.e^@xRQY;%fx 14D{K(i6FEyM PK0n0nA7OpEN|ZɏNiq*!wޅ#FqO$qBzϴ&$>9*Zabp<fޟ1Fx;嬾uw!zg~2c|䥗PjA?>!FĨ@ÄR2nnoR,&<~FAK֫~;w _b1n7hM}Î=\X=9:lwGMaįn+Ն%0ua>4I?3ZV:=aPgOB Air.'Y^Z$ ޛWaYYIpumQVJTU֪=k5%7؟k4j^4TJg+-j ƾC$P9c9Ni iY'(v]7N+#b؞As[ 5A7*eOq֒b]J+N#./B"r<]+Cf{1`3dR@PiF)X)5mhf飬_!þ =}% #MzVgz"8 ѾZra:ނi7tԧst<'ZZkAZf-(YR:Ap+VQiu8 $h•Ά y gtVeJblˌE4!}hRt~Syi-ƖoԪ2OZDrIm47!b\DP|p{VRZ3yxL7ܤ'Ss0qr14-WLWiKJ|'? _?zܿ'Oh[EH0}s 00Nsc<p/rI}E^8b\/*\ܞ{k~Ë_Iv#sK}vFk]>x\k<ύb >HkeTspKƮT ĉ솒ѱg׻&Hw?P H=HV8zbG#$Ξ< &r5`w-)~kCN<3HՊI iH&PaVZ@eNW0 K, )S@%g(NMu-iǟwl!w8mr6p`sށwW+.oQܞJ vx$5&۵dMUF " 6\ߨ${zaԟ*oeM?UcـHVK`;.w,ҿ`>8T`±vi@GFK1ڗV-R}b唚[,FV-*̹XjN~}'<ȋ`aYa^f0͋zWu pqDC :m!b;S9 [!P&gwz01 ę̓JunnU e?\w TlC¤i"b%ʦyE֎Bi <*mS |u:lDNyLF5[6kd٤2m+뼮){myņ\ײ檅%ag(ȒI6 Iё9C*iP̡w*0mMU k|r:a!U~ ؘZF(wCu=`"}9jL~SBEYxg^e >$TJӼBL 1aʆuxXARJ.b~gɭ18Sz.X;YMN LIk#4VCbzR@ iݖ&eΡ3cBYC,Iv7萒0Q7]sRju|RnR*oPo>W_}^}33W///=+trSYNoJ-}g:|ـ>$>/Jazg?nct·sm禉_{RC3㇟G{GwxF@ !Gf;NFÆ"9r,(mܖE*Rqc^-(<2s{FyLpE4@ J[f'e>u-eXB@k@$u1<K?ךNLIY<79OnPFY h !DdT/YciM1 %%.*=D*6@QU[=md^YLa-^5I֓&ځ,Wi=| >¦2*cIXk=%&J(yR3ߔEb8֌V@ L*;-u<'y0 VBG }雡n;B*16੭QQSkeɺD*2fM}ޣr1kq:"-):!%^j=ɗHDױdi\p@Zf2Z^{=mڠ`)+J cwz^Bȥj?d..`_A #6ۍiDtX B{.>}ݠl-c.ٞfIzlkuŤb*,]_IICʇ~tȰ7nk8T.yXkRXtTЂEqpBH2yY@o c]!Ꝭо~ 7cf.jwh2i}? Dg~4#OGeAG)a"04S^Vjij+-5ZJ5y:֣U5GX_k +S$\0i}3I*tV_xCZ+H#ԖNݼ4aY7&}tw/TAD2-FiTDRQe ,JzvW uGu:MRKS%EG*g}XGUH4ɘ@&ipu%cSFVLQ ,{UfyPmHc_SoKSE;ڒ]5"LQyi-[i{aLO,|V $5MCk_x/'/<*%~>|w/}Cc|n@"\rߩi?[o}?o}܎qs/^w ޫ>,//K77~xKIv.W}m\^^蟄xہ? grQ.7ޠjm./?&*^(_G>o'MwmaI'_Ƅa^-/..P9QyZm? ]w4]Gt! 許ޡ=$%(:;v[v<*E=옣ݹEhHs;EUת_,YM TJ H 3r-_7[ڜ&zl.jE:Z, @f\-a Mo-VQ :ļa/3פw:.%tR` w ){'a4OdoA+-㈴$\%)Hi194):*ja;Vn)Dڐ-`gIRʄK{NӬ[SnZ5kV{7(ͨD2mk],kՁ cZB(v]3F"@UJ<5lEb)TF v&M^zAI("X҂+jC'Wن/D%\-t@k񻮹5s˒T":QקXD BHKA: ^x BOj7f/Bd5ᕈQsZJ!Ij, Փ$wߣ{Tx%qB5N>rE?o`{vn2oqkV$kv13[)ɹ\Vaja~@r[jݣI<%:U\ԜK>8RJ]ZYo>ꗎ)QmcW~|O_ǿ~P?ώ;?o߿_^ 9efRS:t\};y9|RKۭG1B^{-[+E^^q~~^ x࡬l!|pɻǏ?ܟ_؅)yԧ:\ w8!4\]-m[oCaZfa&sksyϞ)UЀ9q.;3N 30z f׵F5PǝsίrL2VOUGgSө"X354~ h'F5OabT6j v*qG`d~ i]zX/yQ ja0lf @Y rA()W y0k)B8'cKFLo`(%$X29U Yپ֊LV9@$@n*He>":S13<?-3F pؚNЇ~%Sv8 Pfo-_yӆ iCuso1nou^S6sHYKKeA@ @z1V1,3VYM` dכi}]p Q%p4O)hYLSP8 AJ՝tVOr<:Ĉ$|[n7bGp꜋!t‘ e@b uO_x:r~95ʢ2l1/3oo|2n P焜%Y"U`K]6DuZ4!/:#6{dcfK1b<B (˄y^ O< r*8Щ;.0|S/5#U]g,E0b!lL`4C]Wg^XeAo)<8 Njk?UQ)-Q=`(n@-F5=;4#dgN9Y@άn-Ŭ$ r(I<, XkwX*L̿/]x\:E|vhB$]W7kSF< 2_,|ofkX 8BשD`"w8N B@3O jy)׭aT`FkKJi-v>D]KK)ԇ.nZk{ :Hbœoa{\^Cpy8Cy߲$Ca|Fyꦆ1_mCB\L/է_}Kw|I'5y߉۾q`KrZe? e=B_a~]/|a>ų}_J @3sC @qs4]\rM̮u!yagu96rpQwp҄mãB8Z:/0Q:> 9 LE=V~P]'؄X eB NcЍT N`oЙU.jY@5٤o2UZuÈ! r*nƖT p8XMI`V I=Emdz>5~"8 6NYy^_"u],ȦQ̇AV9liz(ZE7~0GG7v˥U+;LdKy2?>FVcB~Ϻ0ÒpP4nettOtKZأVKɮXjcnDqeJх@0eGxĐw]#߱"gѰLs ݠ9UO'OJ{8r؝y;dYU/Vv f 6ۭɨ mt$tb7iR>LGi HMz3?rkcVF4S0W8(i1,'tQittׂC!ޘ`T:UDiY1[ʸVecJYV\ wTC{b0G\URQ=\CAk ,ggw ;Q6k;Ghҝ G6GnppvU덫"lG%0de9BYm{X,M5tM03(TfU0I+@,N R mMF#~{dDB-VBڷiZ{9r~ b!Kb]'ג-VJr0@ޣJjVwm oN)OCǠ'O&q i]&8' G)l]|[.-g5KzUBU윆DlI  n#qs vNIL+ 8ZjN吖:&ݒ*R{9#9Zzȭ] RD/tSjE]ǧ{|>nnE.* aK/K~GODK a R灖ӷ޾{/BwUվ-"EkldQe\}`L1PI 0p_0" 8FF/6L&# n0š$ɾ޻N-9ed9Svպ|B_RTww9w~޵W?['J'bX\`? C%'_iSÆ/rQ&"=p6/7}o?nX䟤 _huC\\~%?Mޅ%[6Mϴgg;-ߌcYm9DDņLZKcv1Jֶ=)bZ31"1{Cn ȶ.Њ`(ι@qni _C$+u"Yp O0i#6$yi2m|2e0LV+ub:22xtR0DZBm` E`I=^oit04!ۍ6&3 JX,[]բt3mZXJ4Jе<Zh0͞i` |]gˆl&3XhLr?d/Rlr4oUJ lpUnb\2Ui3N, XL !L!{`}8>>4v@:7{!߯i 7 'LُFjbd@Y &&V4jRPT2aUqa5 Ng`}a/xV7m.ڦwPe-Cn kd(UF8ACB 8Xr8a.+L~V0D8$ڤjad {΢B&NRK9(EFq9\@N}]D6rl }fht+ǩN@L9G"T^n v7mX6ܭk;8oNUAZ0 'T:k,x ]qltTXGG A|1ecDII$۝~@YmA ZA+`g,Eal7[ HmuX~f.@[tXl"zh;kB򥋗4E(ⵊFo ͙@m+Zr2IrjXx9iv CW~hN)RTlLpA ,y54TOpn qmO] tzvYc)t{rچpwNs{qo?z{|G4ُ]O//rvq3yS)ŴZkm;䜃1MB1:\WB!XP)<w|Ϳw6O.oǷz+=+b46u #=Ͽ c'2om>fn_̌%`Jkkki[OÇԏz=GGΟx*>83޹s3fDn4 `vZCfLip5e:߶-&"(Z- ׍YK d+ZV Ƙ@3*q!Z 9^d)aI ȠTm7  &ڨ4WP COND" k)$պM}=.YhB]R`k!'42еJtB0,Q1IOEo‚fbV+- TKQܿ\$% gX BfA:yԐےX1Jz0"_qd@%T;-Xv4u[uAZTN[焨H<7zTe(jo~۶AL2l&qTB35SEN]N{~$p{riۭI_rNlHi04Ƃ1ǏS ˗|];WF]Fn/~k_ OsV?_/sի'])bcZ՞-|-UX .݃tqծ?5l?Oz|ܽB5 zGZH==880|+ΛaC޹Aܚ 9*3; m'2tMZh3n2OuS&俵A"mqfo;cPJ.%z{a4!`XVA>^Rk"vCr$ )˥m(bZ(b)< 3݈a5kԣSrpJ C1a-2hu1c.I6޴ J8s9R(uzG V*$R$N1!j3-Tu|oȹ"|5 ̳8OR"P%cT#c8Sh3͉]rV Py{ŭ5">`oؚZe3Qhd}]VU,pXr9_sB%RkX@M^Ǣ-v5Fy/3q{ F2K1j1 99T1amaDtHe6ң6 T``)axb%+^ bL!B5dk[ks&皦kl>u˧8~B 'GҰK.0XROh=зCK+~6~S@tׯg|km߼y g>)x_rwԳOw]rmV;sݚfī9xo]|ȏ\ }sanDuد*_F%Gۃ> k%?8g6{" =xJssHovk_?{?C7ʋ/mD6/|v /+/؆vO?}|KS7wZ;R\4ĵ _6 #%UJ*̷8jcE1> )Rptyv{:w2<ykP!R@ED4;"51:?w@}V5MO MMC|Qp ͜VREIHcDL R ƈzL"p̲ZOnY IDATϻ; 4'B6Qb]6\Z*-}SI JV6F r)cUC۶AK8 nR㳬nDL.^Bhn6h 3zr!^ k0DQҬ+e8/ʑqyO y[5c Ѹ D5+KirjYD"G:YԔF8G%0Lː^+6,<,¾\H9)m :°InH.O]jA,GRPZke)IXBH6^`:d`FjAs|EkuX4 ٢8-PNAh[z_]XReCޠ\ttX7(+*k U}h TZu&c] a \Y.0'G_OO~nBN}  'Gh燻|[;ScG$_rx%{ttg|{m+7onh^:<qse{wv3S*/>lwNo7|3&>o6O}V`f7n`&"u=o͛o>+ ߝR[񢯧3=~g[k/R _ŅfbEOv-2ֵm)M._y.sKTbcT Z`j\2oJP QIcXWƚ@{·g+q!k3 9cY۩d_$E0r\!u,ʒaM"k&!=-I6dW]P=JϘ聓4J-5WfUFBRPQ$+IW- 4(`]0RdT!Q$`|pM0„7Fn2E5pN5͟GG"8ЋL ̨0HDXPX<>1vj$Ň8N%:3ZH'3dAϹ0`{uMz}`|ned!Yg躙bDh(HIQ L, Fߏ\]PŢkѴ|1CӶ УZ Kqej,Ŕ%6-rix)H ߶1H `61Xq7Vق\0a`56 ǂE׉Ld[v2KNIta9Ȫ gBP)f%9I6bZJ ?Twt )"(N+2΢K| &9xwΡ D(Z/@@}''*#d?r.J/$n7F>1ILՃ4ppmNNq84!7Ɗ\|TD-|hjBh6xMж6(Y djfi4$"!VH3N Xޫl7]v@0$ >%2F26 b}h|z|2 ;ZiUN^? 8u&S0t,f_}?+3`D**9"syB8e v ѷdy^XÀe(_'Cq2@Uw)E=RW*P/]:+~ݺu+^z]ro OY_XCytPin@|ÌBVqzܸA7ph( G ߺi d'o_x)앳v[>dO~ҥxinlҏciMl69ˋai=Lpnjș`*<¥֤:3.)1dXՙ̑00ZXa]&dQZmJ5uhT$tMp'Lۡ"x ߬ҭ%عՓً8=\wʟIH%/ OD#r()"G113 ֶp܋@֠%N1fM7RJ7\B%@4XtK 4'E++RU&7RJKfRE"7ŶMD=:\L^qT5 fm@${XI)h. E (NLyp@-)9a#f1G|k8X,*^¦i0 R:4TYiS0HŪ[ʹ[exA%4r"Hy'ʲ0ջpHtl ٳHJl 7<-(!DX]Ce}X)X9p5s)rLbb-"~0H QJƔ:)nyM]Eʲ(ESdsKJMi@EAI%k![ .Wu"6G+|`جT ^TL>HaoCF΋'%W À 彃RP W=(G݀"*JoxK"!-Odb8tNcl bmC9 È1X/WHÈae;Q+Z`CPIy Àql)s0H 8\+,BV2v}0`(װ`ȣSb2Ce[LxS{dX,Д ^ÜTٞxqsȢB ׭_K $\O Ұ2[bևGd<tk̽tPE; 2ZU ðldh-rt:a7FTè݊9RƵٳ(BC `&V}Un2#x"Ƅf6v89>ShJ 1p#[oD%!{w&N<\"RZnW\a@N@SVUbIcB&n'$dz MҠ֙`!<Цz-#KкLch5 ZR )SGf4CTN]Zgms`0ڦZ :Sʁ[AUE=,,|9[<'1ύLYM<ߘpJj(Q /1F8u[HlR.Gx/}TE.3A0zVl6tnC`3SҬܫ!$BOclzgXFPWd \4ϐIu 3ڑHœxMQ% .EFcPH|z1њu4O~0P%o iU)e ¨ krR %}߃<V7Ul7W^Kq%Lw%~`:mpzr2ѯ4!Ơ mXXmwhdY1ԝVaBއY&PK"[ך'Z`W\A.dlDsu0Y@-o01e,L GAdj$~nJ"MJN=yL()t^$Nۓ:'ggpl0bZ:z A;c5Wqc,NnkH^6)EV!.>v;hFzN1劒S-CαZжA+T6))X M'AH9?_?z^~T޽8v;&Ne,wvG?|x+_Y|Gp!\m Gwo7ի[[_˟|kL*g6o>U^W̵wv/BڔZ>;[a(|z|ϻm"oUjڻK9yk KW+z.)m Q6_N%=2ε.@dJ:R2Te[LgDz)%Ҽ2-_}6mfr(Fj7m 0/o i>͛sI74MjCXY Rx6\fY(P[5炡͘4L0!brH9J6H12E ,N'BE$LMɠ+od3(lSV ~ 2JRo'ni>4Mq5BAΔ ,KGZVKA5v}2ժl|h4NãZ`rmM?z+@Vna_qq䓦|sf)n{t]sѹd?!Wڳw^|џ⁽}?c'>oӂLB5- 瞴RƔqJR0X)skSɖRF%rnYkfzDE0 6Z!b򵲃1YwA1 X2G50[kķ` BH=@S?![(=T7xRs7!$ Uo"?)W=+ ,_~H 7S!%%l6X"ݐHk*E|n0qL@~&Gl9PRQo/9ٟ20ׅ5gc*ԓ$~>ԯ(7qqliAYŲI.C&a xT@9Ҙ1b o`YZ1;$R~`  TYSsy 9C`PJIu"ř )B`Xl1@E f% J2ɿv~OHq|#(^RRrQNRİd@H6`RE =!MݮGH\7 ff f kjtc21WѩN#F"+Dڙ3 sԐ%YS-;oJDSB%#Z#R5Ҧ>[ Y|Ơ],pEV@΂k#ΐHnt[26 oQ(R25ϗM˰vۑ"+h?7 4{4MU%0Qa D9rpa^yǥ0R`U)[Supс1?s\k N lvA[5L IDATN81T>Gȵb9r!LŪBaN2qTYx*xR!`'N׶?*̥ Ht>ݧޫ'Y9/"ofHSsjPY^+֢{5iƢ4L%f+,ar:8ZaJ2]6drIy-W( +0[fjM!偉*W;Y/]']֫}],2Ư5\J}D( ƐO6gߠJt٩sgo3etӥLׯ\w~m^ƕ+wfUc|ҥxpqeXJ[mvmA_;t?y'=+r;Kwxzz_{?5ʕ+|-><<Ǐ'Ք>oNlt|>~|x{qxʕŋK|yjfQO6}O6{?_tR銈軾@_-&qfgK^sb?7 J]gkr\vp5@guԅ:pt/})>< xEadmؿ|zX!Z6޷^EKlт͎j!76Ը;={mкEe1({Î]hTvV6||dV0Sfm ,@5nAklk@DX$<Uȳ>i(tϪw)ʧ7K9I Cp7A촉sRl+Ez*7GRT"iXy2y"YnYXf4JphF *܀s A6 gH[g2XlsYBjdΟaT:0JaVVeMU/` VQiZCCfM?bHR9KZXHu1JS@BKN[) F` $qgw9ev;%Fq!!4hE8 21 qàg!Ufe%3#=J%,r@\ y{:2ခ[}Xж-Er j,4ͩ T"ńNPyX":ginNcȢ)F3FΝ22%RTA;мIJ8;9#zx6E+33$-7z)9τ8N8҄؃$ >ćSEa 1U|֢"s,@lnƜd0c' [tuBJ`E%(3D U)^m"JJյ3)r]K#X'K YVF5vYUU1#Cs)nR񱑑(cO5( 4!cz7ݱG>V"S&2eYk`4v㈒wmaSY(, !%"47BdSWQZȢBh(9r?FMȠv+@02ߋ!B켓A-p\=mR4!BP2dQ YU9,5((9$pTxsJ aGLRf*P%Cl9vo/q=C%Jg K< #ߘT4 g SnNN.]wrܻT4+zՖ &[q~입1 JD,8؏L)jM퇛x?S?z>~2γl&@r?:v>fn[xώ^{mʪb8|0,lł4Krp = /@͆>OҥKtΝSs^xie| )!ɟgO6|+-[8xV Co}U{-srx,QN>6bK],\kj…vz}*>`/]rn7Bp5g?:7{?\~rw jZ&ckBTM1~Qs>g&D)Ecr7%c .lZOk"g@`o PEqƬ7\`K+[w rĦbupaŰ-XzV?U$[rӒgj0w2g=V[94c#KZv}?Z{!5iɢNЀH) "@/ .j(ݙs)()l^o87qau6m7 'v$SDs!gΜskۋ]{*u[4g朽x߳o.1 rɀ<2l7'G9,Ab105̶R#cRJsq@X|+U֜72l^3.//ZnMexG-L5l6g)Z7 wV, W@V΀8KYr{aB9h@WH5TV2Za GhHyg5)JusJ~#ummkaTx@A#Kͤa.U|)}!IL+pVL55HiN`Mf3WyH?ԣG^HVYmmKhyK888k2b6ybZM1jjԿnOnfb̲Xgx&$NiPag~(+yV(Amy{KNp1;;Ԣ +}=r"TPXhmC1lk*xPM*:gޅ`heQ /r@YbrA)sF )8cea5h=)͗@' Wfig}?[h @c"FJ^r;\^\^{g5bgގ6;l.qy~G!ŠQkhEDpS |LR2(FxT |FkKAK ^= q||ln|PH`A+1D Yz1؈f{j "EiX(h9dJ Ҭ7Y[åVr`ZҾ1$]Ve,oUzW #8*0 "(ŮyvӄiNHPӹh3>@Z*z{D|iMN0#iBY4:Lzͭ,!4%^yL6{-5 s YM(i{"Q6l5U4@9v=W2!hJyO/)MUma$V0smRűg/GԜZi;u+g6<]Ҥ&pLΣ4%HjW+W! ob&v;ixk u5cD[3KG.5i(e!3AOqpErS2~egBRePGY {z`imUϺ& r1`UBjIm,Am9',@5giH 0.E6ob/59`Ez>OaV/TFVⰶ %!ƨ1"qS٠jF{n؛1TlDb0 `1fH nuC\6vBC#`͇BY/N]ף֊v iE6V E!AdL̐ddQ!f)m$T^k̠&V8x:_/Ұhn(ɶ*ŝв6K˰Zk?s_sWX0Aqk0*)jqD{1G@eذ¨^_-nR]X p4r2g)lHiB >=1RwMءmƝDX[ M!夃D稌}#h4s@ 1_Rհ-9;A tIE،M>RI W[K B)pDz\OƹZjb&/}D0CȹK6-PJ`#"t!!l }$G%+ l\ nkոY܊&kgrԔ5{T!Qrz|yF;g̓;},JDM%AЅV56,2kmk298"/yO!q{qϡԖkiZm4Z2׊ps~ѧη? m?<9??Ow]w2AkWJk4kMNZ7phGw_W~tHr'ˀEo޼O+7&~7M>c_oFţfc[{hgx/o޼I7nk?{/2{&c'N­[yN>6.o:Wҫow?tW1!;j<upym:ÓG|>9p N\)R!繶V%x!kΡw~LuCD"w9 Шt΁:(ײ|kIRR4G2L&Cنhְ1ѣM@;~Lz sI' Z ?=*4/Nb4e?i|4$-k,[ @BT#A.f Lfj4AVгÜGX>g\4Pf䖬 RC%f`}TNdA$6]"g$)]O qRB=v98k =&kr" p- PsO5L}~FKwZe]9ԬP ͤ8閮VZR+ۍnN;d/ Ui邽B5A; $(EQ Ɯ0#%~c ]x{\u`R9k#x±uV!LӬcrJR@NIi!iuX:7:W _1oX V.w8<\[~B# YlkgZjLzE:{ rkk Ci Rsi5,@g 6>TV(PvRѪ3C) Ty=6@`0VP^sH5) I FmU]ه_?]OO]w_t/m&=-o^}ɉ{?<~w s͛71(n߾-K =">s#MHNɟ D$ݼ޺qC|#œ['|֩ pzz7?4[(SsrV灣wy?+纁6!}zUwpQw ""9Һ;^rRD%SciQ)n.r9h :GrΆcWC=ē^DkkLܜVx>D8 am }uU&8<3 <(B·CU0u*( s@bxx Tvm<,78Z/+G -Lh(BȾ& dFrǺH$&4F zS:M\K(f-ʠ.~&̊uWIV#0GT@vhV ĶM{4A* : "g%Q, If6Dv H)iH4~p>Z pAhUb0h G{))V4c2$) Qx^{ ,fyFm 0nOl&YBs^Z=ׯ !?y:\_k|iNuR7~_owz3 ,߼y߸q*`RRPg#)Ǜ/ׯ_۷oy?x}FX"pv{nt'o-jin?2 pݺqCNŷ>M#ʗ~_ٞP . ߻w/[+gs8_/xtSΉw!vV%CܱHkgD`fԡ'…r=Yx)?R{IK\F.Gr.EQtJK$|A#!Z 88!QfO/&{0Q稩ZS PjhVz}Άz"7z,>?\,H~@K33c] \D%U-0 TCxGM\=i!ٴY .v`LRNCnw]Ĝf{+8O z[>#w\n[~BV [)EsٚjsZAn7hM0#G*Azn03|\oMsܨ{Zf1*Y!m;0KeP}Z,Kr *v+.ŀۿ6(ūˊwRM=8CTB)MЬx)h/1ƺRƺJUI'~cbVlxGp1"t|萫6Bs)$+5ƣU~iN"~ME [!csnnΔ\Qb4`v}@e) {Ee՗XJEiΖ66PRi3u-h}{# gZ);4TL_P-`]?f`2椠 gY4꿃nHp' E2 U yt4m4urTN>{SM߇0 }px|4N=f͠^%'+AZ'J+<y!;:ܿ{գc0x_lrʆ]byD2NӌgHӄ"UU \qWUR?d&AŮJt]R88X+h|xC [XJ@7lMKS*Tr3eI&bvvHSv,vX[T -V`7-Y6)& 2u.:lPxȩ`Nl-#p]^&*1%f?pX(GT0tImi}94+"_FI=kQlm2 nEkCrI&An_h.Z(8xMԘqCľ0d5$SNZB"M!>&Rpq}v___wɃ#z8H>ԍ?ş;~|g/旾4≿~ܾ}Oq7nvƍrЭ[iEǾ_룀97x 7oޑ_|7#M-POzڟ \֤ЅJɉ;{^x}AցouKp{gxR3+Ƀ_y>0_:v+7׿W^ov?S?<|v5xa {FD9iTHigu&R WLp+j,E47q^:UT +cob=0 =qpD8XyQo"Ыk9k4!4''t]C_ٽdQ+E)K=0n /ta5`!ٖ Y"m/Zz X$7dk6,X6X1PSjX]c&iRˀF/v{Op! $6"e\x oaf7t[BҦI} MѸUױCNٚjoyv_ޮKά Ϙ.QU{p]+ߟ S-9磑~XT)WNuoTdY!` G!nw!ILF$M@6 DC#kmZC!ΩsBHnܝ7{?wo^om;ob}=n޼~{7|3;>x^ϧ'?nΡOgCx%gj}ofGj=rtBJk-G}O""9|*Y}_OKIBzޒ[n-O999Sk5Z?g%:/~LO'ހk5''Dmmݛo7y7מ7ʗ^}M~7S7nг¿vLGNzd3?}s3/?Ã+OppIv\\C(n9\J QHTs漏i$JDDk HW\S!v繍|t;oT&a/""ZQ`p_5" LpLb"عHL]ԛZ+脀 ~$.4m U{.//Ԩ?^%rVPόHlD DŶ[d{}RIk4{-yLiBi&F%3L-R1;`$ 8b:TJ1t*ߵƴ5%)S s>BB^et <4 Պkae^g4 bЯc0²P d*wAD*#ͧOkۜVCb:l-q6Rc^+pSU&{o]ߣUj8fK=xʎ-v ϝk wATQ<_6tH æ̒|I9zE.Y.AQ:\wt񭋻ܷWo%~08/o.7oޤ{oQp~ s7Wa7O}^?Lw[wW_]䓟k[?hA޿3aS~{e;zA?O~L2n>kK@?Sm o-i}{ whܹ#߀ }p޽[YNX/ݫ2<}FB||,Q~~Ճ~ux@.| C~aɹDnq%x/<bv:1{GD@B4P\jQih~9Kj$P#"nyj$XDrKwD+{@"]W,s4i:d>:5cQI/^ЛB}WoSJz%oחLAXta2r4M@ŠoFms6-#K,[6MibdQ6ZkACki0mA#KT#?yc9jcPwO BP9~hE-Dc;0г~6r)%8Br-IԻ֙2N%Tوn}H=v lfPQ%=+(|@ZEI!4;jbMs =NHb8w<yNHU>Dm@6nyrQ Q3gJVQJjcW Z)iF.ڜImlaP%Ɯ #=s ׇ;5+Y*1.Cث*TsI8:T%D6stP! pc0ЊfVg;x-ȡnm ؑDK3N}ߡ 6'Ѧ=eݔy%%Zlwh'ۊ٢`ã#^GWkh(}מ| ,Ms@懕CF !tV|C(¶1r_^cHCJIp!heYְWr•Nj7A8aԁ AT{WzY'.:ZKГ9P120HiV9y?=6զݖ閝iLAOyRnb'*sVCn5~BשӎsVjNJ1Ck4)855#劒Q-hC7hT-QI5Ldk!c2Z첩w1t((!֬%ÇJfbt{sn8JΛRme׮[|!"||p{f{,X7.x޾};__yݖWz啟_v"VwqEo_?޿߿ۼ<7ӿyxH /ЍG[n 6{_<>??7 ˭[DW^LfqC|{S7n]}pM:;k/իtO;7n~I3ޏ϶?~飮nPK\k=HsNj答߿y&:p͈ȵFIiׯcjc蓫SN Ef:wpС2p!4"FwH'I(2 #FPpLV UTf"creR 1"jemq.MYGNslۖ5 O_^W5:m #00Um_DL Gb(y͢sTvDgkm p.(&>v&5ʅnقJ 58rI{Ij@9nn ARˌ4+BDc ZӰki9$pyIMZEhR/: v C8OʛG.\-\E9y<|Q,(̃@Kec7 p&V8r@,ME?kR,XJu yGCPmho3hʁWAzv`K-n0iΞcppJM:b+*}KؙE:JJЯNT+Y}hnQJQz;ёf6Պ9圱wn{9)8RJ "ZS{3WW$4vN)2F1=S ' NER1;ɆD_BofT`j=&n.uXupݠf% x[Ll^Ymw۝nFTm{2m^6t@JJp~hRB1٣#vjuHӴou]jn/z豑 اy6ߝGKEW]ywP[}sI;8zݷ>mr;wgl_e\Nsw7<ڵk8zHng^@=;{yr>lqPvw}6iG[O_G5ו[ IDAT>G=[.? z:=m(oOݸ!nޤ^{?8w}Nԍ{󐛧^^8{# '<ݿ;ҽˈr#8fcj6_c`f"K>|ooz|ҁG(2CĖ\@ Jp֙7Ps\7@6gB͔ :@-G2QĮA@hF9$JrLhy.)FoFi֖l+e`ﶟhڂʥijb/'m6$Rc#4ЂKk_oRΫdj;as4WV5=kQ4"4)dC7C؁3NV" TmrVYUbcjq:}dh(R^vX;9*L5,#ZP ڈkWQUD! hH|U(GA ^DNh1)k0qͼ |tȶm֜4OppNp9|B_ՆuY 34z/c6P)aPU(*kr, a:C@Zts&[vE%]k]9M tN5vXAU8:<œgdJt3" 2j}POVX*nEZZ3.//Ztyt1 ޳QU[nǨyF#qfMtS UHSRvAH72!Y3ZRJ* 46z4G>Pr~#ԪCQZiB@9A8)!Y%1FĠѣC(a5^\18y 6@5r'e:!hെa5=s)3c`0NQyuSOL]|kXJuk9ix$,Sv;L݇)t}xX9"qr/b?<(A֚[)u]xu-U%޿'-뫃OwO}(Rj1bYkv/~Q;xEogh O7P^Wh_W^*8a?j['=c5rr·,gusGyÍqW^xJ7O^q/sw+>>蓫գwIA|OΥwMuW)U^lο=vy惫ne0 wI-m͂x@] *&Çp.VX݊_6)V] ϐjAgYx@) 4sdUV^ ,(8pp }nzU@o}=W lD"q8 ZPVռTٽJ0Nu -9YJxkL3F @QP;/#qNTRHUj ludHZe}&ug&F4m iD}]mO7O;tښ8BDp~q,a[Lk''Gy_SѵzhV=b1V脝4pI*- Xݹ4ncҼ1*?" 5쬒 }w}}+$X҄e4 8==UF/\ܺ)cq:=Aɚp8N/4P&6Z-%67O10fI®s EKhﲲ!cH)p42#+,*7{ Qzt_5S 4OӶGx [exV >/^zOݮ`E}Nk/V/8X҂iMd4A6'&1vq$YgZEpغ^zK3Mhq}}i O3&^qT`ab{4pp&=2EC3&ǜߍ;=A;p91geC Sj݆eU5,9(&3yl@E>6+XmvДϕa2΀@.zR6\zcɖrI.~Z+%2rM} TzM$^+X>2Rh&vyYk#gEdx@2t^ )tfY_g^ɔ=ml5ZwOM`Y b y "]0r@4@XHCz@ { Ժ+=U0cIJ[JXT@Dٻk'Ӝ+<^ Qq>8C fi[DŅ$WW?"8jZQ\p2)O4]ee~-DN6Ijh͟Cl=8UiaEbҸV@w{ka9dMƜX_}AmJ9Ym2bY&X!fܙX=z( 奮6 ;D%cF{gpd ;@@[122 M\RAEgߘ4a6@L1%ɱ⬟SQc TtfBkeCj*d1u-~S)$Zب4|YXiP&1ߕm"]f9c8gujݫKV`-AZBMlLg*wԚl Y ƦTK0]ld@ۿ{zamf{ 9X" 4*+pLӠX"&:Q- ЀyV~ס%w] 5Ȭ5d4Z\qĒ*S'VwђJi `f}}ygs)ȶ`)Y7oJ( 0y jl+\P2<'0Tm]jqaf\P]T}.6mnb)"R+VJi8 ̋MBOx򪲯2h>sο{gs뭞~7sՂ׺FxؾDÇ/׾&Dϟ{%~j#ʣ'O7~+x׾x>xr_^T]o܁›~ })^K/`CK9&v~8 :qOb9pvN_ɏ/RIQJˮkL{Z7ȥD ,qo"!2;^(H(N肉OsZ1Z;%f^y01@ IY0E4h p=G,^X1}}m!r""CJa p``HZ l6Ԭ~e{j`IbP4B4ݣ'CD;+Ȱ.=8bJBlJa' )NS(ZhѸNתuDZ-CMCF^) =>o2/0)Xs0ԴiXOR EMnoiY8Y'wQpxc@W:= zQn]^ӛ@{8t7bB&Z GZlLIX{uOjo^H ֈ&6){HD>h!9D'aGXI8a<,sc"FehעxzܺuK*c,J] f’3ÀkLIoWjڧ9V6{,Zh=ZƼ:MUɥv1J`%溅@eQ6k[BI|FL[< [O`N&pG;gC})gQ auhfQkd-ֶCto-Zr.vI)H"M1%ߖ tiDp8x8]߃0iBeh}ݎ CKVV${.ǀd1& o{b=m=(4r($( [@,HHSB rS%6<; CpL !CUmUHXJ@(ֳS%M@"7c=![` %ScliWjj2ېb i,X%Fz +`]+04 66xu9n#YSO'[O^ bU&Qs g63A}dJߩjwV@OPUotڑ[Jc&Vc U=11n,b!!lh39 \;hJ0"9D ػq?"&\8͗dTK-%[݃EjXKAm{kZC! *p9LYvѷ=AW2eWHnoZR6LL ,i0G$Ei2Z-f 9G8\t݉vecv$M toS?1[kpP-sxEuIZSڶEGVrX&vz焮!9[ yt_9V|jc٘g%T !UCrT@DkTΚMN4oݳ2u5U4_Cـԃ "&Q]eP;b:ځ=P+eUqB eNX̋Ҍeɖl]7@@X۞O=¬!8*^GmRat4m [&({Dn;Trpѫ³vPQ=/E[9:HFR$֜y.R@jͨ)s.uz9O"}pN~M״3]~NJr(|Rj0Ih>DѢ.Ex|ٳWvS|?ySz䉍fÇgo~o}r+=~&5mR~wR'O҃?!?y] ]rV D]\ wDH-=c"mDh3Dy8WWp dT>V1mc5!<*H%a)3Gx2Lv&42N +gW`]sk!6qtxܼgT*$3grahR^2#6)e` #-iy!:}ߡi˵otmT,(33na&RJ}E*=Р \O4 aɋvKZȊꟅl =3v'{m=`niyv x41X~kAű5|lS[*S&v[NZrob5R 1eKmkeY9l\qx,FVaI`7z^~M$eƼ$-I&LiVj|fZ}˲P1X N&ab RjSNvz3UiYB)*)0*"b"rVJmǔj*M]@s0ZC]Kf<<+i_/_}r4S?= ͛TG04RCuLb`<?~eϞqp;G u9 ;֯ޫ{ܿ_Ϭx==y<?}¿QQOh| @B+8s>A_{e'k{>=jw>[{}w~ܛ} M;OGO! 9Z0]G[Q]\>s|yڿywǓcG|}ԓ ;GyPuZtEjY횸qT8',@&()T4"sZ+; R*y_2RFbDGQUOBg2G&jJBUw]B N$W"*,Lځb<8[ٳ3\:ٴO\}E.a"t&!}~¿JKWQ?&e (22&w+UB7yeDtu&lFHC!W TeTI`B& 4&j_Y.j:@D/8a+n=tžxzP1*<[a>YrgpdA3EKL \< U\B@$hb0j9UVPm7=]+T4 v8W `:4H ]YUlR Ҭ,27Mwb٘& ZҾ4նJ[*!^p m`U'Zš݊,)58HEYƤџ#$J8攠~f4g-GUb={e&Q+ՒGk;2*;-®R~wv82* EPHJ ~眆8eeóė4,ŀ]]X񻃈UaV}ЄX"S: >h} `}* 7Y?7Y vGG R 8 aZ8dߛRGT'VVN,-1/ ,*mb8Ĩ5 =RI*3%͈]k2Y/#鐤~4p}},<.Q4by@&|c@)xDl"J͸OV,(6eRs؟1/ j<1S|03nmuU"6ʛ)@ZCl ƌ,JRVe*;_kDiJ1řd7Wx1iG0%BUyՄy:c{ԬUL]aV5 #&0 N;x-?=a&St [dj ;wd*!BI(c6;Jrjll!@̯h٭XRAdRY2)c#ge˒$8L:W_KsT0B MhŘ}[i<̹L΃Slwz?B|e ٳw~Ch>vby4XkI.xvϓ`9?|_>~{_~y}?V}>>}?-|>җ/~q_ÿ5ǁ= \wO]ɻ@}{>zSƒx왼;xo=z/۹YjbGgG(VYW ݧ⋫sxcW>}}[O>??]w74v>updIiYÜZa)UqT}pd"W ѵ4HMqk@ 䜶 zJ0o^r4kT1?/;}ن뵾mtRJ5ƸNOX?lrzm+jI۪}zcA1-az7*EHvjXDx&as脫*3( ;Hj]r ZJ!EX;8{A ղery^^ՒڦE)v7>o ps=_pӄ*93{Y*Ky|?co_W|?rx~;[DTz>Oߗ/^[wI_?>y k_Bh%傲,&&)ÇO¡uvre}tq^(''yןR<v[_ۋs^Qw{ &9WEb31z:rDRՈpQ6y~ I2, 'I5(T{w"PgT\WJ;$baz\'<3A2]G-R̸A!FБy"rG+]UX1?LjñI-Vӽ*INMoulú ?:i]ARa-sjM\oJINkP0U>6aL&8 v!_#AMqH0OF@"*<. ._%Rt"c'enI!2X0 KQ)_vXFikI*yCf娖4aP~d0ab)7NkIsR K6PuXRﵔBTu@`8rN?l9y*w"dQhF#N6XG@*$/B 〒34q!+JQ5zIb@JL6 @*PIK`#U^f``4 IA UT&#ux#8P!y>U.,IY{ u2BD-Էi<1dW{N i!AdO&䜆P٠8 eMH;XŋkB6k,eD'G!蕹 ̚DBTXU"(Cqqvz I2' VxW/_9 @6Zn]z]a)ɘ8=*ZêXb U9M1 FRZ鳲'ψ<]|ь!n,[)jA*բC&b* jΨU"&7s* jfƴ$NM+VyÀ*E%(뵘$K-U0 ޣ+;McS5xv[jdSmykFNIT.sMEO9ZfNblo؞;w,33sYg8<+}RrgΝ7ޟ7ogyZ87:O~~;?rh7/}]wzz]qwg|WC*~>u?zXӧ>*kkx7Иo$䱩^j(>|Hdl{1^<_nt߾s?[}t=8I9|eJ1../il^~w(oI_ O&ڞ`>l~2d^e5k6UvR\eCI :A9L&kʦ8끍TH;ip8[Iv U])Ř `E?{ɘ4|A*/}^i鹘 +ڡVy1d:8]k$yɋijEY#,i1VJ׃ .)eiAg''mע=hķTe6N+MӚ"̮v-Sq ~eΛ͙ae*1$ R7c1ϖdhQn$MC|N4Ix!D" yPs""ʒJy1}ۂXCX^z@4OZ`Iרi{]Ӳ2LS8!vYSP1}3ylM$ޖ z~XOWjE$䤇k4ѳ#F-˂J0 xO!:ѶZMDi >\{aOkb&{[h2q9g]G%e,ӀS`Y/_hq8Z*CBXoi|3r}o?NvH)UT;;EJI^I"wDq)g~ϡ IDAT[oa6Otw,&[loMX;&~Tɒwdct VV_j5L-hdh/GlQKӉ9C"A r% baU0 Zh=P%6DK(kκ]k=ĦJz-{F  IA湬c["UJPj) & *F 4\tu(`8 Xt9ɔjc V+j`Tr&v k\-kRZeJۦ*˜;wݾ۝O1щ ;ع}N郜p*%;\.4n,#>\xc "\HNp,?#~s+:|P..c? A[oWMG|{w]^ʽ{?(I1fP#z %>2"{xOН ]sK| ݓǿu>_ۿ+`7Oz"Ts.r^\^J/WS 7t7WW7.vd/[o~8__;y.?4ei/z4ap5s±k/K華2X?9?;o<?pE'ϴJc)47 ] pQDJʵsZfp 2ZAUr  +SC"]_5^vfž# -[Y)1p;j`2dYlPq`Xp8d2 H4gjk9侔|0LPd%FLR1Bmg>"r)L 5ޠ${ .awovwns o>9}ut ?7 oxWWuE~vFZ.fe 'tzx+iѧ 3|glme/6Rɟ?}rLq?r>w|?9wAzMMSتYKktzf@U,t 2rٝޱo&qlmSଢ଼y=Kҫҹ4.iZSB9NSȒa D숸2D5Cfے-2g3g“Ґ w3c`wQОxN1 L ]SsM L= 4ChS)8FP`h !!M96C$H#סQB#S~Ψŷ>7=O j E0}ID,} kH(UZNJ!lD(Y'4gS圚3x9wVb0L1kTSetϊT$!V+Vޢj#Atj|0Ш4t L!qBzUB|:*=GSdɊ1m;,+aZaC <Һ9g1Ev3 bZ\%D)%,Aοڮ= GS0d@ d%*W9eXCďUT;i.s~%BGԙ#MI;XyA-Rh=x Y3 jRx'/'Ghͪ-}V F 'D5Pt]?jTU4 #BȂA5ef[T(J1<FDhDJF ,aw z^e!RF#ta@3kr\íuZ((*How1cDZ6 NrhC\QSGgCy`朗bR1MAIC5$kW3`&Nhu*}g%=hwhWV ™AdΈA+0kD\ɿ{ʌ>@.پJMu)CA?8)PKPZҡRuF\1!1+HO0zJˤ4)c:scZ2K`9!,ﮖ{wa2ۆȜ͍g?~1;;Fsǐ (eMYf~FO3Qm*b 7a:`3s1*R` M$gƭ96wH; s#=[+ ?l҂ gEQA)6Txm3D撇kU >t/bd1@Q1QtJ{dFf mA~/;b+9j!hX !"f { bAnp2A)Q¶SJ[I1iFRF=󙄵gidSʈ(z2f%+e9%,K X&_Yǒ'((dΌ΀#2x':>E@+Rq3O)a_Xsuv4 Lf?Рu( bjLhU%8FqP-FiIDzM- |Q %)@L"h-fksL'3!c2zYVƢ;i9#EVcEYjwHI M$!d|CMcN蠓F]xĘSDl4 E:p:%kc5je%s]+IiH Rl2:з-J)u||r,\V(ՑY:%r,Ayh):q^%bm5@c9,1mI BNr DťAorLi ::x_+d8:XIσ/ ܻ{9gqWR A'eY*VrlRVXw=@|OYmQ¤"GYS YtMb@Z(242gs0RV` Avh˦Nfw83(v}DM+(ʵ ,1cDYբu4z6 VmmX {u%dΊQ8+G$ NΌz"zchdƔ(RvAVjb6DU  M,ѸG6<91Q˜ Ba\"=n T3c\bF 0bZvU֚{'tdakж^C[ YQ JQ2[d}/0 n+` '91E$vpM1u$WD:u@$3(12 sD6|47D3QOY,nA7m܏hC껶}mkR9]!!b:]۴8#8i^M>t}lgɠ(e[lY ju?__|ss|J)_7h;_~'>Qbai|/w_rSܼxB.~;_{kCM"Vy>]þg2}ѕϿl;f{[[_vʹ(lxr*`k &Y* N]߼efeZ{'޺i5zO~?`/f#ENOίQ·w^|q;wwՐ`.=FnҺv:P=Hƶ0wTN}aNNQtXMʵ҇[)6syxͫ捲4 \p\1}&%Ua9{ΖLT29&[\7xL'c*clMPa4ɒC4Y3(F`FFca-a fEm@`?8::RjxD\l:dR]z:?xpF 2җL\YVc4 uyqUA)Q`]-YmٲIAP8g40Iې JYt"*,C-]lg,NVLBD'òuc@i;$i`0@[C$Hi 9P:t:EQxA"C2366QM'0J*4m$,C0<4^`u=<+qڅK Ţ#7PTsҔ1bj0j%k<^BJ_ >a\l׿q7^?^k0W_Zsk+zQF@t88إ]v>@իv=ڹrs&5H+W̳{kgIO7aMOswf-I}+EiSwZuw^k'-/LjOvcO>vF|~/ݾMG}uu3?}Ua=gK9vl6jḫ*uxߕk~ٵ]٤۸rb'9mdffjzb v>μO]G>˦(kG7;- !\p>'JvV k1fg21`Ț` m1o"CD0{O``H9ߌDA7B*Y 415g#R8l#yV_ p҂b}oOff~dTL#B!X EPX6}H1KFKH#T v?~NO g.nC18:+NIbW }Љ j \UNnrҸfŻz_Hω!ZR;qFU Eo2b}muLSL&S+pg֩ `NOOqmdqjFA͘(ZHa. R 34cVtI=Q)DQUBcX.WC1Kɗ !{ih4^$4m95"+d̈;#f2,F f1g?A7PCG:' ycߡkѵ1']M &),)%Ro23!L"y՜V( s0bFh9hGZ knq^^+ Ēx7:4BA%s6Rf%1rb/Mh#gTuk$)u:(Jўy4V IDATFdu['1mPWw軠nv 9ȂElKe){6uʽ(uO!DtCMm}XJ]{W* :9Ó"1CgmP8:\-I\\ٓ5x/Q5y0gTwڤ R vu逶,;cC]%"Ґ[A(JG]+F N"љ = 0Zq@8C2- ; ㊪Y[(:sZ*+K_e':岞}U[WMj69<(תF q\,b +oQ$ۗmyy2|?x3|+KD81[Mۭ/fWOm;/}W+K%omnoor/|,VUȄ[t:?u3yN< O {@fG5fo2?8 8"8ݵ=My;m1M>\l\Y\sJ=zej[ .ޞ2v~O1 n!f~j7Iwŋ&݄___>={z8/80;(ycq357M"Y:{o:C_vPjOVX!L˜2y SSUQ.Rřj?9sL ϙ-gqGdܺvdd9Kg X""x! 08ҠodjQȏm>oʒ8,FA԰<8}+]UG[7>,g@m@!0Dtj|bjlw2茣 g)\N}!IԛB_!`Cdb>+5O--NkC Mcd!.%)+|FU#EA4rJh+1IQib#RF2yUYszыu}f R@ k90& E%`k*[df,Xј]!Rf<|mӫhmx /HJ[^N FI@B1H 8`r29XkPMg0̘L$Ntemvl۶h.z)E:cfkC! I+r%TkA$bR r+K${Je0V4"W H1k81΀ddޭV*}J51y6EkaNmSL(Q 9DE!Hg]& "dOL3$VVќFIc%`6=ʲ#Adi`JɄQ9jfLfYGs G-gfilۦBգzN\NL&j%eZIm64\E!hva.PI_ 4 KHde8D2`i CFB&!1c:tAda5YXTA M%Q,w 9J]! ^)Dfg£~CJΧF4MC@uc>te;q-FbR#(,c6NnՀk0i{J4F@R fOh[1!S@y t ĀMWjKL Ry u] kct&I ʹh:KL֏qÑa4U^e)Β3X}=!w\BNY2, ]jvq:$Xa9S&D8HR#wrMhM1ƖكMCd:2BoV XC1mNۜާt=ge>VUU慠٪\z{?K}/y]qr_uz޽ 3O!܇p 'ާoSq7.`.7^c\{)<]Pya ׯ}IY6P@5ҹoi_s{Gˇhz~^./_X߸|F| ߞ?SvkUa*5_A|9Gk3iWL w3QJzzўL}Y[Ln{W .˭T"J[%3 s{>y_EaxCƹ T k95e9%BSJ9Yk-yJ#g̚q~3,kl PŌl!T31ޝCD>M"@&[``QGh ?C16 iM@%'h0%V |7]|5fJ?e=ny͜]BCGɚS%4:@6> s"^^' }Qn28I}NP0$9%<CCG LZ2t rЩ5gr,0N00N00N1NDߔU1NGVno޽X.WL@~]B6Ry9A,DdE40F4kfpE6 hͪb2u(yiT6*r&&BY =7d` 8A<D×1HbPԁr@Uժk"!H-s%1cEss }C^\ýÊv}'*BX_[[[[B/S&U K6 ^ rN1 Eһq4 s`4@EQcf83k$/gu {9PfsʨBqJ&L'3Su;W˕ F\c+W`jѵBXHmzmʲС\ヹLL3hz(q ֢btSxi#5ꕍPuW0oB7m 0Qǭ ,AbJa е+5e{SDwqnܿE)eG*IFC,\Gh6!i Ό&ؒWh4bz5bD7w {Delt צ&7ws9',s3%cκcLi6M9c9$C]3Sp(UU;޻IQT[eQnWdfwlm+|1[>狪4woo_/=?~]w]rͯ?L`wٟk>z~2{dt=3_ؼSyZ.gօǞl=A_X= ~˃iocn*+q8G=sCX߶Y0y5>1F}4||vvv]\ 홏Ef?C?ab+f!E.l&)~~זEz=:7HiώYKk2" y| 6ϞMdJ#mjhC2bYV욳dwbQ5rbt]RM'~úJ2 S$Ŗ' B߉g #%#,r9I CDvAFkZ52Wĸ B&P1) 1N!1b*XX)݈ȊSAYM.vh꿞00΅XUJz&4+#r,3ݬ.{0o=ȉ>سpP0 UVbhq$LStCU'ِۢ:͵lD53qBFChf-*CQ;RlSœ>Ihzlmo %6%O2CPA R49IAuP[02GUM#n۶(lupdI@vǜ7q@]VAѺlt_UG9cX`k,4HP#Js Q#k50LwYc4H-%u&aTL2q&'%,AR+( R4#ha%]|O2xu#h.b ]Jp@\lACK{Y̦SL3B2`J0x rIAZAzuy5V^d?tΊ ,YU;3T N2ĝ8 7ls5f<lff!7Gc ;r:8eJB7(I R9hM{ 墬%Bda!d1J~w8ꢨ~om}s_F㝧.yo|''?mן%m^x˗/k׮G?okү>w~ecu=}_]t]OMz=4}Gil[;Ƈ>zWիWϼnef|2o{]7\իgз<=B#_ɷWn~gqE ڵkۣ+Wtpy7_M͛{{{m#VŹ)obK[V)6 'ݴ}S7lB^}/tj]>w~&]5wrC?dϽ/=?xM7 hfuXqot򆏓 p"Vosג_\Yxn߶'[ )Ns{82,LlbbD̚0%6dsɤL-,gb:#AC74F<0J0,~N[AEX߄uc3dFAÛ?z ydf5aɢ8mD2STsZe1 ݖ (5DmGêY [p,]J3lrh@( ҂SE5%pJ~Ač1ȚZWLr+dq鱝k^g>[/[[߇+[O|{U޾Zf?|oޏWݍ7?>Wַֿ(wz/m'0rc5ׯWL[[dR 7W?f^8K\2|FpxQFI,_!3:88]&pv C=vqK7n`oܼIWq/~y?zLkv]͏|zZI}.Mts>ǼfZVGqR!zwUL)ߛD7}1ԍ|G"}]gwg4s?x4x muӧoH_.xy׆}l͞L/UiWv6zN{7ާO;~ovK4qt^D7?RmYMAĄa68]k&?#Pj3sdRc6R (k²$)Y610MQו"a\CMUq61?)1D$}3gH~hc,rȊYDSZuƏh1zzv Pd@h}עm T/ٵ=8 6E.8::T!{A|RGU(li/%_81H+ 1%?QQ]: IDAT!s/JV&K獢ꔙPIbFFREb;5B|2H/`]BH# lYȱbC/رlpNցHh%FdiDa6Y(D4rh gTU)a: \QX"YKĄhwJ7#3 &IWv}@H }|1hHMuo'm[y};q- lb38ovC|Lr߄8:pN5I5d(Gʦh E1jĪW'VwXX&>'XoeXvRY Fdj6$uvkXF ѱZj)yɠ1rP9aiEc5d y뜳(qrEዺ(&:N}hqEQTkOnfB0|ȌE>(ʧwדtvq3ym|'}tɩ]mw޼I7Ժqܟ;gox{mgO_/\g13NJܚL66&rV:__?ڏ?|޽/) 5NoY2nc:!o#;PfLc@=5>OP-13ڵkWͥMs  .n8W䚂bݳ'_8LWڪ[Or~fkw11E4Χq>/` ]_I>iN/|]\MܻYv]aگs}tO`3C4ғ,4K,)%jT%6UVT\6nrd9N2]BEEɑbk:.F#HEQ4p L̏IYNIf}9{vܼz5buUk?~.iLh3$\3n˗/sŵ+W= Χ5ںu}c+]ZpޯՖ> w\ǥmZ"_*[3LLjS h@"_*)Se @j1U_!ЕrRhT>F袸7$9̜bD$ZDYJ)qlnxJ~fC:^#]3u ehXSG}\2sFr3Zo0~nuoH:G"B$i1"ȿkE \5=&O](ou>mrC5N*JXX/D\Hg"z Shp\xR,X2B(NcJZs0sʦ3PJh2cOJY#$)]kS0oLh8&GhيuR\J8|X HKYG@:6| Mkd`g@ٲ=aVFCE $@ok:fu=cevlt(O9+a4Dde0.seG:PJH8QUYϮZ*I3R.w!)d#Fg9 1 0TvHfFE=;>x)DXE! 2%@N%m)%QjOnnlR h˜H䦑2$r`!Kg=^c'% Čn<# $x H)1&>-Οd4mZ(RpmuEJĨJF1m1M1903r(n[װuԻfb9RoEJTE DTUv$x 3.8jm-ʬ u&ˆ.tJFlznIlBĬn[FVeQ~m4Z ݺѭ|f. 5=w)S49.Ӫou (xK%17?( H؄3 X8} u{eY!RB]OuGF`-3 MS0%anRBQi;e'R1bcn #RfDe+)Epݶm>GfNJAUj & 0Lyc-f}mGdC-23s"J^Jt h0@n6|@~<2Tp&QY#(G69X.[0kZ~)6)>IjSDK<޹. t*HI)P#I"wD@" v) rRHI07#)J Aj<@YPhSou  `<|~_)SMemZ4=ڽ{O_/}QBO>)1u+۰ BcEPJ'|wRJ.]Zgӣo5/w}.ssx o0y9Y~K]R;X;qZZ+ׯRw]wȯb.|Eyknp& 5ӣml֗Cu"mc `/~F:r|̮;=GtK}A-sp+{7QZr2ݺ%/?qp.5'F.ZTZH Z8Es}d}ݯe +?PϏC;n뽽T-ܤ!ž~X]?9R/T9f46N*!J‘*DpQRJD>B#XJ EJ2 UQDRZB&B AQHOIJB!HJʁPZ?` cTYevzA9p1cD.74Cč!n)M=E=YsKԳ(ml$❃hh3i!sb{.5g e_c  $FCp,+bPUM! :xc46rtC1m4p0ḇ+)!Є5#*rC?s6&GĔN1ilmttpYOԼ>u`/\|f( fx?_^u"+9TZ@4 :9A(4;e:v`6kR9r_FFb1PR#1$4M?)zHxz ZD2(i=żFwN] 0Y]C+_/s#=~ {)pHBVPLI)%[< : )PQRC8 >BplhLY)hApMUZi:= u=[=sY B{{HD[Ӻf[TO͛/x'ħ?Ur TJwح p̧O]~{vm)Ȧl)0!"?^^gvze=Rf.Yv [Y#?貺*.] @\[_O'o_0c]wp9x)53O? *Edݛ\N_·+[ƓO>-lFS"++tyo1FkO]++qm*-q,^ZnQu} //Ca˷ZG~џY"oތQ/VqzʕKg_s#pJUg|X|j}+WSOFsi bQ E;j*+%PNJ)J2IEIJHBrEhR㵟)hHRJ$ -}J)|B( "6RB T). cO`mjxv8TvH`>{3uEϒuNSIPbñ :.2$#%lGw41vC;ZD 57HB$XۡwG(UYAS=z=,*K5YWUB9nN3RYߓК]2;ǻаIQ ʔzLx(Bh lB),FiP\L'dtѨՀm Hb:Ba0c<7LYf׺ pip|gMp8eW^%a-m!6%XaUiP1! mcSh<LjSYQy4B=ViŔtDl"C@ >.\uEYf7>)"7Y'ksh4N!!hV6S0E`:b17gV׈Zg]8!?kzww-7m[32޻||x>c%Ȍfy<чc%$1KsSlY/5fSF);eD%n#<\Qk"~t32=_Hv휋J#"J Έ#7 yfD#99+LfQy]r swJ Dmq9 ,1n؁UJFad33\{Tk$Aʹ)1 d3GyVm?]( ?l[FFE d<:M. Qw-,kϏH21%>cbT.rJ<,s#x2 #ڶ9z4T ^X@֢nEqy{!Symi@J}:KXSR(|Xdu塪ӱg@v_:Ø8f]a Y.2'̅!r.D<,b[$R򁒖SCH!1NMkYdЪiSLmsj SUsǩ@Jbu0F7@ΡmX'4 *!JUN&DtP!SJl7F ^xp4?pQ] (qÝ{疞{'ɟgHמ/?}Y`P?f4gF8)ȏg>o|{U5x( Ch׌1% 2\](^|͏?@]|Y_x1nll66qe|!issS,g ikk+=B|K\R~n}}=u!lø vi6~`I" lw7m\f㏋Eq} xs!2n}Vx">7OҫzGȹs7OkO_V?(t2ƍK+t:$[oH7.­[;?!-]k=>3.-ZY${_~޺tI-{ YPb0%Lg!eMUJh &|@c CUZB< Fr㜅R\ K1GQ1ΘCqIZ)!%ء.;J9mIbFT7$XoQ9(!(6E' _ , .32֬_H)n *yR-ʅ(7}ӐO(-#PH5qT 0Z!uVs 9'[bw":FU(1PO)g*(e&(q4E}NP6s!hFQ̯uƘ:^sճ∑ m1k?w33]a4 z{]ӧt:1l:%!=TjQ.Cs2`0PޖĴҪd"ʢBgSLu6)A*O[kB 790x$J% C s:;kbZdm3U`VE|<.ȝd&sGCHYG& i|>vw4#cyh.4E#tmvCm Hװăn[5.1hm 4\ .!$ʲFSBKst L9B{),F1p"9ZI-C~aB ό2p>>؃50Zdf:ٛ?scJc,TLnfSL$ZgÝ7^x9Hfϟӧy{<v-J\Mo_?8?wj0,Ԣ TBvN۶;ٽM?#OO㟚?5_WiuuUlnnW~{|?-]upNn=<ؿm\U Ʀ;gg[o}^P헷]xfVW ++'oޤ_!㎽ `|Oq+;vL:vҌdzBv}c>kSsØ6lC8>y9"{7-L c|`>R )rR Ed{lU[$`8d\us2MmG][ܛN10N.M&pa:;.(:D预β`S7!G2c IDAT[nC (9|rQ0K"lͳfN 3Z&YUŁ,`m.;R)rLtnS 3tɾFe!7Y h$>")S;=6!ڮY]FR܌+AlcilWc 8{prFYʊ60=v|ZQZ:(~^3`g<# MF{kYVGEc I0Y%L!A"Fa]["{3F!( Bbc(T锑ζmat:h`:Bi1v_A _+kchSE(e<٦lpHEI䡔A6ڝO1nAb-e7UYBBY q;d $XD!H!:Pǀ Em)-Sֹ#PJkYTT1I(J)R|vkwsmSOx7oyg/8}W_}uЃRpXmmx;9ab_=wwK*~Ξwt칋ƘoP RJ㭿ۺvit7.x7>xaccTR_rk+=K@mSwf]fRrnn)Hɔ|}z+_ʋO=e\VW〘ܺEյc"PC6#49n׾}wߌK۫+<&@,<0%3B+hto@X؈<݅sئE؎05q3X^67e.@n_ߎYWWW9j݅N)ĝW & nё9/ʦ_rCEl+lS+]@G7oenݢ&=~ƂZ4l[ߌnGJu1$kcBʹ=だr16Q8($ )rCSŔ*D2E R ')KɺS)()iAj)N1E"Q0W*N!fg]d }Sm qX=/Ђj7a㛋t]|>~|_'_׻vz&Qqm`t [W'v3 \tޓ^D 2O`;{D>֛ M; ъQ1B ]U(kRv C\heE]@pi436zL&ΡJv_;m9=9FQ ;Wfbn2JC+iQVBdcgGp,Q%|F1@)<gzn4) k-#!L;QZCf,?3mto c-CSh!rc3%Q8cX/, 29pQ"SRa2DyF*LHftّD;B{Ã^' &3h2 Yۦ%;neQ"~>WGc<1ETgt6CQS`hL3$th12.צ0JkMo$y;3Z ¶ ch絠E& Ѩ }yڔ+HJ1 %Sz٩Tqq2̦@`F~x ֑&;;6Y8w{GCMbq/ TvOII$5M}e%u!GιԵ]$ Cڶ>ߊ8Ν)ZHRn0?Ak B;_Wo7&[[hq}> ߙk"quUF>saXUsRɻ@H)xg־rG;SG?=fOV|xaT=Q%ݏpeDbZc=T[R/TJЅT=)Z ʐ'"}R+K5GB,HR4rcBK%NT@B$QTC)a2j&h,<%Qk R")#mBFuN2>zSBR|s7l°f kl "3-7Bd۶mo6mGbbbcza e:L%M#uCbJH3h6pud=@DhG#6"g}TaJ^k;l9(Qbj0L1` G9h{7`r6&;!k")j Z޳ e, {g;Z5/@hf $~Q,`͹{ PvD6 !nlA,qc*HBJYV3-SQ%(̎"ōe3(ZȌ)鼝4|1da~5G?IiRq{)$, $&'ֺ]Q;kk&ݺ RPFý{[^amF3VϏGӺfh[/ef3{$Loyw^};m k< zjuuUwB7ϫBC }DR;f/Oz[{/ް_/M~rpg ~W_xfa=цf;;w^h7w 9 Q0w&ɛO'^zٗ{On'&/%Zy)qJVD 991ǹ"G= Nf"} 帾A6._V{M^{#}bZHkŴq%c3HDB+KKiK =zLY]uXnښ̲/9n?l-&.]_• qz)4ԿD7xZ͛xw'*y~'µxw[|kޞ]T4tTR1JHI#䬍b$xm^EDI@RER $:IDRDi u*- RHY2B!E!HjRoMZxyKt1]@yA%D9Q̔cmf*;waIt蟧kF~-man(s/;15]`l /vD# D$ṖE.>$R9Z!"S6)h& lkUg y黒puj8h4|6 I'9.c}u鋦<ޜc6h\tAP˶-7:[F\ HnAv%oGFh}p<QvK(";6xҜrI·bV;ZrHEYɶ>(M6!Ⱥ`13 Xwl\@+!DQ汾BH(5XY]##L''\yWaQ Q̧Xs҄!: f({{{s9|e-{nΫ@ 6%ȓlveM o}-2kmL 2dF[|?ӺF[@H0eP59=ߓ 'ι<8`ֱ#紮a GR}$BPRq ()?R|<6c29؂8X^|?\b帊 b FARJc@ maFQpSz 4ehEQU:)uJľٳ/XWsI6xTlkk \zʊ"%>~M3Go~#R cΜ^OldJogG~/ƛ_o7ŋKƘ3gG4~| #{ GXyw_?OO8"ٕoC6П$߂P0q3vI_G5lnnrl./S8JJQj(yG؏xv8\|-[d".䓸z*~CB,˫tgkt&j@[ ^O%&mlmѥ/6׾W_-CI<~qqOD+ku,޹#yD}g+uMo=ooD$~5>ŋnUw_ɟ}4_ct 0jb_0Z)Vb07(úޝܘ *E&R *KBRb^H9!H9TRT !FR cT%ARJ1"AZ*3B  -&$$EE$QD(v0M6x8 uC:sSGgv[w>Mtmu?ٝq7tP{"v t<;<'!8\BmIeJyo{粦edOP5RvK&.٠%**(uV1N/p0"^l-ʧGbGGGhMSg"#(JdA\ y`ֶdXـ&hڶl<٧lc)AI%00*N% ,ʹlnlS4>f:]錒؀DktR H!YrcH Q%Q;4DЗ%XJPU FCEܜ\a[ndnb>iJ.r`VlDa:b2gEoZvG(`uǜ͘s Riya##LB`<$дL֬zyM5͡,I^ If:9ؾpfP V묛kuyB˚1:&vhy ^Y>;< )rlHkժA~"xS$|61DHF;Zc-Ln^S\K8B(θ!`yP=aXȍZQ~~NQ]{w3S=g%v>2xat׉.fD)yRwuΡ81a0(%Zs'Alm̪`c6jU!Q6tːMD*v`=v{ ?Huʄ RRJ%)JyDRB(HHI)ʢJڶGٝW^[8sZk;㑠z1s_WWd^m{_c}>{/4o+[EcKD(ƣ{~~7L.gsw~[+?8>$fU νwz]zƭ[pey֭>4:W_}Ϲ_ Z:i2Mqiq1% IDAT\z)q'/_A|Z=7_rΟ&|፰p#-deFBחߧ66BZ]kո2Q5]cUڢ+WbG[reEMwӄ6WWe+6ۋחhZXyJ˱6?C,+W3gRYqi}~ӟ._y?tahHo+W^h<.gu*+0m޹Xv4/D};,SҘOR3 !#%"DcBJI(@BFJ9b Kc$cIrHRQ)Iٻ|,g@vlN1hKE;{'lY#d|yy_{I.)c \)Gט؎=e#807!g<^l:Yt]le|R틡:M$ֳlVRˮm{#N7*2RP} :Xxzo5ݣ#vM3copxx#KdAGtwl4CD>Gp"x<eY֘`H)Fs0sPFQb1% HąܣC9Gh`b FX (i MYT–4D|O16 C a!϶mZOubs"G9,sp 9d-z34]BvXT0xڶID ΡX]bjّ&Ljι!>KN#Ѩqvݘ,huEY;I)ZsBYUKU>NSX4t"{$s<ȹKtΦmI>SRIeiL4yI#jѤs B"FEijDh>:<@T;|B&_*bD6E{d@gDN?-4͐uIIbWWW  UU[I,c@QȾ2 9 MLD2KoF2A 최gahA_d)ڊAJzw0fҊc1vk|hctk8sJi^3;ûoޮk_w7M{ǿY> Q'~J<~ %IND1W.}mҵ#ݳ.]β%C4ٷGGwn;jD?{k뗞NWնGs;GЬ>o֟g#yIs_ pƍupZ쪾xeo._f$ҝW a ^1;QiWhk عuw븮6wo =/?gD33]{y]vQ/d^]nqwgsKTT7k{a^ц}~+nk|r9pmtRnl( A 5D6zT) ɲ5T91Jclj1O!RD"ΔR(" AsdPuY06 $2-?f1PizSJI:XNژI{vЌE#R(p.K{XD&(I7ixpȵ4,E B|GPeNv 6k;$VʇIXAa2ՍF%|"殺Qj ;tޡZNNP#ɋk0y O"O[L >8߸.XXq|3Z#RBI{Py^C]Ø e)6(F#X߀RMK2tH%T@ Jqމ Xh~4g#,-/1 #)!/J8WiHB9aJVecuuU>W*DIT0{$<ڦMMBغ$c.:E8},"MčÇ $-(G#b5)WO{pHq bӵPBB62. 1AR`Q LK5fmv-Ap eZ|Z+'3dE4E%7J71*KeYw^kO!/r̎gB :Nf@ :FX9U2HDgMk-BeL4ԩb4"I#5y^jApL ]0`>y(EFUbd-\צ, u%kkk(:1u/xƘN=傂[+XT"I)^&˅ڨK*F$h &u5|t]'HT)s>̾`[8!F> >$,YcQ5 T2]ɲE#F9't:X 1T| jdf X 0PCEOc6J߇1?9dXB2Iu-F 4\GGkM't8 5,@jp9 3h#&aY5 A$u-M 2Ts͠HSj1&}{g8D| mOk7` 6-0(rDJ>Ġ &p)5 ?`` ᨝nΟ~,3t};o__ BA̴φ?oxeiOy3kkc.vxb٦?:xoK']Kgѣ{۟G7_+ϯH]XTb<.̓W^yO~~>f7vLW)~_G(gcۣgu}n/\9~‚8ts҆uI1M&XZ' шdJ ;J k=1/ dy2VWq.-a4ϭb:&@ۊ>T zcU`GǨ ]H|4D bl #<˱4]d< &ө & к(9Сm8|ur\( Lԗ'oG'RTPL_d@#VJuiOA@LlD;3u7]+%oV9 ->kt oo3jK&Q:5&NB: Wb:SE p]M?VZf9*QJ[(fvRм{1h.*1PFIdq:?t5T\3h'?>+NӜSeYJ eY i \*(~h>WnᱻTy/on>:.=@>>gu H#O|,C˿{Y˲v MV:Ϣ'õMtYpʶˬEV8| կu Tʔ )kTr m&$T*ɮR\FH_[WLRJr[Qù4BU7b 5OL `FbBZ5 Il6G۵7JHQC1Pc{&)qRZrBDn h΋V BƦA<2kq|t,\Q [o!rcL1;:B9 βA74U7!pB؋yRPmAe^(q"+е5QJk8]dxGNa_Rڶ{јNٳEY8:>BLt^s eh#9si ES"q[=<)DS[[[>/\ɳϪeR}j%t ~]pXʊoQDXg <Ƙ[ɿd+ZOMOR|6;|pp}Owem↲Y o??w[P̅4Mƫזʥ%vr|c ~|9BlSx;q"_~eCUޡ7/1 @bgwN\K!B1II)e@ Eµky2{.2n7q/D|zgǁvv"'} _u{=$x60:,FU3R}v7NbeE7@@,0(jAd/^&+ +G q`2K!HZۋ.v'cj,=#d) !FEJJSc%Cd Z(M]]pra{{?3};$r$gdD= w;Rp54ptKާF&Ð$!z޴Ɛd (Yf# 6mۊ9iXAeij")G9N \GP80P2<4 ^ޣD )cc<'EŒCd$&&D'TYp,KZQ`<Qd ]:dfځV]h'GGi:TK+KhmThKQ*$wj:sL1b2QVWVI(gYh # )q/P$Tl .:J }(K`4K_e cQW>z+LciPmm7 /8Ŏ1B`pS t,vqQ!Jxķ(#q]d3 bki4H\>urMh} R8mF)𵑁^(!zŨt :ץPU}밾.T';99Vn )U`fI/\KwX[;E58w\ҤШ.w6 "\5RN&KFS[*VDPG%捬QQIc< s)L$)*FPM|'P s2 3j8/C] {Nfpu"7H),/{1b4#˳y@b$\ɢS8{ IDAT3\5 QDICd4G=u&%R\ڵbz#PPl$%Nۺ}V2 I-ohMif 2 8,QA:ah}0y=F/A->]FLPRsڇu2$YAk!R0G *J;JI082͓ )e{0cQZ,:S51܇@#+k`3[Ҭ4{*Td^xjk 1s#%ixȲ]e ;~/b#UxZORnou w/~JV8`rWWmMkiܴipp7AIv=8/}sU"QT?F>ŧ?*ba}wٸu_} ?z!پ㯬9.ÐqM77&Nit#;;noׯ& `g;ئ77Mڄ8nֆz99c~uc+/׶#ܽc٬^8m hCv׀on\bP;³4#ؽqyP:`lpsj~|Q50_NTUySL&tmIeD@\ &2DR (bn]ם8= \T*S (Th3bQ-RC=ic7i[fxYf(kTo3b"a(<|R ϳ2t=i&{T >} dpM h@;{ӛCL4A3 vg_?&ԡo"^})Sk^:OK48a2ѩ++B`Ujĵtsb*O}g13G6Pk,np> J\Nid>5y xJ~@kEg9dׅ(bzPd*Ҥ5ŐC Ɠ1έd2 <]d&Fq)W^4^A#~8QP(!Pft7ĎˠT? 8␆D\BnE메 4@#0`s2ck( 1IҌAw 7w&3I(lqoH -!i`I08썥v 1-@* mo<]23w)Hܨ{M_!םIkF*h"^ d0휃k oZP(8+la7vڠMlQX|md;a]Ϳa'޻Cp]{!:BE*g\fr[k]GH/M#P/r[666Ԣ~ZzJGzA3~u-~/3lta2~'3@{cb{|O?w}ʲd}}9L-Yk YUJX;RZ1 !I"Y؏1:LoDv5Lcks "O4##K1̎VDATJg (RddJC)1A=3ᩉ)=od.3 g~ *8|_ ZBYS(chr--T_,b 8"Yh :=WF$'4 I8# ߸( $(5t5xZISdz;h61ꪑo޷ɕ;"BBnB N|8 DyJJ"JqyD}%~*?LLQ<0)Mh6@,l{luצhN4|UEb>d:iN?y4b9namd*7+M2ys F)L m&=شGf@K{^?#)xqE U¢4.ȭ`2Q*e}D 9FQ-j(MȒF y&zv[-fs)h6uy6)MSYywC!6hJhާsD=@5&(;,dfYΡZY\#Mץ 5z*)X6pDv4M DX.`}l޴R89~cRt 2F% 5< b:Jrd)…&r4bhUUɀ!+`祡=En: M&7߀"E5,sTUqXy*N( gDzCuI{ۥCQ9L.?1C+O+r3f-HtZNf2KQ jmۡOR#B*J1:'&cԍLbMC8sZ#Xm%VshkyhmA"X^^԰e>8Zoy|u ۢ|ŗ;4s4W\73(^Qe]ok.9}?[[믫7odWj}}=޸q#`{,K;#^^~o޼IO>n2:+Ɠ\c|Ν}kVώ~w^/l\&[ P?ȳ̾u΃+_9ҋE ^|֟]r%\|{ ɄϚU>P(bfmreo]+~m\oOZ)Ap=07 D׃Wi{{vvvvhlt7.xkkK]|www#3]ֵkmsҥ,Se&.TVkO8>v~RTI٘re]J9L12J)eUH͐QY+Ŗt1)DDY n;z:ǑM7QB )*"]D K (mHi12Z)# m4!gGz@o{&ԫh?K}XCط.yFqּ1JN韜<M+H^~US)f2R؃NBF62)iRx:NtQTt@৫$cSV^^G\ |'&]l,dB!4EVbɨEECo>pfڠ(s(%bnH pxp MuX M kNBHHMS76$#"G/IaƲ!m3mQU NBsh`m>̝ѴMDhEd( XϭL3%,dГH!Yj1 !X4M2\1Pڈ '6xFf,`ii f`4 D%,jiM2up121)7Rc> Zp]Fc24)o'ض,jEgT$j3prr (2LciPJdZ7 T( bѵ:A0T`7h &ǣRt!ߌVmd$܃ڮC5zyx|rTb2PڄJ)ɔ2y2GΉ kd(r(i BSV",eYpG?sùbZYMPS 囹/`h]r'!)EQHH:i6-y0APו4e M[ =*8ݳ"G] "ʑc(rxN_٬y̫Z"V դ3PF%NfF_tx2AG)%b.&+Z ;mNF1CdRj(U%M* h34IG7 bTft4Xbne` (s? EQ`Tdc EYiZM<+, D(oL&cTy"|0/BS%t<P,AJ>LM;@Nȣh2xxGCW$4~vs1$8A+.H`dhL(R)Ťahu TkhN,Jbh! mR!$jJk m-B I014i>NA;QODZ{0Ziy|x@8܁ﺇ 䡫SpTdbv|tQ<9:+Btr+əJJ?|k_pU76>掞.gAS\ s'ν{k7__k]'Y3G瞣y?xz)mU٬vmXePC(~HW!r [e-`z"ARsH8qn~x{[Nzc1}tŵ=Qmueo]CӹRo;t坋뷷w'νeIC{5Q bsS"Eϭ2&gAGd1wTbUvCsr=a-2N(;]L?P+&Ze!VRdCQYFMCVEh2Z̦RN_b*Ckk>9:>=0a9fRut?POhYb`JzL7gV,k,&iVbOEz (hp'U)| t_󒦮ѹV<6njA1d j"K&9!X !VрbEiD`$w(prr|6J ~\(጑5Tt8!C#Dp&zԩ85V>M)7kXCs֭,#+ L&̂dpG?u:͓蘂$+~=18wH(7*`i4'%@)q5 $(N m+1: ;/\*;4mPW U k 1m;ANWDHXUsN$K NQP mIlI)P@+Ʌ3`2YBYޠQ7 !S2@lRq "f'h iѸN2C&(eY K!9*4#/kApNxQ0 <Xf!wBՔ[) lɊ"%+;g\dWqQjJc`Ix5Kިd-E>45i1@ @˲ ;HN]gfKNt,6򞚦A^3blHr<3%Vi[#a'7 /J.3kljC]4D"uzVty9.E4Mr:js(kBcio&h1 `x"18FcDS`0 Md,*ray4u-;%>Fd>bHuͰBϒSH>NẐ:<:>73w??^G?rhOWoVs͛7Dg? ;;tP?p&_{\]eܼ7o^KoիWh45p~>:ի0ԧ_O.M |}>9_zK_Wkys=7'\hf7GD6ZcP7M[o=ܫ?#z_Cx ![[/7m>7=rSi`޺-kV2!9+!E14+;; |i|~gw+AzIJ `g{hkjnB#i:pK~Y{\C/H~=YXmF+?^G (:wL!t1F57YTTJ53+F އP!1z}J)bXh͕Ry נ0fbȘbE6"ZK˕}L15F}>OH-A=HfPd>כ_<*Mtj>R*" ^:rZ(~0a9]29gS[4Zڤa#idJ(a!V1ɫR| DJTBD4h.mj20 qdY9,)EdVKZE!fI%bHD y%`5#T)0M#A~X-LˡmHb@B `@ #( xn0bK0_C6EΣo{+?:̈" R38uΩsםOt??&og'/]X<#/q>/V_}p޽{Í7xn۷?q?zQ}akR|-^fqi P)|rM>RGp6f[o|ڷx`doݼI< r@nߖ;7nO=AÊr떻 n _~ٽϹe@L͛~>Gkګ>%jqտkqMH/?._Yl+?(xF.́Bp7q? Jq⽈d"BgKbA)% ڒslpI"BR '&5s)QC.;vDEy3\s{w9VQ%vV+Th;y:ϩܿL P_3~sF}@)b`c;K$ElXtvsHb^#T ӶKPJ Xס%<)ZQ r" cSZ\ބԣkZDIYJ\hAUf-%)3~Pڶ16B ;6}keT$bQVZT?2QѶ65JI899oǐ`\4daowyF 5`VOuN%AYs>;KպcFI b0kirFݥ6! o)fF6QZhjJ目24 b|4{öruPJ.k2v4Vpmw4"o6+]dALrb^# =@b^e!ӢHF!0=zau:ZTLEk/F%NT<`SJxXY幺 }qb4 .tX_X^,xD)-6d27yCPp{ Xk[@l44.J]Df1V'Dt9ArƬY.wXRF) ڇu=$ ݦiE^~2ԛu1Bt.M8yR-*.\xj &z6ǏM!}{ 4yUvZA%ڒ<ݔ|9 I[,eE}ǢU29!մѾa^!CVBi FJ'A3 i;Ա18eCU&AZ=1kHYKٽs(Q9nj MXcfD+8JzB\pJn Tl1vwLvvzQ^ b O_I1*w')0(뼦H(O&C( !Ndg 86l^nE8 b*ąV&H0J!KɎ<_"@R^䐆t&Lfu[*q'ĪrCU{ONZęāMiqOrw9.u׿n1Mn{{SS/ 05$zf>qZ,jUw?^xᅰ|/Vygg}֞xW1^7<ʧ?7߾o(s0㇧gom􍡞Pܖ;_M6J׮]sׯkou/_wswᶂ[@Ҷf=={== uo߸6hy&2͛7ϼ;Jܾio`ܹJו?)=GY_)?Wo\R]p.׿|wy| ✫c '"fOJ) 4}ӬSJ+ fꏏb4gK7Rbㅯs8]1^BHK)9 )SFJAN) .̋'CJB܂U1U Ü9y"Ǭ1~nΘT0^!' ,&cO1YyvN훈'`yЄ6GxHQJ 7.g㩥"h&ʬe+]sFɧ~ ȴ 9Y#,)@dt lSTNnHV-dqZ UU"Rcc-s1ɐУ/=%wNOC%:vBD[IUv*Kww r =ITF yj#*pEsޡkl6kTURA]NY,uRT {ghVk0B]yn<3ݗVFS^{;K`# pUTٶZ97NSGm~6-lh@&l6&{sXelz?-3mb^5i `Y=r.]N5; <hU˩Gi5.liĚƪ4jq3:;z<9MRm9*mP cZ& r3_}lQҳBN.luVB4!RJN#~ >JS1IRR2Y$v\:P( ED朏Efs iҖA6%>j6gm.=5_.ɹs4} e#uRbbמz>};{S/;_O~7 ~cώΝ;?'|>6_['[_k|F+H/hbۇ"P%Ȥo{.4h;ؼ{7= y7Q6,jnի /nH{>wFaܣ^poޤ_ոZ ~/r03g`?%`+Wq)gXQR`va9}sHDD61=E뚮i w_e\tUu_"Dr) sΏax+ 3`̎A1Er꽏X )T4SX*" B\$q3Ȑ\.eBۛ*BqvBA? 8 :b@g mfs5/Ā.S`>Xq;`5dl OlU @-qcS`aQ9m:;Dt:ƪtI&2U0; <P$IR 2;t? = >u4 Pi$(`m;e8ajBYZcDMF;kw'M`_*7y{y9fDKU>Ӣ@* GuMЏ,𬉟p ՃB6Ly@dXk%.Zp…X,vX젊"l ֫5=zcCB#Ҫ+/2U hCNRFC NSL~GɼRn6ڣqke䆔m2a NԽdPQ="CD4MkHk 3d 6L\*t^YfX1{"N_izlWPJBQ9\#Q⬮R6FKz.̹iho\7tIh?5E4aATbu@j͇ >8!' ] boUT;R Ps8}){eL0Vsh\ yp^N~<7,mbMvMpk1 %4VO`@&-o^SrX lrg .zm.xd3gl)6+&׬--xݲ)(%VNKdK 'Uc"F@Ч4)3*aV `íƘf&2_X+*ԐaQ2a1C S ^NӮ )}@W!r CPbgLή8l|-4mrwDAL"Z549a ua֦bi><#j`cD` ,0.6|M8=r#"Ta8_sJ2 !O+v&\lg>߽Ki IҔ;]nh6Ե4j/xnk+_gѣgA.}HU/׮]hx&`,/\_\eڵknzU.*߽\yi. /(̯+WcB_Bƽ{q;w䥗^rw_kSO_ؽ-wy3W/}奏}p.޼)}ܽ{G?s>L ` ovη LJxG@z` {2'xn '{3n [;G}&<4zg>Iwwf.ۅΡ{HNɏ},O#fX%1Ws\8Nr#t?{4+S콏"BӶ->5s)Uuy) a8J)sEIa٬ 98S U)$;^,,9q$wL.c&"W9=oהI(8ƪȨRP&59w`;87#[(1ozlyƱv®ξ'zjR'IdBcL's)&Ċ8d+q!(2&<{>R*pzW*DYr@(]A?j% &يJyflZ"&՚ڄI6 ~yXuPGX6S3ϸcbam}mN0$]Y7 w >b1b@C,UZ "꽅do^r<΅iٶwpfLmz|zvɉ-=Zh+dbӠy!ϥ MD2]ks*;MfjA"4,j)sb Ev1xKWe8l]ckA;JQ/;*TS*&ޖI^^k5X&CѬůM ))8HLкF(à̃ʛ */E{BTL5M5̦kkhL𔭼3& pYЦw(kg QB@Qa*x}bED]^cɩJaB }7k4M!gMhU6X$K6m7vxWz:[HuL߳S }IX,vGVMN^mޝ$tA\c*kH6C4ԌMBG{dAb]~>_gJHQ_ck;{&fK Z׈U=&Q0KIa,s@ՙ0`V2fj_0zf`9%RG9V@ @ ĈaSA :h;(%dA]G8;A0xt lͦQc0ߡhs|N )"ŕ" N@z@, 8rDmy<$mFꐩ%L$]X8lD0fqs!g Yع]G{뺺=;yG\w+YfCJ_ݾ}K[6?ڵk;nsWs71w<|kvxj8{YKs\t`<_.^*7fY{n?'/ܸ O^| x~~pxcݻw37Sl71w_zsIP-=-`{ }3M|@%o./߸^|w(ܾ]p&^|E;xv*K)sk/N_Y89v>w#f/1WsnP mBbWB95Og̛Ue8 aH"·\NVr.2wj؋Uuy^^JI ]t7zCR\ܦTy?y_{ ȹ,lyTe!Uއ%3{q!4 O33;*˚A+9>wI&#&DRlRق_qpdA6nS>1L:\u̎֏Sf+`LB@}Nm'yݟy[*3N}!UFʝ”E*92& Qz!A],L;pRA&LU0hG]G|O u bc"zFiScf4R_4Vh]Q k;4v.f)Txݑ z*DU=b>,5E!D4C}?dNf RV^m Dr cw`bc 6Mh2 \V8;;jBJ \YVPG"rnrN8?izĽf? IDATU]Ç,k(j3*;5 8==Dkg]iiZKU`^U:w@XIr./kml;㶑S}eȡxdMfdR WMǏOP1x@#G>}Y2fU~PDrc2n&_PX*VJ)>:+8ŝ;t4ٌWʃG^+"˗O?ty `|7Is*p9g"l:KM8<8"̄ !Gu9's"\Xwrcz<@Ju'H~Fd̉h䝔Lfv 9v5-}Kvf`D8/ՊTXOOxg+qvzRwf)B-ޡ͌s-؎T@2ƒqWU.\y KTu|g,Ø٬  Y:hP[Ux|rfzXd)1 %1" i匩J.D+cV~l+UU!2jpM66krgQKKaYO^l݃VHo < UFMfgr=4W1qnlc3-ӄ]M'%346w}xJd!XJajQAxRs{grQoQ?d4p^J {7D-Βeèz+F=y? Ra^|rVvޮ&Ő &FF*)>gLG>8#)'g8A9Uo$>"De͜ 3 ;I3\sXW;q>%,V BLnf/ ;;=]\:<.Jm>pCPGr}ܻwqx^uyĿ7n᳟OO),y]3@sh#ndn7orOͳEHufo~/_t_x 8^÷-KF{p TgKd}߁?S?͛#y ۟Tu&zt^ԧ7n#Rx\؟gӵЇ nHD!dl9IHJqrm^Ψ܀1>K C/":(k2GssEdS. .F)'C) }\`%fއ\ Kt\܃Ct.ϼ  Π<DQeEs撙7 r󑿳q^w0֎ܑ¶O_m`M,za)9diuEq iڼs\V>L5. UWp8FT>Y*f7YCR7u?2G=.xE%)TC]WX yװaڎmS^2f#GeEM>{xv<]0g,[@Dg30-*5$jr:ڒ46]=|t aiΘY ^G 󝅾3!M^ -$F]Mlj@BbH*gy1F8 *=O3ȩQ0z_oy }yADnyRpԃM TUяAf4mշ kQRƕ %! hK+SUKn(u?//}O]ݽ쟕^{p^<"սK/W2ggܿgl r&;}+FM0+:`֭[DD^qfbC гׯ+rs+C8n[>o߾exX≼;xիK{4TJHJPUnNж雼>=gMhV3;IgΥn8PsL!:v;RR_Unu]|;jq 燜a0lRpuFq཯H|%;=s`v_+ "XhWEw\r)"ckb RIç,T6n\b|vdMWXp{b^̿+JMqqcՊad QMCg{MOZ"qKlG(PC;v'FƽzV2h9)@eZQ&;t cд xbc_&Sb'*CF&%#'vn @Pc(z7.f9\pPJ-KFV-z a1X.wp%,wwlV*$F*'Zv3KU <*H3J.x7Cl62.VTX.J5. PqP8&t]f5 K|ؿpB}{ml gM-bDUA.>xMy%h8o"~4 (AlǤMkV\=c(7 8B@Q eSO[#BP[۴"Oib~D4Y2`j~M ^ ]buv٨dt]޴SBza]nskȻ)ݗpHcsG[; v* KPȪWQ 5Z;\ J{xeZIQE? k&Ymž*R bN}4 rFt_ëzW?yzly̚%aucX,0=OL6\E9!/l,z- :YuDcICΈoIkwU/d $^OWڝ٨^[`64kخT=eZ>5YeXhЬ E;pVdlyVݣ`j9|gmX|"F*8=wRЮ[xz BDFiCLCSέ0 1%K#@G""% ltv^Z"I@Cj*]q&S>|]yxki^zQ)iðYIx[uH 9<]>8U˧vO_rt_$oܸ;~=l6sѽ{>QxR0(0W^|ݼy'>!/++z^w .?-XUc]7k&VZ7ڔ=@ѕ~?!{W;i9%l&M3$iV's1^v/Y3I\>KJ])e(":IW#E>{?#Kr>z疱`Ln/9 Q P|saNe| &'99M-lۍ>B#@y=XsIjI lg]ϿsweT K"#cV}:w5,Fp<2$fCD)U΃a6vR bQ} NЛ'F0)qtdIꋔ$)e1FjHXȀʌFۄ-Rf4%ǐIotE? ټbp1NZ QpKsc@4ԧbQ6'2-D}Q9 ~d+9[ 1UkEǤ+e&M|T;`O$axoXvwpdJy?VsSvf3Ե/vpc /Y嫄T&( }7zWue9E?%7=oà)U! }FӶޙbɗdƝsH%u`Ե-bT&o>kI|AUA? @QZL8{I5!t]VRJT`"&x4T;]SJ(e)%4FC,ᳪ":"! 6ФT226U]af}lL& ֲXUS @x ha BeiHd+ʒeK ب\RNn D"rQHO~à~L#HrL1 D3Ч [:ff3 6*6,;Gٹ&se&CT%A&to W`J X!c6hIP-WL,BhMHY,3Q*@FJIHO "-EH'r$bG3) C>&qkCwc&rٜ/׾|[_yp#jY^aZ5mX6U#/Ivp{{{@y _7ξxrQճ][<?tNۿ^]xxl?toVn˟c~}FpxO`m?nCA!D[p-zoܠۇru+7䣿ܼY?X8wq\s)js+%sm=fj|zлm6=9/晃ˈC#y 9yRdw.ֻp-$IDrFIHQuKɥL̳R+@sv1^/3\d.8PEvHA":"\a T{4`X+-̘Hg p-I^px{X|(`;`&ktU<b;JLH}``008ze^D<  #H~b&s#~f?iQr1-zDxTOo`<9e }MZ{FJzR*s} cDyZKx-D#N,ZӔ9X!z . !j :9k51u-$l6}<~vLٸs iM0(#!&%gIEbgl$C~P:.hX 9 ɿ9!M>HC6]“ MOoި<I}F0_ ӂMOĺXt}@$8tsY\k䡃uUkP"l}kZ4M'Z$_WIEU~(*v;Cڍ nbX C,x|17@c$> 8 i*Mͦ2-E2 l2i2^)Z2Zk<>}<]w"ՕIEC`LOqbH՝h9x13[UJY%1UAjѪ{LaJf-Ha><& )z1h:MJG@vSn+^G!90iMUi:dg c4Euޘs0P&:g"S5JJ=h Z@ sHlbG Sx)#m \M?7qdGߦ`ù*bQ4%BŀVZNJ*V`\CԪSR){OYTt+SIC,ZœR G$ IDATV7fFNiCD,$=&aI_uaJúYsJ΅:YQjJnV'Mc}x/=z6韖Oʹ?QP|s[a ?ŋŋsEvUYt|b?0'&'@ WDZH L,E ĈA]ù9 BGYGK֋ ECmhhjKLxr|SpuvxL&n9WidĪ_10mi;ZidbTԱ\;'!]E~^$TbժTWJv{ikuQ2諭Sñ)%ge`:5&CQU=8 [dzEgPj]J䣾L\ $P5w*l< #eLz9%KBfwl~jbC?he0#N=ozIq=җx0fjpBCTZmZjfSdVq&{ 5lqſts-PDHMl2bv1=%ilmoÏAJsPyqIrH2:;q/Rscٍwc1ކG<В{䞫[`5G61p'!Fe^|}U|6k[.O~暦;Ÿ`W˰iǮiBF25jm0"/9S6\2^2vzCk$x+1xl 8G2bbY6v6BX8^1jFM):zHqDJkԚ'\P9YoN=fpww|^ڵktzzJw$׳Hbk_?z|NƄ؇_y?_k׮;w~իWOrysq~|?^|1JTF (g pg.^|S"ܼIݻƆ~b;wʿvO?{.lEJi9sL90^xz׳~_?Kׯ_~[P6^F2sz۷qM?o~I<70fT*_܋s<H:Ygy2ES%TʐB(c 9pÄ2R.*LDY!ԓ-LɈJ+(v[RicpoIC'HJZAO:qּzO&'Pvj5ٱ@BK~R)udfjҴO  q&GsQ'y ĆIN7$;e @.Sֈ5Zxe{fq+b,$sad5JdB50`JlFrE5BJ(CQ9{[CƲQ1qll,pylnnM*묘,n. =l(MإU sVJ(Qk[8FB3F 52@(oY#H 4aks]@jő8>9>x(ňdY|htBktg ''x;QHi`Tk0$ve5 gFt#t$Z܌h30r~ {"%ȅGES0Ĺ9%?z}ߋ'.5/ f'9#s#a1yXǦ <u1wµ Mq&aTbwNan(l#c #W>dBj,EF3* uA )c8uBpr??3yww7߸zC>ld)o֭͛[Wޥ{\mշmm*CV2p|S:s܉wpΝr-zswp{:]@֫=cOOǛYskJTti\:axxONOq2P4ԚvͶk-"~H1R/ RBJ0?G)?ͥRrRr].9TqZYJqL( ZjW)!UEm \ LO Ʃ"'GY2=ukӖjSwsѶ"]A~shZg ЪjWTzz4}}(J[i{.>Ie5#r2JHB^Eh+btPV ~ (呈L PxCdՆ7FvL0b=_U #10BoՒ'V1Fvk=uXghN;Hp4w ZtsrĪ_a`pr|*f/Fs"VU+ॄR,t$55 /@Ds fZa ӄ|Δpxt! θ3ʈ&'gq:w#j&t8L] 9J.j0l6R0ZYzF >p5\D1bOZsEߤ =L nzHaʙk>L 1` C?b@aQ5Nr19fD9;n޼,QI39_vww޽{駟wg a:|ii.hiÿ=SJ|oG6尿 _+WԢ&6Yؘ}q?|I3ן˯} u}[4雐F_.q4mzc(ǣrle8|] } }n nݾb?w9}Cˍ_m7=uHm笒 Jyb>x<67sn 9EV9UK9FY!%J%VӇ>%K񅔲1R!"bl(Cd;wQf6&)cmM!m:[i [qgXAtQje騹3.S!EerjYzTNE")CU4OZ054#LjFţtU-.3т¯.jb1gD*Pע \K]W*@BPP-w.l0P3`ZDaG@ =8犋mF3rG?@JWV%s#R uU"PeA4J96~@ #Rf3̚3xsA۵Q:Gmgd!%fu3P& TEIb?Bɀ6>z إoϼc*iXpzr*.m`CֶIlxh.N|XVޣ_).R(֏R[kT*_Lv} ( jRАp< ;no-dQ]/igiÀ=g\rQ0=s)sD[z$υrk✃Y˅,`16Պ{/AQBJ{#sM㦘 1mMW ; v9FA +˓\)ɎAҴRL#ġ1GZH1aNkč:'8pmB+-zqb#f ;;~a G䒰@!njje tYm,NN0:0v qW'gѸYFqDeڟh8c"N7 [t @A+x,lfBdwyY8L! Gٷy֘ sbVUA&KVkukAajT6bQSP%#IS,RfF¡"#I3Jf0V2*@Q[EL]TO4Rl>C*y:fR ɳE3DV`EP\c$V"g&qO\[gĬgysb\hFG18ס}#BǕ"X9X21Ğ(&Zb1ze:4zrx8>ԶJ!B1iU\rTJI {/Sѿa0†c"/~ߜW8O.Sw>7,ވITu5#o:/}yE7v!).S/O?cO<1X,?}K/|z}B @yijN$T@5TSqU45u=-6 IDAT FYs 򗹅V.avLY7QݹTD4…O:bB'dq]T13RDE{U+(M.>)!)@fj*/,^S5K\Hiax*(52к2k91ul.! ~@c-bsMӢMV .*erYPY3qtx'}MJ8\j{ͻĴ9F eEJ#.NPqOmlo4m'> 6MY-x _p:eR|-Rl\Df%8 ?zV+^,ګvDȚQlB? rΡaI";B8jd=P4S hZ8z`2=z`)#C)qk )q R5#2EhMN(.f1*3 /F-<ްn)&ZqWXR.wOGLz1ձcLc(VN"R UP]cj x4)@h1i5B\hk9bA+NjXB޸My`ZTb RPwsˤP)dN H .Y *C@@c-a r.I™RH" qBM8˰k nT yXY2 R:&:FpDo5?CxbZ@O:RAR`8UO"55؅\=(2)u.f >gF(9s 3/4չ)K# jIm=0C&  acj[̣SE4KA%3!JVJSʱJqHS%W0jmL}:IůJ!&a\+ژol=C:?%Qz 0xztp_)~uR)'k6Ҙs熏҇NZw}wxBᵗxNƍ+u] Eݗ… o;jWu]v 4S,P ~ByG>2{/~S͗/r=\ W~Utۜ?bf.PDRE˟{77zȼx˝;B;w[q[ }pw?4m/y^+\R;vimQ R~:Y=嵟/7u;V뎴.~b*cQ4}r?4MSWUzUKB9Jy 9Y6RcLimjD1s֥ʗ&[.'?^kѼa<SW 62e K8FTu_ Z\'iA36WB>K&F-$<fT]"nN!h>>Յ6o1fE-Yt-Jcscb;;;h;S2'H!`/1V(sOfbr19ڶE7֡`J7ӹZ?ЪN^JAĔ041(bEc@kdzJ!& jTL)ӊIxFKVǨqXlNy񸹵YSJStij5؋CbE輯LkV֢_ ՙ@<#,JY|z bFF_{nzg3.Hbmu,!(5;! 1qÍ҄# ^KM-6RΓC6 FK( l.r MhpN;c)Ru|R"5iB4sEL%ֱsJ IB=ץ0j+i:I4. \𰆔iY 5-?躙||RocY^ @@cdbƕVϴ^ v#bO!n8Lq2Lu"5Al3|vGAElY=^8^E4\S%"dD(TGSJC֊(ǔ\}8yxp)\mκcm7~|>_~/R/~_㗞g_V'i8Iєs.4m6ol/):>w}6W\?a}- k$D\vM׆W ݂-oyg>{䑬!BLl_p5߻wkMҥmY7٠қQ(|㱼q7TAXr76]vmq-c $UJL_~O~7.]R/}w8+R|]jUn\Ν ~ ngnݼIq~żwNr?㏚ oRZrBH>QZA箿o3>Rt.>@R Fk]*axpܑX8ΝUv6:D VBDvn!Oőkfm/67/klk6[ʙEdHn 2hۈКYtV}zVMrgjETYmƃ./օY \`+k`aږDQjkUٿU!"h>`okQvHR5>Y{I*x^N$z4U+)o$ك&bh ٮV(13: oI0E֯D&8 80A-i(@ pk$]JE$[F;JɁ)uMlMEVEYH66605zBPy .aѓ*mQ 8>98@@泆G`Єc&[өv)r3g_ 3J#͍Mll,28g1'>_CZM}(Q(($oqcc3X*= ~`-0aX 9#G.ƤKf`K$Y2!Eh1/E>p${p)LOPcc]!vg4ZiiదYk-&ad. 4b /((B  "n3~ >FHsئLrݕ]KEwJDb2& a9!1thq1$F2=+1FѮ*gbzB"GvygFja4RV%X2y55TG̸>W4l ?_x8~^ɧ_w}xw~~㏍a1𹣣~6"?H|Y#p¡#oʕ+tp#{O|:?BI{ ry7nPg' ˅vˋŋS`W׽ ‚[7>;sΑ/1C|/px7~#O1q-E~zI&*'?0#@?o}`}g1mSJsُ8S4M cZRنI )@cJV/=Oę͙m(%esκ4ڒ# Z Ӻ vg]nGF6f9wB X ZMymJObjeMjM)5uQ;I;*. 6jC5.5kμ@Zpel`eobu{6zc*PzgwSӑKJM}5(xRJCPVZOFYSq$Լ0库ꓒjs..؄DPhi8Tݧܭw;vB-AE,ŁHW5Y)B~rDs.)Ε9V%5x(WZ^! x` / xHusÅ 0uk8!%>1JW* )TR58H)0-blłuY]9TJei8ݻ|r\ ~jX[f_DLK37BßQ sCa0Ja:qabfļHIMNl4bi\9qnF~f+-:@d&yD+5\Ln+ZB^hmtnVh3G.].YȐz|%> x2 e.ʔRj :CiZ=erziv˭WJ <ɬST#]eE91/TjӀP [y)& ٬am !Sxd&MHa䎋 6R$j4ѪZO2ee  <7WodXpDP-NybJ 4I^G*@5>S !b4H XRU#,L.Y=HԌk͔3i0YE`m44M.kWbH:X+yR JMA5AVΙ\orA (&DcjlB)THkeQ2:眳ֹRTDɹĒ0Ɯ25rY%g"*Gzt)W\uo~-o~߹zO?G_}K8 _z1H-dxyofxꩧN}6>{ofwOD_< %e駟67oޤ;w}T o}fntljs[ڵkk)8&=MMo[йMu P=^ښo6n=A)J*7t Ot*S/nIQxG-?|0;=:ow/}q||ލwi$Xsyol^V7|KFљ(;JiOU&յ/@^eК(ҹOVǔҐѧJ㘱X̵3=k,iK&**"[E4Os3jۦM*74 4 kg7M)eMl4M{6n[))F{^i0ڊWm%lYVoIQ$ńNW^`Y5^}x`=<^dlE'Ζ$v XIb5ddz($7Jg J5B$~?khb|}Yj*H\a ԁ |& ʮ:B%Zg:E n,>MTY<qqSzbֺi(]-y8B`> qZ6nI*VL ۔٤9)2LPU*b)@Iemi d w 9͍-,sJV ﯳb؁:A얧F7반o]1X%=/?mh-EcĕhkxmOuNB2NAdFŠ63$P{= Bb:lCS6BbENezꢱu Gbb /d>Tk:L͜g%$z6JrhrTs֭]. Bd|Jh{b8JG)1%i#Phߴ\nya R0h2qcD:0#RFG֕ ]d=网t,RbwPIJ.h(-H)1C@7q-窂Z E8mM J1 DL@*# F4) (RW*v$+aO!hE1хdJJ׆H7CnebT] d`Kްb7hZ*"̓TJf)EHJLgwǎcAEԟ5ݿ_:Xi{{{Ν;<7|ۿ=\Ǔ4߹wEO\,'֪޽{vvv;yg?67&s_({cAe+l|=\z\x;rc:yO)|SJ/nޤR wݾ_~ vƒ+;3~l7o{XJo=iGUZ5#LrKmӢQ5HiL1F?%|Y~9T剭-erLј Q٭ыwo֝ov;_TmZmYef];fMcm/Yk713khJ͐m+ْi_y.LUH.cɪ7 e#z*jxgU2-#5~O4TBf터Jt-䙯@]x9ac\w.0)V˙?\Uk)V+4`*ZI6kӜ2#\UCc8PN7HiD=BbmdQ]^0}O) 5 ;傶vD"4TbH;8Ѫ*5Q$wd(|@6PP8::9of.):#t#6qPd`R|:Si&$e*rָp.]|wv9l1\ Oqx `5`<{яq8#g XYr!#r B#3=Y?)MFAec!p|ِK{S֬vB Ǒ oJf98נ[`2?)!r ۘ-氳n֡rv!kDncE& mZd҈(mO q(JP>dEP@92q(VX "Q EQhb4k i,d1,)Z$ 1aHˡDzT5ESjN(H$Eo?H%qN((!zCa ͍ )iJ*N(9#Ƅ$+^gĒcD?Ss!Àqb}1 MH9,0% 22$bL!$JuԬpaYNJ4TsAS 5†  i1BAP\gQu[:v[(3BZ8㸐>hdT& hpYZ $4Xu 715 IDATV("8#H$KHFRBL F)2*JcϿ3KGU g8"Zkhdɢu0NF;qfYG\F3b! 뀥 F4l#Ju-vFJHIL|8]i]) r!2:0~a|=xny 8z}+s+Cy:;NaQ0|.+HdY)8KT* IK|2y,OgvM>/O_~/,}!=~GZ^&r޻\ OTrTG#;t*cK|/@@đwr>(2ъEBnj@k`XaѲ{tҫ |.4:(s1ܵL irLe iRhל puk܊5G/mL[Z )iE ò+j:]x=B.Y쓨Nbl 7C5L<8{MADÆ5ٴhvܪfʊ$H" G5Z0 5FqbmbaL35碉[a-2$o6c٘seA35 P+v[;|аI ✲Q jYIUV{+YѰYop%ۭQowdSb_d6ݢGQШjLGpv~!EYf!I}\fӗhUBYx-@VEb5S cٴ`E)|b:TQz#(:d> ט,9g1D"뼺]TgG2 'φA"HC+uNDp~F? p h17~1Gx ɳVӫ 耤Q-'0L o~)ՌlB0]R3&-gv@ÔHYYM5M yJ)C\,E*H)Y 8N0`Jt>bk_i-\LH:Y _Tic 1{oUt0Q ϻ!L"RVy?j9 yiR$Tz0]}ɌKi82hONnsC蜮=&ODn蒭m}1Ҥt/`Y,ٴ"9+[TL|8m<J6}@e:`^HZg}>[&ufz\D)8w|y\2=YsH-XҔ3RsfTFPJ{T7j C!YH΋.XKj=ywkGW3_ׯ\>.//<|󳽛7okt{xݺu߽{wjڃ>?^??ϛ. wޝk׮ BobzU9^s7nݻw˅ ޽k]C^?^OiUj8ƒ0?"^{}'>1ʈax]߿^mC-Z;^_Hn߾MFİ۷ w| yԟy*a~JDŎ=*tDcZ>Zm~ *Gw*qR "E8 |\Y@*0 {q/MiZCXH$HF#|\Z`_QnF! ќ3wImtv Y6qw 阳.kڋc[;iH}07ID'ڡs@c*ص歊!sEi4itR\9' QEq ̺֘0&uTP2i-U1dTrӼiv$4 nY Z4#JJAvZ^K5cT0mJX,W+b% 8inftgP+N@TCZ]6I1ZsԫSCE"GLiR[5͈/ ]!% ) _PqTg)HiH"f*8ݵ ]a1%',n'xlMtpb=*rƴΖ)+"8Gur"&eUBYJ` SFRVMf{EG)jW`o6r-RS$SRʝBZB9Ab=63@\U]jӺ BQ"o:P6ihܘO렶4m9fc]yJdV\r53hJ ~12QAvb. Rj.=_9rIR1R\|9}bc\,:˧;?~x >ggvqtt=;q{o eݻw/߼yo>6+UёCs|~ѧJmݿ޼y?|ؿW_=~{nk/oW>J'gW}?eEdv~{ ?ߺEggg+=]ݻuF ܽu*[Zx{[^#ݹ#o޾oܹ3} _#5>1Z04H$Ux*ZOٯ\Ytviyx88T2br29P1#.ViB⒄Zk( ~sj)52 ;Z*5p1 eSt* CRϑP~ֲ y-@b;אߴܠ ل:=BCXm֐> plF2"ͨ"2H`w*EK/4,t78?5|u~Vx@PHUÊ={Z8m:=%oh&`6n`RP*vWrڴΚҿƦᚹUJPQrR :f( emeݜc]32.1bJ#65ix_W1N,8x"v( VA 8y..3!-9= )e,KqK!`[ͥ-DӸA1MMsJ r"b0j]gxJC\<-4/3/ϑ&ERQDc{ƭF<0A`5`6fLvDeF˥fBU9&mKԄ)xlJQ#oU9]7]61'֤dy[0U { CEl"6IQr4/T Đ\ DZ)mQ n!jLKmH\JTMӨ]w ׳:7Ni]c,KbC@ 䔹,z>!v]vVf943U5E!jfQ- O C:uL@IYd':97F&1gp`/VEs.: Qߓ U\'DN:s$RHX$L@9*&#"NYֺ-Mi{cE0H)Ӕk)Of}nƫ/J:av?u!c~ѿ,Rh~9m _+͛7Y~ˎ_=\~UǏهϯqG~s|?ܼy?~pzOc9*vHga>V}68Ho37nkBkNn|kѣ옯ŷ@n {/ܺEx ޿/~?&ŵOGAv}\˸:UY'x䌞u W?Z>R8@npRuq9\! Hгα1:{>``pbF.#;b70}8!iE4D"mQ'Ikظdg2PEk7ݿ:r(k6 @j0{>fȔz<7m}. EOԎby3a|$LnQh.䙑rFlŝ6E3}TJ}rɓZC^rNu9ĽQ̉u f6y9 T_(UF_({ޫWWf14a4BCO~6*ڄQ"\XLnn͵Q~q*88<˗a9"GD]oq||qfv.fکf:nzh4?RѹiqRbqDCI k Vj-89=X.SNH+,#-A97̻Ey}m1y{bhˌ27mVhf#v1t9ІSf}}%1v3`́N2bf&!v:rZ`(Sz(Wu> !tX U0YS-'3;`Nי F0]7 R[Ԁ}@t搘͐I99BðĔt0$b lqu6tq"+RfdCY{Z]`&VKY KST)~Ucژ-aZ#tMi]AX%:ѡu6FAEoq܆عQNlsDiMHcٞY!v%R/댴M-  @!(F$;=w"t]))9" .T%VM9kl 9[~A)m5{<;bj;8ཧ" !rp}wW~6-?=}#gu]ywE|Cxyp]{^I߸wxȚ۷ohP[OG~޹wg/+!{qD ׊q<>{g<>9y+Izޞ=ڻO&yq8 1->=a< T7Vy")0{&b D., &.Ky>3#Z(:/y| Qq̎E}ר&m[3h39i87=ifbMśiϘ.E IDAT뮩43]s:/FsS ^tӿP}c ~{we*hb LN}{v8\dJˬl;Ufkv;=C-GRf d+%='̦bVJccyxpU\t BC4{~ueK[) ΁X] Ԍ΀\eˌ j@jY e5šh ۠L;l6[ a^Crs&h뢡zrN躨F5ɺf3E7K;xnҔM,{:XixKM:wK! =nτcFta;1MTm`RL#Bynj5理~Wm/}1hX?֫ouy?s(ީq@lb:XETkg[  UuNU6395e{)71 quTk9qͭ 2S&E8Ԓ3s*"NbV1TvK"IOSٱw<ڣg_}/>u{?7;}q~/ק_k>î.^tK/I)^lM޽{tpp@quq&wUoEqOac3['(<ʻg/^bA8:btʕn}F?| owvBn67LeeB@r[\QX]‘}GSl:jݞ>}l+=gq\LCGLTODbfĝ~HU* qZ+q!#vBXu>!ǎWEya8" 1 B.Ka5kQ $du,D;W1U +_Z$Fkfkv{~[n) 865p͜2jSF6~v1VX#(rɅ6iT `nMp;5EJ 7*7mwK%|UסzNʦOWB$L "@fmS:9[MV|:gӦR^F)}gS+r ¦Ӊvtu؝V37v(ikDN٦ƊV)A;|C$ C?`ZbXҥz}ێ#l6Eª:6^* 1M1s*C)e6,?c=)gl7#(Mk/_5999/0NA O)c`ڎ}&K0,]jU1A `mf1IIZDD6hV bg~֭:ǨBج(9n`Vj qQ qM"9iIjsNJ1)IogsӜNf{5k9cZq0#]!Dl-~ؽwD1b[(yCL1M5=j+ٞ=X %O(5|N]Ϛ9j.&Y#7$[l!׌wWkBʜOKEʚ %MB1Ms"RlbmT]Σ`o_ijdOӤiiR4|;pXVpQ c}@s;K!Hfñ]ԑ6R:mF D@igjS!lFJ{%9kdOjFu:0$l(f4)gDdO'[D Q$X:^ݜŮEUmpcG.47ik͞!f%HE .ESUBESMg7t4>q֩) LiDC5ժ)ak \r% "TF0*뤔4nSϥ`ZJ!.|Zk݂X@~a=(nzUz]>hL)}x~Ng~J=~|6}0 lh~݇'OqtA|؋g}Z+#p..J)xWu!#| Q##'y:h߁H%殨p ⎈c"`ӤTvdVPDށLˁ Fq=:ەQf.oGe=a;,  v4,9wꏺ# Ca*!W-؃,lLVs#~TǸTR;^Kb-,D! ;V1WR Txv ^v3;&7Q_2Ch ,hXMr'jѴKh66Y/+jbkBR:pc"1(x d:mk j&>)MDaX`nDq\UFGb4jLB888P+ 0pzzFIhmĈ= 6 A?&8F)vF8}{E&ix\l-TD,ރ9αPQSZU 0 ): "sV6e8@Fi5i2u5ň\{5qsJE?)WGھhP 2ӤX(m%BF)`ZႣBR%Z| $fRjsѕ"1cNT'7N*XO Sʀþ8\1烌\J!"ΕODR*ąy;>{^:Hb痀tRdL@UDJcP a!R'ݹ\^:X\7@CB#=-xv4Lk-h[_e(HW ԈM͓Rۿ}4ӋH!K0Eq6m(X lalt@.![Ay4sbM5p ޻c fs LT'׳,mqwNdG冀u+kE,oTq;M16MLW*tR+ =gAAN= `ڜ85(DFF^3FE14$؟a0,tàf1[x6#9h? b͐WސjT3]O :Š Z%)5WH,Ÿ́JqZBDSi4uA"L#lX.DH:6yr]ɭxs1!dfhv"+b%;ë.ȴj}P FTJ57XdBR 1*}t]+*.:u("!tJH4!a>œsA;Wrss=EfivvלAjxI_-93<ˮG)]8m0Bf4{ֵ߉8]77U#oY՜!re&mvkeҥ)-ifEl:&*%1C.uA5-2{ح*@t-l0g< tm?;њ_M݆}>:Vm6 =~5=9{]o6="+ÀδFu'M΋ߥdtCEXxA:ks!HeLuiQ* dIψޡQ| Phg4m&ks599)j?mGMMRGI+i^e4Vj?=5u81`B@՞%m:!LoF_j~] H7I@  !Tbt.WȨ%KšȔW`#U9MӆC RJӾory|~rb|g/Nѵo} >KK|EpG _ϭ?o~_v?j#{q/]o_yN$ѝW:rvvV4^ǃUܘc|x<ίrrU~q}7gai߽+7j%[VC(vܹs #B?qKڜ=p{򵸼ttp.M>rٌ'맧϶Leʽs81}/(K RcKp]W ۜ((yJľs!>쳏+b 8Z>3q2"CITb2MR2Df l7[tBWdLZ?CToC(hS8@ pi3n^O5>kqzz 6Ԭ#8Ω#Zޜ}! c0Z)07nvTE&-Wq͓؁Q?YGfj[jȦild-] r1ڣ64W6$+0[ Pg^ZgVdZ'>`B FSAK0T@U"6K5γ`x0fE5ƴ`z`Y}xvXYCgj$T7C?(4~{KR~oK-l9.O\S^";炕v>ms]@Nݍ7wQ(A8ƌb3z h r.gPRP 1jr(M ޹HryK䄈2󹈨M0dRGT9tE/tx/ax>j})+ V^½{?7 Pʧ?,?_/fB1^}U:?? a#Cov}sz ġ7n7xO޸qܦ/޻7vܹÿLnX+p\q_,%sjOSqRD\?+cpS!lfW֬(/4yǐڲ`YkhYDk/r9QG{#B;Ak=F~vslsIe"82,ȐĆ&;V4;TZ$Z<_syaM\Ҿgt@ 6|΀Ҝ[{Zj;CgjRf&%Z(`ǢOD ͭH5;V 6UUjٴ@S3XX*d*m2z W5svG qV;9Cvaͤz}4V6v6V{MP 툔LYre4&Nq~~ S/+ A 9rV>!SH+{GQ]iLKIE0,=Dj dG# e%9BV)F'Fфki۲%9VS^9%2L1yu],fQQ]_ЈXRڤy0,L;F czR15f,Q̽}T,pE?s:[ט9NU_\IcBfAVWDf\%EiFEDf 9b9HʓRK1dVo4֢64η>G545bPڢ,4G RšW鑶ۦy-ٌgX]@ޮEއ9gvK% C缢rEHA5t8u!8%Ymbi H]0φ7)՝q]- ē9mO-5εACUG8klC`tWu5v69N@:&f@J*ԔA, \+RTrM9׍IDU͇WkŘSZ`dff&ɥLUꦊL) $u*UF@_7}{O{Oḍ;vl[oqwd|>Vǟɟz/=:8zu IDAT\^ȇ?r?Ljzb/Hg8EԧJ|ȗ|Ug/?y{ʇ?L++gC?[eTn7! {;ܻ?oݸ&~Ѝ[pFƏhWk!98vAur!cΛ|Oq<ۊx'XS,>1`0 \)BC k- _Aqp؉v%3wBDD SеQr)#=̞<1w*_w<9e7sJ}l {k(P?4wSn;P7ۨ[cZRh3Jaހ  1 %l}`9~ɳٿyrw7~_k_[ҥKpΕ|gb-װs\U="%5n˲% -P9rF%OF`(/KTЀHۉMVBI]A,5]ý=ÿ>*htխs9{ZC|E~~??Maw[{s_~x^F{gg._v<t}sN}Ν;x·? |h6??q+WBCH7ndHX݀eof ׮?|vџԪ_; U[{)@"H(TYQʾZfD ")߱.fV(ȨWmi*{&5R\Q\:-)eѬQdU$ >a&ٱ1e|U7';*nFTCCjn Sb$EXoAF7B&$A '0,ڽ].JoM3Q1Yus΢D ~.t!S"U bן9W6'iCPiN%ˢm%ͺA[\V+&UbԌ" GGe4-.MBӴhFAV5F8z?׫m !&~#v0lKGEmTub0NlXj)X萪cTzIrB)Rт J&L%0l̄شŅ6zX6c@te X4m Zl=8m؜o:ZC9z<z\ %f0(xAFDF5!JI'!v|E߸Xb\4ԈI]{b]<&SEE8h>v`[cvSJGM?4o3*#!窍Vgfu<=;EJA,j.\:Js%MB+wD謁i!9@L^23 vP%ŭ;er,&F /A|7ݘ3),R=KNj ,Q gBȳ:RgRY0@a .Ϻ6q& H1:Ftu>OE/#&$`dՍG:Ϧyָ猾oQsJe$ TH B$琍1Daؒ1& 0MIQb8@@Sy׉8'L'ք,cN1Λ0Oy`H80 |wpxJ96;t8ikᇟ|IK/]^z)]4_~9UG^oj}{{{>O^Fjs-_Cn̵kƯu>җ4c{Mfw޸q#߁B;M?gUW>dcس{S_;}߽k_7Om lZ\¾=KLaN<{#&G]&pڶwS2~mwYYv}vMjƓ,D90S 1 9ƇQ0"gPΒȰ͒YHzbE Ƙ ic:63ؓ581 KDLuբl /t"Q%tW:X V3ogS/mK@o,RޅƘqGx]D%jntDPŭ9RaԚkGESv-̺jcdLnB5Yyf3X(Kaы5j| nΙ;v)uz-B{uJuN)k^ե̲X7qu3nPsEɋA*ڱ4Nu ]TYt540m;NYhta3a97R>ńixCѹTFi(*,jg5pJ[vjnѶ S'#GcW qvZѵ-qa;s[3q8NH!bfڶjoqzzDp9eDC7@dG1u9g)x1M]C9j#QJNAsAh `F gaWӟ4=st1_ }GW[|G4#ɿk6,^eO}X{~#ͯ|%V+z*ݾ}[n߾-v {= =s.R y}!s'on3`^}q8W&a|ami?G].׭?l&E7kw Ba$8ro?x頻bi긱֚ܺg|2M㺮mWp$As 9 IDq+ qs!E8S lIylMG0&$`3Ȑ1-y2v%B Yk*fc̞!ۀ3 SY"8&.VD:qbH9i1۩9tA}GI?`T\Ez TP^_~{肋XlD" 岉X.>G LeJR`oYxJ0:]oݤ,~k^>GQSP[,N_kPizD U.ת'UpL1gNڙNv UcTgdM 9ĥ+=0sI) pVöytߜWkKزeOIVe"-Xׅf}Of3LӌiQk+7EŅ^f]r9a~}YsF|O>7>#O}G.<۟>_xV c>wősrq~׮\kG|-:::[no ? kݢO>o?!:x@=p;_{ޚ# Kօ};z1 a3M߱s=e9ndm3tye+ɒq) I(ΒBcq69 4!gqq$dc]% 2 |׬&D,byMֶDf/C8!xǶ%cZbY0C4 #'PrS2P1iWP;JXŵ  Tx\؁3wՅn1UWTUhR`uj0*U&FJ4 pHYt_A.gT`w!W srq[*Kf֘CEsJheکkv+ {c#K*9N]5QW˗/z$$~:=;1#iZ]XS)uƒuLPK2^yנ!v|#  Ne&>W+wZv9 28_Fb1Kuvl i #@KWMJVfsV 1C(3ηjdG8Z9A9N+!ޕ)-YlqZ.yâm% Jmq)ΈQ)]"YvlBkjaCsk8 Ԩl2 N#1bS1etME IDAT˦_Bׯ1NAuMoZUѹi8Ơ[4ZAc 4ZЖKgdC:@dFjR)-{u=McuSU$- )kW^Y:_ἂyRc91)@znZ;imx*sfи];,˨,T\wܭƥպ.'X;1 *ਗ਼U9:VLf*P&2V;y[ƞ$au= 2jR5]dzW1yBzQjt )@{ Zi|6 )\n)[dƨ:~ƔdP)ֽ^,W܁ZC8EKILs,YNfYikCJYR"!g SS S<ϧyc,isYp6yÜ};{k:}M~᥃'|Ǯk^Oʛ''/7?}W>c?6p?=gqv~z|U|kΝ\E ܺ ѝ[0.o #Mey饌[ȯz%uO8Β֖O. @bS"bJƵmo Cx^gmIFða2s9Sڂ p̰`Nii\KS,YyxD-qg"!d6$15Bs-DBBV{98I! [$lET/ 0DĠ!2+5jѝSR x2؅!\<˝" ;a6OZ"B^b(_Mr>-Uŝf|W麁ϪK*90-̥6)eR#SR@Ǫ2CBYIzu[U bs^&; {|^̅ LmiqCX@lspZKu:Ƥ!e:$(e:aDvgHԫ 0ٌ,j qmK&W,l ! }ׂ.5J%Vl1aP µ]:RiK@nEva8gɥ4Yf5-MZ.Zr=|øp|S^ٜcFӬWRӤ 3LgĀӇ d@rFR" )a@]iS4caZI(@&3${j1SF |cKQ))&ä0[fJmW(JkU̇q+m!) i;y0ČmT:~ (Ι93/څHΚҫ0>aTLs(tq`d2-@*Lq&fm 4Z聨$H Dn̂1Ǥ$ȜQS.sdkdV!{t}:Zz6WBqG7f{T3ws<4"Ÿs5ڵcV6PLMH3$'\fE[VRfS(Q?rA.?ٺ,CdPt[Ǥf`Viq%/eU8Q+9Q:Rx`&5qȿA6MTBDǩ>-{ܓډL#]W %r>-5 lawh\ \hP]=|/gҏcKGGރ{C~ѽ?w>όg_/~??~:ڭkK/;ҡ}f7'ͷ^?{ϟ}~1ׯӍ7޹.wd&27nok? }`qHX;y=GA匌y;qش99% {oa` ,ci8.,H "davCQRƘ_{F1p;ӳII$B8 Qd䈨!"!S79bRΘ@` )?E~dk0yb!$$Q6LZPh0X<Ssd4v*xWgKijtCA^S>`+"S5 O͜ң0BV]Ԫ/,L;  'P[?oRP` `j0P;R4!PW嚟511Se, zzF Efl*|*I`*:!ѼڰнA^/ha֚Ivu!4M K޴RA鑆t# .Yz8ߠiZxnvqttMqgÀ9¬T+*gu}nfV]1ׇ)숚 Y F6Ny4EHN榺Κ4 9`O1 );mtdi44 ittIs*ԈΰnH5`zOkZrM훶8 c[[\4;XFe:.S0V%1]PfX״mӤQ~4QhM"e#YqjӶ޻bhղh!p$P6T͜JV1-[hw:5nBDHbT GHPAJ0E63 Eb|B#CdXW2++4!yZxeMY쨅\P*wW~U7P˼3Wb,C@V([HϷRoa1w^/b͎ byT4 _ &2hwܪaR5Zv -c-+,fTX ~AaZYQT,y3kheC3+ɔbeL [!Fq2ödB"6BJD!CysCg?xOB ixR$4g4̓y$)c"#a縙4S0Op@H)M1-m$M)<01&fEtvٜʔev!1i hjEt~xK4?tϾ /mWm߽#?⏏_~Os!zYs}3Jx>`Y/~"_} ߾}[n2!y/~W_ϟZ`/ n%flѥ2{S ,;NHMdC{oq:MMm{wcۄRk{{py.gݷo͍^[{۾IYl8fk:F|HxgH)QdBd"n,)VV0 %؈Z{Ys-YJYȼ"5LJYy.UI]Ĉv ՉweU@%`OX:.x*[P^S5ʅjFMBDj:[NuC\TcA;hR1Fh.0hf1e UWϰQ.J%IJI)&ݔŻү(?)BtSp^P`kAl+%I;hUYk\‡ @M\ &݆u{txZ7EEoa)yR}I)h .vZu],D7JEB2 V;}Y8"ƈ^Dnp~v;(F.<2hVC'22q4!F bC5 !`xo$1osl)MbJlåK8}p`3mχӇoMa}?})NI4 &oӔiW_r/~o޻/|eh<sܼÙۄuJ؜~}n|)磃GkOguНxw>{' mO<w>vCpMu|Cgyߦ2zu?mҵk|'o~gtW:b1̰#N<L 9ھ7'Yc4wӌql0ϡ, x%e&<9 f0Xе*]- zI܋!8NbGjf itM84-jn!"2yãåV yqzxVHqUآ9``8=;4!.t-N.Nb^]/۶GJ(h.Qvh7f݂rv;}À5onq"]ݤ`Kgg).du|` 1iBk:zӢ@:ܼq({"elTTC8j2 q@'H˘tz{ RbH+pc{JLM|0Neq1S L0bahB٘¬fL:irJkQ,3k!XUU]DkJ,Rc kC 3*z! 'X- ^M z!RbdcL' VVvc(s)#KF 3|q0Nz,YViZQ:uyksS"Ю6 %W{e40"UJPb<ʵϥnEj2k(Q"rTs%V ,-TFJ1)>dB ~ZfPLDi!rk xJYXb",TKZ,9kytmWy[M!LyRCqb٦N۴~k0a;Lۿw{2y 9]癹1qʈQ|8=xyOhOவ[t?S?5ymח/`~_"7qs=S}-|/n%CD7 |qwwmAALcI4 x>~u} 5!9}7cY'$S:o8YKq 2H6 &[y˼~v}`}n|c=5X-9"zrrƺisx"6PC:2IЊ3ow{԰][=]b=1{neAlLc]!*nrlJԍ,W?+$Q/ IDAT0j,`no[ T8b(v) G:TpG7E̅ VuT@+YOE7澞%AS TuuJz.kJS gMu `)K,QSߟKXty _*̬!Rb\hyzժIYDiSU.R]M7z5U*=Z:2VCG9rKS2U]Qkiv3,e3!h:Xg=׍-aa%JsտmUQIAI۠:9[o68?Smh{lg᭲j%g 4pl .f:UG}g֬A%ZB_)1Q\uER0`kra;8b뚢 .ZJd4wp]705m뜐rCӗ]덚PƕUe3[蜭Eč)GHI%Č\߿ub-UgzQ @ݣh! a!l86+C:q;hߺkIr̃i4Lgoܽsoխ< SAq\;ofsf򫯾}p:~gW^N3&=!!7#=ާ۷r\v\|^>xo.9*R7g>3?s>:O֛z-nݚ= `pY}k.T4(;߿!z-orO<HO)2γX٧f~lz([Ӟ}G$qھvovrMd>|U|if zF9ԺUiS&Fiv]879 0 9o,ۃΰsƵdي?`2B3]ӴZc|\1yg]cmo9Zk?$,7re3DXCpP5ڨkp8v&mޟZ0 дB8%8FH7+~yEJ{csCYdX .yy>-ٹY%z.xϱ3fxL4@ R[= { njqDrCHPփv13Ѫ*!cLcĦ$N'WOp{+%MG}- Y9m5QB"̺9}J;,3ͦGL-{wDY{ YYש 9% Co~zP=pR _+8 ,srFfuzcfH`ŹP7YST%2zNu .W_RDTrDTJB%4RR(ES6;!Yu^v|~q?{-Cfē-Zȏ=lJzܚ\O^ n~_:} {zS(^ʷ7㛿mm|y$Kf^x"޾MNO3[×.mDG/p?Ilh6ɟgo0|k=EW,/W\K., 7yҟ׮ A?r ?󭻋nd)zgס>tIBq͟|tv' su_qZݹy=w '}'|>ly=Ye$>Ր m "ʜ=]( 8{)(\F)- B%3qWرa y.#Lnfabh"r>̘q-ar,$,Y "fr\Pa4atаe`@I# 0O>BB 1'޺uʶƲTs?#r%AMH;uf #NzՍUϤ31\7wTP*-{2R[V(RB@߁Б0~[i-3CIbɣyEޯT-=Sal22C}_。H (;X`ң3h ͂lm0xv C3bTfAJ)s(YZW "S=DmV`&FK4\ALuRya:v1nBLtk#r J:]YJAc[ (؄&hAɘ77\.`H)aZk51Ν;qQ<:wn*6V}Hz;8"650Ԫ: qJeshqUHނz!GP#q;[[t%OiaQ@^l6`",fs#+c~C4Qt ]ӠPv3a@7-bb䦃nBPc'2Zm4'H&\LD, )l]*gUe?mɌN(TOɚ@{J-3gJLJU[mdThNA!_a >MHhTl*Rt-pXH"$&r2)UUP'Re%] mL*uR BJ39W[M`G$ZtNN? ZN?N%4|RF=Lj+m5\ uos2V콫Çj|B+`msnzZj,1 ,"1K6Q0?J183K)&wX^-,/\O3oaSf8E>-E<8+]oz\.}Kd>W Z/НWPܷ~杝fCL$6  sWٟztvx_߼yl lK}]\B7nܨ׮]*s]]mLt-]՛o.>=fޕ8o>b~޽!Hrw.#Fzŋ~34(W{{/B?q\ c8^_"իgHB_ g|积˗7mݽGvq Gc|7 77X}'ykxOۢ{|vcT7}xO@Џ~7_z٫nd\Ao\G?#NM@BANpb!Z 8J?D {R LE s+L $ő'Pr!khF!{%;" nϱ'B`wDGdsDk @DDL:' ^0cp80ZMQLPN 0H;\,h"UXhȬy3W+VLQ\mH=]ɺe NaT' U febj)p*2?+V_-M~-iLa;դI;$wzM6@t3+gϖjc%sĢ&~z-v:!6Xz֫K&1F8R :UWk_=Hm,ٯW{9&Ҵ":Æ1 ;wB0!cLZ]d2 rJb>oBjRGؤ9|\2SC8 PHƎE)fM1d;yvc0RN)bgH  JÜ3] X; ZR1~թ=`r@߿~ @=Y `99]azc`9>6\Ek]G5T Ttm)GmvM:=Qd, <q]G4lV4Hx[= ڦ1o[2h` 8qYfVnV=SZC)4osQcBh[R0[̬D%)l` ym Q.$mA 1yK]d}skMHU୦,Gjef?<>H6PO%C0hU:d,2TFVSR, IfʥHAVVleU%#c*11qB[02=3fzZ?9y_>yN׽Wf ltMpsߟ팏6k'rta%J9o>sK͛7Gyo!k&|_+W/3?4gL>P9tie~#? 0%3T%ou9<WqQ/ vxY͚s)u\py8o[iXȃ*c>n}_۽K7?+w?1)h+?-DO/'{~a,/n枖;Ʌ.D{4>=b\'%1qX%3B>&E82סkE$x\h8H.$efYʐJAf;Dh 98xQ$,g=b;8 WL]e%2 3P; Y)Z` tQ1q~4N+CxDP&ٔ?TQqc-N̫g_"r`4ߊ>jSpKI)3BZ7ڷWSf@0јuMdzɇ@lc"ct|6wfȇ(Aph cT)E1$VZD&4l蘝`#0qT@l)UE?H1*3!X#)XWӽ[Lϫ$D*UR2oJ1f1h ň)sVM1!bԞ?B0/9(HJi⠾L %eLL/fwgGTZ d*cFqhBGcSؿp.)OU;itavϡͱYxp)&j!UC3u 3$'"1zk VMFMEud #oՃ'jX>_D-CHX1'Tj_,I= 8T^)͢0c#B#,UUҗjut:>}_؜#COz]~_xZ%Qu|$ܿ=?~{؟dLD@x"qS7 C*/$H^_rK)#3-@(9b$d*2W[DVm굀JE,jI.R=MΤ^@*<kjjL~e>-+yuULf=rҢ_IwÌ+;Q+$ ehR)Kg&6~Pt6QS02^ ֕QAGQ cuYt6͖VR5j,ȹ)ӧ zH񬇹:z H@;:մz8S9쵉)Ac{8笢bP;Tb78]1 ԤP}Z ұCPKDބlyVFDH Cxk9u ) 9<8olzɆqfjW sLSvk>M /PIZH>t_*sL\1BarJ(ECQpno1/%)(j7K(@bRߜH!=W6U=ad$X Mh| 3Sp6@Ѻ@rM(ʲ7!1ӖjZ ת ɚc(o{414m<ߴLmU)he.JTW1_i*cH2ߴ cT2:5M)5 Pe izfݦmuzC&@= *yjuAv`PAaZٮ6NEk̳k;YD>ke-|Η;;?w].>䅋\ڻpn&޼zs{鳿zƿO뿼1 rP<'zwO?t2\фW=Lk׮/|ॗ?=sS/q><Ϟxbwi*aBlrl^RdW@!R&LjPzD#>5i/x)FKP63c>kr X.2-P`k/9 5TA6 [HL f@. .3 n6IuV,Dy~m[4m ;&Jjī|7M#z3I]·hGd0cY:jTOw8b/9קzxdzus z"0e)QA{5mpX2$G 6$ڠɒbD{eĝ~N0ʌ2i6Dj=]둋  oXSI)j2'Ihb.Dr)Tf꫃z`QG"(^#i:ʿ 2+HޡD,z-pU6XoG&UȂ~3,h\h0@'d쵍"-P/nlG"V5EPY~>6 f}[=Ұ 0i& f8md:+2CMht% rL)lN"hs4$b 1`lY_#؛ܼLUTdِX LR~w=d/E P'=s7{i4/D"n|h@$DT)RJ?ls.IhspH˝]߶|~{ε{[>c.]=౦%ΣӰl[7a~>1~w; Oׁ!.oypppԧ,A뫺Oz2+)^|͋??|zw_yxXKOׯ?rٿx _}n/_/o\^|Q>znk.q,/d9qˋ7s[n\.gHf/?Ӈ$@9xDTDW n3ɧ M-_Q /47vq gYd[']ys놔'nC}`G <8=$DJ)95as$䑅ZG˂"R215& TJ*BN#X LD[H U_dJ (ÿbM*"oW(ҫp]byQ xT\݉17K7$˪L_6@SkX* gFS7 +O&Lأ$.tS7Zi_ R.hEbdC*(ñSڜ )U`pO ^sR/M+ȀEHRY+O,2 1"Zur8EkI(聬F1bL}kZ =1»KIt`R`Ύb@oAr2/&MP7&MRAJKp2;nдH?ӓ'8SP,䬯w2sir@u1D"-ir1M&`ݖaX.HT0^8b9zu1,hBbA5 A5 .gLX`}z_߬0[,E8XNd>rP4TyLi%e~D]sl618z8dBbo00͐v6'aq`կY9iTV*4Fu7 Qgd:P*)"~L:\iD M. ~麥~@"Ŕ rq1:V2RʊlVVYAf3]D B*LF(|h5H9^뗾 1BH%5du)"X֖*r.lk(E?[@7߲y > l"x@Cd;Kn6CTňa ŌXɼI/S0 !rޤ:\j#@>k;UXTij0 4VOeDaVr%Ce31MVɂBU-SZzB!@ ~zV퀔"J4oMT tR+yT:lپjH0IkV"a~vHMY"Mf qLRD*p"/w;ؔaܝv.V6O.>ox^{.^[^/2 /f3v6̂vwx~|1Ds@v?8ܾMK pW}|c;.rCmVI7B֫S +;+s1>6/ R8"#|_!gpRP҈BqTV08gyk`DTH MP&JrF v)M!0Fd A"PC `9S4'1+&,4%O)ܗjnfrSo>l LJ5I4dUZL4u `LOK%x[v%d$3⨌A8XT"PHQ5$Gd.AイIdgWfD:cvf6Hci8G̐Κ,z}s kjyڃYשYUƄ T6=a"PE }4Ki#BN#rAW%G[m~0"ldôb`luڭ Tb*5EX"8v>;&a.r_`}7lohqÇ ?>u.@p-.s^v?f _W\in߾]]9ϗ΂z2*^oY]m?x.ۛwnC8+7n۷G>Rpjy_k*e"|#t]~ ^<8Wb͛tn6wԜ{7?FsqKvMCoqqcx"._U CUc<b!˟?⯨O@WW&ȓ>+gڵkxwDwhw߶;0ߝk]) O`SN'a 0\ fH1K)nL-r`9N@ 135a={\{:7p2WRnEę;wuT:5&`L̓y)B>g` ARcݼPc`f&UOɂ]73:k\eU)=-[5펹f >qyk0EGrz Jm &R״u1* 61,Yle_!E2wRJ>e-w4oCw9 >e&@}d\ SGS7AkJݼ>aB*P;x>4rٜaBTU)zfƷv/Ggغ_cz~!h`ѮcZ¼>#!HrwvnLB¦_+hl`8"˅N#~@B f iyy6e{8V=9{orJY;(ױ3@{:Q|4x јҬ}2{ðQyZI.'Ch.T?P}KذA")"f9k)۪H= ECUoY"+gKM:FQ pppIz+=( u1' ԅilZ E:ωMU1# H_ctԺ-#UU d pj"Mc)4<4GM,%F4؄66hS0HVDϺ1$VJV1JF~ AGdy}?ptoݳ \Mxf?ysuϼ~+\\CuRQ:t6<̥Vb3Kϴdt3DJ,ȹĜӆHɎ9{߆&q]hڦ?6f7M|wo6r|;7^_=W21gʫl/ͦtSno}lguqΝsCXQ jX?!W\/-΅)ˍ˗Պ|Uy[|_~57WOO<񄛽ݳFY߽S7v*;t6^p |?;|:ڨI 4TeRR 9þ){X"4E.Y:YdM0%D+L(d*N% @fGhZ4m -r/51d_ )+˭B+ ZafXBTff1H2c8 ʭ3DXKi[F @dȩGh['V-CFLEYimN&(=h[M&d% )ÙmƬQA.1i :Gb$MHD8]o,̃^" )c^#bRp bңn*eS2~nlbI~)hf /p9el (E +k}]Sǔu isDkvfFÈR4 |6m*-w Xx?4U@Zmt>4k%8B2 )75R} KV6O=TQњ Gu MҬu:Mf ~{u~6Pezjh ʥ@;ihV]4<lZI"YHjⷳڋ3)8lXO_S8Z5䝖S)p:bRS ԘHMI޼ La!Cv %KX 6)ٽkL(a@uB)EdYDC uSGѻD_R="):}i$!B): ON че|;pxo䘹8"?~ t ߼wBKƱlʽ7(,wwx=w?1`B_U_%+880\Oݏ'=m~˷?'/;O?\|K21@X~Z.xWs@',''evO!0WO=%w,~y LEn}~lk}&@@WM2u-'xCwsm#s̳(HL }߇nt}MXp/5gZ˽Q A$VU J.%'W$sfKIR$Xv9w\D]{* 3`X,!㸽RbӴySryv88p8isvfg;y<mciz'|ķ?/7wr "gȻޗS*xkA DﳯyY_#h;>3x4͗/_W_͋B޽[Gz2 /ڍrK~_S՗~lտ\7Nj,OӒΥ޾.pNڧ?oܺ%7n?uww)o͗ouK//~fw7?!?)Of^啊t͛W_* ;wg ] d:qz~sřiZ9 Hʶ(VB><_ru΅ LnA$ b3xa "d|V"1z|Ί :{3sQta\ba"y'T7FTL=XorcM.I aߴ=x[A~u4j'N頻6ACڛ@u AQP3%i8ңCksR eB ezv)O1\+t kE{Xs\CÊ9V8BK)NovhCuaN5M@(@')eZaX,wU7)r¸5JP8Df=52d1}gH5ɳE>'9%+fVđ5~<:ֈPe _,`1駟Q$vn4#ΚI5@u+]of7ToԀy[O0F8^SӢ֟{~izߥKݽ{.~>/%g,=Jv?tWf^߼^z}~×nu|boگ۷o:|#x}5"Bnܠ׮7oOOo_;s6OAdO4w韞[ܑf#oSw_r)WWc?>; 7|75_WnrW>ɷi_CAWu޼I/\8꾓[\.ﹴ /esL$cRg ᐝ?]$GD`x6X p"E2BDD] OAĶ:zHrƨ*0'yG.,fdcӹSM}Chx3 {ԫKCa"* 0^X[R5~T]0X7;-MR ӱϫcctꨴQרd¯_(u? G%"5}駻TܽSv3;/m>|&n"@l~͏4\zK1f0O_xkn/u6A Vco; (۝O?I]Ŀr\qEa.Ź.KJx's~RJv˂ &)s.;@ PsΚ@9LLjĖ/!V̖'TPCMڂWoUdLK!`}UG;zk$ڤKfj:ݯgoe̩N2a =WztXaE jQ=>G AVG1 Ud T#1Zx eNg d. ٻ`S]f ԦČ +r+k4IfzE]aAd9iQ^%ljAᝆͭtI'å4 e)E@s̕0CRA@hKf.`R]p v܍AZ1R4ٛ4%md0`9s1iD Ҋc&IVa5(zY3f0]סͼznU:`j1&w: s=i1J7'as%HR$&RVmojPҌ~.C[Q!jѢM!yZ[ͨ+?j(A ,VpN ''qxp"4fGjqdK(Ha\{}.qɀfE <$p$(Q1et%fD?9}.URFf4AJBpC' 5j:E u(RPrDvi7<#cZN=W ɓǸp0ݾQAYV\.P(gՂ"[Q:ru`Ci!&fe9(bL*AHqf@lE; "(C5X\QK} BL#ZS归VTSߙr zDf\L2kQ"ŌvD4k#ڄ:3g@ ӷ6  ^|;: shl @bǬ ;UMn[s'TEl҆ ȍJ@(D$y9N;aϦ8Nq,㜞PrY9.J iG/E"bEN} x/ܿ{w;GǞG/Åe>m_#ߚnO@?jξG/ȏ.^\>w.C'u2ՂkD?K_7+U` ]yy84M‹Kf*>nۯͲ}.x:|þ "=p7ṅogvEDDM$/K՟ [t;}pnU:x/aέGglN9g t))@JzHA@Z$gv ~eoh[f ǬC̸Yw!P69COn?ͫVssk ka]Gj*hWhm+Efm6"ik/im`kg,+*T a!s(j^Rj @թ`TyS)&R*:v>SmNPmJǨD*90I?tݺwoV/g6 z%ӹ7v崮O%gd\] tG rBKI /*:K)QDIe{vKAWMI"apB(Y&Ǽ('3sH(K)*'OkXt3jg?Pc%M/S7m{JϣꦬQokMj(cF86ܿMjML7W5zk(QK&د1 ɚ7NXsT4ղe-Z-հ͹*H`&̣PTFFY%vۆ$A0s\7>y^o}4 z-٦D v.SnGkG{ߡ }/F1|Cp-%"N=+Q DʕG6bB}-  h<(q*7O# 6 ʌi X 8D(ЛHKF2g~N8}\t'<ʺtgKW_#4F>壗?Lڍg:̘m_϶H\J<WIxp)LĢ-[Mt?_EG;f\y(9zK"2'f̚s3 A(Ey@<99ʩ#枙@$ xO $W& (uS 2tQ5g.!jc"qc^ƞ.{Ĩo{QjO:_֩!?"-_k*^r}y"8_atG=3HY-҂e~/Y, R'Mي{+j& :i,V$YFEfoVƮO)Is1' R3!=dl0UWgpCJC!xC"qcBnRhͳukՆ\[ѳG4:6q=RQ: r?zE )+IM iB͝:/r5À# ]+qݴ܊͘a^^ vD˾n7bڍXU% [a~gZ]4ϭ(&FGG8<{'7- Mwּ"] 0[4OXoP =*>}(PР޿8spMC66p=[A"JDHQ*aj|>R2J '>Rjj ]_gRyZ*ElrKnǖ-̛"<}ui545s3Ym)m{Eb$1DƪLj?q "IRdsT܆0 Nsǘ 5RB0jO}c 4Qp2.h`1ǀBLq>;TdEPak|Qڵq@#$}@aFm 1'pj*C7cKGKUF@{䰞Jkg]R9b̆jA޿HC J !\qtYt&lAq)bû" gZtjuP߷NMEZW  jڰkņ":j UN9h3RB΃D$ \wVi$pGsGO<<ټ4Ƽp9ʭ[B(OO?=<|ܻzy/ !o~~KL,Otk/c+Ѝkk/$x~ ohdyv>km|/ó›޵}u ŏ8~j\&BqpӮ]/˾24gnCQseӥAsV#H¥q޻@ĎEJaLʍ#&&&btK!!r a Z-S[_5Y+7u3S~oG@{]!dZahH/[QC=@2tziV/MP$l i~"gƜTV@kcZaJ.M_WIM9gtMt]0o̭1N34i&s e%﵏%d!@xq9=eSy dNY!fy~113aX 3~5"fQ8<[L]49V418ķj^en350l̰IѭyqpgohpՈ)ҟ:qvaق1jwPc\EQ (HArkj)+i@YCu#q!H9KiL.%%(4ɢ pp*SwQLyܞO[ ]ɉSF)Ƽ˺ (.L* JήnݭsϻE߾} Fj kI&??G~{ K\xoW6'<#k_߱tv #$@Gƛ2Y/t8[W\q7ݓnɧn~8:컟9y^+ ' s[rWMQ'[~c.q+G$ׅ^~kEy}-zx@ۼYzbxn(29G9' x3@Ʈ_>Oă:& qs':H>xM5v|o8vfbff]wDX OV@ 6G9*b"l5@υ u*c4gTM;տQD8EdfGO].J}+L`_4ՉtZI6lNfn[S؉tl*FC4V8v(ETيKdzKS-^FAAs"9GE> fCŐ=WCj/^Z*rS4` z\1Ʀ "ψ4{uCDJTr1g5;ǀI`DQsFZ}ڟn@1HQI5a9z/VK5oQptP!z3MAMcb2m+Jd:P(YTc{JQPrDZQ\ݯ,k鲽C55$l7A iSծ*3kR{6B.zJi!ِ"1ԼUZs\ZE^iu |@"ɮw]C@ً4L<S2gT{6W+}n5[բ0h(+UtX0:ojI]@9cFĐ@榩(20M:t.4Kgt,Ո)Ysb4ېG4j4W^QDgl>^4_uCuulcsz,uoהXѮ[ӧsh 'hTR`" -%W.oq4u!rpup 754+h|F2{ w\l=HX®%!yA-YjR~"s -pbD躦;;gٯ`f"B44[1 3DP J v*#y!5LfA,WӚ*hn{aq$& Rrc܀x1զB[46;l'[oGc| i޾Ç_͠=wqX.t!Γ0w0,7g>rw;wdZN~|?}c.sX._?׵!}܇h hQVݭ[~6ߺxK}੧h1wb3wp|GzO_7s7*߸s{rwzDž 1a17Orµ ,_*U]uϫ%W?q{H uV¸e(%:Ĕs.">V+lW+w|2^}Uv հy9ۘo i=M"r~Nk:*?p_h.;.6иt_<~yunuR)]afR:Y9 0nAĽwnEzfu!grD!tGDD=1;λ{jL,fA5'oOR8RzaB~~+ß\:E^$ߴ7u ;=g{<*W0Ԑ!N)j6= hpWFDS5P$*lK1Ƿ=u2>b0umMR̴%qVdh3`=M8h B bFCLM73O/\6vrN7)jΖYf"ln}VPiWŨ"t-RafkT[GP`o I qdEL7RU^ y54"ƈa -s&6E'E{rlLrΣD Y.:Gm|SѦB5~55YX Ep`dKtzn{T\+1ZdR[,epEarnk b1 jYsNgRlpxp٬G 8X켺δH6})kֆw2^u͆8OԘCdQ4P C { ݠIՊ^`1E2i0j_<Plpcquâ8 K6 Iinf d"Ae}*%c\NRcՁX8~@L. sG)h(zbPzEcI{ۓ֡5$펚dm [+*r+z{sk4CW ёb,SͨUzX58)%FwN[e}~bbٷ~-bJj Y~m~3%1:-ؾF1)"۰ }>cwTU뿽s gً*G {lW!h6P7T3[΢>-֤*P׆R3!: `:fHav⽇ysJy"B߅wr1Άй@C%8[<ȯk_y]w/{w~7%I)ݓǏ<>s#BÓ;ttpK<ռ KSq֭&|1 uVk Sf~}B1nܥ7?8*)ypacwsxq,c~%,rt IDATQ^']x9DV(wossρ9G͗C@ԝS5˗ ޣ\[ϹcܛqڝK"tuy`򇛙b9³' rC/GB@܁f|!':,+&@pɀt G[T*s@SD#IETX'~lԹ6僡w3dST {TԶj_rZ#xlmMrmQ3Jj+橆[sz=mMeZSPIb1q(PBX0=xfi(Q Y mw;Tcyx? J1 (iN&ۧ֘0 jZ0cG 3y;ˬۤ;xr7HsFLSsjȸjZx]fQ !IrGCQ˩k shCC>DѶ3xbӓ%U9%,Vȹ`X V:H)bMR,<^r3m!H+-RCX-lNNZH[17pw!9yV4{DQX\0ObY]I&qX;:"vjyjŞI)s9lYN]JBoGĴK܆)g=s %+zZR 2˖iS 6F g_9C>e h'WLI6RDC5Vl<-FBa}n{"\.  -3TVq |g5!=7xf-6RVLD,nGJRj~6_pVg*Z{w52iO{VLzlݬk i; -^s[{9L^=5q;"pkQA{k=1u&ExOm̛Vu|Q>C5̹]1){+%,"VM%1 "$)1k0_ h9nK!*̒}烐rs_~k\?ڥ<_ߛqw}wh8v=IH>rW;w{+t'W~|WʳGGùpo{*\7{Sukƽ+tS㳒{rOo'~ܺqqF}/.n\w~)?E.izO<ޗn~}w矗3.6 !?^Cz_]6::E>0:˿!zʛovqw |zwbVÁYu]p[\y0Edi>U_A|DLgQB'%;R;+w=3(M80Xɥ4 ڼ:":ɗZnkxU7}wkGjU=`W U0Ծ_gY$uOsĚV5E@ fB/"y4IGPq։sC`H|3Q\eHË1DmAMOL-(^Q9ljs6d I R{\MVu:5*F-^c(.9cG̳F ӄfle!х6ḘyK95-NQ+bʚm7ըREbr(ݯi@Ȓ"C  Hbq{ C.V lH)PE~=8<.huɐӒ3bi;oqIVZ^bb9`7nJz1-OhJt]cAMGgALqgEڃ5A)UCV#R)k{;>unF?TzW*_)ƧUҮ枛s1 "᪟{FhӧϹE-Ml2%ٰR2qj͂Rxfb4\bZO.vu!8$춛5 f~(XnmqCou5܄9κ7r?T;No+6":X(u؆2HEdLd3][A^$5b^!)gMV :kT;.x C@Oj5z(tX Ujyt9&RuR{SOdbfk:Nn}_M#\߫Ռ@j,D5tmm{]_m,STt7jݢۨ`uА ee7Q5cg:_!EQB] @Rr"J…)缓HHҼmwos>=9 v]T ""1 y$<|{mX^yس}Ϲ3̥D}b%љhˑׁ GdGCh8 p?f(p~fkiM `EƵ=p-*~ 9!g~{cK[q43z^{out<[?_׿2kY>PN>unν9dww 2zӼw} ?ro޿OW׮}ڿrM}nT"`7_Wv]"rkKOݻy<~o},ub;GA;%{?tP<QϺ(7sϡDQ8圻Q;f.J)JQUc촖.tݦ֚"J7ԿV[S$lnDj?č,j5FT`1r.X>a(yʰ*H!Vʎx[M6.AX__ϯ(ٌ{,F3aX+t?#8um뉼cQ00ak:"hNVHrqc&l7:tɩ@O]0+H}Z bJQ̨z3YAf5nXX.O),uN]Dvo~%COТJERo*DYjSv:X\fAp=jjpϐ@#{*b$iuxDL) "1uFӷ :vs DX;?h`B"GK0^aù{m,X)>b&| /vP#@ڞ莢bmSզ]5[U-KBU};*ט"+1 y2j]g|9LCӯ hC# R:"L y GJ)ӴM.Em[]Jܴȫ 3{@o6U#L=vog_ u8ӧd0ʱ RU*!doN`ТRNpe)$)u)Z!ԯj"17U]k0ƻo=f* Ȳ%Lyϻ6s)Gq GӟtT=Tgtx4s_˗/իr~-_Oy׻˥6}I[  x<ɚA}~mݹG \ [φgB^g ?o=ur"'eNzK+w[^н: 8}ntmZzRo{)_(~V`;˴y\wYxIR9g! )ղ!!ΙA%{.jc)4*œ%Q2$JJ4TAjZUc h1zA h2.h΍V(bHh,M֔ sv:p߱# jMAʁrDQqS 2mPes+lC.4M=ШQ $jM. O!NDl=1#I+,̦s U V|'L 9YE%0I6:XEeR>{s8tUj?[KA(bvq}[yYN,LY"$t4JRMԥ4!VGLU*E* mRl;K RRMiNF?3ͦ+Bhws%fC5.N }?33z.EkiLSSv0#%s]%ih$Pۻ32QCk̮a(*FuCR͸{T>xc"ܙ 0Mb )ӥ7n]hBIԊa\:ˆ+`\B g.UCaJf!y}/5:1bBn7GGG33*#yl3Ez?1m8*:;CFJ F#6Fnoz(,^7]oSɵdmf>c.nA)]Q@=}uaL֖[KEUs%&Drc,ר #o7H(VMT Fs9p6Z$N!k&u?QSiåi( u<3,D'nr.=>WҮ؍?V>/Q|m^oܻx$o?ɻ9\*쬯cA}3;;;4_.SO{sq{{KjY.Ozo|cN^//O7ow;r[wh WWT<˱tU_Ar/< uȕ{r ]_f,)S.o3IR(IBcR(9v(ƇBHLP">ODI8(Rb"&$"ʪRmEy͚(f"36b_JG#"L JX 퉂8!zVtY ٙQ6 M+r 1!H}Y[SB%#ٵf{N(ѱ ~kQE٬6w3觀5h!##GI(.a\@jJ)bJ.nNQ b2)$VRHA.cXfB. j.?E`glomB28x1ci AhD1ZLӐkk91+%đE"aluWR9RۚcUŚg.KGQͷ (G::'|l )mE _Bqg^㉻TԼ~l>2;MnJqu׳_tYUo`k5Tk[lV }ףCG.MZb>3|g7aqKqBVȅ6kv%Aב:hz0'-\0ldC7rKG,,ٳZLbVCKxQSKsTT`sicJ*AКVS[T!isF]skڻi϶7`LQ4RDѝh*KD{ِ3ҕ$~'C=)cѬܕQ:)< rtWΖ= 93UlPc1-"DZf3[BV{}UMyD*"pz^[ j' (+rl6>7{C{{Rx\>|i?ןd'/oy.>wZvxzCx|o?s?IL߫W*xOuEO?u }P\p:U}t99Y=e*>q~($!$ qhL,ı9Wt] ОbbC 21QA̛݋Pa!9) !73 ?s#jiʹfŻMBȵ nmM j\~u?<_\ހ3 1\QTPPС7i*tn.Hs9T&fI7ukN4֐xvGNb\46gnrBBX}6t?ɺhsưG @E sK(<9cX,N1 ֒qrr⍅܁w0X8t+CR2bJزNO&ǾkFq4aCJ&bal9hYlnoa>!45յ| ՚DA@{)8f+pY_GJ.03A! {={őWa6!1{cLlt])bEY@ x bđZ*>8K`[Y*llmX ُLuNڐ?4_[<βL:e,33!jԄ@ܐfbBlf' IDAThC& RLpәV>E85ل"dh<G*Չ29DZ}YRPi8=zCtjQھs)ˮ4U24fƛr`s T hQƮiJ6jQ ]tjjli؟m"Uw`D>Qu Sv5Ysf~DŽg^v Z6_ED/WMgH*kVqbu1 RWA۵[uJU9f2J`&!nlHD*[!Deq||po8}{\<(5hUF)|#/> 2oWyfD_rs8GЇ‹/wC]=i!O>nYx׾V/^7oPǿ=e8^_{ W^@~;+/[O+Oo_ }~!p }i?<яn,3"[_XkךmKTի۲:T vw>9˗*/F簃="g(fCD nMIzH*VX ( Æ*H&Sɴn& YCPF̵.` H 9s"J4T8Xjq-MVz9F2fR}RƣVbln]MktV|(!o 5 AJ'wOZ9 ;2r'B&To-%[{Y= @ rJ]:ٝ&ҋRLъR^Ur /(kk׬)pU d-;|w+klXDdZD[@>q ޿tIaM!_wM/5{Wvӿ/ڽ{peXJQzz:H9g:GR5=*'iղf3x*qibLba;JHV38gNZ5IDX2yc_YQZDC\'g`s=kcM6=qe 01mN FB˿H+p"N}PZY&Me֪N i! 1iX+`UD@xqN {& +] k(_p4T hti0]YƼM)AFGVZJ—UwBTkQ $bhqA 4az&f1t]2{mDrarp¨{N 1}ߨw5δ1k f ')}3NONPjE%t}DYT-5359PJ25m??ATm>cϦ#g,lIm:n]5/!L:YWrHxHWPǡTm}YL=;Pk sqm.yuraXSCM0:BQKE?cB<ҥT!Z`:WΘQϭbNq*suWJ1^bSLW7gT ǰE3t]g&JrJΞ RMT-SߙJ&4ajmޚ&B՚ e`'["}b{a5Z=&: lnW7׶Q!o bFBGs3]n|lfDRݭiYH}͔B@lD 9ugg狖m_'&3c̀+51R: #UI݄7pWll&T`˶pDf1 ܙXCSC^GcukSB:wu6pt+ڠ!!%ˊk@_ClU5fbq2Us:`?U#lr~Ozm NdzsfgNц!ִtf5=D VEј91)f)rZjEiGJ*RAYFZU9w]1X{W/n~{ΟfP4^ƫ|Kt[o+7߸Ʒ^ʫO?8^?8:~pݬл6f;;g}}yc?pAՍ_łϳ!<'"~:՟ӛ?-=2ww|O{N=_T|fk:@|-? w`ҏ޺U?X9JWߜ'r{m}}}n>.޾MѵC'۟>88=x({/ӕpewvŝ]\ߧqs3Ig?}|{k<a6O1]Ib,F!J"B=:'Hxrw: RѦTV) D74(Whz)u$".U88cPQr4qFu 1*b'|L&n;M8G :;Ɗ#2ҊVI *t:?9R4/LLHtS9cԔU8%kYUSF5& `frp"F|"ÙM&[(-MS|25 +, P["O!Cdr`$emODO.Fi)>ͺ3%2Z~7fhF#%VѴp>sG\Pp*'GG.^7o*.TJg='kP}Y١I+xpp_,{Dz]0?38E||\FU?^``wKWÇ_8KO?M_Gg|#) ݻwz˧>x6 ~sW9oa-ߦ~݇_ƃ;t.ХuqTI8#8],8" #fbq2-RklgAbLRbE( U#Ÿ ю3&@ʪ -P&NʢRJeRbN1p !DZ1%<V(eaiP-+NJ5[ԧmkSt+VM;xz٦SFqm92h-PSI mE0 0`- AiA۴A-?+:2 4ttv_^tDfF&={5Rؘ7# B:OU1X v(2`T P TlRiL2 ]n>'>uq&WND5YUS:\hnmvьL+er a8:3$U V3*Z{+ kaCHŸ\xHe7Na*uXKCj'q eׅdzR,aQ@vT|y{.gy&1&RLjg T$!sؚ$)MB<)L{Jj)%u)! %6H"`t$.bi6THi*EUHPI¨whkȮ[ e{.BTbEp 1AY\"$llۚB6>#!G7kx^& s@(EP݀8BA_ `kkeDpc"j)^W jk NmLnՆb1$Ԩ8 ; )vsW5%lPCyKӷJ]gh@qF54ic; agD߫VU)ۃ * r 5U)DЊ~*RMִ 9*hDi¦*SQ \QBQw6й o ?<>9'Cbtڳ4&?<ځ|J+ӋI7 kN(2In)*%Dסڜ`5>E 7iMfپ2:!iݼw8O y^%Cb8f/jh[,OA7kv-b1-?&-WClY &Ԇ\cYd0""(bXCoK5jdlGs}*X@"14iew0F"q}c dCF"EGG(P^&C2BJnaZ#"BjfL!TԂ N3 1;e|0 R## ؤ!u6?0,c(ԙVCo}mdڣT"d1Q|cLHٚa AuwM`tiP (fSŢR Či]#c5P$/Tm`96} gKNGA%ȋ%*cƜ,"RhVm.CR|m rBeTLWWh!aav4CWdNd 1%RmUtD gF@.{iɬ01cYd I5ZLnngfm\ 9½ 6|ofڴ>|jrnٸMitiWg!=C 2NѮuBXA-pmBUvR.6gN0btz* +T .[Maքa1L҆yPN̥Th"Lb@h9;#ƼJq446tl.Ө´^KUSr]*Prc1H1|jאP (uiUk]V9"2B)b ":SR ).9:;D7bG>a kݘ~z~0Q Z%?O_BAF6t\ɈV7~jyxk3?;q?Ww\|pp=;;;t 󇇸hܼY~澟˲w뿊waET }ywwo|멧|ᱏ̶.̰~+ms>8>/́/< smYC\et1bwLhzZ+0JaХ' y<Qyl^6 OfP㘝 IDATSB, #b`9 [̔@ސt899Cs)œҪ"U}izL>ڜv| X~t]bJ)8=9޷Ŗx̃S jW|{sb4B.A|m+W h*4s Tza}-%D&Dh[pZ (sQK zD`TbmP7&EӛR̠H,5j>smq6fQkBھϦcsZ,Fa!>SoJD ~ ?Ѵt2j-jD~O|.+䱹<`9]gU< [2ێ֜#v- _w3LW%1ٴ2fAzaai D7Ev5(6WnQrXZ3F0Jis5@!XLf8 LFaӀ@"n_ ]_GLfFXQ;]!-_e4]y)3H3d:JD2QE+4v&`Bh jZU!rZjYT1r r2&:He.A8ĎA2u%S )R.Ǝ[u?g^?ie𨧐xC.d[rƭ]op`z2_ۣԣKJ=>=wU 6Wۿ(~P_L?qp _7ǿ=﹠0~Oo|q|gw7| 7w$_~'¸m=gb봏Cxz"Cd R\9}f`}!*jbòd BfV( seF)nQ nL+,tN(j4'`j@upA;=8(xvXȇUm@nRk f)nSs?!U.4W5>re pʕfn#M-jtMk:-xa6 &V0P E2FA5"Zg,ATp|r<[duq`ԜQFK5Hf6 d^d{0gayj` V\\:ݦ,?IK !Ro8rXiS1vXMmo#kS}1 \DS6 L\>{q$lcsLDÎ1抮єkʹXc8UDjeELDeQ{]7љt%G<ѫg3-2EC)ФU5Y<}^fV&/sƮ5]M Z lС[5jUlH(ژ׷Ex=,O)93*ڡb^f~QGBg"C3f0D@u(~N60I"*89ev=w4%xĎH{iK)a9 -3UQ0fC7w9tO~W?қzsÿ܈emS7k/~M`>._ݥ>vŋM]Ѿ7CDEcu~\.]o܃mWw8ܼY i=I4ݺu'Rnܺ{HGѿ>zx1Nڂ:UYga|TwO|hm|ߠu.v>@K^"{}2L$ȀHHDq)J$B%%8(=#@IF) Dr* 1*!$6e6s8ML"HDFw U/E75hF0H OދTFshqК!C9,F!d <Ɵ70s2K1Dqwui&ж[P7EĦ턼48j9vvXٹݚYjGw6^5CP4Ş]ݔTxa衁MT)6VwBͲd4/8b<d u,K, ZJ[luvCiLM$VL9q cՌN-2&4#y3~[jpk@Go4wsKcG,&aX.QsEGÀȌͭM)lxըYԌdאR-POg 1EHqTQry9ii18"f7PLMW}o y|L@$@YS3ҖC[;]{Qkc\@)t 4WHD  1akk GGRLoSBLDfgЃB z@Ⱦp˚qLBԩ@ZfD̻ dMrgv~gdݜjصrf(Q1Et]?5"kRd~њiHHNrm`&dzD]26z}:ZidS!"kۚo h9E}m $ vM54^DDbBP4m ZHa/(,=;[CM. "BZ7bLfҥ+Cqj\cplEj9*` `1Y׍Á'569Ԥ: G0S$J@= > `haU-U Mo.ʫ!15qlh[UpB}G4Gg;WUkUb=JvT&*Rj-zDRI-X T% H& rRsj՜rHQhYЅy?R?G>Ѕ~GTwu31+7o|Sq.`ww.]D{0ܹCwܡ۷oEX͛7G5|A|upy^<sñ8_7 zuuq/[淂>cՎSnl97;%`s}3RסGx/Y90ofOu3ϭͣ4k܅-)F'B9fF Q3b,Gd;N!%yطVUϹ!dK1X-3*MMHVX#m 0H<< c !@<,(II-5$#65NϣsUcU mYbSC‡t{^Q^. P}@EHT&C_kVL-J RZ$  B+f ! C@[@L#PQI'rP%öi+eC7@h OBX] }pwQi" ԡ9JbtnuplTCS<jShcphqkn :)ɫa)hK\wY6DjfkW 7ZcF^D ~.b?sci/thH"H cPFVk8JXHED &b1v@yiܯWo\^r0Szjkp&NB|C?~9\zUu?ǻ!۷@'u޼}g`sO?S{TYJRn.#o_;}:yiɸ~^ 7\„Ay{ w)߼Y؏:8 3O]@i8r d͎L\ɸ9:Dx$$ $R RPGH"LIDjuE6Z"cL0Is1E:H)"EDHk!bmtn"šA&ψQF+b?(t*ilg21K-:TmD!vhAY&+Tt),f62)Eid"Oq7kFj) 8,jy>+EF4niSݍZ!z=@P̊Gb4I\5^RqK:kPh(%.vUDsBHh9d1hC12ZTE#fsP-Ͱ5*V܅,|vv/ooqճzp"?^{[.v>ܿ>.]v;tO?yЯryUy8 BKr=m~Wܿ~kqPB?}4ɖuAx,\y+aGL4e+;(CC8 @)R%2Q`CWJ)L܃$8Tk%p舩#LIlJլ!cXIF@RIU'""28rr:7$D4@j} T3T`SQvĈ\6jQmqp΂Xh9VVi eMT{30YZ47/[GÇ쀔~b⍸ҙii2*K\`ZBTОPV T ?&|&3p5mzH1'ưWXfOi8\=_$ŨT-LSvYË:NӤ5H3rO> #gbpTo8fO)z*))$i1sشGvqv 軄i!E̠Byx/0 j2G3eȐRZ6"88XAvZq_gI!Ӻml M2 U?!7\87PE^ Һw;Rꎦy1bε&k&&a"ꈹ#/1Ƨ8cJ81(!u>`b&$!@S d]SbĦDynTr rTZ#BT'hh>)1F'{w ERqMc &WMq`/Ejtc"a<OGPѦ g 0^x#_.%k@1 R D],:bk G7elq`dGb r̼@)U1E`zNo92_KEj~:uA72+4ַmhz !\# `70toQvy4ʏiU81OM'RBs19Gx53)R& +v9̯nh3ͩ kk@@t IDAT%+J \HێIn2RƔd9FK9nl7Tjt'Lӌ]q1tk b:3r_/u SZz"ƄiҘ[nl?_Gh^M jKԱ2 |+\t] 6ϊ(kpS$/\ hZBkED[R hCnLeNzz!^JIjҘw憜~J24O[W,2'h gF>vN jb7ְ=I4>fA 1v!FAu.8?{]^^GqwiR8>WRwK 'J΂THPBJRK19!2ORVKd H QXq2ךK)RIjaa:x V|D @ j!caE $bN!pSV618q|ժ34P9/oO}u?ٟ;A??5^|E?o߸5?= u=\4؞;kkiz~^^T_8=ׯc~%31]4Kg J-~؅1v QDO}-u!~+:냕BZ<\"6[T ) B)Oab< Nj|R<") \ $uDqGB@~, @)\:3(C V被<GإMǙj:8"Oڐ)B,,M-T5Kl)d@iI g6Zja\;q>ELXC>5TuwV#2hPu<))lSY9l"ZvM/8ĽqA #LEZt6bskĠQ*j0 o|&A)~ŜJ9U*۔>:KγNi^iŢSy ]JV+P 'x-3˼IH)F5zh=~tjyzv]TM34XhR1tͶ?0BhZ> Bmv%(}%P @Ʞnsj(sGdH$`T4Z0iT-0 =:<[3EМ~,j:=8jӒl,{}3iVM3qiHQ$! Ap7C:@FctRFVQknfyJd24Vk#hH߷zfљGݻVEC.E"lv־}fj>kcZkki4gJMgGsk{Ĵw^ϑG"&[tky 053⫳íi᜸.LbBקob8 v҆討z+I rW⡀wO}WC|{ἙI\s.IqC؆K!nM@Fv <wc3zQo~Og>Hwܻq|khw޶r Jo\O޹S .}?[6tStpz}|%pz*?{x\qp]xd;<.C q7b\90ńrY]G=y.(ÐBf< -*(DLS<0\kːs2J91sI"aaU\Ɂx-R1GbXEEDjI%j\!Dc!(\r0o6ZtŁ@m +LUN-65q{3h^SAmhZ@ٓwPZwEk*" ͂T Nй>^& 6NRy`Ҩ^)RQ0R&a)zOyQA݀ST͛jp:vBν#&Ćz͜f# 7ర(h #; B.6LhJ)Q]eTZ萝iaSCjxrxiV}CC4EɘIa,*\ wJ UÎ^;tD"E<,u=B .;'"f Q8l3AzIhX5NkdC!dy m O9BfS»:BqS5Gdz:"{+ՐmQ&ivvi"kP&F0Y=jZQ_Je%O+-~=jbL O\L64M٤/(J]sȎ,y>| ^^ҊrRpSbNd=3fB&-- tаh֋h.Dys=R |B03"t)58jw 44w\L'wv6A5/1@̓yX= қ C옪!Q=RQ84:D %tn<SDžo=|cw aVU-DӓxwJo_}y⽌'[''еkר/w/z]6-0}i~ 'P3_O~u:_ܺunz͛wq_7WBW> +_S|21vuGwRs:=q3BscWU3 V~|0=pn!q\3M"UoYG9%)g)l#p!q]jp#b@Ud$/053'aEL=#5 :`Sh8p "ZIrrΐ!M!J;ŒT5j8u"*H* U=L)EY7|7EVlٸ 딑 v7M 9 ڤ+ rBܷV3`ENnGi@7m9%T0ys:`ں9kRp$s@Hd^\7އk완GJ$ҳ)(\+R 7-zA Uuy4eD{H=FX/C6zΔcy}vheäMwt@Fѩ:00E aCvlo {uxCchKkE bUNZ@ @ wՌA4Y{A)<Ñ}'mGKV)E>HnJA`iaغnKEC;{U"1I40p&DrfN qj-P31˪?8X ^}zJ\Ib!"yLx~> ~e|n{/F?Gm ԧ>|ttDWKc( mnX(8z͛ի}7o'ON?~s^B P='? s} N_/Ŀ i^8=''jſO_r% ίe<LAp!Wa)a;`YFvu"*Ծi8H%̴H#P>`}|N^a%,*dAi^18ׁŠ^ԀX 1rvZE(P&(hrpw@i.<NLb QDN=&Ȍ*VdVM p.U9zmK+/jӻ12+Uz{O_L ).4%@H]E$iVen"ENÊ yXl*O?axyT錺IӮ)zцd +%蔝gQ {~vNj0}M QT=0CU朳ЦMT_Q ʬ4O!K!Yp!)*5i)QԂR0gDZ40z7&Ӯ5 RKnl9z:T$}$ F C` w]:ZRי;N1̜'59Xaݨ#@vZ6KC讎՚+7` {x2pHm]kH ~RͼCP%+&8ġk q@!2Nb. {+U5">d1& vz^z{tP,o)]9oCZm=P! F,.:9:y?T-j;Ԇ.x l*};r@ $,+b"lL*R1ZLHLdqv_[(oj.ŭtď5jdZƨC$鰂R=5Nt$Y1Ō~TsZ2j軾"e֐ӛ&`2,׏Wʠi1Sr+F&hzmdJEKK{_+JmtMN1f{חsQΪ_!UT4İ9NNCf,!i +Lj\ # zUVQ:#ٞ\d.ny"mHl.6$nQ)K-#eM5L(Ԙb "fFF22JĠqV%fUd"fQ)",R4S9B׭yބKLomޚ)E\8`Gye]LD a7nt/ǷܸANWt!'yBn]O3WNwUo؏>l_ۏWW gcܹܾC޼I?oɧ?s;?+􃏑ϯ'!#ŎdB,+(Yh5 0JH-2i : R/㧞Id3.p0.v~JB^s a JØ ybw9tL1K)ā^mn灩i,ͧ!LE3wJdmTǮYMh5fh>a>զ TČʧz-R6iUS=jiK ֫YsihYZ,ŖzD$ AbT9c7+2ƈU? uEu a8:#vM]p9VP!V=FgA+dأsFaD+NM>l}&EZAR[C=?*ֵq4.vB` beFZm8PwFhåEWB5#_<8MN^k"dlL=4#ocC`( akŀ,1^p6+IdF0;ou}7 DZȶ՜f( = `i7W;zg1HI Vg lPP|8 _(uAWj===wD^||/}?Ѝ7mk (jM /ܼWQ?\^ͻ9gv?zܾm}r":uC$PFb#aahFVxM@QRѯC?-a=\Dל%Ŵ"V!3TH 8A71D_*%5E)6" e'D  XڀNjFVSVkZ "Q!Į65SVnczNi (o2LmS(9Mgن S}R2uM¸79e7hhn2e캾eyμh \ +TM5)D%.t)6k9gZ{q>5-j*zUQU?ծ#gt!!ƀ* ;*Y;}ਛ.YˁQdS?t"sA:k:g݀C+LCU+ηTT R7 4"a@Ͷ!zW jB ĠfhƝ"R&uI!yו#B!DL\sBQ&ڸ%;_4;it(EǨ4^-v7Qa=D Z"b_jj5ڷZP 8J{f"n(#N{NqN qJa$6/$Ez!;͘@Skȝz1$h4APfTCFKE}.؁ -E5rupq75ۘ):hqzwF7|WG>z˲7Hf> r-!RS2qԵA>}(rMajuGf]4(~ 5#g3fCZY{>Q2}jy4)(:Gh:34Ԋ)Om?1&!-Ν ?UCju3 iZNfC/ kE@i+-@uj=Fik@zRFusECO9"C%jZT9?";"*eaX=cGKO_~*R$ Gqh,cf:{۷ޚƫ~ff?;ߩGa JOyիF͏Ï5\#-Ƿ!͛)~~N^oߺ-D=^~o7^/S܀ozܽqpr;n{zU>o'_=bO]qsJsPkTpPFa:IÐ.~dȁNaΓ:BP HݚST`^3qHvC/D AqBXCCg:dG1c PKEv!ԡ41o61;5ǀJݦ`eh $Y8Yf>ϕ4DkEhHA.M`[Ы!5{-i?EofL`͆7}czo210g1TU^HuC m"Y-Zc{@i 6olSM;R6JWFj.n8QpdeTT6ȵ:9m^v#< Vp9ǡP݌flvڄjo3 p`G }.E5"jN,=^dq;Hui- #_ IkT^0p$gyVԴ4,/iE%W\hC#'Dn7`ְTb."ΐg7zRfJ#ݍf 68:m>97ڥ-)uXz/҆5QvUm(I(z}mLy=p zOpƍ<%H) TP^~'FmpܤEqj"ZiRg9:P]CC鷵er&P+^5!l @.hMד=5πޢ"GX4/4z iM`,5N1 @+̉BQBGA wnv*Q+@FnWAkyC D25v9P Uϥ腕:ER`b޴SK2(/B躣QJ iQ=~a,Um"zz3Rk..5 !VͼERGN耔lHV26m]8jS3B^%poPA& BW@Xq4pܫgw3DR\TRkfJ'ZFDP#j!*,Z4CCA?gE7 N[3n` Y=ڔRMJˮ5GR!NjZ7Q31|8V0f&l箤 c5Q[%gKspQmdZrM:q"DV`DjBQE½j\-1NYuG@/ ]!`)aڍs<[01RXV"CȋOWCj&jtl՚X4_"4"T+l :zSExX M;ؑZEK90I/GΑ+Rr.,XnoD*#]!Hwbf"$H1ڠ/-yFtCߜRJLkV!lk4:+WiH.)uuF gbf`C{?Y+*.*ɨ,{" lL?j.-C=&z_'6?chh$5zN ,rk 9Zخ{wWj! ɜT}x&U Thi<C[SndvM8kڎ]K#,vX 5k HP :t*FuTPQjg WZ`4UOhzL1r~`.T; en.XsE@m b1`]cn;ų9u }썵58NV;Ii*")i(bأHk;խؐÆkho)昜 QYY+ j2޻X]aZ{sUկ _3 jh6i[H#8 H a ł#[ؿ(Lp7Ȏz!ጨa3ӯXڧ8h3쪮}^k}J-&:ϹCH-w7!lh#4ݹUеwA=63V6ӼEjw &84{CɝHsFy8Ӗ5,5'[FU xCe6u5'IHdD\+&54 e@ c2Mvok5#tx>sϕʆ"=?ؠQj)J f!%&&fҤ5 !P!PH %ךC4pClRGZqEjTIH ۣ'6ٳr[햶taPO}>/s\~=2%Pq0 )o#~ ^n "@~opq\?iU ƍ ܠ^zu[^oVۏCHyG{/rz/޾I??ރz?j"@u>yWdWFjiq+3F!Q ƐxC܄8L!qB`XPsi)xy~ؤ411'DXxh( 7V:1A5" H}ijnw"FAiOQ^kl!m;5r[n-C !.H_MLDgѩ#@cbzڴ雋" lgL"Dj.8 ?v5:lff*)6w3hDZ*FՊR!Q:dޥBP[[af"z7t}^So|4l\i#i Ddllt>3L5)X+H0VɹdmVb@Hɂn/3qS8墈Q]sd'^&cysh0 Cro{Fݻzf?aHFIM׫i,EMdL H>fԂx,4:tMg.5sPcu=.Wkk(4ccո @7*c+y!ң54~ ~@-ZԍF\t*׿IkcLج7󡬗fnm#]ibDOe!"X">oFe1%Q7ϩn+ ǺjyutRUw79Z*QFa\UD0#.SE/Tm`[1$o"=Έ. $"2U=OZysF^-|Ųg>c0R׎2G8bl3)yV0 J= :Z͹W㹮ziz Yc/!GWnCҦTEH[Ӊq+1#(qcaB!x0 \VR}𫥔yv'GGO~ɣ>|;O?8>9~Nvdsgr8s>^X?яԍg^ziso]rEpϮ_ 5qpn ̥yG' {F{x|͹qn#P]\[׍#NoU\"r{O1^ؿZkҴy.g.l¹KJ{s@+J!ju֭ejUdRk$8bRkmxl2E*f<"H"D&J1=&J0(Q*5藑[T8a"  V@AEFf @Po!6zo`t"mXwy }.P&jq?Tp|n1Mv[sLEY3ˊQ]鄔>0Mx]Nct?ܨ#[66D2ÊjM)v-<(!)ҠAPM!5B:XxCSJCjm1JkrEi%J=-d_6(GVu1YغRT6UZkQUm1X+N+ 4@ZbBT!21.Np`VU7B?kFb !8bVج׈H8aHSJBԌ757R) PHְ٨  5*aЦ@# SDcݬmN d4(BJE. 6YfI5P:N)O nZZV1Ĉ*21>G 1M[T){FET*Z PKR2C  ծBEMB j֞R8j#GHPS°5#gCȵamPaAJ@ԟMNNlC$t5sqv)>@*V -WAMoD.jzm 5̨" i5eBCt}7eq6w 0zÆ Vڊ:H; 뵩KV"@jC}_~>2Ly-5ՌΪϫ9*rӚCq}ɡ?u&ȦUMYAJ͠((4k`K0Jad0Ϧ{0GQodN}j(zOAffm<с,F 6<$4RpwMtڳT3TfD)B4$ IDATja6( L4nD2Km6<bE$[YzWӘsz W2TZ׮![zQ`Υg=OcP&iměyf &Ԓk##2r>["!fIG>=w\ɣo/ǻǻm+tsÐ0L!v;ʭKw/}ɯ7oʍ7%AGFPCׁ.+_~,6i?ۥ/x%[;wʵWܹS -ȩGVONw_Wg.]Ƹ{^!}^ᙋ!\jCڹE)r(*}үFʊ0^8H2`TPK1cFnL{S&u0)HReMj4e߯M7L_Û$PVRIq*O ,)T3<X]_j&{~jM0-tt Xuy.u=S̴ T)B Wk:.T}kUemHc"n,1QێVz|Kɤ2cdNEj?}BD1O6<edc "Oε~y~Znݺ5EDb50?UzsvMwAzp:ʥt-t:]{tx|µ c:˒G//啻/x_|^z+{nz~8~Yz ݁r7/|ݽ܌o=! ޾?Zm㓜i>^ J{僱PLqx K{kyb\؄YSB|ūء/j,g|rz g_1Z(@|;Lv6"f(XuCeS r ^d:=J),tT(FFڞA4Sq=zN)JD儹w4fA`CBМ7sؤ̦UK6͈7s:ʬ5)i&g7>suқ+״}6Հ:ko JXUEGk(Ծ'OMl]ISIsK݌Γ5ps30YP(e֟XS̘`MzŘ@vNCIyzYNOC5~g3;2#&fXm6F9\y6h%0-(m؞nFkA'.sv6u h؊6\ zOb (OtO"Rf bhRE 8&5.j3 ?T9"HBu.=z'G̵=>9:5'ez:YI0RէO֎0| Vĕ+/o\7Cv}+|oKpUv*pxuTOC?j *g¶lՓ|*pgh;UIfszr{l=Y7A.]:S?rԎ$Wpԓ%W*|LfdaF]cyqU[42cC&p6K(0ZkH +"8'ǁ6!ļq#)cFTsXI"!>C%71:\Z52iB]iϦt,*BuOtk~=oݑq1bqJ;+WgLD{14y=Vд 6)kSP2c'֨'>{:U6S^1DC^@\ԂFƊ E8iBkGxw®R[- ֫U8Jg[z,G0Qק;ADѮ !j}tД(;СhߣY.E5uP-:R&VU`͕7wUcY|= ]ȹu=`úemRoB<2#`{8| )2'6^~?'U ؆qH+u3gFKbFn>HҌݧvuD4 Kn;411`8. lqlcZ3c|o;w޹ѣU OJ[=I rwprr]9)+învB;2-7;3gj/{fm J=A đc cDDHEBP'"DqL&JcgyUJh 0Eq֢c :^3S@#@jk8&bjYRNM!J,ePJQauJ"6ּaBY+Rɛ;j*lȭ fæeC+m6ik@rVs8jStjsR .^W} *ȯ-HZ-vJQRfcV̳jGi )kv|z8s7CbL'΀E p4 iD`QH]fB`t]>E U4Ô-®q)1#NzBYYa]ZU_k"@S~PG:E4xU)Sf\mu-۬6`LgHa@Q*67Lj3maϑ>;)F1i?x|(g+VBpw@u!"60D5$D5ƹXat0+8`LkĴ2je@ssaj~/xa54H uM{7I4COy3jtkb^ƈ@Xѣ!8:Ҏtz龢cԝv((Q8!b&&HC¸=P>Ÿ5& ɚjGDQC[SjjQrb;@~Sl'Бv?s`&9'#7aܠ#z=.k&7>XlVgwɚ0ϒ @6t%ص֌i W]CHC`}sjXJEԖA0DЯWq+;+y6-Be%[! tc)*k,3iR;u.5 D`hRZk\jmZ SRҳ0>oRHgCZ{K?w…a*ew~K_>fޣ)7xxiIyZ=[ۥK|ZM[C47{w/_nojҹ3ϭRG=<ӫ?O]Lϋ~'^ }uΝ;h|+uWp+mn޾7o*g |ƍrޯpa {>{>mJߟ?3GCDAOhAZa>DSVjF*jQUkM$Ю5!"M0 )Un嘄@&^5A !V[!ch8&DZrPePdz@H ˧>)0/]_! /+5hnoq#Bo-QP1 c7W7Ea`r`56ԞR*&0dt6tv#4 Ĉ<Ϙ&#(bN u}S#Dltg?i\!Mu"y`PIشn@=(XZ؁TVaae. %k} >}'/0iWe֭V# y#bufFNS!b3v Rl-tj{9ĸZaTCw1+"ŲoSdi_Z9AQc:l @1Yh54kN#b(գ jSrlΝN*v]ZIdj8_8"owY'8 JCfmm^< 1HB5j:2ͩiAx323Zm}aL49}PQ~>jjvC k s4 ;[ ӱвѐiT9XjiYt ( p.)j63Elf4$04Qd|UO 4 Vp2<(Z-BQ %A@U6K5je(:BuM bŠǮ+o\U)E-@3c4IA@JA 2\ޛ6y0`@oW9|{\(LVkjDw nJ##C-U ciؽLPLBp%>̡g*:Bôy]!M ޻*zFS>{#o{.Ak`/jn2S*h^ka1kY~5Np znsΚabigpDQrkM} 4!0ȼR8C%? `b~f[}|98'q'Cٟ0pp:oW|47N&@\ǟ\L}qf{f}_;[}g䇞}_o ܽ+pO_s12qZ: }>}}GO~ɏ\q1,W_MϿ<~{4Gt/ڙ/忹}&\*2jhR6!Qc&7S)4+3٘&`NZ +"B<'y!9IA҈†@BD8u/6 @H7ҩ/'wrp PYNjFL8Xg_ wѦճƍ\- F؊6&t*l´=Nc!kҰPe;CK)~H|TCljPIt<:ꔩ.{JTBV;e%5MЩi64D4Y"հ0:Lz؆E"MP4,7!s[@5Ԃ 1݇+@̹ϜNc]Rcz"E!n>Quӊ̜'0 tN I v;EM݃_?LC`{g`FTRt/6TqDk 4#繣2x-"r Lӌ5`tCCh!B}i:Cȳlke%lF&J8&! q-[P}4wT[ ĨYVƂ-!JQ]6Vp QT Fƾ6kO".\CTє>)4ﴙNV2殺3X3,}8 =4$s$ݷ[NNNn ptX;IÃ=b:kaQBaЈp[NkhA+ZMDa ρ= 0H铵6sKtl>됄үUM7}@> jP0 Mn96\1DQ;@7AFzc Z' f; ϭChH&CeMZbM_{>] =>Nwʭ^#m`B?مg ̷ L6{ć29 Izja1?]Nr]+P ݸq#]t wŷo7! mt_zT7|f / IDATn;⋔?|cr]$Npp^__n'{{x)_D}w_S>sA{W^&<eO;Sxxa|eh߹ȿz3Ӈow/ g/ji3HVqXt,I47a5p8 !p@%"J-UDjib0i=հJpMt8#DXVV3V!`=ό6rdEKViZYeMT7kƔ'HUJ0 )QQ_k!5!`^i&ΓEideLlK` `!Ck7`mG8wk( Yhk|_Щ%}38"U3 -؜ sW6OR^i}/鵈L[#Э<~|i.:(!Dɴ`xf9ծI5˥guH퍁]f b kGmDpsџjhwk4E ZIjFV7"=jGR:SؕE8zsQxԙCk)EAKfb.Fz3 bHp:1$E bZ%aY5ZuzZZgEq(*Ɇ6V1QD "MhRJɢΛM$vf cl!R"r߼7g5no/=w#?g/=~u9w%|Gᥗ^[;ޓOSgxO}_ 7'?pwۃ_%/F y Vʭ;?=|4~ ׮ y*f>iaHIaS8*i2P[Zk&Bh-s9(KҤi[mH(@0Zy  (Yzvj@! c"FjO":^`@^b3`EZQ^geýޣkoG6N7sD碍C_w`" R:43c7Ny>h1KiZQpLi{l3/Veviس" cT]HPc q(Ld9&N 6V:/C/daP]\VA'ժy\mdAh]iml,qH9H CR"VT^O I]jc(9&4>R:'9g.Y33F+mZb6 $&Gnb@Hecy6)g>@dхC֦ 3+65RHj4>bQ+ϮӽkA2Yz]/Y ,dXjJchC-UPj0 XF[4M"Y6 CbyJ+vՙf \! "fEaQ?Ɗ:@Q$ztA}}AZjG@tkH7:dԟ.-4TK4*֤30#Y]p*wskd}NHI҆ч.bm[%u&uc8$C he_C;grtL#AX]DH5j dGlbh&Ngf ~z]Vz;"*NaM~,wt's3i֛e݃_S: `2蔫ph\ꩦsQ)bVRЏCZ֙VY: s@k[kJczq-R!Z&""q 1ĤޣJ-ImmiV01\Ͱ 0? *b8_޸~5ӟ7nеk8<<ķo%EiM5_;> _9;3k_|8;h|͙χkn "ǖsi4V׸,%ZkEX]MPtLjސU|=GQ(_#NKD=O}6,x 9v7C}DuhSHSQ]o>W;]\]?|@쵁5][A\29h6?:,Ԇ[ `gAonŇlu}=lMZSjwks~xn60Q51W8"L~nh{ȌjHkAEvXì*KKgj%cH5QQK) Y UHZ;ɹZ3SR h!Dyt\8F.WZࣣWkrzaG?_Co7mSw}w_=y?M|Lcxb?A+oܙu?4-OLs|wr>\&Ty E^:@vr&퇏3? 7ݴVg6)5(HE΂Z@¤v\[nZ<)ȩF9ZDRCA#$"PUjDAckR"޵882ǁXl8S`f:׋>"Cئ =9+0a UlDł|}?hPl舋9\K箝Ӊ)vDK`vXD}*aFy0D0Q54Z1!NZv;Ty'd?@l&L2EZQ R0C?Xbw-B4@vhKD͵wlCh<#ϳ6~DZa ~9[ͦFnw[mQ`QV[|ng%Ë"0F[3 n$>FMFN1*ۓ:<`3m SD0'9uت^iU,-|bƐ4NsYjNCU! s NEk:e/ /Mrڅq|fF0ץY}vtm&٢%Rz昒cm%:eDˆ~DC@P=B̢k)tmxNWtfm *׸YKg5XquMk#Yu4N)$CWuQ̝K7]lũ~5AQr׈ e7Lݣmώf1NїDn %էB|^Uig|ZlxG}QLlb1le+R8&,hG5)ҤZH0 HZJbZ Z&YܤnMT<=f"j%O5J!butt,~^wb_ac??|<˗/o7eSG~=:x7@4 ^{ޔ>:^.ݑ'}/}c8}<1bH>lS )@ċo@$ Iih9(RGiޢeUsU -v)UgudSbHԿ~o(d4[coCȧSrXVp)iM 4]ǜX1kGq 3MC)Gjq͸hu8P؀XDVsB`1M>Rdl@cPZCHEkj'ZYΦ]w;MD֡(}{\Ongzh‚DC~ B5 {giPkG iAHfZ~x 5q- ċdRR=(CyFKmY+"%71&MLABgIҮ5;mڇ6R yE83b{-9,3VA+ Qe>e⇷MZUepeqRV}YhҔ|hnHQ>8fC]U>b3,{Q*>* `5yEk[-;Ck0V'"ԕaH,h 1=!ܿGN{QP#xw(aojZ .MʬgנIb4VR0&wiJ٨NLv˲tbo> V+v;+*ћ;\!%sdY xat{8m)<,:LxMyIB$ Dް{>ɥQ`%K~`~ p[RWda6-ho}3Ni`ta:B>61wbJ'daF}\ƈ™ެ阦ie&7NQ&&֛7d&8M]R8}*N cd˼bpȟi+N8YEg텘}=V('*FMȅ oON`J)HX-Fܴaa^5cоT70&9F G>Ʃ;$ɐ4^ 3N"nCe;O8^c/(#Ų읆vU|ug 4_lޛay䀊5"{M*(\4N]/zS7XSgTNM_ [)əi׭jfqi)>&(Ax893ucuqVo\_!ċ 8'ж̽a` @LY}AFkKY0B@=N MlW8SR soO BـEz\eY+]㫠qwh]WLMEwmF`QMk4eA=6̻y13-xݵP-v}~ Ql%DAG9aw8Fa(R&զ˼d*Jiei.mWPkӻIN򰺖YR MDL h+PIONfaX<~{x1nݺEƦj_4hv3[={j_X=ãkgOv__ykxs2]l6===wK hr2z:J'8{ayIg2_;axf=[^)K@m2c)3)1Zb+OS3n8j.,y'k< #`\oD HюPyY)tjjT"B# j%A9V2PD(eYYkB;2 !5Ðy^:͚EEkQ2{Ӓ #m6M)kj[sӆap BH! Ԁn#xqiHqb40f"- k iPI Wt6[v9nLk$l=%mlv{c 1u ri5,)e7v-!@Qc0먣CDYYދ"Q>Rd"9E=tDm(rm=ϛ2Zg?>rCW@6QtW^ISD5$gkKP^ki }q;gHiF&1uKaR^Cꓵv9IRcdڪ;?pݹp:^ Rw=jD9ySv 5hAinW%ӘO C{eGk{D2N'՝C2@~Vʃ7'(N K+5:u,hh_/PtY]_lG ֪\[eRHkB%hp#1a) 8[[Rk223 xX0M%m6aHZ4!OcƏ^(_rG>hYm7!|\#_)|6nЃɿ~}rB}[o<6''w᥇zm|+3?^gJr{n/2_آGgGyJ +Gѣ׆<\OMUJ"#*d CRK7$Ǝ[VROW5"p: E栍Wn&b0$mU/F")âI35Ym)V]Y;f UZu;-JD;@;Df2e2vlŹ76s/&)qslLH8.b88?շ #'pfFDY$HXsΜPKI0۵p ؃Xsn#׍˛ZWqnP<@f :_}-E'F]X)}>$CսmoPLלN{_U;B~)JsFV[ ɩGپG<5uMo7"w1JTkb8Et9 bs@ڛ bw^ͯʱiNj;;= oogO'*U=+ŒV+תD"̉Y1g(2+ TkQRVVJ-ݲ}@JnWЮX5at9ǜi oY |ƵzrԟOopA}hCn>xP|pMw~rwy G+wfzǣ͛x޹||ǩTz[ U?Jg#][ӥz[ǼYܙ ̚]޻_ )0ZnW𑁏6vzXJӥ,44B5ֆB2j+Im^!;n_#ՠCUfy Rj[TQ(aJ逘WJMJiT`QRH# <)<*1@nn&ľM>@k+TlӇ/ RCJ雷n ' kqGRYJd侉 ل/|`BY _ DXe.e7[XK?iI ;Dn#׍WR;%* ^i8w3vM [;;RfԲ`mA z;egM h5Ko}q2¹,;αE 1H8Kw $46M8\يWRߦ3DPb.w⋐@iŊZ((v Mi*y"&%08@(,n#&-W/([1 4'k|r//DG,kӚ6[o&'N͝s(:d! :D<@L@{ȗSagƆAzZwc~XioFzV,P=nV>׍Z{X12h/k(iyV}ů5zuRI"ΊV1NC/#]t!tQݹro(N٧@/w5Ү;eZgB6If^b.m`ܝ NyOB{ *Yx$ГQKvs?w-I09]Z\3gtj{k~L^t;"KBӨYR't!zSsz~qwL-_&N2eLԚZ)l%KΥZt~W<8}_v{ S`DJՐEErN)O҅h|ڣ|o?O'HO> O㋫ƀ۸C&K{7yҙ~_ގ omyS?u|Wk>%>:L(QJ\Eyش  $i(@)إͅNE2ץB{c-<,*Z`Xpmr,;o|wgX RboړΌ)V')ΰ3܂[mX<'afZUJoF`Z+gnғf L=c:8dLu -XK&b"L)Ȯ¹H?C8 'D"%+&&O`_GcΔ dy%M^-q&.CM>1`1 |qw:{JKbMh TH$'7ug߸vgfg=2nkmOgaLF5HK>I_HOv,7-sUX8 a48O>pA9hͧQO}s\zvm 9;} sojl ga{gdxpO4’*ӇZUi^晔T(xh_i[ʍ 73.~zp||セ;_߱0z;۷3|D/qvy;[~ӯv(Qt _yn_{+sڋ'>up }'>v+zaiy8-?xU5/R҆W{;o}|p==ʃ74rHmewچD$gh<"ĭՙ6'Ud"dhMSܖZ2oP-jciHL@+@Ip$SdE֎؈pZsbb0-vTQZU_1Бa B xk8|Ec gBĨǁDŽqzZ;z1>EayIkņIgK&6 Z*4~(mL{;+>Ln_ht?6^/v9,U7cv_s#V(Žފ{YаݙRv'jDDw.'cG[Pc]F\B;Dq64}u! V4h'v X,6B7j)6c:haiA4QΌG$da)y'ugO"B-4YDe仵s fv # _3zrb͡7`Pi|~AYfأ9ٻ&mi+ht+[Gs fFmJ̳s:65`2 R\'x8 P+ME5AQjRZT{-ݘ6l>SζF[gŵPp3\T{&ԛp}]"c7u-37@swc嘜=uwK b+ȿ C(fE8iE82׋`Ù6}aS7{t]H09@L07>4Dj%\-rМa +ph;e6)hmMJs4޸S?1P7dw &b^Jw_GNvpmYA"_ X;ߐ5 ͽbM)"`Ӵ99_|poŋ o~SO8G?>ݼ3ʝh˯\)!cEһ'\Wށ[9~ѻ.f}?ݮkCop1!2DzZ!Ia :3Z U\fj:e6(@d+I/ĒQ; {FKe'$tasH|=yFp<`FR0#"$[Pĩ1>C4GV[}>89T3WgfQub]RL f++E] HkmXㄔv#0";^RX6Xv;R1Ma5e'kjjӠPwO)ڠ((KI7\9`aaAME7X 3jM$`,`^YoFov* C"nͧIV@V>iw[n8esk}FڪVbήg&3!J:5m|ώ`t}2KY<w.T7+2MC6w}h(䭹齃z|PkkTDS4 Lo)Ol_xLj+g>wus82&X7GVL;ߪ$:=1!Z{M"؀T׮DaD51mSsͩ罉}PеR?c#+LxgM[+էZY1/If P1jԚhfX5HYIÀaК%UN%ea%,Y qw>0o}KyaXjUΖ7qtb}mi?{u9/m/ ]_zwWM{}w# > < n^N=>ƭG_m><֣x;'Ͽ?_oݾ[>gqܻw]uK/k'8yr2~}ֳo.k>;T?^]6,)]A>;dZv|Ý +ֻ'eIXs^ƃiz[l9o6.rmE4\ $ P#Z+Zl% SȚV$y˘$o$#f8H $))a8hڔuc"mHb6yHӝ4@:I+Cl38ah! JEQq+ܡٙ>ǽ1s3 IDATL|"iG6jS! j4`t.rڰkLS,2CPgvIU)}SF{?d '#  զ2C)i ɛ0w h)Hp_Kcf>g۷{׮1n\^ÃGʥK}-~fKLS>avq{Oui8_|l}0կ~[ׇ7oWv8^Dז.\< |pt5q`Җ6$<]l$Li BZ ym."Ii)0]f#!^ZSb5XVM> >~4Hdنh RZa܈9V@$%o1g0rʠ5Rz^H߽$!Pv!b ו,.…͢:ER#N1yi@(d؋ڠ41h(bt5'~x}9m E8CrSW-)m!"]Ze~ܘ\$=죲8;=n{嚵s6fC6{$nza {l2Q)Űaj5yA 3|<#ɦ$%=bښW4?(]D]pB\8uɊ65A Xl7CśSk5vT[pV:9T0EZ^ 3Ґ;ݵ,u(6*%#QV,71!a! 4Δքk>e{FSXkϴ$otj; :]:yS ´^a '5/Z2{iI[+=vh7ha}:͍j  !CNyooҐ`J p 0FHCZLh ^P(Q'te2ϨeIiI6wXƾAIi#iIc6$ɜwd1t))ֺΦyb6SXԘalQLKiX7ML&Z>O5tFŠX)ד](Y7)DԍS;"Π9$9bflX9Ȝ_UșP;Kjpg#6Y4IjLaސ7wf%;zFSr-?6!`l I,]joTt⬴a=>XqOW-/'o0O gQCSAj7`q@5X$bQZD5``R"VIl >QڴVZ5cuܠsyΤ#,ejDf(jer~P#"f⪪g,Is3a$k2i͒V8NtSqu UNLZktzq)9׾q%mk i>AC| m{}WD ῨlB-O_xq}=?})yʫW˿k&M| [nngx)0y/~_j7>um?إWb}@??w?֯l~4|^pa.nVo\2];lzuuvstI yT@ 2 YҚ$o@U)$AiML\/JJGuNB22"-@+bR%@6c%8'Ri:""1$+ȼDMUa`f6@iM%u7 ڜvÛOoL : A9/v]^[FhFg3U*E\A ׮Gt&8w^wCWL˨Vy4T-{X"7|.7֪g P#G.@hmBiǒirHa}O0yi4;(Lt#&WMq{ԃ͐^m6ǿeA ksS젆6JzVVCk+k'7sK<~|K{0|_{˿5 C7z O߼I=>soG?^qo|sW{[kq[^ty::;|<{<}pUˇms݇~׎[aI{$n֟wՃK]MJ6W.ҁl5MM>pqYmΥ(Ibkb-sZaux!4A$$)/dBZs#(jW8iӪL &/ mZÔd\J) 4R`sIF bqN$J,$'GRIs⡯;lc({S5ECȝj(.eѷ(ojooqӻ@V;̌opS.Da(c`+Na- 2uM0x0&%Z ٦"9%&jce @d͒5֙{<#5 !(3O}S'q fŗx0Mkw%{ovz"?H)VXaFVXR򟍽;醙AE!kEUaV}2ޡjq̹7Jy&]<3tɄ]7儲ToN'CoԳiw^uZXz|:wNr O#8܂ qA#,̳OX9!V:=4i4xꙑQěˡS4¸NFz)v888OdZ!yF+6) `_b9AOJޢaX>qEONEwVeZ֝0U22<@_3&=4Rt\7&¼W΁GNlۈ,еJ;?(DukLڧ~ _34@ZTI@d̔zJD5d 0?wa h_!-ɌPe䀅~~~hQK)=3Ϯya:P|}p L`4ވ3S~ulop_7j-tV3^$` h{Hh8/n (Ok[)N~d{QY,mE1 ^24@j+eqҜ[k&nȃj6L"`qS sa^VO $&Z۬ DUU$ZIy9p&%XCؿ ;7nн~Nn m'O|N}@y_|×ҚKok|3GT^p1/GW|p0pLi׷uvyͪmHhs?Y;nȚAMBŝ6>wE,%t(:o{n uq:Qd6]iP+[d@ &r4jAں1KJlZLiYԩIRwܬ$c (\ DP#Zje Ӱn>\V}Ji`%" jQ ζg5a4ʗ.71So ZS$N9mnXU8r mwm]hL"ơ#ys 'gϣ|`kͨmE]OiØVf {vbbwO"8n5jkhm4ǜsTG'lggB%ӄyqrrbGGH2JY:/I0&=adY)kgv;|)a9 -!bq" &9&F+m϶g#4X΁JA4+:76=Rg C_w!ں:'cdfHLx:M?(pYd|/=7,L6F0[yfIVId2) HSDL,$kk@>H)C `ڬaAiS:Lu۶Z_[z~B= L{O?7\wL}y=oJ_y3w].=\7K/}3ޗރh }6OKwySow{vJ'#xg aisxݢVt4]P0e3c@䔘1眦 e՘U)ۢ$9)q&@JB4lڥZ[IټH.>O)UUpm5iJYIi 0ZAͭ{- 2aTR1\rT!YI MޝP wڐ:sI 72ںI}D-bdO <5ζkblLG]"E OVܜ!`Wè~-WMi%>R8a#-]f_^7DhCߊR)t|~rJ\NC0_0rH v +Dъ\]q~d0dO?eXk>4yd7Ha`cMqh\ϐ6%bDOA[7yG2+3`<4YY sbMݍN0Bqpbz7MΫiui*:zޡ1UB89,k3qMn3Z?MWz) l"(>O,6a)!Ƹ!OLt3r:Z`g)95ݞdSZ:VX_8B״!/SoF Y.*i99NqPwl:: lل @1{0M A$T!hrꍜHL-!&D.6A#,Ab#6O5qa$vc S"ӯi v]r]lwg̋8OH 7O@ĨU1:2\A,0\s?SX= "`V}AEt[F=5/Kgcص3:,21 P0$ԙ[lRj%Y1$"s"8 2vM&CΓ68peѲ-eIIVVOY :Z._|w~pZnwzes 3q͛t|&Y}i*_#ߺYTKa.]^xW0~d̝zܺ|6Yۧ?4?-?*WT7i3 t~`#*zaJc^壋e"Uf4dۢy\iGfΖȰ`)iehh*C)$JDRF@K-̜jJJۥ]զNs:K[ӹ27;fXɝry89MjR범*)4$ 8܍`!!ɀ;4Yj;oXV0[.Z"&}jW?Dg F Q֌fNyqʡNGP+˾;AF._8u8D8iB7ʜV:O^Վi C1x{g0' $k]惀Eω-i*ocP~<"өi* ;z od#vBپЪ7q/5X$60lVz4]^Pko6޷KHt{.}sNA4.+U+TkTVJA袢*+e(^~\={(LS+.Kxr]]>}}hzzӇ7c*_WO!!|nz3/|su_y=/ի7^ŷ~Fe'OpvM+o/|@oIMi۷jS7i76tㅣ7/>N8=JY Zr*&MQN y)Ϲ!.+i)JdbNKJef]zm"]USJ f7b^km]m_I̶PqWQYkUU+DȾ*J)4qI9m\6J]zPp55l+3 u2 .) (]Xz_`>`?p01RU2HQ( Bc1]lcIweCyl&f aT89('۠I^|D bȩg@j:VU82f5S9riF9.!wlf썮Z]u+pݓ52P֛QzXt[n[ ϼ# ”̵~rGFu4Ţ#Yx앁Fnň8}>%;/޼j4./7bA8;RIHh6f-ڹ߄|B>E:>a~feCCxLJvȩPo2d!5档4 r~ V}6Vvb %9:8$P?1"aD6kkNaXrJf=QTtI"IDIbA*Pa2Xl|VUe0+h&UB һ/vWW~^Ϟ=޻(e-O/|_Ko/_A}z= ;~X޾}oݺE.jf@o_ӌd+ owntj aSO_[o[o{/Kɉ1Mw?)#{'Og~'q7q|u?yzn^i /ށH˅Qmٖ=??Zziy+IBRb&^hu]+2r\VsHPh<% v(7\\j](1iU2Ig h)eiwUú_D RQ!"*m'CE̬&< UU! )3'SNMa"S8\DAf1Њ"GeD OJYT!@ǠZO")VAX[!$8všaɣ9E/(x8Mնȹ3/C{]h4 r6CVBx…02AMqpt5蹦? lګl: vˡR{nfl mfE nHb*ل 4wiv=Pv3c4#HNzW@;Wn,eb jK4 ZsT@0褔‡y)ʅ[^1zYxe6mg(cYC̒^I{#%ɋi*^j3bLHЏХҴ$bsY>(vj/u>:Znh}u7T+Z7"Bvc~]Aɞw ץ>\wN'g7ΰnѤ&X:j6kn73tɝA^ކE]Ws(TȋoJa u]<S^{;_;o{XË~_>z4Ky\zMٷG s [w}|!s> /?/]/>ߚ^ǥٓ'W^ٷI?s_J6;gg8{_~t|yI=\ClS7YKIz.}Zu+hUoZ/L][~{>q]4}v+Q)|S*jk]ֶՎuS#$DD(uS%6rwmЊ(ΔK:nnv!'bNJ.}ޔ%fHPly7tŊi>akWAl(mW((>ٲN_~x8\(&01dF[(E9fF ʤ{ +lanHA7Bq{nw"e٣#0h`R`CvzԐ*ChmK<1k*jvjV9B͑hD] JSmi:4ah|PcA䶷:qsfO4h1%Q}ʃ# G>H4T>FhqM:Da\構8K9 awXӶwy 4Q H S[y3S>l4W@A\&Ori'שOɳ;j7vR a{N>Pf0<~'f+NH5<[jVfʎV&bQL hk}"]u!TVMD^u_m {<}(wE_{ׯO[¯=z/sܒ>zK}_np..?>~ ߏs~HzqA^ζOw?{=w/>ɿKvYRggt~7׿?^ $7o>~C_Yn˿tYW7tٟ<}<f^v;W?7nʍond>")+iS]HҙP[zDu]o[׶CiRUE/R5O 0:(Mզ q*yi-[%Z:c2?2M/tNBD~ )QJَGpT)PV PxD&*#[>9%'7CfpwKj? 7Nf~ igK2A+h2ցE(CCOG~hF ] ,TYe}iMiBN뺢xњ]7d5逇4HفhmiI@;CVsU1d'Zg5Ϩ{aVWk|Yi7ClSk 2f>s 5̛`wyi-%%-"LhFC1p sX1rJ`' iLN-0+ELh A غ<|eRtՈafLȇb~m5D u]Q׊`RX|͌1Sd՛21`XK9Iֵ"; ƈ[(xVuk}Q2O_zL @*xT˺`߃a6OnYfs3z_Y*ք20Ar ?΁Pf^[cHWNAo\̅YQD< +maa# Vw[hj` \c|yޞ` )J ہCUqV0lx01k̓SJ1! 9Thჺb<y5`8rؽCR˱fz"~glznff(s)֛8,Ea<4@q]K(DUdm˵^EZuzFԕ(k/\S]>|6?x*ugn ѣCyAWxxNNOw;79>_{>&W@>*~!oښG83A;LZŧz#bsM NdCo8k;cz?pd9C>CTP@h6d!TFa`EGLH#}N K ]/GU1pv9eQf28Kk_ftc]r>z ~gDy\_K*B_'|xzyOVj%{zsv_7~WګCs swʽs~E5_Ώx>޼'Z IDATO7q?.Mҳ< ^: rtD֣s^D׶~ٖ8 6tS"BS'0&Fy&PYU )OeO8P< J")q*Jd1% N%rZ|-|MA9\L !N✘ɸ neM\8PwX9 cC CHXc0MrRIAEH /9XVEVJf4[1Lٛgl-{AL9Y &e݀4A@4c(Mq(ԦԡU ҿ4EibHj8(bo}s=:> 7Ԡ3.7!sް{s=9ҚDjTeal uTvיhF?NU1soBu4Oo0c daQؗ2DcPz1rc*H_9(S)ezi "DDYȜ SJV2TrbmMY);ɷ|MĮ5^(8N|xF~Jɀ $ftjgnMy@'c"2yLͽ"% &Aoagf3qWKeGy23Ȃkr̛-vR3lGx3}QWc(f Fm!hVŵ؇:ax1iF+">99-)VT.jäI3t} /=zt鲻`ہaWfT9izkG传͚dPboӁ@R|hs@ p-{nDC3&/H Zsb 0^46 6c3T:#Z1 5Z{L/HPZq}Ơl>ՙ'([fbd. qjh`'*Cm`5L2 lc4IьIwkG}>FR^RfmkMZiLx$7|>ƎuE^cX :e1".% DDD]yL DJEs>&棜Ls&bsr|)ӆ =9k'h:Jy7^xڍ^>|q;Y>9S,uzqy7/o}TwC͛t_ƃ/>7A_{>w?r|=7\a{̈́|.ONp]n|_}$葾q7.ҏ|r>p-:-T|+mO mڟYc^[^?Ʉg~NQ< cMy)BrhBNQӔY T&3R:I(2gtԻ0IVq H`R_埳:Vk՛Q"HҀؽfEOFÙ#P^3bwNE_G8.t*ֵEցž/qr*{xY)l,Cc#ƺT o MB-SPGGǘ73"%7y*ܾ#O 6fמ`Em>XXh <0*Nj85dfc5GPut %Tl"^1В1 u7 H)mnpM4MvUF/A37*cG }(C#_u6~n;:ްbaJ10JM"5jU[4 Ek`Į9OMˈs.FXqMɍ^&$?stck~6{ 3h@!o8:8h~K IM&9{mAb45!IqNG_S;ղq }"a\f惜.;fy8WgO )CdAaĂ@i1F9p¤&^E6c6 v TTSIDa۬\N DCRJSʼ(3sQ".S9aH HTGGgx ռkG7nmٖQV=Q}{W;)i.>zH{>{^{ zm{.|+tIū?WAWW| x8=ܾ ܽ[7o_?uBxUySN_}/}@wk,E{רwZ:x9p]Nv m/%]SOT&2q0g魵7N N(ǜ磶>V.[U(yR9xf3XAD8΄BӓW40=OhS8%"*:ehY %t*:- pL&Ias<ˮpWhWԮDA'R O#N2}C&NLW@(9uo9Z!TIt ;:bg([6KhDGdq[uh<%A&ۤF̍s”'/0*DPVLh1q*ay-l hѥhe@o2D-${yC[kSW3G(~oEɩ'4pPS#Aqqr'ژ,R f”ˠwiBx`q}&'GZz@]5gˉ* > dh &B HYs4 j(һA2 "f"L'{EojLg1Mmh(g& 1tm#K0lS!)6l9z3tIѤZՕ29G)QCI>L[o8n!5RhL>9RХ]=a{t MdYv@G+֔ek! Ǫnef_lF(b9M1P&ņ$Y1MN@-0s$v)wa$߯[z4CP,n(nm Y3_ؐ({T9aA`Θ_u:0|p<)&` ,n$.ϲڛw)# [[=P\lߏܠh7r+/tkKf9\  xөP jW/UL^,CE]D[@lʘnbYv#{$}#.(i1CL ћ+s̉]JD6f(`^Q)g>]Tb9O)Mh-ʛk'Wub~q{)^^\\gn [gi]foKI?2Bdp V[n}}[ǗW/M/}w֒\|NJ_c<l^L/o_./|oO]ىx _~38R_}~л]3_AzkeڼWyG)!ϛHo,By79ͤRV`ͩ OTq6GL7')*4mnRJ P.5NTN+Dę̼e8-p&<ʌI  #)=B}#/XEFΌMp&xqi44PϛdPS7ŧ1,j4aS&{szjAxRʁ.dabSwAFCC`2u e|}D؇ᴙ(#!OyPr.d.Ld* :@ p &n1 ha57 D6DbChw]3o4kSzVCv쮮ZEVVƙ2"כ(|Wj76^h'7!q86<'Oӄh"Bscƨ=lӡC92BQ)|N aQMqq /pC',{v,umm!K)UΆu}F2ә2S`yfJ `Q͛'''(n_kE@MN[-= 9ʖq}kurz:hkK2m1Ph=‹2R}$v/5m j(q2tES<(MFNV,fZl칰E4ݎX7" ֓Ŵ){='$pxw_Pa~[,5B GfuE)y24A?BA5LǦ1Iᢛƙ3Įs : Huf1%6k6471.ql`1yc{@PloȨ$~Y عh5H8㻈lmG@V x4P?o7pK9P&0&6Ѓ5en4_B#ڛ k, Z *b –,(lfZs4-4A%3v m4B!jp``<g@־#dai5;vއӯ Ҟ(7!$ 4QV+D{O)%YTSj䒒*H՘hF"$ޥZ"}aN3 q}2/}ٳ}]r6x&y}jjn%g|)LzAw^S4܅){7G?6 <^ѳen+:;[7M{vO2ȭ~p or}^=v @pm~ <ە7D^9tyMr}]v볪MѤ]teD@FR˅'Zv}iD 1oLDʩ@[s"卨2;3Se?*"LL]kU$L,5a"f"(E 8*6C#QD8{"lZHi n)qi4.^ K ?|Su}o^@a @%e3! .' Q1'A;HL8f@[DžX딑I%9Me}mYp0cDޱXhg7V+6SpW ?>.Κ^ћEnb1 mMN@4 hKME0S%6GR;V"%cU&Lu]0#;̉HSl  *4b>N$aDN`!.Dw1I=z0Patmզu!.* ?"ۨR81#q ͏X$ѷ|sӒԶ?5dh:V,dE>p"H7*]ݵͮI˙zZI8kRb̛ h)anһLn_dV攱!N1KAIzULF0'CcX6k]!ݥ3z5V"8LjPkhuAZTO6fX NJdu {UeGuJttu]! ^-b]+ubꂖhrU`a4,vDVkzu]Pq`p$̾L bf/;aC<+ՃqA?snCdPul98t4Clm&vm7sAGIaF\p}])QWCT+Z\k[8~9Y6G,2C F;`kRۺ!-"G9[IU,#q%)CIΥTU u][LEfL #yFo=K"\es-TlHm6,оk˺#,@AN97G#ɑ7}p/׆ڵsA]W\MT4"ьeG ADfHCzsP?Objs}"y>6lΣql *Շ*rA).;R}2톜flpTdÇ0<cgV_DꃆFmg.Ne u!{TL7[w̿z>3.N4ft&wǴ3܆0T@BkqΪ)r(a*FnɐƆΐa6qDNi*q>{8.qj~a}0#ʆ_L*C B(iR$bDЖ^) 1D\Rb""v$`:FJLR')w iau$VN9gGǧk7>#~.\߷_饗N{#>;wo;6@ୟ[A:2-|5C} ~ zmίOp= ś/ݻ7!/NKޛ+/Qyq=ڔRW-u'ܑ(14)4H1IjwD+3Ig9.ֲ8j9nvlJ%qGF؈G'Q@tbcxIIH$2HH/,h^ ;'<َd&I6?O塪ֹTƆ2@a$o߾^D*)3 7bm,i7i|O0g"i晘D+H:I1{dLH;wwpX03R@O8^V /O3a7& CSCZE jvGHa/ YjuZ&˨LލjXjȂR`F'Y'0[6$g%u)≂D][CRx^mSƺZS$3IȬFqZVlLN辑Hcs4 cgߗ@ֳ-15f) }dՃ!SJְ qlW?JY'7 ZOӄ)qMMH Xh ŀa[U/]SA)z-6h5#R>`〗h׻d{0b{&Yk-`MAdZGCʓmLISF-+@-Ň7K `S44mfc-RJJ*ԔD('Afu9\[yD;"!QFV3|/ݔ7Kc"4MIK-06> ')˕O\G_%,WOCHCdF# o~z=Ɔж\c?F3{YҘ.dG7.$8yɵYBl[csk+rԲACbɣz:2d p$̌ժԳ1ܼ`>0?{bIPb Iڊ%bD",“*uG[)'z[m9rW>,=z7x=y_%}pe˪|뇔&GH }/w_W^³@Y8]7~={%ŧ/s8{ӻ~8{׮W^Í׿x߹I/޸ܹ^|%n5 «a).Ii=/-)k?*'9L˧m>uJf̛iJOέ($rNSΔI̒N:$Zf (itF$@ U"a6ϽMb™)"ڍ=QEGkk 3w &DaQI $NB ~ DieV wR 7+uGM6L0y?I$7pЊMv! tF n̓iJ;M1;f[)zS P-Xe˲Gįm:`r'A6R6ۛ9֍zsCnj2 x\_fݲf Ľ < tp]G{m3a ? )OfX6yԵEi u(vI<Иȓ:yG j0;BxTbH :RέlhvE,fHTortadxӅV7$DNd+08f`8l[o&mFuGgbC Ys\Vw<Gìwy>p(fEï!j ֌bGCW@bCbrϛӨodž@]j~ 9ڡON7'뱡4v}U{&tbk҄p]mݪ2arXpց19k_ ⽪3+SNJ`⤤DK`"TQI q.jDD )VggOl~)>g_G+חڷgJkл+ +C+(^}ovl-:}|~˳_|IƩ])xp8{^xM~U޵[ O߽Kӣ]ƯU}nW~lHwno%͵4_i:5&ICGjSp#괒 Lyn.)f{&yJ+<w9g4?g1$,+CuQ7As)69'8]nG;]klĻUiR@PlFpcB)i 4Ãj8my]9c sI:#Ԟ{UЦ@?64@"lZ,.| -\Ui4On]jt** 5&3jn뺇8NOO-Zs(BHY`X`ZX؟?Bu8>F=of-`Y> AdEZV,X=.X Efy۴r⮪KoX[E' -Ln4CSgD[5vD`NnVE`|Γ}ؔ%V]=SGzs}E+ܯ_3vֲ߮hNs}ٌN2&'h, 3CDm  F\kE.]gg+ɑ++j].:G0rĸ{܇9vOr'i} ?jjWBD7ݵyyj;2fO._ӭuOewvɧ.ݜwsKgˡ%w|җ^͛hկ͛7 /|^D~+w"MpoܽK޺w|~7_on/ ~ͭ%m?^k5<wn._yS쇛f}|i&VG2#mP 4OD/Đ IB/9+`=5pfj . p^!z\XggB)yH0UDB6\(KY1M7V \$% b)rǏcYfyg+&LhUn BNC 0nR9 S ݑFP{:, [=:h^lkڄS2fhAteb`檗%!;S ͩ $+zhg3̤ 쎊t|oؤ<"HH XuPS2$oJNdr P*{(^s2p Te썕/G(+ 0eFD Y eN98fA˺iLN6֊Fj&H63f9g[ r#X0EiE>0,w[ A9f%q>fpgBhSNus-Ś\Cʑ3y34qJݠEă"\jsG^se7_zK[}^&h_ 싧SR`f͗U@}>DLi}fhzS\֕y{vYykQ/ZTRK%JF7I:0[ 124C,* )C6nԞÉ7HjAUMinZfPm7"ii#u'(,PE+&4 =?UiS u0%0fUF] p%es`>e"q@Z/{}/Zz-1681xzQ&o p $BPJAg`_ϵ 1ٴZ< aEYWDĵ=Xx8ZPE&0r}JpXqXl s"^5zQSaqĩQlgL[JFa.o6Y ][fi%&gv)a5F6+.ȭ4m[GYtlas$FD1{T%t%$X@2%D>4P(<;؇^Gilp$[vF3&/%G,hLIj ^a).}OC[IlflfƔbuDIyjH9? DΡ:ru4m40&;DVfnT>f Ggϰjw^JܺB}80R/$'gM(@)OX>| GҜ*j.GlXbUcgjpmIQKdU37{gjʊڴ* s*֬{h7Jm]ˣNXԕ.o6W=e{eEΞNpWܟ, Ow}m}W$mmzʻ:>/ؕ䕿!|f"s 7ܹ~ݹW^]IovG[oWUtνW8Oqx!c{ye|}_ms~+_{>󻌹qiJϜZ3̩7҃:]SIH3)Iڝ`tn7R6';w$Ii@TmO( 4',$'eI2^J"S&LdJˁ,k ~۬[އ P| @] B-Қ S6(Jau]Wl~X#i _ fO8J7E-ۭ`łzU`34:iӠl\IM4gZ 1SXC0̑VyYgbGLnǾ`RZ3񖚮01t:0wiL#L[bݷ̥_F MmY6 kLk qlW%^ƐZ?Kш1|mY&@^&?ښӋff#~mY)Z~,R[Vgw럤oJ<7ō[N>,c`|tus:k ~zG+{o{g{NW~[wNOޟ}ϼcQP>ǏOɧ>3rW\+mi˥'o.o|:OkoO=;Gx=y2S' Z:i$)gt7rU8iRye.K|JOBm Ĵ!"ҦñZXi\"ޕ.(DU%HN#Ρ{g||DTr|`7;#f{7%2~85{uFuދXf掣ky 1޳ 3F6Qs-+Q860up!*4Ӕq4!qi7y.L( f[!\s̲d_L gd¿g P"7E@sC6Il6^qV##fT+\75zpv;' _ѱpע) 2:0y܅2(FИ>'qݰeb-AW,Z;R!={fa}R^2W )`e9,fa{)FIj{pB䅫!^2wJMĿÕ؞ɩkwG.Ee4 7lNް&CAԜntb"بڵ%hV]|t3LO]r7 q\nཛ7[:@YOW_&|{/*_ǯ|N?G_w99=7~ej;)tpu ~f֢I+:A`:|~IsZKWwrryёi3e7H&Mi)Kf*]2 RJD)eKILlX jM;%ЖII'ra%֦M ib'Ĝ{oDU49XHPwtBD`V(0!>mo128Xhɧ Nn#U4@!o&o)59gߕ!q"Ge3gKOͯM #Pꊈb0:ZYaa1 n6z"8CZh(.,ۍ9^$"4i;63zuJch`4J>C uv/\P۠sS;Ie]3Vݑ뜏kԆLjD0g@eBD10M3K1[oy5Bޯ`B;S"("9Iir`l F q+\6V0 E #o @%C2 kLêҏ;#tC,V0:EXBp6 u1Ys5uZ)flut,ˋ顃;΋tXn(@s׽9n" JK)ⰴhxz~=n$d4YMt$E&4u"$=:5(湵W@{k^kцzku %mZo%g'gB7;]RoAJ$=swFM|P4U d/6@HR crCV%4V UXu4;JgI8#G.4CN͊8:rDylr֦Uˊl=kEbw/ =\ؤ-6y-T-L9RV@LSHPg6/]D#Cg?{LpfB POw ֪M'I1%; j"x8#P< .ry bZ<9Yڈc 1Ebsl`4a7HӌZ@ir[nZ[+Z0DŽӠnͱ$V[Pקh&;pT0.nX>4mWZsDA@ӆy9en[A]-j!{Წ Ah1<  $'oB(ջ#5k9F$h`G!IS UJG:)J)ѥn7PGĺXa z#6M͌y3C8X825ly@$ 2MB}br{geZA.tD`VP*~MdA`2(`~$ύh9ȣR¯czP-8Qdis|lFW:85v0ec3A&32#Cll⠱´oN͏giw!3(GWlۧZY-Gɴ6p1Wl;I3_ݛsT=b(kڲ#zc C@4ECFZ IܸÌO1+8g}F)U; bnWǽg79Lb`GxovMVa'Δ G}>Pr 5`ָ<,N]u[4qM~{`ߟ !ox > rJt4!aHFj"!AiuUH&`b!aNY{{^k Xݗ0B\kw,]! hɥҲ=nζKg'wCZ\IӇ]7_k?S??߸!?O۷;|)~ZB{ݸA?u/UFC L+HX^7\sGo3_yǷ}7OmWtr޼~}}7|Vӝ[I?ͧ,V>x$ƭ ;?\] S|wYꥳ֯t}W7owO?w '6Oj*CϘv/ӃYXhL6D%mI8aػLLmOɊR,rZzE8)8:fs QdS磖B] tl˺NɈ9QW>cuie2Kd} FxjC-+R -kò~з6 YwE Gz@}v" J" 0 oF]JXN5Jk Z,;j*b@nzi MK>rBcXA, h獡gG= fcC#5C(10!)#i d ֭=u7H)> 3 6b #hVa!@o)7_|>rplA^ʟRUiveR]-gw^/Zbʆ7K b3`n2^+r IDATw5FEm>.Yxi󦪻s7 q8d/m{$)(u3jq2fYY|o(r9m6$=iM Rkoh51H9lQ+Y1=PSol{o'VڼZ 3AbF;n0לi &p&QX : +Y!QEc1[C ECPY vGss,qa]4~4w-_6RV(+<ˌg܆ N'z$5UjМK|-lU]X2 eR!fQH)CSoЋt4eNއlvۜ8~),o}OlO^o\x-?/~÷ܼI_qC=w߸7\n0^џz QA _s/+FRot Qn8u}}o=7y~/OIg63|r^%}'~B_FwN s]ڥ=>_ ߔw~~f>]C I2-[=OۓI.Dm MGLi:$7="FN1t$ަP{Env9ۭ[Q]uϜ,΢2ůM:1m`l;qA4MF`RrPncwgt8ĩM-;=壓fhp7)zt5# Ew{燏QmH1ft.`gZ*J1J5/kM0#)MeɉbkjK$˺ CmTIk;hBF'..B}H"cnqIaɩ9%G#i~FM,8 1Oh Yj̸eqZ1skC &FRf!ukQ5PAB d&(ꎢ18d & #mL~# i#%,#q SL ''I"7+`M#yFfô% JWE*4MV8(altMt<9OuU5vspM}orFg2"}gCpԁ*rvк#WT%p*@uܗ9O i+ 6攠L#tp5NK5JzuW I{|qJG=7dy 1vDt,>"hL^ D u6[SRm{ %""MIDE־%5$\jk]UzÏ>za uֽww{py'&rR׫v:?g;~j?i%7v^07O?MWyF6W?ZqWѿKz޽ 3ᯜOLKu' w} w?v+hϟ+Gg_?9G]}Y|G˻fKL>h/}/MjwtfXXGl51"]g!Vz^lfJ# fp/3-sy\\ƂmB>V/FȀ!got)zbq SgP\kA-۠neFpa9 I<Rq*>iG"n|m>݋SCX-oAl"^R@\42kBXfKTttJXOHF.tY4v ۚۜm-ZoohLgd †\y/CyY*?keWv>>Ivá44z2 %I dA rv? $2$L"I2 p`,ǖچF3áf(^+?@uy^6%dU]HO;H):j!m"CD2FJL˲+Ɯx.H~;{Ӵ0lJgzj~[/4@x~(e^}j$1<4t|mv|L''O ;/o|؞o}]jyG=?h[y ;뷮Ӎ?[g#~WO۟.][ӿp[mY1SjtVْWB mhk BS%p[gb*DaC!UjUКQ&U!0y42sp@LT7[0Oٛi_41hz6m:L 2ʁ-f2Ή>ݵ/]CCR nͨP4;qXmxcsUJTn1n5aHIPK3TyAhTM~JG5ZߐIxdS324 =拼}/jSET;}H0f$6UWa>q S nWq-0f# X~XQ6Ĉi2P#X{-rn"+rk~]6`#bJV Z' Vܩ)wӸG`Ӓz!ovj&=/R OQ، Zנ=d /v*yY2{,<S鬒!> l3ls㸲W40Xs zӤ rU!!`kn;nwB()}6e JPJ XC""h&Re"ENb֪2┉poʸ?>|~( D_q9 #+{jخM'ԟE/no^F ͏|z ͛7 _Y˿k~WD{\G;wA/?yp7t{O=G3~tOuawp"ß O^Hޮ_?˵gVP'̓>ʿOO|Tcjڝi}rcDCU*RY F_јȫm S RR/åRj@ 1o5 %@W *4'qq}@TQTU%>ݲ]T& lU/eUBm'MCViё-nc[RLbҚb~՛v[\[Y"#C" RdEPe@H Q \<#GsT6(F@!ޭLi:G4lPhSv@g&,yF.j6B2YxR =un>xN {a6?"r3ԩeF BD^,KBs  s< 4eɨ.}90`V !14 MY[7FM)!UJ>a^Hɘ=iԌÚ?0 4nh݋!y*-ctZ+2[8Ӵ9PU,l罝*X y!&*>Oj-,F !%a"1C2`u9{qXJwC=ōj)jhwdGѨU)ͤH~?AU=ts8l`A͕WfI>sٹ!)xhD Y<& !nR ;RBt[.@H(jn!hϽ}`a)Nl[], SG1b-7qu!w(d(KF ybz?_Ù;[E7,Պ`Ŵ{K(>IBafbzټ7@q ޛ?0 1bWao̗:t(CsiC*ۆ  357m[SdCT$hzPaϳ*\wffmk b):`(8l?c^ {* v&; ڍ@I@v^n|-i|+RMC&LҵCwu8TQrdm̌49V\hu@J.uRϸL)Ql1DbŏY HQKͥ3Nf- V]Ȯ<CC*%pB4aHW{Nk/_Փ <r+\+R/Oݸ_favx=Iow;:}S{(޺eU} ONx>u{|KΟ}7}x'˻?6jN_y'h~<[?ݿUܔ+?QvS1ƨxp^l6 W:14_JjSm/I]zaYVJM)`8kcSlGSi샩3Td4ԊZ9#ňU4.98`Q5o K+"ƪjR_ Q!s6`Se On>Cڎ\E98Eg0z#bƺ+*5괟zH˱ʞhP @SA ٛѦ) 4-A]`ZhT,{F8 U TR]*e!I-#t1l\tMG\F@PHW5$~"Z0 z(Hj0m x"B^^ȏ8v Fo>TߖB2]{i3F)bQkhMe-xqRHNbJ5ԂU}ސpn eZo lH+niWŪbL@8I*eWɪP>h75 k[&UKG m.2GơQ7\Į{Նfb\*FxcБ2'VY86IX`jX9M߀\7W`èoxH %BA@s54!!07 ^8=Vڀ~Yc1HDNn"EYs 7EEk%UrF-r.n.2]gy@LmO67Zl.R tF-n, HfEj +DEU5(k-˹*kUUTȁi(.e"V:0|G1'>c{zH֭__=߽[޾}ONNp|nR~dkdGoHw΅`{ u=߾DwUz-|3/xF_^纼8k~;ӣOf׿']">> _Yߕs~8 Ra!"S ) ɜȋ"nkUskE}vjrɈk16 n )ޘ ++H#b.bh1_2]5pZ(P/ԋFmV ##{ñh@UlB CQ(k5R&FX -Tfhh5s IDATc4an} cr%Y@.X߫ \U+zwLIɶ?τN#$QyFq[3O 캋@2by)>qyb;P,FOglQ8euDy)vCp۩%,N#*h/͜EKE2c! +l6C^!% bQƄyZ臵3e X\`#!R~/B# Dg}2=qQPF@՜]vy1Fv.yH J_k)Jl2ui۷0cԚ rA0g!!"Ο8QsJcD\A`":8 !y2"5gb@f\/# )`maQR 1` -5PJ"HkBg_I0d%F$85OZ%S: 2 C40zj\]r'(So>X&`y6:9:~Ãm^6/OӍ[^~p }G ~4~-~ C_x mkݴ7&@Oď_9r^W'{<<[x~Wh)|clc4^}wM=B>_zXm">z:߸?[_'㸾tʻy lϖټh~;fW8T &FR@QD4g&@o0+@ۢ!ļ%РUAbL[ L"BЋOr9p,<Ԧ[Ml3Bc'鮕 B(Rϵi7`fUkvV5, !:ĖW1Ѭo^dBlۛ$MD"ňqA^8TQZ<&}r(}*N $,.zQ[G5[Q ({Ps[!.|'SRM>(y!س7F-̜Z]qw)ؐZ)?bش8mZ[[onYC@6b;zegTR\iF1iiycIү},FR5R˂~5trծ9*bMc`f=zHybR0N4~cPNq7DO+a˗.a(l4@Q(3N!w.Z!6FLv˯W+[~*vf&ciIk؋%b7@bvzфCXo6Hi4fT{$a1]|. =o-G]c~7okD8oi:3󠰁NU II@d ШNyR1 A7tkwq+ ?u Bqbw4msBɛ;A. P'GF6$dHTۣJ-{ ANF>B}c{!@?#a2sP,waM뛉RpS8t) %kZf3|pC_Ju!Mg:kL= * Akksu^i]%/Čوݐfn}TrԼ`^d;/ ~o&jw mou{ƛ(C̓{ iqûš3^7pO0ڑRp7 -`Nh% ЪdbJ⬮6WitpQBU%U!9L*!]`p̥~RJgH*ey?OyWDO\Z W._~zoڵK??zOI ܟ3^mJ_vB~ׯ__/쌾~o^:k8>~ ǿXzF慯}Kϧ;o_=[P߸-g\._p?ː?QU?{|)#Q@NQ?ŏs~\= ҍ'~=G>UjX0?~ucL}9~ӗ_]߸~Vå"s8G?arv:)PQ+8Roq](\f# bF! (MCJvQUp- "bU$d/_\7fLPo]C͉Lp4OV4X#.GK[s]sa -2ǩ jHMw0i:V췸++z Qln2s˳HОhfɞN͞\p0oStSDq5" 5cD(^*SJξnt@D@+lh:CJ([ûXXlHm CߊV%I"/Q&}2QkFE1+c 4mi Z _.Ey2,E0Zb0H!b^# #Vr"1UG C&=MV٦R*J.(8=2OZ-S;}\k7iiLv f+.6Ye.ˌiwGz匒gkiLs,dHuQs~zcdWwj'Uf#l\^\<#QBlHgPbz C, 0Y'X+/v jER2OKެVr 6W)b0 l6XՃsӐGa'ǸdcjS{Q(}c8ZdɁk?*~1/6̉]K8`ɋmW_hCеp+ǛL;5ڵ.N5 3vk , `C3Nkԅʹ}AkbI]}0lh~~iϊ͗jk[$)" n$b;á! >XrF\ĥdge/ GZskk|;FmS=0]r3J`\W`{ڠj]M0!sMgtRvs&8b^O.auKFY[;߭leq4Ksd:3ɵh…F@|{S}whCLqpcfwG.:tY P͆KP k*!iC2opDk Q< xPJL!0#eQJUoSQxC,似Sk٫ V:*S2O;@iI.9̵Ĩaz(e X}Yg>*_Rxw֓+Ly{x}Nw+<,r8̴?>쑹k_?:گO?>rB8^~/7Nkg:/_~_޿.SwyB6Ϧ<-~L>NrO1-:^U:d._Ga#z7#a@6$ "qxC  %"ު`#j*`L"D7S+YkUBm,㎐5{CȱUB;B*3!P0M(btؚ kM&o`\ښfchQ:9 J_[y/9lv\QiUu!ʽlᦣ\ m-O09 /Tb4cbd7i%!Uzsn'F}贘ؑ[#10r0FŪ%CĚ>lڄf1􆽔fp8f,wnTCLUhyb8B< M]9lj2tP25eF9w]دO}4`gLF2ӞXٴ"9D*e 7 ̮W%[Wr-g׏ؠvcz@]PβɚxZHeaC5pt 6 4u4'R}wX8b^!tmV#fMT<|y{6aF!zQe9hU d׆|{omղ K6#yZͰAāG@wt4ىbHr ٜZ~jC潣pъCgdY\;}Z/ r$yeBU7%?2Y\j\cL D"C8w mhd)3| 1 T1l+ f"Ej{LuaELbTL3 0ϵ8L޼(bIӐ4j v#LV*rswq؛f, Sq7}Hw ,CoڢLaĬF#W~}_iNt^ 8v?'ք5`kzCl_"UoPZ֡7M r`w"b1jZ>oCjl+U+Ɇp~NLǏ1 k*a *rl]%>&7jAJeY]_HDLED']3T+1e)u.|Pr^r~(f T\s^N|y3ˣ~"~Gq {ooݻWٗ_9/r!Vp{=]Es q|| | )w^Sn­[t}/ܸAONzwowp! oN}?&@ |k5FxFtMs@gglzotS̏7+/Eg5cƿ;_g̯ϯO\"֗VaZzF1ʲR@n\!h &8 !qJ@!*cU)!KD ^kA-QD#KRUT+& 1C#TiRX̑3I`7t'?i941X15l}݄f֔XӀJE-gwМz۵nFSj2{C#0aƲ,W`>^a0vzoU0{1LTe\h/RDME;gfj秺!X+N*R2Luc6ݍyēc04+=C, y0{{_&/яmrm4@>Lpr*.o!N9 LVڊ4`\mܜV>4JΖ9୾`<{FXKN.ΒgU"_jFMl.WmGP@Յ9 ,ZLDNP 颢s E& t_v4\)3䣫W,_y}A)e/soɗŊckn߾͟{>޺u+~:oEg~ пs{MF {3gP?97+ o2xv}Yԏݿu;w7xC} }oŸ(~[z7-}'xwi-?P>ʫ֭tm j}Obc? .~]@vxuRLˏ]R\k^ORR tY*Z*: 0v+BJl *eqLU2q$1QpW 501yin6Ƹ_zҋNm3̑h p W?־ ܦ8,]Ȕ˙#sԴ"¥u@4 :j˘B#x74)`n_'rۡaE ^fXp+Яf{q\٢:ɰ!,LRR+dc X:`/07 r+b&263a&w0`jG8X]Uq:Rjɨ5҃O+AţG<E y7M~!9#gU E@k{RdTj=\ۑ A!.1@CkCDcK]f`Gro{&I V4Wi8(>(T_;5ZANw"Tt=8~2T7J>27 HmmYkzM1Z k:=Ә2'_=%h>?4&K75r:pmhPG9Go48)G{&\M\mCY=TY-;ׄv;|[} zc׆b:~Z’YњzU:K=ʇĠCMPݘ\'m(d͝5iPȵ\{_g>5 ihz,W)^I jh;Yl\9i/bHVRs9*V]Du**Q L`&""Fa+&EBկۧ:[N}2-KkװU=g{'pDGa=8}|7_/ܸެ/oYCDxE  IDAT5?/`{>+mW;t }-N;ؔJ9t\ti ''k}ŀݫQ|!n'zQoa> %ˮN֑1 :3m>+W+Kx`+6 V9U7!qJGsh "Z&F\S [ !TqZX^kЀ h,"AED33%Q1ۖZ{`*jZK%HQGAT&$E܂%@ at AKզyc_ 0Dw/ͭ05v/~µHl!4֤tj5 !aG4/Ч P^+hT.Amjn]@$BI{a ws/T~k#UF+ZXbCG39^ ):baM^\gL^c2KM{1j34 $WXjJ"#F'\sϛC03KkH`C ?k. /C2BR\  1E^'!#YXRэJ{bBufADbz24d{Mj=9YLAL{ֲ]aD R = zshm9tv$l0s"SQTEfϠ:g0 l0[2֛O]ť7ZjoIk=Z"۽(0SVd.; À PQLӴòXjf0b6`n9(h6+ ֤qA(U`1Oe ._>3̘=`^!)dZԁ:fKƲ렳a@}1M 5RH7f\C {}H+u+缀CfE^f_ͺWx8PNt WސhĪb4 \v4Zi|:l'oB3as4b;gԃ:Av Mϧo"V?'F1Hf9pT`Mߕ}ؓWk%SwY rCDjr.􈾄8룭D[RiEK,ӮŴtk{CHj2^K p߹^fuX R@ԲHJfh]k޸}Ec@O3?xի{o'gQ=Q͉d:y׮)ܰn m?x[vJ¸ZYc2XoW͕-$Ŋe)`*=@}ڴ4M#"Pƥ&(B!0Z-. 7J| }r˜< @/$2V+6^,믂k %ughMX3UiNliaUOݡ ZӴ./84V#? "1k+j-PqOP{" VQ˪2iFTԧPBB`d/b3$6#ed&  `TiaT[X8p4Sf-`T4qMm5|?Wً@Ϗf@H)D;O]WFmkn䨛w.b hE)?ꖒ˜c% T'3QT"׍fKX6g@]**<&ٹ=OR0/x ՀKGW`By!/3yoF 1l3\G( * =ӂi7!zdRacۺ{|#TX1O{!`[su5,3RAvf0=ڬf3hE^l/+@[=>F=cu^q5` (ӄ3j4Oue1`0$kX4* Y๶DNfr՟ R!ц~ͲFc0}v:sn@sao@Ζ} ylLJR k`pCϢRsm˔{;%p<6ώVj5Ch \NT?RȏLZkӡ5m*A9غPj8CQkwe1M܇$[rfx΃w75n5sRp%MT<:+y}ͪ"1tS,M!ΰ<ۖ'Xb~vvUÈV{^9!Q N w`_;jc4SAF7c8E"t"A (%V4y@bFYa3PJ!1S&%U$8YE)\PRH>\w`]DdJc3"ʌYj>]~ohvHD~n߰o?z6߾=9ǯzp2zKnݺw$ay|w_{zy}}пcr/@_yC_| u;0һ~곟"$=#^pwZo%?978p+s?@$~cot~"kL맟~:r,DĸA@qsT5)]!6Ӗ1!8+bZBD+ֺ0ц9\aWETDS1&9/ZTr9ėKGE[&g0yJ5Omk蓵5wKFn|o"S&4.lVKª}7*; 503`7eHC8Djhja_^Ys#.V+B:hnkqUQ]#GجtOib+L;ѬRRhq1Du^ [2 `u=NcYeL!d.1$ bw(fB(DHԲ#tA;F2Tboh,ˌJ.8}tWLPkvQj DHo؇q ۛ]ԜKMVo0"ƀq\cXe v]׋d5f<dXِjjz DɌ2-wnbڃ\b2O65v=eY0O3_w `6e 2R ͬ`7 4M]"je4@nd>؞ԲKɶarкj[N,97~~.+3W;=~͚vADk->mmvI!: g;ƴhhh7թsezd2Z8΋=yhvH">5FE 7s0MeYv&>^Uf]n]Md%hTHnB fZB%1 1ԢF  Y)I=jD"Q,+MQ?{?/jՌk~=gZߟ:"ؤV6*>9U@לQj"L PI)\hiH!$5ZJ hMb5h.eR +Gӱjo~?_o?sy+7E>}j^A#"~d{׿u9//^{p;E~omI+@;w?0\=vM'~#yGx]j\wiI~c@k_4.㺌 O4ynI-ؔaД85QSɀXM*PT΀)n C4C3iF݋Zhi wZkVZj&kOm+Tn\Y8,R TCLkN'N YL@f HG3 a 4H]@6w!8*?3u+FT6ݤ#AGNy@Ys*bFs'u t 뇋8cw ;>e7ݎ=#"~ $adE1QT!jk(._Z&ruo)v².ȹaLt[uӣE`AYi)pZ6؎1a̐4NHH`vZ<qɨ^LwG\7/'d]f #tMQ\;ᮽgWsQ6Akt58A&h\GĺB]QkEh7t1úPk")FŸأJZSUhD"[imnq8,+Ǡnq$Jk ;҈ZJ+(|.Z\L\q,x EZe+Hd.tX62Zn7fZt:!L(r[37IYdJZIky̐ 3z3s8\_-x1Ԡ[ug` ا.H+SD= {8^ZZE鍞pdv{Nkx"Ͼ b0(J0(D\qW1!ńˋKo<96g-͵TA3N}u1CP!G8x3愌^TDU. r-F Fqf"udx :yIP t5J3c'5;ic#^Ԅ溰FpLz+O0ΌMZ<݂IGt4mF@6n tf#^yP*&YύqiBM=u,fa|ʊ0$JS̍Z>ojS5?x?p⬹Uulatb3SXiٰs6hLiF/|FܬJ 1ys'ahM|" JR{HwtzÚ |hԯ:(l J Ps;: kͤ 5F#f!BLj’;u9Pk'"U~?tk |꛲䯄__nNjjӕCO .y3YhK8e66ֺSmWwzL3J3}%g^43u!Y;n&uy@䙚O&F|9㏬Q (p8K fuyKT/F(n&AD_۹XT,AC?zU2lFm AZ%k& \);!6+f`FFRt ڍ8' ]LxHQ] /+m 38 [b@lbd 9u6˼ѳ~ MW9RJAŜya璋#$&",("&w\])P1NCôQAji+eHh08BJb)M*x8b^aK'av{@h3C[ #;D\\]+VSZ4ْ3u6jY%޻! Ӂfm8[:+ 1 1a3Z.QjƼBy+>G&+ IDAT//3>PZR FD|YsOㄜ s>1Fܻw) u冺fq 9ZiYpߡ9%WNyan7yiu`iG3,UQˤמO8 ׀VꕂkDJeY258=b4Xآ;D@Jhl6Ua)TvjL<74/n#kX^Нnk 8`^fPWȗٍĝ;VG:?_gN9ԟNs57@ۊuy2 >@m(<ޥ8vm k@inT]ҩV]4tt8ֿPu]4xLBccr }H>HVPr ]HPkي)7gzCMO|!u4 #r+TG! /[Ɖ#t_T;-Ri&fzxs4F 4 `Q٩E) HAr! na]>7QmߧUT2)qh+qa֌p*yq~>bFÅ 163FC #!DIkgB6a%ʬZWύA1L.\7h"pZf,BDg8? *hѦ 4rp6`u7yh8^s*a1 ۨ9lJ{3bϯ7 9/sxZK{yPJ&vyyO+kĘ&fa6Ҿkܺ_4M.;ypC8^^neisަja7B ȫK i@(Kv'I3o*J=7J"ADzh %% iѾ#fcźdae?wovg p[|/ڍG v!aMB5zDAe@itnlsdcrcԍi"`:Ca+pLي^6UwDYX(1q7'{o0qUmoHԔmHaD!#bp6Iѩ:#Ln&)v@Ps87D gDuN]P0yRQ<38p#ћC1A+JO 6U 5i6*6áːtl0t[ô ?{-Rw/><,߾:NO#9 t_ݹHq?q\N,woVӠ.ӝ7cX]JU%:lZ-Zfl9{ qlbG3Z֓@Gi@:0RA1RP9!(j>(@"ENN1i>ͼ:sA惖iS ]R#rvunI1ovA)(ժ ۯXݒu3np8} -|ij8 ӌAO>/CLŋEa5(kp@ O`sAP !p:f xS[2H!B8Q |/Ha<<c<1dpvRTW[sSgFtVFwY*Q'F2!z*`X֙Z򊸒ѵ5g[hkH&Ix37 mk"KϷnav.! 6 XiYXFɩFbVȝw*sA]/ow\nzNՠ,qP*[N߆ߓN]U, B<eFTLW7S*(cQw6ml}؈5k& sе][2VIQ.+)`#țRl{eF:4N-Ϥ?9a`Dm`]Iq5?}(uwdt0ܐ[|. y]y*@$F#2Xn,C-zu$0Y5ƨ^t|}Kס~6@ DL81àQPr\X%2%g`]ZVqَyGWBJ1hVMJk 5[ln"z4I&CHw2 Қ`^ uQ.qwo??PŸկ,*7Go ?󺺒-ן=x/]H=>=sPgo5M3ۡf oԀ0s N_ഓªaL:uhbgwRGr6@M;if=F\)0N0ĄKZ[ٷi괎1*!f-UP-h%bVAM n eNRb[|PLNPj[-k$CLvSb"iq2X9x5^/E?H7F67-;Rnt Jk0"2z[kDnaDikqr5\"S1 _ ^ f.3zkeB!م5A+0%qdncI N{;`yけyRfY ӘT'NGP idc`8zeEͫñ%!  2»N3Db8N~*iaL3#+^| Q;w"ׂ6;28ׯqbHA1UPK,РHx|"mttV(8gryB8Nې |rޤ֍vOW3DR6:ް u^ְ֌f 4ed AzaҸ9綺+:{*mL Z;SτY[|HnV;=dJ晙gI&Dz?&^g:4τmY#@%m~-,fwUUΙfox|Q;Ts]^"8踩كξS)Y1P25Fw⦓(1DZeS=C^`&0R/^$_GV}mg2m҉Fµ½^5u\GA{8,rݼS9,>hM&+sX~fk`sڸW4:+am4J;Х8C%7!Ǜlj6"ufu[ClùLJ%D JCðB)hʗr|޽7ݾ7Ԋ1ܷ3U.|H_V =DZ|_*Syv<{]A.FxS^?!|{L\<|J[ЇO[}q{S)Y,r4\_=Ji~y;/R˗Q uZX-C@ KkFڪƘSX-0;:;z$+*j\:L0r(ۭV뺬K)M`1, JYMOPu{Ka i&kok+B/}fИ; sʪ]I}V\`{vTap41DЈY)qC49cH}ݻӪ"\GjumU-,\ZEu潭[3zWfi};'tGeAP)3lQG` o[@ƲxHƷ#x7os5D8o]vfgi?L2PGZ>_JyA7زf8zmC9:g6@ { ٟlO^Wg覍U=_Pj=/63\:3:uzPo=3"kTA:RX;L7ˡ3= xtR\5[~,M(_ RE,X̰pٔD88/8BS?]=ү_^$LӄW޺pɱh-|o }i} أG>GwOw&'ON'uuw=tϞ~ O}uwc)~h\í`;m [.WjuWv|t()K8X4}K6+^ KXͧ5χ_֊YKs0SkEP+B4 /νE r@Z"-vN0HHz("8]w CZ߬G³`<'fdr-!9pr73Aa i+Pt6;~X 1M8,`̰,=sڜ~aَܬXHQ}-/$^gC'D ~8EP)(!`Z 6񠤜 L-DOal]ZH( RoJ$vB!9pn.`b9yqCq.$Ya/W,a(eNY!w!ʆ0H͋* kd Q !Su$)/0Mh0 &KSG.ų*3BCӬ3Z^x(mX2ѿX$"?G34T P ZR x,sƀ+\V,벭. n5"iCܢݩeEF # 4wx\gw"֭v+xkQV`Ls0k n.䔾sQ%sιy>xiC#93,n߾m5E}<ș{S/+{LӄZ+VLgwq33Ȁ(Z El( ;5$jNIc+AZjfTC)5$TzȂArm&3,`6fskwA{`\Ӌr}yY_ӿ򕯄WѣG߶?0_+~iE?'#oc?C?پ)= >կ6|[ WWS<(p/?xنۤI-SxqK e^k~yzwvEO?qJy9޿*j b 4Ьbh:FMDBД&&iD5tޛf"ZںZ[C3֚܊vZ$rM9Ui6aAmj^7)(En=0<ueLPoN:%ÍaYx8s>vFq>=)h rӬt\6T %gz3LwU{ʠ3(B&6;˸N xA?ngw4#P54`Gh'`*(e,kstD<#kYLN _ ffV1-`0J[bz`/ua#m/c lb fҀݴ8NO1 *9i5qY3j G4 # 8v_@ !x#yuF@rT#W^# u\jbLώZyO{|8-Ι}`c$,"} ᄐ`r!&s4/0h(T_W׃9ڱ B]5y}vv$!"h8׮A-f:1!4ਖ਼J5`-]Xf~M ]e݈nkpfu"g=iAsNnfbvYFF_Yy :RMvf&Rz68M߆}›bx& 3s䳈K3:C#C˼=Q)>tI#w#{tk:5{ikTO3ggc}|itD?CtLCݛc^3eP Pשڠ+ngi,ԍ@lLyH׻~i\M)iCLq<=B{͵5灰5*Zg2†“ |f4Pi`F JV-[bk+* (˺~ԚB,y}bfW.֦?y}:NX|ϗe'/{?x|W~%^?g:ϳ[oէO/[^C0/^?ϙ< >1_xx#| 3o3ހ'ܿnW?E[uxaAܺ=(/>yno4LPz:p}n_B` a, vZڲhbMdج֠1@$ !TS-9.KiZb2u}Pka$`'.JkS5UC1ÿ@0:@n:҈uŐmICP`pd/7)B3h#yl̞^ ߠ*ɛ0`V%Ü `6ތ8nٵ vfy:*ы^]mT3L=sV]AZ {LCB7SQV|kh%#gz_>]'6E^jA+|F9S.j騺NRN .OuLӸ1P6m81xSM?5a(F8?] 7+RB8 D ##RJM֠SciLG $'Q-Skdu2J00t(;Ч[F׭! 1bH`8 js vϘO'uƺ.l 8;aCZtzT \ߐ^ibcH#BnVu:,>2_#tg`8 #4mt} ϠD"a(3 at %ڻ82LtA$@$ϦJStbrÜi68}Of(ᴜ0 tg&6R3~}!K7M^O$rP]2 -a]^K"!V wt䩣Tc{ob nT.;G,*jswMCx-;]۽ MR@t xG=5Pzҏ7\l7YMlgGz_ ;uAg;pn*gp;?G5뮞Hճkm={W@^\2JFWkϡ,_3v CTԵ8?jDvLO#Ms(i !43,Y5&b09֎-,7+Zvʥ-r~1~IY2YDpX?گ?Oaӧ>h>Ae{ﵧ{6|_~K#?y_} yL^LbWܩ#_./w>^~fBz*hOL:jΝ*MEJkӤy=Na!8n[,030ZՐn踻u(,iSaҠ)ŠgW76 "mQ.(߈"Cw"kFvy#E+SCZI 6&gZr0@Zdl~m?xYu2fSQ6zc/8ͤ/kV=0U?zڏ4nǸŐ$ RFJ$_73rxw}J Fgs=wVwVuH* UwU?ua %qټE6@]>쳮*l8߆u)SV*nfm;9.H8`70h224k!Ma,h 7(hoNMv{ D 4WjE!p(9l(`P6jlEtۗ3>UowtDC@Abyɡ^FJӅ,(0*Ny=x^F$^2QZ-8_τ#tæ}|BYWh Z+t`n7a]W7, NgC3,f }@ ƁR4IlpP]nmȶ. ffҨʾj(vFe&U'5rڟ]Cż`-= ֘\YN:H$@~H#ȧށ41;!y#U4a.D~7qz3˼ #1rkRJN>5t=4M[>2HYo!>/ pΘMi nݘ-t*tMEQA]3aQO)=dk %5RBH٥h<1amCR+\FȼjNnf̳НCZM uw֮Eݨ Àq6mfwFNp|H#'ЎZ󂩥m>4Z0›L7>h֐@P\K]kƚyLf N>:7r(Zkf( fV5:!ACjN2!!$"PcL;W^pʵ-IJ~xq:٧s>-Kεֿ/=ztq'OӧO ::ڏA_~+׿.p?5x?x Ǐۓ?gG __O//H)}Mz9G댟 }ǟ1eQ۪9-Sc ~vBg&iG|h  +9bXo,(}NtGN%&I! mGxXg _>6o,$\}EC_QеT$CCh2k}gۿo~ 獦ZjfD+AS)9DK) e7\kn0Ik$d: ̰]Uj_srS8doJ zdWh8b)Hpĝg+~ >?;ĝǭq= "Uj4Q(0!Il$֊@Xq/Zb/$V_>yik\}kSU|gwSqu{ = _7FO<8k޿Ax_p!M!_? !֟]Ԯ? ߭~оw<~/ w?_pW5F7Fa__.s 6W5iX :LAS)][o܁ "{_1$ wxvT(jq1A-xTuLY9EN I4Ű3QD "2zh/sQ 8b ?Meu>^vW%.Av!2؆8)# < 2Af( 4Ȕ#堣H"X]=?{ZkGZH'DW~s{k7x޹$''fx|z 6@asAgf E)TyaVV#r"(kLL0r}0.9D46 [n HNSܛeGNt~jx> Ơa70 @KW[1 'ݭlr+Xf4HdQG5B"[rI{- |X.鬆c4'vXV( \!a%n_LQ,<8NGVew.vhϜ|apnp ~weP䤅PJl?+> WriA 8nBQ f^V3cC/lDpP{܊+Խb1QzJ`znDY ݮBճ,NњpfԶ %wk9D,DFu&<z[[8Yf`)"K @;utmk¥Ԃnb+jFS4,lZ=!Uu)~7͒ȩalW ˲t ސ}f$Ds4GAk!1SrJmv; p V9s]GX t*u=V-Ea뾶h F( @]մJԩ}ĎZ̸qtQA U0c߫Rc4:QFEr 0&~C}xy*J5̑[qٵfGb!j {VӍ)PTm׆P?b-Bko8cL2tpt%|RbSTuu{X8E_2ĠE xɇ1ھl^H4uZthF ( ԏ`>  gtqrmrx5Q4!<ӎۙpk4{G/тަ/wMVm$rRl$nf7ޒSg1ĺ6ե4Y[Ǧ"ja)ARcI2Z+" 2/m9 n7~x~_=}eӍ?3~?x _`+|_C/&◾TO^?K߻Cf?._K:|W'L[x x+J^H_R<ԯݻ[{z^(??G/lkXtG27QO^}.PGz뵗z3_ޗsڍ2 \x0ޠ4Z$ 'JvI)Wpx#xFj&DصLʔ1P|xnSП._s$=4,pj ӠbÆOba8|@v!%ϨB/DLx,9/$ro-]ߣ2"QM#lY U Fa"If9^PTo 8{T 76Yk7 bk]7ƔЄ>ĩ6F1uͲWmϓeEV87nyoP kt[7t,Ƚj0mDQ{׳zYS8 #vэ2(|VHcRw JeqZtI`š5ӭZ^D]i@`v S=c<эQ=682Vk7A ć7/,~ /v-b]qaC61;(%ZV,҈ e.ګN+a0EPC<dze`J$f4w?d"8""xhw-kȐ}xe׫xl80#f4[Yi{6X:.?C.MdnkD rnbTY)^׵lO o#.c7d"TBlÒe)k3ٚHoUJ^#C9Ώt} "44s,Nf^nFZ~iius$h}9+tm4g_j}φ5[\@) Z*ǢuSN{e&xޔ3dG)\ *P"4:6j_Ϸh͘Hn{.s}?qvGPWdj._?@P+Q3Dbu^G۲a68ޢ.aDhRL@LTk1KPVr [f0u]m$c#2wr }Ѫ TID]LclPg4X){FP (֦n5VS(Xj9)کzZrr3fT.IvھhkhӴ_|΋E./f~'K_ƒ??7%`>\»Gѝo~WE |MygCOg7^Pe]?fa:S2(CM9q߽NΫiv=k)oSr~@Z*qdܟyV%NJY[Ɂ$nպ6o$VxNwVR&sf $!ol) 4(F'&}`SgyBp[5Қ }6sW>YZ1|0@`)&m,#ܹ ºӛF[['õ14װMpjx C~b2 ͵=iy!-L[/hKu fjNj IDATP?i1 g"" shh.c:')`Bэ>/b+ʹcⲵZ  coIk ܖfˋF?ߍ8t:oHkMRd7?Lk: nSPaxyƉ]!1VD />dX8>gXkPʴb+^ZJqUlj7׾l-fct/r@JZ,J*m]=^-NXnnj X8] OH63`r휡6u 'BcZpfZ) 9YEQX`Yf,y&+p$ن>RZ@jZC>MSV3N9{Xk_saxD\S |JhL(}V(gL)aY~}EߞAkzϴ} s$^l#9sp&9w( v͘J>Ψ}+w٨(6#2Cg \0aW@M v$8,8%1v W,[-4;k#0tbAٛpw&;s)כG?TulBn#|7jfiPȝGyF0`v4@ +|$6h~;:jrZgP֠K;?Bka[+f b- A^D2qNPALK;ې> bh Τuu~} vlyxԌIJL B?Mܫ>W3 Ħmn< ws7X$ʒEXHN ĭDDZ svZvDS#~."r6yP⋯q)v:wi~|~g~&`o}k!G@}ݽ{>w%+{°9߽dz_ݳ/ G+>~Xt|}' <)w~sw^ɷo<ֳg(]LqZ ?_oWw5O@nfϿ\~vׇ+/GJiTN~ms/07(1RfR؜xqߴӺ. !ݺ2)t|j$錉FՆR[bLDlhZAk&) @_ Ч86ۄ|Y9T7C[}TX^Q N;vi^KD9?b"ښe ٹԘ AnBmm2ie9"BFP/4a?4WQ`2ƽQVDSs]-.?6F_3iombjO#YgaxNslvҊӔm5WM\G3@4ZPZ17 fl4 cƛ7^6e(ְ.sZI;y0RU:aU!PNKݚd7SŌ% /vր} p# 5cQu bqu#l1EQ+g+{C =M'[]mls<ճ k0i =ڰ&nvem?36`2Qаs\a\ H^0IS7a p7Qj&?C]VL{o(T(e}.mC[(0kÆAWlLa>735h=]83ᢛ<`T[CY[ݐEqˡL>xDHrd9!5*y0e7oN"N} l]fÃAZ~ ^ٲGcLa+b@ZprD MX%A݌=`Te"L_u䌚fts bLTRo02䃵EV'"qMC>#"۟]>եϿp{wL_uB5x羜=WI3;wKz/ 5B 6kF#@@ynʧyx@_W/Ȋ6޾R9]9\T>5O|Cp{[ߨvcV̷n˻t~vm+QҦ5ƃ6k7_T`P"!G󴵥Ԋ9$Ԫ>(pL kYvLoT3'N pJ}Dr ["rgQ8b2ԅbyIڼX,DCtMZ^Pe,60ыftۦ +nbƨeYХ_A; 5o)~ytrtp:a'Z ;g.\'> >Nkgwf/u,PoL-"JI(IC?n0MqӞ ks\FltZ:n!h"8+V]YqMu3PUL N5jhNN ;MVP3Q1ty4V>`hSWn\8K Iٍ!pN#-Z@%[k=N"CbnDXֲ5d4A7 %+vmVA֠g9Έ@%߱eawPp̞%ޤya?5*#DpP7 g>**^nKE jN^jY ٵog"ܐ朡D($FFu%HvFYJ ch(u +䓛YVQ[ՇP:/V"0 JG!yx&MD^ڭސQS]2%ow Hyx)b?522}ؐ \Xk@ئ>X ]Poc )Pd}›=t{1\ t"/9+ ͠!TIbsoFak\:p)P֯5qZF4W#5?.kpjruSD,o*\{}BDPmVxj\<"$ 5A45Zc *W>` ɁpGS )cPkvCXӲQg%9 5hCI:]H]+j(t`[ HBʔtF4\DΆ<^8FaL\(m/?nʉ9Gw|=7tFz'K矗}"M 0=Xx<{qΗ})#|]FpvvF_ Z_:I[zc<'af啗GpZtlXnqDR֜sv6i#Be\)f2i\KCkk]%Tkfqj˻ݧ߼ZUԦxqg 6Ji cR9b!۝İD6mO#/-caZZ1fq%x2it#x1bgf^ ) uZK"ZFY;UB^ 7ܯCue r&kYh ! ~aps Cm5>vÊH8e֑[Mfk螢a<`a!(z/Dh^*][]') au~k^IB_^i ׇSXa Lf+Ty1MSb^yEBm5ɬ^8u;ZݝڈхKkcfBi;,7o {BDF}П]ՆFs@[\L۪QXDNGlYgT0 ʐLX1o/4M9A@(ˊi:YR-!%mzf~Rs&µlEsξs0ӊp|[Vw &k`fHY!ZkTXuc`V(QJ" V5eaסmxU'kq7rn" jNDֳU}h@+0EDkר_I4"'3i1J2 #DVR0 Ö'KQH DdUGBJ>3zhRC ߪms-1ԇ!B-tdwmmF6rCDZL /~F lN `^'ӻ>-rLLadZݕ{@𹹘S7Fpȫ'Qo41xlxhBsQg9@@ƳSy;j;PφMRdpMY]TS] ?c JR|N9ׅ͌Ra ׇ2h6n}&!ΜF?\KWjFvS b7$GbaG">TS!!t"G)t#I!&I"Z %%F[.tyХLz'Wbu˫7_8*w[ؼ*k@wש~/ \[z6 Xz >^/ ~^\+;#qTz|C\޹#zƟ=&׻{y^;e9֧ũe|z9O y|Hȵ VB*:k_λ9۵YEY,imUVVt֨*@#j- ZtOleUDhg*F!ޥFZ*rNSMn)4zk\YMb$0';\MఇShY %t/ˌXW+S2H[mZ=jkf+)-ljNY^h]N=)^pV킀iL$FelFv(u4'3!0dk}يiPJMosrf$\ !6ˤ\Q0*J3ZhADt[}/Hi~}=TRh{54t&zdU#~=V w&]_JKNg(y,oq'C 4Be]1OMSܲp]TjEi4cYN'1lR/1mQaLTߵɟ!e$1$l!Fkvjjf%`9bHݷ@51$eDD>AClMʝ|+.(uYoyb?'XʂFBS{lN KZ `Xnr N\ Rg Q^3l mcGA6iģ |Sۨzhݵ[a@S_L':"t͚bu4?SP-XE'44F'X`H bZ[g);ckSTrSJXI@$5$TrF6\ Ii?~ί/kyѓvoLo=yůn{wޱ(}ko__}Ch>y݋  5{vf vDtz^<~yzzӂ­K_z*~by_;·jjtő@Š5eUN'BdtBY R"}7QGnڜ%K>0ۆZa\d]s+C/ZVbY^P5Kj Qi!\ dMvm:@1/ /ꅋre]=ucvn)o,0EV郦nwl]+hBJ0fZT7kmԹ1i\c܍ݕq:pN=WOيqv}5J) JY'ћM=#\E;#뺠xO]c^ kkQ]zfe H˜ŝ@l!PɌ]VS8fR2oRcꬰ)O6go-p(S$>-Jy4e9EFEMa߯'QAxvd\.VsIhɊpDS "(.As)c]MR1pG^f2#IvQ}(g\ᓧEքY"\OW~闞=zP=|Xx?ȟ~騏>(??ypksÀBxx‡ѽ$tk#X{a;X/֓$p;T tz^aͬJvrHYh{?x*G|ySRmZUkaw 分 SDĜI7דUmu:MϪ L e!-< ? s*#[M[ا$M^!{hO@w}+:&9e3k:E441vb- j޳b7O7jS3E#\xjF$W銑M_ĤCYofKn1߸~ߋRԼ8vWOaYsB3)>qqT5 Yګz+s Y(ִ/LDmR׵ [}Dv0v)+~蛳_C-b9N# K0Iqz$IXs5Wa[f&+'tMMs1=*w?hzѣÇ_wn /bޟ%3w0~^iCx'dM ʺ|G<_ ӵ_g@#Iuu6ʩMð!7t8ȃzE1 0^jov#@7fEvL@chTjNj\^<؀54ۡ'$iZV4hjCU8jڔҭޅh ׯƄL_֚9ڬbci1tUb͆cO%i5ZD3WlyRvD4&bʼnII,ꂽ iws_qD- #gB"f+|qiՌm8&ЭaĘM >Ak}M?_yA1/SgCR΋KyPר~yTFd3"n,i}1RŸN%@Y5DAX HhɱVɇm0q@a hB\~nB_ =e23.P e3/=K 4r4ΛN5GTY-kN嶷gL&t?Q6͟دrn]N^SZZ}k5GRCw&ȝC;BhR@=eNwf;B<3e(Gm˃4 ͺzv+L+#Κ"!~kDJJ\jUf֦XZTI_tR"hTIQP*ڱ\[)|<=Zy9\;ߺqmωe)\֋u9|?<|?}~__޿[1% z)>#~_J_!u:b T^te`zUwox{_hܾo߾g;.oƙ9Mc:X*Ri'4kpy$6kǃ*XH$I,2J"}J5IrgtǺ2+S"Q[""f!-I[s'wQ9h\7, ʄ6p[ iD|b7#k|J)x/ }+1.M=+X˦ݜ  ӌP0vq\P[$فR 9(bV`j>=dVqwL)yyC!tu]M tHIx=nQD}1ZaR #aڊ@ @ 0 55~Mm]cIM+ ܵ,ˊ_KB{GBԛ԰)KDFun0`~&ɊuL )YPdY+pl"He'foN>U`gqWe]1 CNW괷 JnNH apT *bR(po^HuOr݁2?$IYW/]Z}UҦYӬX}0`km)0JS|},˖Z lY| y0g`""Dd<ڌ`EoB,8J-0T5'R,̡-[a` w.\;kjdמ`$^ "ALDMZjd"UIiSiS.i--{Ѧ1nu ?A(Z]o ]OMbaԖܨDRFJCfv01$e 7Q~]M/ 7CqPڦ3BɐIcEX$1ۼ VhbΊ2Zծ=??uV> {:ݮQ /w jF:Q?AlM^i9TI3 u˲`] y:٦Ȟ=D{|n` ɜF|z3R1t%'~̛TЦVKg㎲`ӾMOPMX1P>e?Wz~{%k %ң`zHS k @ϕ3TmL|{ZK8'>p5p"d{qՊ!Nܦ[Ԇ2~_K"ꏈ?$أtk+=[dT CLu%mRV4c+mFϫX2 D3ۛnڐ8J-3 3B=]~-\VE+. MF+'nJR"fY}|ma V,[yV E Ibγ m,MBa΀f4j7M!ڰ,@Z- ,_LŒ:m$B +H(lF+ 'Ča0 #k'`6C̡>Y4Qdb森@$[#$t&,c`6@uFBz|8E`g=B6&5=gJ6}A8M>b5Zdz.\sM-SaYq̀cpsaFFZ/uݚ! T :'N(5zDjtŽPB)on4q̦ o33PTc P/FqnZ&jT5-7X+Кki힢! ΦUy+TUW,evʓ]R[a2b+aE ʡ*Ŋh0(: F. QiOv X`IȽ8cqNj %@t5oOr/[| 7ʲmi>11 lY#k̮7y]P< $-L 3'$^Zstq;͓-r3/" })>(X l#ahBax٩aDaZ-[a:ui3F(\^^`] #N'k]fDl/*`^>R$z΂V s)bpΦ=xc \f4hHc``9zQ۞d?%sgj5Y@ 59gް$CCPlMUD>^g] ~fqM1\&A퀸<8Ja }QFw-ߩ*F0%MEgYSV vS hYgoU >AIޏ\faG}hf(S)y^Χo?GǏ>-Q.v79ʯ3y>_o~~<=f5qڗ_|K]_H .ֶ,;ƘsS]e.ؐhA<RH$$ԩ @,a CxC+neaR ߪu{9<1:` aWpo}uoךk1x ?./_y W~oo ?j>.>+ MV!r~t]j⻗ʄ4ںOܹHs).̚R8P#@C rEW{k8a[ns(HUąxʎj`,LnӁ,eCC W3df6VZ3@}ؖrڳqV˝ˣQ3US1\&nt` &cs׃~ˤFKh?sڿβLjLF,фjK"^Em1ge?!OZ X CNrm/ Lq'Xf~|ZqAq.k`xͱ;uA ,t#}E2홹֐LcM4Fc 0Ub Mtj.Gh 5\=1Nc<ۑ}FezFRO|.Gl~Z୷^W_Η3? _K0>) gAo|G/|ۀ?P?ҿ_[~[K<%Mi~VxW؋5JvLBHmuT&YJEs*Aʋ){[ePD@Sb* DDZ뮍1dV|by6X+ 󡃚f;ESR29܋┐39h:z++8onkz0g˷֊ICr.N3:CkM Fn<6. !C]";1iPtF, <<9л:Bbݜ/w4臑qM tDaXsbG`L)6CʮKcGBs#2a`xx.>QusnLoLq`Sxdݴy9M`ϫ|>wOaDcph_>0z D#tӴoA&g(% SeMFU jS^J2õ(iΞeB~ñ43u(wSt5TFAik 7y M&livD<Њqz" 61F٭s@ J)С5!FE_@=2[7C.}Hi wNN{G{ت؄J')b\&ΝL\ +-2ard[#cbםlxFOm8do&d e2jCZ۰aWә#*jSj5e Eqqad)y*6! $Fͣ1t(u&n5v &nSI}כ}6=!BÀDA SNqnuYɝEPwP{u%{WV'{"aDDï-rN {͚A` 7!j*Y^ ihbgA?䵐,4zP )'7&ܐVsUu]~xv<#DF#Ig8(KOٵ!C!v![pe!Mw :A&b'[ 52Ԫ72zEf1DSizD4Q[UeR "%c( pP_GL ч|k=c?ssK/__o&?zEW_ңG_~_=pO˿x GzV=/Mп^Zr[kNv }nʚ'zyD+_;/\A9l.g!Z8W劘 BJrq |JGTHT*JԌ(5 q1@"89_J.C` Q@nkdA*8űoT C} 7@l:2t64MFJn_l%'ڍTgi ma^fTm&]j_@SGіR)@h[G4VL§g I*TAC(KZӰYcRi'+0(q^  i9Ìyԫh+8F<4׈jc4qVy١K¨l^ =[>bVX=σu81O6DXO7%fđ}Z /@>Q+btVb1t A e5j2OX 쭺!Սf"YՊZWmú -x!y!6E^ fF[<φ*loY3'Ŵ;o!u8h\IbPt52kkf,Wp6J9m*K{~1EtD3ÉqX .ԨNAj edLmaQEDDg֔۰0ufG4͋}rÄ:^Ya|X`dR\9%)z6MrC8s$; wN썲Dq>[Eڛ6#2uiP Y6*qcfd@%[5( zQ|?p'UM:{E>kɢQŜG3%8ghCfk 9yM jOĉG$AKT]:ɍq<1BzOص0CG vp=dLgSBӊa N m۔w[t݆m;:rMfI፲eLsu1`F≠-cV`ʈX/b (yϰMv59Oاxa u!0"V9AoS= j.`CR)ѰV|@ R&@ 'VGյTp:=OTt<[ܩ.Msy?s%z|?OmuoGz[67%;t| t?O{/t}ToVyUGƯmn~H K.O$/_; wo8?|di$yN+Hwf[T]RJ9TfB*<_pS<I'p:p.cb ֞sEzWj"IsRj)11?6%w #1CFFfCo O U|S ꈺXv!ڑJ:3N>Mo?M $oF̐ DTQ#~#"5{Sw$e q^)vCw ~x3mp-k2}MLYKk &7hi FޡQd\2]Yuݰ%[ƕf?PGv-JAf hG"g(Bx8T̬&TL (j4Ҙ`JH`r3-pyJ.3E77'$ 4\\\ eVx!bZC-p5^kj_w@Mwq>N4}n+:Xbk5mxQhSp@0D6DCM/ s%`¸U{G )ޱNdsQJU30eY@dTI{S2ֱ"gkCvM>L1i{#K8Glm0ܸ0뉁ZuiR0mXO77 %9Jv9;:my6Bx%j{.ۺxyŅ@d40UN7<lϱ,!C?P*9 Vg#xvuGsztjw;knAtgL6>4-#01֙-ޑwS%v7Vf%3۶5&{Wa2g M`3C(N4"*j[жhmoa6Lr\M8" ~鑓Q C#YJ{]ۮJ;Į*!tɈxھ]ɍ8TP2?OP)U[Oc{Ɖс;<ac(q۾/pyЃSXeH>|%mꢾ#Ϳs9zrX $}dȐk@7c_1 Ѻ8'6k "N2kB9D`j̜03)Nv saMI! V69f&9;W:)?|ji{{G{& ᆱQ=z$o2}]w'_g_eQxǛ7iGkwq>э|M~Sah/]~OMӫ8ôIzgJ|(i)a:5#DWwi.(/W4"H@Swty Mmz& tH+IyD?E| ՜j!v@lPaq8*<۶:`zqPsbcK{KF4Mڞϕ]\Zdl愥S+0O4Yt:S\PvKj%'$&1(~ᾨѨf h`xϘ0LZϫ5o)Dfj'h|XDĎiw)4h3ZΗ?n8Vq-r@k^DL P)!(Cа wCwLaآ!,;;_H P4C8iLӄ͍7jC7_t׳5~̗ nNjc%#g*ijUU:i*Ggӭӈh[O>~fh7q8,!e[w^M<4gVGThvzG#tFϵa2/Cgv.ɇi3Jr)~&вy.DhEϥ7mϻaB@[Dٍǒ`6NOv p7odhDԣQqC$c"0JѴvk̬Ɛ[ Q ZC:AI.hjkH|n<71V3\jc/Ƶ iƢYi]|UvVNVuݴ s^ ޻|hlSaU7sa'Kİae,zgwCSc Lՠjo%,B(,^I0)S"≉ J9sJ&QbSG1Ct"QYϘrRdzm}?l{Xve8ى*Txfv?>}Z7\_qV}l;-'%o {kj]y]+ݻeriEnΟӔ S S4hc]Ϙfϳ}=_6jx !T%g;뒣IdW,~c DH]͝w^9sz־G '쮙y \FGäa7hŸqQWlT/ɟ0/YDOh,rFUp^NugZ/PwibUgs76-h 8NXy6aۏmF:im+Vwl1q09ݺձl z LpZewcdہA]2[5=g4Ή %nm`8TEU2lb=5+k׉;[cHZo*O,_{bYqwDnߕ@OE+ܽ7qZi:v%cz^YTWCzkt֒) _̜Yj~ՋãyjNzg>?3{9_Kyĥ|sY9<[|:}J{Ҡi(SLls(dbl/AǑC1gؑ5fݩ "ob6)|>03D,W`OOᅆ_JFȋS&ddRku\ [Q])5@;04f=#DQ[{QF{E4A m*n56oºkچlu'VtEumhzºv%\坊XdΘy &s5l˼tO-/IYfTq^WjFVi7PDuCm R;ffKBM6ϳSht)=1i8I$PS1jzJ ~!\w ! zD: 5g56[}0dԞӍCK#ܶ4tm&X yF#|WbBұՓtP'2Ol`ik 鄋şU3K{Jl.8Dv}HmN+4Mqt4V4a:fֺb7ri]m&GNEoO`*Prv B?F9ͧrIé 35Git>L3.,P5egtN+ȎZg/ u`t)Dmo1`4M.m {s IDATQx{NBsDDnd,^i{e@ǺOc H98lƳEDXW*9ٶuQ_<=fP uPv*K ]QNBukRD`:&1@ 2BcRFݲ93>F@}v&bVINlM(]ha B[t?eD[/Y41)6vِ d`ٛ6C-&YkZmC6>t/8\ أ44+5Gnf̟dCw=LֈnUFv6EH69MD,DTbQy@DuU֧f4!ϧ~Ym{}\_xtq9 _ẘye _ |JP^x#ON0W&jSoc{bko򕯴o=z˽>6+;'^yr'O]NeFIGPTB(I*]r.Ӌ0:jz>V5]TTTE`$f *KW9)bZ]F2ٴiݳœan/ F1g& J)V,'bk5&[Nul6iM#B^pk QBb.10+opoOdWtׇm]w=S/ӺyA}m6AUobE݈(-"g{g@+F%]g}*4lwCߜ?PsJ8N09Ū:(->eN(SzP^Xd~Ѧ6ofNbp C >\d_qdѨ9&HfG'yQEWk87[SvӠٷȞx1YѤ#=a@GS9($cfo[3h4J4!Kn5pͨt:a pmx ʵՇc3궢:RVMs 3VT7wC :o(s"$aVfE"!q`8 8%{@#@cFĭ8&uP=c! ל,܄D0 kφE f/ GlMP.*ɑCGgsq 3о7dE~ 6 LyLjA{|;k@Ai6|M13rڃhq,՝akOwi_}X#*&(bo ^㼲"qƎ#~mKh d uŠ{ז x~fcuT.SJ914%&@[kk@DDD*UI~lP4Qe7 =="ק>Ͷސ6]<{~[o=|^7Җ~/WޤG J~O+{oo!ߟ_~g~f~}VVʟϾbZK1_\S)T KK(tPV{U.4K2,Wa~:|ړ'LI¶mkFtO92ŭzh]LєVݠ%:%sh 2}e!Gd.S]1i24͎0A,0)!v z_N+;װ0"ܞ?\W5M͘ڭ3^az`A%2>D`N<] 6#>M{1MKּ+t8,ڑFA(,ف<ġh39gf`54 #x_n\Hq)6$- ؀#;d?G7Y"yd?Mp@-a*&#KFrg<H1D"o(@ e4'4=u+$LϞ=3hFg@Xuax34VxE)Y}R é{(8gk Lwqi^ M *˧0Δ!qf"UShIţwn{g7FGszn 6|0 Q_ rG3X(g,Vrr QW1[U{ 3L&1aGs<1 34ڃl&vs% қz)jnR9)*%(QLSN)DJF62gSڶ)MݮO~ ox0SͿ?͛7_||z{r?Hǘ w^-^<>E;ǧO;ؔKW3Wg^<+|/Sx_}0ee"D34]?\;&|Xjwzokݶm*}e%1b>hV4!DI|)Xy`iHQ~"Vj 5pNC+`Rӫ{ZLrmI4Ŧ٦4۶%&FWGDydźd$;(TL#6,{"s7 51 d K\`L˂yQ3e,Xff O > %ɴ1=К&jHұaBs7cD{4@ҍJU )([;3Li&;6Q[rX#%()AuP26i] 2,<ޞ[qSp;G)?WtQt1fkه:3nV G=xNQ=1iTߌlF_Ngdkg6{3vmRw  ;T?7ߟyWq!i}o>}2c.3;՜V90tA\uCrԜ&6%LX%qY+* "U$0ޡ]D"Դ7MiyI9-5U"$n>$׬&-bҠ_ѹ(tg)hXƛG3,Sө\5* YbT~H0g=8Vt!Ah#SHuZP8%9ѷ>䂂QC_emZW^7 U ddu] 8&+fx@nF,۠DtנWWS>!/~l~`8u5 3J2.g &>&\9iBby(2ULUd:An]#a('C./P(e6$k[4m04Ada\n2h@E6KdQ;fEq]vO'r6Ur2JHJQ҄p4OrqߌѺD#tгőoNvz]Nb-4f+6Sy[5`ItcףּEi^eς9nU[) c !y nf`)2.@J7aWA y3Tލz9]+Q'$l!D=L3JX3wѴyc N3yPm aF'5m^ֺLrIsyu[͉xDx~ZÖ47Jq^lq~mzq]W{pכR 4Q1=ޙ1Yf.!c1V1w0qDVzLPW}U[? x:jZҞoeṎnչx_k`Ma%h>5ьIҨRIcVذA5?FMGͷP{w0 Yq>ck П`J`GNϟfy꺚iT}b, vY\;Ihӭ&."rn #2,?w5 {al8:D]];OyD5@s.PZ]kBţ9D hUɜYT4uN QM?MA DZ>IHp#֚Դ̥;{/?>x1߽W>?k}xj!^6}tOiD~qy{Ws`UxM_~^g_r˫4J=S( %VS/@3 :IpxLMnz>] t}66ɌHZ(4Q%{jwAL۾Yh:ÒęhȧyWR.Snתa6fy߻)cm NdDuaqx.D1rbMUE1uCω bw\sS ӧYQ[S2it8 bZLͥ$BuuP vDn`PpG4z]0 lbC AI@-mG1f?pޝ淶"`0Afף t#{="pO1!"Yn@Vik0;z͔1M2A`v^dTRfYsa[r- m͊]b.'7ձ03s`xغG0r"ѻk0z;upP:>q(PgLӂp0r@f.1R*ȥ`f|0pA82 wTׇFayYquuh`LfذIaŨ{W Dܔ<.1\H dMTӛS[5 &hU" B׏K@I5*lJ&w̰: r<4h5¸V6P rԵh a>0;晃W>@PH\ 1.bZ24"ǐ- @ WC?u~Zir8q>`y"`fi<j҄2M98*;cċ4֟%oj}0]QźUsݴQcw(ݵJESgS(M71@Q6ʧBw&2/] OFy E"L.`2M~OX9+X'B d0֌d? gfʵǎ[e jloB h * [`>ٍ0ss$G6}"0%i̅rk{ Tq:ebrgs Z53ɖX 9C ևYy U>qk:rJQs?F}I9Z8+q2re=梢w(A+'NIMTN":TDd*Uz]Megz w>+W?~rcm}㕫UWο+^gʧoF_~~AҿK9šA؟OMWӵ>!SVkjm3ȦĤMm8K#ܹnust@VbH2Rm[Gq"B q*<9.];Ta&Ѡun`F!73*99\|mhxkEYVE?ICbJ.ƪl0w4Qp60O(HdFuj5;:nv© 9\Jx/\ivu^ ajSÜJ#އP#-"GzFR|cY&5N ѣݤv̇bH]LAR2z82T8K {9cX.CLo[<дT#4'h &@F.)Hr hpWϨ>ó`7Yk.m}[Xi.O%9zfϞkh@ß`פnqy4Sa|uRAP->!!s< td:.%TS٥'ZvQg:9gHlNMؙS5V{q4FzR{F&' !lkJ>&\g> ^5;ٶZ#?( @U 9"f;3'NH4[ZUSI IDATXmo%M6NED઄Τn3ffi֎z^ᅩEкؤmcK/\_~YO>o~k/}~ylx]7gWZmC{FX3׏~[geHUD+Op_DEP{ۨc}< T0?ܛ]7kQ=V할Y^(Pe\XrAj<. & M@hnDJFk XDT28VZI\4xXȢ17ʊ5 9%4j3 C='N\T 5ҍ}%tTUB8uE v Zwr},,R-9P7dW4u>7TՎVԭ"@:?]-2'MrN!t'j9CޟFs<+)m>%f;Pu340+> ;p[똦.n}b>v +ZLvavrXkC=LI03nN78Hj4O~ߪSc`C nIn׀ |1^x* 02 +k0P^и숳1'429PžMnVjot|sb |`RBW("p{#~j&!qr (Cbfن3OX 77CR*[F ?c.V|G) }DE䍙 UqzUqVqlDn+!j,MyuŲ̶gsTAm՘%[mdt r@]qfyuCr,ލMSzהRlIS*PM_A7&V6SvNg01V@3Chk]HIu}|7?{m}7ΥՏ_>_ߟ~+_0枿SJc.s^Ƨ."OO]P${_۶>7Ɯs9*N%* qLp tDi@ Т4 _-{q+|D 'q?HT=9gǠcS I9尥[޹g֚s1~_*nwk=|hfޜ۩he1娕NoztkNn Hv@F2@t6Ts"VL2R& wE Sq/f?8EavYNa;tdSCbZ6[}S@N='I˙ںksZ&j5Ees2ȸi-\E>A3{,{=FoH%)Y]tlzg}݇E{ 1G41 AٛOh}[u9LOǚb2ȧFuNeQR2ZZGwiC:,뺒(ܶ: =_8fXaPwdد(IqK<0s{:n4@aSb ?{X{G1̩0Nrms>A5q|+H (kAY 8ZjÐB(U)w(@p%",@[cppssQV$, H²$-!@f B$.%e<%ź@0AUgAYʂ{ LawN0Z Yp%y(`ljubbasopJVɚhR{ R[Y7Hٺj= "f@3f!tk)":#Z5!slLjX6"ܿ`]=@,;-ԆQso|FIc.f8H&Z]MN ¥3h Zqyu~ݚӖy݊nE$*;ϟ\Zn\R=vYT@+'J'`4`ez\0?%({ +b([rb 8yqoC$0Nyk<<$v7e6ՑRDDfd{ب3doF%9ݡw`G=]ܔqГ'،Y`dsQ>Kk0_~A΁(cĽc?{9ț8~_oD|cEk{̓S<kU\W{MrFhͽ}']}0WIsWiqV0F&]T8BM>p*."D 1P{Pf7k^Ǘ7a<|_׀/|K|+_?P/~lEW.oRG}sW/_};]/xѰr㴕It73vRCܷ\o$YO78he/Fc A X)ߨ[UfV &IĂ˗8uZu.l^t NCMImGOhXܔ`Dh~":5ZgNTS%dzx4Pngl3 ݄UJf*,!)atYN.D9v}8.<`4N!!&{9ErlF)fb`@NjS .f̭FQr&߉SP:~"Q5p(rX lH^hOamFjG\x/B&)12WMOQ8Ew\"XB 3rYp\Pe1B;r%Qz"̝lAݧ!:$FC§Ӷh%O6˺zcFI,rv6Q_Ng9M/ͼy]Q |HQm%Rц7<[X2N}:UZVQ"Q`~Ւ0Q10Pp}09BtYP@tA'Za5Bjpk8fj@{D7QRKm"mn6q!}pZibN]O>,ud]:p$\#:/7!85 "Z'z(cffB5x Ͷu$h6OuHg'qi} mkU/;ueasnCiYs3EYX˗3B)):g4͘fZ!F0f#Pʆê;Mwϩ@jB֌1P>3t9ް/14ɋân*7/8MrZk4l-] pO-pp\.AMB Fa(]c\cRJ0O;PTua3RH%1s$DU\MtT)Ј-ɤIRzb)>Xd0D~ [fM#QG<bhUV~O1$\Sby^/ `k"bwt Rbp?k;] MV k8:%*l R`+~z4(M4eI*)zJ5f>AU%SP&`aW1 1HZhov$)'&#KA;oJo?;/Hᾣ=or3G5>@ᅢ[?W`\mۿ~'t?zr~3]H)?;[|ݎǖΗYny[SNݝlrYV@ݳϬq/$Z$5Ti$ͅVЭ5B]܅:v,e3ف*n\1)̀LˆvK=mYpszŶ1o..炲.3h{,8BwiA/ha{,]}k\)Eބ_.&4]= zY6餁 rn93Ɓ"i6۶"24KY9 P9y,7HtI%6Z6J%hDhfX7E6̞H0h>&H%Q_:b⸎Eqq?p\V[ Άzf)=7XFTgOī6tm]g6D~y?|H R s y:yh-,#P7J!Jr.BsRՄ0Uۄ?A= $͹7JvAPP _PHcb_ dG@ y̮: 6$r9fRj2ҁ3lgO "b:Z9pCu%3Xg:ܧu:hbd*BSx{ =FF.%h|n^3˺b[NuZǜ@0<+k&`6ծ mY%JL:nA:#h@H1HψBQΰhʥdK3Rfc<b] }blb@EDd.c}7%-7c/Usҽ>\Zq6{sOgZDvy/XO?cY<jҋϤno>z@ԟ/n(*_+SJlgtg~tW|wkyvy}zWNv }d?ݻrʳwi͐כri{ާ3F㇤iLsz6Ѵ&IgF&jJItJ.˴LRYTvG 6`Ԡ nU|j\KzLA=ޔugō2XԄB ARr-1Oav=؀d16[=r0Ϣ:DǓPh?qSc=e2%>h_utk81 lVeQ={ T`]h)%Z1Wʧv`N"L\=0@H q;)"dƆ|¨jc}jaËTHlhjwq^kfNT)#t~wG%8ƌTul41d"ȓ{'z/&CS[ 1ڇQ5sã9s Xz|=쯿{^O΋~<7]~>o۶}[ a?$77cþ/|u}5}nپq♢#wo=eHbR7d=,[}[-.?vzOP G߫1z)1Y$-aIIVY * 9Ք;QU ?8&ɧ$Rd2e/}Kw]وF+׆AF2/^ eEz:|H76HNot&?4+ (v3xsm# V{R3JFֺXB'V#d6,ˆm['2hX7D6o)K)sϗPTI wcg8I~P'H)Ѽ8 @0@u6AA[%"4H!_ŶöYD3ѽ gCUm6G~+rt= &cq6ќK̔r̠#F#:VsY~ c6}ADV >u㮃j-UBY6Ĉ#HJj~N{%{/*t*W\D]PfTIs,\G[Hi7,W$d<""i'CDLs^#9M.)孬;=`=|#bc\TRNw[ V8c^ܽxUo7 =[Ν,v{W㛗?N1pGF IDAT})U~_/}KЀa_4~hA9lg?gG~zrgZ}wS๝nʳaNެ۟ƒoDҚwd{G~^s vܿyP]`P*VUt*d2TUSI;/rҲ t>v,F̃M}4#,>hD`Z9(͂,4u#9e&N=Rj)#t邸$gB k X^yD d),!Z 7{' HitoJ6%glF+R6>Q<%'E.* ѫcq>Ht/@r)>AC'ѩdFEw +-}0i(NJsi[ګéäM;jdT/rdG ](캮 ~Tt:IR . ԦFk;g,OxDRd0"F-[mk{XEs-e}PX[ Bsk&f 58dEo 0P/T,O`:;셠 ?KSADu6!pLQr"JSP&l[zPwԦ0^ְ.}0K, SYitٕFkCwM׈= g]2Z?P+u,1M)T36c Dk;1TNkk]cL|,%Zϓg] юZ ] ZihiZ+Zֱ8p;P}8;Cnym)#"݃[*_h$cs5 u]Ze`Vj;|h8G,˂ă'~}6ᑑsp3HvY?rAKfy1##%A4*K(QjL#CfGNW붅M8Rݽ)6%7*|8wjp(2˺B&>Nacvwj..‡1@ov1J\WvX\yEC15<ͣ>wx%MrDe5sh6>KFnƞjgU׵qd螸nbd4HJ0\+Q7F5M Åy ZoN98RS\Ib86ыDF[Du:,,Hh_f3 msci;y'}ȇoËځ6);]傫#B3adkWLܛpu ^09U?vIf@ P tFIvFuTąDWyfG2bF} p s Mqt\Hq5<w{{Y r8c6nG5kA/nkU]=ip4@Z R.-f1XP eΑu2wFsݰA@kyZYC蓘4Hׁ1@&Ppi"n 3\lhPֲX@]n%p>4EG]2@Ȇ&QdAd&w0ԚqN$c&J9HH)rS9!kAL. \;LR78*<rvXǰk0N7XBWM'Cćq:k2sLu<9%,v,yRo-xl!|~We_<9\Ȏ@dqPl<c"s]۵k>$\_{ `&1'1c~;TǛc+\;c)&q-_ȥY_:"12= Qk5yH^E-D>20gsc@PJPƟ"⽝ I ?ߟ#]p>\J5;[dw=``4$\Cܐ!da6ڤmwmV$Ȯ?')teYB)ɔknNSqXy1ʒ!("24!aj1&DEE)|ʹl4MIJ^ 0%eo=9o7֋β\& Xn^nn>e\~W/,ҝ];b$P52uK Rʳ٣07n׮N.xkil)^QLPj\cI7vI>7ؤ?<഻8ՓSC0MZ 鋆zAȜY8V.+ʲ@ݤ uohNu;Qo{>.SA w8cYXxnPNuSǾsT f)Y-mAumAVFpld{-(|'K%|oW&,5Hs & j] h>悩jF.i3嘌)u~aHpN丶:A ,wyP#f~=ʉ%IیP B}ٔT&:j*P9h\*6Qs6Ka2@H#M9c"+pճejF0twk2Lo7S)x<^uEz:#[R|;%SwJ 4{ #($UI=LO4M*nXmX6Ƚ޼6LbPk 9c{5q(1h , :OZPץqssXI/$2F psq>3nNQE%#Pu ZjyX׍D9>mtl4I\fgi0 G|MA1}0"I&R_{2cՃ͇|<@8gxЭpECJ]6(Iن nԕQ^Zc7AV wH41IڛT hn]CK)3sќV16G`39̄Q~SR:U$A&qQ"cgNQlxA23kqqG &{n*5U!Sd (*ޛ55`QrǯGؑbT ?gFZdg8R[g` Nlo,^"zBJjJC ÅYu%y\S$ B2hhNp$q$ O }p`|M#H|>.#:ϑS iue(:b8 fo&`Q.i0w9/8 5u^j"xߏ BjRàB;+goW$i^}G8;Ë20Y,hLp'i2z#sjr!6R큐ۼL9V"Xӿ= ~}G :M9?؝&i IYJu"l B OP[/!0NFNgq|ytuccfL LΘ8ǡH0QYom5&@WzhCo !y61@d mB.1" ;FN7qO[gWDLsAiԛka.q Y ݇$a~u`)X-鵉Mj@0;IvT_ea1X/lp;>5/|!Sc?s՟y^?t 'R>r__}ÇV_l+qdQmrR*eY?K߽(ypl1rJݔҝܪ`Ӕ a&JHTq~IL9]T ;=##5Bۘ:p^& ' Qbe%kVWi{ER6֯.cb[ s󚄲p\7&%jzAIE:FM@Y9N=JDa`cN怑t1c8EK8nx6 {6"Mw ־_pZO(K İrWB{4Z`80IPMgN 9c/4Vsf@0 R\0A 5d ]Q*"ȼx#z#HhΤ R&DOYz`tkbf[6N DM u5\}"nKY<>dA. ʲ`[O(eE)ẖqmWzaZ3;3aιcR\# es~ 3b 0ç6YuE6Uؼ8mDل!()$>I&H2#bb༽cY.tfã16:6#Pb_21Iixx8,ضV^ u;ыaGA'i^}qIDHnK9a(QWc"]k&+]ggմ';]~/ 11pq>8qd[Gڂ%> %y6 xK1ZRU@)ABvw];׺{C&>LM\ȩ77Qt9\Bck1Z>1)nJAd7GgUY\rȡ0y[s8!Bwwo@ Nre)!y5ݤu?H4S3D◅ٽ"i:;-~Yčx(̘7\ "0Rzgߊ9\9.4Qpn}\Fo/h}a}G39q|U ܫp}q6`{=??d)Kk}^e?*C?_RcYK3)u:/Ǜs/_.}o>d~{Sܬ^?d ˋ}x C}vs~\q_)KQ4󑷛ܾ'[>|󟩵5@8z y*ϭEl"hf(3| ]34գrz<ՠUj>lf6蘶b^MNhKLzuE=.60j͍!HoZEQJpJ:u Ta:sCs  vgt^@^p͝j"6'P/BptomRaNm6:Eq5 +m5uvx^G~:Ǡj 1r˾OǎکcZuRmrNaw6* QMQ3Lbf=eEW)τ1|qJOg_,JZv/"z7`@򼤒y^ W͉ppOKN׎,L9- %-NqY/gGEJCa]OX)/0M[T.J9!fpf4l 0}82[tn"-7RQћ#R8Oн1 ̸͏T}ZKfJCBWfG:7XQ!EIyNIq9vwgJtt:!Q6W'tW6&oz'FVbwD:'kCq2ݏC64a[W 6M;ۻ;N71f\cmYs36%LjK8dLS7́ eC6)mD7EZ*~p3(GJ!kC}S̐ m[ ڱtD A b8bїIt3ܼ#E. h 63X #8u R0e2y3]X f>b82<1<`3$d3`9 ظX*LMKUNΥ).|Hqݑ=H2H{Oc}k;,R\{7ܵBCDr.0]#_6ޤ<[sS]m@RBY>ݢW ȸ0H'ޱ\*r͠=&vXYڱחb~ ;wvajo>?yKMJZwjfOۊ@lkW~?>1sj35slxjz:3?oxsw$쭕HSZ$gxG[i}R[btgGZ?IEՠ..dfZ)ц y>7NK$=(t> L1 Dju ^ YI.uw9T`H-#'G~Y kxZ؏}bèWi&9.e(Ri C 0?QcNf!>YL),׷,tu-N;D00`kN˳8@h_#2UIe]`m  IDATEcҰEgau:O15w[C8ϑ1I03TK(@讖R@P0o/)9uVgaSFn"C,9yCQ 5~w63ܧvߣk;"./, ģ0ڤFC,+m%ʹ,X eݰm|?IHtjN )%tu3ruu>:$?c? I<:7*`Q0\0>Q #4q yae4fFx_ǠtlSsDH3"KȈ&[;Ҧ ۶"C%a|~DlVP CO"Ց#?m]R]0Cc[/-45^o/*H {AL&/n,vҬC#ZriՉLZ_j@DEHkc@N"%9O,7 sě8*LwZwhY SLpd ȓ},4ԡd4#?x?{afgXV>Ylz'VEۥ.O/PՇh]>1zWׇ!7g?U!|V_o|s6>:>9718Z*/Wx_;뇦!?=_zvqn[cw_g՟7eh{az{*?=/o|w{>rK[[ q޳Q1Qal8A@ވiMh8nEa#I>}  ,IQ[å^Tw;ڠVM_raPNRf3(Yĩe41 ]:0FsݦZu?59z\ێZگË^&׃ȖIU%] PB鐎ݳly~C3h$xCO.w+(= 9tй,>q5 =_h8,e(:ZK¾8g4l@dtD4C F}?lwkpxpZzgx{b6Զn(ˆ.tzuA^6hrj^zӶyNbY hmh*iНLJ$Asaي#,tR"=*E8@z]cEI e],̯JK%(2Ea{L{h3$ke[P%T Z? :`N_gy#6_HDP;b\ ƿ8/- F(eY\Gɀ \A\@ԋIr dXRHI,ˊ|)lhl cr.0k(˂{=po>Mahs@-~NkJhRp͇[1:d DG4`Xw#߽uH"W*nJ7e'E1'dm UIe6^Đ6氁`ؐ:fCק+iw\ÛՔ2̑8pZ}콑1dt$)zӪN[sF&o%rp]ijkz %9h2}gĺh}g{~R_nV.>U,=I8YD}19-4!6jiZi[GH9ݕN}lnj%1tf?x{WZ}8~M{_G/?uavu+3pܚ|9z~8z뭄]|/O0/N?5ŸLяO@{L?Wn-o}f?^y/2y*=L9e9;<׺xa0S3 [61%ta0&fs i [P/  8Fz3}NQ_  2({OSn0f^Ǧ O1O^6Q<Cv}#)i[X5`fg[R٥;f<39~mmvꓹa>lP ltjtls.&QD㑥h[If.4Su49%_1U&k"qNjWv82;EzAf<2/"kmXyMզ]9g@a`AO:q?11s<@aT0p߃Pmթ9''cfS(I-F7+]7+Z<3mq Ց\&9e&؟l) 4ń\)cw(Eet4UHtlh҂FdV{enT&RzV\mü,Cox4-KATU 0(Ol^l2 yS(y1 ̹`&͊m)s }7ǒ Gߨf#Ù4O1} yrqu(g\>}sهǔ^{Lan4sϿ>IԶ ^eiJq>5J#~o<<ޣ7{x=zM~hv*xiyyH{I $1yG/|ck/|?1g)P*y0M8r^؝ J<(=mu}J ¢,7&$)DA)RFCvbUkNcԺX6/G+xkl m EO혳n6*N;!&>z1T W>[s0hyGA"w/6Y4ف7)FUZPZ^ʌi.lEČCgHE4A['k"~t*4G4Jœz`ܡCw b$JeFkMvuu5@[PY)Y#SƳO=VSCߡ6QԔe 7v1<Qӄ3{<# )O(ӌDҮHQp S7@p\W DbA[0Rg3˲զeduo tZSQ&#%&8c[OZ2m-&-66m,(y@%TLr\ŮA }u7Ҙp4۳}rڟ-U;EdAk5!8E0iTm ~uNq=+f FsHPD0Q-3m339.3if!rDE'Ljuπvk~];%r_>jE \`lߥ9"F3cX\˻&Ld|fRԻZ6mŜ n gt Jk0Kl`cӪ[sNqn ^OsxJQKZ)u @=&P|J$"\JD)hIZ.z>>JoϤǽG%Ie>?oO=ߏBœGgiwky>;s^><H/`xy}q!ߔ7 w޽{zg{~5~ǖzyHn/7_8[yyz[֫pvi~V{t~J*:7h(sϧ9yɹK~]E^mZ{o*BR653Ed4!LVL(‚ʲml&^MSAvC9 v ;ei ]Dc)sM!}+\ҳI BX?76db7 UVP7iVA&g1͌X8<2DiPqSrr-Dl0)"3 =Eg M#6g4yLZPb4a5mCPbDs ihfl!UC} h ``1Y\Rf9Rmm0 3%8i!7q2wsJrZPeҍ&1914 NkuVMӄamN;)&cPHkX+Z`@i<f]P6]jM s1I`N'8 sܛ4e²;G.@SPe[dJΌ-5N* vG&IJ(k n@+{=K'L> JQLF\Fn2R"lCB ( ;β,Pi` ,7&ζbWѭru{GW{OE 5OVM#\g34C(xiBvDŌIANiMkj `hb_6<0 $l قtG J#Z[?[̦a z MúJD5Ude>Li4a.//p:XA kEZi0ÀVLzӔLUYmQAA \91t=G”yL>nTٳ&{Ĝkk@kg=g B^Μu8xv>4Ŭ4s5C bgΉlm.90/@m[r[M(NP>ouO{][^6p<YWNz8DF5gvb͢ lO GӔΦm(SAg\k7LF Bw0eΘfaXckGCH|ruFMK(ٽ$ ltf'lwB .ԙT3rJ6R^֟IoWEZ{^"ʩdNU 3)]Iop#-.7oi\)pTJyn<#%e7}>|t^n>aFVt훈ef43(1SEd 1WDGUݮX`|ZN!I%{ 5SlS,D5AO2\N):lA 9k}#'T@ t0t Ƕ5&T2<(?s (]EQ Sʃa4y ΚfQ 23!ZEFd$Z IDATd٦0ϻ1- 'IZ