pax_global_header00006660000000000000000000000064136260176330014521gustar00rootroot0000000000000052 comment=dd5be667285e47d13ab51251dfab8e2447c0c338 picard-release-2.3.1/000077500000000000000000000000001362601763300144045ustar00rootroot00000000000000picard-release-2.3.1/.codacy.yml000066400000000000000000000001411362601763300164430ustar00rootroot00000000000000exclude_paths: - 'picard/ui/ui_*.py' engines: coverage: exclude_paths: - 'test/**' picard-release-2.3.1/.gitattributes000066400000000000000000000000331362601763300172730ustar00rootroot00000000000000picard/resources.py binary picard-release-2.3.1/.github/000077500000000000000000000000001362601763300157445ustar00rootroot00000000000000picard-release-2.3.1/.github/FUNDING.yml000066400000000000000000000013511362601763300175610ustar00rootroot00000000000000# These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: ['https://metabrainz.org/donate'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] picard-release-2.3.1/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000031401362601763300215430ustar00rootroot00000000000000 # Summary * This is a… * [x] Bug fix * [ ] Feature addition * [ ] Refactoring * [ ] Minor / simple change (like a typo) * [ ] Other * **Describe this change in 1-2 sentences**: # Problem * JIRA ticket (_optional_): PICARD-XXX # Solution # Action picard-release-2.3.1/.github/workflows/000077500000000000000000000000001362601763300200015ustar00rootroot00000000000000picard-release-2.3.1/.github/workflows/package.yml000066400000000000000000000206341362601763300221240ustar00rootroot00000000000000name: Package and release on: push: paths: - '.github/workflows/package.yml' - 'installer/**' - 'picard/**' - 'po/**.po' - 'resources/win10/**' - 'scripts/package/*' - 'scripts/pyinstaller/*' - 'test/**' - 'appxmanifest.xml.in' - 'picard.icns' - 'picard.ico' - 'picard.spec' - 'requirements*.txt' - 'setup.py' - 'tagger.py.in' - 'win.version-info.txt.in' pull_request: jobs: package-macos: runs-on: macos-latest env: DISCID_VERSION: 0.6.2 FPCALC_VERSION: 1.4.4-9 PYTHON_VERSION: 3.7.6 MACOSX_DEPLOYMENT_TARGET: 10.12 steps: - uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch entire history, needed for setting the build number - run: git fetch --depth=1 origin +refs/tags/release-*:refs/tags/release-* - name: Cache libdiscid uses: actions/cache@v1 with: path: ~/libdiscid key: ${{ runner.os }}-libdiscid-${{ env.DISCID_VERSION }}-${{ env.MACOSX_DEPLOYMENT_TARGET }} - name: Setup macOS build environment run: | ./scripts/package/macos-setup.sh echo "::add-path::/Library/Frameworks/Python.framework/Versions/3.7/bin" RELEASE_TAG=$(git describe --match "release-*" --abbrev=0 --always HEAD) BUILD_NUMBER=$(git rev-list --count $RELEASE_TAG..HEAD) echo "::set-env name=BUILD_NUMBER::$BUILD_NUMBER" mkdir artifacts - name: Patch build version if: startsWith(github.ref, 'refs/tags/') != true run: | python3 setup.py patch_version --platform=$BUILD_NUMBER.$(git rev-parse --short HEAD) - name: Install dependencies run: | python3 -m pip install --upgrade pip setuptools wheel pip3 install -r requirements-build.txt pip3 install -r requirements-macos.txt - name: Run tests run: | python3 setup.py test - name: Build macOS app run: | ./scripts/package/macos-package-app.sh mv dist/*.dmg artifacts/ env: APPLE_ID_USER: ${{ secrets. APPLE_ID_USER }} APPLE_ID_PASSWORD: ${{ secrets. APPLE_ID_PASSWORD }} encrypted_be5fb2212036_key: ${{ secrets.CODESIGN_MACOS_ENCRYPTED_KEY }} encrypted_be5fb2212036_iv: ${{ secrets.CODESIGN_MACOS_ENCRYPTED_IV }} appledev_p12_password: ${{ secrets.CODESIGN_MACOS_P12_PASSWORD }} - name: Archive production artifacts uses: actions/upload-artifact@v1 with: name: macos-app path: artifacts/ package-windows: runs-on: windows-latest strategy: matrix: type: - store-app - signed-app - installer - portable fail-fast: false steps: - uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch entire history, needed for setting the build number - run: git fetch --depth=1 origin +refs/tags/release-*:refs/tags/release-* - name: Set up Python 3.7 uses: actions/setup-python@v1 with: python-version: 3.7 - name: Setup Windows build environment run: | & .\scripts\package\win-setup.ps1 -DiscidVersion $Env:DISCID_VERSION -FpcalVersion $Env:FPCALC_VERSION Write-Output "::add-path::C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64" $ReleaseTag = $(git describe --match "release-*" --abbrev=0 --always HEAD) $BuildNumber = $(git rev-list --count "$ReleaseTag..HEAD") Write-Output "::set-env name=BUILD_NUMBER::$BuildNumber" New-Item -Name .\artifacts -ItemType Directory env: DISCID_VERSION: 0.6.2 FPCALC_VERSION: 1.4.4-9 - name: Patch build version if: startsWith(github.ref, 'refs/tags/') != true run: | python setup.py patch_version --platform=$Env:BUILD_NUMBER.$(git rev-parse --short HEAD) - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements-build.txt pip install -r requirements-win.txt - name: Run tests run: python setup.py test - name: Prepare code signing certificate if: matrix.type != 'store-app' run: | If ($Env:CODESIGN_PFX_URL -And $Env:AWS_ACCESS_KEY_ID) { pip install awscli aws s3 cp "$Env:CODESIGN_PFX_URL" .\codesign.pfx Write-Output "::set-env name=CODESIGN::1" } Else { Write-Output "::warning::No code signing certificate available, skipping code signing." } env: AWS_DEFAULT_REGION: eu-central-1 AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} CODESIGN_PFX_URL: ${{ secrets.CODESIGN_PFX_URL }} - name: Build Windows 10 store app package if: matrix.type == 'store-app' run: | & .\scripts\package\win-package-appx.ps1 -BuildNumber $Env:BUILD_NUMBER Move-Item .\dist\*.msix .\artifacts env: PICARD_APPX_PUBLISHER: CN=0A9169B7-05A3-4ED9-8876-830F17846709 - name: Build Windows 10 signed app package if: matrix.type == 'signed-app' && env.CODESIGN == '1' run: | & .\scripts\package\win-package-appx.ps1 -BuildNumber $Env:BUILD_NUMBER -CertificateFile .\codesign.pfx -CertificatePassword $Env:CODESIGN_PFX_PASSWORD Move-Item .\dist\*.msix .\artifacts env: CODESIGN_PFX_PASSWORD: ${{ secrets.CODESIGN_PFX_PASSWORD }} - name: Build Windows installer if: matrix.type == 'installer' run: | # choco install nsis If ($Env:CODESIGN) { $CertPassword = ConvertTo-SecureString -String $Env:CODESIGN_PFX_PASSWORD -Force -AsPlainText $Certificate = Get-PfxCertificate -FilePath .\codesign.pfx -Password $CertPassword & .\scripts\package\win-package-installer.ps1 -BuildNumber $Env:BUILD_NUMBER -Certificate $Certificate } Else { & .\scripts\package\win-package-installer.ps1 -BuildNumber $Env:BUILD_NUMBER } Move-Item .\installer\*.exe .\artifacts dist\picard\fpcalc -version env: CODESIGN_PFX_PASSWORD: ${{ secrets.CODESIGN_PFX_PASSWORD }} - name: Build Windows portable app if: matrix.type == 'portable' run: | If ($Env:CODESIGN) { $CertPassword = ConvertTo-SecureString -String $Env:CODESIGN_PFX_PASSWORD -Force -AsPlainText $Certificate = Get-PfxCertificate -FilePath .\codesign.pfx -Password $CertPassword & .\scripts\package\win-package-portable.ps1 -BuildNumber $Env:BUILD_NUMBER -Certificate $Certificate } Else { & .\scripts\package\win-package-portable.ps1 -BuildNumber $Env:BUILD_NUMBER } Move-Item .\dist\*.exe .\artifacts env: CODESIGN_PFX_PASSWORD: ${{ secrets.CODESIGN_PFX_PASSWORD }} - name: Archive production artifacts uses: actions/upload-artifact@v1 if: matrix.type != 'signed-app' || env.CODESIGN == '1' with: name: windows-${{ matrix.type }} path: artifacts/ github-release: runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') needs: - package-macos - package-windows steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: python-version: 3.8 - uses: actions/download-artifact@v1 with: name: macos-app path: artifacts/ - uses: actions/download-artifact@v1 with: name: windows-signed-app path: artifacts/ - uses: actions/download-artifact@v1 with: name: windows-store-app path: artifacts/ - uses: actions/download-artifact@v1 with: name: windows-installer path: artifacts/ - uses: actions/download-artifact@v1 with: name: windows-portable path: artifacts/ - name: Generate checksums run: | cd artifacts sha256sum * > SHA256SUMS - name: Prepare changelog id: changelog continue-on-error: true run: | PICARD_VERSION=$(python -c "import picard; print(picard.__version__)") echo "::set-output name=version::"$PICARD_VERSION ./scripts/tools/changelog-for-version.py $PICARD_VERSION > changes-$PICARD_VERSION.txt - name: Create release uses: softprops/action-gh-release@v1 with: name: MusicBrainz Picard ${{ steps.changelog.outputs.version }} body_path: changes-${{ steps.changelog.outputs.version }}.txt files: artifacts/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} picard-release-2.3.1/.github/workflows/pypi-release.yml000066400000000000000000000014101362601763300231170ustar00rootroot00000000000000name: Publish to PyPI on: push: tags: - 'release-*' jobs: pypi-sdist: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: python-version: 3.8 - name: Install dependencies run: | python -m pip install --upgrade pip pip install --upgrade -r requirements.txt - name: Run tests run: | python setup.py test - name: Build Python source distribution run: | python setup.py clean sdist - name: Publish Python distribution to PyPI run: | pip install --upgrade twine twine upload --non-interactive dist/* env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_UPLOAD_TOKEN }} picard-release-2.3.1/.github/workflows/run-tests.yml000066400000000000000000000057321362601763300224770ustar00rootroot00000000000000name: Run tests on: [push, pull_request] jobs: test-latest: runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] python-version: [3.5, 3.6, 3.7, 3.8] env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Check coding style run: | pip install flake8 isort flake8 picard --count --show-source --statistics isort --check-only --diff --recursive picard test - name: Test with pytest if: always() run: | pip install pytest pytest-randomly pytest-cov pytest --verbose --cov=picard --cov-report xml:coverage.xml test - name: Submit code coverage to Codacy if: env.CODACY_PROJECT_TOKEN run: | pip install codacy-coverage python-codacy-coverage -r coverage.xml test-requirements: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] python-version: [3.7] dependencies: [ "PyQt5==5.13.2", "PyQt5==5.12.3", "PyQt5==5.11.3", "PyQt5==5.10.1 sip==4.19.8", "PyQt5==5.9.2 sip==4.19.8", "PyQt5==5.8.2 sip==4.19.8 mutagen==1.37" ] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install $DEPENDENCIES pip install -r requirements.txt env: DEPENDENCIES: ${{ matrix.dependencies }} - name: Test with pytest run: | pip install pytest pytest-randomly pytest-cov pytest --verbose test pip-install: # Test whether a clean pip install from source works runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] python-version: [3.8] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: Install gettext (Linux) if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install gettext - name: Install gettext (macOS) if: runner.os == 'macOS' run: | brew install gettext brew link gettext --force - name: Run pip install . run: | python -m pip install --upgrade pip pip install . - name: Test running installed package if: runner.os != 'Windows' run: picard --long-version picard-release-2.3.1/.gitignore000066400000000000000000000010141362601763300163700ustar00rootroot00000000000000# IDE config files .pydevproject .project .idea/ .vscode/ # OS generated files .DS_Store *:Zone.Identifier Thumbs.db Thumbs.db:encryptable # Files generated during build, test and deployment .coverage *.dll *.dylib *.exe *.pyc *.pyd *.so appxmanifest.xml build/ coverage.xml dist/ installer/picard-setup.nsi locale/ org.musicbrainz.Picard.appdata.xml picard.egg-info po/attributes/attributes.pot po/countries/countries.pot scripts/picard /tagger.py win-version-info.txt # Other files .*.sw[a-z] *~ appledev.p12 build.cfg picard-release-2.3.1/.isort.cfg000066400000000000000000000016341362601763300163070ustar00rootroot00000000000000# Configuration for isort tool # https://github.com/timothycrosley/isort # # Possible settings are listed at https://github.com/timothycrosley/isort/wiki/isort-Settings # # It can easily be installed using `pip install isort` # [settings] combine_as_imports=True default_section=LOCALFOLDER force_grid_wrap=True force_sort_within_sections=True include_trailing_comma=True indent=' ' known_picard=picard known_picard_ui=picard.ui known_qt=PyQt5 known_resources=picard.resources known_test=test.* known_third_party=mutagen multi_line_output=3 order_by_type=True sections=FUTURE,STDLIB,THIRDPARTY,QT,TEST,PICARD,LOCALFOLDER,RESOURCES,PICARD_UI skip_glob=**/ui_*.py skip=./tagger.py,picard/const/attributes.py,picard/const/countries.py,picard/resources.py,scripts/picard.in,picard/const/__init__.py,picard/formats/__init__.py,picard/coverart/providers/__init__.py not_skip=__init__.py use_parentheses=1 lines_after_imports=2 picard-release-2.3.1/.mailmap000066400000000000000000000005261362601763300160300ustar00rootroot00000000000000Frederik “Freso” S. Olesen Lukáš Lalinský Sambhav Kothari Sophist-UK Suhas Philipp Wolfer Philipp Laurent Monin picard-release-2.3.1/.prospector.yml000066400000000000000000000012461362601763300174100ustar00rootroot00000000000000# Configuration for prospector, mainly used by Codacy. pep8: # Please see comments in setup.cfg as to why we disable the below checks. disable: - E127 - E128 - E129 - E226 - E241 - E265 - E402 - E501 - W503 pyflakes: disable: # Undefined name. Ignore this since it otherwise detects the gettext # helpers (_, ngettext, N_) as undefined. There seems to be no clean way # to specify additional builtins for pyflakes with prospector. # We also test for this with flake8 in a saner way. - F821 # Ignore syntax errors as reported by PyFlages since on Codacy this does # not support Python 3 syntax. - F999 picard-release-2.3.1/.pylintrc000066400000000000000000000431361362601763300162600ustar00rootroot00000000000000[MASTER] # 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-whitelist= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns=ui_.*\.py # 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. 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 modules names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes # Specify a configuration file. #rcfile= # 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 [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. confidence= # 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 reenable 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=all # 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=consider-using-enumerate, format-combined-specification, return-in-init, catching-non-exception, bad-except-order, unexpected-special-method-signature, # Enforce list comprehensions # Newline at EOF raising-bad-type, raising-non-exception, format-needs-mapping, invalid-all-object, bad-super-call, nonexistent-operator, missing-kwoa, missing-format-argument-key, init-is-generator, access-member-before-definition, used-before-assignment, redundant-keyword-arg, assert-on-tuple, assignment-from-no-return, expression-not-assigned, misplaced-bare-raise, redefined-argument-from-local, not-in-loop, bad-exception-context, unidiomatic-typecheck, no-staticmethod-decorator, nonlocal-and-global, confusing-with-statement, global-variable-undefined, global-variable-not-assigned, inconsistent-mro, no-classmethod-decorator, nonlocal-without-binding, duplicate-bases, duplicate-argument-name, duplicate-key, useless-else-on-loop, arguments-differ, logging-too-many-args, too-few-format-args, bad-format-string-key, invalid-sequence-index, inherit-non-class, bad-format-string, invalid-format-index, invalid-star-assignment-target, no-method-argument, no-value-for-parameter, missing-format-attribute, logging-too-few-args, too-few-format-args, mixed-format-string, # Old style class logging-format-truncated, truncated-format-string, notimplemented-raised, # Builtin redefined function-redefined, reimported, repeated-keyword, lost-exception, return-outside-function, return-arg-in-generator, non-iterator-returned, method-hidden, too-many-star-expressions, trailing-whitespace, unexpected-keyword-arg, missing-format-string-key, unnecessary-lambda, unnecessary-pass, unreachable, logging-unsupported-format, bad-format-character, unused-import, exec-used, pointless-statement, pointless-string-statement, undefined-all-variable, misplaced-future, continue-in-finally, invalid-slots, invalid-slice-index, invalid-slots-object, star-needs-assignment-target, global-at-module-level, yield-outside-function, mixed-indentation, non-parent-init-called, bare-except, no-self-use, dangerous-default-value, arguments-differ, signature-differs, duplicate-except, abstract-class-instantiated, binary-op-exception, undefined-variable [REPORTS] # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=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=text # Tells whether to display a full report or only the messages. reports=no # Activate the evaluation score. score=yes [REFACTORING] # Maximum number of nested blocks for function / method body max-nested-blocks=5 # 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 [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=100 # Maximum number of lines in a module. max-module-lines=1000 # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma, dict-separator # 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 [SPELLING] # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package.. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [SIMILARITIES] # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no # Minimum lines number of a similarity. min-similarity-lines=4 [VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid defining new builtins when possible. additional-builtins=_, N_, ngettext, gettext_countries, gettext_attributes # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes # 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. Default to name # with leading underscore. 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 [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME, XXX, TODO [LOGGING] # Format style used to check logging format string. `old` means using % # formatting, while `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 [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- # 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. #attr-rgx= # Bad variable names which should always be refused, separated by a comma. bad-names=foo, bar, baz, toto, tutu, tata # Naming style matching correct class attribute names. class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- # attribute-naming-style. #class-attribute-rgx= # Naming style matching correct class names. class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-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. #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. #function-rgx= # Good variable names which should always be accepted, separated by a comma. good-names=i, j, k, ex, Run, _ # 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. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-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. #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 # Naming style matching correct variable names. variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- # naming-style. #variable-rgx= [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 missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # 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 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 # 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= # 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 [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__, __new__, setUp # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict, _fields, _replace, _source, _make # 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=cls [IMPORTS] # Allow wildcard imports from modules that define __all__. allow-wildcard-with-all=no # 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 # Deprecated modules which should not be used, separated by a comma. deprecated-modules=optparse,tkinter.tix # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled). ext-import-graph= # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled). import-graph= # Create a graph of internal dependencies in 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 [DESIGN] # 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. max-bool-expr=5 # 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=20 # 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 being caught. Defaults to # "Exception". overgeneral-exceptions=Exception picard-release-2.3.1/.tx/000077500000000000000000000000001362601763300151155ustar00rootroot00000000000000picard-release-2.3.1/.tx/config000066400000000000000000000010501362601763300163010ustar00rootroot00000000000000[main] host = https://www.transifex.com [musicbrainz.picard] file_filter = po/.po source_file = po/picard.pot source_lang = en type = PO [musicbrainz.picard_appstream] file_filter = po/appstream/.po source_file = po/appstream/picard-appstream.pot source_lang = en type = PO [musicbrainz.countries] file_filter = po/countries/.po source_file = po/countries/countries.pot source_lang = en type = PO [musicbrainz.attributes] file_filter = po/attributes/.po source_file = po/attributes/attributes.pot source_lang = en type = PO picard-release-2.3.1/AUTHORS.txt000066400000000000000000000006261362601763300162760ustar00rootroot00000000000000Lukáš Lalinský Robert Kaye Philipp Wolfer Sambhav Kothari Picard logo by , © 2015 MetaBrainz Foundation Picard v2.0 interface icons made by Sambhav Kothari and Madebyoliver, Pixel Buddha, Nikita Golubev, Maxim Basinski and Smashicons from www.flaticon.com picard-release-2.3.1/CODE_OF_CONDUCT.md000066400000000000000000000007201362601763300172020ustar00rootroot00000000000000MetaBrainz Code of Conduct =========================== This project follows the **[MetaBrainz Code of Conduct](https://metabrainz.org/code-of-conduct "Code of Conduct - MetaBrainz Foundation")**. The Code of Conduct applies to this and all other MetaBrainz-sponsored projects. The full MetaBrainz Code of Conduct is found here: https://metabrainz.org/code-of-conduct For questions about the Code of Conduct or to get help, please email support@metabrainz.org. picard-release-2.3.1/CONTRIBUTING.md000066400000000000000000000110641362601763300166370ustar00rootroot00000000000000# Contributing to Picard ## Coding Style As most of the other projects written in Python, we use the [PEP 8](https://www.python.org/dev/peps/pep-0008/). Though, we ignore some of the recommendations: * E501 - Maximum line length (79 characters). The general limit we have is somewhere around 120-130. *Recommended video: "[Beyond PEP 8 -- Best practices for beautiful intelligible code](https://www.youtube.com/watch?v=wf-BqAjZb8M)" by Raymond Hettinger at PyCon 2015, which talks about the famous P versus NP problem.* The general idea is to make the code within a project consistent and easy to interpret (for humans). Developers may install few extra tools using: ```bash pip install -r requirements-dev.txt ``` To fix or preserve imports style, one can use `isort -rc .` command (requires the [isort](https://github.com/timothycrosley/isort) tool, see `.isort.cfg`). It is recommended to add a pre-commit hook to check whether imports in changed code follow the conventions. Add a file `.git/hooks/pre-commit` with the following content and make it executable: ```bash #!/usr/bin/env bash PYFILES=$(git diff --cached --name-only | grep "\\.py$" | grep --invert-match \ -e "^tagger\\.py$" \ -e "^picard/resources\\.py$" \ -e "^picard/\(coverart/providers\|formats\)/__init__\\.py$" \ -e "^picard/const/\(__init__\|attributes\|countries\)\\.py$" \ -e "^picard/ui/ui_.*\\.py$" \ -e "^scripts/picard\\.in$") if [ ! -z "$PYFILES" ]; then set -e isort --check-only --diff --quiet $PYFILES flake8 $PYFILES fi ``` ### Docstrings Unless the function is easy to understand quickly, it should probably have a docstring describing what it does, how it does it, what the arguments are, and what the expected output is. We recommend using ["Google-style" docstrings](https://google.github.io/styleguide/pyguide.html?showone=Comments#38-comments-and-docstrings) for writing docstrings. ### Picard specific code Picard has some auto-generated `picard/ui/ui_*.py` PyQt UI related files. Please do not change them directly. To modify them, use Qt-Designer to edit the `ui/*.ui` and use the command `python setup.py build_ui` to generate the corresponding `ui_*.py` files. We use snake-case to name all functions and variables except for the pre-generated PyQt functions/variables. `gettext` and `gettext-noop` have been built-in the Picard code as `_` and `N_` respectively to provide support for internationalization/localization. You can use them without imports across all of Picard code. Make sure to mark all displayable strings for translation using `_` or `N_` as applicable. You can read more about python-gettext [here](https://docs.python.org/2/library/gettext.html). ## Git Work-flow We follow the "typical" GitHub workflow when contributing changes: 1. [Fork](https://help.github.com/articles/fork-a-repo/) a repository into your account. 2. Create a new branch and give it a meaningful name. For example, if you are going to fix issue PICARD-257, branch can be called `picard-257` or `preserve-artwork`. 3. Make your changes and commit them with a [good description](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). Your commit subject should be written in **imperative voice** and **sentence case**. With regards to the contents of the message itself, you don't need to provide a lot of details, but make sure that people who look at the commit history afterwards can understand what you were changing and why. 4. [Create](https://help.github.com/articles/creating-a-pull-request/) a new pull request on GitHub. Make sure that the title of your pull request is descriptive and consistent with the rest. If you are fixing issue that exists in our bug tracker reference it like this: `PICARD-257: Allow preserving existing cover-art tags`. **Not** `[PICARD-257] - Allow preserving existing cover-art tags` or `Allow preserving existing cover-art tags (PICARD-257)` or simply `PICARD-257`. 5. Make sure to provide a bug tracker link to the issue that your pull request solves in the description. 6. Do not make one big pull request with a lot of unrelated changes. If you are solving more than one issue, unless they are closely related, split them into multiple pull requests. It makes it easier to review and merge the patches this way. 7. Try to avoid un-necessary commits after code reviews by making use of [git rebase](https://help.github.com/articles/about-git-rebase/) to fix merge conflicts, remove unwanted commits, rewording and editing previous commits or squashing multiple small related changes into one commit. ### Translations See po/README.md for information about translations. picard-release-2.3.1/COPYING.txt000066400000000000000000000431051362601763300162600ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. picard-release-2.3.1/INSTALL.md000066400000000000000000000061751362601763300160450ustar00rootroot00000000000000MusicBrainz Picard Installation =============================== Dependencies ------------ Before installing Picard, you need to check you have following dependencies installed. Required: * [Python 3.5 or newer](http://python.org/download) * [PyQt 5.7.1 or newer](http://www.riverbankcomputing.co.uk/software/pyqt/download) * [Mutagen 1.37 or newer](https://bitbucket.org/lazka/mutagen/downloads) * gettext: * [Windows](https://mlocati.github.io/articles/gettext-iconv-windows.html) * a compiler * Windows should work with [Visual C++ 2008 Express](http://go.microsoft.com/?linkid=7729279) Optional but recommended: * [chromaprint](http://acoustid.org/chromaprint) * Required for fingerprinting (scanning) files * [python-discid](https://python-discid.readthedocs.org/) or [python-libdiscid](https://pypi.org/project/python-libdiscid/) * Required for CD lookups. * Depends on [libdiscid](http://musicbrainz.org/doc/libdiscid) Note: Due to slowdowns in reading the CD TOC, using libdiscid versions 0.3.0 - 0.4.1 is not recommended. We recommend you use [pip](https://pip.pypa.io/en/stable/) to install the Python dependencies: Run the following command to install PyQt5, Mutagen and discid: pip3 install -r requirements.txt The binaries for Python, GetText (`msgfmt`), `fpcalc` and `discid.dll` have to be in the `%PATH%` on Windows. Installation using pip ---------------------- The recommended way to install Picard from source is using pip. After installing the dependencies, you can install Picard as a pip package by running: pip3 install . To start Picard now you can use: picard To uninstall Picard run: pip3 uninstall picard Installation using setup.py --------------------------- You can also install Picard with `setup.py` by running: sudo python3 setup.py install This will automatically build and install all required Python modules. On Windows you need to have Administrator rights, but don't put `sudo` in front of the command. To start Picard now you can use: picard If you want to be able to easily uninstall Picard again, run `setup.py` with the `--record installed-files.txt` command line argument. This will record all files generated during installation into the file `installed-files.txt`. sudo python3 setup.py install --record installed-files.txt To uninstall Picard again simply remove all the files listed in `installed-files.txt`, e.g. by running: rm -vI $(cat installed-files.txt) Running From the Source Tree ---------------------------- If you want to run Picard from the source directory without installing, you need to build the C extensions and locales manually: python3 setup.py build python3 setup.py build_ext -i python3 setup.py build_locales -i And to start Picard use: python3 tagger.py Running the Test Suite ---------------------- To run the included tests, follow the instructions for "Running From the Source Tree". Afterward you can run the tests using setup.py: python3 setup.py test Packaging --------- Picard supports packaging binaries and uploading them to PyPi. To submit a package run: python3 setup.py sdist twine upload dist/* picard-release-2.3.1/MANIFEST.in000066400000000000000000000002531362601763300161420ustar00rootroot00000000000000graft po prune test recursive-include scripts *.in recursive-exclude scripts picard include *.in include *.md include *.txt exclude org.musicbrainz.Picard.appdata.xml picard-release-2.3.1/NEWS.md000066400000000000000000003421561362601763300155150ustar00rootroot00000000000000# Version 2.3.1 - 2020-02-27 ## Bug-fix - [PICARD-1745](https://tickets.metabrainz.org/browse/PICARD-1745) - Packaged libdiscid is not compatible with macOS 10.12 - [PICARD-1748](https://tickets.metabrainz.org/browse/PICARD-1748) - Many release events can cause the versions context menu to overflow - [PICARD-1750](https://tickets.metabrainz.org/browse/PICARD-1750) - Existing acoustid_fingerprint tags are not considered for AcoustID submission - [PICARD-1754](https://tickets.metabrainz.org/browse/PICARD-1754) - DEL always removes release or file from main window - [PICARD-1756](https://tickets.metabrainz.org/browse/PICARD-1756) - Plugin update fails to compare plugin versions with double digit versions - [PICARD-1757](https://tickets.metabrainz.org/browse/PICARD-1757) - Crash on loading a release if `$div(n,0)` is used in a script - [PICARD-1760](https://tickets.metabrainz.org/browse/PICARD-1760) - Prevent duplicates in top tags editor - [PICARD-1762](https://tickets.metabrainz.org/browse/PICARD-1762) - Dropping a PDF file on cover art image box doesn't work - [PICARD-1765](https://tickets.metabrainz.org/browse/PICARD-1765) - Adding uppercase tags to preserved tags list is not handled correctly - [PICARD-1772](https://tickets.metabrainz.org/browse/PICARD-1772) - Unexpected results with `$num` function - [PICARD-1773](https://tickets.metabrainz.org/browse/PICARD-1773) - Untrapped error on `$mod` with zero input - [PICARD-1774](https://tickets.metabrainz.org/browse/PICARD-1774) - `$lenmulti` with missing name returns "1" ## New Feature - [PICARD-1743](https://tickets.metabrainz.org/browse/PICARD-1743) - Add script functions `$sortmulti` and `$reversemulti` to sort and reverse multi-value variables - [PICARD-1751](https://tickets.metabrainz.org/browse/PICARD-1751) - Provide a `%_releasecountries%` variable ## Improvement - [PICARD-1746](https://tickets.metabrainz.org/browse/PICARD-1746) - Change Generate AcoustID Fingerprints shortcut to Ctrl+Shift+Y / ⌘⇧Y - [PICARD-1752](https://tickets.metabrainz.org/browse/PICARD-1752) - Use preferred release countries to select a matching release country if there are multiple - [PICARD-1755](https://tickets.metabrainz.org/browse/PICARD-1755) - "Supported Languages" on Microsoft Store shows only English (United States) - [PICARD-1759](https://tickets.metabrainz.org/browse/PICARD-1759) - Make editing tags in top tags list more intuitive - [PICARD-1771](https://tickets.metabrainz.org/browse/PICARD-1771) - Completely ignore release types set to zero in preferred releases # Version 2.3 - 2020-02-17 ## Bug-fix - [PICARD-1739](https://tickets.metabrainz.org/browse/PICARD-1739) - Update check does not handle alpha, beta and rc versions properly - [PICARD-1744](https://tickets.metabrainz.org/browse/PICARD-1744) - Invalid ignore path regex can crash Picard ## Improvement - [PICARD-1740](https://tickets.metabrainz.org/browse/PICARD-1740) - Save originalfilename to ASF tags # Version 2.3.0rc1 - 2020-02-11 ## Bug-fix - [PICARD-1688](https://tickets.metabrainz.org/browse/PICARD-1688) - "Submit AcoustIDs" fails with many tracks - [PICARD-1719](https://tickets.metabrainz.org/browse/PICARD-1719) - `$unset` marks tag for deletion - [PICARD-1724](https://tickets.metabrainz.org/browse/PICARD-1724) - Fingerprint status on left should not be submittable (red) - [PICARD-1725](https://tickets.metabrainz.org/browse/PICARD-1725) - Fingerprint indicator rendering artifacts - [PICARD-1726](https://tickets.metabrainz.org/browse/PICARD-1726) - Crash when closing options quickly before plugin list got loaded - [PICARD-1727](https://tickets.metabrainz.org/browse/PICARD-1727) - Performer tag in metadata list is not translated - [PICARD-1733](https://tickets.metabrainz.org/browse/PICARD-1733) - App does not start on macOS 10.12 - [PICARD-1736](https://tickets.metabrainz.org/browse/PICARD-1736) - "Generate AcoustID Fingerprints" is too long for the toolbar ## Improvement - [PICARD-1716](https://tickets.metabrainz.org/browse/PICARD-1716) - Add script functions for strings (`$find`, `$reverse`, `$substr`), multi-value variables (`$getmulti`), and loops (`$foreach`, `$while`, `$map`) - [PICARD-1717](https://tickets.metabrainz.org/browse/PICARD-1717) - Backup config file on update - [PICARD-1720](https://tickets.metabrainz.org/browse/PICARD-1720) - Add script function `$slice` to extract a portion of a multi-value variable - [PICARD-1721](https://tickets.metabrainz.org/browse/PICARD-1721) - Add script function `$join` to join the elements of a multi-value variable - [PICARD-1723](https://tickets.metabrainz.org/browse/PICARD-1723) - Match to album should consider the disc number - [PICARD-1729](https://tickets.metabrainz.org/browse/PICARD-1729) - Add scripting function `$datetime` to return the current date and time - [PICARD-1737](https://tickets.metabrainz.org/browse/PICARD-1737) - Add keyboard shortcut Ctrl+Alt+F for "Generate Fingerprints" - [PICARD-1738](https://tickets.metabrainz.org/browse/PICARD-1738) - Load a recording URL entered into the search field as standalone recording # Version 2.3.0b1 - 2020-01-30 ## Bug-fix - [PICARD-239](https://tickets.metabrainz.org/browse/PICARD-239) - Using tag "comment" should behave the same as "comment:" (with colon) in tagger script - [PICARD-965](https://tickets.metabrainz.org/browse/PICARD-965) - Items in tagger scripts list are squished - [PICARD-1054](https://tickets.metabrainz.org/browse/PICARD-1054) - Picard swallows values of Qt command line arguments - [PICARD-1218](https://tickets.metabrainz.org/browse/PICARD-1218) - Script names aren't truncated properly - [PICARD-1312](https://tickets.metabrainz.org/browse/PICARD-1312) - Hotkeys for buttons do not work on macOS - [PICARD-1565](https://tickets.metabrainz.org/browse/PICARD-1565) - Picard ignores results in Acoust ID web service response - [PICARD-1592](https://tickets.metabrainz.org/browse/PICARD-1592) - APEv2: Read tags case insensitive - [PICARD-1625](https://tickets.metabrainz.org/browse/PICARD-1625) - UI unresponsive while matching files to release - [PICARD-1626](https://tickets.metabrainz.org/browse/PICARD-1626) - Locales in Options > Metadata are not translated and not sorted - [PICARD-1629](https://tickets.metabrainz.org/browse/PICARD-1629) - Duration for AAC files with APEv2 tags is wrong - [PICARD-1658](https://tickets.metabrainz.org/browse/PICARD-1658) - macOS: System wide libdiscid is used instead of the bundled one - [PICARD-1662](https://tickets.metabrainz.org/browse/PICARD-1662) - Issue saving FLAC with large (~ 16 MiB) embedded images - [PICARD-1664](https://tickets.metabrainz.org/browse/PICARD-1664) - Cluster lookup does not use preferred release types - [PICARD-1667](https://tickets.metabrainz.org/browse/PICARD-1667) - Some scripting functions are always true - [PICARD-1668](https://tickets.metabrainz.org/browse/PICARD-1668) - Read fails if mp4 file has "disk" tag set but empty - [PICARD-1675](https://tickets.metabrainz.org/browse/PICARD-1675) - Allow disabling auto update for Windows builds - [PICARD-1678](https://tickets.metabrainz.org/browse/PICARD-1678) - Picard crashes if result from search server contains non-integer scores - [PICARD-1693](https://tickets.metabrainz.org/browse/PICARD-1693) - Position and size of log view and activity history are not preserved - [PICARD-1699](https://tickets.metabrainz.org/browse/PICARD-1699) - On scan asking the user to enable the fingerprinting does always abort the scan - [PICARD-1700](https://tickets.metabrainz.org/browse/PICARD-1700) - Crash with PyQt5 when opening cover art context menu - [PICARD-1709](https://tickets.metabrainz.org/browse/PICARD-1709) - Saving AIFF files can make them unreadable (requires mutagen >= 1.43) - [PICARD-1711](https://tickets.metabrainz.org/browse/PICARD-1711) - Cannot delete lyrics from ASF, ID3, MP4 and APE files ## New Feature - [PICARD-34](https://tickets.metabrainz.org/browse/PICARD-34) - Add a fingerprint indicator - [PICARD-118](https://tickets.metabrainz.org/browse/PICARD-118) - Windows: Provide a portable Picard version - [PICARD-125](https://tickets.metabrainz.org/browse/PICARD-125) - Support for AC3 - [PICARD-170](https://tickets.metabrainz.org/browse/PICARD-170) - Allow selecting displayed columns - [PICARD-714](https://tickets.metabrainz.org/browse/PICARD-714) - Allow user to reorder fields in the lower pane - [PICARD-991](https://tickets.metabrainz.org/browse/PICARD-991) - Allow calculating AcoustID fingerprints for matched recordings - [PICARD-1098](https://tickets.metabrainz.org/browse/PICARD-1098) - MP4: Support custom tags - [PICARD-1521](https://tickets.metabrainz.org/browse/PICARD-1521) - Make Picard recognize "TOFN (Original Filename)" ID3 tag - [PICARD-1656](https://tickets.metabrainz.org/browse/PICARD-1656) - Allow setting cover art for clusters - [PICARD-1673](https://tickets.metabrainz.org/browse/PICARD-1673) - Show progress in Windows taskbar - [PICARD-1674](https://tickets.metabrainz.org/browse/PICARD-1674) - Show progress in Linux docks / taskbar supporting the Unity.LauncherEntry DBus interface - [PICARD-1677](https://tickets.metabrainz.org/browse/PICARD-1677) - Option to ignore tags for file changed status - [PICARD-1684](https://tickets.metabrainz.org/browse/PICARD-1684) - Allow re-ordering multi-value tags ## Improvement - [PICARD-115](https://tickets.metabrainz.org/browse/PICARD-115) - Display 'YYYY', 'MM' and 'DD' in date input field when value not available - [PICARD-321](https://tickets.metabrainz.org/browse/PICARD-321) - Backslash support in filenames if Windows compatibility is disabled - [PICARD-1260](https://tickets.metabrainz.org/browse/PICARD-1260) - Sort entries in Clusters more "naturally" - [PICARD-1349](https://tickets.metabrainz.org/browse/PICARD-1349) - Change the sorting by clicking on a column title so that it switches through three states (sort ascending/descending/not at all) - [PICARD-1401](https://tickets.metabrainz.org/browse/PICARD-1401) - CD Lookup dialog does not make it clear how to submit a disc ID - [PICARD-1402](https://tickets.metabrainz.org/browse/PICARD-1402) - macOS: Register for supported file types to open with Finder or drag and drop on dock icon - [PICARD-1467](https://tickets.metabrainz.org/browse/PICARD-1467) - Provide signed Windows installer - [PICARD-1523](https://tickets.metabrainz.org/browse/PICARD-1523) - Make Picard case-agnostic for "Preserve tags from being cleared" - [PICARD-1589](https://tickets.metabrainz.org/browse/PICARD-1589) - Support language for ID3 COMM tags with `comment:{language}:{description}` syntax (enables support for MediaMonkey's Songs-DB_Custom tags) - [PICARD-1628](https://tickets.metabrainz.org/browse/PICARD-1628) - Make APEv2 tags with AAC optional - [PICARD-1631](https://tickets.metabrainz.org/browse/PICARD-1631) - Notarize macOS app - [PICARD-1646](https://tickets.metabrainz.org/browse/PICARD-1646) - Respect preferred release types when scanning tracks - [PICARD-1650](https://tickets.metabrainz.org/browse/PICARD-1650) - Select / load multiple items from search results - [PICARD-1652](https://tickets.metabrainz.org/browse/PICARD-1652) - Support extended info for TAK files (requires mutagen >= 1.43) - [PICARD-1659](https://tickets.metabrainz.org/browse/PICARD-1659) - Natural sorting for search results - [PICARD-1661](https://tickets.metabrainz.org/browse/PICARD-1661) - Improve preserved tags autocomplete - [PICARD-1665](https://tickets.metabrainz.org/browse/PICARD-1665) - Disable uninstall for globally installed plugins - [PICARD-1666](https://tickets.metabrainz.org/browse/PICARD-1666) - Consider video / audio when comparing files to tracks - [PICARD-1671](https://tickets.metabrainz.org/browse/PICARD-1671) - Rework Options > Tags page - [PICARD-1672](https://tickets.metabrainz.org/browse/PICARD-1672) - MP4: Use hdvd atom to detect videos (requires mutagen >= 1.43) - [PICARD-1680](https://tickets.metabrainz.org/browse/PICARD-1680) - Select / load multiple items from CD lookup results - [PICARD-1682](https://tickets.metabrainz.org/browse/PICARD-1682) - Multiline editing for lyrics and comments - [PICARD-1683](https://tickets.metabrainz.org/browse/PICARD-1683) - Autocompletion when editing media, releasetype, releasecountry and releasestatus tags - [PICARD-1686](https://tickets.metabrainz.org/browse/PICARD-1686) - Always keep [non-album tracks] entry on top - [PICARD-1692](https://tickets.metabrainz.org/browse/PICARD-1692) - Change sliders to jump to clicked position - [PICARD-1695](https://tickets.metabrainz.org/browse/PICARD-1695) - Make script editor UI consistent with other option pages - [PICARD-1712](https://tickets.metabrainz.org/browse/PICARD-1712) - Use Ctrl+D as keyboard shortcut to remove albums or files - [PICARD-1714](https://tickets.metabrainz.org/browse/PICARD-1714) - Focus search input with Ctrl+F - [PICARD-1715](https://tickets.metabrainz.org/browse/PICARD-1715) - Allow changing file extension by manipulating the %_extension% variable in renaming script ## Task - [PICARD-1406](https://tickets.metabrainz.org/browse/PICARD-1406) - Refactor Metadata.set and metadata.__setitem__ - [PICARD-1465](https://tickets.metabrainz.org/browse/PICARD-1465) - Add Picard to Windows Store - [PICARD-1596](https://tickets.metabrainz.org/browse/PICARD-1596) - Automate PyPI deployment - [PICARD-1653](https://tickets.metabrainz.org/browse/PICARD-1653) - macOS: Enable Hardened Runtime - [PICARD-1669](https://tickets.metabrainz.org/browse/PICARD-1669) - Build Windows 10 MSIX app package - [PICARD-1703](https://tickets.metabrainz.org/browse/PICARD-1703) - Upgrade to PyInstaller 3.6 # Version 2.2.3 - 2019-11-06 ## Bug-fix - [PICARD-1633](https://tickets.metabrainz.org/browse/PICARD-1633) - macOS: Automatic locale detection broken - [PICARD-1634](https://tickets.metabrainz.org/browse/PICARD-1634) - macOS: File browser sets wrong horizontal scroll position - [PICARD-1635](https://tickets.metabrainz.org/browse/PICARD-1635) - Terminated randomly when deleting files when saving - [PICARD-1636](https://tickets.metabrainz.org/browse/PICARD-1636) - Default locale detection fails if locale categories have different locales - [PICARD-1637](https://tickets.metabrainz.org/browse/PICARD-1637) - Crash when saving after removing some underlying files - [PICARD-1640](https://tickets.metabrainz.org/browse/PICARD-1640) - Picard with --config-file parameter copies over legacy configuration - [PICARD-1642](https://tickets.metabrainz.org/browse/PICARD-1642) - Picard crashes on launch (AttributeError: 'NoneType' object has no attribute 'setPopupMode') - [PICARD-1643](https://tickets.metabrainz.org/browse/PICARD-1643) - Performer with instruments containing non-ASCII characters are not written to Vorbis and APE tags - [PICARD-1644](https://tickets.metabrainz.org/browse/PICARD-1644) - Crash when initializing translations on Python 3.8 - [PICARD-1647](https://tickets.metabrainz.org/browse/PICARD-1647) - macOS: Plugin enable/disable button does not always update the icon - [PICARD-1648](https://tickets.metabrainz.org/browse/PICARD-1648) - Crashes when using search dialogs - [PICARD-1651](https://tickets.metabrainz.org/browse/PICARD-1651) - File and release counts in status bar not updated when files get removed - [PICARD-1654](https://tickets.metabrainz.org/browse/PICARD-1654) - macOS: Logout button / username stays visible after logout - [PICARD-1655](https://tickets.metabrainz.org/browse/PICARD-1655) - macOS: Login dialog can be hidden behind options ## Improvement - [PICARD-1630](https://tickets.metabrainz.org/browse/PICARD-1630) - Ensure FLAC metadata is visible/editable in Windows Explorer - [PICARD-1632](https://tickets.metabrainz.org/browse/PICARD-1632) - Tooltips for genre filter help hide too quickly # Version 2.2.2 - 2019-10-08 ## Bug-fix - [PICARD-1606](https://tickets.metabrainz.org/browse/PICARD-1606) - Crashes on opening options with broken plugin - [PICARD-1612](https://tickets.metabrainz.org/browse/PICARD-1612) - Trackpad tap is not working properly on macOS - [PICARD-1614](https://tickets.metabrainz.org/browse/PICARD-1614) - macOS: Incorrect 'LSMinimumSystemVersion' - [PICARD-1618](https://tickets.metabrainz.org/browse/PICARD-1618) - macOS and Windows packages built without C astrcmp - [PICARD-1621](https://tickets.metabrainz.org/browse/PICARD-1621) - Lookup CD dropdown does not list additional drives - [PICARD-1624](https://tickets.metabrainz.org/browse/PICARD-1624) - Updating default CD device in options does not change default for keyboard shortcut ## Improvement - [PICARD-1610](https://tickets.metabrainz.org/browse/PICARD-1610) - Make the labels in Options > User Interface > Colours wider - [PICARD-1619](https://tickets.metabrainz.org/browse/PICARD-1619) - Grey out cover art providers list when cover art is disabled # Version 2.2.1 - 2019-09-20 ## Bug-fix - [PICARD-1603](https://tickets.metabrainz.org/browse/PICARD-1603) - Translations from picard/ui/colors.py don’t show up in Picard - [PICARD-1604](https://tickets.metabrainz.org/browse/PICARD-1604) - Windows install is not using Qt default translations - [PICARD-1607](https://tickets.metabrainz.org/browse/PICARD-1607) - Upgrading a plugin displays the dialog box multiple times - [PICARD-1608](https://tickets.metabrainz.org/browse/PICARD-1608) - "[non-album tracks]" can not directly be removed - [PICARD-1609](https://tickets.metabrainz.org/browse/PICARD-1609) - Picard About shows Qt version PyQt was build against, not actually used Qt ## Improvement - [PICARD-1602](https://tickets.metabrainz.org/browse/PICARD-1602) - Tests should not be included in the sdist package # Version 2.2 - 2019-09-14 ## Bug-fix - [PICARD-456](https://tickets.metabrainz.org/browse/PICARD-456) - "Delete empty directories" should not delete special folders such as the desktop - [PICARD-571](https://tickets.metabrainz.org/browse/PICARD-571) - Scripting and renaming font on macOS and Windows not monospace - [PICARD-622](https://tickets.metabrainz.org/browse/PICARD-622) - File Browser resets horizontal scrolling on selection change - [PICARD-765](https://tickets.metabrainz.org/browse/PICARD-765) - Refreshing a release reloads the CAA index.json file from cache, even if it changed online - [PICARD-1025](https://tickets.metabrainz.org/browse/PICARD-1025) - An empty destination directory prevents the options from being saved, but doesn't show an error - [PICARD-1090](https://tickets.metabrainz.org/browse/PICARD-1090) - Match quality indicators are blurry - [PICARD-1282](https://tickets.metabrainz.org/browse/PICARD-1282) - ⌘W does not close Preferences window - [PICARD-1284](https://tickets.metabrainz.org/browse/PICARD-1284) - Can't quit with preferences open - [PICARD-1446](https://tickets.metabrainz.org/browse/PICARD-1446) - Expand/collapse indicator for the release is briefly missing - [PICARD-1483](https://tickets.metabrainz.org/browse/PICARD-1483) - Can't submit fingerprints to non-album recordings - [PICARD-1489](https://tickets.metabrainz.org/browse/PICARD-1489) - Crash on start when loading python-discid without libdiscid being available - [PICARD-1490](https://tickets.metabrainz.org/browse/PICARD-1490) - Local cover art provider fails on Windows - [PICARD-1491](https://tickets.metabrainz.org/browse/PICARD-1491) - Version check when loading Picard plugins too strict - [PICARD-1492](https://tickets.metabrainz.org/browse/PICARD-1492) - Can’t save rated tracks when it’s a FLAC file (when Metadata/Ratings is active) - [PICARD-1493](https://tickets.metabrainz.org/browse/PICARD-1493) - Crash on pre 1.0 config upgrade - [PICARD-1497](https://tickets.metabrainz.org/browse/PICARD-1497) - Saving fails when setting tags with invalid names for the underlying tagging format - [PICARD-1499](https://tickets.metabrainz.org/browse/PICARD-1499) - Picard loads embedded cover art with ID3 type "other" as sticker - [PICARD-1501](https://tickets.metabrainz.org/browse/PICARD-1501) - Double click in a cover opens it in web browser instead of an image viewer - [PICARD-1503](https://tickets.metabrainz.org/browse/PICARD-1503) - Scanning CDROM uses path containing ampersand (&) - [PICARD-1516](https://tickets.metabrainz.org/browse/PICARD-1516) - Picard fails to load MP4 without tags - [PICARD-1517](https://tickets.metabrainz.org/browse/PICARD-1517) - Functions matchedtracks and is_complete throw exception when run on cluster - [PICARD-1522](https://tickets.metabrainz.org/browse/PICARD-1522) - Crash when removing NAT recordings - [PICARD-1527](https://tickets.metabrainz.org/browse/PICARD-1527) - Can't resize options window in 2.1.x (Mac) - [PICARD-1529](https://tickets.metabrainz.org/browse/PICARD-1529) - NAT tracks get assigned wrong cover art - [PICARD-1533](https://tickets.metabrainz.org/browse/PICARD-1533) - Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created - [PICARD-1541](https://tickets.metabrainz.org/browse/PICARD-1541) - Closing log views destroys widgets - [PICARD-1543](https://tickets.metabrainz.org/browse/PICARD-1543) - v2.1.3 crashes when selecting Preferences in the Apple menu 10.14.5 - [PICARD-1547](https://tickets.metabrainz.org/browse/PICARD-1547) - Picard doesn't warn about not updating .wav metadata - [PICARD-1549](https://tickets.metabrainz.org/browse/PICARD-1549) - Source distributions are broken on Windows - [PICARD-1551](https://tickets.metabrainz.org/browse/PICARD-1551) - "compare_to_track" method considers "score" parameter only if track has releases - [PICARD-1556](https://tickets.metabrainz.org/browse/PICARD-1556) - Default File Naming Script produces "00" track number in file name. - [PICARD-1558](https://tickets.metabrainz.org/browse/PICARD-1558) - Setting rating on a track does not apply to already matched files - [PICARD-1566](https://tickets.metabrainz.org/browse/PICARD-1566) - Cannot drag misidentified song back to the left pane - [PICARD-1567](https://tickets.metabrainz.org/browse/PICARD-1567) - Parsing track number from file name modifies original title in metadata - [PICARD-1571](https://tickets.metabrainz.org/browse/PICARD-1571) - On macOS multiple option dialogs can be opened - [PICARD-1573](https://tickets.metabrainz.org/browse/PICARD-1573) - Crash when loading release with a tag that contains only whitespace. - [PICARD-1575](https://tickets.metabrainz.org/browse/PICARD-1575) - Can't drag and drop a picture from the Google Picture Result Page to Picard. - [PICARD-1580](https://tickets.metabrainz.org/browse/PICARD-1580) - Crash when closing options window on "Preferred Releases" page - [PICARD-1582](https://tickets.metabrainz.org/browse/PICARD-1582) - "Allow selection of multiple directories" has no effect on Linux with Gtk file chooser - [PICARD-1584](https://tickets.metabrainz.org/browse/PICARD-1584) - Crash when disabling script function providing plugin - [PICARD-1585](https://tickets.metabrainz.org/browse/PICARD-1585) - On macOS restore default options dialog opens in background - [PICARD-1588](https://tickets.metabrainz.org/browse/PICARD-1588) - Metadata box shows tags unsupported by format - [PICARD-1591](https://tickets.metabrainz.org/browse/PICARD-1591) - Error when loading Vorbis file with invalid metadata_block_picture - [PICARD-1593](https://tickets.metabrainz.org/browse/PICARD-1593) - Picard crashes on plugin install error - [PICARD-1595](https://tickets.metabrainz.org/browse/PICARD-1595) - Cursor in tag edit box always jumps to end on input - [PICARD-1598](https://tickets.metabrainz.org/browse/PICARD-1598) - Metadata box hidden when album gets updated - [PICARD-1601](https://tickets.metabrainz.org/browse/PICARD-1601) - PyPI source tarball misses some test data ## New Feature - [PICARD-143](https://tickets.metabrainz.org/browse/PICARD-143) - Add a plugin hook for a file-added-to-a-track event - [PICARD-1130](https://tickets.metabrainz.org/browse/PICARD-1130) - Post save plugins - [PICARD-1488](https://tickets.metabrainz.org/browse/PICARD-1488) - Built-in media player (beta feature) - [PICARD-1510](https://tickets.metabrainz.org/browse/PICARD-1510) - Add a plugin hook for a file-removed-from-a-track event - [PICARD-1512](https://tickets.metabrainz.org/browse/PICARD-1512) - Add a plugin hook for an album-removed event - [PICARD-1514](https://tickets.metabrainz.org/browse/PICARD-1514) - Replace genre / folksonomy tag blacklist with more comprehensive list - [PICARD-1524](https://tickets.metabrainz.org/browse/PICARD-1524) - Replace hardcoded colors by user-configurable ones - [PICARD-1560](https://tickets.metabrainz.org/browse/PICARD-1560) - Add a plugin hook for a file loaded event - [PICARD-1594](https://tickets.metabrainz.org/browse/PICARD-1594) - Provide `$is_video()` / `$is_audio()` scripting functions ## Task - [PICARD-1353](https://tickets.metabrainz.org/browse/PICARD-1353) - Update Travis CI to use newer Xcode - [PICARD-1388](https://tickets.metabrainz.org/browse/PICARD-1388) - Document how to uninstall local built version of picard from CLI - [PICARD-1561](https://tickets.metabrainz.org/browse/PICARD-1561) - test_file.TestPreserveTimes fails on macOS 10.14 - [PICARD-1563](https://tickets.metabrainz.org/browse/PICARD-1563) - Add 'picard.egg-info' file to .gitignore ## Improvement - [PICARD-1235](https://tickets.metabrainz.org/browse/PICARD-1235) - Picard is not responding during start while CD is being inserted - [PICARD-1361](https://tickets.metabrainz.org/browse/PICARD-1361) - Add "Launch Picard" to Windows installer - [PICARD-1400](https://tickets.metabrainz.org/browse/PICARD-1400) - Remove Amazon cover art provider from Picard and place it into a plugin - [PICARD-1468](https://tickets.metabrainz.org/browse/PICARD-1468) - Localize Windows installer - [PICARD-1485](https://tickets.metabrainz.org/browse/PICARD-1485) - Picard should show the hours of long tracks - [PICARD-1494](https://tickets.metabrainz.org/browse/PICARD-1494) - Use Python3.3+ nano seconds resolution stat()/utime() to preserve times on file save - [PICARD-1496](https://tickets.metabrainz.org/browse/PICARD-1496) - Display count of Other versions available once known in album's contextual menu - [PICARD-1502](https://tickets.metabrainz.org/browse/PICARD-1502) - qApp.setDesktopFileName (wayland app_ip) - [PICARD-1525](https://tickets.metabrainz.org/browse/PICARD-1525) - Log/History views are updated even if not actually visible - [PICARD-1546](https://tickets.metabrainz.org/browse/PICARD-1546) - Display in Others submenu is messy for albums with a lot of tracks - [PICARD-1552](https://tickets.metabrainz.org/browse/PICARD-1552) - "compare_to_release_parts" considers track count of only first medium - [PICARD-1559](https://tickets.metabrainz.org/browse/PICARD-1559) - Allow moving files to subfolders without renaming - [PICARD-1564](https://tickets.metabrainz.org/browse/PICARD-1564) - Picard code for parsing response from AcoustID servers ignores tracks - [PICARD-1576](https://tickets.metabrainz.org/browse/PICARD-1576) - Open option help context sensitive - [PICARD-1578](https://tickets.metabrainz.org/browse/PICARD-1578) - Allow dragging images from Bing image search result - [PICARD-1579](https://tickets.metabrainz.org/browse/PICARD-1579) - Dragging cover art from Google image search on Linux drops just preview image - [PICARD-1581](https://tickets.metabrainz.org/browse/PICARD-1581) - "Recursively add files and folders" is very technical and hard to understand - [PICARD-1586](https://tickets.metabrainz.org/browse/PICARD-1586) - Support for ReplayGain 2.0 tags - [PICARD-1599](https://tickets.metabrainz.org/browse/PICARD-1599) - Use fpcalc json output for more robust output parsing # Version 2.1.3 - 2019-03-03 ## Bug-fix - [PICARD-323](https://tickets.metabrainz.org/browse/PICARD-323) - Only the discid of the first disc in a release is written to tags - [PICARD-455](https://tickets.metabrainz.org/browse/PICARD-455) - Picard setting cover art height, width and depth to 0 for FLAC files --> breaks libFLAC - [PICARD-729](https://tickets.metabrainz.org/browse/PICARD-729) - Tracks get stuck at "[loading track information]" on Bad Gateway errors - [PICARD-938](https://tickets.metabrainz.org/browse/PICARD-938) - Need two left-arrow key presses to go from track with file to album - [PICARD-1178](https://tickets.metabrainz.org/browse/PICARD-1178) - Images tagged with extra types that the user has chosen to ignore should not be shown as 'modified' - [PICARD-1288](https://tickets.metabrainz.org/browse/PICARD-1288) - Folskonomy tags / genre fallback on album artists tags not working - [PICARD-1422](https://tickets.metabrainz.org/browse/PICARD-1422) - Windows: Uninstall 32 bit Picard before upgrade - [PICARD-1447](https://tickets.metabrainz.org/browse/PICARD-1447) - When releasing a new version, appdata should also be updated - [PICARD-1460](https://tickets.metabrainz.org/browse/PICARD-1460) - Windows installer does not detect running instance - [PICARD-1461](https://tickets.metabrainz.org/browse/PICARD-1461) - Crash when running with Spanish language - [PICARD-1463](https://tickets.metabrainz.org/browse/PICARD-1463) - Picard crashes on startup on Windows - [PICARD-1469](https://tickets.metabrainz.org/browse/PICARD-1469) - Force close when adding songs to larger albums - [PICARD-1471](https://tickets.metabrainz.org/browse/PICARD-1471) - Artist searches do not show begin and end area - [PICARD-1473](https://tickets.metabrainz.org/browse/PICARD-1473) - AcoustId lookup fails if fingerprint already in tags - [PICARD-1474](https://tickets.metabrainz.org/browse/PICARD-1474) - Windows installer shows outdated version string in file properties - [PICARD-1475](https://tickets.metabrainz.org/browse/PICARD-1475) - Cover art sources do not support HTTPS - [PICARD-1476](https://tickets.metabrainz.org/browse/PICARD-1476) - Filled up thread pool prevents metadata box updates - [PICARD-1478](https://tickets.metabrainz.org/browse/PICARD-1478) - Changing MB server requires a restart - [PICARD-1480](https://tickets.metabrainz.org/browse/PICARD-1480) - Search line input clear button icon is too small ## Task - [PICARD-1459](https://tickets.metabrainz.org/browse/PICARD-1459) - Remove OptionsPage.info method - [PICARD-1472](https://tickets.metabrainz.org/browse/PICARD-1472) - macOS code signing on Travis CI fails for xcode7.3 image ## Improvement - [PICARD-1242](https://tickets.metabrainz.org/browse/PICARD-1242) - Consider the number of AcoustID sources for linked recordings - [PICARD-1457](https://tickets.metabrainz.org/browse/PICARD-1457) - "Check for Update" should be in the Picard menu - [PICARD-1458](https://tickets.metabrainz.org/browse/PICARD-1458) - "Check for Update" should have an ellipsis at the end - [PICARD-1470](https://tickets.metabrainz.org/browse/PICARD-1470) - Make warning about Qt locale loading less prominent # Version 2.1.2 - 2019-01-29 ## Bug-fix - [PICARD-1382](https://tickets.metabrainz.org/browse/PICARD-1382) - macOS packaging script ignores all errors ## Task - [PICARD-1456](https://tickets.metabrainz.org/browse/PICARD-1456) - macOS packaging fails due to PIP bug # Version 2.1.1 - 2019-01-29 ## Bug-fix - [PICARD-1451](https://tickets.metabrainz.org/browse/PICARD-1451) - Redirects of authenticated requests fail with 401 error - [PICARD-1453](https://tickets.metabrainz.org/browse/PICARD-1453) - Dropping events do not work in CoverArtBox - [PICARD-1454](https://tickets.metabrainz.org/browse/PICARD-1454) - Crashes when adding action to toolbar in options ## Task - [PICARD-1452](https://tickets.metabrainz.org/browse/PICARD-1452) - Appveyor auto-deploy not working ## Improvement - [PICARD-1450](https://tickets.metabrainz.org/browse/PICARD-1450) - Fix language label for zh_CN and zh_TW # Version 2.1.0 - 2018-12-20 ## Bug-fix - [PICARD-105](https://tickets.metabrainz.org/browse/PICARD-105) - Picard won't load non-album tracks from fingerprints - [PICARD-421](https://tickets.metabrainz.org/browse/PICARD-421) - Releases in private collections are not shown as being in them - [PICARD-518](https://tickets.metabrainz.org/browse/PICARD-518) - Sliders without labels in "Options - Metadata - Preferred Releases" - [PICARD-637](https://tickets.metabrainz.org/browse/PICARD-637) - `$matchedtracks` is broken - [PICARD-875](https://tickets.metabrainz.org/browse/PICARD-875) - AIFF does not support any of the compatid3 tags - [PICARD-949](https://tickets.metabrainz.org/browse/PICARD-949) - Track can be placed in the incorrect spot on the release after using Scan - [PICARD-1013](https://tickets.metabrainz.org/browse/PICARD-1013) - False file save error in specific circumstances - [PICARD-1060](https://tickets.metabrainz.org/browse/PICARD-1060) - Collections menu not displayed correctly anymore - [PICARD-1112](https://tickets.metabrainz.org/browse/PICARD-1112) - Cannot save tags that were previously deleted from file - [PICARD-1133](https://tickets.metabrainz.org/browse/PICARD-1133) - Plugins list doesn't load automatically after setting proxy - [PICARD-1162](https://tickets.metabrainz.org/browse/PICARD-1162) - Solo vocals are tagged wrong - [PICARD-1219](https://tickets.metabrainz.org/browse/PICARD-1219) - Picard creating empty ID3 TIPL / TMCL / IPLS frames - [PICARD-1245](https://tickets.metabrainz.org/browse/PICARD-1245) - Set field "Grouping" doesn't work as expected - [PICARD-1275](https://tickets.metabrainz.org/browse/PICARD-1275) - After uninstalling a plugin Picard needs to be restarted for it to be reinstalled - [PICARD-1281](https://tickets.metabrainz.org/browse/PICARD-1281) - Picard has wrong version string on macOS - [PICARD-1320](https://tickets.metabrainz.org/browse/PICARD-1320) - Black text on a dark theme - [PICARD-1332](https://tickets.metabrainz.org/browse/PICARD-1332) - Deleted tags for matched files stay deleted - [PICARD-1336](https://tickets.metabrainz.org/browse/PICARD-1336) - MP4 reports "bpm" as unsupported tag - [PICARD-1339](https://tickets.metabrainz.org/browse/PICARD-1339) - Removing unclustered files can be very slow - [PICARD-1340](https://tickets.metabrainz.org/browse/PICARD-1340) - File info doesn't display Mono / Stereo in Channels field anymore - [PICARD-1341](https://tickets.metabrainz.org/browse/PICARD-1341) - Cluster track order misinterprets disc/track numbers - [PICARD-1346](https://tickets.metabrainz.org/browse/PICARD-1346) - Move additional files fails if multiple patterns match - [PICARD-1348](https://tickets.metabrainz.org/browse/PICARD-1348) - Keyboard shortcuts broken due to localization - [PICARD-1350](https://tickets.metabrainz.org/browse/PICARD-1350) - Drag and drop on cover image box does not always work as expected - [PICARD-1355](https://tickets.metabrainz.org/browse/PICARD-1355) - Setting or unsetting album for non-album tracks does not work - [PICARD-1359](https://tickets.metabrainz.org/browse/PICARD-1359) - Crash with tagger integration when using DuckDuckGo Privacy Essentials - [PICARD-1364](https://tickets.metabrainz.org/browse/PICARD-1364) - picard.exe has no version tag - [PICARD-1368](https://tickets.metabrainz.org/browse/PICARD-1368) - Info messages are not shown on logging level Info - [PICARD-1369](https://tickets.metabrainz.org/browse/PICARD-1369) - Crash on Python 3.7.0 opening URLs - [PICARD-1370](https://tickets.metabrainz.org/browse/PICARD-1370) - Windows installer to add "Quick Launch" icon no longer supported on Win10 - [PICARD-1371](https://tickets.metabrainz.org/browse/PICARD-1371) - Windows installer does not warn when installing on 32 bit system - [PICARD-1373](https://tickets.metabrainz.org/browse/PICARD-1373) - Source distributions are unusable - [PICARD-1374](https://tickets.metabrainz.org/browse/PICARD-1374) - Picard crashes while typing a regular expression in some cases - [PICARD-1375](https://tickets.metabrainz.org/browse/PICARD-1375) - Metadata sanitation before move-script execution fails - [PICARD-1376](https://tickets.metabrainz.org/browse/PICARD-1376) - Error saving Ape files with tag marked for deletion that does not exist - [PICARD-1381](https://tickets.metabrainz.org/browse/PICARD-1381) - Test results depend on execution order of tests - [PICARD-1397](https://tickets.metabrainz.org/browse/PICARD-1397) - Do not save tags marked as unsupported - [PICARD-1398](https://tickets.metabrainz.org/browse/PICARD-1398) - Snap package is missing locale files - [PICARD-1405](https://tickets.metabrainz.org/browse/PICARD-1405) - Pasting formatted text into scripting window shows formatting - [PICARD-1410](https://tickets.metabrainz.org/browse/PICARD-1410) - Loading Vorbis file with invalid rating value fails - [PICARD-1412](https://tickets.metabrainz.org/browse/PICARD-1412) - Deleting tag counts not as important metadata change - [PICARD-1414](https://tickets.metabrainz.org/browse/PICARD-1414) - Image errors lead to crash in info dialog - [PICARD-1415](https://tickets.metabrainz.org/browse/PICARD-1415) - Open Containing Folder and Open with MusicPlayer does nothing for UNC paths - [PICARD-1418](https://tickets.metabrainz.org/browse/PICARD-1418) - Display localized default dialogs and keyboard shortcut hints - [PICARD-1420](https://tickets.metabrainz.org/browse/PICARD-1420) - Can not save wma file. TypeError: sequence item 0 - [PICARD-1428](https://tickets.metabrainz.org/browse/PICARD-1428) - Removing tags which are only in original file metadata not possible - [PICARD-1430](https://tickets.metabrainz.org/browse/PICARD-1430) - "Authentication required" dialog does not trigger authentication - [PICARD-1431](https://tickets.metabrainz.org/browse/PICARD-1431) - Some ID3 frames gets deleted even if the corresponding tags are shown as unchanged - [PICARD-1434](https://tickets.metabrainz.org/browse/PICARD-1434) - Tag acoustid_id can not be removed or deleted in script - [PICARD-1436](https://tickets.metabrainz.org/browse/PICARD-1436) - Text extraction of "title" and "label" for translation. - [PICARD-1437](https://tickets.metabrainz.org/browse/PICARD-1437) - After reload file is being shown as changed - [PICARD-1438](https://tickets.metabrainz.org/browse/PICARD-1438) - Message box buttons Yes/No aren't translated - [PICARD-1439](https://tickets.metabrainz.org/browse/PICARD-1439) - Newline character in cover art naming script causes exception on saving ## New Feature - [PICARD-490](https://tickets.metabrainz.org/browse/PICARD-490) - Allow tagging AAC/ADTS files with APEv2 tags - [PICARD-1043](https://tickets.metabrainz.org/browse/PICARD-1043) - Support reading & writing iTunes Classical tags - [PICARD-1045](https://tickets.metabrainz.org/browse/PICARD-1045) - Check for new version - [PICARD-1268](https://tickets.metabrainz.org/browse/PICARD-1268) - Support concertmaster recording relationships as performer:concertmaster - [PICARD-1273](https://tickets.metabrainz.org/browse/PICARD-1273) - Add an option to exclude new cover art type "Raw / Unedited" - [PICARD-1319](https://tickets.metabrainz.org/browse/PICARD-1319) - Provide cover art metadata to cover image naming script - [PICARD-1344](https://tickets.metabrainz.org/browse/PICARD-1344) - Add `$delete` function - [PICARD-1352](https://tickets.metabrainz.org/browse/PICARD-1352) - Add a command-line option to skip plugin loading - [PICARD-1354](https://tickets.metabrainz.org/browse/PICARD-1354) - Allow using vocals and instruments as credited - [PICARD-1367](https://tickets.metabrainz.org/browse/PICARD-1367) - Allow opening searches in browser when using search dialogs - [PICARD-1384](https://tickets.metabrainz.org/browse/PICARD-1384) - Add AppStream data - [PICARD-1386](https://tickets.metabrainz.org/browse/PICARD-1386) - Add `$title` function - [PICARD-1395](https://tickets.metabrainz.org/browse/PICARD-1395) - Support genres from MusicBrainz - [PICARD-1440](https://tickets.metabrainz.org/browse/PICARD-1440) - Support loading and renaming Standard MIDI Files (SMF) ## Task - [PICARD-1333](https://tickets.metabrainz.org/browse/PICARD-1333) - Run CI tests agaist oldest supported mutagen - [PICARD-1347](https://tickets.metabrainz.org/browse/PICARD-1347) - Refactor script.py to avoid code duplication - [PICARD-1365](https://tickets.metabrainz.org/browse/PICARD-1365) - Allow building with PyQt 5.11 or later - [PICARD-1442](https://tickets.metabrainz.org/browse/PICARD-1442) - Support new Audio Play secondary type ## Sub-task - [PICARD-1407](https://tickets.metabrainz.org/browse/PICARD-1407) - Save originalalbum / originalartist to ASF/WMA - [PICARD-1408](https://tickets.metabrainz.org/browse/PICARD-1408) - Save originalalbum / originalartist to APE ## Improvement - [PICARD-664](https://tickets.metabrainz.org/browse/PICARD-664) - When dragging a recording, show the actual file name instead of the path - [PICARD-792](https://tickets.metabrainz.org/browse/PICARD-792) - Package a start menu tile for Windows 10 on the windows version - [PICARD-1039](https://tickets.metabrainz.org/browse/PICARD-1039) - Use forward delete instead of delete button on macOS - [PICARD-1049](https://tickets.metabrainz.org/browse/PICARD-1049) - Picard should use TXXX:WORK rather than TXXX:Work - [PICARD-1068](https://tickets.metabrainz.org/browse/PICARD-1068) - Picard should use MP4 ©wrk for Work rather than generic text field - [PICARD-1244](https://tickets.metabrainz.org/browse/PICARD-1244) - Refresh list of plugins after uninstalling or installing a local plugin - [PICARD-1285](https://tickets.metabrainz.org/browse/PICARD-1285) - There is no Close menu item in Picard 2.0 on macOS - [PICARD-1313](https://tickets.metabrainz.org/browse/PICARD-1313) - Refactor plugin UI - [PICARD-1325](https://tickets.metabrainz.org/browse/PICARD-1325) - Allow disabling new version update checking for packagers - [PICARD-1338](https://tickets.metabrainz.org/browse/PICARD-1338) - Picard should be more resilient if it gets invalid responses from servers - [PICARD-1358](https://tickets.metabrainz.org/browse/PICARD-1358) - Use macOS style widgets in the user interface of the macOS version of Picard - [PICARD-1363](https://tickets.metabrainz.org/browse/PICARD-1363) - AcoustId submission for matched files is impossible when musicbrainz_recordingid is unset - [PICARD-1366](https://tickets.metabrainz.org/browse/PICARD-1366) - Show Python version in about - [PICARD-1379](https://tickets.metabrainz.org/browse/PICARD-1379) - Port astrcmp to new Python C Unicode API - [PICARD-1383](https://tickets.metabrainz.org/browse/PICARD-1383) - Use MCN / barcode read from disc to improve DiscId lookup - [PICARD-1393](https://tickets.metabrainz.org/browse/PICARD-1393) - Change the application ID - [PICARD-1416](https://tickets.metabrainz.org/browse/PICARD-1416) - Should store ID3 Artists field as TXXX:ARTISTS not TXXX:Artists - [PICARD-1417](https://tickets.metabrainz.org/browse/PICARD-1417) - Only show plugins with compatible API version - [PICARD-1424](https://tickets.metabrainz.org/browse/PICARD-1424) - Translate AppStream data - [PICARD-1425](https://tickets.metabrainz.org/browse/PICARD-1425) - Support all movement tags for APE, Vorbis and MP3 - [PICARD-1426](https://tickets.metabrainz.org/browse/PICARD-1426) - Map musicbrainz_originalalbumid and musicbrainz_originalartistid to MP4 and WMA - [PICARD-1443](https://tickets.metabrainz.org/browse/PICARD-1443) - Sort secondary release types in UI alphabetically # Version 2.0.4 - 2018-09-05 ## Bug-fix - [PICARD-803](https://tickets.metabrainz.org/browse/PICARD-803) - tagging "8½ Minutes" with "replace with non-ascii characters" results in a directory being created - [PICARD-1216](https://tickets.metabrainz.org/browse/PICARD-1216) - Does not display version information - [PICARD-1267](https://tickets.metabrainz.org/browse/PICARD-1267) - 2.0.0dev6 crash in debug mode on Windows April Update (1803) - [PICARD-1281](https://tickets.metabrainz.org/browse/PICARD-1281) - Picard has wrong version string - [PICARD-1294](https://tickets.metabrainz.org/browse/PICARD-1294) - Crashes every time Picard connects to MB server. - [PICARD-1310](https://tickets.metabrainz.org/browse/PICARD-1310) - Picard crashes on clearing log - [PICARD-1318](https://tickets.metabrainz.org/browse/PICARD-1318) - RuntimeError: dictionary changed size during iteration - [PICARD-1321](https://tickets.metabrainz.org/browse/PICARD-1321) - CD drive selection not working on Linux - [PICARD-1322](https://tickets.metabrainz.org/browse/PICARD-1322) - Crash in options on "Restore defaults" - [PICARD-1323](https://tickets.metabrainz.org/browse/PICARD-1323) - Restore defaults does not restore CAA types - [PICARD-1324](https://tickets.metabrainz.org/browse/PICARD-1324) - Default locale not working reliable - [PICARD-1326](https://tickets.metabrainz.org/browse/PICARD-1326) - Picard Save Changes 5.1 Mix Type - [PICARD-1327](https://tickets.metabrainz.org/browse/PICARD-1327) - Loading TAK files fails - [PICARD-1328](https://tickets.metabrainz.org/browse/PICARD-1328) - Loading OptimFROG files fails - [PICARD-1329](https://tickets.metabrainz.org/browse/PICARD-1329) - Picard fails saving ID3 tags with iTunNORM tag - [PICARD-1331](https://tickets.metabrainz.org/browse/PICARD-1331) - Picard crashes on error during plugin install # Version 2.0.3 - 2018-08-10 ## Bug-fix - [PICARD-1122](https://tickets.metabrainz.org/browse/PICARD-1122) - Preffered release type settings are exclusive and should be inclusive - [PICARD-1207](https://tickets.metabrainz.org/browse/PICARD-1207) - Move additional files feature fails when source directory contains non-ascii characters - [PICARD-1247](https://tickets.metabrainz.org/browse/PICARD-1247) - Not all "preserved" tags are preserved - [PICARD-1305](https://tickets.metabrainz.org/browse/PICARD-1305) - Search dialog crashes picard when record doesn't have an album - [PICARD-1306](https://tickets.metabrainz.org/browse/PICARD-1306) - picard crashes when opening the options dialog if the cwd doesn't exist ## New Feature - [PICARD-1289](https://tickets.metabrainz.org/browse/PICARD-1289) - Allow manually running any tagger script ## Improvement - [PICARD-1292](https://tickets.metabrainz.org/browse/PICARD-1292) - MusicBrainz Picard 2.01 64-bit for windows installs to "C:\Program Files (x86)" by default - [PICARD-1302](https://tickets.metabrainz.org/browse/PICARD-1302) - Dropping an image from Google image crashes picard - [PICARD-1303](https://tickets.metabrainz.org/browse/PICARD-1303) - picard crashes when matching a cluster with a release with no tracks - [PICARD-1304](https://tickets.metabrainz.org/browse/PICARD-1304) - Info dialog for album crashes because track doesn't have a tracknumber ## Regression - [PICARD-259](https://tickets.metabrainz.org/browse/PICARD-259) - Make file-specific variables available to tagger script # Version 2.0.2 - 2018-07-30 ## Sub-task - [PICARD-1296](https://tickets.metabrainz.org/browse/PICARD-1296) - Code sign Picard for macOS ## Task - [PICARD-1301](https://tickets.metabrainz.org/browse/PICARD-1301) - Use PyQT 5.10 for macOS ## Bug-fix - [PICARD-342](https://tickets.metabrainz.org/browse/PICARD-342) - Picard is not properly signed for Mac OS X Gatekeeper - [PICARD-1212](https://tickets.metabrainz.org/browse/PICARD-1212) - Picard 2.0.0dev4 crashing at startup - [PICARD-1300](https://tickets.metabrainz.org/browse/PICARD-1300) - Picard crashes when logging lots of events # Version 2.0.1 - 2018-07-21 ## Bug-fix - [PICARD-1283](https://tickets.metabrainz.org/browse/PICARD-1283) - Fingerprinting not working on macOS in Picard 2.0 - [PICARD-1286](https://tickets.metabrainz.org/browse/PICARD-1286) - Error creating SSL context on Windows ## Improvement - [PICARD-1290](https://tickets.metabrainz.org/browse/PICARD-1290) - Improve slow start up times by moving to a non single file exe - [PICARD-1291](https://tickets.metabrainz.org/browse/PICARD-1291) - Use an installer for Picard 2.x windows exe # Version 2.0 - 2018-07-18 ## Bug-fix - [PICARD-153](https://tickets.metabrainz.org/browse/PICARD-153) - Non-configuration data is saved in Picard.conf - [PICARD-173](https://tickets.metabrainz.org/browse/PICARD-173) - ID3 tag TSOP appears to be stored blank - [PICARD-340](https://tickets.metabrainz.org/browse/PICARD-340) - Cover art embedding will overwrite existing ones - [PICARD-405](https://tickets.metabrainz.org/browse/PICARD-405) - Save stopped working - [PICARD-817](https://tickets.metabrainz.org/browse/PICARD-817) - On high-resolution / high DPI displays, Picard's GUI is scaled wrong - [PICARD-1047](https://tickets.metabrainz.org/browse/PICARD-1047) - Incompatible plugins are loaded with picard 2.0 - [PICARD-1051](https://tickets.metabrainz.org/browse/PICARD-1051) - Searching for similar tracks causes coredumps - [PICARD-1052](https://tickets.metabrainz.org/browse/PICARD-1052) - Not disabled Search for similar tracks can cause coredumps - [PICARD-1056](https://tickets.metabrainz.org/browse/PICARD-1056) - Crash when viewing file info dialog - [PICARD-1058](https://tickets.metabrainz.org/browse/PICARD-1058) - Saving images as files doesn't work - [PICARD-1062](https://tickets.metabrainz.org/browse/PICARD-1062) - Picard crashes when moving files on release - [PICARD-1063](https://tickets.metabrainz.org/browse/PICARD-1063) - After #689 unit tests fail if astrcmp is not compiled - [PICARD-1064](https://tickets.metabrainz.org/browse/PICARD-1064) - python setup.py test -v doesn't work - [PICARD-1065](https://tickets.metabrainz.org/browse/PICARD-1065) - python setup.py patch_version doesn't work - [PICARD-1066](https://tickets.metabrainz.org/browse/PICARD-1066) - python setup.py update_constants doesn't work - [PICARD-1067](https://tickets.metabrainz.org/browse/PICARD-1067) - Visual bug after un-checking an installed plugin - [PICARD-1073](https://tickets.metabrainz.org/browse/PICARD-1073) - "Add New Tag" crashes picard - [PICARD-1084](https://tickets.metabrainz.org/browse/PICARD-1084) - Picard 2 doesn't find DVD drive - [PICARD-1085](https://tickets.metabrainz.org/browse/PICARD-1085) - Multi-Dir Add Folder not working - [PICARD-1105](https://tickets.metabrainz.org/browse/PICARD-1105) - Crashes when using the edit tag dialog - [PICARD-1106](https://tickets.metabrainz.org/browse/PICARD-1106) - cancel plugin installation file dialog results in crash - [PICARD-1114](https://tickets.metabrainz.org/browse/PICARD-1114) - Cannot submit ratings in Picard 2.0 dev - [PICARD-1119](https://tickets.metabrainz.org/browse/PICARD-1119) - picard sets "Disc Subtitle" to the track title - [PICARD-1123](https://tickets.metabrainz.org/browse/PICARD-1123) - Multiple work languages are collapsed - [PICARD-1126](https://tickets.metabrainz.org/browse/PICARD-1126) - Unhelpful error message logged on network request errors - [PICARD-1135](https://tickets.metabrainz.org/browse/PICARD-1135) - Picard is not able to save on MTP devices - [PICARD-1138](https://tickets.metabrainz.org/browse/PICARD-1138) - Search crashes due to AttributeError - [PICARD-1143](https://tickets.metabrainz.org/browse/PICARD-1143) - Wrong amount of songs from added files - [PICARD-1147](https://tickets.metabrainz.org/browse/PICARD-1147) - FYI, Can't load "Alan Parsons" album "On air" in Picard 1.2 - [PICARD-1153](https://tickets.metabrainz.org/browse/PICARD-1153) - "Lookup in Browser" and "Search" fail silently if artist name contains umlaut - [PICARD-1156](https://tickets.metabrainz.org/browse/PICARD-1156) - Picard fails to start when trying to upgrade plugin which is a symlink - [PICARD-1159](https://tickets.metabrainz.org/browse/PICARD-1159) - Can't open WAV files - [PICARD-1161](https://tickets.metabrainz.org/browse/PICARD-1161) - Dragging artwork from Chrome pages doesn't work - [PICARD-1171](https://tickets.metabrainz.org/browse/PICARD-1171) - Text of "About" can't be selected - [PICARD-1179](https://tickets.metabrainz.org/browse/PICARD-1179) - Error while searching for alt. releases - [PICARD-1181](https://tickets.metabrainz.org/browse/PICARD-1181) - In-app search dialog excessive slow down - [PICARD-1188](https://tickets.metabrainz.org/browse/PICARD-1188) - Picard chooses incorrect value for language tag - [PICARD-1199](https://tickets.metabrainz.org/browse/PICARD-1199) - Crash when right-clicking album - [PICARD-1202](https://tickets.metabrainz.org/browse/PICARD-1202) - Right click on tag listing causes exception and crash - [PICARD-1203](https://tickets.metabrainz.org/browse/PICARD-1203) - Hide unsupported tags from the tag diff in UI - [PICARD-1204](https://tickets.metabrainz.org/browse/PICARD-1204) - Picard freezes on unchecking show diff tags first - [PICARD-1206](https://tickets.metabrainz.org/browse/PICARD-1206) - Text is not displaying properly in some fields. - [PICARD-1210](https://tickets.metabrainz.org/browse/PICARD-1210) - Long lines in the option dialogue don’t wrap - [PICARD-1213](https://tickets.metabrainz.org/browse/PICARD-1213) - Wrong Movement of coverart providers - [PICARD-1215](https://tickets.metabrainz.org/browse/PICARD-1215) - Does not use config / ini file specified on command line - [PICARD-1221](https://tickets.metabrainz.org/browse/PICARD-1221) - Picard 2.0 won't start on Windows 10 - [PICARD-1226](https://tickets.metabrainz.org/browse/PICARD-1226) - Different fonts in the plugins dialog - [PICARD-1230](https://tickets.metabrainz.org/browse/PICARD-1230) - Looking up CD crashes Picard - [PICARD-1234](https://tickets.metabrainz.org/browse/PICARD-1234) - Crash when loading plugin from local directory - [PICARD-1252](https://tickets.metabrainz.org/browse/PICARD-1252) - Crash on pasting invalid naming script - [PICARD-1253](https://tickets.metabrainz.org/browse/PICARD-1253) - Crash on image saving - [PICARD-1255](https://tickets.metabrainz.org/browse/PICARD-1255) - Crash on startup - no GUI - [PICARD-1265](https://tickets.metabrainz.org/browse/PICARD-1265) - Can't "Lookup in Browser": UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-7: ordinal not in range(256) - [PICARD-1270](https://tickets.metabrainz.org/browse/PICARD-1270) - Corruption of saved audio files located on a network share - [PICARD-1271](https://tickets.metabrainz.org/browse/PICARD-1271) - Artist credit saved in tags sometimes loses closing parenthesis - [PICARD-1277](https://tickets.metabrainz.org/browse/PICARD-1277) - Picard crashes on unknown cover art types ## New Feature - [PICARD-1187](https://tickets.metabrainz.org/browse/PICARD-1187) - Add DSF file support - [PICARD-1220](https://tickets.metabrainz.org/browse/PICARD-1220) - Add keyboard shortcut for deleting scripts from options > scripting page ## Task - [PICARD-960](https://tickets.metabrainz.org/browse/PICARD-960) - Migrate to PyQt5 - [PICARD-1186](https://tickets.metabrainz.org/browse/PICARD-1186) - Support only 64 bit Picard builds from 2.0 ## Improvement - [PICARD-259](https://tickets.metabrainz.org/browse/PICARD-259) - Make file-specific variables available to tagger script - [PICARD-581](https://tickets.metabrainz.org/browse/PICARD-581) - Picard XML processing should use lxml module rather than QXmlStreamReader - [PICARD-588](https://tickets.metabrainz.org/browse/PICARD-588) - Picard 2.0 based on Python 3 - [PICARD-807](https://tickets.metabrainz.org/browse/PICARD-807) - Retry release fetch on MB server overload - [PICARD-922](https://tickets.metabrainz.org/browse/PICARD-922) - Make multi-value script functions work correctly - [PICARD-976](https://tickets.metabrainz.org/browse/PICARD-976) - Reimplement the picard WS code to accommodate future versions of MBWS - [PICARD-978](https://tickets.metabrainz.org/browse/PICARD-978) - Distinguish in UI between unclustered and release unmatched files - [PICARD-1075](https://tickets.metabrainz.org/browse/PICARD-1075) - Add unit tests for Metadata object variables - [PICARD-1087](https://tickets.metabrainz.org/browse/PICARD-1087) - Improvements to UI for Lookup CD - [PICARD-1100](https://tickets.metabrainz.org/browse/PICARD-1100) - Error when running confined in a snap because of gconf - [PICARD-1174](https://tickets.metabrainz.org/browse/PICARD-1174) - Option to tolerate differences in track times - [PICARD-1200](https://tickets.metabrainz.org/browse/PICARD-1200) - In Options dialog, tree pane on the left cannot be resized - [PICARD-1201](https://tickets.metabrainz.org/browse/PICARD-1201) - Add a command-line option to not restore persisted UI sizes or positions - [PICARD-1211](https://tickets.metabrainz.org/browse/PICARD-1211) - The “X” close button doesn’t work on the options dialogue # Version 1.4.2 - 2017-05-08 ## Bug-fix - [PICARD-1053](https://tickets.metabrainz.org/browse/PICARD-1053) - Picard does not stop analyzer while moving - [PICARD-1055](https://tickets.metabrainz.org/browse/PICARD-1055) - picard hangs with: RuntimeError: maximum recursion depth exceeded in cmp - [PICARD-1070](https://tickets.metabrainz.org/browse/PICARD-1070) - The "Convert Unicode punctuation characters to ASCII" function only works in certain tags - [PICARD-1077](https://tickets.metabrainz.org/browse/PICARD-1077) - ID3v2.4 text encoding settings are not saved correctly ## Improvement - [PICARD-969](https://tickets.metabrainz.org/browse/PICARD-969) - Search dialog webservices get queued behind matched album requests - [PICARD-1034](https://tickets.metabrainz.org/browse/PICARD-1034) - Picard not seeing TOPE and TOAL # Version 1.4.1 - 2017-04-01 ## Bug-fix - [PICARD-953](https://tickets.metabrainz.org/browse/PICARD-953) - Album shown matched even if extra unmatched files - [PICARD-972](https://tickets.metabrainz.org/browse/PICARD-972) - Removing album with saves pending does not remove pending saves - [PICARD-973](https://tickets.metabrainz.org/browse/PICARD-973) - Pending log messages not flushed to stderr on quit - [PICARD-988](https://tickets.metabrainz.org/browse/PICARD-988) - Drag & Drop not working - [PICARD-990](https://tickets.metabrainz.org/browse/PICARD-990) - Picard violating ID3 standard for TXXX frames - [PICARD-996](https://tickets.metabrainz.org/browse/PICARD-996) - Disabling the cover art box and enabling it again doesn't bring it back - [PICARD-998](https://tickets.metabrainz.org/browse/PICARD-998) - Disabling the action toolbar sometimes doesn't work - [PICARD-1005](https://tickets.metabrainz.org/browse/PICARD-1005) - If a cluster is moved to the album side of the main window it gets moved to unmatched files - [PICARD-1006](https://tickets.metabrainz.org/browse/PICARD-1006) - Drag and drop for cover arts doesnt work on OSX - [PICARD-1010](https://tickets.metabrainz.org/browse/PICARD-1010) - Unsetting View/Cover Art doesn't work permanently - [PICARD-1011](https://tickets.metabrainz.org/browse/PICARD-1011) - Toolbar tab order incorrect after PICARD-908 - [PICARD-1014](https://tickets.metabrainz.org/browse/PICARD-1014) - Number of images in release info is calculated incorrectly - [PICARD-1015](https://tickets.metabrainz.org/browse/PICARD-1015) - Artwork tab of the Track Info DIalog doesn't show changes anymore - [PICARD-1018](https://tickets.metabrainz.org/browse/PICARD-1018) - CoverArtBox doesn't show new/removed images after unmatched files are added/removed to the album - [PICARD-1023](https://tickets.metabrainz.org/browse/PICARD-1023) - Directory persistence for Add Directory needs tweaking - [PICARD-1029](https://tickets.metabrainz.org/browse/PICARD-1029) - Fix ~artists_sort metadata variable - [PICARD-1042](https://tickets.metabrainz.org/browse/PICARD-1042) - Missing import for PICARD_APP_NAME ## New Feature - [PICARD-258](https://tickets.metabrainz.org/browse/PICARD-258) - Visual feedback for changes to artwork in before-after pane. - [PICARD-1000](https://tickets.metabrainz.org/browse/PICARD-1000) - Implement artwork diff for albums ## Task - [PICARD-943](https://tickets.metabrainz.org/browse/PICARD-943) - Remove monkey patching of file write methods in picard formats - [PICARD-1041](https://tickets.metabrainz.org/browse/PICARD-1041) - Replace Ok button text by Make It So! in Options dialog ## Improvement - [PICARD-223](https://tickets.metabrainz.org/browse/PICARD-223) - Remove should work when Unmatched Files is selected - [PICARD-951](https://tickets.metabrainz.org/browse/PICARD-951) - Always use HTTPS for musicbrainz.org - [PICARD-952](https://tickets.metabrainz.org/browse/PICARD-952) - Use Cover Art Archive over HTTPS - [PICARD-961](https://tickets.metabrainz.org/browse/PICARD-961) - Mention AcoustID on Scan button too - [PICARD-980](https://tickets.metabrainz.org/browse/PICARD-980) - Drag&drop cover art doesn't work for images from amazon/google images/https links - [PICARD-1012](https://tickets.metabrainz.org/browse/PICARD-1012) - Buttons on the "User Interface" and "Scripting" pages are smaller than buttons in other places - [PICARD-1016](https://tickets.metabrainz.org/browse/PICARD-1016) - Multiple images in related tracks confusing - [PICARD-1021](https://tickets.metabrainz.org/browse/PICARD-1021) - Picard loads all pending files before quitting - [PICARD-1024](https://tickets.metabrainz.org/browse/PICARD-1024) - Allow specifying a configuration file path - [PICARD-1030](https://tickets.metabrainz.org/browse/PICARD-1030) - Allow to add/replace cover art images and keep existing cover art # Version 1.4 - 2017-02-14 ## Bug-fix - [PICARD-82](https://tickets.metabrainz.org/browse/PICARD-82) - AcoustID submission fails with code 299 - [PICARD-335](https://tickets.metabrainz.org/browse/PICARD-335) - Ignoring "hip hop rap" folksonomy tags also ignores "rap", "hip hop", etc. - [PICARD-350](https://tickets.metabrainz.org/browse/PICARD-350) - Picard downloads multiple 'front' images instead of just first one. - [PICARD-357](https://tickets.metabrainz.org/browse/PICARD-357) - Saving hidden file with only an extension drops the extension - [PICARD-366](https://tickets.metabrainz.org/browse/PICARD-366) - Add directory opens in "wrong" dir - [PICARD-375](https://tickets.metabrainz.org/browse/PICARD-375) - Picard should de-duplicate work lists - [PICARD-408](https://tickets.metabrainz.org/browse/PICARD-408) - Tree selector in Options window is partially obscured, pane too narrow - [PICARD-419](https://tickets.metabrainz.org/browse/PICARD-419) - tag acoustid_id can not be removed or deleted in script, renaming or plugin - [PICARD-546](https://tickets.metabrainz.org/browse/PICARD-546) - Can't remove value from field - [PICARD-592](https://tickets.metabrainz.org/browse/PICARD-592) - Can't open Options - [PICARD-688](https://tickets.metabrainz.org/browse/PICARD-688) - "Tags from filenames" action stays enabled even if it is unavailable. - [PICARD-701](https://tickets.metabrainz.org/browse/PICARD-701) - Using the first image type as filename changes the name of front images - [PICARD-706](https://tickets.metabrainz.org/browse/PICARD-706) - Fingerprint Submission Failes if AcoustID tags are present and/or invalid - [PICARD-726](https://tickets.metabrainz.org/browse/PICARD-726) - Picard moves into the selected folder - [PICARD-730](https://tickets.metabrainz.org/browse/PICARD-730) - Picard does not support (recording) relationship credits - [PICARD-748](https://tickets.metabrainz.org/browse/PICARD-748) - Picard repeats/duplicates field data - [PICARD-751](https://tickets.metabrainz.org/browse/PICARD-751) - Number of pending web requests is not decremented on exceptions in the handler - [PICARD-753](https://tickets.metabrainz.org/browse/PICARD-753) - Divide by zero error in `_convert_folksonomy_tags_to_genre` when no tag at the release/release group level - [PICARD-754](https://tickets.metabrainz.org/browse/PICARD-754) - Directory tree (file browser) not sorted for non-system drives under Windows - [PICARD-759](https://tickets.metabrainz.org/browse/PICARD-759) - Crash when loading release with only zero count tags - [PICARD-761](https://tickets.metabrainz.org/browse/PICARD-761) - No name and no window grouping in gnome-shell Alt-Tab app switcher - [PICARD-764](https://tickets.metabrainz.org/browse/PICARD-764) - Lookup in Browser does not and can not load HTTPS version of musicbrainz.org - [PICARD-766](https://tickets.metabrainz.org/browse/PICARD-766) - Unable to login using oauth via Picard options with Server Port set to 443 - [PICARD-775](https://tickets.metabrainz.org/browse/PICARD-775) - "AttributeError: 'MetadataBox' object has no attribute 'resize_columns'" when enabling the cover art box - [PICARD-778](https://tickets.metabrainz.org/browse/PICARD-778) - Pre-gap tracks are not counted in absolutetracknumber - [PICARD-780](https://tickets.metabrainz.org/browse/PICARD-780) - CAA cover art provider runs even if cover art has already been loaded - [PICARD-782](https://tickets.metabrainz.org/browse/PICARD-782) - Toggling Embed Cover Art in Tags and restarting doesn't have the expected behavior - [PICARD-788](https://tickets.metabrainz.org/browse/PICARD-788) - XMLWS redirects incorrectly - [PICARD-798](https://tickets.metabrainz.org/browse/PICARD-798) - Handle empty collection-list in web server response - [PICARD-799](https://tickets.metabrainz.org/browse/PICARD-799) - Amazon Cover Art provider does not work (and does not have a lot of debug logging enabled) - [PICARD-801](https://tickets.metabrainz.org/browse/PICARD-801) - Cover Art from CAA release group is skipped even though it exists - [PICARD-804](https://tickets.metabrainz.org/browse/PICARD-804) - Multiple instances of history and log dialogs - [PICARD-805](https://tickets.metabrainz.org/browse/PICARD-805) - Empty string lookup - [PICARD-811](https://tickets.metabrainz.org/browse/PICARD-811) - Will not load album information on any albums - [PICARD-814](https://tickets.metabrainz.org/browse/PICARD-814) - Redirect URL is not encoded which leads to http 400 error. - [PICARD-833](https://tickets.metabrainz.org/browse/PICARD-833) - Not compatible with latest Mutagen - [PICARD-834](https://tickets.metabrainz.org/browse/PICARD-834) - Can't save any files. Get: "error: invalid literal for int() with base 10" - [PICARD-839](https://tickets.metabrainz.org/browse/PICARD-839) - Picard 1.3.2 shows cleartext username & password on status line when errors occur - [PICARD-848](https://tickets.metabrainz.org/browse/PICARD-848) - Cannot fetch cover art from amazon link contains https scheme. - [PICARD-851](https://tickets.metabrainz.org/browse/PICARD-851) - media-optical-modified.png icon still displayed after release save when two files match one track - [PICARD-853](https://tickets.metabrainz.org/browse/PICARD-853) - Release that Picard will not load (due to disc with just data track?) - [PICARD-855](https://tickets.metabrainz.org/browse/PICARD-855) - ValueError in metadata.py - [PICARD-857](https://tickets.metabrainz.org/browse/PICARD-857) - Improper detection of Gnome as a desktop environment and no support for gnome 3 - [PICARD-858](https://tickets.metabrainz.org/browse/PICARD-858) - Apparent non-functional tagger button - [PICARD-859](https://tickets.metabrainz.org/browse/PICARD-859) - Picard does not read Ogg/Opus files with an ".ogg" file exension - [PICARD-865](https://tickets.metabrainz.org/browse/PICARD-865) - Setting a large value in in `$num` function as length causes picard to become unresponsive - [PICARD-867](https://tickets.metabrainz.org/browse/PICARD-867) - id3 deletion needs to be improved - [PICARD-868](https://tickets.metabrainz.org/browse/PICARD-868) - id3v2.3 does not properly handle TMOO ( mood tag) - [PICARD-870](https://tickets.metabrainz.org/browse/PICARD-870) - Coverart providers duplicates on reset - [PICARD-873](https://tickets.metabrainz.org/browse/PICARD-873) - Restore defaults broken for plugins page and tagger scripts page - [PICARD-874](https://tickets.metabrainz.org/browse/PICARD-874) - Coverart providers erroneous save - [PICARD-876](https://tickets.metabrainz.org/browse/PICARD-876) - The metadatabox doesn't correctly show the tag selected - [PICARD-881](https://tickets.metabrainz.org/browse/PICARD-881) - Length tag for ID3 is no longer displayed in the metadata box - [PICARD-882](https://tickets.metabrainz.org/browse/PICARD-882) - Removed tags are not removed from the metadatabox after saving the file - [PICARD-884](https://tickets.metabrainz.org/browse/PICARD-884) - File Browser pane doesn't check for path type (file or folder) when setting home path/move files here - [PICARD-885](https://tickets.metabrainz.org/browse/PICARD-885) - mov files return a +ve score for mp4 container leading to errors - [PICARD-888](https://tickets.metabrainz.org/browse/PICARD-888) - "Restore defaults" doesn't log out the user - [PICARD-907](https://tickets.metabrainz.org/browse/PICARD-907) - Broken 'Restore Defaults' - [PICARD-911](https://tickets.metabrainz.org/browse/PICARD-911) - Messagebox wraps and displays title inappropriately - [PICARD-914](https://tickets.metabrainz.org/browse/PICARD-914) - An “empty” track shouldn’t get an “excellent match” tooltip. - [PICARD-915](https://tickets.metabrainz.org/browse/PICARD-915) - In plugins list, some plugins don't show description - [PICARD-916](https://tickets.metabrainz.org/browse/PICARD-916) - Plugin restore defaults broken - [PICARD-917](https://tickets.metabrainz.org/browse/PICARD-917) - Does not use UI language but locale on Windows - [PICARD-925](https://tickets.metabrainz.org/browse/PICARD-925) - Preserve scripting splitter position - [PICARD-926](https://tickets.metabrainz.org/browse/PICARD-926) - Having trouble submitting AcoustIDs - [PICARD-931](https://tickets.metabrainz.org/browse/PICARD-931) - Cluster double‐click opens the Info… panel - [PICARD-937](https://tickets.metabrainz.org/browse/PICARD-937) - Status bar not cleared when selection changed - [PICARD-942](https://tickets.metabrainz.org/browse/PICARD-942) - Open containing folder not working for shared files over network - [PICARD-945](https://tickets.metabrainz.org/browse/PICARD-945) - Warning: Plugin directory '…/python2.7/site-packages/contrib/plugins' doesn't exist - [PICARD-946](https://tickets.metabrainz.org/browse/PICARD-946) - Additionnal files aren't moved anymore - [PICARD-947](https://tickets.metabrainz.org/browse/PICARD-947) - Search window error message does not appear translated - [PICARD-950](https://tickets.metabrainz.org/browse/PICARD-950) - Open Containing Folder duplicates - [PICARD-958](https://tickets.metabrainz.org/browse/PICARD-958) - Errors when directory / file names contain unicode characters ## New Feature - [PICARD-42](https://tickets.metabrainz.org/browse/PICARD-42) - AIF support (ID3) - [PICARD-137](https://tickets.metabrainz.org/browse/PICARD-137) - Test and integrate support for "local" cover art into Picard - [PICARD-680](https://tickets.metabrainz.org/browse/PICARD-680) - Display infos (album, artist, tracklist) for clusters without release match - [PICARD-691](https://tickets.metabrainz.org/browse/PICARD-691) - Add download plugin functionality to existing UI - [PICARD-738](https://tickets.metabrainz.org/browse/PICARD-738) - Fallback on album artist's tags if no tags are found for album - [PICARD-743](https://tickets.metabrainz.org/browse/PICARD-743) - Add m2a as a supported extension - [PICARD-756](https://tickets.metabrainz.org/browse/PICARD-756) - MusicBrainz/AcoustID entities should be hyperlinked in Picard - [PICARD-769](https://tickets.metabrainz.org/browse/PICARD-769) - Support key tag - [PICARD-901](https://tickets.metabrainz.org/browse/PICARD-901) - Export / import settings - [PICARD-927](https://tickets.metabrainz.org/browse/PICARD-927) - Search releases from within a Picard dialog - [PICARD-928](https://tickets.metabrainz.org/browse/PICARD-928) - Searching tracks and displaying similar tracks in a dialog box - [PICARD-929](https://tickets.metabrainz.org/browse/PICARD-929) - Search for artists from dialog ## Task - [PICARD-717](https://tickets.metabrainz.org/browse/PICARD-717) - Picard default name files script refinement - [PICARD-760](https://tickets.metabrainz.org/browse/PICARD-760) - Update Picard logo/icons - [PICARD-779](https://tickets.metabrainz.org/browse/PICARD-779) - Link to the Scripting documentation on the Scripting options page - [PICARD-835](https://tickets.metabrainz.org/browse/PICARD-835) - Remove contrib/plugins from the repository - [PICARD-841](https://tickets.metabrainz.org/browse/PICARD-841) - Raise the required mutagen version to 1.22 - [PICARD-861](https://tickets.metabrainz.org/browse/PICARD-861) - Renaming save_only_front_images_to_tags option to something more appropriate - [PICARD-895](https://tickets.metabrainz.org/browse/PICARD-895) - Allow translators to finalize translations before releasing Picard 1.4 - [PICARD-904](https://tickets.metabrainz.org/browse/PICARD-904) - Raise the required Python version to 2.7. - [PICARD-912](https://tickets.metabrainz.org/browse/PICARD-912) - Bump Picard’s copyright date - [PICARD-982](https://tickets.metabrainz.org/browse/PICARD-982) - Add Norwegian to UI languages - [PICARD-652](https://tickets.metabrainz.org/browse/PICARD-652) - Provide ~video variable for video tracks - [PICARD-708](https://tickets.metabrainz.org/browse/PICARD-708) - Improve error logging on AcoustId submission ## Improvement - [PICARD-22](https://tickets.metabrainz.org/browse/PICARD-22) - Link to Picard Scripting page under 'File Naming' - [PICARD-116](https://tickets.metabrainz.org/browse/PICARD-116) - Restore default settings button/s - [PICARD-133](https://tickets.metabrainz.org/browse/PICARD-133) - Speed of Ogg tag writing/updating - [PICARD-207](https://tickets.metabrainz.org/browse/PICARD-207) - Allow adding/removing tags to be preserved from context menu in the tag diff pane - [PICARD-210](https://tickets.metabrainz.org/browse/PICARD-210) - Make it easier to remove everything currently loaded in Picard - [PICARD-222](https://tickets.metabrainz.org/browse/PICARD-222) - Bring back keyboard shortcuts for editing tags - [PICARD-229](https://tickets.metabrainz.org/browse/PICARD-229) - Case sensitivity for "Move additional files" option - [PICARD-253](https://tickets.metabrainz.org/browse/PICARD-253) - Metadata comparison box shows that it intends to write (and has written) tags unsupported by underlyingfile format - [PICARD-267](https://tickets.metabrainz.org/browse/PICARD-267) - Add more descriptive tooltips to buttons - [PICARD-268](https://tickets.metabrainz.org/browse/PICARD-268) - Allow musicip_puid and acoustid_id to be cleared from tags - [PICARD-287](https://tickets.metabrainz.org/browse/PICARD-287) - Make it possible to remove existing tags without clearing all tags - [PICARD-291](https://tickets.metabrainz.org/browse/PICARD-291) - Disable recurse subdirectories should be added - [PICARD-305](https://tickets.metabrainz.org/browse/PICARD-305) - display how many "pending files" left on lookup - [PICARD-307](https://tickets.metabrainz.org/browse/PICARD-307) - Handle MP3 TSST/TIT3 (subtitle) tags better with ID3v2.3 - [PICARD-353](https://tickets.metabrainz.org/browse/PICARD-353) - Customisable toolbars - [PICARD-359](https://tickets.metabrainz.org/browse/PICARD-359) - Ignore file extension and try to read anyway - [PICARD-384](https://tickets.metabrainz.org/browse/PICARD-384) - Make it possible to unset all performer (etc) tags - [PICARD-388](https://tickets.metabrainz.org/browse/PICARD-388) - Progress tracking - [PICARD-404](https://tickets.metabrainz.org/browse/PICARD-404) - Add ability to handle multiple tagger scripts - [PICARD-476](https://tickets.metabrainz.org/browse/PICARD-476) - the option "select all" to save - [PICARD-514](https://tickets.metabrainz.org/browse/PICARD-514) - Option to load only audio tracks, i.e. not DVD-Video, CD-ROM tracks - [PICARD-615](https://tickets.metabrainz.org/browse/PICARD-615) - Picard should use OAuth for authentication - [PICARD-648](https://tickets.metabrainz.org/browse/PICARD-648) - Improvements to WMA tags - [PICARD-678](https://tickets.metabrainz.org/browse/PICARD-678) - Only ask to "log in now" once per session - [PICARD-683](https://tickets.metabrainz.org/browse/PICARD-683) - Show codec info for MP4 files - [PICARD-692](https://tickets.metabrainz.org/browse/PICARD-692) - "Play File" button should be renamed to "Open in Player" - [PICARD-695](https://tickets.metabrainz.org/browse/PICARD-695) - ID3 padding not reduced can result in large files - [PICARD-705](https://tickets.metabrainz.org/browse/PICARD-705) - Set option 'caa_approved_only' disabled by default - [PICARD-707](https://tickets.metabrainz.org/browse/PICARD-707) - Validate fpcalc executable in options - [PICARD-733](https://tickets.metabrainz.org/browse/PICARD-733) - Improve File Naming options - Add --long-version/-V option, outputting third parties libs versions as well as Picard version PICARD-734) - [PICARD-740](https://tickets.metabrainz.org/browse/PICARD-740) - missing info in the help file - [PICARD-773](https://tickets.metabrainz.org/browse/PICARD-773) - Pass command-line arguments to QtApplication - [PICARD-777](https://tickets.metabrainz.org/browse/PICARD-777) - Use the more detailed icons in more places on windows - [PICARD-794](https://tickets.metabrainz.org/browse/PICARD-794) - Use .ini configuration file on all platforms - [PICARD-806](https://tickets.metabrainz.org/browse/PICARD-806) - Use python2 shebang as of PEP 0394 - [PICARD-808](https://tickets.metabrainz.org/browse/PICARD-808) - Display existing covers in File Info dialog - [PICARD-818](https://tickets.metabrainz.org/browse/PICARD-818) - Use HTTPS for external links - [PICARD-838](https://tickets.metabrainz.org/browse/PICARD-838) - Install a scalable icon - [PICARD-852](https://tickets.metabrainz.org/browse/PICARD-852) - Use HTTPS for requests to the plugins API on picard.musicbrainz.org - [PICARD-864](https://tickets.metabrainz.org/browse/PICARD-864) - Use magic numbers to determine the audio file types instead of relying on extensions - [PICARD-883](https://tickets.metabrainz.org/browse/PICARD-883) - Multi-scripting UI is very basic - [PICARD-887](https://tickets.metabrainz.org/browse/PICARD-887) - Allow scripting functions to have arbitrary number of arguments - The "Restore defaults" confirmation buttons should follow the quit confirmation dialog in style PICARD-890) - [PICARD-896](https://tickets.metabrainz.org/browse/PICARD-896) - Replace submit icon with AcoustID logo - [PICARD-897](https://tickets.metabrainz.org/browse/PICARD-897) - Rename "Submit" button to "Submit AcoustIDs" - [PICARD-898](https://tickets.metabrainz.org/browse/PICARD-898) - Use UTF-8 for ID3v2.4 by default instead of UTF-16 - [PICARD-902](https://tickets.metabrainz.org/browse/PICARD-902) - Restore defaults is slightly broken for tags option page - [PICARD-908](https://tickets.metabrainz.org/browse/PICARD-908) - Rearrange the action toolbar icons from left to right according to the expected user-flow - [PICARD-913](https://tickets.metabrainz.org/browse/PICARD-913) - Add tooltips to “Restore all Defaults” and “Restore Defaults” - [PICARD-918](https://tickets.metabrainz.org/browse/PICARD-918) - Make PICARD-883 UI have adjustable widths for list of scripts and script content - [PICARD-919](https://tickets.metabrainz.org/browse/PICARD-919) - Move Options/Advanced/Scripting to Options/Scripting - [PICARD-921](https://tickets.metabrainz.org/browse/PICARD-921) - Move UI options page up the options tree - [PICARD-923](https://tickets.metabrainz.org/browse/PICARD-923) - Add `$startswith` and `$endswith` string functions - [PICARD-924](https://tickets.metabrainz.org/browse/PICARD-924) - Make list of scripts smaller than script text by default - [PICARD-944](https://tickets.metabrainz.org/browse/PICARD-944) - Wait for save thread pool to be finished before exit - [PICARD-970](https://tickets.metabrainz.org/browse/PICARD-970) - New guess format functionality should use explicit buffer size # Version 1.3.2 - 2015-01-07 - Bugfix: Fixed tags from filename dialog not opening on new installations # Version 1.3.1 - 2014-12-20 ## Bug Fixes - [PICARD-273](https://tickets.metabrainz.org/browse/PICARD-273) - Picard should use the correct Accept header when talking to web services. - [PICARD-589](https://tickets.metabrainz.org/browse/PICARD-589) - Picard refuses to load files if any path component happens to be hidden - [PICARD-642](https://tickets.metabrainz.org/browse/PICARD-642) - ConfigUpgradeError: Error during config upgrade from version 0.0.0dev0 to 1.0.0final0 - [PICARD-649](https://tickets.metabrainz.org/browse/PICARD-649) - Windows installer sets working directory to `%PROGRAMFILES%\MusicBrainz Picard\locale` - [PICARD-655](https://tickets.metabrainz.org/browse/PICARD-655) - Last.fm plus tooltip help elements are all messed up - [PICARD-661](https://tickets.metabrainz.org/browse/PICARD-661) - Regression: Tagger script for cover art filename does not work anymore - [PICARD-662](https://tickets.metabrainz.org/browse/PICARD-662) - Retrieving collections causes AttributeError: release_list - [PICARD-663](https://tickets.metabrainz.org/browse/PICARD-663) - Artist name makes it impossible to save ## Improvements - [PICARD-658](https://tickets.metabrainz.org/browse/PICARD-658) - Support the new pregap and data tracks - [PICARD-659](https://tickets.metabrainz.org/browse/PICARD-659) - Set the originalyear tag when loading a release - [PICARD-665](https://tickets.metabrainz.org/browse/PICARD-665) - Web service calls to ports 80 and 443 do not need explicit port specification. 443 should be automatically made https. # Version 1.3 - 2014-10-20 - The "About" window now displays the versions of libraries used by Picard - Picard now correctly handles matching of MP3 files saved in ID3v2.3 tags (which is the version that Microsoft Windows and iTunes both use). Note: You may need to re-save your tags once to get them to match in future. - A sort tags plugin is now provided as tag data is no longer displayed sorted by default. - A new tag, musicbrainz_releasetrackid, containing the MusicBrainz Track MBID introduced in the May 2013 schema change release, is now written to files. - [PICARD-515](https://tickets.metabrainz.org/browse/PICARD-515) - Add `%_recordingtitle%` - [PICARD-444](https://tickets.metabrainz.org/browse/PICARD-444) - Fix plugin install bugs - [PICARD-516](https://tickets.metabrainz.org/browse/PICARD-516) - Fix Options / File naming examples to handle primary/secondary release types - A new advanced option is available to permanently set the starting directory for the file browser and "Add files/folder" buttons. - [PICARD-337](https://tickets.metabrainz.org/browse/PICARD-337) - Requests to Musicbrainz against your own account e.g. for collections are now handled through SSL - Refresh of Albums using Ctrl-R and selection of Other Releases are now more responsive during batch lookups. - Main window is now emitting a "selection_updated" signal, plugin api version bumps to 1.3.0 - Append system information to user-agent string - Compilation tag/variable functionality (for tagging & file naming) has been split into two: - `%compilation%` is now aligned with iTunes, and set only for Various Artists type compilations - `%_multiartist%` variable now indicates whether this release has tracks by multiple artists (in order to prepend the artist name to the filename as shown in the default file naming script) - [PICARD-123](https://tickets.metabrainz.org/browse/PICARD-123) - autodetect the CD drive on Mac OS X - [PICARD-528](https://tickets.metabrainz.org/browse/PICARD-528) - Ignore directories and files while indexing when show_hidden_files option is set to False - [PICARD-528](https://tickets.metabrainz.org/browse/PICARD-528) - Add ignore_regex option which allows one to ignore matching paths, can be set in Options > Advanced - Added an "artists" multi-value tag to track metadata, based on the one in Jaikoz, which contains the individual artist names from the artist credit. Also useful in scripts (joining phrases like 'feat:' are omitted) and plugins. - Added `%_artists_sort%`, `%_albumartists%`, `%_albumartists_sort%` variables for scripts and plugins. - [PICARD-205](https://tickets.metabrainz.org/browse/PICARD-205) - Made Picard use the country names also used on the MusicBrainz website - New setup.py command `get_po_files` (Retrieve po files from transifex) - New setup.py command `regen_pot_file` (Regenerate po/picard.pot) - New Work tag (which for Classical music is often different from the track title) saved as ID3 TOAL tag. - New Composer Sort Order tag (variable `%composersort%`). - Improve the Other Releases list to prioritise and separate releases which match the correct number of tracks and your Options / Metadata / Preferred Releases settings for Country and Format. - New `%_absolutetracknumber%` variable numbering tracks sequentially regardless of disc structure (so you can numbers tracks on multi-disc releases without a disc number) - Support dropping image directly from Google image results to cover art box - Add `%_musicbrainz_tracknumber%` to hold track # as shown on MusicBrainz release web-page e.g. vinyl/cassette style A1, A2, B1, B2 - [PICARD-218](https://tickets.metabrainz.org/browse/PICARD-218) - Show the ID3 version of the file in the Info... dialog (Ctrl-I) - [PICARD-112](https://tickets.metabrainz.org/browse/PICARD-112) - Fixed a bug where Picard crashed if a MP3 file had malformed TRCK or TPOS tags - [PICARD-566](https://tickets.metabrainz.org/browse/PICARD-566) - Add --files option to setup.py build_ui, used to force .ui to .py regeneration - New setup.py command `update_constants` (Regenerate countries.py and attributes.py) - Made Picard use release groups, medium formats and cover art types also used on the MusicBrainz website - Use MusicBrainz Server translations for release groups, medium formats and cover art types - Add checkbox to toggle debug at runtime in log/debug view dialog - Add a plugin to add Artist Official Homepage relationships to the website tag (ID3 WOAR tag) - Add integrated functions `$eq_any`, `$ne_all`, `$eq_all`, `$ne_any`, `$swapprefix` and `$delprefix`. - Add `%_performance_attributes%`, containing performance attributes for the work e.g. live, cover, medley etc. Use `$inmulti` in file naming scripts i.e. `$if($inmulti(%_performance_attributes%,medley), (Medley),)` - Add optional `priority` parameter to `register_album_metadata_processor()` and `register_track_metadata_processor()` Default priority is `PluginPriority.NORMAL`, plugins registered with `PluginPriority.HIGH` will be run first, plugins registered with `PluginPriority.LOW` will run last - Add Standardise Performers plugin to convert e.g. Performer [piano and guitar] into Performer [piano] and Performer [guitar]. - [PICARD-418](https://tickets.metabrainz.org/browse/PICARD-418), [PICARD-53](https://tickets.metabrainz.org/browse/PICARD-53) - Add support for release group cover art fallback - Add a clear button to search box - [PICARD-631](https://tickets.metabrainz.org/browse/PICARD-631) - Honour preferred release formats when matching AcoustIds - [PICARD-630](https://tickets.metabrainz.org/browse/PICARD-630) - Prevent ZeroDivisionError in some rare cases # Version 1.2 - 2013-03-30 - Picard now requires at least Python 2.6 - Removed support for AmpliFIND/PUIDs - Add support for the Ogg Opus file format - It's now possible to download cover images without any plugin. Cover Art Archive images can be downloaded by image type - Improved directory scanning performance - Prefer already-loaded releases of the same RG when matching files - Allow dropping new files onto specific targets - [PICARD-84](https://tickets.metabrainz.org/browse/PICARD-84) - Add basic collections management support - [PICARD-349](https://tickets.metabrainz.org/browse/PICARD-349) - Allow adding custom tags in the tag editing dialog - [PICARD-393](https://tickets.metabrainz.org/browse/PICARD-393) - Fix replacing of Windows-incompatible characters - [PICARD-240](https://tickets.metabrainz.org/browse/PICARD-240) - Save both primary and secondary release types - [PICARD-391](https://tickets.metabrainz.org/browse/PICARD-391) - Handle errors from the AcoustID service better - [PICARD-378](https://tickets.metabrainz.org/browse/PICARD-378) - Accept HTTPS URLs on drag-and-drop # Version 1.1 - 2012-09-03 - Always show basic tags in metadata comparison box, even if empty (title, artist, album, tracknumber, ~length, date) (PICARD-201) - [PICARD-82](https://tickets.metabrainz.org/browse/PICARD-82) - Fixed AcoustID submission failure after removing files from Picard - [PICARD-194](https://tickets.metabrainz.org/browse/PICARD-194) - Allow multi-select in new MetaDataBox for delete/remove tags - [PICARD-104](https://tickets.metabrainz.org/browse/PICARD-104) - File browser remembers last directory/no longer crashes on OS X - [PICARD-11](https://tickets.metabrainz.org/browse/PICARD-11) - Removed the "Run Picard" option from the Windows installer - [PICARD-220](https://tickets.metabrainz.org/browse/PICARD-220) - Refreshing a non-album track correctly clears previous track metadata - [PICARD-217](https://tickets.metabrainz.org/browse/PICARD-217) - Fixed the preserved tags setting for tags with uppercase characters - Added a completion box to the preserved tags setting, and clarified how it works - [PICARD-242](https://tickets.metabrainz.org/browse/PICARD-242) - Store lyrics language in tags instead of text representation language - [PICARD-255](https://tickets.metabrainz.org/browse/PICARD-255), [PICARD-256](https://tickets.metabrainz.org/browse/PICARD-256) - Fix various oddities in the metadata comparison box # Version 1.0 - 2012-06-02 - [PICARD-43](https://tickets.metabrainz.org/browse/PICARD-43) - New UI: Extended comparison of existing vs. MB metadata & tags - Merged the renaming and moving options pages - [PICARD-159](https://tickets.metabrainz.org/browse/PICARD-159) - Removed the VA file naming format option (there is now a single format option) - Add `%license%` tag - [PICARD-21](https://tickets.metabrainz.org/browse/PICARD-21) - Made `%writer%` available to tagger scripts and plugins with contents of songwriter - [PICARD-139](https://tickets.metabrainz.org/browse/PICARD-139) - Allow two multi-valued variables to be merged in tagger scripting - [PICARD-147](https://tickets.metabrainz.org/browse/PICARD-147) - Allow multi-valued variables to be transformed in tagger script and then set back in tags as multi-valued - [PICARD-138](https://tickets.metabrainz.org/browse/PICARD-138) - Fix `$copy` not preserving multi-value variables as documented - [PICARD-148](https://tickets.metabrainz.org/browse/PICARD-148) - Load/save free-text tags for ID3 as TXXX frames - [PICARD-88](https://tickets.metabrainz.org/browse/PICARD-88) - Fix writing of MusicBrainz Work Id / musicbrainz_workid to tags - [PICARD-27](https://tickets.metabrainz.org/browse/PICARD-27) - Handle mimetype for embedding cover art from EXIF jpegs - Change cover art box to open MusicBrainz release rather than Amazon - Support manual drag-and-drop of cover art onto a release via cover art box - [PICARD-190](https://tickets.metabrainz.org/browse/PICARD-190) - Only open browser on left-click of cover art box - [PICARD-186](https://tickets.metabrainz.org/browse/PICARD-186) - Fix Lookup in Browser (previously 'tag lookup') for clusters - Lookup in Browser will now not use MBIDs to lookup unmatched files/clusters - [PICARD-198](https://tickets.metabrainz.org/browse/PICARD-198) - Add Date/Country to CD Lookup results dialog - [PICARD-4](https://tickets.metabrainz.org/browse/PICARD-4) - Fix/reset album folksonomy tag counts while refreshing releases - Plugins actions can now create sub-menus using the MENU class attribute - New plugin hook `register_clusterlist_action` - [PICARD-191](https://tickets.metabrainz.org/browse/PICARD-191) - Display the port Picard is listening on at bottom right status bar - [PICARD-33](https://tickets.metabrainz.org/browse/PICARD-33) - Make album drops from right hand pane to left default to "unmatched files" again - [PICARD-75](https://tickets.metabrainz.org/browse/PICARD-75) - Remove .DS_Store, desktop.ini, and Thumbs.db from otherwise empty directories - [PICARD-200](https://tickets.metabrainz.org/browse/PICARD-200) - Update artist translation to use new alias features (primary flag, sort names) - [PICARD-165](https://tickets.metabrainz.org/browse/PICARD-165) - Deleted tags aren't indicated as changes - [PICARD-45](https://tickets.metabrainz.org/browse/PICARD-45) - Picard log entries have inaccurate timestamp - [PICARD-103](https://tickets.metabrainz.org/browse/PICARD-103) - Interface doesn't allow keyboard only management - [PICARD-31](https://tickets.metabrainz.org/browse/PICARD-31) - Added option to preserve timestamps of tagged files - [PICARD-99](https://tickets.metabrainz.org/browse/PICARD-99) - Added keyboard shortcut to reload release - [PICARD-91](https://tickets.metabrainz.org/browse/PICARD-91) - Medium formats weren't listed in order in the "Other versions" menu - [PICARD-74](https://tickets.metabrainz.org/browse/PICARD-74) - Couldn't select multiple directories in "Add Folder" window on OS X # Version 0.16 - 2011-10-23 - Added AcoustID support. - Fixed track metadata plugins. - [PICARD-16](https://tickets.metabrainz.org/browse/PICARD-16) - Added new internal `%_totalalbumtracks%` tag field. - [PICARD-7](https://tickets.metabrainz.org/browse/PICARD-7) - Track metadata plugins now run also on non-album tracks. - [PICARD-5](https://tickets.metabrainz.org/browse/PICARD-5) - Fixed custom Various Artists name on the `%albumartist%` field. - [PICARD-1](https://tickets.metabrainz.org/browse/PICARD-1) - Album artist is now correctly "translated". - Unicode punctuation is now converted to ASCII by default. - [PICARD-15](https://tickets.metabrainz.org/browse/PICARD-15) - WavPack correction files are moved together with the main files. - Unicode filename normalization on OS X. - Original release date is now saved into `%originaldate%`. - [PICARD-17](https://tickets.metabrainz.org/browse/PICARD-17) - Allow tagging with localized artist aliases - [PICARD-46](https://tickets.metabrainz.org/browse/PICARD-46) - Added a quit confirmation dialog. - [PICARD-10](https://tickets.metabrainz.org/browse/PICARD-10) - Standalone recordings can be tagged with relationships now. - [PICARD-8](https://tickets.metabrainz.org/browse/PICARD-8) - Refreshing an album will refresh its "other versions" listing. - [PICARD-50](https://tickets.metabrainz.org/browse/PICARD-50) - "Unicode punctuation to ASCII" now works on album-level metadata. - [PICARD-20](https://tickets.metabrainz.org/browse/PICARD-20) - DJ-mix tags should only be written to the medium where they apply. - [PICARD-54](https://tickets.metabrainz.org/browse/PICARD-54) - Support URL redirects in web service/network request module - [PICARD-52](https://tickets.metabrainz.org/browse/PICARD-52) - Jamendo and Archive.org cover art is displayed on web page, but not loaded by Picard plugin - [PICARD-13](https://tickets.metabrainz.org/browse/PICARD-13) - Edits to metadata in "Details..." menu not reflected in UI - [PICARD-14](https://tickets.metabrainz.org/browse/PICARD-14) - The status bar/new metadata box is updated when a selected file/track is changed. # Version 0.15.1 - 2011-07-31 - "Other versions" menu now displays release labels and catalog numbers. - Added CD-R, 8cm CD to the format mapping. - Picard no longer fails to load releases with new or unknown media formats. - Threading issues that could occasionally cause Picard to stop loading files have been fixed. - Fixed album metadata processor plugins not working (#5960) - Fixed loading of standalone recordings (#5961) - Fixed requests stopping at midnight (#5963) - Stopped using QDateTime for timing requests (for Qt 4.6 compatibility) (#5967) - Fixed display of ampersands in the "other versions" menu. (#5969) - Fixed use of numerical functions in advanced scripting. # Version 0.15 - 2011-07-17 - Added options for using standardized track, release, and artist metadata. - Added preferred release format support. - Expanded preferred release country support to allow multiple countries. - Added support for tagging non-album tracks (standalone recordings). - Plugins can now be installed via drag and drop, or a file browser. - Added several new tags: `%_originaldate%`, `%_recordingcomment%`, and `%_releasecomment%` - Changes to request queuing: added separate high and low priority queues for each host. - Tagger scripts now run after metadata plugins finish (#5850) - The "compilation" tag can now be `$unset` or modified via tagger script. - Added a shortcut (Ctrl+I) for Edit->Details. - Miscellaneous bug fixes. # Version 0.15beta1 - 2011-05-29 - Support for the NGS web service # Version 0.14 - 2011-05-15 - Fixed a problem with network operations hanging after a network error (#5794, #5884) - ID3v2.3 with UTF-16 is now the default ID3 version - Option to set preferred release types for improved album matching - Added support for sorting the album/file lists (#75) - Fixed OptimFROG tag reading (#5859) - Fixed colors for a white-on-black color scheme (#5846) - Added an option to replace non-ASCII punctuation (#5834) - Support for writing release group and work IDs, currently unused (#5805) - Fixed saving of the release event format tag (#5250) - Added support for the language and script tags (#943) - Plugins can now use track-track relationships (#5849) - Allowed external drives to be visible in the file browser panel on OS X (#5308) # Version 0.13 - 2011-03-06 - Changed Picard icon license to CC by-sa - Small UI consistency changes - Albums with tracks linked to more than one file are never marked as "completed". - Fixed matching of scanned files to tracks while the album is still loading. - Support for properly embedded FLAC pictures - Existing embedded images in APE and ASF files are removed only if there are new images to replace them. - More strict tagger script validation. - Fixed the `$truncate` tagger script function. - Proper rounding of track durations. - Fixed a bug with saving images larger than 64k to WMA files. - Added a `$swapprefix` tagger script function. - Release events with a date are preferred over the ones without a date. - Files that are being saved as marked as pending. - Updated .desktop file to allow opening Picard with multiple files. - Handle the "open file" event on Mac OS X. - Added timeouts to the HTTP web service client. - Fixed a bug with albums missing the expand/collapse icons # Version 0.12.1 - 2009-11-01 - Fixed deletion of all COMM frames in ID3, which was introduced with the iTunNORM fix in Picard 0.12.0. - Restored native add folder dialog. # Version 0.12 - 2009-10-25 - Live syntax checking for tagger script and naming strings. (Nikolai Prokoschenko) - Support ratings. (Philipp Wolfer) - Support for user folskonomy tags. (Lukáš Lalinský) - Embed cover art into APEv2 tags. (Lukáš Lalinský) - Embed cover art into WMA tags. (Philipp Wolfer) - New high quality application icon (Carlin Mangar) - Support for originaldate tag. (Philipp Wolfer) - Restructured file naming options. (Nikolai Prokoschenko) - Added option to select the user interface language. (Philipp Wolfer) - Highlight fully matched albums. (Nikolai Prokoschenko) - New script functions `$matchedtracks()`, `$initials()`, `$firstalphachar()`, `$truncate()` and `$firstwords()` - CD drive dropdown selection on Linux. (Philipp Wolfer) - Add disc ID to album metadata if loaded via disc lookup. (Philipp Wolfer) - Add expand/collapse all actions to tree views. (Philipp Wolfer) - Added DCC media format. - Removed unncecessary and confusing PUID lookup threshold. (Philipp Wolfer) - Fixed saving of copyright in ASF metadata. (#5419, Philipp Wolfer) - Write TRACKTOTAL and DISCTOTAL to vorbis files. (#4088, Philipp Wolfer) - Added keyboard shortcut to toggle file browser (#3954, Philipp Wolfer) - Write ISRCs from MusicBrainz into tags (Philipp Wolfer) - UI improvements on cover art box and icons (Carlin Mangar) - New Windows installer (Carlin Mangar) - New plugin extension point ui_init (Gary van der Merwe) - Updated plugin options page (Carlin Mangar) - Python 2.6 fixes. (Gary van der Merwe) - Fix PUID generation on big endian machines. (Jon Hermansen) - Fix lookup encoding for non latin characters. (#5233, Philip Jägenstedt) - Fix infinite loop when using Qt 4.5. (Lukáš Lalinský) - Ensure 16-byte memory alignment for avcodec, fixes issues with enabled SSE2 instructions. (#5263, Philipp Wolfer) - Use default CD device for disc ID lookups if no device was specified. (Philipp Wolfer) - Preserve file information (bitrate, extension etc.) on saving. (#3236, Philipp Wolfer) - Allow empty release events (#4818, Philipp Wolfer) - Respect the option "clear existing tags" when saving WMA files. (Philipp Wolfer) - Detect image format of cover images. (#4863, Philipp Wolfer) - Don't load CD stubs. (#4251, Philipp Wolfer) - Set match background color relative to the base color. (#4740, Philipp Wolfer) - Fix infinite loop when using Qt 4.5. (Lukáš Lalinský) - Fixed various issues with the PUID submission button. (Philipp Wolfer) - Fixed copy and paste (#5428, Philipp Wolfer) - Fixed loading of files with corrupted PUIDs (#5331, Carlin Mangar) - Fixed redirection handling (Lukáš Lalinský) - Fixed writng of iTunNORM tags in ID3 (Carlin Mangar) - Always restore window position so that the window is visible (Carlin Mangar) - Updated translations. # Version 0.11 - 2008-12-02 - Support for new FFmpeg install locations - Automatically remove whitespaces from MB hostname in options - Release date from MB is now optional - Fixed per-track folksonomy tag support - Evaluate tagger script for album metadata - Show donation info in the about dialog - Support for .oga files (Ogg FLAC, Ogg Speex or Ogg Vorbis) - Fixed loading of performer tags from Vorbis Comments - Load embedded cover art from COVERART/COVERARTMIME Vorbis Comments - Allow setting the "Move Files To" location from the internal file browser - Copy&paste support in the file details dialog - Correct handling of "; " as a separator for sort names - Minimal support for TAK files - Fixed parsing of the "Pseudo-Release" release status - Fixed reading performers with empty role from ID3 tags - Don't allow empty file naming formats - Interactive password dialog - Fixed checking for non-Latin characters when using sort name as the main artist name # Version 0.10 - 2008-07-27 - Fixed crash when reading CD TOC on 64-bit systems - Fixed handling of MP4 files with no metadata - Change the hotkey for help to the right key for OS X - Replace special characters after tagger script evaluation to allow special characters being replaced by tagger script - Actually ignore 'ignored (folksonomy) tags' - Remove dependency on Mutagen 1.13, version 1.11 is enough now - Escape ampersand in release selection (#3748) # Version 0.10.0rc1 - 2008-05-25 - Stop analyzing files that have been removed. (#3352, Gary van der Merwe) - Automatically disable CD lookup if no CD device is specified. (Will Holcomb) - Don't abort directory reading on invalid filename. (#2829, amckinle) - Add an option to select multiple directories from the 'Add Directory' window. (#3541, Will Holcomb) - Avoid scanning files that had been removed from the tagger. (#3352, Gary van der Merwe) - Folksonomy tags/genre support. (Lukáš Lalinský) - Added menu items (with keyboard shortcuts) for CD lookup / Scan / Lookup / Cluster. (Lukáš Lalinský) - Add taggerscript function `$performer()`. (Lukáš Lalinský) - Lower the default PUID lookup threshold to 10%. (Lukáš Lalinský) - Compare tracknumber and totaltracks as numbers, not strings. (Lukáš Lalinský) - Correctly escape special Lucene characters for searches/lookups. (#3448, Lukáš Lalinský) - Use MusicIP Mixer "archived analysis" to speed up PUID lookups. (Lukáš Lalinský) - Add language and script to variables. (#3635, Nikki) - Option to initiate searches with advanced query syntax on by default. (#3526, Lukáš Lalinský) - "Save Tags" item in options menu. (#3519, Lukáš Lalinský) - Create empty "plugins" directory by default on installation. (#3529, Lukáš Lalinský) - Added default release country option. (#3452, Philipp Wolfer) - Added release format type to release selection. (#3074, Philipp Wolfer) - Convert Vorbis tag "tracktotal" to "totaltracks" on load. (Philipp Wolfer) - Save 'arranger' to ID3 tags. (Lukáš Lalinský) - Store cover art in Ogg and FLAC files. (#3647, Hendrik van Antwerpen) - Album title not updated when related 'Unkown files' are modified. (#3682, Hendrik van Antwerpen) - Match selected release event to existing files. (#3687, Hendrik van Antwerpen) - Allow multiple files to be linked to a single track. (#3729, Gary van der Merwe) - Don't use mmap to resize files on Windows. (Lukáš Lalinský) # Version 0.9.0 - 2007-12-16 - More custom tags in MP4 files (compatible with MediaMonkey and Jaikoz) (#3379) - Fixed MP4 fingerprinting on Windows. (#3454, #3374) - Fixed CD lookups on Windows. (#3462, #3362, #3386) - Set the `%compilation%` tag correctly. (#3263) - Fixed location of saved cover art files. (#3345) - The Picard window now won't start as hidden. (#2104, #2429) - Fixed reading of length of MP3 files with VBRI headers. (#3409) - Fixed WMA saving. (#3417) - Fixed saving of comment to ID3 tags. (#3418) - New mapping of "chorus master" AR to "conductor" tag. - Fixed system-wide plugin path on Linux. (#3430) - Use the earliest release date by default. (#3456) # Version 0.9.0beta1 - 2007-10-28 - Save ASIN to MP4 files. - Add a `--disable-locales` option to `setup.py build`. (Santiago M. Mola) - New threading code, should make Picard crash less and be faster. - Replace initial dot in file and directory names. (#3204, Philipp Wolfer) - Fixed caps in the default cover art image. (#3242, Bogdan Butnaru) - Fixed broken naming preview. (#3214, Daniel Bumke) - Re-enable the drag/drop target indicators. (#3106) - Fix adding files and directories from the command line. (#3075) - Don't show the cover art box by default. - Lookup files individually for "Unmatched Files", not as a cluster. # Version 0.9.0alpha14 - 2007-08-05 - Fixed PUID submissions. - Fixed drag&drop from Finder to Picard on Mac OS X. - Don't save files from "Unmatched Files" when saving an album. - Renamed "Analyze" to "Scan", to avoid confusion with MusicIP Mixer analysis. - Added plugin API versioning. Plugins now need to define constant `PLUGIN_API_VERSIONS`, otherwise they won't be loaded. - Added option to overwrite cover art by default. - Never wait more than second for the next HTTP request. - Fixed setting of the "Move Tagged Files To" folder, if the name contains non-ASCII characters. # Version 0.9.0alpha13 - 2007-07-29 ## Bug Fixes - Fixed drag&drop issue on Windows Vista. http://forums.musicbrainz.org/viewtopic.php?id=693 # Version 0.9.0alpha12 - 2007-07-29 ## Changes - "User directory" location changed: - On Windows from "%HOMEPATH%\Local Settings\Application Data\MusicBrainz Picard" to "%HOMEPATH%\Application Data\MusicBrainz\Picard" - On UNIX from "~/.picard" to "$XDG_CONFIG_HOME/MusicBrainz/Picard" (usually "~/.config/MusicBrainz/Picard") - Picard no longer logs every action and doesn't saves the logs. To enable more debug logging, use command line argument "-d" or "--debug" or environment variable "PICARD_DEBUG". - For plugins: - `metadata["~#length"]` is now `metadata.length` - `metadata["~#artwork"]` is now `metadata.images` ## New Features - Save embedded images to MP4 files. - Added option to select release events for albums. - Added internal log viewer. - Track and file context menu hooks for plugins. ## Bug Fixes - Deleting files from clusters increments total time rather than decrementing it. (#2965) - Update metadata boxes and cover art for selected items. (#2498) - Display error message for tracks. - Fixed drag-and-drop bugs on Mac OS X. - Added `%releasecountry%` to the file renaming preview. - Cluster multi-disc albums identified by tags, not (disc x). (#2555) # Version 0.9.0alpha11 - 2007-05-27 ## New Features - Added "Edit" button to the tag editor. ## Bug Fixes - Fixed initialization of gettext translations. # Version 0.9.0alpha10 - 2007-05-27 ## New Features - New TaggerScript function `$len(text)`. (#2843) - Don't compress huge ID3 frames. (#2850) - Move "Add Cluster As Release" to a plugin. - Allow horizontal scrollbar in the file browser panel. (#2856) - Removed "Basic" tab from the "Details" window, "Advanced" tab renamed to "Metadata". - The tag editor can be used to edit multiple files. (#2893) ## Bug Fixes - F1 for Help instead of CTRL+H on Windows and Linux. (#2485, Nikolai Prokoschenko) - Tabbing focus transition from search isn't as expected. (#2546, Nikolai Prokoschenko) - Display an error message if launching a web browser failed. - Fixed web-service error caused PUID submissions. - Change function `$gt()`, `$gte()`, `$lt()`, `$lte()` to compare numbers, not strings. (#2848) - Fixed kfmclient launching under KDE/Python 2.5. - Fixed similarity calculation of non-latin texts. (#2891) - Don't try to auto-analyze files with "loading" errors. (#2862) # Version 0.9.0alpha9 - 2007-05-12 ## New Features - The tag editor now accepts free-text tag names. - Load 'DJ-mixed by' AR data to `%djmixer%` tag. - Load 'Mixed by' AR data to `%mixer%` tag. - Delay the webservice client to do max. 1 request per second. - Sort files in clusters by disc number, track number and file name. (#2547) - Support for any text frame in special variable `%_id3:%`. - Ignore empty ID3 text values. - Windows installer: - Removed DirectX-based decoder. - FFmpeg compiled with AAC (faad2) support. ## Bug Fixes - Save XSOP frame to ID3v2.3 tags. (#2484) - Use attributes like 'guest' or 'additional' also from generic performer ARs. - Fixed capitalization of `%releasetype%` in file naming preview. (#2762) - Fixed 'python setup.py build_ext' if py2app and setuptools are loaded. - ID3v2.3 frame TDAT should be written in format DDMM, not MMDD. (#2770) - Don't display an error on Ogg and FLAC files with no tags. - Remove video files from the list of supported formats. - Always use musicbrainz.org for PUID submissions. (#2764) - Files/Pending Files count not reset/recalculated after removing files. (#2541) - Removed files still get processed during fingerprinting. (#2738) - Read only text values from APEv2 tags. (#2828) # Version 0.9.0alpha8 - 2007-04-15 ## New Features - Notification of changed files in releases. (#2632, #2702) ## Bug Fixes - Don't open the file for analyzing twice. (#2733, #2734) - Save ASIN and release country to ID3 tags. (#2484, #2456) - Variable `%country%` renamed to `%releasecountry%`. - Save release country to MP4 and WMA tags. - Don't take unsupported tags into account when checking if the tags are 'complete' and the file should have 100% match. This fixes problems with showing the green check-marks for file with limited tag formats, like MP4 or WMA. - Ignore missing tag in `$unset()`. # Version 0.9.0alpha7 - 2007-04-14 ## New Features - Remember location in the file browser. (#2618) - Added FFmpeg support on Windows (MP3, Vorbis, FLAC, WavPack and many other audio formats). - Lowercase the extension on file renaming/moving. (#2701) - TaggerScript function `$copy(new,old)` to copy metadata from variable `old` to `new`. The difference between `$set(new,%old%)` is that `$copy(new,old)` copies multi-value variables without flattening them. - Added special purpose TaggerScript variable `%_id3:%` for direct setting of ID3 frames. Currently it supports only TXXX frames in format `%_id3:TXXX:%`, for example: `$copy(_id3:TXXX:PERFORMERSORTORDER,artistsort)`. - Support for WAV files. (#2537) - Removed GStreamer-based decoder. - Implemented `python setup.py install_locales`. ## Bug Fixes - Failed PUID submission deactivates the submit button. (#2673) - Unable to specify album art file name mask. (#2655) - Fixed incorrect copying of album metadata to tracks. (#2698) - Added options to un-hide toolbars. (#2631) - Fixed problem with saving extra performer FLAC tags containing non-ASCII characters. (#2719) - Read only the first date from ID3v2.3 tags. (#2460) - If the remembered directory for add dialogs and file browser was removed, try to find an existing directory in the same path. # Version 0.9.0alpha6 - 2007-04-04 ## New Features - Added option --disable-autoupdate for 'build' and 'install' commands of the setup script. (#2551) - Automatically parse track numbers from file names like 01.flac for better cluster->album matching with untagged files. - Support for the new sorting tags in MP4 tags from iTunes 7.1. - Strip white-space from directory names. (#2558) - When replacing characters with their ascii equivalent, 'ß' should be replaced by 'ss'. (#2610) - Track level performer ARs. (#2561) - Remove leading and trailing whitespace from tags on file saving. (#892, #2665) - Support for labels, catalog numbers and barcodes. ## Bug Fixes - Artist names from ARs should be translated, too. - Freeze after answering no to "download the new version" prompt. (#2542) - `%musicbrainz_albumid%` not working in file renaming. (#2543) - Track time appears to display incorrectly if it's unknown on MusicBrainz. (#2548) - Fixed problem with removing albums/files after submitting PUIDs (#2556) - The user's script should be applied also to album metadata. - Fixed moving of additional files from paths with "special" characters. ## Internals - The browser integration HTTP server rewritten using QTcpServer. # Version 0.9.0alpha5 - 2007-03-18 ## New Features - Replace Æ with AE in file/directory names. (#2512) - "Add cluster as release" (#1049) - Text labels under icon buttons. (#2476) ## Bug Fixes - Fixed fileId generator (caused problems with drag&drop if files with multiple formats are used). - Original Metadata not greyed out when no tracks are attached. (#2461) - Better detecting of the default Windows browser, with fallback to Internet Explorer. (#2502) - Better album/track lookup. (#2521) - File browser stays 'hidden' after first time use. (#2480) - Track length changed in Original Metadata after save. (#2510) - "Send PUIDs" button not disabled after albums are removed. (#2506) - The Windows package now includes JPEG loader to show cover art images correctly. (#2478) # Version 0.9.0alpha4 - 2007-03-09 ## Bug Fixes - Fixed case-insentive file renaming. (#2457, #2513) # Version 0.9.0alpha3 - 2007-03-08 ## New Features - Using of 'performed by' AR types (without instrument or vocal). - The "Replace non-ASCII characters" option will try to remove accents first. (#2466) - Added option to auto-analyze all files. (#2465) ## Bug Fixes - Fixed file clustering. - Added `%albumartistsort%`, `%releasetype%` and `%releasestatus%` to the file naming example (#2458) - Sanitize dates from ID3 tags. (#2460) - Fixed page switching in the options window on error. (#2455) - Correct case-insensitive file renaming on Windows (#1003, #2457) - Relative paths in the "Move files to" option are relative to the current path of the file. (#2454) - Added a .desktop file. (#2470) - Release type and status should be in lower case. (#2489) # Version 0.9.0alpha2 - 2007-03-04 ## New Features - New variable `%_extension%` (#2447) - File naming format tester. (#2448) - Added automatic checking for new versions. ## Bug Fixes - Fixed window position saving/restoring. (#2449) - Fixed iTunes compilation flag saving. (#2450) # Version 0.9.0alpha1 - 2007-03-03 - First release. picard-release-2.3.1/README.md000066400000000000000000000034441362601763300156700ustar00rootroot00000000000000MusicBrainz Picard ================== ![Github Actions Status](https://github.com/metabrainz/picard/workflows/Run%20tests/badge.svg) [![Codacy Grade](https://img.shields.io/codacy/grade/53a33607234a4c18a11a6207d1173c0c/master.svg?style=flat-square&label=Codacy)](https://www.codacy.com/app/MetaBrainz/picard) [MusicBrainz Picard](http://picard.musicbrainz.org) is a cross-platform (Linux/Mac OS X/Windows) application written in Python and is the official [MusicBrainz](http://musicbrainz.org) tagger. Picard supports the majority of audio file formats, is capable of using audio fingerprints ([AcoustIDs](http://musicbrainz.org/doc/AcoustID)), performing CD lookups and [disc ID](http://musicbrainz.org/doc/Disc_ID) submissions, and it has excellent Unicode support. Additionally, there are several plugins available that extend Picard's features. When tagging files, Picard uses an album-oriented approach. This approach allows it to utilize the MusicBrainz data as effectively as possible and correctly tag your music. For more information, [see the illustrated quick start guide to tagging](https://picard.musicbrainz.org/quick-start/). Picard is named after Captain Jean-Luc Picard from the TV series Star Trek: The Next Generation. Binary downloads are available [here](http://picard.musicbrainz.org/downloads/). Support and issue reporting --------------------------- Please report all bugs and feature requests in the [MusicBrainz issue tracker](https://tickets.metabrainz.org/browse/PICARD). If you need support in using Picard please read the [documentation](https://picard.musicbrainz.org/docs/) first and have a look at the [MusicBrainz community forums](https://community.metabrainz.org/c/picard). Installing --------------------------- [INSTALL.md has instructions on building this codebase.](INSTALL.md) picard-release-2.3.1/RELEASING.md000066400000000000000000000044071362601763300162440ustar00rootroot00000000000000# Picard release process ## Release preparation (few weeks/days before) ### Synchronize picard.pot with sources ```bash python setup.py regen_pot_file && git diff --quiet || git commit -m 'Update pot file' -- po/picard.pot ``` And push changes to main remote repository, see [po/README.md](po/README.md) for details about translations ## Ensure git repository tree is clean From the local repository: ### Check out the repo master branch ```bash git fetch $PICARD_REMOTE && git checkout master ``` ### Ensure nothing is on the way ```bash git reset --hard $PICARD_REMOTE/master && git clean -f -d ``` #### Remove old compiled modules ```bash find . -type f -name '*.pyc' -exec rm -f {} \; ``` ### Tag to save the current state ```bash git tag "before-release-$PICARD_VERSION" --force ``` ### Remove any BOM nasty bytes from files This shouldn't be needed, but better to check before releasing ```bash git ls-tree --full-tree -r HEAD --name-only |while read f; do sed -i '1s/^\xEF\xBB\xBF//' "$f"; done && git diff --quiet || git commit -a -m 'Remove nasty BOM bytes' ``` ## Get latest translations from Transifex ```bash python setup.py get_po_files && git diff --quiet || git commit -m 'Update .po files' -- po/ ``` ## Synchronize generated consts ```bash python setup.py update_constants && git diff --quiet || git commit -a -m 'Update constants' -- picard/const/*.py ``` ## Update NEWS.txt TODO: explain how ## Update Picard version Edit `picard/__init__.py` and set new version tuple Run tests: ```bash python setup.py test ``` Commit changes! ## Tag new version ```bash git tag -s "$PICARD_RELEASE_TAG" -m "Release $PICARD_VERSION" ``` Stable release tags have the following format: `release-#.#.#` Example: `release-2.1.0` ## Update Picard version to next dev version Edit `picard/__init__.py` and set new dev version tuple. Run tests: ```bash python setup.py test ``` Commit changes! ## Push new commits and tags to remote ```bash git push "$PICARD_REMOTE" master:master git push "$PICARD_REMOTE" tag "$PICARD_RELEASE_TAG" ``` ### To revert after push ```bash git tag -d "release-$PICARD_VERSION" git reset --hard "before-release-$PICARD_VERSION" git push "$PICARD_REMOTE" :"$TAG" git push "$PICARD_REMOTE" "before-release-$PICARD_VERSION":master --force ``` picard-release-2.3.1/appxmanifest.xml.in000066400000000000000000000076751362601763300202510ustar00rootroot00000000000000 %(display-name)s MetaBrainz Foundation Inc. Picard is an open-source cross-platform music tagger by MusicBrainz. It has the ability to identify audio files even without any existing metadata. Square70x70Logo.png .aac .ac3 .aif .aifc .aiff .ape .asf .dff .dsf .flac .kar .m2a .m4a .m4b .m4p .m4v .mid .mp+ .mp2 .mp3 .mp4 .mpc .ofr .ofs .oga .ogg .ogv .opus .spx .tak .tta .wav .wma .wmv .wv picard-release-2.3.1/installer/000077500000000000000000000000001362601763300164015ustar00rootroot00000000000000picard-release-2.3.1/installer/images/000077500000000000000000000000001362601763300176465ustar00rootroot00000000000000picard-release-2.3.1/installer/images/hx.bmp000066400000000000000000000623321362601763300207730ustar00rootroot00000000000000BMd6(9d ϞآNw;tafyww;t;t=vy‡'~wwww;t;t;t;tEz뙮Рƒ4wwwwww;t;t;t;t;t;tS١Lwwwwwwww;t;t;t;t;t;t;t;teiywwwwwwwww;t;t;t;t;t;t;t;t;t>v냡'}wwwwwwwwwww;t;t;t;t;t;t;t;t;t;t;tG{뜰Οē2wwwwwwwwwwwww;t;t;t;t;t;t;t;t;t;t;t;t;tUݠLwwwwwwwwwwwwwww;t;t;t;t;t:r8m9r;t:s7n9q;t;t;tldywwwwwwwwwwwwwwww1_5h8n9o3e.X=f,V/\.Zv뇢}%}wwwwwwwwwwwwwwwwwwZ7a2[pY;t;t;t;t;tH{족Хȓ5wwwwwwwwwwwwwwwwwwww;t;t;t;t;t;t;t]Jwwwwwwwwwwwwww|owwwwwwwAy넲s;r;t;t뎹Js۩;t;t;t;t;t;t;t;tw1]6j;t;t;t;t;t;o:p;t;tK}%}wwwakkkkhgkkkkk<wwwwww;t;t;t;t;stS|8n;t;t;t;t`rq`;t;tK}%}wwwQkkkkkkkkkkkKwwwwww;t;t;t;t;rL};t;t;t;tPQ;t;tK}%}wwwBkkkkkkkkkkk[vwwwww;t;t;t;tO{Jtw;t;t;t:qEp;t;t;tK}%}www4kkkkkkkkkkkhswwwww;t;t;t;t=vZ;t;t;r5bٷR?w;t;t;t;tK}%}www%kkkkkkkkkkkk(zwwwww;t;t;t;t;t\t;t;t:q3aڨk;t;t;t;t;t;tK}%}wwwxfkkkkkkkkkkk6wwwww;t;t;t;t;t;t;t;t;t;t9p4`أ|;t;t;t;t;t;t;tK}%}wwwwVkkkkkkkkkkkFwwwww;t;t;t:s7m6j6j6k5h2c:dֲ};t;t;t;t;t;t;t;tK}%}wwwwHkkkkkkkkkkkTwwwww;t;t8o.ZCmOxOxOxYzn;t;t8n1a1a8o;t;t;tK}%}wwww9kkkkkkkkkkkdtwwww;t8nhؾpppitdv뇢ݠLwwwwwwwwwwwwwww;t;t;t;t;t;t;t;t;tv냡١Lwwwwwwww;t;t;t;t;t;t;t;teРƒ4wwwwww;t;t;t;t;t;tQ‡'~wwww;t;t;t;tEz뙮fyww;t;t=uyآNw;taϞpicard-release-2.3.1/installer/images/installer-header.svg000066400000000000000000000630501362601763300236160ustar00rootroot00000000000000 image/svg+xml picard-release-2.3.1/installer/images/installer-wizard.svg000066400000000000000000001034001362601763300236600ustar00rootroot00000000000000 image/svg+xml picard-release-2.3.1/installer/images/tango-install.ico000066400000000000000000001176421362601763300231310ustar00rootroot0000000000000000v h G.00 %d   h:(0`eefijimnnmmqpppwwwssxvvzzzz{~}}}})')(##$$637796 LHZZ\\AANQ`[lcaaefjlssttvvyy{sww{{||{~{ŶøŻŽȻʾͿ¿ÿĿľ¹ſſ¹Ľ300.0172 9|ǯ}I0 2 Kÿƽm2  1: ))))('?3úuqK.㦦@ %{n`vJ6宦!ؼkgov6䮦A9ߧ~tjiljtw6宮"ԕ_fHFGhzy9寮B/ĿeES~|T岮#IʛQ-zO`3岯Dpٻ< QW0岲#̬b+[aV3彲Dɧb\* VX3彽$pƧ^[5\b1ŽRIDz]P>4&3Ž$/ǽxNLP=MTŽůcѽ]NPYZq;Ů$9䲦||}sos3Ųdϣ||:Ů$ %Ų|||Iǽp3}6ǯ33Ǧm7}6I6 Dz33:pǮU6:ǀp;769Kϲ6ǍϽ6ǣѽ7ϣ7 U13TK,1J; 0;9::::::::::::::::::::::7tYtYtYtYtYtYtYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY( @```fffhhhilkmonorqpppvvv}~~ NNaa~~~~wwxx~~ddº¾ǿûޏƽȽȾp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq"#gxe9#xth`\(UUTthZW?@9]]]] e_XV6D)3NFv|yyyif fyfJ'Drruv~~]:yyyy i[B://4o"z{yyf ]{E:B[]i{&{{{{ iiB[]fi{{{iEyii{{{{"![y##y{**{y{%%"#!!!!!!!!!!!!!!! ??( SWUKM{X[sehgfiljmmlonnqpprrqtsruuuuu~>?egQq/Pp",6@J[1qQq/Pp  =1[Qyq/"P0p=LYgx1Qq&/@PZpt1Qq/&PAp[tϩ1Qq/P"p0>M[iy1Qqұ/Pp  >1\Qzq/Pp!+6@IZ1pQq/ P6pLbx1Qq,/KPip1Qq/-P?pRcv1Qqϑܱ/Pp!&,>X1qQq673,0'%3//0'?41&3  3***910$/  4++* 50.$* )4+,+#1+'%'+.04,-, 9+%)4---"4$%(*.3..- 9-**+/3...'!29943./. 6666, 3///)6666666637/0/ 6666666636433077777777330-+++++++++PNG  IHDR\rfGIDATx1 g^}V8YDĕ`)麻츻[FHHQ[xlu}tߞOvg?###"L#s`@#`W7p0*0~0&{8Ч Xɘ#?>A  >7e#P@wp5Ɖq14AHG:)Jtra!t&!s:lllF {G}@499IgəWn24lnnF nN_&&& C.=2y3+N2!#<]#߅zDPx\pCfRo\A* ""NTE _*t\_e6RQ,懍@d;lrs&; ~RXVOFGGqCZC8gzN_UD46M6!@tVV׊DBiG@J FMZH\ɉ=Ѩk1X\7qYf!{cK|\ǿ@͛7j@KG:m=vSDC0d<\?@kW۝]~ye?Xt:)]6.E#]|oWV5Tz zӐppG{7 .@ׅ^_m}Ev AOClnrg+uGZebLJQzUUe#p+=&~:vQ:Ř.݀VnWDwJQ_Ajҡk/h4Kx^}ݭ!_&9$Z`;g fљzuɋzQo肊+3xQT 33+}'N[u(B0/W修_(aֈd7L0kS7=Z l&&b` n0cvՊļEjp^=ئxU \?R\glMx)( 8M.3pW Vzr|g2*ܣ"olV.6~ۍ55 rp8dT*bH7NPH& R"^?/ DP2쬩t0nWd\.?~p \pkېO>bx8݁qE!zEBz^$ @9X;pUE6|P~hTP~0x@CgnT+u,T!p;^ 9`@hd>ɉhó3)<a&xÏpxxE)OaqqQEBffC``7&&&400@#x6 66678+++!53/=m3/‚(Կ~&*c0}Ĵ/1;G8.H!*;m 'Ax&H!pee/UԨV%%%r:JOO7x nCEEEg 6>J%8n R"CȟOV7ӒpZ$c I0OQȶ !p o!V{{gAɞ,blLGƿLoOzIP@.K@ a||SԔ`nn.;X; OT۶mavc5ڶc׶ݸQq$ܜYiL2kwѣ ,7n$|\!h!rJ+غD,M .5v$x":th | +Whn=7nD#p4zzk^fnҀX'/_ݻwyX`ΝҺuE:>@(5Iajƚ5kJvs[a0/^bL0$< g*}&7=z>3xM!~Qvm,B§$8,ҥK>d~ 8JZ0)ThxXˤPui`b@L| Vۣϐ$\XvZi=oH\:w/{^ TM!GF3#0` v0F@Q:t~VZ !(Q9BO?wr,y/,[I& pX6Wf̘!. xqqAȏڵK[;zhر#&ii('m[R.)hZj`Y>@)S=uX%4;~Ǭٳ'>1zwhTyhٲnP 4g'P% 0yv*#Q#j.D l95[um}{5zɠAdȑºA W ( 8~`(R|O;wEmڴNpjB[NĒ pIu^!DJ > Qtʁ"NhGbX&?>.L~z_?;޾F؅uOwfقI& )Q0v;XoL #jG`+|yW0]out 4اO>|U- i9v`F!C`[G#V0]V!帪D ZtԤI0aBT\`edMٖpN<)|DN̋gHf",GU/j|wj)..>!OH(,PԢc 1Z~ 8=1C0ffffffffcff&rL1,Y˫{UYYs=r5LOh΅5zЀ9hV%\B?ycڌw~?n ,H@!'̿<)Moj+ ;ezbr"0h?4bQKӧM2Ai|fZ-$- Wq;-'N0PRbW*,LjS{-\"rLA+:ߏdL@kA,?YYV $}@`S(qKIgOjcId,r38w9x tίjKt;kE s8'~m;%5O> J7ECuҜ泱{]5e-&urmuU$PUd*N[}鿀\ؠMH}, A@٢pH#/ Xa//z/XӼ\3l$Cd?4ٗZB}qΰ7k%Z;Ec@@.܀e,:ph}%m}pm jx|_ ;WXG+ a{pI/M'z֗gƼO;wYQQrP(ݯ,?(}馛,iW_8<=Y-#+5W7}AAH HC@8Rl y]TJsCHRu @߬Gh^Zeiǡ哄N4;7O [BP^BP/l\>]_yE녂3 @ R"Ֆ 3wv O)3k~u2t[ *bHv)0Iv#vq;lKs ;-)4Y*X($/>TJ* q)9i!?d,4Hrw]_.9ދ;e Rssg! 9kм$XzV;dp|V3tdh+`d@r8 p,|4?j{W]-+.> |뚏QNbPP>z-3et-/ ڀx9 0ᅔNq9/<9TNQ0<S/s ̭qYqW>}%8`?'Bߛe=%J۵^[U\kEYb/c*|l6C@p*I>ϟVV"1D/KPA#mBZcO5_%(- ÊNh!znp!~Qj,eG @lO}[*iHߟVl4Ԡn=Z q@@r@+4<$,G,s _\H¢'C3 yIL}ˁ&]oWO,/wY=ϒ-VKp`QfEm, l  +d%unzA*H݃ ",v)1Z Iw (&]^p?;ˏuBT_LK7^J||Z0u?=6rz~}|\%g@RF$>d$̒@hKSc^@.|Z%~@ 7d?few Z0g}gA٧F0F{eYy5o\ )Q:nI1X `߶&%saRk kBPQDWz!{{߻H+N]qIBKĈJT{gΖ95GiL:,(kn& Ab:?1R}i8Ic&'7~cόlh 8_dA?q.X>8Je<@6CПjdI"^f|%EL3Bc? ep6=m۶߹5ҁ޴"@J FL~n=ZfGَމGE@BapWgpe͏=JV/kmk )Bw^1Z- O"5} U *7 y*}gH ~=]ࠥ ptqZ $BP#G``DLС0~A'b>;X |5ȁ;wElCW *a"Lt 55:Yf HZrmʮ7o^$##=!x,֊#JdWi2B_~id4۷ hzD5;1SFZG8ggp}r\S~R/h߿k9(&8 Dba^>DHӛ= ttX=?S#g!^$j<+d?17^ P\oKt/ځ{p];GX'YZZk}Z,|n {؞{ jm)5 at_)펯m4c’De2kg *g1[=mKLNs$jocy-U =={m)Ƭmq/Ky]lWevOz;`-rd&=IIãw9rǜi0 Hi@8VӹI/ vLpRퟴ3N,/#1is#J s׵߿?_ g>߲M v_]k:%afCFw}̦^*.>n5ͨ8ȘÏ0&f0`w`֦Ht+d1(f2\ tɱbW t'D˂/LMe`3SQ}B&ARC+GM-w#$@ n#e Lأ ".U;ONJRe>ǀ[t I }8z Dp:a~ɞj"K?$(AJk7v *Rm&`|0PV&'<ǔo:qRt z|#ǀ] `|o=\${m0-,V}/ju4yj x'c,f8N/ﻜ6?mU`ݻw^77mvU!(EEr;}.Aytv*@A+l-@ĩedﵺ9&?$X%;uHnV8'oeR@~4N @Pё1)9"C'[z-H*t`3C+2ЯѝcBq:}@D[:\bX{<9P/ X<γs܀+.gsx8;DbYMFd>x͌?A'mhm~[m1|~ ߹*j\ѱq.FcNy&ldG>&~bWOЦZa PaYo%%j!`ZKT^XGqYց-j%ntَoxj5uȰ)Q`{Δo&;~*WsOH2j&W+W^y%7zY[+M HAK= vYH8 ?vp 7e@PV,ss܅0,^[[k 4fb(ܼ\ü *]mIq04!$|z݆<|$SNZ o2eDUS=`. +9767EZ O" \ןYBc= #DkV@kK =* X1&B08P F؍滷< G' w*2Ve)QDP/O,!@:kG *h|XM@g sʢIi' sbz_"As"7Iq%![OҲ0U^iPF )ϑCIZIƞ8ґxco48VWvhcǎIxJ".' ܅@SWp3,zhhm]H p&k.Lt[U ?1D#R*@U`g<;v2VtЋiS\ d?"(1SgbK?_ Ji_7 1[ns%ca"sy$q7a"Q><4$@w7mm$Yxvn$#_%pAc |=|niY[!)e q8.,MfԤ^' QMMM-. >tHb݁LX(6 eS#tD<_p>Yql؀=_+ʯK.2i+\A@E/ G~{,jxYБH"L1I(f6;,zGUw8tP_Q"86ݧ_nNjmϧ)ifڰo.hG?swZȽ?oj+5>kq#ek5\Pi`~<c6aVH.,+ @V\|O l,hqSvHK.6=?7W}7ر/|+jnm:K3 lw w |%ιZAZ+1(/ses &4hwg:u"@--s5rШoC_Vp&mIJGfZ˔w7!sĘ1VykhyWϺFg8zyڈ8`D]cYdwh$4ð`OۂzzNFZ Ҵӭ }l&rvl%SV\~wa# 8nmzŽa9MNA.] }Ard7̣IU@? cw.WU(@bh@~Z dˉ#3=e H JC7۠kz؈ ‡'!܎T[q7h%l:})r7c> Z@s, );> mg]~-M$W{g9g9~HAs4%IUh#H}&ܳgvZ8@`fqcFf/5V=O y,XApqns>>|F|߲>F;b;v|؜_X\gV(GaiY n,7@Y~6`5 ׁ-~,y= ܓ"ΡqgJ[asx(kNu!ް o9qvP( v6㻳{odb "ZI w xNfIt3&|[E8}!3e·>TF\AB?c>3j=v+i6/l΅r72~Ɯ}8(i țW?CwtJ|h' Fs9|vZF >?cǏVzW}^4O?|NZ݃sܺ9nAs,W"wEq@e |ߓȉ'dJq H߱` ^QӋ5 |\5;;g4} < Kg'a/aO|s;^g! -!v`-j}X*7Ʉ{h~_`O Q-piUDz"j}>]~Jpm1{cJ 4ѧjҸ)X4 ӵD"3np@H=F˶*Po ИyHb!bJ|xsIBm[z-g$$ 6Hwv^ߜ u>)Mln 7Y| AnIrě,0%E.:OwЊWN?y6C iB XW `fH i_&~L,^P7k}0 A7==Vu҄,^S^D]Bo*3Gn> DKO|U: _@/) pW0W˶p&H V@,Lc ާ"_by/-ƪ$65AJg;օB1 O e 7nlcYTM|+bg_Uϋ [ G[ C`sʧ`ϺBf޽{| 9qD Z `[>;Xrb^S:ܽH. $2 Zr]AK]jm-SIx'փVϥ6V4u_/+eŠʅǬҜ7` 0wb V) Iw5n12Ơ_wEeD]EG8Oүp-Oq[r9sEnߞM1d&fWR]0ࣛP50d.:1E5{@͞z(?Bd]ph,P8 |44>sjE6T05@޺ ?a>O^u˾]1M8f/T\!18HGcD+|IzKd dGt?Ǎ|+jbjƏ .Fv '\wk,Dٻ7;*]3/>euts $ܡwf?3+V7SxM[|mĜ,2x/Qpz#N ̶BQGhp ~OO7\Aİˉ!i[pdYk {o[Ay<@&{Yailv>I jг#yY'W@+X|!S K~0ucp 1{ԑ: b+/ηGQU(|@"pICz&M| h`8p2q q\\ B`57}*^ub3g}{_>~ 9- m,eW5!M"E\v&oʫ &L/kX,IBH+rŃ]n0/L?j}CHZ۹/~ uNKì|n*K6!`v!P$xf_a%l6Da_k=]$?~S '.* HtCǿ3Kf/n|?I@` +$`=pbOK(_|׽K/tIrg~݄ϖWծ_˶~ɶ/v)!7|M|3ytƏio[1o($_~9 ?ӼqQ~^ A62X"?Eu3Yoo3$PhY /e=4DR!Ve _Vdrv:Z 5 i~*`b=!ԞԧR+U@:hX [eRmBlgk93ޙޤלƚ!PzO2 < MY_*rG7?524& <.%/ jQw)LRG%PCYZs3+$w`~g8>jfB a;739]ʌmAϐE_* U@Sָ͐ J^Ϗ{0f#k s'ni Fw?* Pke@n"Ex@$.:3cw|X.Mm!Ab_å7E`u.]X.К\~ 9i3^sj$$ލL,YH~FV✀P0>F@) `$}d.).Cn06l&F.J_|V$J/BX5M|.hΣ!*W>'jwu}}Qv`-z3+,:,9cL+E=j6~Ѥ_u~?u#kWq4KƲ ZsP( ?UfJ. uN\-S?{T=s>sWe}tzW]uUI__ϳVo4$@;OH|^4o=} wgdrtpB`3ٻXْ ͼo۶mBFlcUUµm۶3'+]o]*tUuuF ׮ q I@Bص>>gΜynR i;'OJ޽͙3m,bZT#IF$@D=ɏ#r:uZ'd9"{+ ?u?ȡ%^@Zz];v\b[4HK| xԩ_ M60BրxET(H/ʯރ]n,fj5VA $\A^H~DV-Z4 5k7 3 Jsc;x5mm۶Yf[`$‰5 e3\ ~_dp` G I>zUy1VXuD+D]h{hjA9YYz 6 _3 Xf[b]0 X=Qݓ@-$!ޱOOѼG.oQÝ^=?H_.L?ky#GpJL _Yr%c!xY 0@$i z?>]:+!y뮻N [|z J$@_֝v@@ RP̾}̝;0vdznVlH I﯂,YRL" +2.~h󣌠;:؉$&7.<@]kf?u`'{E m;=Q 6j„-&4GK3{k/|r~ӱuyӧswA0=9cҌ6.▥AbŃ*g] A/F ~}ʺК%'0ξ,iӦ?z˸qٳرcgj_fxR)VW"MO>e zJ Wk4p5&5-Jd]%ȭc6kvڵ^9HR[d#^Sơ3*Vm 1 T6d5u |7(Q MAI@'i AhW`  p5o#nbfޗغi_İ|oe(9Y/-V~1kc5:P_mJ_Fٹs2oO`1, ֓O$(o}gH)D#b ~ZGgUAANo)߶l~z8ѹFSuק?b Ъ~3$R 6D560 iKOdO !QJKkoJiO@["o5k$ҥK#>cy{~Eou %5У,ǒu;[3Жj~ ZXrJ^+ 鼤ClS>6ߧc_:Т o’X[Aϲ!da$NC/4ho[{W@g W-O'( ʀw{w0Dߜ9G_k@Z&ܼnVh)|\a<5r.kiJ=;w+;~\@o{1G6 IsZ1 :M֫w9އA \O\?~X@FD]l6|ֹ Wh>:-zC ~nO@/)AT~`cIENDB`(0`    !)1;###iFFF\\\kkkmmmhhhUUU999S3) !!!!!!!!!!")3=GU;;;rrr藗aaa"""wC1  !1 ? B D D D D D D D D D D IR[dooo槧SSS S5!$$$qgggzzzzzzzzzzzzzzzzzzzzzzzzvvzvvzvvzvvzssxmmqhhkeefſÿkkkQ$ (YYY||||||||{{wwĿooo .'ddd¿eee dddss``Ż_eee$$ȻſeeettZZľý˽¹Sfff Ǿžfffvv##ĽefNQ{ž̿úfff77øŶ96jlʿ fffvvAA~)(οƾ!fffAA{)'Ľ!fffxx7763lcƷfff$$`[LH{sfffyy ļfff\\Vfffzz&& fffccefff{{ffffff!fffvvvfffdddfffdddfffdddfffdddfffdddfffdddfffdddfffdddfffdddcccaaa___Xllliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhhkkk___X___]kkkhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjhkjiii___W___gmmm{~}lonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonlonhhh___Y___qmmmggg___Z___w___`````````````````````````````````_______________________________________[tYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY?tYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtYtY( @   )KKKirrr삂oooDDDu;%!(,,,,,,.=+++e{{{ݚxxx***m5\\\cccggggggggggggggggggggggggggg???maaaLLL/```gggdd```¾ƽ6```gggOOȾ```xxɿûǿ¸```hhh»~}~~```~}~}ȼ```hhhww~~~~޹```NN```hhh6```aa```hhh ~~```6```hhheee`````````hhh````````````iii`````````bbbiiibbbfffрfff`````````````````````````````````````````````iiieeeUUU```Ȃmonilkilkilkilkilkilkilkilkilkilkilkilkilkorq~~bbbUUUfff```偂z{{```fff ccc$````````````````````````````````````````````````___ddd??(  3SWUSWUSWUSWUSWUehgnqpknmSWUjmmruuorqSWUfilprrqtsSWUuuuX[spsrpsrSWU>?SWUuuuegSWU>?SWUuuuKM{SWU>?egSWUuuu~lonlonehgSWUSWUSWUuuuSWUSWUSWUSWU3SWUSWUSWU3SWUSWUSWU3SWUSWUSWUSWUSWUSWUSWUSWUSWUSWUAAAAAAAAAAAAAAAApicard-release-2.3.1/installer/images/wiz.bmp000066400000000000000000004556561362601763300212040ustar00rootroot00000000000000BM[6(:x[ϳϳγγγɳſĿĿĿþ¿¿¿¿¿¿¿¿¿¿Яг״ӳڷӳۺӳݽӳįƳԼ³ԼԼԼԼ³Խ³ԽԽ³ԽԽԽԽ³ԾԾԾÿԾ¾Ծ¾ԾԾüԾƽԾ¾ԾĺԾƽԾԾĸԿżԿÿdzԿdzԿԿԿǷտ¹տ¾տľ¼¼տ½ƿտþ½ƾĿ¾տ½¼Žľ¾տº½տ½ƾ¼ĽտûȿǿĽտ¿ŽǾǿտþƾƾļտºƾƾտĽƾŽžžļžž¿ľĽĽĽ¾ýýýý¾¼¼ÿ¼¼ýĽĿý½¾±±±±±´½¬ó¼ij¯ijij¶ij±©ij±¼ų±¯ų±ųò½ųò¶ſƳ­ľƳƽƳ½ǽƳ¸ȽƳǬҳĭӳijӳijټӳijٺԳijپԳij­ԳijƭԳ½ʭճͰճԷճֳֳ̱շֳŷǰֳųֽೳųϵᳳųůᳳųðᳳųŲᳳȳᳳͼɸĵʿź¼ŴճŴڳŴڳŴڳŴڳſڳڳڳڳڳڳƽڳƵڳǵڳǵڳǵڳǵڳǾڳڳڳڳ۳۳ǿ۳ǵ½ɽ۳ǵĨ۳ȵ¿۳ȵ}}}|||κ۳ȵ¼xxxaaa````````````````````````````````````````````````````````````````````````___\\\ZZZXXXUUUSSSQQQOOOkkkĽ»Ǯ۳ȼž```eeeĶ۳¼vvvddd栠ݠݠݠݠݠݠݠݠݠݠ۠ڠءÿ۳```۾ddddddddddddddddddddddddddÖŘ۳```Ĕ<<Ľ¼ٻÿƏ۳¼```Ź%%ǿżĺøڼć۳ſ```Ũ```mmwppǻŸĵô۽ùξ۳ø«```Ƶ~~99ǼƷŵűï۽ĺȼХ۳ȶȰ```ƘwwĸƴƱŭíܾ»Ƽʼü͆۳ȶζ```ǼDDêüǼ˼ο԰۳ȶԻ```Ǫ```nnw{{нƽɽ̽ԋ۳ȶ```ȵ}}''žýǾʾϿ¹Žذ۳ȶ```ȜOOȸǵƿɿ̾Ļ̀۳Ȼ```ɿuuÿըǾ˿¹ƾ܌۳```ɫ```ooxжԺğɿĻݫ۳```ʴ}}}||<<ǻ¹ǿddGG@AZ]|Ѹúƾǀ۳```ʟIIĹö³ȿƾzv%%egЮľùƽԀ۳```ïVVŻ·ĵƷ{st¬Ļ݀سȵ```˭```ppxdd¹ƸQN)(ɰȾĻㅅdz˿```˳www{{qqƹ{--|ɷǹƾ吐{{{uuuuuu}}}```̢zzĸx~z¾Ƹ晙uuuuuuuuuuuu~~~Ӿ```Ǹooü}43 yûʾ珏|||uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqq```ͮ```qqyaaĻa\75zŻĽ郃uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqq```ʹpppzzTTǺ{10zzʻ̾ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuwwwuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuqqq```ͦFFȺ|B@**w~Ȼ܀uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuyyyuuuuuuuuuuuuuuuuuuvwwvwwvwwvwwvwwvwwvwwvwwvwwvwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwrrr```88¾|~fa]Y}v{ĹŽ̀}}}wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwuuuuuuuuuuuuuuuuuuwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwsts```ϯ```rry÷뭭{|{wxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxw~~~zzzuuuuuuuuuwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwsts```ϲjjjxxooꉉyzywxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxwwxw```ϪHHր```ɨ 쵵```а```rrytt䆆```Ѳcccuu|66쳳```Ѯnn¿```ү++򩩩```Ҳ```sszff̀```Ӳ```ssz{{üރ```ϰ))荍```⮮¸Ꚛ```Եfff𧧧˼␐```Գ```ﱱՆ```Ăހ```ՉÀ```ֹnnn簰̐fff}}}```ֵ```ᦦƢ```}~~```٩```}}}```ճ```xxx```ؽvvvɾ```ppp```ض``````ppp```к```ppp``````ppp``````ppp```ڷ``````yyy```ϴ````````````Ŋ``````ܹ`````````ϭ````````````ɒ``````޺`````````Ϧ`````````tttbbb{{{``````dddwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvwwwttt```eeeyyy```eeeggg````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````aaasss```eee```ffflnngiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiigiihjjstt```lll```gggmpoilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkjmlsss```lll```hhhlonilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkjmlrrr```kkk|||```ijijmlilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkilkjmlqqq```lllzzz```kkkppp```kkkxxx```kkkooo```kkkttt```dddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddd```kkkuuu````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````nnnpicard-release-2.3.1/installer/languages/000077500000000000000000000000001362601763300203475ustar00rootroot00000000000000picard-release-2.3.1/installer/languages/Dutch.nsh000066400000000000000000000025141362601763300221320ustar00rootroot00000000000000LangString MsgAlreadyInstalled ${LANG_DUTCH} '${PRODUCT_NAME} is al geïnstalleerd. $\n$\nKlik op “OK” om de vorige versie te verwijderen of op “Annuleren” om de installatie te annuleren.' LangString MsgApplicationRunning ${LANG_DUTCH} "De applicatie ${PRODUCT_NAME} is nog actief. Sluit haar af en probeer het opnieuw." LangString MsgRequires64Bit ${LANG_DUTCH} "Voor deze versie van ${PRODUCT_NAME} heb je een 64 bitssysteem nodig." LangString MuiDescriptionRequired ${LANG_DUTCH} "Installeert ${PRODUCT_NAME} en de bestanden die het nodig heeft om te draaien." LangString MuiDescriptionLang ${LANG_DUTCH} "Installeert vertalingen van ${PRODUCT_NAME}." LangString MuiDescriptionShortcuts ${LANG_DUTCH} "Installeert snelkoppelingen om ${PRODUCT_NAME} te starten." LangString MuiDescriptionDesktop ${LANG_DUTCH} "Installeert een snelkoppeling op het bureaublad." LangString MuiDescriptionStarteMenu ${LANG_DUTCH} "Installeert een snelkoppeling in het startmenu." LangString OptionRemoveSettings ${LANG_DUTCH} "Verwijder instellingen en persoonlijke gegevens" LangString SectionDesktop ${LANG_DUTCH} "Bureaublad" LangString SectionLanguages ${LANG_DUTCH} "Talen" LangString SectionRequired ${LANG_DUTCH} "Programmabestanden (vereist)" LangString SectionShortcuts ${LANG_DUTCH} "Snelkoppelingen" LangString SectionStartMenu ${LANG_DUTCH} "Startmenu" picard-release-2.3.1/installer/languages/English.nsh000066400000000000000000000024231362601763300224530ustar00rootroot00000000000000LangString MsgAlreadyInstalled ${LANG_ENGLISH} '${PRODUCT_NAME} is already installed. $\n$\nClick "OK" to uninstall the previous version or "Cancel" to cancel this upgrade.' LangString MsgApplicationRunning ${LANG_ENGLISH} "The application ${PRODUCT_NAME} is running. Please close it and try again." LangString MsgRequires64Bit ${LANG_ENGLISH} "This version of ${PRODUCT_NAME} requires a 64-bit Windows system." LangString MuiDescriptionRequired ${LANG_ENGLISH} "Installs ${PRODUCT_NAME} along with the necessary files for it run." LangString MuiDescriptionLang ${LANG_ENGLISH} "Installs translations of ${PRODUCT_NAME} in different languages." LangString MuiDescriptionShortcuts ${LANG_ENGLISH} "Installs shortcuts to launch ${PRODUCT_NAME}." LangString MuiDescriptionDesktop ${LANG_ENGLISH} "Installs a shortcut on the desktop." LangString MuiDescriptionStarteMenu ${LANG_ENGLISH} "Installs a shortcut in the Start Menu." LangString OptionRemoveSettings ${LANG_ENGLISH} "Remove settings and personal data" LangString SectionDesktop ${LANG_ENGLISH} "Desktop" LangString SectionLanguages ${LANG_ENGLISH} "Languages" LangString SectionRequired ${LANG_ENGLISH} "Program files (required)" LangString SectionShortcuts ${LANG_ENGLISH} "Shortcuts" LangString SectionStartMenu ${LANG_ENGLISH} "Start menu" picard-release-2.3.1/installer/languages/French.nsh000066400000000000000000000026141362601763300222710ustar00rootroot00000000000000LangString MsgAlreadyInstalled ${LANG_FRENCH} '${PRODUCT_NAME} est déjà installé. $\n$\nCliquez sur « OK » pour désinstaller la version précédente ou « Annuler » pour annuler cette mise à jour.' LangString MsgApplicationRunning ${LANG_FRENCH} "L’application ${PRODUCT_NAME} est en cours d’exécution. Veuillez la stopper et essayer à nouveau." LangString MsgRequires64Bit ${LANG_FRENCH} "Cette version de ${PRODUCT_NAME} requiert un système Windows 64 bits." LangString MuiDescriptionRequired ${LANG_FRENCH} "Installe ${PRODUCT_NAME} ainsi que les fichiers nécessaires à son exécution." LangString MuiDescriptionLang ${LANG_FRENCH} "Installe les traductions de ${PRODUCT_NAME} dans différentes langues." LangString MuiDescriptionShortcuts ${LANG_FRENCH} "Installe les raccourcis pour lancer ${PRODUCT_NAME}." LangString MuiDescriptionDesktop ${LANG_FRENCH} "Installe un raccourci sur le bureau." LangString MuiDescriptionStarteMenu ${LANG_FRENCH} "Installe un raccourci dans le menu Démarrer." LangString OptionRemoveSettings ${LANG_FRENCH} "Supprimer les préférences et les données personnelles" LangString SectionDesktop ${LANG_FRENCH} "Bureau" LangString SectionLanguages ${LANG_FRENCH} "Langues" LangString SectionRequired ${LANG_FRENCH} "Fichiers du programme (requis)" LangString SectionShortcuts ${LANG_FRENCH} "Raccourcis" LangString SectionStartMenu ${LANG_FRENCH} "Menu Démarrer" picard-release-2.3.1/installer/languages/German.nsh000066400000000000000000000025731362601763300223010ustar00rootroot00000000000000LangString MsgAlreadyInstalled ${LANG_GERMAN} '${PRODUCT_NAME} ist bereits installiert. $\n$\nKlicken Sie "OK" um die vorherige Version zu deinstallieren oder "Abbrechen" um das Update abzubrechen.' LangString MsgApplicationRunning ${LANG_GERMAN} "Die Anwendung ${PRODUCT_NAME} wird ausgeführt. Bitte schließen und erneut versuchen." LangString MsgRequires64Bit ${LANG_GERMAN} "Diese Version von ${PRODUCT_NAME} erfordert ein 64-bit Windows-System." LangString MuiDescriptionRequired ${LANG_GERMAN} "Installiert ${PRODUCT_NAME} mit den für die Ausführung erforderlichen Dateien." LangString MuiDescriptionLang ${LANG_GERMAN} "Installiert Übersetzungen von ${PRODUCT_NAME} in verschiedenen Sprachen." LangString MuiDescriptionShortcuts ${LANG_GERMAN} "Installiert Verknüpfungen, um ${PRODUCT_NAME} zu starten." LangString MuiDescriptionDesktop ${LANG_GERMAN} "Installiert eine Verknüpfung auf dem Desktop." LangString MuiDescriptionStarteMenu ${LANG_GERMAN} "Installiert eine Verknüpfung im Startmenü." LangString OptionRemoveSettings ${LANG_GERMAN} "Einstellungen und persönliche Daten entfernen" LangString SectionDesktop ${LANG_GERMAN} "Desktop" LangString SectionLanguages ${LANG_GERMAN} "Sprachen" LangString SectionRequired ${LANG_GERMAN} "Programmdateien (erforderlich)" LangString SectionShortcuts ${LANG_GERMAN} "Verknüpfungen" LangString SectionStartMenu ${LANG_GERMAN} "Startmenü" picard-release-2.3.1/installer/languages/Italian.nsh000066400000000000000000000025271362601763300224500ustar00rootroot00000000000000LangString MsgAlreadyInstalled ${LANG_ITALIAN} "${PRODUCT_NAME} è già installato.$\n$\nFai clic su 'OK' per disinstallare la versione installata o su 'Annulla' per annullare l'aggiornamento." LangString MsgApplicationRunning ${LANG_ITALIAN} "L'applicazione ${PRODUCT_NAME} è in esecuzione.$\nChiudi l'applicazione e riprova." LangString MsgRequires64Bit ${LANG_ITALIAN} "Questa versione di ${PRODUCT_NAME} richiede un sistema Windows a 64bit." LangString MuiDescriptionRequired ${LANG_ITALIAN} "Installa ${PRODUCT_NAME} e i relativi file necessari alla sua esecuzione." LangString MuiDescriptionLang ${LANG_ITALIAN} "Installa le traduzioni di ${PRODUCT_NAME} per le differenti lingue." LangString MuiDescriptionShortcuts ${LANG_ITALIAN} "Installa collegamento per eseguire ${PRODUCT_NAME}." LangString MuiDescriptionDesktop ${LANG_ITALIAN} "Installa collegamento sul desktop." LangString MuiDescriptionStarteMenu ${LANG_ITALIAN} "Installa collegamento nel menu Start." LangString OptionRemoveSettings ${LANG_ITALIAN} "Elimina impostazioni e dati personali" LangString SectionDesktop ${LANG_ITALIAN} "Desktop" LangString SectionLanguages ${LANG_ITALIAN} "Lingue" LangString SectionRequired ${LANG_ITALIAN} "File programma (richiesti)" LangString SectionShortcuts ${LANG_ITALIAN} "Collegamenti" LangString SectionStartMenu ${LANG_ITALIAN} "Menu Start" picard-release-2.3.1/installer/picard-setup.nsi.in000066400000000000000000000213011362601763300221160ustar00rootroot00000000000000; Modified to conform to Modern UI 2.0 !define PROJECT_PATH ".." !define PRODUCT_NAME "%(display-name)s" !define PRODUCT_VERSION "%(version)s" !define PRODUCT_PUBLISHER "MusicBrainz" !define PRODUCT_DESCRIPTION "%(description)s" !define PRODUCT_URL "%(url)s" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" SetCompressor /FINAL /SOLID LZMA Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "picard-setup-${PRODUCT_VERSION}.exe" ShowInstDetails show ShowUnInstDetails show BrandingText " " Unicode true ; We need this so Windows 7/Vista lets us install what we need to RequestExecutionLevel admin ; The default installation directory InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}" ; The default installation directory InstallDirRegKey HKLM "Software\MusicBrainz\${PRODUCT_NAME}" "InstallDir" !include "MUI2.nsh" !include "InstallOptions.nsh" !include "x64.nsh" ; MUI Settings ; Make installer pretty !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_HEADERIMAGE_BITMAP "${PROJECT_PATH}\installer\images\hx.bmp" ; !define MUI_WELCOMEFINISHPAGE_BITMAP "${PROJECT_PATH}\installer\images\wiz.bmp" !define MUI_ICON "${PROJECT_PATH}\installer\images\tango-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\classic-uninstall.ico" ; Abort Warning !define MUI_ABORTWARNING ; Welcome page !define MUI_WELCOMEPAGE_TITLE_3LINES !insertmacro MUI_PAGE_WELCOME ; License page !insertmacro MUI_PAGE_LICENSE "${PROJECT_PATH}\COPYING.txt" ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Components page !define MUI_COMPONENTSPAGE_SMALLDESC !insertmacro MUI_PAGE_COMPONENTS ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page !define MUI_FINISHPAGE_TITLE_3LINES !define MUI_FINISHPAGE_RUN "$WINDIR\explorer.exe" !define MUI_FINISHPAGE_RUN_PARAMETERS "$\"$INSTDIR\picard.exe$\"" !insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_CONFIRM UninstPage custom un.RemoveSettingsPage !insertmacro MUI_UNPAGE_INSTFILES !define MUI_UNPAGE_FINISH_TITLE_3LINES !insertmacro MUI_UNPAGE_FINISH ; Reserve files ReserveFile "removeSettings.ini" ReserveFile "${NSISDIR}\Plugins\x86-unicode\InstallOptions.dll" ; Language handling !macro LOAD_LANGUAGE LANGUAGE !insertmacro MUI_LANGUAGE "${LANGUAGE}" !include "languages\${LANGUAGE}.nsh" !macroend ; Language files !insertmacro LOAD_LANGUAGE "English" ; !insertmacro LOAD_LANGUAGE "Arabic" ; !insertmacro LOAD_LANGUAGE "Catalan" ; !insertmacro LOAD_LANGUAGE "Czech" ; !insertmacro LOAD_LANGUAGE "Danish" !insertmacro LOAD_LANGUAGE "Dutch" ; !insertmacro LOAD_LANGUAGE "Estonian" ; !insertmacro LOAD_LANGUAGE "Finnish" !insertmacro LOAD_LANGUAGE "French" !insertmacro LOAD_LANGUAGE "German" ; !insertmacro LOAD_LANGUAGE "Greek" ; !insertmacro LOAD_LANGUAGE "Hebrew" !insertmacro LOAD_LANGUAGE "Italian" ; !insertmacro LOAD_LANGUAGE "Japanese" ; !insertmacro LOAD_LANGUAGE "Korean" ; !insertmacro LOAD_LANGUAGE "Norwegian" ; !insertmacro LOAD_LANGUAGE "Polish" ; !insertmacro LOAD_LANGUAGE "Portuguese" ; !insertmacro LOAD_LANGUAGE "PortugueseBR" ; !insertmacro LOAD_LANGUAGE "Russian" ; !insertmacro LOAD_LANGUAGE "SimpChinese" ; !insertmacro LOAD_LANGUAGE "Slovak" ; !insertmacro LOAD_LANGUAGE "Slovenian" ; !insertmacro LOAD_LANGUAGE "Spanish" ; !insertmacro LOAD_LANGUAGE "Swedish" ; !insertmacro LOAD_LANGUAGE "TradChinese" ; !insertmacro LOAD_LANGUAGE "Turkish" ; !insertmacro LOAD_LANGUAGE "Ukrainian" ; Adds info to installer VIProductVersion "%(file-version)s" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "${PRODUCT_NAME}" VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "${PRODUCT_DESCRIPTION}" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "${PRODUCT_PUBLISHER}" VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "© ${PRODUCT_PUBLISHER} under the GNU GPLv2." VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Installation for ${PRODUCT_NAME}" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "%(version)s" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "%(version)s" ; Install Section "!$(SectionRequired)" required SectionIn RO SetOutPath "$INSTDIR" SetOverwrite on ; Files File /r /x "locale" "${PROJECT_PATH}\dist\picard\" ; Write the installation path into the registry WriteRegStr HKLM "Software\MusicBrainz\${PRODUCT_NAME}" "InstallDir" "$INSTDIR" ; Create uninstaller WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\picard.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "InstallSource" "$INSTDIR\" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Comments" "${PRODUCT_DESCRIPTION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_URL}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" SectionEnd Section "$(SectionLanguages)" lang RMDir "$INSTDIR\locale" CreateDirectory "$INSTDIR\locale" SetOutPath "$INSTDIR\locale" File /r "${PROJECT_PATH}\dist\picard\locale\" SectionEnd SectionGroup "$(SectionShortcuts)" shortcuts Section "$(SectionStartmenu)" startmenu SetShellVarContext all SetOutPath "$INSTDIR" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\picard.exe" \ "" "" "" SW_SHOWNORMAL "" "${PRODUCT_DESCRIPTION}" SectionEnd Section "$(SectionDesktop)" desktop SetShellVarContext all SetOutPath "$INSTDIR" CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\picard.exe" \ "" "" "" SW_SHOWNORMAL "" "${PRODUCT_DESCRIPTION}" SectionEnd SectionGroupEnd ; Uninstall Function un.RemoveSettingsPage !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP "" !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION "" !insertmacro INSTALLOPTIONS_DISPLAY "removeSettings.ini" FunctionEnd Section Uninstall RMDir /r "$INSTDIR" SetShellVarContext all Delete "$DESKTOP\${PRODUCT_NAME}.lnk" SetShellVarContext all Delete "$SMPROGRAMS\${PRODUCT_NAME}.lnk" SetShellVarContext all Delete "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "Software\MusicBrainz\${PRODUCT_NAME}" !insertmacro INSTALLOPTIONS_READ $R0 "removeSettings.ini" "Field 1" "State" StrCmp $R0 "1" 0 +2 ; Even more attempts DeleteRegKey HKCU "Software\MusicBrainz\Picard\persist" DeleteRegKey HKCU "Software\MusicBrainz\Picard\setting" DeleteRegKey HKCU "Software\MusicBrainz\Picard" SectionEnd ; Checks whether program is running. !define WNDCLASS "Qt5QWindowIcon" !define WNDTITLE "${PRODUCT_NAME}" Function un.onInit FindWindow $0 "${WNDCLASS}" "${WNDTITLE}" StrCmp $0 0 continueInstall MessageBox MB_ICONSTOP|MB_OK "$(MsgApplicationRunning)" Abort continueInstall: !insertmacro INSTALLOPTIONS_EXTRACT "removeSettings.ini" !insertmacro INSTALLOPTIONS_WRITE "removeSettings.ini" "Field 1" "Text" "$(OptionRemoveSettings)" FunctionEnd Function .onInit ; Abort installation if this is not a 64 bit system ${IfNot} ${RunningX64} MessageBox MB_ICONSTOP|MB_OK "$(MsgRequires64Bit)" Abort ${EndIf} ; Abort installation if Picard is currently running FindWindow $0 "${WNDCLASS}" "${WNDTITLE}" StrCmp $0 0 continueInstall MessageBox MB_ICONSTOP|MB_OK "$(MsgApplicationRunning)" Abort continueInstall: ; Uninstall previous installation ReadRegStr $R0 HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" StrCmp $R0 "" skipUninstall MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "$(MsgAlreadyInstalled)" IDOK uninstall Abort uninstall: ClearErrors Exec $R0 ; Check if previous install location was inside $PROGRAMFILES32 ReadRegStr $R0 HKLM "Software\MusicBrainz\${PRODUCT_NAME}" "InstallDir" StrLen $R1 $PROGRAMFILES32 StrCpy $R2 $R0 $R1 StrCmp $R2 $PROGRAMFILES32 0 skipUninstall StrCpy $INSTDIR "$PROGRAMFILES64\${PRODUCT_NAME}" skipUninstall: !insertmacro UnselectSection ${desktop} FunctionEnd !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${required} "$(MuiDescriptionRequired)" !insertmacro MUI_DESCRIPTION_TEXT ${lang} "$(MuiDescriptionLang)" !insertmacro MUI_DESCRIPTION_TEXT ${shortcuts} "$(MuiDescriptionShortcuts)" !insertmacro MUI_DESCRIPTION_TEXT ${desktop} "$(MuiDescriptionDesktop)" !insertmacro MUI_DESCRIPTION_TEXT ${startmenu} "$(MuiDescriptionStarteMenu)" !insertmacro MUI_FUNCTION_DESCRIPTION_END picard-release-2.3.1/installer/removeSettings.ini000066400000000000000000000002121362601763300221130ustar00rootroot00000000000000[Settings] NumFields=1 [Field 1] Type=checkbox Text=Remove settings and personal data Left=0 Right=-1 Top=0 Bottom=40 State=0 picard-release-2.3.1/org.musicbrainz.Picard.appdata.xml.in000066400000000000000000000074671362601763300234770ustar00rootroot00000000000000 %(app-id)s GPL-2.0-or-later CC0-1.0 MusicBrainz Picard MusicBrainz's music tagger

Do you need to clean up your music library? Picard is an open-source cross-platform music tagger by MusicBrainz. It has the ability to identify audio files even without any existing metadata.

Picard helps you organize your music collection by renaming your music files and sorting them into a folder structure exactly the way you want it. A variety of plugins are available and you can even write your own. Picard supports a wide range of audio formats and can also lookup an entire CD for you.

Tagging audio files has never been easier.

Features:

  • Multiple formats: Picard supports all popular music formats, including MP3, FLAC, OGG, M4A, WMA, WAV, and more.
  • AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be identified by the actual music, even if they have no metadata.
  • Comprehensive database: Picard uses the open and community-maintained MusicBrainz database to provide accurate information about millions of music releases.
  • CD lookups: Picard can lookup entire music CDs with a click.
  • Plugin support: If you need a particular feature, you can choose from a selection of available plugins or write your own.
  • Scripting: A flexible but easy to learn scripting language allows you to exactly specify how your music files will be named and how the tags will look like.
  • Open Source: Picard is licensed under the GNU General Public License 2.0 or later, and is hosted on GitHub where it is actively developed by some awesome developers.
AudioVideo Audio AudioVideoEditing %(desktop-id)s picard https://picard.musicbrainz.org/static/img/screenshots/picard-main-windows.png https://picard.musicbrainz.org/static/img/screenshots/picard-options-about.png https://picard.musicbrainz.org/static/img/screenshots/picard-options-plugins.png https://picard.musicbrainz.org/static/img/screenshots/picard-options-lookup.png https://picard.musicbrainz.org/static/img/screenshots/picard-cover-art.png https://picard.musicbrainz.org/ https://tickets.metabrainz.org/projects/PICARD/issues/ https://picard.musicbrainz.org/docs/faq/ https://picard.musicbrainz.org/docs/ https://metabrainz.org/donate https://www.transifex.com/musicbrainz/musicbrainz/picard/ picard MetaBrainz Foundation mild %(releases)s
picard-release-2.3.1/org.musicbrainz.Picard.desktop000066400000000000000000000014621362601763300223170ustar00rootroot00000000000000[Desktop Entry] Name=MusicBrainz Picard Comment=Tag your music with the next generation MusicBrainz tagger Exec=picard %F Terminal=false Type=Application StartupNotify=true StartupWMClass=Picard Icon=org.musicbrainz.Picard Categories=AudioVideo;Audio;AudioVideoEditing; MimeType=application/ogg;application/x-flac;audio/aac;audio/ac3;audio/aiff;audio/ape;audio/dsf;audio/flac;audio/midi;audio/mp4;audio/mpeg;audio/mpeg4;audio/mpg;audio/ogg;audio/vorbis;audio/x-aac;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-flac+ogg;audio/x-m4a;audio/x-midi;audio/x-mp3;audio/x-mpc;audio/x-mpeg;audio/x-ms-wma;audio/x-ms-wmv;audio/x-musepack;audio/x-oggflac;audio/x-speex;audio/x-speex+ogg;audio/x-tak;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-wma;video/x-ms-asf;video/x-theora;video/x-wmv; picard-release-2.3.1/picard.icns000066400000000000000000002355541362601763300165420ustar00rootroot00000000000000icns;lis32wywwxxwwvwwwwwwwvwwxxwyvwwrttytstutttttttutstytr<;;=;:=;<@;;;;;;;;;<@;:=;;=<s8mk//(.^o^o(.//il32{uxxqxwwxwxuxwx{xwxqxwxwxw}wvw ѳvw ywxvw 洄wxvw zwxvwwyصywxvwwͶwwxvww wwxvwwwwxvww wwxvwx}wwxvwwx vwwx vw~wzwxvwwxwxwxqxwx{xwxuxwxwxxxwwxuwx{qtstttststsxtjtu#4QШtu%Ihu鱀tvutu 9itɀtu Oj,tttu ] k,t{yttu ijt鞀tu,kkk^ttu:kOtttuIk@׋tuXk1 ⸁~vttufk"t~ttu&kdttu 4kk`bkkUt|xtu 08$ NkFtttu73tutututjtsxtststtsvq9<<;;::<;<@<;9<;:8<;:@<;<<ʻ<;: Ӿ<;=f`=;: ڳ<;۞;: <;MosG;;: ؇’<;CԠB;;: ˆ<;Qk;:¸<;UK;:<;JR;:ڮV;: JFu}i=;;:<;G٤;;:<;RipH;: º²<;Dզ@;: ¦<;ed;;:<;:<;:<;<<<;:@<;:8<;9<;<@<;;::<<99l8mk0„7^o?G w M^M^ w  ?G^o06ih32 xwxwxvxwxwxߘwxyvwxxwxwxvvwxzvwxvww߻xwxw܀xw ~؎wxxw۴wxxw߶ywwxxw wwxxw ܘ㶢wxxw|wxxw¶wxxwwxxwxw xxwwxxwywxxwwxxwwxxwywxxwwxxwwxwx xwwwxxww~xwzwxxw|wxxw}wxvwxzvwxvvwxwxxwxyvwxwxwxߛvxwxvwxwxxutyuttsUutuutss+ututuututwutsUutuutr&FȎutv.Sk>WЁuts.VkΕpYutts #[ktButts6kti/utzwtsDknkfutttts TkhVk`utts bkRkQut܁Ȃts!kkzkCutvts1k}ȃkk4ututs@k%utw{tsNkf utt}yts]kWݔtsjkHŀts+k:͢wtƯ{ts:k+ut|tsIkiuttsXk]uttπtsfkNutΏts %khUA-.ak?utts#/ Mkk1utΉts5e!uts"utsutvutrutuutsUutwututu+ututssutsuttsUuty::=<;;Ʋ<; ʁ<;<πɴ<;US;< Ĕ<;rp;<ׁ<;Aڞ>;<Τ¾<;\۹;;V;< ۢº<;O]`J;< ڝ<;;<ـ¤<;a=;<˜<;b۪=;<<;>۸C;< <;;F|۷B;<yׂ`;<˓و;<p>;TۣB;<<;D;<<;ۻ~ۄ;<<;e;pۤ;<<;ۣZے;<¿<;VԀN;<–<;ZS;<<;<<;<<;<;><;:=<;HHFHHoHHMHH^&HH, HH^HHo4HH;HHAqHAf|HffYHffHHffHHffHHffHHffHHffHHffHHffHHffHHffHcffH|ffHtffHHffHHffHHffHHffHHffHHffHHffHHfAHHAHH4HH;^HHo HH&HH,MHH^oHHHH6HH>^HHoDFit320hwvxwxwxxwvvwvvwqxwwuxwzvwwwxxwyxwfwwywqxwfxw۶xwvwxvwxwvwuwpvww xxwxw txwwܖuw ƭyuwuwϋׁuw|ww ŵցuwyZYmuwzYY[begfd`ZYY[uw`Ybpvwvqleւuw]]pw׀uw߀yuwuwŶwuwx˶wuwwօuwрiYc~w݄مuwy `Y[ZY|w uw `swte{w߆uwuwyw܀uww}wuwɀ柳لwuwnw߅uw~„qwuw佅vw ڇuwȹwփuwxwځuwnwuwzowuwuwuwwuw}wuwrwuwxnwuwswրuwwօuww߀څuwvwuwnw׃߆uw}qwՉuwuwۋuwwuwzwuwpwuwyowuwtwuwwuw~wuwtwuwxmwuwrwuwvw uwwuww݈uwnw߈uw{pw uwpuw߉uwr\Y{w݅uwr\Y_gnaYe{wօuwr]Y^emuwk[[rw ߅uweY]emuwr^YmnwۏuwdfmuwvfY]twԁuwo]Yww܄uwvcYdwuwl[Yuwuwt`Ylwۃwgrw txwxw vxww یpvwڄߋuwց ՀvwԅՄxwځրxvwvwxwfxw۹qxwywxwfwyxwxxwwwzvwuxwwqxwvvwvvwxxwxw{xwwwustutvutsutsutsutjutuututw+ututuutrutu3ututuutsruto3utmutuutuqutuyutwřutut߂|tuutv߄ԍtw uttusut gVntsutȀVʑtuut qe{tsuttwutmbtw 8žvDut\gtuSǰwtxIJ}VWqtu+ҟxt}dVWktu#D 謕aV\mtuĉtu&KiAIA1_VVepmqtxԂtu)NjkkCZVV\ܔ[VVfttu+PkqZVZsVZlt΀υtu.Skpmhc[VXrtVVtu.Vk p.utpeZVViՀt^VVutu3[kۃkh.uthYVYtlytu8]kkke)utsbVWົztltuLknzkkd&utiWYԃti_tu\k+"ka$utlW~toVׂe_tuikk^"utlˀ߇t `ҞvVVmtu)k xnk[ut{[YtVftu8kkXutVVwtmW^ktuFk9&k7ut`btktuUkk9Z΀k(ut potntuek҆skhutomtrtu$kt߄kZutsWVqtxtu3kpxkJut bVqܼyV_ttuAkmrk;utqZVYpttuPk+utq_V]otvtu_kutpiiotk‡tujkautqtu.kP࿒ttu=k@܋tҀͅtuKk1tVVtuZk"tф]VVutuhkfZVhtyjvtu(kVZVtȝtu7kFqlaVVہļkVV`tuEk7uttnYV䂀VWVg^tuTk'utpYVߔZVVams`V\zVVltuckiutoXVk̈́iV[mtq\Vetu"k\utnYVatrdYVV\ktu1kLutp`Vvtstu@k<utrljifa[VV]̀tuOk-uto_VXtu]kutgVVtuikbutlXVtu+kRuttnXVtu:kAutwutp[VtuIk3utDŽtqZVytuXk%uttpZW€Ōtufkhut WtoY\܀tu&kXut̀VɆtnXm~tu5kHut _`ftlVytuDk9utthtuSk*utfct_utuakjutavket_VVutu k^ut l\ؤ^Voty_\tu/khT>*OkOutVet{ʀʅtu=kiZB,4gk?utyXVWgtgztuMkkiZB,Wk/ut]jrtl_Ղ[tuJA,@jk!utYot sYZxVetu'_kdutu؀`tjV[rtuHkTutVotjXV^qtu0dkkDutgatuĚtsjegntuUk5utXqt}ڂ{tu=%utVhtuڄutuutW_ttuuttЁXZrt iVntwuҞutπVΒtwۋttyrettsts ٰtv~ats pVeƒԂ_etusZVY^^\Vt\VVW˺WWqtwZW^jqtqcVXVitpstn^V[dmtkZV[ktutqmortolotuyutuqutu3utmututsrutu3ututuututu+ututwutstutuutjutsutuutsutvustw;;:>;:;;<;<;:;:@;<;:;<;<@;<<;;:@;<@;<;<;:7;qg<;<+;KE;<;=;;pͭӀc;:@; =,Eے;<@;ۣ,ۡ;; D3Oۏ;=;gԹ׀W;<3;AՄ1;< ķ;P25;:ĉЁ`?;?ӀU,-:;:Ӂǁԩn?;Eeʁ:,7;:Ђ ϲЁƄЄ8,/7;o;Bׅ7E…;:.,}o;Rˁףvƀـ;:972,,΃B,,bك6;:;8.,Z,-,d́=0;:;9.,~֎l0,,18;1,2fzQ,,7;:y;9-,Bڂ?,/7;:/,4;:~;8-,7Z׀Y;4.,,/6;:;92,Mq;:;:;:7641.,,3w;:;91,.;:{;4,,};:|;7-,sp;:;MyvG;8-,we;:;?ـ֊=;9/,U;:;;:.,B;:;eՀS;9.-;:{; Z.fۊ;9-2uR;:;ۨ,۟;8,DԂ٥F;:; 31:ە;7,A;:;{Ài;7ŀځ;:;9Ȅ4;c5L;:z;2N͂A4;{6,,~<;:}; 72Դ|4,9;sQ1/х;:{;{i,4;Jˌ;:}fc;A.,-4;5R;:}gcdjszlco;n/6:;75p/;:|gcipzxdd~;O/9; :.0rɞP,3;:pchpzicx{;=_1;6,/:;:oqzrdh;,9;6.,09;:|gc™;i>1;=lh;6447;:ocnŒ;[\-:;EC;:xdd;`р,5;<<;:kcx;vր-0;lѭҀf;:t;O..:; @,Eۖ;<;NԂ٭n<;۪,ۦ;<3هV;;AiE3G۔;=ljٹكѱԀ`; ۵jLMVώ1;<@zF,;قԡi64;:@.,-00/,K]2,,-a^--:;.-069;:2,-,5;:8;80,.28;6.,.7;<+;:78:;979;:=;:9;:<;;t8mk@++ݳ! w Uf4< w M^29oM^18oM^(/fwDU'-fwCL%+^oBJ$* 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 $*AI^o%+CKfw'-DUfw(/DUo17M^o29M^ w 4;Uf w ݳ!++ic08 jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2d#Creator: JasPer Version 1.900.1R \@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP]@@HHPHHPHHPHHPHHP ߂8&d G63'H*+npy~NY|`d*1 =oA{MH,DB7߂(|W$# Mu?U.a,Nj1Yv=FQQjy)C)J߂0&wg{N1KΉN!vPGZ8)kB(2j2L*#6 ?߂Pp3A6BAH :"VB>kse3qcoͦeM#?%xw }b;(jvXͺC:3Ϣ;T4[jkE?eH;%6d8y~PI&d!O\Ɠ&;+ݟ]`KrRyOj z!EHN8a$_X-dG *E! N ԝdzC+.^zzS`lg&}n28@k!rvs~]su>(Y2iVm<ĬP-)9܊v ~A3s Z^Ջ6ncbQ9^ 2yQ.˭|Gi-䠘MjBWZbSOM+5{"ހ 6b--I`_Q^2{SIF' Av>4 B!lI0V85xl/ߚGb9g&W .*$Գڭ3-)%3aK#aV}qʟ[}iuMJВYNGYr|:?# r6EWc)LjWeO"7O$74R %zrND0 9S%pNrm}cȭ ?ƿ:? :jUw3Ed"0A|m\}Ca ^$pڻC#2t 1 w5@g0"[᫷= Q^܎lo?؎=~z43Ӡsͮp4Q uzL?q:A>ň >*wyX` Bs,=0v+£nRQ¾,.o3*Z1D}5;]ԡ5+UݏD5t<9a3A8-G(;YNR)2)̬(4jH3aNEsDzF;5R,DjR\fJ*9_RY3vP-o֞"&{W y3̎͞5ӅtL=_>;+i2"$ *ہ166p0bx^.5hm?:z.PS_P3BL$iv @,lŌ(dNT4ypRAPh|1.?<)Z/+B A@t㚇(&DQ4&F> 伌5a? !'ȑZ),/d3ՙ..Y`z] eZqO ?J)N`Bж2&!]*1 u4}z`Y]Ue92a(c\L43pg b˜ϾU[v5oҗ=ʯ$;b fp FMkl 9j (%:V#NP:ɣl'Z'B(/@B;V#HvaqA׻G]:+%Ĭ kkC(\Lo|ӑo!.Lm̝1JɊ"-[l!,; qw(w¡7@5AϸrÜ5jHBj9tvlM 7S#&w ԘH[h"ԤI1'5\2F:wœ=t}5zg)AIlES Rf '2yܥhxהNyI9~^o>~ z0ߥՐ5IQ (|/^Ҋ&c]oeH [czxڻ{&slUnx߾rCԞW}7]j pFXĖ34&6H5?&{KhCt$\>18=³nB a Ͳ7aBT`*v6 ++y!!s@ YuVZU;?c,`<4X2 kHi0Î8Bƹ9xelDb#2ﮌZ#Mk$Q$7)*x]]ɼW~!t^ }wB+WdoҖUlVhq+ŝoqJ=E0ɔ- _#i\DED4hC0 .(;)ZyLdH`' VAQPUYcL_f:Wk0OJ́تW B@(\cd` |C(IfT\()dxd ]czӨ^ߕPn֎*o Zfk6I'gPC~?\^5.G6QQ 8ISU.@$d4IS*J.ew5u_T}6nޖ+Q?eJ| mjoI,yfRP;znЭR^]\" >ɞ@8+/0d ֤!i׾\r0\,Qd#~C+_XGYO$4oaw7" tZrqb3o[K X1Az, b`ZqR*<ʩc6b-oU[ݡ[:XֵSe^ 0s!Y|eȔQ''°zhOf9@- Y/Jv[҇-r]t5ٴcG[ :=**l83PǍS/ )1BM/g$t,0U 7tt28,Sτ7O5Ct>+'8bxQ+1w7D" +I/".bW<2 $iU"/ٟ֘t xoF?tEkޘE WzM]op+B.án~P_o;zI܋qF.9Ez\2؟C.sC/}Wk䣞Y ޷G yH\J nifqg R< JWa?;NKvQ,X1.y5j\VSۍB479\^$/AGHƯ)DJ'PUXsL{^]G"ZwD;_'thI~A*x8@r}hgCYSCboSj^͟Й@*k9.7S($8#B(h"x{.I*%4\/HVMkR01^\rbq>>83Y]ej*(JHd`TF1 =̳<(JcN H4e -&`N3"z+i nwLuҋqs"T6$ NM +ս2ƧN*tMqC~b!ԥbQ^S|kK4K~ <7qy?t`ݶSNJ$ڲ toQ%}.SeaB=YS檇pW`ܸH⍧g_K|G3kR@i? " H}i^J䅥@j^swQ3H<8aeOEODeE ڕ9t4`'ة;LHߪ=gZIl<1)>7o|iB Id|ghL4Oࢼ6Ffޘ*#ܻB[Y< YO#DH%`6X+򸽧# >BdS2Sxؾ9灠DmvF̽p5DY$'vi ޅj$sʧUT{6 )ƻA8tT*Ł0O){Տb{ʹe!.v #χVfXvj#-dG 2a+mz6xnJMDMM=Bh,a+h"z%[2 }a ~+ãioL~%,=jEMR4]H*|0|ALz ۼBZ GKNFl# +fYjUfX͇Hhƛyxc%ҼlZ~s2t]դ 2Sd~qE㧆n7!{eƒikFr8R ^qD(NgwJ@~nqwo'm2@儆o9"54tCq(їZ/=Q+ޝT^@@6y&{*%I#G@)}p=F:'׿x.0F^Vuv"àRh@*ZB>mj^+yQ4-rsT7"˹ƎrlQyYnr$̽U!;*{߬wdF7 B#T[Oc T/[`WR~ Ys%;5B-X'>ZMʻEPa)1j,`a> 0| ?iL]"_O)7b4Ma}W͏b+i2SJh4j܇C<2 Z;5dm1Vq0!@RK Qh?z>Ƕlo\TxYӎڞ|[ ]n+L<<@ЋpY~a^%fO{?T'om@ݰKw4b~w샛Y:ڷ:e7v:=nY,~\hƺ"H":k~{0e SjnQ }) Ӽ43E6'o꾁pWrA|FίULy #\SD&ȜC _1E+5튗_CG˫4hŁKPquZ&2M潲) l"/.[:g߽/U|uk:(ԐZ#޻Vӈ:N3Zkp({K8rM'n~w伓Ku*p4_ u9WH!ÆHٰy'8](t ߁l&M WMyc:z*ñuS&o_EA%*2TɌ׾>D@wS"-ilX%WLXU 4,e3Kqiɴ\6ѯ^,T^Jfgc؏ՉP&߁{_24!G,rRo(#]%-r3贎;0 8Ϝ*@bȉAvyK蓞b3X_ eIYEǭ +4ݓEDddm/Eug'?@\ӛEHUq5.&l {NXN15EMqdXg ^8uK5t+Zc= .TXxUŀ~Sz*I,y7LLg\Bh\E#^h* O t7˲К}:{^c{Tyl]d5S996` {NdLA> fVn`%jM{pŅsU化g+|?4KB Xz7>".  pZ1l|ӏ* vE,sz%Z*b_) Z.7;n-*U&=7x3Ӑ%fˇ9"7GF`."4zح1olju0?Aޭ[jis´A2l%OD/n6y^QTC GPlR|/yf,*n)I[)3Pl{|Ta՛gk Cut{F&ss'՝e[LWcr;gƣ2Q#AR`dw|cԾa=_;tIj ފl愑t2?R&lmtɹPbftj+H`?HHCg8'"\x“̘drgG7h>W7zNszDOgyxjMfJG._?>RTAG.5e[(@G%@^s*&^7bIN^enTSDⰒ7aV!Ջ:YS(g՘N" F߷O+'}+mLrVDqɻgǰF!օ3nќީ5~'g44-3_Y~ tڇ圃}TSr#ה$ A:d&%봑E`6p6H+&q_DY~T7b@Toa~k *QnpKS~Rg{LSz@tgKʱ nq5Mok[$DfK02.:;TouKK·'AO$KO DC6鏪4ҚEI,us 4' 7ӱB\y>a9dz !8՛g0ST.PÚX?ͱY6 b TXޭ3@=BfAdFBIS`k-q0I-|jP!n)GgGۚi/3YQorLH+x qS+&B4/YuGD0&jv.b`8,cjH룈/I( $sD1/qhe`:`۝> @'`jҥwSƹA-"z);+͡Z߅sn[)Ew$MUYv\ݖdɏ  '#K( A"h #'ac=Bt9Έ0ԋ3D@=~#%|b\هJb17>ƠܤOZR1Sdq 'lw68 tIWFf7OC,Oz2l`˔ּ5orZ?.:}ꍾ,Z0NhjoZ~8vժ؅u֚" qXt10TJ~>Bļ:b%q*lidʥ |7d~+q1]n&lz*!EZf8㉆ db`!t~BiLPV#ɷ d8hV?  {0I-fu&[ڤJ3s 4uHaiYwFSCm‘՘cu~T{c)jtVMP,:̝4I(&[9MRe\vC~{E|pg gD@K.[p[;K>XgJܝK|4oPW3%׈WƔS^5tR"| +/̔Ba, vRН>T+\*a\#19N"@g153U6B@0T.D.+TN_Yi 8gX9u<ΝZ:tKO9`W' Ic)IuQʚPTNxuq䓤+υ#r!IXF!0m;?6^2H\F0|[y$6er:JDYY[jL<)n챼qm}0 pEUӛہ:fbfШW}m_tϞ*I wYyax ifJ{~z+嗎AB .3ÿEQvxCvKAu5v;>r8id<ƞ!|v/h c5y:P'brZ}U,H!|5! RtL!A+ Kf$%T1yI=ZH9,,S0 m5[è[zd9׻VIŪF,BvщA{ d'3kKfP>;x\!.![7\V?A񔛌d=5(wMf8P*jJX@sGsS+ӱpyΛk2\,ff 3))~.=(y @O[n6e47AKW9#w/<ķh$rZr!x[zfRzxOV%%#ݘиs,*(M}3qbͭͱjT] $wAc¯Sr oZ7;/X=xq oky с|+xC{pȾA]&_<}% 4; Iߛ>%DbW17c7pNr>nٝA)J{u;#ʥY->Y}kPА1b2$z%Lq]jf9oK8 "aىq@Syi D۔ iL~3É3X:9AZ=!#`8ujZE5E7ߎNȩ") C.Ih.8*z!`?w ɤe \"kxwor=!qQU߰Z`FK3 #6_8>qT jQJ];v~[QУ cE}?Sί/ EMtpr/B<ݪo }9#\.R` 蛑Ϡh\oSJTmmJ矷&<94OmG?5:4KOAocXY8p+ Pu{5q.3TEs<}4>tg : SD&:ѸRX@J`'oi5g +7ô?[;{ktuIB62Sb*`%I*{r;Nb^/:h@%*Hzj8?rDnnF%0Q rˋZ 09HR%>/{|H>*`2k0=²VӳE!<\P~# @{D򡜩ÉGmܑT s{1;7ˬ*']C\^Y\b 0wndoQK,!(QdӞʥDFLw 3ШhlԙXZ֗71M^U`\p$ z#5ltӱ@~xT^mpn dϸ‹{Xխp`Jx־(aLVkqKE&&t Lw&\#[qзÐU(v/ Ũޑ*r"S~Qzұ`~ GGOkJzF^?&\4 n#냳UYgߋr3bKA{eyzL?mCU|jg8g܍Pڑ aD'_Nv]j^.?GM%d8+vP:d9S6G'Xv *||y*p?DY3ӏ` i)uNl]8y#[\H*("w'lwq-?+@١*H$aȣ4JD晴[C$ND@EM^.J pE6z~'k sa#YnK}Dzl[[L>jx, ߬ICȲs'BD[={qTX?1 (r: pV@=gqΛ#}DVI:B(P0j#y"ykߤXDK&2(*M3Rk U㘳<^鵒HHyB3}x۱]%kO,Ѧ`%~o`\f'Ͷ`v2x .E%sosԉ|TK$1CQH|$78oTv}@{yeq$%;ǃ(YFk^bHήtL:L,&yE^. =L f ˷]ƋB/ؗ#NV B\%n6~ύ m~r\! #\<2U'wg?|6R?'ؚm5<=t`0 IU~&l

'R-wzcͷyRkKb2G"[Q)D.o2AE'1nZs+(Q%3`> _ N;|ghV޼YXC#L408eײ%2Q~Wmi3L #Qp[# ;&f?~Qz.Ȍ@TD-l߷8URsΈ:O%2S:k' +rs=AaPBp8*ʐl÷ Qn+|g<+ ̭)Fi5Sœ;JN:ޜNQaܘ6!]@Z[ߔ C ˽>/2UY8oظTkn-dh+lΓg> pfʠQ7^>Bkj.n"WZ.4J,x87g h /=(SVG\|eژc+cef((I0[<|%/H?ۛT!vL.W/ƣ᜙ J謍Iu)S18îR d]#ǐD`ŝ.h/L1NiIA7+<(rb!};%kF-IzHhka?@ sJIF-J TlF3Գb56ť`hBl04odVUujSyONŒ}zs/)!לNn0F5ߜ4NXU!Xl#_y淋-*% ĤF(k~֗9[3OPˬP { 8Sc>>$} d~X3 "\SH;?P)d.^aX>ӈ`%7"kVzo4;7yv?Z'@5 ٹTKI9^&K=O"2JEHHRF QX  67Myfc[T }=hVOv;nTDiyyKeJx.8T 1E<ɸ4(ԜճC8u|v|n3sebm'nml ºN]ùڙ'%L+0bh3Tn&5жaCĎinHeNƀJ+cF4̧e^<D<*0I#+ˋmuZЮv}vSsG"jX鑪AF=-*vD| oqwD5 \Ae'@U!haq-Y[ JhwMZŨ(c],}NiZu* ݛy>J(S}Ɵ)ai/ 9t8W擾ňf^itz.,|Sllh֯d6uF\ (>aU~&W+'ܦLyc7#\G*K)* \_MtFMVЎ~xmw!64xeZ~c|L*[S^ ㊯*8$u}Rp8WXN:4#ZWJ 4Px\7Qx L~&W rke`0픤\9WPlI-@#"E"GZBzqz#ůWRBq~YẌw3Uo ;kؙem׀32HLQ5n" g 7i@܁n~_$2WYMW)nQgˠgxz}w:`d(<]usfPw]nZ$FA淄G3Ta`QLD]@2f6xZ)ҊHJW& 4<ۄ(fTt[]ܓ BP8Q4 EQ d̈bZ" qﺔWR,C2 }uq Wd=K݊+!7g-q]b'NKN[I$D6:ҁ)L9.UJg U y0Pok[ڬƉ֨O-b&-VT+sb.j`없+.(2I8 a 99 >{$|tWcE}I 2k4^&%gO#@6:=x| Cd!ūm Z5zs+yMF` -Y#e2L:,L  4rU T1O=\<"$d82Y]qI !TrMr&[d1)cCD!mGIyÏ ;ױ .5^һyyt6eB4#фD,[v:ulc|):n55j,=uyD{2UG')H~0"38gj\H}U8Pi}09yDw"\%Ȃf~ef}{u!ӗƤz *wtjƲQn;˟۞`]XFʈQin?\kobn^I)]S;cCnQ癱_9 )sie!Ș-\F!!h]O$B:4ү Y;Ӣu68 pvFAh>"d,5dڙ.VGki~!v'@TZv4z X c_oh鬮DqxS2~.мήܗpsŝ$%nj]oBl5րveԶ]æIl~ GMP)+Oz?l>`BJbW'|0sŵ#U&OЭ YYP jca$& a%+Evl:Q]x|`tϰ'*ܸ(&xnZW+HƉ]"G<%kʖ1 GzwW'ol/C#zT2Us a'u}`y+hcEsÓsǮ_kiVE϶U95֙^Ƈ(]u[ʞڭ}RV$~YgӲipYHxu.z9jןyS$ϩ&EJhn;ZϹɨ5YiT_&a:it 0*`Gݲe0H?7mV/KQL_.PǵY|"s<grXɤ/'S"@d߱6U-NcٱF*% frOe 4)fs +]T|9aؘ*wUOE-L.+~"GUBVZ :\P? ci?TLZ,΅8=xdh GBsK F2T*-nW9jg^{0pfg5t`-l>XjY64[#ьfr/;rx~i+~Æ8])ObWkݸMsK?H R|/S1'QGx:#S hZ\#륑0YG0~&=st&,\<" C9l //viEýRwm)~}GsL1By>?j*+ToħYheλYZ״c@' LG/XWx?TK7esz fZb~I6J)w:]( \fbitn-*W0~Q P;GK2p4sDnŗ+ˍ6{yu[4u6NJ_8ciؽj߶A dP?0F9*n/)If,Hc8j@='p,"A]p;s B6gNrI<-ԗanKBXgi0^N:;$A{B<ma#KA;֗=cO@N(99})wYSwPoT696nY~€p I gRLyQ_nW RR3@s?Cy<@#ԯ-_g1 %P9)"_H'ٷ(yYIk| VF/g8t 9EG9PoiABL" &i.XE3Vs푢y,DS\ЊxQYE~ɭuũqtE*UwִK;Natv)K26ey]TuoB`om 唛٦k-s62S}]f"\T:zs3%95k[0wb$6yN@DM嘊qm#,B7K%vZXmtww@VIT8UB..ZN>_vb1Ԅë<6{ jdhh҅96J'SZ?n] hWh̲S6v+j4ƕL)t(Y3 1q*p u*wJԹnq}S3CczVWRX}jihgR#Y5HQ MCI%qk{\6S'!5wC{* <@U9rR뱗:DeE;qw(sN FYs,i6Rl[2؀ &-Py YCa&xz+%_l` =))\|75q r! &4 "SDx/9vZ uʦ; ~p8OE*qóM#XQGIW]x個,7Qo=t_O LaMDZ^(DMԋ},R^`Hz.)in .A6ܗ^`WE 0!KD@T)(7hBCS~`B N$vegF67/,{3A=_a@'FFzr5<6&2йq-W3V_ItN<'zwalyk.S+QTJ:1玂"b#آx37muq XH7֯c"^'B7ss Hi{w hb5SVx %%*!\C7*q9ebZi]Q7/wF6+P5V~XjhۯW@ƛg,Ge*z# d@#gsN/Spu՝PV6 Y䂰z(}?0CxGD%\##u-h rn+~=Z?ŒR-Hn$^y6h~*z@~+M"`NIy41YB,?tr0)bYm[j0vh dON:@RX" 1Dёt n`؛>(V^;SEDrC 3jg!a].;hm@ɵ!:Ӕ28L%M uy&at u .;_IUގqFQ>!\'< u qD5Ƽ)#EЂְv10NHFFv4pi:^8UV ZQ#*\EIԫ1=] P:#n13Uu)VZq< 4ɂnN/+:glοd?BDȀP,%ySZr1 k"6ײk3fF6#ܱAY̡2$lr,T5O="9)0+IʟF7Ǖ/d1J3Ib$wPhNW޾_)Cdٔ rʇق@B+⍌ذ>2\*Q=l]GsYW(sڔ<_k?h٘ډN5}g9g u}DFWYުyhoÖMDm?gzw)w~457;t[ոL8UL2\v߯T H0װM)*5#w,v+0^z"CgnP  anÏL rìFᗥzxnMk!T m! }Rmoa@(/1EH@))F㒫7dS$rR&|_a 6|/6[ 0,LЅq5"s9D/B#P?Q v+ʂ$V1_H.\+q 9ov@EW'3 io4PRIwY@nae"yWLG%T>;q:BCۆm&Jt#'lEFdUn`B9-As$if_4[U6(^|uPr!DGBAk%nw^Boq "RX%1E SKd~O``Ul$`|}uO>ϻWDra?s)F7a$zsA%`[}pT2 ]e;A5fڂ k6u ,f110FE6n a[-`~%:0]q}81ZDF.DF4u C#2 'l ApO =-83뗖_p&4W{-;t_ȉ_EGx'a;%kx1 E+yQI/}s: ;5 9AkK#qO]&K33#->b K,[JB] C~mg3WFt YP\n w5ʧ. SūhR9,-,nb*cwk$.l]ub\:D󮼗ߓ` i]_`(!Xr;IѶOsm]Q|#dRK q211 6$J$ ؔHnL?EfA\տCIr?VR g#$B|ZMgJ:h8X`d&ǤpEk%R" Z_iƻKJX(~{Y&OtG螞DD%-zv.giʆ]k7c]Vw\K0eDw)Qⲳ_0 ns?~`S{fI ahY$y Ղ2_&)cnI |[?_۷?oj~ݒ\_U{ J_%'iJ<cƽf(iiŞ] j9tR۱ ='D :=;/ d9Kvۍ[ᛦD`,o w^?MNt]yN0Ƙ[xuj ftP!ɬmiawWqš1 *C,-@8 <@]}* &Gp&eМ},SG9c# ˥P2W-.$q+ĝ(Y m Xűn;^!ga`<Yʻ17!mg}ҡMy 3h "?\}D|йA޾;;tJ5;!{m(wnC/Wd]gH}scKNHŢ uZ!I+3Ò?ZԩsԔ+o:\߯' 3E:#F)GR .>uA jRPw]M)@c}iw@={ Aswu;o/7\Xt8_Ty@xKe ~+O00NI44*I^% ] 1R/ ?.B.b?[ |(k\#6ʌymo u9u!llR_uwƌ0e r0e RJ[WκiqdX᭷$ӷ-kX9\{mz99?(R/nqW ~rj}o(~,8x/OPQ[NPDVj 98crc|ݐACm!1Y\?ݯTU(Jg~ 371Z&f`CHb}]Q_2hZqI|ZyuF´r3.O?5'EXS?As+氖K'z.!J /%?T[Qz:L1=!vF65={Ԡ a҃dդb\{&\N#wyH3Z?  &0Fht OD@`}+s< 娛([iB"fQdP!$Åd؄ $aG=_# &?&*R>: R]T@zٙHRLaWQ@P̓cPś#6EH# Q}V2,>[OQ$`+n{jUc⑙ L w L;y/Thz-Q2S)X'fް#'*Jk,\Ɗzr|S!<@D/!?'6JV &7Qw|j`hۀ08S`,wkv_tQk|imaZҾ2.yy2.Oc<^dLiN©Y_g_UCϰFaoo8"{S'owzxEW ]%@ne9ÑW slZkLwA9c}SU7@ ,F"z+zNoEoM 8zY: 2Xe@IJ!F|gd*8KAW}mH/($jB#$<L ]Y(.1mhI;*Q ZZ]a_?guN7Hi/ %H6 sJyrQ|ʕqG_ZW5Ş>k^0^=M-sw:#<fz+ɫ1?/Yjω)Z'^YAc1 .9vwrY؜69ԜXƵ8 [O0ɶM\Mo ׀X3>$ Qr<3Ϩb6ч0F-j6Oc,- [m%C2|@*$hf:l7rqOl7Ғ Hsd[Y6ȍbCDcZk]z(^@pm$Gj"bw8y4mo|;2ug3Z0kǮҼv{S.ft*ɷ?tpΫzI{ nIJAHý|!ļrU#ʞt(sy[SWLMQk+S |qRRlI8]K+"hHi sEjLOCtr0)u f >2MK#.s#'+@g4.ZCdiz]5/B`DmNE'sUf0ʈ$e5j mАnAC!~Z{Դ<^f{BLa>N7d-G2臱{Pg><&I$# { m=;~!vz3lq{c> = Z,a̓Pw;ƃ7u=Ll]l͒({T"N#W'Ńy1g؆D+\>iS2"ttujb㵗t7ʫ-gDc|?V(\J)=o8/~*|m~(ϴ'Ɋ9ӟ@ySE[`dM)}a퍖wnĽ N-cNoY5q4 iIި;cGl+ewbzPȯQnXD۬YAgNg#~>Ȼ:^f4L O&9Y[ vﴬ2uj7 a < MvN3U HLl!b.RtM5bmĜ}p'$]Pԝ^$Kd+sbqC3-K R05>[Z7iiO  ÚP.tt{Hr@, Fa{? w2\~`+ dQ˚!S|gB{ZIBYŲUiKiLw+bNA/eaz?I>'\a=ap6Ƶ}er]9GCb&u]Tb:C"-yMئo6tOyusA9j@Ww(0FhLOpaBj|7XѢ*Gvz[g_66;Ou?{ 4JB9L\;AC 7[чDY .^Obn`ߐ fdV ^YS:f\wv8S X}^l.'߀) UlpQ1}%5Hس,(4X$}ygXv*^_.1Pޙ멏/FUwGߒpZJ`))j'i]8䎗1W7'7)[Kb78[˫ ԎPWw2@5FrbWǚ0hOeӹ}3<` }Ue.ѐ <H~a m黭 $,43O-1vt(9wv wI7/o7 MZU\p7ecCp|%WDlDokX$s %-xM̈aB<:"8^vImS:nx/QjvȦ>9(k H3rO= e#tbat aӌ-avN{6J;sY>OFefG"Wyp75r@IReC%V#WII=n!pu;\T|u;`!b8vy/f)lF_Q_\dPERn( L+..V=1U4"0ˠ1yo2 o+#8D_2Co+JR@$QK˻W*ۉ3V \:UqbSitj]Ve\ oM"X`s-YbGJb[ŒdYvl^l>ErƕUӞm=~">r,+wTi{*9f'GHߛl#Y= )C\+f+q}GǬyAwH/T?VAacP "DΏ>@;CvA~3. ؚc͐EATl2 ?:f/HuY !s-n\ ^+_DO?"RNܷ3 vf L}v 1a [Ӯ O] h8ѝ$0̶B|Aڤd`dR>''7DXy+U3tf=n6:Uf3TW47hO-UͿI創 P-A)Fp=n1/~Xc8Dz;B]G=πKjۆm%sJ# P9/QrT#_8gnN(rW9+r <4g;hu%j?ujg\)T-YѺ4H 4?o2 ׹sy.^[B\̀iZUw'(COh7W&TPH5Rq 0tc͉DԻؘ1 dD%(͢ 2׽NכȹMr+D޷ON !3&"Kkd.c]|F1-I v(͡Y> 2D˜rnr)c]9cK QZ.h$L@jDLw5p Eё1i6ǵ!#d""(T;p),bL^#ץ\uyhOdÓop_9ןcͷ :*x, ϟj;פ#a !&?l+b'J4]ܕB9mߠU9С24|ͮgCʱfpD( "%^Iyi}=t=D RJ$ pmcS~9iaXMr;N']iJXy}Q >wMxM.pdxenVﺻgVmrWZm2fRa%sFnLV)S#? Ji^pZJ4QK 2 iN0P%n~Eo,5፹ι|)Q=Le)$/8 kJvQߟG@wVi:G$__KfvʩƝĢϭIGCuÔ =ܯ^(azdwjs7 '6':2jFOePEV_}JDt|x qegpCd9jmYKE] @\Z8exJ+/D=^mOlEZ%hݻ>ۡT?N0![eKۂXS0xvnpP;$;w Rt1am!+ep[0݉h梕jps#r )U4T#/}"$gXɺEEdJ$" PPD7D *b1 cG˯tK!\?|ψ31kwM^!ղZiЪJ 3}& Ly"!!1̧kATzD|~$a/ } 3m]4{<ػhgG|rb` z^VmپhY )_9&RT$pxf6.7)P;/c随cmjKO>\a.4&pUgp9vZ|I?o,*K3D |>Gb"^r? KzICb iI@;6_4p|( }߼/5-<ymȖĐ<̀@S-qokCW}Lǩ.!}kټZރbx8AŻB崌 Mzl]YY4Xr'~p5Ű( $w%( Tr|؊fMڜM5āK` )GCg Ll~3F`Fq֣Rml);.F<"[E] Ⴘw͑h$DfqSwX`]|@]=(Ȃѵv; GmbXN0Ϩ:?׀ڲ S緝]*$%(أR d+@ݮNkq`$:LzB$IDPr5L j|>T#n,%! 'QW|ƼÇE ~39fٓ׋弯\֮Z8EɈ v=d: {ґ$AR:G4CzIߠϜ}r=^jdֈbki%xZO[?{~+h֖%`*U*]Tg0}? C %d|1"g7+p|dOsdt??T#D"Z?n=6?xK`6"Z)oy}kYoS@[m;l}&Gdtu-IF#i85_lɢ{^2 _,>$}߳Wab!WZ.; whS&9'̩ ,y|.6S{0e~yI=scm<{R3FXtF<^adVej**j ^DAO -eGnW[13&kOT^`o/껄\hԔ %w[82E!%)}t;B; DlK# 3%ۂƎtW+'h2)FihF1<P9XI *V'o(zU$@>H@Xjlr2ӠjvS4&(" Vg/QY<敺;{W6ەpRg# ǻ _ .\f^~2AUD6m3n b0T:0/a;eBOSE}[|3bkд? ~&B{) ]hW=9Aک[Picq`{յJyOˍ#bE 4[^&QK4I4`-@X3~$ŠudD%B;n1_1IƛG#$S_;!@w[)4 L"8݁V ؾ]}Ҷ"hOxD;p!Ա꒐\N@I˿,lPT+n3=)_6ZڑIXR~K^ۥ:FNW zE cZ\FF>AL㑘!|#- 44zvFt VTTnwX Ѿ$765 j ,n,%zoF|l#u|Uoli֞7pm?Ki3I!q(_ڷጯU6 b+:yCvͦkf}d(ZWwQ|0PZ>84{û421M b5Mt"PHْMn{s,$}O4>꿏ˋQ=q${][RQ`_\Pyd K,R 5ZZw&BrJi*x` @l{Sc<|0"a<3Cِ=3, [ V+Lĝ|@̠6kEznjq+aV\: j hrOMP|Bal%Q_6όc_.]<Ӣ 6|a\j`ö49Gh*k };'Gx"5{%.xrYmU07'D ʉ^qE+\gDEt"3ax 4Hݞ|f7&&7&W|s,YJb>cS y"+**BCIE"O. eNq̤V=+_X|7E`LrO' y1c#gg"4MFs˝ %}T =Ys W o_"\#DO4%22U1ĕU$hJZ֐e2H^ n=R21m? מ+M8J=gskvr\:45jH +ҙwts7jɥ^g'GMfX^-኿2Қ^āMIH8g:A e@'gt _pzYb5kS2(?1BqazZZN9ƆctŽwR-r9 _`{ ^uv4E&:782_dmL])@ 7d>^:m@i;#nN%怊b{-SAd͐A,MY>w8i[d`&\(ugs\nK({u/ yqY? 's`Q0²lqM]u_:P ߱;"aޫZ>wn]`l0w9"fs WpǑ2 wMԢo-}49|V5; 14٫# MUH F9`;߁ B8EYYt8+P5^;Y7*~+ƒj?jyz;ܲkUr8|s%tH]n$wd/O2g\ )nTi VdY~ 4 ,-R_' OĐ1VEq˟9&w|_`Hn+%ݏIՂyz}7_(­0->W,pP0c:-j%!59kJ4PObb玛NF7'U=0(Y^4*5OQI↛x)Dq!9{~>c0i]~K):7JLlRCX??hrγq`ѓ#6ZA1ꡛ%A {OLS޽C@SZJibeZgHtoB՜b6 n2¹)FY3q1>R k|o S/ZD T8Nbn~ymg @@"@R% ?!DMS sE\Msݒ$6, wELm{_G6<T6kBY e"Jؚ/QI?8iĻu?/o/^: lZQ0ǀK@r3%l wˋ0ڛ"0ЁW$t~'0FS2gcV] OBpo)}ݛfK c0yh˷Pۯ,i)@wWkWxM홴SUH0?QJRWfs1p8&u ; o4 6G}Ûj?6b5Xr(^*as W ]j?]֜*Tus'CosL/:V:Ho8OH[Ec(!-b鬠l|2km~8)5OD,4.woKj1&|ڹ9'W#2V_hӗ?MCH"|fA[ƍ>>;JQ/u/xe;= 9pD[vnvmᾔY 7K،"# `Uʱmh_ %*w"=@Q.uZMTmˆzՒ@ɼd" @%J2W6,;q ?!NN omje':lS]8r$Ј?e+6zfdDLS;DHiV}`e%yYQ4\6!aW߳/- (J)B1`&%*DxkdT0xӀ["iD!}xYmUEQY{ȿ=oSXqtD*Su,I9s(^}CXHrh'Un&kEG ˹p0?TS3;4~aF$Л&Qk##,cbOgGM"j؟p:M?ae0>+5vQЁ6/p|UoBiyK-:Ζ5J A9uvބN^9)R5(R տ+D[;C @G]ŔĶ%ѪJvMyG;dK%\Q*pzTwt&]HNF~)L|nd`۔MiV@S= ߒg8XWyJ +ʤkK)`h|zC]xU2ba #ҧC˺M2MR{$v5nM7%F`z@3'?*w]ʹqѡ<洁L`$@RMi=x%cI=.zr/ֹ –g$"k;O/ϐU)Za "N>W}~*ri=Q;Ri+7Ġ/-CdR#Rqn+.%yG:6 I-圦fj["[mb\ճ\Ӈފh .GQ iY$Ksr@ zѝ6q%'"Pu2H!Nm:#L`yĂ:v"D G8 4*sȣ| g, 5KID%U﹘xEel0~=g:7e^gjԨMۙQ_Jmt?m[mQhNS/Pս+m2/ m:Ȩǿ$@rm'91Gji V90f2Few]@Z 맢?lMpL۸kDC6LcCnp9Gso|OLoU)9xvu9[MM{#˭eTNP2Z|7n:<(ѥ|?ޤӖS-Hˮq#I4̉f|l|cy0⺯a\zȥ\9!^v";RF\=t#=p,VFKW_fBdX=_opKRՋO>aA==Sc/J[a\GOv~h$aáf6=-1peڇ>+OMX_~^R ?`x/jxEq@72=L>n\_/ uîR򗔼*Hr,JDg?%G473ulBbn)lw)57LS9QC%Fܭ7̈A3)|F`c$LU=P'!pZ8Iu# }抓A- r%D=K_ܨEYxfԣ!%ꓪ͖Udf(sFK 97'<3" h+Wo1 l\GIq#zAg 3}bzmu^Ft6ZyB!ϴ!7xahX* OP1]_Oh#߄nߝfwy-HiֵXx[pHJyE隸F1$:M3FAKF W}a N*~|m6Zir<ݕCijtJY[tu h:44~}wzo$56+UcV8hlkt>j(X~}l- a&X3f`a)V>4dE@lmw3~ĤI;']E FJe` &0? Vl"ҬbRTw4/\OlYZWche%;ղnF#F mx'*]}%zd^B &73ҞHGxⳋu,1@ lj\E߫cTlz7 39l< dEC3H`F3鱙uӱA\F0CO!V/a1"{K^q 4!=VRpo6ԁ*Ь6YH8hkpR?sᗍ4NG?&縟e~*1lTZhkȈ'|rUtdp[PBK[x\&124O <"R)dDelxkDç2i;DukBsjvv!kB #A[2HR^g@u4e~<~ oji0C0NF 2Opicard-release-2.3.1/picard.ico000066400000000000000000003047631362601763300163570ustar00rootroot00000000000000 (.  53V  (=00 %E  [k | h( @wxvwwxxuwxyyy z z"}#}$~%&,,0134789:@FIIQNOUX]^`bdfhijjk9q:s777777777777<9777777777777#1777777Xx{W77;11)*11%977777EtvA7;111111+77777R[aJ7;,111111977777Hs77&111111zjLGdg[@77;!111111mywT77777;111111$7MlR777777;11OiY1(9777SN77777 .K}h0 7777Q^777;'e _|197777DqsB77;$Ukp/7777P`cI77;.\uF 977777to777 -:n~fC77777@ZV=777;"]rb9777777777777777777777789777777777577777779777777777977642?( vvxwwaE"+ޛ-yCwXz$hp̉adșEe)=,=$ ? T֨ڟ w~}WC[HWrdGadJCDѿ- |Q0Y %Cۗ`9αNEldrD7+)r;`p9a{Osft3nFxd(ک}+,c22CvʲF|~qt9f޻㜩JIVsw,g@&=5] EWLDxr},'>W_d!1MH>Z9BYD @y;֎&(X{wp ~5މUܩw~,`iz(.=b&ww(wtaO^]KalW{(Kl˛@U=6w>_#w$|[k,`Ә3A|# HNəځ޼| @"?{]~"̯P< @}M"gE?`Y09VjK@UDJ՝{緡|wTf~~ @C>;bT$ z;{ !XUpż|^ ^ 'J/rc)~Px 5}ۜw~iY^c-G?_[~Y]`dk(,tR޾E4/Ԟ?k}L$~Op^rʊܽem i f5'ҍd-ȟ 'vjq{?ՌW@7}ɲ@0k K Qǵ)e$T{R7ݞ!mkI_nc2{d#E_!)3IBkϫ&hXMPj$eP{a%X H"YGFLR&%Pum PrSŇ ɟ0|Ø͘#ZLdkmd~.O2*N_Ӛ'Z21=Ls~00N V$}WқIN3@m|ӈFW2* V"Avf5=`ۊJ*?<$Ҋ|o32L ׹Zd }aa N QF,>${ʌf3 >*`tC$<=?=s~##*0(ƙ/;2ݬ:5j |8Зґ[/!c &V& W@u^}5wvA:v\kZ~ ( S0xfoFX  V}A߷V!{=30A,3hՐA0֚kkȴ\F2M W8tMȏLj4(ւq#" L \k[!5(zrdB U)!mH9}'#`!>+ҝ~)3|,1pb3`GCڈw?PWR^3G!MC9ޏCӄKh& k~Xgu|+7Jx^ېSg+6T'@Vw';7h=wF/$pN 2a 3Sh9Sd-)Вom]>P_:ީ#Uΐj7r§v!gx/Hc;P2ka Cqpcs29x ZpOS Awh)Θz:߃ nz]f#wwC I<%D` cհcp IݯAuN w>v75 1q`2;ŲsFݸgB06N5\4 1wANŹ玂sL  j@r{uKNZ,8ώ~e>cXdنsd7<84+F xLȱ7ʅ SON >ڇS{;h׈ ?19 I I$DC[+LR ˬ7Ñ9gy s.>RUSy|S㱃@(B $gF"Uv'"?y{wrHCQvЉC$]O_X], syIW#?)M ~v}4rʬ&$' ;ɻ:tz Kiof1ݢ~_BV^r\b;PwuHԹ&k{3uR8}j! ֮48y[<A¶b4@\Khʻfg섊E_LHyG S?eo.ޒz fE߰ln L R2[Gۭ|/b21ΪA\K}4:k{ 6"Y6P[y['7<xX3i7= y%9Xy^svӘ0rҙGӘa?Ţ hw^-Ր f|fђ>\TuV,`e>d o@4h08М YmD8]zӏ{m>8G0{3;(ڟ.$5|'IÒwzꫛTT jGPξ ڿF9|(Bw+&_^cDvt @cW?K@COu=I.W!f:a/ϙzs'n K#e#avUHf {Y](~@@xo07 P|>@۱᫅*&cK0hzv~ حc@p^Igfj @]bZrOu^8Eؓ:p ?Y)H%8Љ|)F*~Syy"P(tdཉCN_C,_fَ2݀LvdY)iߏ z-Tq;ތC`ӂk`P?04Z.RlUZ"F!ʥd.г_Sw(I'u$(şҴmɈµZɽN[^J T Ar)k/3Vm  @%\?'M'$d g[$ַ0" W߄:V #Ft, [ækFQs>W#Ƨ?1Uz]~56qTcB\`V ޘT3lEQ8A bj  ;y  Fb?n+bPk9[k= Gh/Awu _PA @~$H .)<]~ӷ0["EW. v QV?m?˽R Sj!^ Iˡ֎ Cmt:u b QsH]| g=<x1?ᩇѷᴛ?%5q qG2]]_ե/= \qWw ;G wjtۻc)LA+ .\G ؊R\j߻)LVM&hXl >B(=#T7PvDǗJ/1](,9+Xtv@/ug^]UE w*w@{5nhd.2 ' ؛AʌPC{ )-`ޛQ'/T5=L| BwQPueM@4Ӻݻ4)֢,ϱP7ɩ!0 ]%w[mPsg[+nt'~Pwc#(zܽW@QΨ ݀r` U6:ב 6&P}"TTUރcXYF=tp/;-g96P| :;vXlT"P/OT lttF)ƚ ,/ViܟK!us ǎ{lix!g[([8N`xʧ,OK*P4ѵ7ќn8}!άԹܦ939Q='u0&cH$p,X8h "/9}F;b`(%D6|4'w?x{F*GvBJxG+#h :Oy78 00#GdX6ol#ǕHJa<||G 4_-PhxIsC3yHha9I a<{dڌ/~vz5\pՆ"\!V}}+b)6|G8"  mrEֲ9sm|Fw=;(N1& ``-Noi]|Ja7ܼX["# OEl-bhw^?plx(%!2_hKWˌH^6gg|/-AdiL+F垒Y(lIƚz@@#%?$eۄݭ,:Q`B&G,*S dʒzxW/XA./h)݂jblI5WQF0X3i`E4puڍ;|ڔ5ZD1YK/i3m?@}TY,Q7tA :Q_21aph?*ؙm$T xܑ,$˟2 l l`-_QZJolm g,5`{g{oN6 Hf 9Dcr]r @'+~; dH NU^J3SL XV,h -dvd0)= y TP`ӷ->.J 0I9fXfb%}TrRkhkm.tR_PUu's 20 "8pI?l{D<h7Yuc/ZRU8Ҟ&!,oğ Jgr"gwnn {ę'Zb'cy^(%?sU|f`F_ υ,hd8H Չ!Д%9dwki9ؐM0HUHHz&;Mq q @D9W3sˋa3׳t=9'Xp&%!_"}vE *w6<ة3V Ze UvN9F#+j;'D5Z{C{LtM>0h~mO{i5P \`j6A bXb u /_#4Kʳlᐠ`UД }|՞_k­G V^͡)gcKgp`FPɏ+EH&4һ\9y.@C+%A{ qN 3'A4(r/VtRfbNM<\ro?͑m(99˃u@Zz Ţ&4%F@x?F!5QT2^HsA onP}"JCrwr.kmu2@̀!a9Ņ :qa{ჿ1t+$xLdYA%p)a4[K<;̱dfe˧],EX(s;ikm(ZY^$!;4wΖASd 6Xd7<`kv x 0F >n "HofM*< 0qF&<ZVv,N!D|(4n0vȹ#awb V <&\ HrnMp0kx|wm- F'G.`ZkhXO8;K#m͘†/剸D׽1~Z d⇤ xIx:;kخ ÍK&eQǽ<ԆaܟT0TmB=:f HT.3X=a;^JBz?uxw苄W7=h4AxAep Q @Mr4'YJ  jg-@pHݣZqA[=hH;$Zl|MC`N 5ޥM~&VuX-9ciܟ[2 m%>CLק&0(rf'CiL*\GKzXL &D0o)uHOS:Gw0K0~@&$<ܺ p`6_%^T/kj E(==ZdI8$<7D``Zż,G$6Xh >!F!<3 O 3 J|i3~&€\~ @?1mCh)[ݡ|hNmGa]ң0uD܃wr7^Or v&B$]w~x2& 6VAn҄ӔU{nI@Ҭ@D.BRF]{g{oa В3M$7wV,[6ZKni9?zLH{fv5)DׁAДY4k[\)3x^+f2`mD gt9qעQإ5h0`V#Z=WK~+w"+|Lcٲk47t)aUCh ]54UIKڛe|RFo>&Lt "0\H =|#Ԛ>";0iPanroG?>w0 }/*-4?^ _1Yٸ >8n,{+𪏇sT-8}}Ǎ׷oA#$_>G&W'' =1G.%;Qs7FN qGi $| L*OD55vQjo?9r0H3!Bяkm -Rq+eVPc`aJ-#.Z9 G j-D\!5HOq^CBL9Y7~B}"_FLD&m(5IP{a%4ڪ~ Pq4 4eRoP>kxX;fB?x/l[bDa trQ$iB)IyŸG?c{C"&mU^̰mܨ9>QFCCI;UZ;f?F @cFR38 ׹sXBܦ[O21cGАId!%kݸ[WNh ٙUK9'=7ywoېK- c:#_ȿwJ{ L̨ I޿`KZP'B?:2«ߣ1 I{/ͽG&鳆ɐ$:BW MZjrN9R`+(Xu;Y9kQ?$}=h8$b -`~$S3r;UN8j ȍ$΋t΍d-m8^;9ec?a ڤad2mX/a+s͠ y g Q_ztJ,=YN+R MjC!cZ9?dF 0]M-%|'Cۛv%<}^Y5ot:ȘnBIL8Ɉm+̘ͧm7 zgf\B{r)qo̧z{Av?5|2wL`ؚ[L1p3uebr/K{0ƶ;>FFYh;nrnjo_mF{lw죶K.V#Bv m3E+"Lٗ"(vhtVf}>llx}?yr!7 Ay6Ǐ0ί)m3W+ ύxWdž ;?{!j X GLg +2 m7M߽J~`,;hdZсM;/keіyTn^j-]$ PqE࿈Nv.~οx7:~(3H ?^mQ[GMa7yv^I\Їf㝏oߵ[hYF6+SϹ%1qOZ;V8{N1( <2kBgC|E>7S6GEYYUYj(@jw [?y;@+"㼞.t PfV#iT6r~`5 `\kŇga@O|XQh'je{c8{n~zRh|?rm}>௅iuӢ q/Tɡ2o8~2~তDhm{GwwTo`[@;?,x}@hsN9{(nqw}fV&@M՛Swq~~`m@qV@0'޸3@ں$P, ˳ZξtP>h!3 -g\/p}=Sznd3IENDB`( w+;w+{xw;u:s>t! xwwww;u;t;t:t;v xUxwwww;u;t;t;t;tg1a;t;t;t;t;t;t=ulh;t;t;t;t;t;t;t;t;t;s6j4e4g7n;t;t;t;t;t;t;t;t;t;t;t:u0u0wwwwwwwwodqfzmuwwwwwwwwwwwwwwvrfdYh]HkkkkTtwwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t,V9o;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t6j.X,V,V,V,V0^9q;t;t;t;t;t;t;t;t;t:u0u0wwwwwwwwpecYcYcYh]pezmuwwwwwwwwwri^cYx'm_kkkkkd{nwwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t=u_1`;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t6j,V,V,V,V,V,V,V/[:r;t;t;t;t;t;t;t;t:u0u0wwwwwwwwJA|,rg]cYcYcYcYi^pezmuwwwwxkd[d[@jkkkkkkk~!rwwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t;tO/Y9o;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t:s.Y0ZrPx,V3e;t;t;t;t;t;t;t;t:u0u0wwwwwwwwMkkiZB},rg\cYcYcYdYj_sgznlacYoeWkkkkkkkkk/{wwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t;t;tn/]6j:r;t;t;t;t;t;t;t;t;t;t;t;t;t;t7l5_p/[;t;t;t;t;t;t;t;t:u0u0wwwwwwww=kkkkkkiZB},rf\cYcYcYcY4{gkkkkkkkkkk?wwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t;t;tAy.X,V-W4g;t;t;t;t;t;t;t;t;t;t;t;t;t5gRz;t;t;t;t;t;t;t;t:u0u0wwwwwwww/kkkkkkkkkkhT>{*pOkkkkkkkkkkkkOuwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t;t;t;t{i,V,V,V4e;t;t;t;t;t;t;t;t;t;t;t;tJ{;t;t;t;t;t;t;t;t:u0u0wwwwwwww {kkkkkkkkkkkkkkkkkkkkkkkkkkk^}pwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t;t;t7l2\|4^,V9o;t;t;t;t;t;t;t;t;t;t;tsQy1_/\;t;t;t;t;t;t;t;t:u0u0wwwwwwwwwakkkkkkkkkkkkkkkkkkkkkkkkkkjznwwwwwwwwwwwwww;u;t;t;t;t;t;t;t;t;t;t2aNvAk4e;t;t;t;t;t;t;t;t;t;t;t{6_,V,V~ho;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;tBy7jEv;t;t;t;t;t;t;t;t:u0u0wwwwwwwwwwwwwZkkkkkkkkkkkkkkkkkkkkkkkkkkk"rwwwwwwwwww}v;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;t;tQ3],V,V}wqgt!w+;w+????????(0` xxxD:uF:t=yw^wwxHvxwwwwwxHrvAwwwwwwwwwwwwwwwwwwwxHw;t;t;tTB{;t;t;t;twC{;t;t;t;t;t;t;t;t;tw;t;t;t;tW|rv4vƅwwwwwwwwwwwwwwwxHwЅwwwxH_' # ie. win32_20140415091256 PICARD_BUILD_VERSION_STR = "" def version_to_string(version, short=False): """Deprecated: Use picard.version.Version.to_string instead""" if len(version) != 5: raise VersionError("Length != 5") if not isinstance(version, Version): version = Version(*version) return version.to_string(short=short) def version_from_string(version_str): """Deprecated: Use picard.version.Version.from_string instead""" return Version.from_string(version_str) PICARD_VERSION_STR = PICARD_VERSION.to_string() PICARD_VERSION_STR_SHORT = PICARD_VERSION.to_string(short=True) if PICARD_BUILD_VERSION_STR: __version__ = "%s+%s" % (PICARD_VERSION_STR, PICARD_BUILD_VERSION_STR) PICARD_FANCY_VERSION_STR = "%s (%s)" % (PICARD_VERSION_STR_SHORT, PICARD_BUILD_VERSION_STR) else: __version__ = PICARD_VERSION_STR_SHORT PICARD_FANCY_VERSION_STR = PICARD_VERSION_STR_SHORT # Keep those ordered api_versions = [ "2.0", "2.1", "2.2", "2.3", ] api_versions_tuple = [Version.from_string(v) for v in api_versions] picard-release-2.3.1/picard/acoustid/000077500000000000000000000000001362601763300174615ustar00rootroot00000000000000picard-release-2.3.1/picard/acoustid/__init__.py000066400000000000000000000236141362601763300216000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2011 Lukáš Lalinský # Copyright (C) 2017-2018 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2018-2019 Laurent Monin # Copyright (C) 2018-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import deque from functools import partial import json from PyQt5 import QtCore from picard import ( config, log, ) from picard.acoustid.json_helpers import parse_recording from picard.const import FPCALC_NAMES from picard.const.sys import IS_FROZEN from picard.util import find_executable def get_score(node): try: return float(node.get('score', 1.0)) except (TypeError, ValueError): return 1.0 class AcoustIDClient(QtCore.QObject): def __init__(self, acoustid_api): super().__init__() self._queue = deque() self._running = 0 self._max_processes = 2 self._acoustid_api = acoustid_api # The second condition is checked because in case of a packaged build of picard # the temp directory that pyinstaller decompresses picard into changes on every # launch, thus we need to ignore the existing config values. if not config.setting["acoustid_fpcalc"] or IS_FROZEN: fpcalc_path = find_executable(*FPCALC_NAMES) if fpcalc_path: config.setting["acoustid_fpcalc"] = fpcalc_path def init(self): pass def done(self): pass def _on_lookup_finished(self, next_func, file, document, http, error): doc = {} if error: mparms = { 'error': http.errorString(), 'body': document, 'filename': file.filename, } log.error( "AcoustID: Lookup network error for '%(filename)s': %(error)r, %(body)s" % mparms) self.tagger.window.set_statusbar_message( N_("AcoustID lookup network error for '%(filename)s'!"), mparms, echo=None ) else: try: recording_list = doc['recordings'] = [] status = document['status'] if status == 'ok': results = document.get('results') or [] for result in results: recordings = result.get('recordings') or [] max_sources = max([r.get('sources', 1) for r in recordings] + [1]) result_score = get_score(result) for recording in recordings: parsed_recording = parse_recording(recording) if parsed_recording is not None: # Calculate a score based on result score and sources for this # recording relative to other recordings in this result score = recording.get('sources', 1) / max_sources * 100 parsed_recording['score'] = score * result_score parsed_recording['acoustid'] = result['id'] recording_list.append(parsed_recording) log.debug("AcoustID: Lookup successful for '%s'", file.filename) else: mparms = { 'error': document['error']['message'], 'filename': file.filename } log.error( "AcoustID: Lookup error for '%(filename)s': %(error)r" % mparms) self.tagger.window.set_statusbar_message( N_("AcoustID lookup failed for '%(filename)s'!"), mparms, echo=None ) except (AttributeError, KeyError, TypeError) as e: log.error("AcoustID: Error reading response", exc_info=True) error = e next_func(doc, http, error) def _lookup_fingerprint(self, next_func, filename, result=None, error=None): try: file = self.tagger.files[filename] except KeyError: # The file has been removed. do nothing return mparms = { 'filename': file.filename } if not result: log.debug( "AcoustID: lookup returned no result for file '%(filename)s'" % mparms ) self.tagger.window.set_statusbar_message( N_("AcoustID lookup returned no result for file '%(filename)s'"), mparms, echo=None ) file.clear_pending() return log.debug( "AcoustID: looking up the fingerprint for file '%(filename)s'" % mparms ) self.tagger.window.set_statusbar_message( N_("Looking up the fingerprint for file '%(filename)s' ..."), mparms, echo=None ) params = dict(meta='recordings releasegroups releases tracks compress sources') if result[0] == 'fingerprint': fp_type, fingerprint, length = result params['fingerprint'] = fingerprint params['duration'] = str(length) else: fp_type, recordingid = result params['recordingid'] = recordingid self._acoustid_api.query_acoustid(partial(self._on_lookup_finished, next_func, file), **params) def _on_fpcalc_finished(self, next_func, file, exit_code, exit_status): process = self.sender() finished = process.property('picard_finished') if finished: return process.setProperty('picard_finished', True) result = None try: self._running -= 1 self._run_next_task() if exit_code == 0 and exit_status == 0: output = bytes(process.readAllStandardOutput()).decode() jsondata = json.loads(output) # Use only integer part of duration, floats are not allowed in lookup duration = int(jsondata.get('duration')) fingerprint = jsondata.get('fingerprint') if fingerprint and duration: result = 'fingerprint', fingerprint, duration else: log.error( "Fingerprint calculator failed exit code = %r, exit status = %r, error = %s", exit_code, exit_status, process.errorString()) except (json.decoder.JSONDecodeError, UnicodeDecodeError, ValueError): log.error("Error reading fingerprint calculator output", exc_info=True) finally: if result and result[0] == 'fingerprint': fp_type, fingerprint, length = result file.set_acoustid_fingerprint(fingerprint, length) next_func(result) def _on_fpcalc_error(self, next_func, filename, error): process = self.sender() finished = process.property('picard_finished') if finished: return process.setProperty('picard_finished', True) try: self._running -= 1 self._run_next_task() log.error("Fingerprint calculator failed error = %s (%r)", process.errorString(), error) finally: next_func(None) def _run_next_task(self): try: file, next_func = self._queue.popleft() except IndexError: return fpcalc = config.setting["acoustid_fpcalc"] or "fpcalc" self._running += 1 process = QtCore.QProcess(self) process.setProperty('picard_finished', False) process.finished.connect(partial(self._on_fpcalc_finished, next_func, file)) process.error.connect(partial(self._on_fpcalc_error, next_func, file)) process.start(fpcalc, ["-json", "-length", "120", file.filename]) log.debug("Starting fingerprint calculator %r %r", fpcalc, file.filename) def analyze(self, file, next_func): fpcalc_next = partial(self._lookup_fingerprint, next_func, file.filename) fingerprint = file.acoustid_fingerprint if not fingerprint and not config.setting["ignore_existing_acoustid_fingerprints"]: # use cached fingerprint from file metadata fingerprints = file.metadata.getall('acoustid_fingerprint') if fingerprints: fingerprint = fingerprints[0] file.set_acoustid_fingerprint(fingerprint) # If the fingerprint already exists skip calling fpcalc if fingerprint: length = file.acoustid_length fpcalc_next(result=('fingerprint', fingerprint, length)) return # calculate the fingerprint self.fingerprint(file, fpcalc_next) def fingerprint(self, file, next_func): task = (file, next_func) self._queue.append(task) if self._running < self._max_processes: self._run_next_task() def stop_analyze(self, file): new_queue = deque() for task in self._queue: if task[0] != file: new_queue.appendleft(task) self._queue = new_queue picard-release-2.3.1/picard/acoustid/json_helpers.py000066400000000000000000000063651362601763300225400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. def _make_releases_node(recording): release_list = [] for release_group in recording['releasegroups']: for release in release_group['releases']: release_mb = {} release_mb['id'] = release['id'] release_mb['release-group'] = {} release_mb['release-group']['id'] = release_group['id'] if 'type' in release_group: release_mb['release-group']['primary-type'] = release_group['type'] if 'secondarytypes' in release_group: release_mb['release-group']['secondary-types'] = release_group['secondarytypes'] if 'title' in release: release_mb['title'] = release['title'] else: release_mb['title'] = release_group['title'] if 'country' in release: release_mb['country'] = release['country'] release_mb['media'] = [] for medium in release['mediums']: medium_mb = {} if 'format' in medium: medium_mb['format'] = medium['format'] medium_mb['track-count'] = medium['track_count'] release_mb['media'].append(medium_mb) release_list.append(release_mb) return release_list def _make_artist_node(artist): artist_node = { 'name': artist['name'], 'sort-name': artist['name'], 'id': artist['id'] } return artist_node def _make_artist_credit_node(artists): artist_list = [] for i, artist in enumerate(artists): node = { 'artist': _make_artist_node(artist), 'name': artist['name'] } if i > 0: node['joinphrase'] = '; ' artist_list.append(node) return artist_list def parse_recording(recording): if 'id' not in recording: # we have no metadata for this recording return recording_mb = { 'id': recording['id'] } if 'title' in recording: recording_mb['title'] = recording['title'] if 'artists' in recording: recording_mb['artist-credit'] = _make_artist_credit_node(recording['artists']) if 'releasegroups' in recording: recording_mb['releases'] = _make_releases_node(recording) if 'duration' in recording: try: recording_mb['length'] = int(recording['duration']) * 1000 except TypeError: pass return recording_mb picard-release-2.3.1/picard/acoustid/manager.py000066400000000000000000000126431362601763300214530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2011 Lukáš Lalinský # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import QtCore from picard import log from picard.util import load_json class Submission(object): def __init__(self, fingerprint, duration, orig_recordingid=None, recordingid=None, puid=None): self.fingerprint = fingerprint self.duration = duration self.puid = puid self.orig_recordingid = orig_recordingid self.recordingid = recordingid class AcoustIDManager(QtCore.QObject): # AcoustID has a post limit of around 1 MB. With the data submitted by # Picard this is roughly around 250 fingerprints. Submit a few less to have # some leeway. BATCH_SUBMIT_COUNT = 240 def __init__(self, acoustid_api): super().__init__() self._fingerprints = {} self._acoustid_api = acoustid_api def add(self, file, recordingid): if not file.acoustid_fingerprint or not file.acoustid_length: return puid = file.metadata['musicip_puid'] self._fingerprints[file] = Submission(file.acoustid_fingerprint, file.acoustid_length, recordingid, recordingid, puid) self._check_unsubmitted() def update(self, file, recordingid): submission = self._fingerprints.get(file) if submission is None: return submission.recordingid = recordingid self._check_unsubmitted() def remove(self, file): if file in self._fingerprints: del self._fingerprints[file] self._check_unsubmitted() def is_submitted(self, file): submission = self._fingerprints.get(file) if submission: return not submission.recordingid or submission.orig_recordingid == submission.recordingid return True def _unsubmitted(self): for file, submission in self._fingerprints.items(): if submission.recordingid and submission.orig_recordingid != submission.recordingid: yield (file, submission) def _check_unsubmitted(self): enabled = next(self._unsubmitted(), None) is not None self.tagger.window.enable_submit(enabled) def submit(self): submissions = list(self._unsubmitted()) if not submissions: self._check_unsubmitted() return log.debug("AcoustID: submitting total of %d fingerprints...", len(submissions)) self._batch_submit(submissions) def _batch_submit(self, submissions): if not submissions: # All fingerprints submitted, nothing to do log.debug("AcoustID: submitted all fingerprints") self.tagger.window.set_statusbar_message( N_('AcoustIDs successfully submitted.'), echo=None, timeout=3000 ) self._check_unsubmitted() return submission_batch = submissions[:self.BATCH_SUBMIT_COUNT] submissions = submissions[self.BATCH_SUBMIT_COUNT:] fingerprints = [fingerprint for file_, fingerprint in submission_batch] log.debug("AcoustID: submitting batch of %d fingerprints (%d remaining)...", len(submission_batch), len(submissions)) self.tagger.window.set_statusbar_message( N_('Submitting AcoustIDs ...'), echo=None ) next_func = partial(self._batch_submit, submissions) self._acoustid_api.submit_acoustid_fingerprints(fingerprints, partial(self._batch_submit_finished, submission_batch, next_func)) def _batch_submit_finished(self, submissions, next_func, document, http, error): if error: try: error = load_json(document) message = error["error"]["message"] except BaseException: message = "" mparms = { 'error': http.errorString(), 'message': message } log.error( "AcoustID: submission failed with error '%(error)s': %(message)s" % mparms) self.tagger.window.set_statusbar_message( N_("AcoustID submission failed with error '%(error)s': %(message)s"), mparms, echo=None, timeout=3000 ) else: log.debug('AcoustID: %d fingerprints successfully submitted', len(submissions)) for file, submission in submissions: submission.orig_recordingid = submission.recordingid file.update() self._check_unsubmitted() next_func() picard-release-2.3.1/picard/album.py000066400000000000000000000666151362601763300173360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2009, 2011-2012, 2014 Lukáš Lalinský # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2008 Hendrik van Antwerpen # Copyright (C) 2008 ojnkpjg # Copyright (C) 2008-2011, 2014, 2018-2019 Philipp Wolfer # Copyright (C) 2009 Nikolai Prokoschenko # Copyright (C) 2011-2012 Chad Wilson # Copyright (C) 2011-2013, 2019 Michael Wiencek # Copyright (C) 2012-2013, 2016-2017 Wieland Hoffmann # Copyright (C) 2013, 2018 Calvin Walton # Copyright (C) 2013-2015, 2017 Sophist-UK # Copyright (C) 2013-2015, 2017-2019 Laurent Monin # Copyright (C) 2016 Suhas # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2019 Joel Lintunen # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import ( OrderedDict, defaultdict, namedtuple, ) import traceback from PyQt5 import ( QtCore, QtNetwork, ) from picard import ( config, log, ) from picard.cluster import Cluster from picard.collection import add_release_to_user_collections from picard.const import VARIOUS_ARTISTS_ID from picard.dataobj import DataObject from picard.file import File from picard.mbjson import ( medium_to_metadata, release_group_to_metadata, release_to_metadata, track_to_metadata, ) from picard.metadata import ( Metadata, run_album_metadata_processors, run_track_metadata_processors, ) from picard.plugin import ( PluginFunctions, PluginPriority, ) from picard.script import ( ScriptError, ScriptParser, enabled_tagger_scripts_texts, ) from picard.track import Track from picard.util import ( find_best_match, format_time, mbid_validate, ) from picard.util.imagelist import ( add_metadata_images, remove_metadata_images, update_metadata_images, ) from picard.util.textencoding import asciipunct from picard.ui.item import Item def _create_artist_node_dict(source_node): return {x['artist']['id']: x['artist'] for x in source_node['artist-credit']} def _copy_artist_nodes(source, target_node): for credit in target_node['artist-credit']: artist_node = source.get(credit['artist']['id']) if artist_node: credit['artist'] = artist_node class AlbumArtist(DataObject): def __init__(self, album_artist_id): super().__init__(album_artist_id) class Album(DataObject, Item): release_group_loaded = QtCore.pyqtSignal() def __init__(self, album_id, discid=None): DataObject.__init__(self, album_id) self.metadata = Metadata() self.orig_metadata = Metadata() self.tracks = [] self.loaded = False self.load_task = None self.release_group = None self._files = 0 self._requests = 0 self._tracks_loaded = False self._discids = set() if discid: self._discids.add(discid) self._after_load_callbacks = [] self.unmatched_files = Cluster(_("Unmatched Files"), special=True, related_album=self, hide_if_empty=True) self.errors = [] self.status = None self._album_artists = [] self.update_metadata_images_enabled = True def __repr__(self): return '' % (self.id, self.metadata["album"]) def iterfiles(self, save=False): for track in self.tracks: for file in track.iterfiles(): yield file if not save: for file in self.unmatched_files.iterfiles(): yield file def enable_update_metadata_images(self, enabled): self.update_metadata_images_enabled = enabled def append_album_artist(self, album_artist_id): """Append artist id to the list of album artists and return an AlbumArtist instance""" album_artist = AlbumArtist(album_artist_id) self._album_artists.append(album_artist) return album_artist def add_discid(self, discid): if not discid: return self._discids.add(discid) for track in self.tracks: medium_discids = track.metadata.getall('~musicbrainz_discids') track_discids = list(self._discids.intersection(medium_discids)) if track_discids: track.metadata['musicbrainz_discid'] = track_discids track.update() for file in track.linked_files: file.metadata['musicbrainz_discid'] = track_discids file.update() def get_album_artists(self): """Returns the list of album artists (as AlbumArtist objects)""" return self._album_artists def _parse_release(self, release_node): log.debug("Loading release %r ...", self.id) self._tracks_loaded = False release_id = release_node['id'] if release_id != self.id: self.tagger.mbid_redirects[self.id] = release_id album = self.tagger.albums.get(release_id) if album: log.debug("Release %r already loaded", release_id) album.match_files(self.unmatched_files.files) album.update() self.tagger.remove_album(self) return False else: del self.tagger.albums[self.id] self.tagger.albums[release_id] = self self.id = release_id # Make the release artist nodes available, since they may # contain supplementary data (aliases, tags, genres, ratings) # which aren't present in the release group, track, or # recording artist nodes. We can copy them into those places # wherever the IDs match, so that the data is shared and # available for use in mbjson.py and external plugins. self._release_artist_nodes = _create_artist_node_dict(release_node) # Get release metadata m = self._new_metadata m.length = 0 rg_node = release_node['release-group'] rg = self.release_group = self.tagger.get_release_group_by_id(rg_node['id']) rg.loaded_albums.add(self.id) rg.refcount += 1 _copy_artist_nodes(self._release_artist_nodes, rg_node) release_group_to_metadata(rg_node, rg.metadata, rg) m.copy(rg.metadata) release_to_metadata(release_node, m, album=self) # Custom VA name if m['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID: m['albumartistsort'] = m['albumartist'] = config.setting['va_name'] # Convert Unicode punctuation if config.setting['convert_punctuation']: m.apply_func(asciipunct) m['totaldiscs'] = len(release_node['media']) # Add album to collections add_release_to_user_collections(release_node) # Run album metadata plugins try: run_album_metadata_processors(self, m, release_node) except BaseException: self.error_append(traceback.format_exc()) self._release_node = release_node return True def _release_request_finished(self, document, http, error): if self.load_task is None: return self.load_task = None parsed = False try: if error: self.error_append(http.errorString()) # Fix for broken NAT releases if error == QtNetwork.QNetworkReply.ContentNotFoundError: nats = False nat_name = config.setting["nat_name"] files = list(self.unmatched_files.files) for file in files: recordingid = file.metadata["musicbrainz_recordingid"] if mbid_validate(recordingid) and file.metadata["album"] == nat_name: nats = True self.tagger.move_file_to_nat(file, recordingid) self.tagger.nats.update() if nats and not self.get_num_unmatched_files(): self.tagger.remove_album(self) error = False else: try: parsed = self._parse_release(document) except Exception: error = True self.error_append(traceback.format_exc()) finally: self._requests -= 1 if parsed or error: self._finalize_loading(error) # does http need to be set to None to free the memory used by the network response? # http://qt-project.org/doc/qt-5/qnetworkaccessmanager.html says: # After the request has finished, it is the responsibility of the user # to delete the QNetworkReply object at an appropriate time. # Do not directly delete it inside the slot connected to finished(). # You can use the deleteLater() function. def error_append(self, msg): log.error(msg) self.errors.append(msg) def _finalize_loading(self, error): if error: self.metadata.clear() self.status = _("[could not load album %s]") % self.id del self._new_metadata del self._new_tracks self.update() return if self._requests > 0: return if not self._tracks_loaded: artists = set() all_media = [] absolutetracknumber = 0 va = self._new_metadata['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID djmix_ars = {} if hasattr(self._new_metadata, "_djmix_ars"): djmix_ars = self._new_metadata._djmix_ars for medium_node in self._release_node['media']: mm = Metadata() mm.copy(self._new_metadata) medium_to_metadata(medium_node, mm) discpregap = False format = medium_node.get('format') if format: all_media.append(format) for dj in djmix_ars.get(mm["discnumber"], []): mm.add("djmixer", dj) if 'discs' in medium_node: discids = [disc.get('id') for disc in medium_node['discs']] mm['~musicbrainz_discids'] = discids mm['musicbrainz_discid'] = list(self._discids.intersection(discids)) if "pregap" in medium_node: discpregap = True absolutetracknumber += 1 track = self._finalize_loading_track(medium_node['pregap'], mm, artists, va, absolutetracknumber, discpregap) track.metadata['~pregap'] = "1" track_count = medium_node['track-count'] if track_count: tracklist_node = medium_node['tracks'] for track_node in tracklist_node: absolutetracknumber += 1 track = self._finalize_loading_track(track_node, mm, artists, va, absolutetracknumber, discpregap) if "data-tracks" in medium_node: for track_node in medium_node['data-tracks']: absolutetracknumber += 1 track = self._finalize_loading_track(track_node, mm, artists, va, absolutetracknumber, discpregap) track.metadata['~datatrack'] = "1" totalalbumtracks = absolutetracknumber self._new_metadata['~totalalbumtracks'] = totalalbumtracks # Generate a list of unique media, but keep order of first appearance self._new_metadata['media'] = " / ".join(list(OrderedDict.fromkeys(all_media))) for track in self._new_tracks: track.metadata["~totalalbumtracks"] = totalalbumtracks if len(artists) > 1: track.metadata["~multiartist"] = "1" del self._release_node del self._release_artist_nodes self._tracks_loaded = True if not self._requests: self.enable_update_metadata_images(False) # Prepare parser for user's script for s_name, s_text in enabled_tagger_scripts_texts(): parser = ScriptParser() for track in self._new_tracks: # Run tagger script for each track try: parser.eval(s_text, track.metadata) except ScriptError: log.exception("Failed to run tagger script %s on track", s_name) track.metadata.strip_whitespace() # Run tagger script for the album itself try: parser.eval(s_text, self._new_metadata) except ScriptError: log.exception("Failed to run tagger script %s on album", s_name) self._new_metadata.strip_whitespace() for track in self.tracks: track.metadata_images_changed.connect(self.update_metadata_images) for file in list(track.linked_files): file.move(self.unmatched_files) self.metadata = self._new_metadata self.tracks = self._new_tracks del self._new_metadata del self._new_tracks self.loaded = True self.status = None self.match_files(self.unmatched_files.files) self.enable_update_metadata_images(True) self.update() self.tagger.window.set_statusbar_message( N_('Album %(id)s loaded: %(artist)s - %(album)s'), { 'id': self.id, 'artist': self.metadata['albumartist'], 'album': self.metadata['album'] }, timeout=3000 ) for func in self._after_load_callbacks: func() self._after_load_callbacks = [] def _finalize_loading_track(self, track_node, metadata, artists, va, absolutetracknumber, discpregap): # As noted in `_parse_release` above, the release artist nodes # may contain supplementary data that isn't present in track # artist nodes. Similarly, the track artists may contain # information which the recording artists don't. Copy this # information across to wherever the artist IDs match. _copy_artist_nodes(self._release_artist_nodes, track_node) _copy_artist_nodes(self._release_artist_nodes, track_node['recording']) _copy_artist_nodes(_create_artist_node_dict(track_node), track_node['recording']) track = Track(track_node['recording']['id'], self) self._new_tracks.append(track) # Get track metadata tm = track.metadata tm.copy(metadata) track_to_metadata(track_node, track) tm["~absolutetracknumber"] = absolutetracknumber track.orig_metadata.copy(tm) track._customize_metadata() self._new_metadata.length += tm.length artists.add(tm["artist"]) if va: tm["compilation"] = "1" else: del tm["compilation"] if discpregap: tm["~discpregap"] = "1" # Run track metadata plugins try: run_track_metadata_processors(self, tm, track_node, self._release_node) except BaseException: self.error_append(traceback.format_exc()) return track def load(self, priority=False, refresh=False): if self._requests: log.info("Not reloading, some requests are still active.") return self.tagger.window.set_statusbar_message( N_('Loading album %(id)s ...'), {'id': self.id} ) self.loaded = False self.status = _("[loading album information]") if self.release_group: self.release_group.loaded = False self.release_group.genres.clear() self.metadata.clear() self.genres.clear() self.update() self._new_metadata = Metadata() self._new_tracks = [] self._requests = 1 self.errors = [] require_authentication = False inc = ['release-groups', 'media', 'discids', 'recordings', 'artist-credits', 'artists', 'aliases', 'labels', 'isrcs', 'collections'] if self.tagger.webservice.oauth_manager.is_authorized(): require_authentication = True inc += ['user-collections'] if config.setting['release_ars'] or config.setting['track_ars']: inc += ['artist-rels', 'release-rels', 'url-rels', 'recording-rels', 'work-rels'] if config.setting['track_ars']: inc += ['recording-level-rels', 'work-level-rels'] require_authentication = self.set_genre_inc_params(inc) or require_authentication if config.setting['enable_ratings']: require_authentication = True inc += ['user-ratings'] self.load_task = self.tagger.mb_api.get_release_by_id( self.id, self._release_request_finished, inc=inc, mblogin=require_authentication, priority=priority, refresh=refresh) def run_when_loaded(self, func): if self.loaded: func() else: self._after_load_callbacks.append(func) def stop_loading(self): if self.load_task: self.tagger.webservice.remove_task(self.load_task) self.load_task = None def update(self, update_tracks=True): if self.item: self.item.update(update_tracks) def _add_file(self, track, file): self._files += 1 self.update(update_tracks=False) add_metadata_images(self, [file]) file.metadata_images_changed.connect(self.update_metadata_images) def _remove_file(self, track, file): self._files -= 1 self.update(update_tracks=False) file.metadata_images_changed.disconnect(self.update_metadata_images) remove_metadata_images(self, [file]) def _match_files(self, files, recordingid=None, threshold=0): """Match files to tracks on this album, based on metadata similarity or recordingid.""" tracks_cache = defaultdict(lambda: None) def build_tracks_cache(): for track in self.tracks: tm_recordingid = track.orig_metadata['musicbrainz_recordingid'] tm_tracknumber = track.orig_metadata['tracknumber'] tm_discnumber = track.orig_metadata['discnumber'] for tup in ( (tm_recordingid, tm_tracknumber, tm_discnumber), (tm_recordingid, tm_tracknumber), (tm_recordingid, )): tracks_cache[tup] = track SimMatchAlbum = namedtuple('SimMatchAlbum', 'similarity track') for file in list(files): if file.state == File.REMOVED: continue # if we have a recordingid to match against, use that in priority recid = recordingid or file.metadata['musicbrainz_recordingid'] if recid and mbid_validate(recid): if not tracks_cache: build_tracks_cache() tracknumber = file.metadata['tracknumber'] discnumber = file.metadata['discnumber'] track = (tracks_cache[(recid, tracknumber, discnumber)] or tracks_cache[(recid, tracknumber)] or tracks_cache[(recid, )]) if track: yield (file, track) continue # try to match by similarity def candidates(): for track in self.tracks: yield SimMatchAlbum( similarity=track.metadata.compare(file.orig_metadata), track=track ) QtCore.QCoreApplication.processEvents() no_match = SimMatchAlbum(similarity=-1, track=self.unmatched_files) best_match = find_best_match(candidates, no_match) if best_match.similarity < threshold: yield (file, no_match.track) else: yield (file, best_match.result.track) def match_files(self, files, recordingid=None): """Match and move files to tracks on this album, based on metadata similarity or recordingid.""" moves = self._match_files(files, recordingid=recordingid, threshold=config.setting['track_matching_threshold']) for file, target in moves: file.move(target) def can_save(self): return self._files > 0 def can_remove(self): return True def can_edit_tags(self): return True def can_analyze(self): return False def can_autotag(self): return False def can_refresh(self): return True def can_view_info(self): return (self.loaded and (self.metadata.images or self.orig_metadata.images)) or self.errors def is_album_like(self): return True def get_num_matched_tracks(self): num = 0 for track in self.tracks: if track.is_linked(): num += 1 return num def get_num_unmatched_files(self): return len(self.unmatched_files.files) def get_num_total_files(self): return self._files + len(self.unmatched_files.files) def is_complete(self): if not self.tracks: return False for track in self.tracks: if not track.is_complete(): return False if self.get_num_unmatched_files(): return False else: return True def is_modified(self): if self.tracks: for track in self.tracks: for file in track.linked_files: if not file.is_saved(): return True return False def get_num_unsaved_files(self): count = 0 for track in self.tracks: for file in track.linked_files: if not file.is_saved(): count += 1 return count def column(self, column): if column == 'title': if self.status is not None: title = self.status else: title = self.metadata['album'] if self.tracks: linked_tracks = 0 for track in self.tracks: if track.is_linked(): linked_tracks += 1 text = '%s\u200E (%d/%d' % (title, linked_tracks, len(self.tracks)) unmatched = self.get_num_unmatched_files() if unmatched: text += '; %d?' % (unmatched,) unsaved = self.get_num_unsaved_files() if unsaved: text += '; %d*' % (unsaved,) # CoverArt.set_metadata uses the orig_metadata.images if metadata.images is empty # in order to show existing cover art if there's no cover art for a release. So # we do the same here in order to show the number of images consistently. if self.metadata.images: metadata = self.metadata else: metadata = self.orig_metadata number_of_images = len(metadata.images) if getattr(metadata, 'has_common_images', True): text += ngettext("; %i image", "; %i images", number_of_images) % number_of_images else: text += ngettext("; %i image not in all tracks", "; %i different images among tracks", number_of_images) % number_of_images return text + ')' else: return title elif column == '~length': length = self.metadata.length if length: return format_time(length) else: return '' elif column == 'artist': return self.metadata['albumartist'] elif column == 'tracknumber': return self.metadata['~totalalbumtracks'] elif column == 'discnumber': return self.metadata['totaldiscs'] else: return self.metadata[column] def switch_release_version(self, mbid): if mbid == self.id: return for file in list(self.iterfiles(True)): file.move(self.unmatched_files) album = self.tagger.albums.get(mbid) if album: album.match_files(self.unmatched_files.files) album.update() self.tagger.remove_album(self) else: del self.tagger.albums[self.id] self.release_group.loaded_albums.discard(self.id) self.id = mbid self.tagger.albums[mbid] = self self.load(priority=True, refresh=True) def update_metadata_images(self): if not self.update_metadata_images_enabled: return update_metadata_images(self) self.update(False) def keep_original_images(self): self.enable_update_metadata_images(False) for track in self.tracks: track.keep_original_images() for file in list(self.unmatched_files.files): file.keep_original_images() self.enable_update_metadata_images(True) self.update_metadata_images() class NatAlbum(Album): def __init__(self): super().__init__("NATS") self.loaded = True self.update() def update(self, update_tracks=True): self.enable_update_metadata_images(False) old_album_title = self.metadata["album"] self.metadata["album"] = config.setting["nat_name"] for track in self.tracks: if old_album_title == track.metadata["album"]: track.metadata["album"] = self.metadata["album"] for file in track.linked_files: track.update_file_metadata(file) self.enable_update_metadata_images(True) super().update(update_tracks) def _finalize_loading(self, error): self.update() def can_refresh(self): return False def can_browser_lookup(self): return False _album_post_removal_processors = PluginFunctions(label='album_post_removal_processors') def register_album_post_removal_processor(function, priority=PluginPriority.NORMAL): """Registers an album-removed processor. Args: function: function to call after album removal, it will be passed the album object priority: optional, PluginPriority.NORMAL by default Returns: None """ _album_post_removal_processors.register(function.__module__, function, priority) def run_album_post_removal_processors(album_object): _album_post_removal_processors.run(album_object) picard-release-2.3.1/picard/browser/000077500000000000000000000000001362601763300173315ustar00rootroot00000000000000picard-release-2.3.1/picard/browser/__init__.py000066400000000000000000000014671362601763300214520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. picard-release-2.3.1/picard/browser/browser.py000066400000000000000000000113121362601763300213640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2011 Lukáš Lalinský # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2012-2013, 2018 Philipp Wolfer # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2016 Suhas # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from urllib.parse import ( parse_qs, urlparse, ) from PyQt5 import QtNetwork from picard import ( config, log, ) from picard.util import mbid_validate def response(code): if code == 200: resp = '200 OK' elif code == 400: resp = '400 Bad Request' else: resp = '500 Internal Server Error' return bytearray( 'HTTP/1.1 {}\r\n' 'Cache-Control: max-age=0\r\n' '\r\n' 'Nothing to see here.\r\n'.format(resp), 'ascii') class BrowserIntegration(QtNetwork.QTcpServer): """Simple HTTP server for web browser integration.""" def __init__(self, parent=None): super().__init__(parent) self.newConnection.connect(self._accept_connection) self.port = 0 self.host_address = None def start(self): if self.port: self.stop() if config.setting["browser_integration_localhost_only"]: self.host_address = QtNetwork.QHostAddress(QtNetwork.QHostAddress.LocalHost) else: self.host_address = QtNetwork.QHostAddress(QtNetwork.QHostAddress.Any) for port in range(config.setting["browser_integration_port"], 65535): if self.listen(self.host_address, port): log.debug("Starting the browser integration (%s:%d)", self.host_address.toString(), port) self.port = port self.tagger.listen_port_changed.emit(self.port) break def stop(self): if self.port > 0: log.debug("Stopping the browser integration") self.port = 0 self.tagger.listen_port_changed.emit(self.port) self.close() else: log.debug("Browser integration inactive, no need to stop") def _process_request(self): conn = self.sender() rawline = conn.readLine().data() log.debug("Browser integration request: %r", rawline) def parse_line(line): orig_line = line try: line = line.split() if line[0] == "GET" and "?" in line[1]: parsed = urlparse(line[1]) args = parse_qs(parsed.query) if 'id' in args and args['id']: mbid = args['id'][0] if not mbid_validate(mbid): log.error("Browser integration failed: bad mbid %r", mbid) return False def load_it(loader): self.tagger.bring_tagger_front() loader(mbid) return True action = parsed.path if action == '/openalbum': return load_it(self.tagger.load_album) elif action == '/opennat': return load_it(self.tagger.load_nat) except Exception as e: log.error("Browser integration failed with %r on line %r", e, orig_line) return False log.error("Browser integration failed: cannot parse %r", orig_line) return False try: line = rawline.decode() if parse_line(line): conn.write(response(200)) else: conn.write(response(400)) except UnicodeDecodeError as e: conn.write(response(500)) log.error(e) return finally: conn.disconnectFromHost() def _accept_connection(self): conn = self.nextPendingConnection() conn.readyRead.connect(self._process_request) picard-release-2.3.1/picard/browser/filelookup.py000066400000000000000000000116521362601763300220610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2008, 2011-2012 Lukáš Lalinský # Copyright (C) 2011 Pavan Chander # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2014-2015 Sophist-UK # Copyright (C) 2015 Ohm Patel # Copyright (C) 2015-2016 Wieland Hoffmann # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path import re from PyQt5 import QtCore from picard import log from picard.const import ( PICARD_URLS, QUERY_LIMIT, ) from picard.util import ( build_qurl, webbrowser2, ) class FileLookup(object): def __init__(self, parent, server, port, local_port): self.server = server self.local_port = int(local_port) self.port = port def _url(self, path, params=None): if params is None: params = {} if self.local_port: params['tport'] = self.local_port url = build_qurl(self.server, self.port, path=path, queryargs=params) return bytes(url.toEncoded()).decode() def _build_launch(self, path, params=None): if params is None: params = {} return self.launch(self._url(path, params)) def launch(self, url): log.debug("webbrowser2: %s" % url) webbrowser2.open(url) return True def disc_lookup(self, url): if self.local_port: url = "%s&tport=%d" % (url, self.local_port) return self.launch(url) def _lookup(self, type_, id_): return self._build_launch("/%s/%s" % (type_, id_)) def recording_lookup(self, recording_id): return self._lookup('recording', recording_id) def album_lookup(self, album_id): return self._lookup('release', album_id) def artist_lookup(self, artist_id): return self._lookup('artist', artist_id) def track_lookup(self, track_id): return self._lookup('track', track_id) def work_lookup(self, work_id): return self._lookup('work', work_id) def release_group_lookup(self, release_group_id): return self._lookup('release-group', release_group_id) def acoust_lookup(self, acoust_id): return self.launch(PICARD_URLS['acoustid_track'] + acoust_id) def mbid_lookup(self, string, type_, mbid_matched_callback=None): """Parses string for known entity type and mbid, open browser for it If entity type is 'release', it will load corresponding release if possible. """ uuid = '[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}' entity_type = '(?:release-group|release|recording|work|artist|label|url|area|track)' regex = r"\b(%s)?\W*(%s)" % (entity_type, uuid) m = re.search(regex, string, re.IGNORECASE) if m is None: return False if m.group(1) is None: entity = type_ else: entity = m.group(1).lower() mbid = m.group(2).lower() if mbid_matched_callback: mbid_matched_callback(entity, mbid) if entity == 'release': QtCore.QObject.tagger.load_album(mbid) return True elif entity == 'recording': QtCore.QObject.tagger.load_nat(mbid) return True return self._lookup(entity, mbid) def tag_lookup(self, artist, release, track, trackNum, duration, filename): params = { 'artist': artist, 'release': release, 'track': track, 'tracknum': trackNum, 'duration': duration, 'filename': os.path.basename(filename), } return self._build_launch('/taglookup', params) def collection_lookup(self, userid): return self._build_launch('/user/%s/collections' % userid) def search_entity(self, type_, query, adv=False, mbid_matched_callback=None): if self.mbid_lookup(query, type_, mbid_matched_callback=mbid_matched_callback): return True params = { 'limit': QUERY_LIMIT, 'type': type_, 'query': query, } if adv: params['adv'] = 'on' return self._build_launch('/search/textsearch', params) picard-release-2.3.1/picard/cluster.py000066400000000000000000000425161362601763300177110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2008 Hendrik van Antwerpen # Copyright (C) 2008 Will # Copyright (C) 2010-2011, 2014, 2018-2019 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2012 Wieland Hoffmann # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict from heapq import ( heappop, heappush, ) import ntpath import re from PyQt5 import QtCore from picard import config from picard.const import QUERY_LIMIT from picard.const.sys import IS_WIN from picard.metadata import ( Metadata, SimMatchRelease, ) from picard.similarity import similarity from picard.util import ( album_artist_from_path, find_best_match, format_time, ) from picard.util.imagelist import ( add_metadata_images, remove_metadata_images, update_metadata_images, ) from picard.ui.item import Item class Cluster(QtCore.QObject, Item): # Weights for different elements when comparing a cluster to a release comparison_weights = { 'album': 17, 'albumartist': 6, 'totaltracks': 5, 'releasetype': 10, 'releasecountry': 2, 'format': 2, } def __init__(self, name, artist="", special=False, related_album=None, hide_if_empty=False): QtCore.QObject.__init__(self) self.item = None self.metadata = Metadata() self.metadata['album'] = name self.metadata['albumartist'] = artist self.metadata['totaltracks'] = 0 self.special = special self.hide_if_empty = hide_if_empty self.related_album = related_album self.files = [] self.lookup_task = None self.update_metadata_images_enabled = True def __repr__(self): if self.related_album: return '' % ( self.related_album.id, self.related_album.metadata[u"album"] + '/' + self.metadata['album'] ) return '' % self.metadata['album'] def __len__(self): return len(self.files) def _update_related_album(self, added_files=None, removed_files=None): if self.related_album: if added_files: add_metadata_images(self.related_album, added_files) if removed_files: remove_metadata_images(self.related_album, removed_files) self.related_album.update() def add_files(self, files): for file in files: self.metadata.length += file.metadata.length file._move(self) file.update(signal=False) if self.can_show_coverart: file.metadata_images_changed.connect(self.update_metadata_images) self.files.extend(files) self.metadata['totaltracks'] = len(self.files) self.item.add_files(files) if self.can_show_coverart: add_metadata_images(self, files) self._update_related_album(added_files=files) def add_file(self, file): self.add_files([file]) def remove_file(self, file): self.metadata.length -= file.metadata.length self.files.remove(file) self.metadata['totaltracks'] = len(self.files) self.item.remove_file(file) if not self.special and self.get_num_files() == 0: self.tagger.remove_cluster(self) if self.can_show_coverart: file.metadata_images_changed.disconnect(self.update_metadata_images) remove_metadata_images(self, [file]) self._update_related_album(removed_files=[file]) def update(self): if self.item: self.item.update() def get_num_files(self): return len(self.files) def iterfiles(self, save=False): for file in self.files: yield file def can_save(self): """Return if this object can be saved.""" if self.files: return True else: return False def can_remove(self): """Return if this object can be removed.""" return not self.special def can_edit_tags(self): """Return if this object supports tag editing.""" return True def can_analyze(self): """Return if this object can be fingerprinted.""" return any([_file.can_analyze() for _file in self.files]) def can_autotag(self): return True def can_refresh(self): return False def can_browser_lookup(self): return not self.special def can_view_info(self): if self.files: return True else: return False def is_album_like(self): return True def column(self, column): if column == 'title': return '%s (%d)' % (self.metadata['album'], len(self.files)) elif (column == '~length' and self.special) or column == 'album': return '' elif column == '~length': return format_time(self.metadata.length) elif column == 'artist': return self.metadata['albumartist'] elif column == 'tracknumber': return self.metadata['totaltracks'] elif column == 'discnumber': return self.metadata['totaldiscs'] return self.metadata[column] def _lookup_finished(self, document, http, error): self.lookup_task = None try: releases = document['releases'] except (KeyError, TypeError): releases = None def statusbar(message): self.tagger.window.set_statusbar_message( message, {'album': self.metadata['album']}, timeout=3000 ) if releases: albumid = self._match_to_album(releases, threshold=config.setting['cluster_lookup_threshold']) else: albumid = None if albumid is None: statusbar(N_("No matching releases for cluster %(album)s")) else: statusbar(N_("Cluster %(album)s identified!")) self.tagger.move_files_to_album(self.files, albumid) def _match_to_album(self, releases, threshold=0): # multiple matches -- calculate similarities to each of them def candidates(): for release in releases: yield self.metadata.compare_to_release(release, Cluster.comparison_weights) no_match = SimMatchRelease(similarity=-1, release=None) best_match = find_best_match(candidates, no_match) if best_match.similarity < threshold: return None else: return best_match.result.release['id'] def lookup_metadata(self): """Try to identify the cluster using the existing metadata.""" if self.lookup_task: return self.tagger.window.set_statusbar_message( N_("Looking up the metadata for cluster %(album)s..."), {'album': self.metadata['album']} ) self.lookup_task = self.tagger.mb_api.find_releases(self._lookup_finished, artist=self.metadata['albumartist'], release=self.metadata['album'], tracks=str(len(self.files)), limit=QUERY_LIMIT) def clear_lookup_task(self): if self.lookup_task: self.tagger.webservice.remove_task(self.lookup_task) self.lookup_task = None @staticmethod def cluster(files, threshold): win_compat = config.setting["windows_compatibility"] or IS_WIN artist_dict = ClusterDict() album_dict = ClusterDict() tracks = [] for file in files: artist = file.metadata["albumartist"] or file.metadata["artist"] album = file.metadata["album"] # Improve clustering from directory structure if no existing tags # Only used for grouping and to provide cluster title / artist - not added to file tags. if win_compat: filename = ntpath.splitdrive(file.filename)[1] else: filename = file.filename album, artist = album_artist_from_path(filename, album, artist) # For each track, record the index of the artist and album within the clusters tracks.append((artist_dict.add(artist), album_dict.add(album))) artist_cluster_engine = ClusterEngine(artist_dict) artist_cluster_engine.cluster(threshold) album_cluster_engine = ClusterEngine(album_dict) album_cluster_engine.cluster(threshold) # Arrange tracks into albums albums = {} for i, track in enumerate(tracks): cluster = album_cluster_engine.get_cluster_from_id(track[1]) if cluster is not None: albums.setdefault(cluster, []).append(i) # Now determine the most prominent names in the cluster and build the # final cluster list for album_id, album in albums.items(): album_name = album_cluster_engine.get_cluster_title(album_id) artist_max = 0 artist_id = None artist_hist = {} for track_id in album: cluster = artist_cluster_engine.get_cluster_from_id(tracks[track_id][0]) if cluster is not None: cnt = artist_hist.get(cluster, 0) + 1 if cnt > artist_max: artist_max = cnt artist_id = cluster artist_hist[cluster] = cnt if artist_id is None: artist_name = "Various Artists" else: artist_name = artist_cluster_engine.get_cluster_title(artist_id) yield album_name, artist_name, (files[i] for i in album) def enable_update_metadata_images(self, enabled): self.update_metadata_images_enabled = enabled def update_metadata_images(self): if self.update_metadata_images_enabled and self.can_show_coverart: update_metadata_images(self) class UnclusteredFiles(Cluster): """Special cluster for 'Unmatched Files' which have no PUID and have not been clustered.""" def __init__(self): super().__init__(_("Unclustered Files"), special=True) def add_files(self, files): super().add_files(files) self.tagger.window.enable_cluster(self.get_num_files() > 0) def add_file(self, file): super().add_file(file) self.tagger.window.enable_cluster(self.get_num_files() > 0) def remove_file(self, file): super().remove_file(file) self.tagger.window.enable_cluster(self.get_num_files() > 0) def lookup_metadata(self): self.tagger.autotag(self.files) def can_edit_tags(self): return False def can_autotag(self): return len(self.files) > 0 def can_view_info(self): return False def can_remove(self): return len(self.files) > 0 @property def can_show_coverart(self): return False class ClusterList(list, Item): """A list of clusters.""" def __init__(self): super().__init__() def __hash__(self): return id(self) def iterfiles(self, save=False): for cluster in self: for file in cluster.iterfiles(save): yield file def can_save(self): return len(self) > 0 def can_analyze(self): return any([cluster.can_analyze() for cluster in self]) def can_autotag(self): return len(self) > 0 def can_browser_lookup(self): return False def lookup_metadata(self): for cluster in self: cluster.lookup_metadata() class ClusterDict(object): def __init__(self): # word -> id index self.words = defaultdict(lambda: (-1, 0)) # id -> word, token index self.ids = defaultdict(lambda: (None, None)) # counter for new id generation self.id = 0 self.regexp = re.compile(r'\W', re.UNICODE) self.spaces = re.compile(r'\s', re.UNICODE) def get_size(self): return self.id def tokenize(self, word): word = word.lower() token = self.regexp.sub('', word) return token if token else self.spaces.sub('', word) def add(self, word): """ Add a new entry to the cluster if it does not exist. If it does exist, increment the count. Return the index of the word in the dictionary or -1 is the word is empty. """ if word == '': return -1 index, count = self.words[word] if index == -1: token = self.tokenize(word) if token == '': return -1 index = self.id self.ids[index] = (word, token) self.id = self.id + 1 self.words[word] = (index, count + 1) return index def get_word(self, index): word, token = self.ids[index] return word def get_token(self, index): word, token = self.ids[index] return token def get_word_and_count(self, index): word, unused = self.ids[index] unused, count = self.words[word] return word, count class ClusterEngine(object): def __init__(self, cluster_dict): # the cluster dictionary we're using self.cluster_dict = cluster_dict # keeps track of unique cluster index self.cluster_count = 0 # Keeps track of the clusters we've created self.cluster_bins = {} # Index the word ids -> clusters self.index_id_cluster = {} def get_cluster_from_id(self, clusterid): return self.index_id_cluster.get(clusterid) def get_cluster_title(self, cluster): if cluster < 0: return "" cluster_max = 0 maxWord = '' for cluster_bin in self.cluster_bins[cluster]: word, count = self.cluster_dict.get_word_and_count(cluster_bin) if count >= cluster_max: maxWord = word cluster_max = count return maxWord def cluster(self, threshold): # Keep the matches sorted in a heap heap = [] for y in range(self.cluster_dict.get_size()): token_y = self.cluster_dict.get_token(y).lower() for x in range(y): if x != y: token_x = self.cluster_dict.get_token(x).lower() c = similarity(token_x, token_y) if c >= threshold: heappush(heap, ((1.0 - c), [x, y])) QtCore.QCoreApplication.processEvents() for i in range(self.cluster_dict.get_size()): word, count = self.cluster_dict.get_word_and_count(i) if word and count > 1: self.cluster_bins[self.cluster_count] = [i] self.index_id_cluster[i] = self.cluster_count self.cluster_count = self.cluster_count + 1 for i in range(len(heap)): c, pair = heappop(heap) c = 1.0 - c try: match0 = self.index_id_cluster[pair[0]] except BaseException: match0 = -1 try: match1 = self.index_id_cluster[pair[1]] except BaseException: match1 = -1 # if neither item is in a cluster, make a new cluster if match0 == -1 and match1 == -1: self.cluster_bins[self.cluster_count] = [pair[0], pair[1]] self.index_id_cluster[pair[0]] = self.cluster_count self.index_id_cluster[pair[1]] = self.cluster_count self.cluster_count = self.cluster_count + 1 continue # If cluster0 is in a bin, stick the other match into that bin if match0 >= 0 and match1 < 0: self.cluster_bins[match0].append(pair[1]) self.index_id_cluster[pair[1]] = match0 continue # If cluster1 is in a bin, stick the other match into that bin if match1 >= 0 and match0 < 0: self.cluster_bins[match1].append(pair[0]) self.index_id_cluster[pair[0]] = match1 continue # If both matches are already in two different clusters, merge the clusters if match1 != match0: self.cluster_bins[match0].extend(self.cluster_bins[match1]) for match in self.cluster_bins[match1]: self.index_id_cluster[match] = match0 del self.cluster_bins[match1] def can_refresh(self): return False picard-release-2.3.1/picard/collection.py000066400000000000000000000136631362601763300203640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013 Michael Wiencek # Copyright (C) 2014 Lukáš Lalinský # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2014, 2017-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import QtCore from picard import ( config, log, ) user_collections = {} class Collection(QtCore.QObject): COLLECTION_ADD = 1 COLLECTION_REMOVE = 2 def __init__(self, collection_id, name, size): self.id = collection_id self.name = name self.pending = set() self.size = int(size) self.releases = set() mb_api = self.tagger.mb_api self.api_action = { self.COLLECTION_ADD: mb_api.put_to_collection, self.COLLECTION_REMOVE: mb_api.delete_from_collection, } def __repr__(self): return '' % (self.name, self.id) def _modify(self, kind, ids, callback): ids -= self.pending if ids: self.pending |= ids when_done = partial(self._finished, kind, ids, callback) self.api_action[kind](self.id, list(ids), when_done) def add_releases(self, ids, callback): self._modify(self.COLLECTION_ADD, ids, callback) def remove_releases(self, ids, callback): self._modify(self.COLLECTION_REMOVE, ids, callback) def _finished(self, kind, ids, callback, document, reply, error): self.pending -= ids statusbar = self.tagger.window.set_statusbar_message if not error: count = len(ids) if kind == self.COLLECTION_ADD: self.releases |= ids self.size += count status_msg = ngettext( 'Added %(count)i release to collection "%(name)s"', 'Added %(count)i releases to collection "%(name)s"', count) debug_msg = 'Added %(count)i releases to collection "%(name)s"' else: self.releases -= ids self.size -= count status_msg = ngettext( 'Removed %(count)i release from collection "%(name)s"', 'Removed %(count)i releases from collection "%(name)s"', count) debug_msg = 'Removed %(count)i releases from collection "%(name)s"' callback() mparms = {'count': count, 'name': self.name} log.debug(debug_msg % mparms) statusbar(status_msg, mparms, translate=None, echo=None) else: statusbar( N_("Error while modifying collections: %(error)s"), {'error': reply.errorString()}, echo=log.error ) def get_user_collection(collection_id, name, size, refresh=False): collection = user_collections.get(collection_id) if collection is None: collection = user_collections[collection_id] = Collection(collection_id, name, size) elif refresh: collection.name = name collection.size = size return collection def load_user_collections(callback=None): tagger = QtCore.QObject.tagger def request_finished(document, reply, error): if error: tagger.window.set_statusbar_message( N_("Error loading collections: %(error)s"), {'error': reply.errorString()}, echo=log.error ) return if document and "collections" in document: collection_list = document['collections'] new_collections = set() for node in collection_list: if node["entity-type"] != "release": continue col_id = node['id'] col_name = node['name'] col_size = node['release-count'] new_collections.add(col_id) get_user_collection(col_id, col_name, col_size, refresh=True) # remove collections which aren't returned by the web service anymore old_collections = set(user_collections) - new_collections for collection_id in old_collections: del user_collections[collection_id] log.debug("User collections: %r", [(k, v.name) for k, v in user_collections.items()]) if callback: callback() if tagger.webservice.oauth_manager.is_authorized(): tagger.mb_api.get_collection_list(partial(request_finished)) else: user_collections.clear() def add_release_to_user_collections(release_node): """Add album to collections""" # Check for empy collection list if "collections" in release_node: release_id = release_node['id'] username = config.persist["oauth_username"].lower() for node in release_node['collections']: if node['editor'].lower() == username: col_id = node['id'] col_name = node['name'] col_size = node['release-count'] collection = get_user_collection(col_id, col_name, col_size) collection.releases.add(release_id) log.debug("Adding release %r to %r", release_id, collection) picard-release-2.3.1/picard/config.py000066400000000000000000000253201362601763300174670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2014, 2017 Lukáš Lalinský # Copyright (C) 2008, 2014, 2019-2020 Philipp Wolfer # Copyright (C) 2012, 2017 Wieland Hoffmann # Copyright (C) 2012-2014 Michael Wiencek # Copyright (C) 2013-2016, 2018-2019 Laurent Monin # Copyright (C) 2016 Suhas # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Sophist-UK # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from operator import itemgetter import os import shutil from PyQt5 import QtCore from picard import ( PICARD_APP_NAME, PICARD_ORG_NAME, PICARD_VERSION, log, ) from picard.util import LockableObject from picard.version import Version class ConfigUpgradeError(Exception): pass class ConfigSection(LockableObject): """Configuration section.""" def __init__(self, config, name): super().__init__() self.__qt_config = config self.__name = name self.__prefix = self.__name + '/' self.__prefix_len = len(self.__prefix) def key(self, name): return self.__prefix + name def _subkeys(self): for key in self.__qt_config.allKeys(): if key[:self.__prefix_len] == self.__prefix: yield key[self.__prefix_len:] def __getitem__(self, name): opt = Option.get(self.__name, name) if opt is None: return None return self.value(name, opt, opt.default) def __setitem__(self, name, value): self.lock_for_write() try: self.__qt_config.setValue(self.key(name), value) finally: self.unlock() def __contains__(self, name): return self.__qt_config.contains(self.key(name)) def remove(self, name): self.lock_for_write() try: if name in self: self.__qt_config.remove(self.key(name)) finally: self.unlock() def raw_value(self, name, qtype=None): """Return an option value without any type conversion.""" key = self.key(name) if qtype is not None: return self.__qt_config.value(key, type=qtype) else: return self.__qt_config.value(key) def value(self, name, option_type, default=None): """Return an option value converted to the given Option type.""" self.lock_for_read() try: if name in self: value = self.raw_value(name, qtype=option_type.qtype) return option_type.convert(value) return default except Exception as why: log.error('Cannot read %s value: %s', self.key(name), why, exc_info=True) return default finally: self.unlock() class Config(QtCore.QSettings): """Configuration.""" def __init__(self): self.__known_keys = set() def __initialize(self): """Common initializer method for :meth:`from_app` and :meth:`from_file`.""" self.application = ConfigSection(self, "application") self.setting = ConfigSection(self, "setting") self.persist = ConfigSection(self, "persist") self.profile = ConfigSection(self, "profile/default") self.current_preset = "default" TextOption("application", "version", '0.0.0dev0') self._version = Version.from_string(self.application["version"]) self._upgrade_hooks = dict() # Save known config names for faster access and to prevent # strange cases of Qt locking up when accessing QSettings.allKeys() # or QSettings.contains() shortly after having written settings # inside threads. # See https://tickets.metabrainz.org/browse/PICARD-1590 self.__known_keys = set(self.allKeys()) @classmethod def from_app(cls, parent): """Build a Config object using the default configuration file location.""" this = cls() QtCore.QSettings.__init__(this, QtCore.QSettings.IniFormat, QtCore.QSettings.UserScope, PICARD_ORG_NAME, PICARD_APP_NAME, parent) # Check if there is a config file specifically for this version versioned_config_file = this._versioned_config_filename(PICARD_VERSION) if os.path.isfile(versioned_config_file): return cls.from_file(parent, versioned_config_file) # If there are no settings, copy existing settings from old format # (registry on windows systems) if not this.allKeys(): oldFormat = QtCore.QSettings(PICARD_ORG_NAME, PICARD_APP_NAME) for k in oldFormat.allKeys(): this.setValue(k, oldFormat.value(k)) this.sync() this.__initialize() this._backup_settings() return this @classmethod def from_file(cls, parent, filename): """Build a Config object using a user-provided configuration file path.""" this = cls() QtCore.QSettings.__init__(this, filename, QtCore.QSettings.IniFormat, parent) this.__initialize() return this def setValue(self, key, value): super().setValue(key, value) self.__known_keys.add(key) def remove(self, key): super().remove(key) self.__known_keys.discard(key) def contains(self, key): # Overwritten due to https://tickets.metabrainz.org/browse/PICARD-1590 # See comment above in __initialize return key in self.__known_keys or super().contains(key) def switchProfile(self, profilename): """Sets the current profile.""" key = "profile/%s" % (profilename,) if self.contains(key): self.profile.name = key else: raise KeyError("Unknown profile '%s'" % (profilename,)) def register_upgrade_hook(self, func, *args): """Register a function to upgrade from one config version to another""" to_version = Version.from_string(func.__name__) assert to_version <= PICARD_VERSION, "%r > %r !!!" % (to_version, PICARD_VERSION) self._upgrade_hooks[to_version] = { 'func': func, 'args': args, 'done': False } def run_upgrade_hooks(self, outputfunc=None): """Executes registered functions to upgrade config version to the latest""" if not self._upgrade_hooks: return if self._version >= PICARD_VERSION: if self._version > PICARD_VERSION: print("Warning: config file %s was created by a more recent " "version of Picard (current is %s)" % ( self._version.to_string(), PICARD_VERSION.to_string() )) return for version in sorted(self._upgrade_hooks): hook = self._upgrade_hooks[version] if self._version < version: try: if outputfunc and hook['func'].__doc__: outputfunc("Config upgrade %s -> %s: %s" % ( self._version.to_string(), version.to_string(), hook['func'].__doc__.strip())) hook['func'](self, *hook['args']) except BaseException: import traceback raise ConfigUpgradeError( "Error during config upgrade from version %s to %s " "using %s():\n%s" % ( self._version.to_string(), version.to_string(), hook['func'].__name__, traceback.format_exc() )) else: hook['done'] = True self._version = version self._write_version() else: # hook is not applicable, mark as done hook['done'] = True if all(map(itemgetter("done"), self._upgrade_hooks.values())): # all hooks were executed, ensure config is marked with latest version self._version = PICARD_VERSION self._write_version() def _backup_settings(self): if Version(0, 0, 0) < self._version < PICARD_VERSION: backup_path = self._versioned_config_filename() log.info('Backing up config file to %s', backup_path) try: shutil.copyfile(self.fileName(), backup_path) except OSError: log.error('Failed backing up config file to %s', backup_path) def _write_version(self): self.application["version"] = self._version.to_string() self.sync() def _versioned_config_filename(self, version=None): if not version: version = self._version return os.path.join(os.path.dirname(self.fileName()), '%s-%s.ini' % ( self.applicationName(), version.to_string(short=True))) class Option(QtCore.QObject): """Generic option.""" registry = {} qtype = None def __init__(self, section, name, default): super().__init__() self.section = section self.name = name self.default = default if not hasattr(self, "convert"): self.convert = type(default) self.registry[(self.section, self.name)] = self @classmethod def get(cls, section, name): return cls.registry.get((section, name)) class TextOption(Option): convert = str qtype = 'QString' class BoolOption(Option): convert = bool qtype = bool class IntOption(Option): convert = int class FloatOption(Option): convert = float class ListOption(Option): convert = list qtype = 'QVariantList' config = None setting = None persist = None def _setup(app, filename=None): global config, setting, persist if filename is None: config = Config.from_app(app) else: config = Config.from_file(app, filename) setting = config.setting persist = config.persist picard-release-2.3.1/picard/config_upgrade.py000066400000000000000000000271261362601763300212040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013-2014 Michael Wiencek # Copyright (C) 2013-2016, 2018-2019 Laurent Monin # Copyright (C) 2014, 2017 Lukáš Lalinský # Copyright (C) 2014, 2018-2019 Philipp Wolfer # Copyright (C) 2015 Ohm Patel # Copyright (C) 2016 Suhas # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from PyQt5 import QtWidgets from picard import log from picard.config import ( BoolOption, IntOption, TextOption, ) from picard.const import ( DEFAULT_FILE_NAMING_FORMAT, DEFAULT_NUMBERED_SCRIPT_NAME, ) # TO ADD AN UPGRADE HOOK: # ---------------------- # add a function here, named after the version you want upgrade to # ie. upgrade_to_v1_0_0_dev_1() for 1.0.0dev1 # register it in upgrade_config() # and modify PICARD_VERSION to match it # def upgrade_to_v1_0_0_final_0(config, interactive=True, merge=True): """In version 1.0, the file naming formats for single and various artist releases were merged. """ _s = config.setting def remove_va_file_naming_format(merge=True): if merge: _s["file_naming_format"] = ( "$if($eq(%%compilation%%,1),\n$noop(Various Artist " "albums)\n%s,\n$noop(Single Artist Albums)\n%s)" % ( _s.value("va_file_naming_format", TextOption), _s["file_naming_format"] )) _s.remove("va_file_naming_format") _s.remove("use_va_format") if "va_file_naming_format" in _s and "use_va_format" in _s: if _s.value("use_va_format", BoolOption): remove_va_file_naming_format() if interactive: msgbox = QtWidgets.QMessageBox() msgbox.information(msgbox, _("Various Artists file naming scheme removal"), _("The separate file naming scheme for various artists " "albums has been removed in this version of Picard.\n" "Your file naming scheme has automatically been " "merged with that of single artist albums."), QtWidgets.QMessageBox.Ok) elif (_s.value("va_file_naming_format", TextOption) != r"$if2(%albumartist%,%artist%)/%album%/$if($gt(%totaldis" "cs%,1),%discnumber%-,)$num(%tracknumber%,2) %artist% - " "%title%"): if interactive: msgbox = QtWidgets.QMessageBox() msgbox.setWindowTitle(_("Various Artists file naming scheme removal")) msgbox.setText(_("The separate file naming scheme for various artists " "albums has been removed in this version of Picard.\n" "You currently do not use this option, but have a " "separate file naming scheme defined.\n" "Do you want to remove it or merge it with your file " "naming scheme for single artist albums?")) msgbox.setIcon(QtWidgets.QMessageBox.Question) merge_button = msgbox.addButton(_('Merge'), QtWidgets.QMessageBox.AcceptRole) msgbox.addButton(_('Remove'), QtWidgets.QMessageBox.DestructiveRole) msgbox.exec_() merge = msgbox.clickedButton() == merge_button remove_va_file_naming_format(merge=merge) else: # default format, disabled remove_va_file_naming_format(merge=False) def upgrade_to_v1_3_0_dev_1(config): """Option "windows_compatible_filenames" was renamed "windows_compatibility" (PICARD-110). """ old_opt = "windows_compatible_filenames" new_opt = "windows_compatibility" rename_option(config, old_opt, new_opt, BoolOption, True) def upgrade_to_v1_3_0_dev_2(config): """Option "preserved_tags" is now using comma instead of spaces as tag separator (PICARD-536) """ _s = config.setting opt = "preserved_tags" if opt in _s: _s[opt] = re.sub(r"\s+", ",", _s[opt].strip()) def upgrade_to_v1_3_0_dev_3(config): """Options were made to support lists (solving PICARD-144 and others) """ _s = config.setting option_separators = { "preferred_release_countries": " ", "preferred_release_formats": " ", "enabled_plugins": None, "caa_image_types": None, "metadata_box_sizes": None, } for (opt, sep) in option_separators.items(): if opt in _s: try: _s[opt] = _s.raw_value(opt, qtype='QString').split(sep) except AttributeError: pass def upgrade_to_v1_3_0_dev_4(config): """Option "release_type_scores" is now a list of tuples """ _s = config.setting def load_release_type_scores(setting): scores = [] values = setting.split() for i in range(0, len(values), 2): try: score = float(values[i + 1]) except IndexError: score = 0.0 scores.append((values[i], score)) return scores opt = "release_type_scores" if opt in _s: try: _s[opt] = load_release_type_scores(_s.raw_value(opt, qtype='QString')) except AttributeError: pass def upgrade_to_v1_4_0_dev_2(config): """Options "username" and "password" are removed and replaced with OAuth tokens """ _s = config.setting opts = ["username", "password"] for opt in opts: _s.remove(opt) def upgrade_to_v1_4_0_dev_3(config): """Cover art providers options were moved to a list of tuples""" _s = config.setting map_ca_provider = [ ('ca_provider_use_amazon', 'Amazon'), ('ca_provider_use_caa', 'Cover Art Archive'), ('ca_provider_use_whitelist', 'Whitelist'), ('ca_provider_use_caa_release_group_fallback', 'CaaReleaseGroup') ] newopts = [] for old, new in map_ca_provider: if old in _s: newopts.append((new, _s.value(old, BoolOption, True))) _s['ca_providers'] = newopts OLD_DEFAULT_FILE_NAMING_FORMAT_v1_3 = "$if2(%albumartist%,%artist%)/" \ "$if($ne(%albumartist%,),%album%/)" \ "$if($gt(%totaldiscs%,1),%discnumber%-,)" \ "$if($ne(%albumartist%,),$num(%tracknumber%,2) ,)" \ "$if(%_multiartist%,%artist% - ,)" \ "%title%" def upgrade_to_v1_4_0_dev_4(config): """Adds trailing comma to default file names for scripts""" _s = config.setting if _s["file_naming_format"] == OLD_DEFAULT_FILE_NAMING_FORMAT_v1_3: _s["file_naming_format"] = DEFAULT_FILE_NAMING_FORMAT def upgrade_to_v1_4_0_dev_5(config): """Using Picard.ini configuration file on all platforms""" # this is done in Config.__init__() def upgrade_to_v1_4_0_dev_6(config): """Adds support for multiple and selective tagger scripts""" _s = config.setting old_enabled_option = "enable_tagger_script" old_script_text_option = "tagger_script" list_of_scripts = [] if old_enabled_option in _s: _s["enable_tagger_scripts"] = _s.value(old_enabled_option, BoolOption, False) if old_script_text_option in _s: old_script_text = _s.value(old_script_text_option, TextOption, "") if old_script_text: old_script = (0, _(DEFAULT_NUMBERED_SCRIPT_NAME) % 1, _s["enable_tagger_scripts"], old_script_text) list_of_scripts.append(old_script) _s["list_of_scripts"] = list_of_scripts _s.remove(old_enabled_option) _s.remove(old_script_text_option) def upgrade_to_v1_4_0_dev_7(config): """Option "save_only_front_images_to_tags" was renamed to "embed_only_one_front_image".""" old_opt = "save_only_front_images_to_tags" new_opt = "embed_only_one_front_image" rename_option(config, old_opt, new_opt, BoolOption, True) def upgrade_to_v2_0_0_dev_3(config): """Option "caa_image_size" value has different meaning.""" _s = config.setting opt = "caa_image_size" if opt in _s: # caa_image_size option was storing index of a combobox item as size # therefore it depends on items order and/or number, which is bad # To keep the option as is, values >= 250 are stored for thumbnails and -1 is # used for full size. _CAA_SIZE_COMPAT = { 0: 250, 1: 500, 2: -1, } value = _s[opt] if value in _CAA_SIZE_COMPAT: _s[opt] = _CAA_SIZE_COMPAT[value] def upgrade_to_v2_1_0_dev_1(config): """Upgrade genre related options""" _s = config.setting if "folksonomy_tags" in _s and _s["folksonomy_tags"]: _s["use_genres"] = True rename_option(config, "max_tags", "max_genres", IntOption, 5) rename_option(config, "min_tag_usage", "min_genre_usage", IntOption, 90) rename_option(config, "ignore_tags", "ignore_genres", TextOption, "") rename_option(config, "join_tags", "join_genres", TextOption, "") rename_option(config, "only_my_tags", "only_my_genres", BoolOption, False) rename_option(config, "artists_tags", "artists_genres", BoolOption, False) def upgrade_to_v2_2_0_dev_3(config): """Option ignore_genres was replaced by option genres_filter""" _s = config.setting old_opt = "ignore_genres" if old_opt in _s: if _s[old_opt]: new_opt = "genres_filter" tags = ["-" + e.strip().lower() for e in _s[old_opt].split(',')] _s[new_opt] = "\n".join(tags) _s.remove(old_opt) OLD_DEFAULT_FILE_NAMING_FORMAT_v2_1 = "$if2(%albumartist%,%artist%)/" \ "$if($ne(%albumartist%,),%album%/,)" \ "$if($gt(%totaldiscs%,1),%discnumber%-,)" \ "$if($ne(%albumartist%,),$num(%tracknumber%,2) ,)" \ "$if(%_multiartist%,%artist% - ,)" \ "%title%" def upgrade_to_v2_2_0_dev_4(config): """Improved default file naming script""" _s = config.setting if _s["file_naming_format"] == OLD_DEFAULT_FILE_NAMING_FORMAT_v2_1: _s["file_naming_format"] = DEFAULT_FILE_NAMING_FORMAT def rename_option(config, old_opt, new_opt, option_type, default): _s = config.setting if old_opt in _s: _s[new_opt] = _s.value(old_opt, option_type, default) _s.remove(old_opt) def upgrade_config(config): cfg = config cfg.register_upgrade_hook(upgrade_to_v1_0_0_final_0) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_1) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_2) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_3) cfg.register_upgrade_hook(upgrade_to_v1_3_0_dev_4) cfg.register_upgrade_hook(upgrade_to_v1_4_0_dev_2) cfg.register_upgrade_hook(upgrade_to_v1_4_0_dev_3) cfg.register_upgrade_hook(upgrade_to_v1_4_0_dev_4) cfg.register_upgrade_hook(upgrade_to_v1_4_0_dev_5) cfg.register_upgrade_hook(upgrade_to_v1_4_0_dev_6) cfg.register_upgrade_hook(upgrade_to_v1_4_0_dev_7) cfg.register_upgrade_hook(upgrade_to_v2_0_0_dev_3) cfg.register_upgrade_hook(upgrade_to_v2_1_0_dev_1) cfg.register_upgrade_hook(upgrade_to_v2_2_0_dev_3) cfg.run_upgrade_hooks(log.debug) picard-release-2.3.1/picard/const/000077500000000000000000000000001362601763300167745ustar00rootroot00000000000000picard-release-2.3.1/picard/const/__init__.py000066400000000000000000000131471362601763300211130ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007, 2014, 2016 Lukáš Lalinský # Copyright (C) 2014, 2019-2020 Philipp Wolfer # Copyright (C) 2014-2016, 2018-2020 Laurent Monin # Copyright (C) 2015 Ohm Patel # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 Wieland Hoffmann # Copyright (C) 2016-2017 Frederik “Freso” S. Olesen # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import OrderedDict import os from PyQt5.QtCore import QStandardPaths from picard import ( PICARD_APP_NAME, PICARD_ORG_NAME, ) # Install gettext "noop" function in case const.py gets imported directly. import builtins builtins.__dict__['N_'] = lambda a: a # Config directory _appconfiglocation = QStandardPaths.writableLocation(QStandardPaths.AppConfigLocation) USER_DIR = os.path.normpath(os.path.join(_appconfiglocation, PICARD_ORG_NAME, PICARD_APP_NAME)) USER_PLUGIN_DIR = os.path.normpath(os.path.join(USER_DIR, "plugins")) # Network Cache default settings CACHE_DIR = os.path.normpath(QStandardPaths.writableLocation(QStandardPaths.CacheLocation)) CACHE_SIZE_IN_BYTES = 100*1000*1000 # AcoustID client API key ACOUSTID_KEY = 'v8pQ6oyB' ACOUSTID_HOST = 'api.acoustid.org' ACOUSTID_PORT = 80 FPCALC_NAMES = ['fpcalc', 'pyfpcalc'] # MB OAuth client credentials MUSICBRAINZ_OAUTH_CLIENT_ID = 'ACa9wsDX19cLp-AeEP-vVw' MUSICBRAINZ_OAUTH_CLIENT_SECRET = 'xIsvXbIuntaLuRRhzuazOA' # Cover art archive URL and port CAA_HOST = "coverartarchive.org" CAA_PORT = 443 # URLs PICARD_URLS = { 'documentation': "https://picard.musicbrainz.org/docs/", 'troubleshooting': "https://picard.musicbrainz.org/docs/troubleshooting/", 'home': "https://picard.musicbrainz.org/", 'doc_options': "https://picard.musicbrainz.org/docs/options/", 'doc_scripting': "https://picard.musicbrainz.org/docs/scripting", 'plugins': "https://picard.musicbrainz.org/plugins/", 'forum': "https://community.metabrainz.org/c/picard", 'donate': "https://metabrainz.org/donate", 'chromaprint': "https://acoustid.org/chromaprint#download", 'acoustid_apikey': "https://acoustid.org/api-key", 'doc_cover_art_types': "https://musicbrainz.org/doc/Cover_Art/Types", 'acoustid_track': "https://acoustid.org/track/", } # Various Artists MBID VARIOUS_ARTISTS_ID = '89ad4ac3-39f7-470e-963a-56509c546377' # Special purpose track titles SILENCE_TRACK_TITLE = '[silence]' DATA_TRACK_TITLE = '[data track]' # Release formats from picard.const.attributes import MB_ATTRIBUTES RELEASE_FORMATS = {} RELEASE_PRIMARY_GROUPS = {} RELEASE_SECONDARY_GROUPS = {} RELEASE_STATUS = {} for k, v in MB_ATTRIBUTES.items(): if k.startswith('DB:medium_format/name:'): RELEASE_FORMATS[v] = v elif k.startswith('DB:release_group_primary_type/name:'): RELEASE_PRIMARY_GROUPS[v] = v elif k.startswith('DB:release_group_secondary_type/name:'): RELEASE_SECONDARY_GROUPS[v] = v elif k.startswith('DB:release_status/name:'): RELEASE_STATUS[v] = v # Release countries from picard.const.countries import RELEASE_COUNTRIES # noqa: F401 # pylint: disable=unused-import # List of available user interface languages from picard.const.languages import UI_LANGUAGES # noqa: F401 # pylint: disable=unused-import # List of alias locales from picard.const.locales import ALIAS_LOCALES # noqa: F401 # pylint: disable=unused-import # List of official musicbrainz servers - must support SSL for mblogin requests (such as collections). MUSICBRAINZ_SERVERS = [ 'musicbrainz.org', 'beta.musicbrainz.org', ] # Plugins and Release Versions API PLUGINS_API = { 'host': 'picard.musicbrainz.org', 'port': 443, 'endpoint': { 'plugins': '/api/v2/plugins/', 'download': '/api/v2/download/', 'releases': '/api/v2/releases', } } # Default query limit QUERY_LIMIT = 25 # Maximum number of covers to draw in a stack in CoverArtThumbnail MAX_COVERS_TO_STACK = 4 # Update levels available for automatic checking PROGRAM_UPDATE_LEVELS = OrderedDict( [ ( 0, { 'name': 'stable', 'title': N_('Stable releases only'), } ), ( 1, { 'name': 'beta', 'title': N_('Stable and Beta releases'), } ), ( 2, { 'name': 'dev', 'title': N_('Stable, Beta and Dev releases'), } ), ] ) DEFAULT_FILE_NAMING_FORMAT = "$if2(%albumartist%,%artist%)/\n" \ "$if(%albumartist%,%album%/,)\n" \ "$if($gt(%totaldiscs%,1),%discnumber%-,)" \ "$if($and(%albumartist%,%tracknumber%),$num(%tracknumber%,2) ,)" \ "$if(%_multiartist%,%artist% - ,)" \ "%title%" DEFAULT_NUMBERED_SCRIPT_NAME = N_("My script %d") DEFAULT_SCRIPT_NAME = N_("My script") picard-release-2.3.1/picard/const/attributes.py000066400000000000000000000134421362601763300215400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py update_constants` to update it. MB_ATTRIBUTES = { 'DB:cover_art_archive.art_type/name:001': 'Front', 'DB:cover_art_archive.art_type/name:002': 'Back', 'DB:cover_art_archive.art_type/name:003': 'Booklet', 'DB:cover_art_archive.art_type/name:004': 'Medium', 'DB:cover_art_archive.art_type/name:005': 'Obi', 'DB:cover_art_archive.art_type/name:006': 'Spine', 'DB:cover_art_archive.art_type/name:007': 'Track', 'DB:cover_art_archive.art_type/name:008': 'Other', 'DB:cover_art_archive.art_type/name:009': 'Tray', 'DB:cover_art_archive.art_type/name:010': 'Sticker', 'DB:cover_art_archive.art_type/name:011': 'Poster', 'DB:cover_art_archive.art_type/name:012': 'Liner', 'DB:cover_art_archive.art_type/name:013': 'Watermark', 'DB:cover_art_archive.art_type/name:014': 'Raw/Unedited', 'DB:medium_format/name:001': 'CD', 'DB:medium_format/name:002': 'DVD', 'DB:medium_format/name:003': 'SACD', 'DB:medium_format/name:004': 'DualDisc', 'DB:medium_format/name:005': 'LaserDisc', 'DB:medium_format/name:006': 'MiniDisc', 'DB:medium_format/name:007': 'Vinyl', 'DB:medium_format/name:008': 'Cassette', 'DB:medium_format/name:009': 'Cartridge', 'DB:medium_format/name:010': 'Reel-to-reel', 'DB:medium_format/name:011': 'DAT', 'DB:medium_format/name:012': 'Digital Media', 'DB:medium_format/name:013': 'Other', 'DB:medium_format/name:014': 'Wax Cylinder', 'DB:medium_format/name:015': 'Piano Roll', 'DB:medium_format/name:016': 'DCC', 'DB:medium_format/name:017': 'HD-DVD', 'DB:medium_format/name:018': 'DVD-Audio', 'DB:medium_format/name:019': 'DVD-Video', 'DB:medium_format/name:020': 'Blu-ray', 'DB:medium_format/name:021': 'VHS', 'DB:medium_format/name:022': 'VCD', 'DB:medium_format/name:023': 'SVCD', 'DB:medium_format/name:024': 'Betamax', 'DB:medium_format/name:025': 'HDCD', 'DB:medium_format/name:026': 'USB Flash Drive', 'DB:medium_format/name:027': 'slotMusic', 'DB:medium_format/name:028': 'UMD', 'DB:medium_format/name:029': '7" Vinyl', 'DB:medium_format/name:030': '10" Vinyl', 'DB:medium_format/name:031': '12" Vinyl', 'DB:medium_format/name:033': 'CD-R', 'DB:medium_format/name:034': '8cm CD', 'DB:medium_format/name:035': 'Blu-spec CD', 'DB:medium_format/name:036': 'SHM-CD', 'DB:medium_format/name:037': 'HQCD', 'DB:medium_format/name:038': 'Hybrid SACD', 'DB:medium_format/name:039': 'CD+G', 'DB:medium_format/name:040': '8cm CD+G', 'DB:medium_format/name:041': 'CDV', 'DB:medium_format/name:042': 'Enhanced CD', 'DB:medium_format/name:043': 'Data CD', 'DB:medium_format/name:044': 'DTS CD', 'DB:medium_format/name:045': 'Playbutton', 'DB:medium_format/name:046': 'Music Card', 'DB:medium_format/name:047': 'DVDplus', 'DB:medium_format/name:048': 'VinylDisc', 'DB:medium_format/name:049': '3.5" Floppy Disk', 'DB:medium_format/name:050': 'Edison Diamond Disc', 'DB:medium_format/name:051': 'Flexi-disc', 'DB:medium_format/name:052': '7" Flexi-disc', 'DB:medium_format/name:053': 'Shellac', 'DB:medium_format/name:054': '10" Shellac', 'DB:medium_format/name:055': '12" Shellac', 'DB:medium_format/name:056': '7" Shellac', 'DB:medium_format/name:057': 'SHM-SACD', 'DB:medium_format/name:058': 'Pathé disc', 'DB:medium_format/name:059': 'VHD', 'DB:medium_format/name:060': 'CED', 'DB:medium_format/name:061': 'Copy Control CD', 'DB:medium_format/name:062': 'SD Card', 'DB:medium_format/name:063': 'Hybrid SACD (CD layer)', 'DB:medium_format/name:064': 'Hybrid SACD (SACD layer)', 'DB:medium_format/name:065': 'DualDisc (DVD-Audio side)', 'DB:medium_format/name:066': 'DualDisc (DVD-Video side)', 'DB:medium_format/name:067': 'DualDisc (CD side)', 'DB:medium_format/name:068': 'DVDplus (DVD-Audio side)', 'DB:medium_format/name:069': 'DVDplus (DVD-Video side)', 'DB:medium_format/name:070': 'DVDplus (CD side)', 'DB:medium_format/name:071': '8" LaserDisc', 'DB:medium_format/name:072': '12" LaserDisc', 'DB:medium_format/name:073': 'Phonograph record', 'DB:medium_format/name:074': 'PlayTape', 'DB:medium_format/name:075': 'HiPac', 'DB:medium_format/name:076': 'Floppy Disk', 'DB:medium_format/name:077': 'Zip Disk', 'DB:medium_format/name:078': '8-Track Cartridge', 'DB:medium_format/name:079': 'Blu-ray-R', 'DB:medium_format/name:080': 'VinylDisc (DVD side)', 'DB:medium_format/name:081': 'VinylDisc (Vinyl side)', 'DB:medium_format/name:082': 'VinylDisc (CD side)', 'DB:medium_format/name:083': 'Microcassette', 'DB:release_group_primary_type/name:001': 'Album', 'DB:release_group_primary_type/name:002': 'Single', 'DB:release_group_primary_type/name:003': 'EP', 'DB:release_group_primary_type/name:011': 'Other', 'DB:release_group_primary_type/name:012': 'Broadcast', 'DB:release_group_secondary_type/name:001': 'Compilation', 'DB:release_group_secondary_type/name:002': 'Soundtrack', 'DB:release_group_secondary_type/name:003': 'Spokenword', 'DB:release_group_secondary_type/name:004': 'Interview', 'DB:release_group_secondary_type/name:005': 'Audiobook', 'DB:release_group_secondary_type/name:006': 'Live', 'DB:release_group_secondary_type/name:007': 'Remix', 'DB:release_group_secondary_type/name:008': 'DJ-mix', 'DB:release_group_secondary_type/name:009': 'Mixtape/Street', 'DB:release_group_secondary_type/name:010': 'Demo', 'DB:release_group_secondary_type/name:011': 'Audio drama', 'DB:release_status/name:001': 'Official', 'DB:release_status/name:002': 'Promotion', 'DB:release_status/name:003': 'Bootleg', 'DB:release_status/name:004': 'Pseudo-Release', } picard-release-2.3.1/picard/const/countries.py000066400000000000000000000144001362601763300213600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py update_constants` to update it. RELEASE_COUNTRIES = { 'AD': 'Andorra', 'AE': 'United Arab Emirates', 'AF': 'Afghanistan', 'AG': 'Antigua and Barbuda', 'AI': 'Anguilla', 'AL': 'Albania', 'AM': 'Armenia', 'AN': 'Netherlands Antilles', 'AO': 'Angola', 'AQ': 'Antarctica', 'AR': 'Argentina', 'AS': 'American Samoa', 'AT': 'Austria', 'AU': 'Australia', 'AW': 'Aruba', 'AX': 'Åland Islands', 'AZ': 'Azerbaijan', 'BA': 'Bosnia and Herzegovina', 'BB': 'Barbados', 'BD': 'Bangladesh', 'BE': 'Belgium', 'BF': 'Burkina Faso', 'BG': 'Bulgaria', 'BH': 'Bahrain', 'BI': 'Burundi', 'BJ': 'Benin', 'BL': 'Saint Barthélemy', 'BM': 'Bermuda', 'BN': 'Brunei', 'BO': 'Bolivia', 'BQ': 'Bonaire, Sint Eustatius and Saba', 'BR': 'Brazil', 'BS': 'Bahamas', 'BT': 'Bhutan', 'BV': 'Bouvet Island', 'BW': 'Botswana', 'BY': 'Belarus', 'BZ': 'Belize', 'CA': 'Canada', 'CC': 'Cocos (Keeling) Islands', 'CD': 'Democratic Republic of the Congo', 'CF': 'Central African Republic', 'CG': 'Congo', 'CH': 'Switzerland', 'CI': 'Côte d\'Ivoire', 'CK': 'Cook Islands', 'CL': 'Chile', 'CM': 'Cameroon', 'CN': 'China', 'CO': 'Colombia', 'CR': 'Costa Rica', 'CS': 'Serbia and Montenegro', 'CU': 'Cuba', 'CV': 'Cape Verde', 'CW': 'Curaçao', 'CX': 'Christmas Island', 'CY': 'Cyprus', 'CZ': 'Czech Republic', 'DE': 'Germany', 'DJ': 'Djibouti', 'DK': 'Denmark', 'DM': 'Dominica', 'DO': 'Dominican Republic', 'DZ': 'Algeria', 'EC': 'Ecuador', 'EE': 'Estonia', 'EG': 'Egypt', 'EH': 'Western Sahara', 'ER': 'Eritrea', 'ES': 'Spain', 'ET': 'Ethiopia', 'FI': 'Finland', 'FJ': 'Fiji', 'FK': 'Falkland Islands', 'FM': 'Federated States of Micronesia', 'FO': 'Faroe Islands', 'FR': 'France', 'GA': 'Gabon', 'GB': 'United Kingdom', 'GD': 'Grenada', 'GE': 'Georgia', 'GF': 'French Guiana', 'GG': 'Guernsey', 'GH': 'Ghana', 'GI': 'Gibraltar', 'GL': 'Greenland', 'GM': 'Gambia', 'GN': 'Guinea', 'GP': 'Guadeloupe', 'GQ': 'Equatorial Guinea', 'GR': 'Greece', 'GS': 'South Georgia and the South Sandwich Islands', 'GT': 'Guatemala', 'GU': 'Guam', 'GW': 'Guinea-Bissau', 'GY': 'Guyana', 'HK': 'Hong Kong', 'HM': 'Heard Island and McDonald Islands', 'HN': 'Honduras', 'HR': 'Croatia', 'HT': 'Haiti', 'HU': 'Hungary', 'ID': 'Indonesia', 'IE': 'Ireland', 'IL': 'Israel', 'IM': 'Isle of Man', 'IN': 'India', 'IO': 'British Indian Ocean Territory', 'IQ': 'Iraq', 'IR': 'Iran', 'IS': 'Iceland', 'IT': 'Italy', 'JE': 'Jersey', 'JM': 'Jamaica', 'JO': 'Jordan', 'JP': 'Japan', 'KE': 'Kenya', 'KG': 'Kyrgyzstan', 'KH': 'Cambodia', 'KI': 'Kiribati', 'KM': 'Comoros', 'KN': 'Saint Kitts and Nevis', 'KP': 'North Korea', 'KR': 'South Korea', 'KW': 'Kuwait', 'KY': 'Cayman Islands', 'KZ': 'Kazakhstan', 'LA': 'Laos', 'LB': 'Lebanon', 'LC': 'Saint Lucia', 'LI': 'Liechtenstein', 'LK': 'Sri Lanka', 'LR': 'Liberia', 'LS': 'Lesotho', 'LT': 'Lithuania', 'LU': 'Luxembourg', 'LV': 'Latvia', 'LY': 'Libya', 'MA': 'Morocco', 'MC': 'Monaco', 'MD': 'Moldova', 'ME': 'Montenegro', 'MF': 'Saint Martin (French part)', 'MG': 'Madagascar', 'MH': 'Marshall Islands', 'MK': 'Macedonia', 'ML': 'Mali', 'MM': 'Myanmar', 'MN': 'Mongolia', 'MO': 'Macao', 'MP': 'Northern Mariana Islands', 'MQ': 'Martinique', 'MR': 'Mauritania', 'MS': 'Montserrat', 'MT': 'Malta', 'MU': 'Mauritius', 'MV': 'Maldives', 'MW': 'Malawi', 'MX': 'Mexico', 'MY': 'Malaysia', 'MZ': 'Mozambique', 'NA': 'Namibia', 'NC': 'New Caledonia', 'NE': 'Niger', 'NF': 'Norfolk Island', 'NG': 'Nigeria', 'NI': 'Nicaragua', 'NL': 'Netherlands', 'NO': 'Norway', 'NP': 'Nepal', 'NR': 'Nauru', 'NU': 'Niue', 'NZ': 'New Zealand', 'OM': 'Oman', 'PA': 'Panama', 'PE': 'Peru', 'PF': 'French Polynesia', 'PG': 'Papua New Guinea', 'PH': 'Philippines', 'PK': 'Pakistan', 'PL': 'Poland', 'PM': 'Saint Pierre and Miquelon', 'PN': 'Pitcairn', 'PR': 'Puerto Rico', 'PS': 'Palestine', 'PT': 'Portugal', 'PW': 'Palau', 'PY': 'Paraguay', 'QA': 'Qatar', 'RE': 'Réunion', 'RO': 'Romania', 'RS': 'Serbia', 'RU': 'Russia', 'RW': 'Rwanda', 'SA': 'Saudi Arabia', 'SB': 'Solomon Islands', 'SC': 'Seychelles', 'SD': 'Sudan', 'SE': 'Sweden', 'SG': 'Singapore', 'SH': 'Saint Helena, Ascension and Tristan da Cunha', 'SI': 'Slovenia', 'SJ': 'Svalbard and Jan Mayen', 'SK': 'Slovakia', 'SL': 'Sierra Leone', 'SM': 'San Marino', 'SN': 'Senegal', 'SO': 'Somalia', 'SR': 'Suriname', 'SS': 'South Sudan', 'ST': 'Sao Tome and Principe', 'SU': 'Soviet Union', 'SV': 'El Salvador', 'SX': 'Sint Maarten (Dutch part)', 'SY': 'Syria', 'SZ': 'Swaziland', 'TC': 'Turks and Caicos Islands', 'TD': 'Chad', 'TF': 'French Southern Territories', 'TG': 'Togo', 'TH': 'Thailand', 'TJ': 'Tajikistan', 'TK': 'Tokelau', 'TL': 'Timor-Leste', 'TM': 'Turkmenistan', 'TN': 'Tunisia', 'TO': 'Tonga', 'TR': 'Turkey', 'TT': 'Trinidad and Tobago', 'TV': 'Tuvalu', 'TW': 'Taiwan', 'TZ': 'Tanzania', 'UA': 'Ukraine', 'UG': 'Uganda', 'UM': 'United States Minor Outlying Islands', 'US': 'United States', 'UY': 'Uruguay', 'UZ': 'Uzbekistan', 'VA': 'Vatican City', 'VC': 'Saint Vincent and The Grenadines', 'VE': 'Venezuela', 'VG': 'British Virgin Islands', 'VI': 'U.S. Virgin Islands', 'VN': 'Vietnam', 'VU': 'Vanuatu', 'WF': 'Wallis and Futuna', 'WS': 'Samoa', 'XC': 'Czechoslovakia', 'XE': 'Europe', 'XG': 'East Germany', 'XK': 'Kosovo', 'XW': '[Worldwide]', 'YE': 'Yemen', 'YT': 'Mayotte', 'YU': 'Yugoslavia', 'ZA': 'South Africa', 'ZM': 'Zambia', 'ZW': 'Zimbabwe', } picard-release-2.3.1/picard/const/languages.py000066400000000000000000000067711362601763300213270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2014, 2018, 2020 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Shen-Ta Hsieh # Copyright (C) 2018-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # List of available user interface languages UI_LANGUAGES = [ #('af', 'Afrikaans', N_('Afrikaans')), ('ar', 'العربية', N_('Arabic')), #('ast', 'Asturian', N_('Asturian')), #('bg', 'Български', N_('Bulgarian')), ('ca', 'Català', N_('Catalan')), ('cs', 'Čeština', N_('Czech')), #('cy', 'Cymraeg', N_('Welsh')), ('da', 'Dansk', N_('Danish')), ('de', 'Deutsch', N_('German')), ('de_CH', 'Deutsch (Schweiz)', N_('German (Switzerland)')), ('el', 'ελληνικά', N_('Greek')), ('en', 'English', N_('English')), ('en_AU', 'English (Australia)', N_('English (Australia)')), ('en_CA', 'English (Canada)', N_('English (Canada)')), ('en_GB', 'English (UK)', N_('English (UK)')), #('eo', 'Esperanto', N_('Esperanto')), ('es', 'Español', N_('Spanish')), ('et', 'Eesti', N_('Estonian')), #('fa', 'فارسی', N_('Persian')), ('fi', 'Suomi', N_('Finnish')), #('fo', 'Føroyskt', N_('Faroese')), ('fr', 'Français', N_('French')), ('fr_CA', 'Français canadien', N_('French (Canada)')), #('fy', 'Frysk', N_('Frisian')), ('gl', 'Galego', N_('Galician')), ('he', 'עברית', N_('Hebrew')), #('hi', 'हिन्दी', N_('Hindi')), ('hu', 'Magyar', N_('Hungarian')), #('id', 'Bahasa Indonesia', N_('Indonesian')), ('is', 'Íslenska', N_('Icelandic')), ('it', 'Italiano', N_('Italian')), ('ja', '日本語', N_('Japanese')), #('kn', 'ಕನ್ನಡ', N_('Kannada')), ('ko', '한국어', N_('Korean')), #('lt', 'Lietuvių', N_('Lithuanian')), ('ms_MY', 'Bahasa Melayu (Malaysia)', N_('Malay (Malaysia)')), ('nb', 'Norsk bokmål', N_('Norwegian Bokmål')), #('nds', 'Plattdüütsch', N_('Low German')), ('nl', 'Nederlands', N_('Dutch')), ('oc', 'Occitan', N_('Occitan')), ('pl', 'Polski', N_('Polish')), ('pt', 'Português', N_('Portuguese')), ('pt_BR', 'Português do Brasil', N_('Brazilian Portuguese')), ('ro', 'Română', N_('Romanian')), ('ru', 'Pyccĸий', N_('Russian')), #('sco', 'Scots leid', N_('Scots')), ('sk', 'Slovenčina', N_('Slovak')), ('sl', 'Slovenščina', N_('Slovenian')), ('sq', 'Shqip', N_('Albanian')), #('sr', 'Србин', N_('Serbian')), ('sv', 'Svenska', N_('Swedish')), #('ta', 'தமிழ்', N_('Tamil')), ('tr', 'Türkçe', N_('Turkish')), ('uk', 'Украї́нська мо́ва', N_('Ukrainian')), ('zh_CN', '中文(中国大陆)', N_('Chinese (China)')), ('zh_TW', '中文(台灣)', N_('Chinese (Taiwan)')), ] picard-release-2.3.1/picard/const/locales.py000066400000000000000000000427611362601763300210020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2014, 2020 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # List of alias locales ALIAS_LOCALES = { 'aa': N_('Afar'), 'aa_DJ': N_('Afar (Djibouti)'), 'aa_ER': N_('Afar (Eritrea)'), 'aa_ER_SAAHO': N_('Afar (Eritrea) (Saho)'), 'aa_ET': N_('Afar (Ethiopia)'), 'af': N_('Afrikaans'), 'af_NA': N_('Afrikaans (Namibia)'), 'af_ZA': N_('Afrikaans (South Africa)'), 'ak': N_('Akan'), 'ak_GH': N_('Akan (Ghana)'), 'sq': N_('Albanian'), 'sq_AL': N_('Albanian (Albania)'), 'am': N_('Amharic'), 'am_ET': N_('Amharic (Ethiopia)'), 'ar': N_('Arabic'), 'ar_DZ': N_('Arabic (Algeria)'), 'ar_BH': N_('Arabic (Bahrain)'), 'ar_EG': N_('Arabic (Egypt)'), 'ar_IQ': N_('Arabic (Iraq)'), 'ar_JO': N_('Arabic (Jordan)'), 'ar_KW': N_('Arabic (Kuwait)'), 'ar_LB': N_('Arabic (Lebanon)'), 'ar_LY': N_('Arabic (Libya)'), 'ar_MA': N_('Arabic (Morocco)'), 'ar_OM': N_('Arabic (Oman)'), 'ar_QA': N_('Arabic (Qatar)'), 'ar_SA': N_('Arabic (Saudi Arabia)'), 'ar_SD': N_('Arabic (Sudan)'), 'ar_SY': N_('Arabic (Syria)'), 'ar_TN': N_('Arabic (Tunisia)'), 'ar_AE': N_('Arabic (United Arab Emirates)'), 'ar_YE': N_('Arabic (Yemen)'), 'hy': N_('Armenian'), 'hy_AM': N_('Armenian (Armenia)'), 'hy_AM_REVISED': N_('Armenian (Armenia) (Revised Orthography)'), 'as': N_('Assamese'), 'as_IN': N_('Assamese (India)'), 'cch': N_('Atsam'), 'cch_NG': N_('Atsam (Nigeria)'), 'az': N_('Azerbaijani'), 'az_AZ': N_('Azerbaijani (Azerbaijan)'), 'az_Cyrl': N_('Azerbaijani (Cyrillic)'), 'az_Cyrl_AZ': N_('Azerbaijani (Cyrillic) (Azerbaijan)'), 'az_Latn': N_('Azerbaijani (Latin)'), 'az_Latn_AZ': N_('Azerbaijani (Latin) (Azerbaijan)'), 'eu': N_('Basque'), 'eu_ES': N_('Basque (Spain)'), 'be': N_('Belarusian'), 'be_BY': N_('Belarusian (Belarus)'), 'bn': N_('Bengali'), 'bn_BD': N_('Bengali (Bangladesh)'), 'bn_IN': N_('Bengali (India)'), 'byn': N_('Blin'), 'byn_ER': N_('Blin (Eritrea)'), 'bs': N_('Bosnian'), 'bs_BA': N_('Bosnian (Bosnia and Herzegovina)'), 'bg': N_('Bulgarian'), 'bg_BG': N_('Bulgarian (Bulgaria)'), 'my': N_('Burmese'), 'my_MM': N_('Burmese (Myanmar [Burma])'), 'ca': N_('Catalan'), 'ca_ES': N_('Catalan (Spain)'), 'zh': N_('Chinese'), 'zh_CN': N_('Chinese (China)'), 'zh_HK': N_('Chinese (Hong Kong)'), 'zh_MO': N_('Chinese (Macau)'), 'zh_Hans': N_('Chinese (Simplified Han)'), 'zh_Hans_CN': N_('Chinese (Simplified Han) (China)'), 'zh_Hans_HK': N_('Chinese (Simplified Han) (Hong Kong)'), 'zh_Hans_MO': N_('Chinese (Simplified Han) (Macau)'), 'zh_Hans_SG': N_('Chinese (Simplified Han) (Singapore)'), 'zh_SG': N_('Chinese (Singapore)'), 'zh_TW': N_('Chinese (Taiwan)'), 'zh_Hant': N_('Chinese (Traditional Han)'), 'zh_Hant_HK': N_('Chinese (Traditional Han) (Hong Kong)'), 'zh_Hant_MO': N_('Chinese (Traditional Han) (Macau)'), 'zh_Hant_TW': N_('Chinese (Traditional Han) (Taiwan)'), 'cop': N_('Coptic'), 'kw': N_('Cornish'), 'kw_GB': N_('Cornish (United Kingdom)'), 'hr': N_('Croatian'), 'hr_HR': N_('Croatian (Croatia)'), 'cs': N_('Czech'), 'cs_CZ': N_('Czech (Czech Republic)'), 'da': N_('Danish'), 'da_DK': N_('Danish (Denmark)'), 'dv': N_('Divehi'), 'dv_MV': N_('Divehi (Maldives)'), 'nl': N_('Dutch'), 'nl_BE': N_('Dutch (Belgium)'), 'nl_NL': N_('Dutch (Netherlands)'), 'dz': N_('Dzongkha'), 'dz_BT': N_('Dzongkha (Bhutan)'), 'en': N_('English'), 'en_AS': N_('English (American Samoa)'), 'en_AU': N_('English (Australia)'), 'en_BE': N_('English (Belgium)'), 'en_BZ': N_('English (Belize)'), 'en_BW': N_('English (Botswana)'), 'en_CA': N_('English (Canada)'), 'en_Dsrt': N_('English (Deseret)'), 'en_Dsrt_US': N_('English (Deseret) (United States)'), 'en_GU': N_('English (Guam)'), 'en_HK': N_('English (Hong Kong)'), 'en_IN': N_('English (India)'), 'en_IE': N_('English (Ireland)'), 'en_JM': N_('English (Jamaica)'), 'en_MT': N_('English (Malta)'), 'en_MH': N_('English (Marshall Islands)'), 'en_NA': N_('English (Namibia)'), 'en_NZ': N_('English (New Zealand)'), 'en_MP': N_('English (Northern Mariana Islands)'), 'en_PK': N_('English (Pakistan)'), 'en_PH': N_('English (Philippines)'), 'en_Shaw': N_('English (Shavian)'), 'en_SG': N_('English (Singapore)'), 'en_ZA': N_('English (South Africa)'), 'en_TT': N_('English (Trinidad and Tobago)'), 'en_UM': N_('English (U.S. Minor Outlying Islands)'), 'en_VI': N_('English (U.S. Virgin Islands)'), 'en_GB': N_('English (United Kingdom)'), 'en_US': N_('English (United States)'), 'en_US_POSIX': N_('English (United States) (Computer)'), 'en_ZW': N_('English (Zimbabwe)'), 'eo': N_('Esperanto'), 'et': N_('Estonian'), 'et_EE': N_('Estonian (Estonia)'), 'ee': N_('Ewe'), 'ee_GH': N_('Ewe (Ghana)'), 'ee_TG': N_('Ewe (Togo)'), 'fo': N_('Faroese'), 'fo_FO': N_('Faroese (Faroe Islands)'), 'fil': N_('Filipino'), 'fil_PH': N_('Filipino (Philippines)'), 'fi': N_('Finnish'), 'fi_FI': N_('Finnish (Finland)'), 'fr': N_('French'), 'fr_BE': N_('French (Belgium)'), 'fr_CA': N_('French (Canada)'), 'fr_FR': N_('French (France)'), 'fr_LU': N_('French (Luxembourg)'), 'fr_MC': N_('French (Monaco)'), 'fr_SN': N_('French (Senegal)'), 'fr_CH': N_('French (Switzerland)'), 'fur': N_('Friulian'), 'fur_IT': N_('Friulian (Italy)'), 'gaa': N_('Ga'), 'gaa_GH': N_('Ga (Ghana)'), 'gl': N_('Galician'), 'gl_ES': N_('Galician (Spain)'), 'gez': N_('Geez'), 'gez_ER': N_('Geez (Eritrea)'), 'gez_ET': N_('Geez (Ethiopia)'), 'ka': N_('Georgian'), 'ka_GE': N_('Georgian (Georgia)'), 'de': N_('German'), 'de_AT': N_('German (Austria)'), 'de_BE': N_('German (Belgium)'), 'de_DE': N_('German (Germany)'), 'de_LI': N_('German (Liechtenstein)'), 'de_LU': N_('German (Luxembourg)'), 'de_CH': N_('German (Switzerland)'), 'el_POLYTON': N_('Greek'), 'el': N_('Greek'), 'el_CY': N_('Greek (Cyprus)'), 'el_GR': N_('Greek (Greece)'), 'gu': N_('Gujarati'), 'gu_IN': N_('Gujarati (India)'), 'ha': N_('Hausa'), 'ha_Arab': N_('Hausa (Arabic)'), 'ha_Arab_NG': N_('Hausa (Arabic) (Nigeria)'), 'ha_Arab_SD': N_('Hausa (Arabic) (Sudan)'), 'ha_GH': N_('Hausa (Ghana)'), 'ha_Latn': N_('Hausa (Latin)'), 'ha_Latn_GH': N_('Hausa (Latin) (Ghana)'), 'ha_Latn_NE': N_('Hausa (Latin) (Niger)'), 'ha_Latn_NG': N_('Hausa (Latin) (Nigeria)'), 'ha_NE': N_('Hausa (Niger)'), 'ha_NG': N_('Hausa (Nigeria)'), 'ha_SD': N_('Hausa (Sudan)'), 'haw': N_('Hawaiian'), 'haw_US': N_('Hawaiian (United States)'), 'he': N_('Hebrew'), 'he_IL': N_('Hebrew (Israel)'), 'hi': N_('Hindi'), 'hi_IN': N_('Hindi (India)'), 'hu': N_('Hungarian'), 'hu_HU': N_('Hungarian (Hungary)'), 'is': N_('Icelandic'), 'is_IS': N_('Icelandic (Iceland)'), 'ig': N_('Igbo'), 'ig_NG': N_('Igbo (Nigeria)'), 'id': N_('Indonesian'), 'id_ID': N_('Indonesian (Indonesia)'), 'ia': N_('Interlingua'), 'iu': N_('Inuktitut'), 'ga': N_('Irish'), 'ga_IE': N_('Irish (Ireland)'), 'it': N_('Italian'), 'it_IT': N_('Italian (Italy)'), 'it_CH': N_('Italian (Switzerland)'), 'ja': N_('Japanese'), 'ja_JP': N_('Japanese (Japan)'), 'kaj': N_('Jju'), 'kaj_NG': N_('Jju (Nigeria)'), 'kl': N_('Kalaallisut'), 'kl_GL': N_('Kalaallisut (Greenland)'), 'kam': N_('Kamba'), 'kam_KE': N_('Kamba (Kenya)'), 'kn': N_('Kannada'), 'kn_IN': N_('Kannada (India)'), 'kk': N_('Kazakh'), 'kk_Cyrl': N_('Kazakh (Cyrillic)'), 'kk_Cyrl_KZ': N_('Kazakh (Cyrillic) (Kazakhstan)'), 'kk_KZ': N_('Kazakh (Kazakhstan)'), 'km': N_('Khmer'), 'km_KH': N_('Khmer (Cambodia)'), 'rw': N_('Kinyarwanda'), 'rw_RW': N_('Kinyarwanda (Rwanda)'), 'ky': N_('Kirghiz'), 'ky_KG': N_('Kirghiz (Kyrgyzstan)'), 'kok': N_('Konkani'), 'kok_IN': N_('Konkani (India)'), 'ko': N_('Korean'), 'ko_KR': N_('Korean (South Korea)'), 'kfo': N_('Koro'), 'kfo_CI': N_('Koro (Côte d’Ivoire)'), 'kpe': N_('Kpelle'), 'kpe_GN': N_('Kpelle (Guinea)'), 'kpe_LR': N_('Kpelle (Liberia)'), 'ku': N_('Kurdish'), 'ku_Arab': N_('Kurdish (Arabic)'), 'ku_Arab_IR': N_('Kurdish (Arabic) (Iran)'), 'ku_Arab_IQ': N_('Kurdish (Arabic) (Iraq)'), 'ku_Arab_SY': N_('Kurdish (Arabic) (Syria)'), 'ku_IR': N_('Kurdish (Iran)'), 'ku_IQ': N_('Kurdish (Iraq)'), 'ku_Latn': N_('Kurdish (Latin)'), 'ku_Latn_TR': N_('Kurdish (Latin) (Turkey)'), 'ku_SY': N_('Kurdish (Syria)'), 'ku_TR': N_('Kurdish (Turkey)'), 'lo': N_('Lao'), 'lo_LA': N_('Lao (Laos)'), 'lv': N_('Latvian'), 'lv_LV': N_('Latvian (Latvia)'), 'ln': N_('Lingala'), 'ln_CG': N_('Lingala (Congo - Brazzaville)'), 'ln_CD': N_('Lingala (Congo - Kinshasa)'), 'lt': N_('Lithuanian'), 'lt_LT': N_('Lithuanian (Lithuania)'), 'nds': N_('Low German'), 'nds_DE': N_('Low German (Germany)'), 'mk': N_('Macedonian'), 'mk_MK': N_('Macedonian (Macedonia)'), 'ms': N_('Malay'), 'ms_BN': N_('Malay (Brunei)'), 'ms_MY': N_('Malay (Malaysia)'), 'ml': N_('Malayalam'), 'ml_IN': N_('Malayalam (India)'), 'mt': N_('Maltese'), 'mt_MT': N_('Maltese (Malta)'), 'gv': N_('Manx'), 'gv_GB': N_('Manx (United Kingdom)'), 'mr': N_('Marathi'), 'mr_IN': N_('Marathi (India)'), 'mo': N_('Moldavian'), 'mn': N_('Mongolian'), 'mn_CN': N_('Mongolian (China)'), 'mn_Cyrl': N_('Mongolian (Cyrillic)'), 'mn_Cyrl_MN': N_('Mongolian (Cyrillic) (Mongolia)'), 'mn_MN': N_('Mongolian (Mongolia)'), 'mn_Mong': N_('Mongolian (Mongolian)'), 'mn_Mong_CN': N_('Mongolian (Mongolian) (China)'), 'ne': N_('Nepali'), 'ne_IN': N_('Nepali (India)'), 'ne_NP': N_('Nepali (Nepal)'), 'se': N_('Northern Sami'), 'se_FI': N_('Northern Sami (Finland)'), 'se_NO': N_('Northern Sami (Norway)'), 'nso': N_('Northern Sotho'), 'nso_ZA': N_('Northern Sotho (South Africa)'), 'no': N_('Norwegian'), 'nb': N_('Norwegian Bokmål'), 'nb_NO': N_('Norwegian Bokmål (Norway)'), 'nn': N_('Norwegian Nynorsk'), 'nn_NO': N_('Norwegian Nynorsk (Norway)'), 'ny': N_('Nyanja'), 'ny_MW': N_('Nyanja (Malawi)'), 'oc': N_('Occitan'), 'oc_FR': N_('Occitan (France)'), 'or': N_('Oriya'), 'or_IN': N_('Oriya (India)'), 'om': N_('Oromo'), 'om_ET': N_('Oromo (Ethiopia)'), 'om_KE': N_('Oromo (Kenya)'), 'ps': N_('Pashto'), 'ps_AF': N_('Pashto (Afghanistan)'), 'fa': N_('Persian'), 'fa_AF': N_('Persian (Afghanistan)'), 'fa_IR': N_('Persian (Iran)'), 'pl': N_('Polish'), 'pl_PL': N_('Polish (Poland)'), 'pt': N_('Portuguese'), 'pt_BR': N_('Portuguese (Brazil)'), 'pt_PT': N_('Portuguese (Portugal)'), 'pa': N_('Punjabi'), 'pa_Arab': N_('Punjabi (Arabic)'), 'pa_Arab_PK': N_('Punjabi (Arabic) (Pakistan)'), 'pa_Guru': N_('Punjabi (Gurmukhi)'), 'pa_Guru_IN': N_('Punjabi (Gurmukhi) (India)'), 'pa_IN': N_('Punjabi (India)'), 'pa_PK': N_('Punjabi (Pakistan)'), 'ro': N_('Romanian'), 'ro_MD': N_('Romanian (Moldova)'), 'ro_RO': N_('Romanian (Romania)'), 'ru': N_('Russian'), 'ru_RU': N_('Russian (Russia)'), 'ru_UA': N_('Russian (Ukraine)'), 'sa': N_('Sanskrit'), 'sa_IN': N_('Sanskrit (India)'), 'sr_YU': N_('Serbian'), 'sr': N_('Serbian'), 'sr_BA': N_('Serbian (Bosnia and Herzegovina)'), 'sr_Cyrl': N_('Serbian (Cyrillic)'), 'sr_Cyrl_YU': N_('Serbian (Cyrillic)'), 'sr_Cyrl_BA': N_('Serbian (Cyrillic) (Bosnia and Herzegovina)'), 'sr_Cyrl_ME': N_('Serbian (Cyrillic) (Montenegro)'), 'sr_Cyrl_RS': N_('Serbian (Cyrillic) (Serbia)'), 'sr_Cyrl_CS': N_('Serbian (Cyrillic) (Serbia and Montenegro)'), 'sr_Latn': N_('Serbian (Latin)'), 'sr_Latn_YU': N_('Serbian (Latin)'), 'sr_Latn_BA': N_('Serbian (Latin) (Bosnia and Herzegovina)'), 'sr_Latn_ME': N_('Serbian (Latin) (Montenegro)'), 'sr_Latn_RS': N_('Serbian (Latin) (Serbia)'), 'sr_Latn_CS': N_('Serbian (Latin) (Serbia and Montenegro)'), 'sr_ME': N_('Serbian (Montenegro)'), 'sr_RS': N_('Serbian (Serbia)'), 'sr_CS': N_('Serbian (Serbia and Montenegro)'), 'sh': N_('Serbo-Croatian'), 'sh_YU': N_('Serbo-Croatian'), 'sh_BA': N_('Serbo-Croatian (Bosnia and Herzegovina)'), 'sh_CS': N_('Serbo-Croatian (Serbia and Montenegro)'), 'ii': N_('Sichuan Yi'), 'ii_CN': N_('Sichuan Yi (China)'), 'sid': N_('Sidamo'), 'sid_ET': N_('Sidamo (Ethiopia)'), 'si': N_('Sinhala'), 'si_LK': N_('Sinhala (Sri Lanka)'), 'sk': N_('Slovak'), 'sk_SK': N_('Slovak (Slovakia)'), 'sl': N_('Slovenian'), 'sl_SI': N_('Slovenian (Slovenia)'), 'so': N_('Somali'), 'so_DJ': N_('Somali (Djibouti)'), 'so_ET': N_('Somali (Ethiopia)'), 'so_KE': N_('Somali (Kenya)'), 'so_SO': N_('Somali (Somalia)'), 'nr': N_('South Ndebele'), 'nr_ZA': N_('South Ndebele (South Africa)'), 'st': N_('Southern Sotho'), 'st_LS': N_('Southern Sotho (Lesotho)'), 'st_ZA': N_('Southern Sotho (South Africa)'), 'es': N_('Spanish'), 'es_AR': N_('Spanish (Argentina)'), 'es_BO': N_('Spanish (Bolivia)'), 'es_CL': N_('Spanish (Chile)'), 'es_CO': N_('Spanish (Colombia)'), 'es_CR': N_('Spanish (Costa Rica)'), 'es_DO': N_('Spanish (Dominican Republic)'), 'es_EC': N_('Spanish (Ecuador)'), 'es_SV': N_('Spanish (El Salvador)'), 'es_GT': N_('Spanish (Guatemala)'), 'es_HN': N_('Spanish (Honduras)'), 'es_MX': N_('Spanish (Mexico)'), 'es_NI': N_('Spanish (Nicaragua)'), 'es_PA': N_('Spanish (Panama)'), 'es_PY': N_('Spanish (Paraguay)'), 'es_PE': N_('Spanish (Peru)'), 'es_PR': N_('Spanish (Puerto Rico)'), 'es_ES': N_('Spanish (Spain)'), 'es_US': N_('Spanish (United States)'), 'es_UY': N_('Spanish (Uruguay)'), 'es_VE': N_('Spanish (Venezuela)'), 'sw': N_('Swahili'), 'sw_KE': N_('Swahili (Kenya)'), 'sw_TZ': N_('Swahili (Tanzania)'), 'ss': N_('Swati'), 'ss_ZA': N_('Swati (South Africa)'), 'ss_SZ': N_('Swati (Swaziland)'), 'sv': N_('Swedish'), 'sv_FI': N_('Swedish (Finland)'), 'sv_SE': N_('Swedish (Sweden)'), 'gsw': N_('Swiss German'), 'gsw_CH': N_('Swiss German (Switzerland)'), 'syr': N_('Syriac'), 'syr_SY': N_('Syriac (Syria)'), 'tl': N_('Tagalog'), 'tg': N_('Tajik'), 'tg_Cyrl': N_('Tajik (Cyrillic)'), 'tg_Cyrl_TJ': N_('Tajik (Cyrillic) (Tajikistan)'), 'tg_TJ': N_('Tajik (Tajikistan)'), 'ta': N_('Tamil'), 'ta_IN': N_('Tamil (India)'), 'trv': N_('Taroko'), 'trv_TW': N_('Taroko (Taiwan)'), 'tt': N_('Tatar'), 'tt_RU': N_('Tatar (Russia)'), 'te': N_('Telugu'), 'te_IN': N_('Telugu (India)'), 'th': N_('Thai'), 'th_TH': N_('Thai (Thailand)'), 'bo': N_('Tibetan'), 'bo_CN': N_('Tibetan (China)'), 'bo_IN': N_('Tibetan (India)'), 'tig': N_('Tigre'), 'tig_ER': N_('Tigre (Eritrea)'), 'ti': N_('Tigrinya'), 'ti_ER': N_('Tigrinya (Eritrea)'), 'ti_ET': N_('Tigrinya (Ethiopia)'), 'to': N_('Tonga'), 'to_TO': N_('Tonga (Tonga)'), 'ts': N_('Tsonga'), 'ts_ZA': N_('Tsonga (South Africa)'), 'tn': N_('Tswana'), 'tn_ZA': N_('Tswana (South Africa)'), 'tr': N_('Turkish'), 'tr_TR': N_('Turkish (Turkey)'), 'kcg': N_('Tyap'), 'kcg_NG': N_('Tyap (Nigeria)'), 'ug': N_('Uighur'), 'ug_Arab': N_('Uighur (Arabic)'), 'ug_Arab_CN': N_('Uighur (Arabic) (China)'), 'ug_CN': N_('Uighur (China)'), 'uk': N_('Ukrainian'), 'uk_UA': N_('Ukrainian (Ukraine)'), 'ur': N_('Urdu'), 'ur_IN': N_('Urdu (India)'), 'ur_PK': N_('Urdu (Pakistan)'), 'uz': N_('Uzbek'), 'uz_AF': N_('Uzbek (Afghanistan)'), 'uz_Arab': N_('Uzbek (Arabic)'), 'uz_Arab_AF': N_('Uzbek (Arabic) (Afghanistan)'), 'uz_Cyrl': N_('Uzbek (Cyrillic)'), 'uz_Cyrl_UZ': N_('Uzbek (Cyrillic) (Uzbekistan)'), 'uz_Latn': N_('Uzbek (Latin)'), 'uz_Latn_UZ': N_('Uzbek (Latin) (Uzbekistan)'), 'uz_UZ': N_('Uzbek (Uzbekistan)'), 've': N_('Venda'), 've_ZA': N_('Venda (South Africa)'), 'vi': N_('Vietnamese'), 'vi_VN': N_('Vietnamese (Vietnam)'), 'wal': N_('Walamo'), 'wal_ET': N_('Walamo (Ethiopia)'), 'cy': N_('Welsh'), 'cy_GB': N_('Welsh (United Kingdom)'), 'wo': N_('Wolof'), 'wo_Latn': N_('Wolof (Latin)'), 'wo_Latn_SN': N_('Wolof (Latin) (Senegal)'), 'wo_SN': N_('Wolof (Senegal)'), 'xh': N_('Xhosa'), 'xh_ZA': N_('Xhosa (South Africa)'), 'yo': N_('Yoruba'), 'yo_NG': N_('Yoruba (Nigeria)'), 'zu': N_('Zulu'), 'zu_ZA': N_('Zulu (South Africa)'), } picard-release-2.3.1/picard/const/sys.py000066400000000000000000000023421362601763300201650ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Laurent Monin # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys IS_WIN = sys.platform == 'win32' IS_LINUX = sys.platform == 'linux' IS_MACOS = sys.platform == 'darwin' IS_HAIKU = sys.platform == 'haiku1' # These variables are set by pyinstaller if running from a packaged build # See http://pyinstaller.readthedocs.io/en/stable/runtime-information.html IS_FROZEN = getattr(sys, 'frozen', False) FROZEN_TEMP_PATH = getattr(sys, '_MEIPASS', '') picard-release-2.3.1/picard/coverart/000077500000000000000000000000001362601763300174735ustar00rootroot00000000000000picard-release-2.3.1/picard/coverart/__init__.py000066400000000000000000000213071362601763300216070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007, 2010-2011 Lukáš Lalinský # Copyright (C) 2007-2011, 2019 Philipp Wolfer # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import traceback from PyQt5.QtCore import QObject from picard import ( config, log, ) from picard.coverart.image import ( CoverArtImageIdentificationError, CoverArtImageIOError, ) from picard.coverart.providers import ( CoverArtProvider, cover_art_providers, ) from picard.metadata import register_album_metadata_processor class CoverArt: def __init__(self, album, metadata, release): self._queue_new() self.album = album self.metadata = metadata self.release = release self.front_image_found = False def __repr__(self): return "CoverArt for %r" % (self.album) def retrieve(self): """Retrieve available cover art images for the release""" if (not config.setting["save_images_to_tags"] and not config.setting["save_images_to_files"]): log.debug("Cover art disabled by user options.") return self.providers = cover_art_providers() self.next_in_queue() def _set_metadata(self, coverartimage, data): try: coverartimage.set_data(data) if coverartimage.can_be_saved_to_metadata: log.debug("Cover art image stored to metadata: %r [%s]" % ( coverartimage, coverartimage.imageinfo_as_string()) ) self.metadata.images.append(coverartimage) for track in self.album._new_tracks: track.metadata.images.append(coverartimage) # If the image already was a front image, # there might still be some other non-CAA front # images in the queue - ignore them. if not self.front_image_found: self.front_image_found = coverartimage.is_front_image() else: log.debug("Thumbnail for cover art image: %r [%s]" % ( coverartimage, coverartimage.imageinfo_as_string()) ) except CoverArtImageIOError as e: self.album.error_append(e) self.album._finalize_loading(error=True) raise e except CoverArtImageIdentificationError as e: self.album.error_append(e) def _coverart_downloaded(self, coverartimage, data, http, error): """Handle finished download, save it to metadata""" self.album._requests -= 1 if error: self.album.error_append('Coverart error: %s' % (http.errorString())) elif len(data) < 1000: log.warning("Not enough data, skipping %s" % coverartimage) else: self._message( N_("Cover art of type '%(type)s' downloaded for %(albumid)s from %(host)s"), { 'type': coverartimage.types_as_string(), 'albumid': self.album.id, 'host': coverartimage.host }, echo=None ) try: self._set_metadata(coverartimage, data) except CoverArtImageIOError: # It doesn't make sense to store/download more images if we can't # save them in the temporary folder, abort. return self.next_in_queue() def next_in_queue(self): """Downloads next item in queue. If there are none left, loading of album will be finalized. """ if self.album.id not in self.album.tagger.albums: # album removed return if (self.front_image_found and config.setting["save_images_to_tags"] and not config.setting["save_images_to_files"] and config.setting["embed_only_one_front_image"]): # no need to continue self.album._finalize_loading(None) return if self._queue_empty(): try: # requeue from next provider provider = next(self.providers) ret = CoverArtProvider._STARTED try: instance = provider.cls(self) if provider.enabled and instance.enabled(): log.debug("Trying cover art provider %s ..." % provider.name) ret = instance.queue_images() else: log.debug("Skipping cover art provider %s ..." % provider.name) except BaseException: log.error(traceback.format_exc()) raise finally: if ret != CoverArtProvider.WAIT: self.next_in_queue() return except StopIteration: # nothing more to do self.album._finalize_loading(None) return # We still have some items to try! coverartimage = self._queue_get() if not coverartimage.support_types and self.front_image_found: # we already have one front image, no need to try other type-less # sources log.debug("Skipping %r, one front image is already available", coverartimage) self.next_in_queue() return # local files if coverartimage.url and coverartimage.url.scheme() == 'file': try: path = coverartimage.url.toLocalFile() with open(path, 'rb') as file: self._set_metadata(coverartimage, file.read()) except IOError as ioexcept: (errnum, errmsg) = ioexcept.args log.error("Failed to read %r: %s (%d)" % (path, errmsg, errnum)) except CoverArtImageIOError: # It doesn't make sense to store/download more images if we can't # save them in the temporary folder, abort. return self.next_in_queue() return # on the web self._message( N_("Downloading cover art of type '%(type)s' for %(albumid)s from %(host)s ..."), { 'type': coverartimage.types_as_string(), 'albumid': self.album.id, 'host': coverartimage.host }, echo=None ) log.debug("Downloading %r" % coverartimage) self.album.tagger.webservice.download( coverartimage.host, coverartimage.port, coverartimage.path, partial(self._coverart_downloaded, coverartimage), priority=True, important=False ) self.album._requests += 1 def queue_put(self, coverartimage): """Add an image to queue""" log.debug("Queuing cover art image %r", coverartimage) self.__queue.append(coverartimage) def _queue_get(self): """Get next image and remove it from queue""" return self.__queue.pop(0) def _queue_empty(self): """Returns True if the queue is empty""" return not self.__queue def _queue_new(self): """Initialize the queue""" self.__queue = [] def _message(self, *args, **kwargs): """Display message to status bar""" QObject.tagger.window.set_statusbar_message(*args, **kwargs) def _retrieve_coverart(album, metadata, release): """Gets all cover art URLs from the metadata and then attempts to download the album art. """ coverart = CoverArt(album, metadata, release) log.debug("New %r", coverart) coverart.retrieve() register_album_metadata_processor(_retrieve_coverart) picard-release-2.3.1/picard/coverart/image.py000066400000000000000000000370061362601763300211350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007, 2010-2011 Lukáš Lalinský # Copyright (C) 2007-2011, 2014, 2018-2019 Philipp Wolfer # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012, 2015 Wieland Hoffmann # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2016 Ville Skyttä # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from hashlib import md5 import os import shutil import tempfile from PyQt5.QtCore import ( QMutex, QObject, QUrl, ) from picard import ( config, log, ) from picard.coverart.utils import translate_caa_type from picard.metadata import Metadata from picard.util import ( decode_filename, encode_filename, imageinfo, ) from picard.util.scripttofilename import script_to_filename _datafiles = dict() _datafile_mutex = QMutex(QMutex.Recursive) class DataHash: def __init__(self, data, prefix='picard', suffix=''): self._filename = None _datafile_mutex.lock() try: m = md5() m.update(data) self._hash = m.hexdigest() if self._hash not in _datafiles: (fd, self._filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix) QObject.tagger.register_cleanup(self.delete_file) with os.fdopen(fd, "wb") as imagefile: imagefile.write(data) _datafiles[self._hash] = self._filename log.debug("Saving image data %s to %r" % (self._hash, self._filename)) else: self._filename = _datafiles[self._hash] finally: _datafile_mutex.unlock() def __eq__(self, other): return self._hash == other._hash def hash(self): return self._hash def delete_file(self): if self._filename: try: os.unlink(self._filename) except BaseException: pass else: _datafile_mutex.lock() try: self._filename = None del _datafiles[self._hash] self._hash = None finally: _datafile_mutex.unlock() @property def data(self): if self._filename: with open(self._filename, "rb") as imagefile: return imagefile.read() return None @property def filename(self): return self._filename class CoverArtImageError(Exception): pass class CoverArtImageIOError(CoverArtImageError): pass class CoverArtImageIdentificationError(CoverArtImageError): pass class CoverArtImage: # Indicate if types are provided by the source, ie. CAA or certain file # formats may have types associated with cover art, but some other sources # don't provide such information support_types = False # Indicates that the source supports multiple types per image. support_multi_types = False # `is_front` has to be explicitly set, it is used to handle CAA is_front # indicator is_front = None sourceprefix = "URL" def __init__(self, url=None, types=None, comment='', data=None, support_types=None, support_multi_types=None): if types is None: self.types = [] else: self.types = types if url is not None: self.parse_url(url) else: self.url = None self.comment = comment self.datahash = None # thumbnail is used to link to another CoverArtImage, ie. for PDFs self.thumbnail = None self.can_be_saved_to_tags = True self.can_be_saved_to_disk = True self.can_be_saved_to_metadata = True if support_types is not None: self.support_types = support_types if support_multi_types is not None: self.support_multi_types = support_multi_types if data is not None: self.set_data(data) def parse_url(self, url): self.url = QUrl(url) self.host = self.url.host() self.port = self.url.port(443 if self.url.scheme() == 'https' else 80) self.path = self.url.path(QUrl.FullyEncoded) if self.url.hasQuery(): self.path += '?' + self.url.query(QUrl.FullyEncoded) @property def source(self): if self.url is not None: return "%s: %s" % (self.sourceprefix, self.url.toString()) else: return "%s" % self.sourceprefix def is_front_image(self): """Indicates if image is considered as a 'front' image. It depends on few things: - if `is_front` was set, it is used over anything else - if `types` was set, search for 'front' in it - if `support_types` is False, default to True for any image - if `support_types` is True, default to False for any image """ if not self.can_be_saved_to_metadata: # ignore thumbnails return False if self.is_front is not None: return self.is_front if 'front' in self.types: return True return (self.support_types is False) def imageinfo_as_string(self): if self.datahash is None: return "" return "w=%d h=%d mime=%s ext=%s datalen=%d file=%s" % (self.width, self.height, self.mimetype, self.extension, self.datalength, self.tempfile_filename) def __repr__(self): p = [] if self.url is not None: p.append("url=%r" % self.url.toString()) if self.types: p.append("types=%r" % self.types) p.append('support_types=%r' % self.support_types) p.append('support_multi_types=%r' % self.support_types) if self.is_front is not None: p.append("is_front=%r" % self.is_front) if self.comment: p.append("comment=%r" % self.comment) return "%s(%s)" % (self.__class__.__name__, ", ".join(p)) def __str__(self): p = ['Image'] if self.url is not None: p.append("from %s" % self.url.toString()) if self.types: p.append("of type %s" % ','.join(self.types)) if self.comment: p.append("and comment '%s'" % self.comment) return ' '.join(p) def __eq__(self, other): if self and other: if self.support_types and other.support_types: if self.support_multi_types and other.support_multi_types: return (self.datahash, self.types) == (other.datahash, other.types) else: return (self.datahash, self.maintype) == (other.datahash, other.maintype) else: return self.datahash == other.datahash elif not self and not other: return True else: return False def __hash__(self): if self.datahash is None: return 0 return hash(self.datahash.hash()) def set_data(self, data): """Store image data in a file, if data already exists in such file it will be re-used and no file write occurs """ if self.datahash: self.datahash.delete_file() self.datahash = None try: (self.width, self.height, self.mimetype, self.extension, self.datalength) = imageinfo.identify(data) except imageinfo.IdentificationError as e: raise CoverArtImageIdentificationError(e) try: self.datahash = DataHash(data, suffix=self.extension) except (OSError, IOError) as e: raise CoverArtImageIOError(e) @property def maintype(self): """Returns one type only, even for images having more than one type set. This is mostly used when saving cover art to tags because most formats don't support multiple types for one image. Images coming from CAA can have multiple types (ie. 'front, booklet'). """ if self.is_front_image() or not self.types or 'front' in self.types: return 'front' # TODO: do something better than randomly using the first in the list return self.types[0] def _make_image_filename(self, filename, dirname, _metadata): metadata = Metadata() metadata.copy(_metadata) metadata["coverart_maintype"] = self.maintype metadata["coverart_comment"] = self.comment if self.is_front: metadata.add_unique("coverart_types", "front") for cover_type in self.types: metadata.add_unique("coverart_types", cover_type) filename = script_to_filename(filename, metadata) if not filename: filename = "cover" if not os.path.isabs(filename): filename = os.path.join(dirname, filename) return encode_filename(filename) def save(self, dirname, metadata, counters): """Saves this image. :dirname: The name of the directory that contains the audio file :metadata: A metadata object :counters: A dictionary mapping filenames to the amount of how many images with that filename were already saved in `dirname`. """ if not self.can_be_saved_to_disk: return if (config.setting["caa_image_type_as_filename"] and not self.is_front_image()): filename = self.maintype log.debug("Make cover filename from types: %r -> %r", self.types, filename) else: filename = config.setting["cover_image_filename"] log.debug("Using default cover image filename %r", filename) filename = self._make_image_filename(filename, dirname, metadata) overwrite = config.setting["save_images_overwrite"] ext = encode_filename(self.extension) image_filename = self._next_filename(filename, counters) while os.path.exists(image_filename + ext) and not overwrite: if not self._is_write_needed(image_filename + ext): break image_filename = self._next_filename(filename, counters) else: new_filename = image_filename + ext # Even if overwrite is enabled we don't need to write the same # image multiple times if not self._is_write_needed(new_filename): return log.debug("Saving cover image to %r", new_filename) try: new_dirname = os.path.dirname(new_filename) if not os.path.isdir(new_dirname): os.makedirs(new_dirname) shutil.copyfile(self.tempfile_filename, new_filename) except (OSError, IOError) as e: raise CoverArtImageIOError(e) def _next_filename(self, filename, counters): if counters[filename]: new_filename = "%s (%d)" % (decode_filename(filename), counters[filename]) else: new_filename = filename counters[filename] += 1 return encode_filename(new_filename) def _is_write_needed(self, filename): if (os.path.exists(filename) and os.path.getsize(filename) == self.datalength): log.debug("Identical file size, not saving %r", filename) return False return True @property def data(self): """Reads the data from the temporary file created for this image. May raise CoverArtImageIOError """ try: return self.datahash.data except (OSError, IOError) as e: raise CoverArtImageIOError(e) @property def tempfile_filename(self): return self.datahash.filename def normalized_types(self): if self.types: types = sorted(set(self.types)) elif self.is_front_image(): types = ['front'] else: types = ['-'] return types def types_as_string(self, translate=True, separator=', '): types = self.normalized_types() if translate: types = [translate_caa_type(type) for type in types] return separator.join(types) class CaaCoverArtImage(CoverArtImage): """Image from Cover Art Archive""" support_types = True support_multi_types = True sourceprefix = "CAA" def __init__(self, url, types=None, is_front=False, comment='', data=None): super().__init__(url=url, types=types, comment=comment, data=data) self.is_front = is_front class CaaThumbnailCoverArtImage(CaaCoverArtImage): """Used for thumbnails of CaaCoverArtImage objects, together with thumbnail property""" def __init__(self, url, types=None, is_front=False, comment='', data=None): super().__init__(url=url, types=types, comment=comment, data=data) self.is_front = False self.can_be_saved_to_disk = False self.can_be_saved_to_tags = False self.can_be_saved_to_metadata = False class TagCoverArtImage(CoverArtImage): """Image from file tags""" def __init__(self, file, tag=None, types=None, is_front=None, support_types=False, comment='', data=None, support_multi_types=False): super().__init__(url=None, types=types, comment=comment, data=data) self.sourcefile = file self.tag = tag self.support_types = support_types self.support_multi_types = support_multi_types if is_front is not None: self.is_front = is_front @property def source(self): if self.tag: return 'Tag %s from %s' % (self.tag, self.sourcefile) else: return 'File %s' % (self.sourcefile) def __repr__(self): p = [] p.append('%r' % self.sourcefile) if self.tag is not None: p.append("tag=%r" % self.tag) if self.types: p.append("types=%r" % self.types) if self.is_front is not None: p.append("is_front=%r" % self.is_front) p.append('support_types=%r' % self.support_types) if self.comment: p.append("comment=%r" % self.comment) return "%s(%s)" % (self.__class__.__name__, ", ".join(p)) class LocalFileCoverArtImage(CoverArtImage): sourceprefix = 'LOCAL' def __init__(self, filepath, types=None, comment='', support_types=False, support_multi_types=False): url = QUrl.fromLocalFile(filepath).toString() super().__init__(url=url, types=types, comment=comment) self.support_types = support_types self.support_multi_types = support_multi_types picard-release-2.3.1/picard/coverart/providers/000077500000000000000000000000001362601763300215105ustar00rootroot00000000000000picard-release-2.3.1/picard/coverart/providers/__init__.py000066400000000000000000000157361362601763300236350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2014-2015, 2018-2019 Laurent Monin # Copyright (C) 2015 Rahul Raturi # Copyright (C) 2016 Ville Skyttä # Copyright (C) 2016 Wieland Hoffmann # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict, namedtuple import traceback from picard import log, config from picard.plugin import ExtensionPoint from picard.ui.options import OptionsPage, register_options_page _cover_art_providers = ExtensionPoint(label='cover_art_providers') class ProviderOptions(OptionsPage): """ Template class for provider's options It works like OptionsPage for the most (options, load, save) It will append the provider's options page as a child of the main cover art's options page. The property _options_ui must be set to a valid Qt Ui class containing the layout and widgets for defined provider's options. A specific provider class (inhereting from CoverArtProvider) has to set the subclassed ProviderOptions as OPTIONS property. Options will be registered at the same time as the provider. class MyProviderOptions(ProviderOptions): _options_ui = Ui_MyProviderOptions .... class MyProvider(CoverArtProvider): OPTIONS = ProviderOptionsMyProvider .... """ PARENT = "cover" def __init__(self, parent=None): super().__init__(parent) self.ui = self._options_ui() self.ui.setupUi(self) def register_cover_art_provider(provider): _cover_art_providers.register(provider.__module__, provider) if hasattr(provider, 'OPTIONS') and provider.OPTIONS: provider.OPTIONS.NAME = provider.name.lower().replace(' ', '_') provider.OPTIONS.TITLE = provider.title register_options_page(provider.OPTIONS) # named tuples used by cover_art_providers() ProviderTuple = namedtuple('ProviderTuple', 'name title enabled cls') PInfoTuple = namedtuple('PInfoTuple', 'position enabled') POrderTuple = namedtuple('OrderTuple', 'name position enabled') def cover_art_providers(): def from_ca_providers_option(): """Iterate through ca_providers option and yield name, position and enabled""" for pos, (name, enabled) in enumerate(config.setting['ca_providers']): yield POrderTuple(name=name, position=pos, enabled=enabled) # build a defaultdict with provider name as key, and PInfoTuple as value order = defaultdict(lambda: PInfoTuple(position=666, enabled=False)) for o in from_ca_providers_option(): order[o.name] = PInfoTuple(position=o.position, enabled=o.enabled) # use previously built dict to order providers, according to current ca_providers # (yet) unknown providers are placed at the end, disabled ordered_providers = sorted(_cover_art_providers, key=lambda p: order[p.name].position) def label(p): checked = 'x' if order[p.name].enabled else ' ' return "%s [%s]" % (p.name, checked) log.debug("CA Providers order: %s", ' > '.join([label(p) for p in ordered_providers])) for p in ordered_providers: yield ProviderTuple(name=p.name, title=p.title, enabled=order[p.name].enabled, cls=p) class CoverArtProviderMetaClass(type): """Provide default properties name & title for CoverArtProvider It is recommended to use those in place of NAME and TITLE that might not be defined """ @property def name(cls): return getattr(cls, 'NAME', cls.__name__) @property def title(cls): return getattr(cls, 'TITLE', cls.name) class CoverArtProvider(metaclass=CoverArtProviderMetaClass): """Subclasses of this class need to reimplement at least `queue_images()`. `__init__()` does not have to do anything. `queue_images()` will be called if `enabled()` returns `True`. `queue_images()` must return `FINISHED` when it finished to queue potential cover art downloads (using `queue_put(). If `queue_images()` delegates the job of queuing downloads to another method (asynchronous) it should return `WAIT` and the other method has to explicitly call `next_in_queue()`. If `FINISHED` is returned, `next_in_queue()` will be automatically called by CoverArt object. """ # default state, internal use _STARTED = 0 # returned by queue_images(): # next_in_queue() will be automatically called FINISHED = 1 # returned by queue_images(): # next_in_queue() has to be called explicitly by provider WAIT = 2 def __init__(self, coverart): self.coverart = coverart self.release = coverart.release self.metadata = coverart.metadata self.album = coverart.album def enabled(self): return not self.coverart.front_image_found def queue_images(self): # this method has to return CoverArtProvider.FINISHED or # CoverArtProvider.WAIT raise NotImplementedError def error(self, msg): self.coverart.album.error_append(msg) def queue_put(self, what): self.coverart.queue_put(what) def next_in_queue(self): # must be called by provider if queue_images() returns WAIT self.coverart.next_in_queue() def match_url_relations(self, relation_types, func): """Execute `func` for each relation url matching type in `relation_types` """ try: if 'relations' in self.release: for relation in self.release['relations']: if relation['target-type'] == 'url': if relation['type'] in relation_types: func(relation['url']['resource']) except AttributeError: self.error(traceback.format_exc()) from picard.coverart.providers.local import CoverArtProviderLocal from picard.coverart.providers.caa import CoverArtProviderCaa from picard.coverart.providers.whitelist import CoverArtProviderWhitelist from picard.coverart.providers.caa_release_group import CoverArtProviderCaaReleaseGroup __providers = [ CoverArtProviderLocal, CoverArtProviderCaa, CoverArtProviderWhitelist, CoverArtProviderCaaReleaseGroup, ] for provider in __providers: register_cover_art_provider(provider) picard-release-2.3.1/picard/coverart/providers/caa.py000066400000000000000000000670651362601763300226240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007, 2010-2011 Lukáš Lalinský # Copyright (C) 2007-2011, 2015, 2018-2019 Philipp Wolfer # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2015-2016 Rahul Raturi # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import ( OrderedDict, namedtuple, ) from functools import partial from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from PyQt5.QtNetwork import ( QNetworkReply, QNetworkRequest, ) from picard import ( config, log, ) from picard.const import ( CAA_HOST, CAA_PORT, ) from picard.coverart.image import ( CaaCoverArtImage, CaaThumbnailCoverArtImage, ) from picard.coverart.providers import ( CoverArtProvider, ProviderOptions, ) from picard.coverart.utils import ( CAA_TYPES, translate_caa_type, ) from picard.util import webbrowser2 from picard.ui import PicardDialog from picard.ui.ui_provider_options_caa import Ui_CaaOptions from picard.ui.util import StandardButton CaaSizeItem = namedtuple('CaaSizeItem', ['thumbnail', 'label']) _CAA_THUMBNAIL_SIZE_MAP = OrderedDict([ (250, CaaSizeItem('small', N_('250 px'))), (500, CaaSizeItem('large', N_('500 px'))), (1200, CaaSizeItem('1200', N_('1200 px'))), (-1, CaaSizeItem(None, N_('Full size'))), ]) _CAA_IMAGE_SIZE_DEFAULT = 500 _CAA_IMAGE_TYPE_DEFAULT_INCLUDE = ['front'] _CAA_IMAGE_TYPE_DEFAULT_EXCLUDE = ['raw/unedited', 'watermark'] def caa_url_fallback_list(desired_size, thumbnails): """List of thumbnail urls equal or smaller than size, in size decreasing order It is used for find the "best" thumbnail according to: - user choice - thumbnail availability If user choice isn't matching an available thumbnail size, a fallback to smaller thumbnails is possible This function returns the list of possible urls, ordered from the biggest matching the user choice to the smallest one. Of course, if none are possible, the returned list may be empty. """ reversed_map = OrderedDict(reversed(list(_CAA_THUMBNAIL_SIZE_MAP.items()))) urls = [] for item_id, item in reversed_map.items(): if item_id == -1 or item_id > desired_size: continue if item.thumbnail in thumbnails: urls.append(thumbnails[item.thumbnail]) return urls class ArrowButton(QtWidgets.QPushButton): """Standard arrow button for CAA image type selection dialog. Keyword Arguments: label {string} -- Label to display on the button command {command} -- Command to execute when the button is clicked (default: {None}) parent {[type]} -- Parent of the QPushButton object being created (default: {None}) """ def __init__(self, icon_name, command=None, parent=None): icon = QtGui.QIcon(":/images/16x16/" + icon_name + '.png') super().__init__(icon, "", parent=parent) if command is not None: self.clicked.connect(command) class ArrowsColumn(QtWidgets.QWidget): """Standard arrow buttons column for CAA image type selection dialog. Keyword Arguments: selection_list {ListBox} -- ListBox of selected items associated with this arrow column ignore_list {ListBox} -- ListBox of unselected items associated with this arrow column callback {command} -- Command to execute after items are moved between lists (default: {None}) reverse {bool} -- Determines whether the arrow directions should be reversed (default: {False}) parent {[type]} -- Parent of the QWidget object being created (default: {None}) """ def __init__(self, selection_list, ignore_list, callback=None, reverse=False, parent=None): super().__init__(parent=parent) self.selection_list = selection_list self.ignore_list = ignore_list self.callback = callback spacer_item = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) arrows_layout = QtWidgets.QVBoxLayout() arrows_layout.addItem(QtWidgets.QSpacerItem(spacer_item)) self.button_add = ArrowButton('go-next' if reverse else 'go-previous', self.move_from_ignore) arrows_layout.addWidget(self.button_add) self.button_add_all = ArrowButton('move-all-right' if reverse else 'move-all-left', self.move_all_from_ignore) arrows_layout.addWidget(self.button_add_all) self.button_remove = ArrowButton('go-previous' if reverse else 'go-next', self.move_to_ignore) arrows_layout.addWidget(self.button_remove) self.button_remove_all = ArrowButton('move-all-left' if reverse else 'move-all-right', self.move_all_to_ignore) arrows_layout.addWidget(self.button_remove_all) arrows_layout.addItem(QtWidgets.QSpacerItem(spacer_item)) self.setLayout(arrows_layout) def move_from_ignore(self): self.ignore_list.move_selected_items(self.selection_list, callback=self.callback) def move_all_from_ignore(self): self.ignore_list.move_all_items(self.selection_list, callback=self.callback) def move_to_ignore(self): self.selection_list.move_selected_items(self.ignore_list, callback=self.callback) def move_all_to_ignore(self): self.selection_list.move_all_items(self.ignore_list, callback=self.callback) class ListBox(QtWidgets.QListWidget): """Standard list box for CAA image type selection dialog. Keyword Arguments: parent {[type]} -- Parent of the QListWidget object being created (default: {None}) """ LISTBOX_WIDTH = 100 LISTBOX_HEIGHT = 250 def __init__(self, parent=None): super().__init__(parent=parent) self.setMinimumSize(QtCore.QSize(self.LISTBOX_WIDTH, self.LISTBOX_HEIGHT)) self.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding) self.setSortingEnabled(True) self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) def move_item(self, item, target_list): """Move the specified item to another listbox.""" self.takeItem(self.row(item)) target_list.addItem(item) def move_selected_items(self, target_list, callback=None): """Move the selected item to another listbox.""" for item in self.selectedItems(): self.move_item(item, target_list) if callback: callback() def move_all_items(self, target_list, callback=None): """Move all items to another listbox.""" while self.count(): self.move_item(self.item(0), target_list) if callback: callback() def all_items_data(self, role=QtCore.Qt.UserRole): for index in range(self.count()): yield self.item(index).data(role) class CAATypesSelectorDialog(PicardDialog): """Display dialog box to select the CAA image types to include and exclude from download and use. Keyword Arguments: parent {[type]} -- Parent of the QDialog object being created (default: {None}) types_include {[string]} -- List of CAA image types to include (default: {None}) types_exclude {[string]} -- List of CAA image types to exclude (default: {None}) """ def __init__(self, parent=None, types_include=None, types_exclude=None): super().__init__(parent) if types_include is None: types_include = [] if types_exclude is None: types_exclude = [] self.setWindowTitle(_("Cover art types")) self.setWindowModality(QtCore.Qt.WindowModal) self.layout = QtWidgets.QVBoxLayout(self) self.layout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) # Create list boxes for dialog self.list_include = ListBox() self.list_exclude = ListBox() self.list_ignore = ListBox() # Populate list boxes from current settings self.fill_lists(types_include, types_exclude) # Set triggers when the lists receive the current focus self.list_include.clicked.connect(partial(self.clear_focus, [self.list_ignore, self.list_exclude])) self.list_exclude.clicked.connect(partial(self.clear_focus, [self.list_ignore, self.list_include])) self.list_ignore.clicked.connect(partial(self.clear_focus, [self.list_include, self.list_exclude])) # Add instructions to the dialog box instructions = QtWidgets.QLabel() instructions.setText(_("Please select the contents of the image type 'Include' and 'Exclude' lists.")) instructions.setWordWrap(True) instructions.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(instructions) self.arrows_include = ArrowsColumn( self.list_include, self.list_ignore, callback=self.set_buttons_enabled_state, ) self.arrows_exclude = ArrowsColumn( self.list_exclude, self.list_ignore, callback=self.set_buttons_enabled_state, reverse=True ) lists_layout = QtWidgets.QHBoxLayout() include_list_layout = QtWidgets.QVBoxLayout() include_list_layout.addWidget(QtWidgets.QLabel(_("Include types list"))) include_list_layout.addWidget(self.list_include) lists_layout.addLayout(include_list_layout) lists_layout.addWidget(self.arrows_include) ignore_list_layout = QtWidgets.QVBoxLayout() ignore_list_layout.addWidget(QtWidgets.QLabel("")) ignore_list_layout.addWidget(self.list_ignore) lists_layout.addLayout(ignore_list_layout) lists_layout.addWidget(self.arrows_exclude) exclude_list_layout = QtWidgets.QVBoxLayout() exclude_list_layout.addWidget(QtWidgets.QLabel(_("Exclude types list"))) exclude_list_layout.addWidget(self.list_exclude) lists_layout.addLayout(exclude_list_layout) self.layout.addLayout(lists_layout) # Add usage explanation to the dialog box instructions = QtWidgets.QLabel() instructions.setText(_( "CAA images with an image type found in the 'Include' list will be downloaded and used " "UNLESS they also have an image type found in the 'Exclude' list. Images with types " "found in the 'Exclude' list will NEVER be used. Image types not appearing in the 'Include' " "or 'Exclude' lists will not be considered when determining whether or not to download and " "use a CAA image.\n") ) instructions.setWordWrap(True) instructions.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.layout.addWidget(instructions) self.buttonbox = QtWidgets.QDialogButtonBox(self) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.addButton( StandardButton(StandardButton.OK), QtWidgets.QDialogButtonBox.AcceptRole) self.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtWidgets.QDialogButtonBox.RejectRole) self.buttonbox.addButton( StandardButton(StandardButton.HELP), QtWidgets.QDialogButtonBox.HelpRole) extrabuttons = [ (N_("I&nclude all"), self.move_all_to_include_list), (N_("E&xclude all"), self.move_all_to_exclude_list), (N_("C&lear all"), self.move_all_to_ignore_list), (N_("Restore &Defaults"), self.reset_to_defaults), ] for label, callback in extrabuttons: button = QtWidgets.QPushButton(_(label)) self.buttonbox.addButton(button, QtWidgets.QDialogButtonBox.ActionRole) button.clicked.connect(callback) self.layout.addWidget(self.buttonbox) self.buttonbox.accepted.connect(self.accept) self.buttonbox.rejected.connect(self.reject) self.buttonbox.helpRequested.connect(self.help) self.set_buttons_enabled_state() def move_all_to_include_list(self): self.list_ignore.move_all_items(self.list_include) self.list_exclude.move_all_items(self.list_include) self.set_buttons_enabled_state() def move_all_to_exclude_list(self): self.list_ignore.move_all_items(self.list_exclude) self.list_include.move_all_items(self.list_exclude) self.set_buttons_enabled_state() def move_all_to_ignore_list(self): self.list_include.move_all_items(self.list_ignore) self.list_exclude.move_all_items(self.list_ignore) self.set_buttons_enabled_state() def fill_lists(self, includes, excludes): """Fill dialog listboxes. First clears the contents of the three listboxes, and then populates the listboxes from the dictionary of standard CAA types, using the provided 'includes' and 'excludes' lists to determine the appropriate list for each type. Arguments: includes -- list of standard image types to place in the "Include" listbox excludes -- list of standard image types to place in the "Exclude" listbox """ self.list_include.clear() self.list_exclude.clear() self.list_ignore.clear() for caa_type in CAA_TYPES: name = caa_type['name'] title = translate_caa_type(caa_type['title']) item = QtWidgets.QListWidgetItem(title) item.setData(QtCore.Qt.UserRole, name) if name in includes: self.list_include.addItem(item) elif name in excludes: self.list_exclude.addItem(item) else: self.list_ignore.addItem(item) def help(self): webbrowser2.goto('doc_cover_art_types') def get_selected_types_include(self): return list(self.list_include.all_items_data()) or ['front'] def get_selected_types_exclude(self): return list(self.list_exclude.all_items_data()) or ['none'] def clear_focus(self, lists): for temp_list in lists: temp_list.clearSelection() self.set_buttons_enabled_state() def reset_to_defaults(self): self.fill_lists(_CAA_IMAGE_TYPE_DEFAULT_INCLUDE, _CAA_IMAGE_TYPE_DEFAULT_EXCLUDE) self.set_buttons_enabled_state() def set_buttons_enabled_state(self): has_items_include = self.list_include.count() has_items_exclude = self.list_exclude.count() has_items_ignore = self.list_ignore.count() has_selected_include = bool(self.list_include.selectedItems()) has_selected_exclude = bool(self.list_exclude.selectedItems()) has_selected_ignore = bool(self.list_ignore.selectedItems()) # "Include" list buttons self.arrows_include.button_add.setEnabled(has_items_ignore and has_selected_ignore) self.arrows_include.button_add_all.setEnabled(has_items_ignore) self.arrows_include.button_remove.setEnabled(has_items_include and has_selected_include) self.arrows_include.button_remove_all.setEnabled(has_items_include) # "Exclude" list buttons self.arrows_exclude.button_add.setEnabled(has_items_ignore and has_selected_ignore) self.arrows_exclude.button_add_all.setEnabled(has_items_ignore) self.arrows_exclude.button_remove.setEnabled(has_items_exclude and has_selected_exclude) self.arrows_exclude.button_remove_all.setEnabled(has_items_exclude) @staticmethod def run(parent=None, types_include=None, types_exclude=None): if types_include is None: types_include = [] if types_exclude is None: types_exclude = [] dialog = CAATypesSelectorDialog(parent, types_include, types_exclude) result = dialog.exec_() return (dialog.get_selected_types_include(), dialog.get_selected_types_exclude(), result == QtWidgets.QDialog.Accepted) class ProviderOptionsCaa(ProviderOptions): """ Options for Cover Art Archive cover art provider """ options = [ config.BoolOption("setting", "caa_save_single_front_image", False), config.BoolOption("setting", "caa_approved_only", False), config.BoolOption("setting", "caa_image_type_as_filename", False), config.IntOption("setting", "caa_image_size", _CAA_IMAGE_SIZE_DEFAULT), config.ListOption("setting", "caa_image_types", _CAA_IMAGE_TYPE_DEFAULT_INCLUDE), config.BoolOption("setting", "caa_restrict_image_types", True), config.ListOption("setting", "caa_image_types_to_omit", _CAA_IMAGE_TYPE_DEFAULT_EXCLUDE), ] _options_ui = Ui_CaaOptions def __init__(self, parent=None): super().__init__(parent) self.ui.restrict_images_types.clicked.connect(self.update_caa_types) self.ui.select_caa_types.clicked.connect(self.select_caa_types) def restore_defaults(self): self.caa_image_types = _CAA_IMAGE_TYPE_DEFAULT_INCLUDE self.caa_image_types_to_omit = _CAA_IMAGE_TYPE_DEFAULT_EXCLUDE super().restore_defaults() def load(self): self.ui.cb_image_size.clear() for item_id, item in _CAA_THUMBNAIL_SIZE_MAP.items(): self.ui.cb_image_size.addItem(_(item.label), userData=item_id) size = config.setting["caa_image_size"] index = self.ui.cb_image_size.findData(size) if index < 0: index = self.ui.cb_image_size.findData(_CAA_IMAGE_SIZE_DEFAULT) self.ui.cb_image_size.setCurrentIndex(index) self.ui.cb_save_single_front_image.setChecked(config.setting["caa_save_single_front_image"]) self.ui.cb_approved_only.setChecked(config.setting["caa_approved_only"]) self.ui.cb_type_as_filename.setChecked(config.setting["caa_image_type_as_filename"]) self.ui.restrict_images_types.setChecked( config.setting["caa_restrict_image_types"]) self.caa_image_types = config.setting["caa_image_types"] self.caa_image_types_to_omit = config.setting["caa_image_types_to_omit"] self.update_caa_types() def save(self): size = self.ui.cb_image_size.currentData() config.setting["caa_image_size"] = size config.setting["caa_save_single_front_image"] = \ self.ui.cb_save_single_front_image.isChecked() config.setting["caa_approved_only"] = \ self.ui.cb_approved_only.isChecked() config.setting["caa_image_type_as_filename"] = \ self.ui.cb_type_as_filename.isChecked() config.setting["caa_restrict_image_types"] = \ self.ui.restrict_images_types.isChecked() config.setting["caa_image_types"] = self.caa_image_types config.setting["caa_image_types_to_omit"] = self.caa_image_types_to_omit def update_caa_types(self): enabled = self.ui.restrict_images_types.isChecked() self.ui.select_caa_types.setEnabled(enabled) def select_caa_types(self): (types, types_to_omit, ok) = CAATypesSelectorDialog.run( self, self.caa_image_types, self.caa_image_types_to_omit) if ok: self.caa_image_types = types self.caa_image_types_to_omit = types_to_omit class CoverArtProviderCaa(CoverArtProvider): """Get cover art from Cover Art Archive using release mbid""" NAME = "Cover Art Archive" TITLE = N_('Cover Art Archive') OPTIONS = ProviderOptionsCaa ignore_json_not_found_error = False coverartimage_class = CaaCoverArtImage coverartimage_thumbnail_class = CaaThumbnailCoverArtImage def __init__(self, coverart): super().__init__(coverart) self.caa_types = list(map(str.lower, config.setting["caa_image_types"])) self.caa_types_to_omit = list(map(str.lower, config.setting["caa_image_types_to_omit"])) self.len_caa_types = len(self.caa_types) self.restrict_types = config.setting["caa_restrict_image_types"] @property def _has_suitable_artwork(self): # MB web service indicates if CAA has artwork # https://tickets.metabrainz.org/browse/MBS-4536 if 'cover-art-archive' not in self.release: log.debug('No Cover Art Archive information for {release_id}'.format(release_id=self.release['id'])) return False caa_node = self.release['cover-art-archive'] caa_has_suitable_artwork = caa_node['artwork'] if not caa_has_suitable_artwork: log.debug('There are no images in the Cover Art Archive for {release_id}'.format(release_id=self.release['id'])) return False if self.restrict_types: want_front = 'front' in self.caa_types want_back = 'back' in self.caa_types caa_has_front = caa_node['front'] caa_has_back = caa_node['back'] if self.len_caa_types == 2 and (want_front or want_back): # The OR cases are there to still download and process the CAA # JSON file if front or back is enabled but not in the CAA and # another type (that's neither front nor back) is enabled. # For example, if both front and booklet are enabled and the # CAA only has booklet images, the front element in the XML # from the webservice will be false (thus front_in_caa is False # as well) but it's still necessary to download the booklet # images by using the fact that back is enabled but there are # no back images in the CAA. front_in_caa = caa_has_front or not want_front back_in_caa = caa_has_back or not want_back caa_has_suitable_artwork = front_in_caa or back_in_caa elif self.len_caa_types == 1 and (want_front or want_back): front_in_caa = caa_has_front and want_front back_in_caa = caa_has_back and want_back caa_has_suitable_artwork = front_in_caa or back_in_caa if not caa_has_suitable_artwork: log.debug('There are no suitable images in the Cover Art Archive for {release_id}'.format(release_id=self.release['id'])) else: log.debug('There are suitable images in the Cover Art Archive for {release_id}'.format(release_id=self.release['id'])) return caa_has_suitable_artwork def enabled(self): """Check if CAA artwork has to be downloaded""" if not super().enabled(): return False if self.restrict_types and not self.len_caa_types: log.debug('User disabled all Cover Art Archive types') return False return self._has_suitable_artwork @property def _caa_path(self): return "/release/%s/" % self.metadata["musicbrainz_albumid"] def queue_images(self): self.album.tagger.webservice.get( CAA_HOST, CAA_PORT, self._caa_path, self._caa_json_downloaded, priority=True, important=False, cacheloadcontrol=QNetworkRequest.PreferNetwork ) self.album._requests += 1 # we will call next_in_queue() after json parsing return CoverArtProvider.WAIT def _caa_json_downloaded(self, data, http, error): """Parse CAA JSON file and queue CAA cover art images for download""" self.album._requests -= 1 if error: if not (error == QNetworkReply.ContentNotFoundError and self.ignore_json_not_found_error): self.error('CAA JSON error: %s' % (http.errorString())) else: if self.restrict_types: log.debug('CAA types: included: %s, excluded: %s' % (self.caa_types, self.caa_types_to_omit,)) try: for image in data["images"]: if config.setting["caa_approved_only"] and not image["approved"]: continue is_pdf = image["image"].endswith('.pdf') if is_pdf and not config.setting["save_images_to_files"]: log.debug("Skipping pdf cover art : %s" % image["image"]) continue # if image has no type set, we still want it to match # pseudo type 'unknown' if not image["types"]: image["types"] = ["unknown"] else: image["types"] = list(map(str.lower, image["types"])) if self.restrict_types: # only keep enabled caa types types = set(image["types"]).intersection( set(self.caa_types)) if types and self.caa_types_to_omit: types = not set(image["types"]).intersection( set(self.caa_types_to_omit)) log.debug('CAA image {status}: {image_name} {image_types}'.format( status=('accepted' if types else 'rejected'), image_name=image['image'], image_types=image['types'],) ) else: types = True if types: urls = caa_url_fallback_list(config.setting["caa_image_size"], image["thumbnails"]) if not urls or is_pdf: url = image["image"] else: # FIXME: try other urls in case of 404 url = urls[0] coverartimage = self.coverartimage_class( url, types=image["types"], is_front=image['front'], comment=image["comment"], ) if urls and is_pdf: # thumbnail will be used to "display" PDF in info # dialog thumbnail = self.coverartimage_thumbnail_class( url=url[0], types=image["types"], is_front=image['front'], comment=image["comment"], ) self.queue_put(thumbnail) coverartimage.thumbnail = thumbnail # PDFs cannot be saved to tags (as 2014/05/29) coverartimage.can_be_saved_to_tags = False self.queue_put(coverartimage) if config.setting["caa_save_single_front_image"] and \ config.setting["save_images_to_files"] and \ image["front"]: break except (AttributeError, KeyError, TypeError) as e: self.error('CAA JSON error: %s' % e) self.next_in_queue() picard-release-2.3.1/picard/coverart/providers/caa_release_group.py000066400000000000000000000033411362601763300255230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2014-2016, 2018-2019 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.coverart.image import ( CaaCoverArtImage, CaaThumbnailCoverArtImage, ) from picard.coverart.providers.caa import CoverArtProviderCaa class CaaCoverArtImageRg(CaaCoverArtImage): pass class CaaThumbnailCoverArtImageRg(CaaThumbnailCoverArtImage): pass class CoverArtProviderCaaReleaseGroup(CoverArtProviderCaa): """Use cover art from album release group""" NAME = "CaaReleaseGroup" TITLE = N_("CAA Release Group") # FIXME: caa release group uses the same options than caa OPTIONS = None ignore_json_not_found_error = True coverartimage_class = CaaCoverArtImageRg coverartimage_thumbnail_class = CaaThumbnailCoverArtImageRg def enabled(self): return not self.coverart.front_image_found @property def _caa_path(self): return "/release-group/%s/" % self.metadata["musicbrainz_releasegroupid"] picard-release-2.3.1/picard/coverart/providers/local.py000066400000000000000000000073441362601763300231640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Ville Skyttä # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import re from picard import config from picard.coverart.image import LocalFileCoverArtImage from picard.coverart.providers import ( CoverArtProvider, ProviderOptions, ) from picard.coverart.utils import CAA_TYPES from picard.ui.ui_provider_options_local import Ui_LocalOptions class ProviderOptionsLocal(ProviderOptions): """ Options for Local Files cover art provider """ _DEFAULT_LOCAL_COVER_ART_REGEX = r'^(?:cover|folder|albumart)(.*)\.(?:jpe?g|png|gif|tiff?)$' options = [ config.TextOption("setting", "local_cover_regex", _DEFAULT_LOCAL_COVER_ART_REGEX), ] _options_ui = Ui_LocalOptions def __init__(self, parent=None): super().__init__(parent) self.init_regex_checker(self.ui.local_cover_regex_edit, self.ui.local_cover_regex_error) self.ui.local_cover_regex_default.clicked.connect(self.set_local_cover_regex_default) def set_local_cover_regex_default(self): self.ui.local_cover_regex_edit.setText(self._DEFAULT_LOCAL_COVER_ART_REGEX) def load(self): self.ui.local_cover_regex_edit.setText(config.setting["local_cover_regex"]) def save(self): config.setting["local_cover_regex"] = self.ui.local_cover_regex_edit.text() class CoverArtProviderLocal(CoverArtProvider): """Get cover art from local files""" NAME = "Local Files" TITLE = N_("Local Files") OPTIONS = ProviderOptionsLocal _types_split_re = re.compile('[^a-z0-9]', re.IGNORECASE) _known_types = set([t['name'] for t in CAA_TYPES]) def queue_images(self): _match_re = re.compile(config.setting['local_cover_regex'], re.IGNORECASE) dirs_done = set() for file in self.album.iterfiles(): current_dir = os.path.dirname(file.filename) if current_dir in dirs_done: continue dirs_done.add(current_dir) for root, dirs, files in os.walk(current_dir): for filename in files: m = _match_re.search(filename) if not m: continue filepath = os.path.join(current_dir, root, filename) if os.path.exists(filepath): types = self.get_types(m.group(1)) or ['front'] self.queue_put( LocalFileCoverArtImage(filepath, types=types, support_types=True, support_multi_types=True)) return CoverArtProvider.FINISHED def get_types(self, string): found = set([x.lower() for x in self._types_split_re.split(string) if x]) return list(found.intersection(self._known_types)) picard-release-2.3.1/picard/coverart/providers/whitelist.py000066400000000000000000000033331362601763300241000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Oliver Charles # Copyright (C) 2007, 2010-2011 Lukáš Lalinský # Copyright (C) 2007-2011 Philipp Wolfer # Copyright (C) 2011 Michael Wiencek # Copyright (C) 2011-2012 Wieland Hoffmann # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import log from picard.coverart.image import CoverArtImage from picard.coverart.providers import CoverArtProvider class CoverArtProviderWhitelist(CoverArtProvider): """Use cover art link and has_cover_art_at MusicBrainz relationships to get cover art""" NAME = "Whitelist" TITLE = N_('Whitelist') def queue_images(self): self.match_url_relations(('cover art link', 'has_cover_art_at'), self._queue_from_whitelist) return CoverArtProvider.FINISHED def _queue_from_whitelist(self, url): log.debug("Found cover art link in whitelist") self.queue_put(CoverArtImage(url)) picard-release-2.3.1/picard/coverart/utils.py000066400000000000000000000032671362601763300212150ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013-2015 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Wieland Hoffmann # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.const import MB_ATTRIBUTES from picard.i18n import gettext_attr # list of types from http://musicbrainz.org/doc/Cover_Art/Types # order of declaration is preserved in selection box CAA_TYPES = [] for k, v in sorted(MB_ATTRIBUTES.items(), key=lambda k_v: k_v[0]): if k.startswith('DB:cover_art_archive.art_type/name:'): CAA_TYPES.append({'name': v.lower(), 'title': v}) # pseudo type, used for the no type case CAA_TYPES.append({'name': "unknown", 'title': N_("Unknown")}) CAA_TYPES_TR = {} for t in CAA_TYPES: CAA_TYPES_TR[t['name']] = t['title'] def translate_caa_type(name): if name == 'unknown': return _(CAA_TYPES_TR[name]) else: title = CAA_TYPES_TR.get(name, name) return gettext_attr(title, "cover_art_type") picard-release-2.3.1/picard/dataobj.py000066400000000000000000000040061362601763300176240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2011-2012 Michael Wiencek # Copyright (C) 2013 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2017 Sophist-UK # Copyright (C) 2018 Philipp Wolfer # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.util import LockableObject class DataObject(LockableObject): def __init__(self, obj_id): super().__init__() self.id = obj_id self.genres = {} self.item = None def add_genre(self, name, count): self.genres[name] = self.genres.get(name, 0) + count @staticmethod def set_genre_inc_params(inc): require_authentication = False if config.setting['use_genres']: use_folksonomy = config.setting['folksonomy_tags'] if config.setting['only_my_genres']: require_authentication = True inc += ['user-tags'] if use_folksonomy else ['user-genres'] else: inc += ['tags'] if use_folksonomy else ['genres'] return require_authentication @staticmethod def merge_genres(this, that): for name, count in that.items(): this[name] = this.get(name, 0) + count picard-release-2.3.1/picard/disc.py000066400000000000000000000060661362601763300171520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Matthias Friedrich # Copyright (C) 2007-2008 Lukáš Lalinský # Copyright (C) 2008 Robert Kaye # Copyright (C) 2009, 2013, 2018-2019 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013 Johannes Dewender # Copyright (C) 2013 Sebastian Ramacher # Copyright (C) 2013 Wieland Hoffmann # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import traceback from PyQt5 import QtCore from picard import log from picard.ui.cdlookup import CDLookupDialog try: # use python-libdiscid (http://pythonhosted.org/python-libdiscid/) from libdiscid.compat import discid except ImportError: try: # use python-discid (http://python-discid.readthedocs.org/en/latest/) import discid except (ImportError, OSError): discid = None class Disc(QtCore.QObject): def __init__(self): super().__init__() self.id = None self.mcn = None self.submission_url = None def read(self, device=None): if device is None: device = discid.get_default_device() log.debug("Reading CD using device: %r", device) try: disc = discid.read(device, features=['mcn']) self.id = disc.id self.mcn = disc.mcn self.submission_url = disc.submission_url log.debug("Read disc ID %s with MCN %s", self.id, self.mcn) except discid.disc.DiscError as e: log.error("Error while reading %r: %s" % (device, str(e))) raise def lookup(self): self.tagger.mb_api.lookup_discid(self.id, self._lookup_finished) def _lookup_finished(self, document, http, error): self.tagger.restore_cursor() releases = [] if error: log.error("%r", http.errorString()) else: try: releases = document['releases'] except (AttributeError, IndexError): log.error(traceback.format_exc()) dialog = CDLookupDialog(releases, self, parent=self.tagger.window) dialog.exec_() if discid is not None: discid_version = "discid %s, %s" % (discid.__version__, discid.LIBDISCID_VERSION_STRING) else: discid_version = None picard-release-2.3.1/picard/file.py000066400000000000000000001016761362601763300171520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2009, 2011-2013, 2017 Lukáš Lalinský # Copyright (C) 2007-2011, 2015, 2018-2020 Philipp Wolfer # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2008-2009 Nikolai Prokoschenko # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009 David Hilton # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2012 Erik Wasser # Copyright (C) 2012 Johannes Weißl # Copyright (C) 2012 noobie # Copyright (C) 2012-2014 Wieland Hoffmann # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013-2014 Ionuț Ciocîrlan # Copyright (C) 2013-2014, 2017 Sophist-UK # Copyright (C) 2013-2014, 2017-2019 Laurent Monin # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 Ville Skyttä # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017-2018 Antonio Larrosa # Copyright (C) 2019 Joel Lintunen # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict import fnmatch from functools import partial import os import os.path import re import shutil import unicodedata from PyQt5 import QtCore from picard import ( PICARD_APP_NAME, config, log, ) from picard.const import QUERY_LIMIT from picard.const.sys import ( IS_MACOS, IS_WIN, ) from picard.metadata import ( Metadata, SimMatchTrack, ) from picard.plugin import ( PluginFunctions, PluginPriority, ) from picard.util import ( decode_filename, emptydir, find_best_match, format_time, pathcmp, thread, tracknum_from_filename, ) from picard.util.filenaming import make_short_filename from picard.util.preservedtags import PreservedTags from picard.util.scripttofilename import script_to_filename_with_metadata from picard.util.tags import PRESERVED_TAGS from picard.ui.item import Item class File(QtCore.QObject, Item): metadata_images_changed = QtCore.pyqtSignal() NAME = None UNDEFINED = -1 PENDING = 0 NORMAL = 1 CHANGED = 2 ERROR = 3 REMOVED = 4 LOOKUP_METADATA = 1 LOOKUP_ACOUSTID = 2 comparison_weights = { "title": 13, "artist": 4, "album": 5, "length": 10, "totaltracks": 4, "releasetype": 14, "releasecountry": 2, "format": 2, "isvideo": 2, } class PreserveTimesStatError(Exception): pass class PreserveTimesUtimeError(Exception): pass # in order to significantly speed up performance, the number of pending # files is cached, set @state.setter num_pending_files = 0 def __init__(self, filename): super().__init__() self.filename = filename self.base_filename = os.path.basename(filename) self._state = File.UNDEFINED self.state = File.PENDING self.error = None self.orig_metadata = Metadata() self.metadata = Metadata() self.similarity = 1.0 self.parent = None self.lookup_task = None self.item = None self.acoustid_fingerprint = None self.acoustid_length = 0 def __repr__(self): return '<%s %r>' % (type(self).__name__, self.base_filename) @property def new_metadata(self): return self.metadata def load(self, callback): thread.run_task( partial(self._load_check, self.filename), partial(self._loading_finished, callback), priority=1) def _load_check(self, filename): # Check that file has not been removed since thread was queued # Don't load if we are stopping. if self.state != File.PENDING: log.debug("File not loaded because it was removed: %r", self.filename) return None if self.tagger.stopping: log.debug("File not loaded because %s is stopping: %r", PICARD_APP_NAME, self.filename) return None return self._load(filename) def _load(self, filename): """Load metadata from the file.""" raise NotImplementedError def _loading_finished(self, callback, result=None, error=None): if self.state != File.PENDING or self.tagger.stopping: return if error is not None: self.error = str(error) self.state = self.ERROR from picard.formats import supported_extensions file_name, file_extension = os.path.splitext(self.base_filename) if file_extension not in supported_extensions(): self.remove() log.error('Unsupported media file %r wrongly loaded. Removing ...', self) return else: self.error = None self.state = self.NORMAL self._copy_loaded_metadata(result) # use cached fingerprint from file metadata if not config.setting["ignore_existing_acoustid_fingerprints"]: fingerprints = self.metadata.getall('acoustid_fingerprint') if fingerprints: self.set_acoustid_fingerprint(fingerprints[0]) run_file_post_load_processors(self) self.update() callback(self) def _copy_loaded_metadata(self, metadata): filename, _ = os.path.splitext(self.base_filename) metadata['~length'] = format_time(metadata.length) if 'tracknumber' not in metadata: tracknumber = tracknum_from_filename(self.base_filename) if tracknumber != -1: tracknumber = str(tracknumber) metadata['tracknumber'] = tracknumber if 'title' not in metadata: stripped_filename = filename.lstrip('0') tnlen = len(tracknumber) if stripped_filename[:tnlen] == tracknumber: metadata['title'] = stripped_filename[tnlen:].lstrip() if 'title' not in metadata: metadata['title'] = filename self.orig_metadata = metadata self.metadata.copy(metadata) def copy_metadata(self, metadata, preserve_deleted=True): acoustid = self.metadata["acoustid_id"] saved_metadata = {} preserved_tags = PreservedTags() for tag, values in self.orig_metadata.rawitems(): if tag in preserved_tags or tag in PRESERVED_TAGS: saved_metadata[tag] = values deleted_tags = self.metadata.deleted_tags self.metadata.copy(metadata) if preserve_deleted: for tag in deleted_tags: del self.metadata[tag] for tag, values in saved_metadata.items(): self.metadata[tag] = values if acoustid and "acoustid_id" not in metadata.deleted_tags: self.metadata["acoustid_id"] = acoustid self.metadata_images_changed.emit() def keep_original_images(self): self.metadata.images = self.orig_metadata.images.copy() self.update() self.metadata_images_changed.emit() def has_error(self): return self.state == File.ERROR def save(self): self.set_pending() metadata = Metadata() metadata.copy(self.metadata) thread.run_task( partial(self._save_and_rename, self.filename, metadata), self._saving_finished, priority=2, thread_pool=self.tagger.save_thread_pool) def _preserve_times(self, filename, func): """Save filename times before calling func, and set them again""" try: # https://docs.python.org/3/library/os.html#os.utime # Since Python 3.3, ns parameter is available # The best way to preserve exact times is to use the st_atime_ns and st_mtime_ns # fields from the os.stat() result object with the ns parameter to utime. st = os.stat(filename) except OSError as why: errmsg = "Couldn't read timestamps from %r: %s" % (filename, why) raise self.PreserveTimesStatError(errmsg) from None # if we can't read original times, don't call func and let caller handle this func() try: os.utime(filename, ns=(st.st_atime_ns, st.st_mtime_ns)) except OSError as why: errmsg = "Couldn't preserve timestamps for %r: %s" % (filename, why) raise self.PreserveTimesUtimeError(errmsg) from None return (st.st_atime_ns, st.st_mtime_ns) def _save_and_rename(self, old_filename, metadata): """Save the metadata.""" # Check that file has not been removed since thread was queued # Also don't save if we are stopping. if self.state == File.REMOVED: log.debug("File not saved because it was removed: %r", self.filename) return None if self.tagger.stopping: log.debug("File not saved because %s is stopping: %r", PICARD_APP_NAME, self.filename) return None new_filename = old_filename if not config.setting["dont_write_tags"]: save = partial(self._save, old_filename, metadata) if config.setting["preserve_timestamps"]: try: self._preserve_times(old_filename, save) except self.PreserveTimesUtimeError as why: log.warning(why) else: save() # Rename files if config.setting["rename_files"] or config.setting["move_files"]: new_filename = self._rename(old_filename, metadata) # Move extra files (images, playlists, etc.) if config.setting["move_files"] and config.setting["move_additional_files"]: self._move_additional_files(old_filename, new_filename) # Delete empty directories if config.setting["delete_empty_dirs"]: dirname = os.path.dirname(old_filename) try: emptydir.rm_empty_dir(dirname) head, tail = os.path.split(dirname) if not tail: head, tail = os.path.split(head) while head and tail: emptydir.rm_empty_dir(head) head, tail = os.path.split(head) except OSError as why: log.warning("Error removing directory: %s", why) except emptydir.SkipRemoveDir as why: log.debug("Not removing empty directory: %s", why) # Save cover art images if config.setting["save_images_to_files"]: self._save_images(os.path.dirname(new_filename), metadata) return new_filename def _saving_finished(self, result=None, error=None): # Handle file removed before save # Result is None if save was skipped if ((self.state == File.REMOVED or self.tagger.stopping) and result is None): return old_filename = new_filename = self.filename if error is not None: self.error = str(error) self.state = File.ERROR else: self.filename = new_filename = result self.base_filename = os.path.basename(new_filename) length = self.orig_metadata.length temp_info = {} for info in ('~bitrate', '~sample_rate', '~channels', '~bits_per_sample', '~format'): temp_info[info] = self.orig_metadata[info] # Data is copied from New to Original because New may be # a subclass to handle id3v23 if config.setting["clear_existing_tags"]: self.orig_metadata.copy(self.new_metadata) else: self.orig_metadata.update(self.new_metadata) # After saving deleted tags should no longer be marked deleted self.new_metadata.clear_deleted() self.orig_metadata.clear_deleted() self.orig_metadata.length = length self.orig_metadata['~length'] = format_time(length) for k, v in temp_info.items(): self.orig_metadata[k] = v self.error = None self.clear_pending() self._add_path_to_metadata(self.orig_metadata) self.metadata_images_changed.emit() # run post save hook run_file_post_save_processors(self) # Force update to ensure file status icon changes immediately after save self.update() if self.state != File.REMOVED: del self.tagger.files[old_filename] self.tagger.files[new_filename] = self if self.tagger.stopping: log.debug("Save of %r completed before stopping Picard", self.filename) def _save(self, filename, metadata): """Save the metadata.""" raise NotImplementedError def _script_to_filename(self, naming_format, file_metadata, file_extension, settings=None): if settings is None: settings = config.setting metadata = Metadata() if settings["clear_existing_tags"]: metadata.copy(file_metadata) else: metadata.copy(self.orig_metadata) metadata.update(file_metadata) (filename, new_metadata) = script_to_filename_with_metadata( naming_format, metadata, file=self, settings=settings) # NOTE: the script_to_filename strips the extension away ext = new_metadata.get('~extension', file_extension) return filename + '.' + ext.lstrip('.') def _fixed_splitext(self, filename): # In case the filename is blank and only has the extension # the real extension is in new_filename and ext is blank new_filename, ext = os.path.splitext(filename) if ext == '' and new_filename.lower() in self.EXTENSIONS: ext = new_filename new_filename = '' return new_filename, ext def _format_filename(self, new_dirname, new_filename, metadata, settings): old_filename = new_filename new_filename, ext = self._fixed_splitext(new_filename) ext = ext.lower() new_filename = new_filename + ext # expand the naming format naming_format = settings['file_naming_format'] if naming_format: new_filename = self._script_to_filename(naming_format, metadata, ext, settings) if not settings['rename_files']: new_filename = os.path.join(os.path.dirname(new_filename), old_filename) if not settings['move_files']: new_filename = os.path.basename(new_filename) win_compat = IS_WIN or settings['windows_compatibility'] new_filename = make_short_filename(new_dirname, new_filename, win_compat) # TODO: move following logic under util.filenaming # (and reconsider its necessity) # win32 compatibility fixes if win_compat: new_filename = new_filename.replace('./', '_/').replace('.\\', '_\\') # replace . at the beginning of file and directory names new_filename = new_filename.replace('/.', '/_').replace('\\.', '\\_') if new_filename.startswith('.'): new_filename = '_' + new_filename[1:] # Fix for precomposed characters on OSX if IS_MACOS: new_filename = unicodedata.normalize("NFD", new_filename) return new_filename def make_filename(self, filename, metadata, settings=None): """Constructs file name based on metadata and file naming formats.""" if settings is None: settings = config.setting if settings["move_files"]: new_dirname = settings["move_files_to"] if not os.path.isabs(new_dirname): new_dirname = os.path.normpath(os.path.join(os.path.dirname(filename), new_dirname)) else: new_dirname = os.path.dirname(filename) new_filename = os.path.basename(filename) if settings["rename_files"] or settings["move_files"]: new_filename = self._format_filename(new_dirname, new_filename, metadata, settings) new_path = os.path.join(new_dirname, new_filename) try: return os.path.realpath(new_path) except FileNotFoundError: # os.path.realpath can fail if cwd doesn't exist return new_path def _rename(self, old_filename, metadata): new_filename, ext = os.path.splitext( self.make_filename(old_filename, metadata)) if old_filename == new_filename + ext: return old_filename new_dirname = os.path.dirname(new_filename) if not os.path.isdir(new_dirname): os.makedirs(new_dirname) tmp_filename = new_filename i = 1 while (not pathcmp(old_filename, new_filename + ext) and os.path.exists(new_filename + ext)): new_filename = "%s (%d)" % (tmp_filename, i) i += 1 new_filename = new_filename + ext log.debug("Moving file %r => %r", old_filename, new_filename) shutil.move(old_filename, new_filename) return new_filename def _save_images(self, dirname, metadata): """Save the cover images to disk.""" if not metadata.images: return counters = defaultdict(lambda: 0) images = [] if config.setting["caa_save_single_front_image"]: images = [metadata.images.get_front_image()] if not images: images = metadata.images for image in images: image.save(dirname, metadata, counters) def _move_additional_files(self, old_filename, new_filename): """Move extra files, like images, playlists...""" new_path = os.path.dirname(new_filename) old_path = os.path.dirname(old_filename) if new_path == old_path: # skip, same directory, nothing to move return patterns = config.setting["move_additional_files_pattern"] pattern_regexes = set() for pattern in patterns.split(): pattern = pattern.strip() if not pattern: continue pattern_regex = re.compile(fnmatch.translate(pattern), re.IGNORECASE) match_hidden = pattern.startswith('.') pattern_regexes.add((pattern_regex, match_hidden)) if not pattern_regexes: return moves = set() try: # TODO: use with statement with python 3.6+ for entry in os.scandir(old_path): is_hidden = entry.name.startswith('.') for pattern_regex, match_hidden in pattern_regexes: if is_hidden and not match_hidden: continue if pattern_regex.match(entry.name): new_file_path = os.path.join(new_path, entry.name) moves.add((entry.path, new_file_path)) break # we are done with this file except OSError as why: log.error("Failed to scan %r: %s", old_path, why) return for old_file_path, new_file_path in moves: # FIXME we shouldn't do this from a thread! if self.tagger.files.get(decode_filename(old_file_path)): log.debug("File loaded in the tagger, not moving %r", old_file_path) continue log.debug("Moving %r to %r", old_file_path, new_file_path) try: shutil.move(old_file_path, new_file_path) except OSError as why: log.error("Failed to move %r to %r: %s", old_file_path, new_file_path, why) def remove(self, from_parent=True): if from_parent and self.parent: log.debug("Removing %r from %r", self, self.parent) self.parent.remove_file(self) self.tagger.acoustidmanager.remove(self) self.state = File.REMOVED def move(self, parent): if parent != self.parent: log.debug("Moving %r from %r to %r", self, self.parent, parent) self.clear_lookup_task() self.tagger._acoustid.stop_analyze(self) if self.parent: self.clear_pending() self.parent.remove_file(self) self.parent = parent self.parent.add_file(self) self.acoustid_update() def _move(self, parent): if parent != self.parent: log.debug("Moving %r from %r to %r", self, self.parent, parent) if self.parent: self.parent.remove_file(self) self.parent = parent self.acoustid_update() def set_acoustid_fingerprint(self, fingerprint, length=None): if not fingerprint: self.acoustid_fingerprint = None self.acoustid_length = 0 self.tagger.acoustidmanager.remove(self) elif fingerprint != self.acoustid_fingerprint: self.acoustid_fingerprint = fingerprint self.acoustid_length = length or self.metadata.length // 1000 self.tagger.acoustidmanager.add(self, None) self.acoustid_update() def acoustid_update(self): recording_id = None if self.parent and hasattr(self.parent, 'orig_metadata'): recording_id = self.parent.orig_metadata['musicbrainz_recordingid'] if not recording_id: recording_id = self.metadata['musicbrainz_recordingid'] self.tagger.acoustidmanager.update(self, recording_id) self.update_item() @classmethod def supports_tag(cls, name): """Returns whether tag ``name`` can be saved to the file.""" return True def is_saved(self): return self.similarity == 1.0 and self.state == File.NORMAL def update(self, signal=True): new_metadata = self.new_metadata names = set(new_metadata.keys()) names.update(self.orig_metadata.keys()) clear_existing_tags = config.setting["clear_existing_tags"] ignored_tags = config.setting["compare_ignore_tags"] for name in names: if (not name.startswith('~') and self.supports_tag(name) and name not in ignored_tags): new_values = new_metadata.getall(name) if not (new_values or clear_existing_tags or name in new_metadata.deleted_tags): continue orig_values = self.orig_metadata.getall(name) if orig_values != new_values: self.similarity = self.orig_metadata.compare(new_metadata, ignored_tags) if self.state == File.NORMAL: self.state = File.CHANGED break else: if (self.metadata.images and self.orig_metadata.images != self.metadata.images): self.state = File.CHANGED else: self.similarity = 1.0 if self.state == File.CHANGED: self.state = File.NORMAL if signal: log.debug("Updating file %r", self) self.update_item() def can_save(self): """Return if this object can be saved.""" return True def can_remove(self): """Return if this object can be removed.""" return True def can_edit_tags(self): """Return if this object supports tag editing.""" return True def can_analyze(self): """Return if this object can be fingerprinted.""" return True def can_autotag(self): return True def can_refresh(self): return False def can_view_info(self): return True def _info(self, metadata, file): if hasattr(file.info, 'length'): metadata.length = int(file.info.length * 1000) if hasattr(file.info, 'bitrate') and file.info.bitrate: metadata['~bitrate'] = file.info.bitrate / 1000.0 if hasattr(file.info, 'sample_rate') and file.info.sample_rate: metadata['~sample_rate'] = file.info.sample_rate if hasattr(file.info, 'channels') and file.info.channels: metadata['~channels'] = file.info.channels if hasattr(file.info, 'bits_per_sample') and file.info.bits_per_sample: metadata['~bits_per_sample'] = file.info.bits_per_sample if self.NAME: metadata['~format'] = self.NAME else: metadata['~format'] = self.__class__.__name__.replace('File', '') self._add_path_to_metadata(metadata) def _add_path_to_metadata(self, metadata): metadata['~dirname'] = os.path.dirname(self.filename) filename, extension = os.path.splitext(os.path.basename(self.filename)) metadata['~filename'] = filename metadata['~extension'] = extension.lower()[1:] @property def state(self): """Current state of the File object""" return self._state @state.setter def state(self, state): if state == self._state: return if state == File.PENDING: File.num_pending_files += 1 self.tagger.tagger_stats_changed.emit() elif self._state == File.PENDING: File.num_pending_files -= 1 self.tagger.tagger_stats_changed.emit() self._state = state def column(self, column): m = self.metadata if column == "title" and not m["title"]: return self.base_filename return m[column] def _lookup_finished(self, lookuptype, document, http, error): self.lookup_task = None if self.state == File.REMOVED: return if error: log.error("Network error encountered during the lookup for %s. Error code: %s", self.filename, error) try: tracks = document['recordings'] except (KeyError, TypeError): tracks = None def statusbar(message): self.tagger.window.set_statusbar_message( message, {'filename': self.filename}, timeout=3000 ) if tracks: if lookuptype == File.LOOKUP_ACOUSTID: threshold = 0 else: threshold = config.setting['file_lookup_threshold'] trackmatch = self._match_to_track(tracks, threshold=threshold) if trackmatch is None: statusbar(N_("No matching tracks above the threshold for file '%(filename)s'")) else: statusbar(N_("File '%(filename)s' identified!")) (track_id, release_group_id, release_id, acoustid, node) = trackmatch if lookuptype == File.LOOKUP_ACOUSTID: self.metadata['acoustid_id'] = acoustid self.tagger.acoustidmanager.add(self, track_id) if release_group_id is not None: releasegroup = self.tagger.get_release_group_by_id(release_group_id) releasegroup.loaded_albums.add(release_id) self.tagger.move_file_to_track(self, release_id, track_id) else: self.tagger.move_file_to_nat(self, track_id, node=node) else: statusbar(N_("No matching tracks for file '%(filename)s'")) self.clear_pending() def _match_to_track(self, tracks, threshold=0): # multiple matches -- calculate similarities to each of them def candidates(): for track in tracks: yield self.metadata.compare_to_track(track, self.comparison_weights) no_match = SimMatchTrack(similarity=-1, releasegroup=None, release=None, track=None) best_match = find_best_match(candidates, no_match) if best_match.similarity < threshold: return None else: track_id = best_match.result.track['id'] release_group_id, release_id, node = None, None, None acoustid = best_match.result.track.get('acoustid', None) if best_match.result.release: release_group_id = best_match.result.releasegroup['id'] release_id = best_match.result.release['id'] elif 'title' in best_match.result.track: node = best_match.result.track return (track_id, release_group_id, release_id, acoustid, node) def lookup_metadata(self): """Try to identify the file using the existing metadata.""" if self.lookup_task: return self.tagger.window.set_statusbar_message( N_("Looking up the metadata for file %(filename)s ..."), {'filename': self.filename} ) self.clear_lookup_task() metadata = self.metadata self.set_pending() self.lookup_task = self.tagger.mb_api.find_tracks( partial(self._lookup_finished, File.LOOKUP_METADATA), track=metadata['title'], artist=metadata['artist'], release=metadata['album'], tnum=metadata['tracknumber'], tracks=metadata['totaltracks'], qdur=str(metadata.length // 2000), isrc=metadata['isrc'], limit=QUERY_LIMIT) def clear_lookup_task(self): if self.lookup_task: self.tagger.webservice.remove_task(self.lookup_task) self.lookup_task = None def set_pending(self): if self.state != File.REMOVED: self.state = File.PENDING self.update_item() def clear_pending(self): if self.state == File.PENDING: self.state = File.NORMAL if self.similarity == 1.0 else File.CHANGED self.update_item() def update_item(self): if self.item: self.item.update() def iterfiles(self, save=False): yield self @property def tracknumber(self): """The track number as an int.""" try: return int(self.metadata["tracknumber"]) except BaseException: return 0 @property def discnumber(self): """The disc number as an int.""" try: return int(self.metadata["discnumber"]) except BaseException: return 0 _file_post_load_processors = PluginFunctions(label='file_post_load_processors') _file_post_addition_to_track_processors = PluginFunctions(label='file_post_addition_to_track_processors') _file_post_removal_from_track_processors = PluginFunctions(label='file_post_removal_from_track_processors') _file_post_save_processors = PluginFunctions(label='file_post_save_processors') def register_file_post_load_processor(function, priority=PluginPriority.NORMAL): """Registers a file-loaded processor. Args: function: function to call after file has been loaded, it will be passed the file object priority: optional, PluginPriority.NORMAL by default Returns: None """ _file_post_load_processors.register(function.__module__, function, priority) def register_file_post_addition_to_track_processor(function, priority=PluginPriority.NORMAL): """Registers a file-added-to-track processor. Args: function: function to call after file addition, it will be passed the track and file objects priority: optional, PluginPriority.NORMAL by default Returns: None """ _file_post_addition_to_track_processors.register(function.__module__, function, priority) def register_file_post_removal_from_track_processor(function, priority=PluginPriority.NORMAL): """Registers a file-removed-from-track processor. Args: function: function to call after file removal, it will be passed the track and file objects priority: optional, PluginPriority.NORMAL by default Returns: None """ _file_post_removal_from_track_processors.register(function.__module__, function, priority) def register_file_post_save_processor(function, priority=PluginPriority.NORMAL): """Registers file saved processor. Args: function: function to call after save, it will be passed the file object priority: optional, PluginPriority.NORMAL by default Returns: None """ _file_post_save_processors.register(function.__module__, function, priority) def run_file_post_load_processors(file_object): _file_post_load_processors.run(file_object) def run_file_post_addition_to_track_processors(track_object, file_object): _file_post_addition_to_track_processors.run(track_object, file_object) def run_file_post_removal_from_track_processors(track_object, file_object): _file_post_removal_from_track_processors.run(track_object, file_object) def run_file_post_save_processors(file_object): _file_post_save_processors.run(file_object) picard-release-2.3.1/picard/formats/000077500000000000000000000000001362601763300173215ustar00rootroot00000000000000picard-release-2.3.1/picard/formats/__init__.py000066400000000000000000000113051362601763300214320ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2012 Lukáš Lalinský # Copyright (C) 2008 Will # Copyright (C) 2010, 2014, 2018-2019 Philipp Wolfer # Copyright (C) 2013 Michael Wiencek # Copyright (C) 2013, 2017-2019 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Sophist-UK # Copyright (C) 2017 Ville Skyttä # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import log from picard.plugin import ExtensionPoint _formats = ExtensionPoint(label='formats') _extensions = {} def register_format(file_format): _formats.register(file_format.__module__, file_format) for ext in file_format.EXTENSIONS: _extensions[ext[1:]] = file_format def supported_formats(): """Returns list of supported formats.""" return [(file_format.EXTENSIONS, file_format.NAME) for file_format in _formats] def supported_extensions(): """Returns list of supported extensions.""" return [ext for exts, name in supported_formats() for ext in exts] def ext_to_format(ext): return _extensions.get(ext, None) def guess_format(filename, options=_formats): """Select the best matching file type amongst supported formats.""" results = [] # Since we are reading only 128 bytes and then immediately closing the file, # use unbuffered mode. with open(filename, "rb", 0) as fileobj: header = fileobj.read(128) # Calls the score method of a particular format's associated filetype # and assigns a positive score depending on how closely the fileobj's header matches # the header for a particular file format. results = [(option._File.score(filename, fileobj, header), option.__name__, option) for option in options if getattr(option, "_File", None)] if results: results.sort() if results[-1][0] > 0: # return the format with the highest matching score return results[-1][2](filename) # No positive score i.e. the fileobj's header did not match any supported format return None def open_(filename): """Open the specified file and return a File instance with the appropriate format handler, or None.""" try: # First try to guess the format on the basis of file headers audio_file = guess_format(filename) if not audio_file: i = filename.rfind(".") if i < 0: return None ext = filename[i+1:].lower() # Switch to extension based opening if guess_format fails audio_file = _extensions[ext](filename) return audio_file except KeyError: # None is returned if both the methods fail return None except Exception as error: log.error("Error occurred:\n{}".format(error)) return None from picard.formats.id3 import ( AiffFile, DSFFile, MP3File, TrueAudioFile, ) register_format(AiffFile) register_format(DSFFile) register_format(MP3File) register_format(TrueAudioFile) from picard.formats.apev2 import ( AACFile, MonkeysAudioFile, MusepackFile, OptimFROGFile, TAKFile, WavPackFile, ) register_format(AACFile) register_format(MonkeysAudioFile) register_format(MusepackFile) register_format(OptimFROGFile) register_format(TAKFile) register_format(WavPackFile) from picard.formats.vorbis import ( FLACFile, OggFLACFile, OggSpeexFile, OggTheoraFile, OggVorbisFile, OggAudioFile, OggVideoFile, OggOpusFile, ) register_format(FLACFile) register_format(OggFLACFile) register_format(OggSpeexFile) register_format(OggTheoraFile) register_format(OggVorbisFile) register_format(OggOpusFile) register_format(OggAudioFile) register_format(OggVideoFile) from picard.formats.mp4 import MP4File register_format(MP4File) from picard.formats.asf import ASFFile register_format(ASFFile) from picard.formats.wav import WAVFile register_format(WAVFile) from picard.formats.midi import MIDIFile register_format(MIDIFile) from picard.formats.ac3 import AC3File register_format(AC3File) picard-release-2.3.1/picard/formats/ac3.py000066400000000000000000000037421362601763300203470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import mutagen from picard import ( config, log, ) from picard.formats.apev2 import APEv2File from picard.util import encode_filename from .mutagenext import ac3 class AC3File(APEv2File): EXTENSIONS = [".ac3", ".eac3"] NAME = "AC-3" _File = ac3.AC3APEv2 def _info(self, metadata, file): super()._info(metadata, file) if hasattr(file.info, 'codec') and file.info.codec == 'ec-3': format = 'Enhanced AC-3' else: format = self.NAME if file.tags: metadata['~format'] = "%s (APEv2)" % format else: metadata['~format'] = format def _save(self, filename, metadata): if config.setting['ac3_save_ape']: super()._save(filename, metadata) elif config.setting['remove_ape_from_ac3']: try: mutagen.apev2.delete(encode_filename(filename)) except BaseException: log.exception('Error removing APEv2 tags from %s', filename) @classmethod def supports_tag(cls, name): if config.setting['ac3_save_ape']: return APEv2File.supports_tag(name) else: return False picard-release-2.3.1/picard/formats/apev2.py000066400000000000000000000316121362601763300207130ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2009, 2011 Lukáš Lalinský # Copyright (C) 2009-2011, 2018-2020 Philipp Wolfer # Copyright (C) 2011-2014 Wieland Hoffmann # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Ville Skyttä # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from __future__ import absolute_import from os.path import isfile import re import mutagen.apev2 import mutagen.monkeysaudio import mutagen.musepack import mutagen.optimfrog import mutagen.wavpack from picard import ( config, log, ) from picard.coverart.image import ( CoverArtImageError, TagCoverArtImage, ) from picard.file import File from picard.metadata import Metadata from picard.util import ( encode_filename, sanitize_date, ) from .mutagenext import ( aac, tak, ) INVALID_CHARS = re.compile('[^\x20-\x7e]') BLACKLISTED_KEYS = ['ID3', 'TAG', 'OggS', 'MP+'] UNSUPPORTED_TAGS = [ 'gapless', 'musicip_fingerprint', 'podcast', 'podcasturl', 'show', 'showsort', 'r128_album_gain', 'r128_track_gain', ] def is_valid_key(key): """ Return true if a string is a valid APE tag key. APE tag item keys can have a length of 2 (including) up to 255 (including) characters in the range from 0x20 (Space) until 0x7E (Tilde). Not allowed are the following keys: ID3, TAG, OggS and MP+. See http://wiki.hydrogenaud.io/index.php?title=APE_key """ return (key and 2 <= len(key) <= 255 and key not in BLACKLISTED_KEYS and INVALID_CHARS.search(key) is None) class APEv2File(File): """Generic APEv2-based file.""" _File = None __translate = { "albumartist": "Album Artist", "remixer": "MixArtist", "website": "Weblink", "discsubtitle": "DiscSubtitle", "bpm": "BPM", "isrc": "ISRC", "catalognumber": "CatalogNumber", "barcode": "Barcode", "encodedby": "EncodedBy", "language": "Language", "movementnumber": "MOVEMENT", "movement": "MOVEMENTNAME", "movementtotal": "MOVEMENTTOTAL", "showmovement": "SHOWMOVEMENT", "releasestatus": "MUSICBRAINZ_ALBUMSTATUS", "releasetype": "MUSICBRAINZ_ALBUMTYPE", "musicbrainz_recordingid": "musicbrainz_trackid", "musicbrainz_trackid": "musicbrainz_releasetrackid", "originalartist": "Original Artist", "replaygain_album_gain": "REPLAYGAIN_ALBUM_GAIN", "replaygain_album_peak": "REPLAYGAIN_ALBUM_PEAK", "replaygain_album_range": "REPLAYGAIN_ALBUM_RANGE", "replaygain_track_gain": "REPLAYGAIN_TRACK_GAIN", "replaygain_track_peak": "REPLAYGAIN_TRACK_PEAK", "replaygain_track_range": "REPLAYGAIN_TRACK_RANGE", "replaygain_reference_loudness": "REPLAYGAIN_REFERENCE_LOUDNESS", } __rtranslate = dict([(v.lower(), k) for k, v in __translate.items()]) def __init__(self, filename): super().__init__(filename) self.__casemap = {} def _load(self, filename): log.debug("Loading file %r", filename) self.__casemap = {} file = self._File(encode_filename(filename)) metadata = Metadata() if file.tags: for origname, values in file.tags.items(): name_lower = origname.lower() if (values.kind == mutagen.apev2.BINARY and name_lower.startswith("cover art")): if b'\0' in values.value: descr, data = values.value.split(b'\0', 1) try: coverartimage = TagCoverArtImage( file=filename, tag=name_lower, data=data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.images.append(coverartimage) # skip EXTERNAL and BINARY values if values.kind != mutagen.apev2.TEXT: continue for value in values: name = name_lower if name == "year": name = "date" value = sanitize_date(value) elif name == "track": name = "tracknumber" track = value.split("/") if len(track) > 1: metadata["totaltracks"] = track[1] value = track[0] elif name == "disc": name = "discnumber" disc = value.split("/") if len(disc) > 1: metadata["totaldiscs"] = disc[1] value = disc[0] elif name == 'performer' or name == 'comment': if value.endswith(')'): start = value.rfind(' (') if start > 0: name += ':' + value[start + 2:-1] value = value[:start] elif name in self.__rtranslate: name = self.__rtranslate[name] self.__casemap[name] = origname metadata.add(name, value) self._info(metadata, file) return metadata def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) try: tags = mutagen.apev2.APEv2(encode_filename(filename)) except mutagen.apev2.APENoHeaderError: tags = mutagen.apev2.APEv2() images_to_save = list(metadata.images.to_be_saved_to_tags()) if config.setting["clear_existing_tags"]: tags.clear() elif images_to_save: for name, value in tags.items(): if (value.kind == mutagen.apev2.BINARY and name.lower().startswith('cover art')): del tags[name] temp = {} for name, value in metadata.items(): if name.startswith("~") or not self.supports_tag(name): continue real_name = self._get_tag_name(name) # tracknumber/totaltracks => Track if name == 'tracknumber': if 'totaltracks' in metadata: value = '%s/%s' % (value, metadata['totaltracks']) # discnumber/totaldiscs => Disc elif name == 'discnumber': if 'totaldiscs' in metadata: value = '%s/%s' % (value, metadata['totaldiscs']) elif name in ('totaltracks', 'totaldiscs'): continue # "performer:Piano=Joe Barr" => "Performer=Joe Barr (Piano)" elif name.startswith('performer:') or name.startswith('comment:'): name, desc = name.split(':', 1) if desc: value += ' (%s)' % desc temp.setdefault(real_name, []).append(value) for name, values in temp.items(): tags[name] = values for image in images_to_save: cover_filename = 'Cover Art (Front)' cover_filename += image.extension tags['Cover Art (Front)'] = mutagen.apev2.APEValue( cover_filename.encode('ascii') + b'\0' + image.data, mutagen.apev2.BINARY) break # can't save more than one item with the same name # (mp3tags does this, but it's against the specs) self._remove_deleted_tags(metadata, tags) tags.save(encode_filename(filename)) def _remove_deleted_tags(self, metadata, tags): """Remove the tags from the file that were deleted in the UI""" for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) if (real_name in ('Lyrics', 'Comment', 'Performer') and ':' in tag and not tag.endswith(':')): tag_type = re.compile(r"\(%s\)$" % tag.split(':', 1)[1]) existing_tags = tags.get(real_name) if existing_tags: for item in existing_tags: if tag_type.search(item): tags.get(real_name).remove(item) elif tag in ('totaltracks', 'totaldiscs'): tagstr = real_name.lower() + 'number' if tagstr in metadata: tags[real_name] = metadata[tagstr] else: if real_name in tags: del tags[real_name] def _get_tag_name(self, name): if name in self.__casemap: return self.__casemap[name] elif name.startswith('lyrics:'): return 'Lyrics' elif name == 'date': return 'Year' elif name in ('tracknumber', 'totaltracks'): return 'Track' elif name in ('discnumber', 'totaldiscs'): return 'Disc' elif name.startswith('performer:') or name.startswith('comment:'): return name.split(':', 1)[0].title() elif name in self.__translate: return self.__translate[name] else: return name.title() @classmethod def supports_tag(cls, name): return (bool(name) and name not in UNSUPPORTED_TAGS and (is_valid_key(name) or name.startswith('comment:') or name.startswith('lyrics:') or name.startswith('performer:'))) class MusepackFile(APEv2File): """Musepack file.""" EXTENSIONS = [".mpc", ".mp+"] NAME = "Musepack" _File = mutagen.musepack.Musepack def _info(self, metadata, file): super()._info(metadata, file) metadata['~format'] = "Musepack, SV%d" % file.info.version class WavPackFile(APEv2File): """WavPack file.""" EXTENSIONS = [".wv"] NAME = "WavPack" _File = mutagen.wavpack.WavPack def _save_and_rename(self, old_filename, metadata): """Includes an additional check for WavPack correction files""" wvc_filename = old_filename.replace(".wv", ".wvc") if isfile(wvc_filename): if config.setting["rename_files"] or config.setting["move_files"]: self._rename(wvc_filename, metadata) return File._save_and_rename(self, old_filename, metadata) class OptimFROGFile(APEv2File): """OptimFROG file.""" EXTENSIONS = [".ofr", ".ofs"] NAME = "OptimFROG" _File = mutagen.optimfrog.OptimFROG def _info(self, metadata, file): super()._info(metadata, file) # mutagen.File.filename can be either a bytes or str object filename = file.filename if isinstance(filename, bytes): filename = filename.decode() if filename.lower().endswith(".ofs"): metadata['~format'] = "OptimFROG DualStream Audio" else: metadata['~format'] = "OptimFROG Lossless Audio" class MonkeysAudioFile(APEv2File): """Monkey's Audio file.""" EXTENSIONS = [".ape"] NAME = "Monkey's Audio" _File = mutagen.monkeysaudio.MonkeysAudio class TAKFile(APEv2File): """TAK file.""" EXTENSIONS = [".tak"] NAME = "Tom's lossless Audio Kompressor" _File = tak.TAK class AACFile(APEv2File): EXTENSIONS = [".aac"] NAME = "AAC" _File = aac.AACAPEv2 def _info(self, metadata, file): super()._info(metadata, file) if file.tags: metadata['~format'] = "%s (APEv2)" % self.NAME def _save(self, filename, metadata): if config.setting['aac_save_ape']: super()._save(filename, metadata) elif config.setting['remove_ape_from_aac']: try: mutagen.apev2.delete(encode_filename(filename)) except BaseException: log.exception('Error removing APEv2 tags from %s', filename) @classmethod def supports_tag(cls, name): if config.setting['aac_save_ape']: return APEv2File.supports_tag(name) else: return False picard-release-2.3.1/picard/formats/asf.py000066400000000000000000000272121362601763300204500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2011 Lukáš Lalinský # Copyright (C) 2009-2011, 2014, 2018-2020 Philipp Wolfer # Copyright (C) 2011-2014 Wieland Hoffmann # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013-2014, 2018-2019 Laurent Monin # Copyright (C) 2014-2015, 2017 Sophist-UK # Copyright (C) 2016-2018 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import struct from mutagen.asf import ( ASF, ASFByteArrayAttribute, ) from picard import ( config, log, ) from picard.coverart.image import ( CoverArtImageError, TagCoverArtImage, ) from picard.file import File from picard.formats.id3 import ( image_type_as_id3_num, types_from_id3, ) from picard.formats.mutagenext import delall_ci from picard.metadata import Metadata from picard.util import encode_filename def unpack_image(data): """ Helper function to unpack image data from a WM/Picture tag. The data has the following format: 1 byte: Picture type (0-20), see ID3 APIC frame specification at http://www.id3.org/id3v2.4.0-frames 4 bytes: Picture data length in LE format MIME type, null terminated UTF-16-LE string Description, null terminated UTF-16-LE string The image data in the given length """ try: (type_, size) = struct.unpack_from(" 1: metadata["totaldiscs"] = disc[1] values[0] = disc[0] name_lower = name.lower() if name in self.__RTRANS: name = self.__RTRANS[name] elif name_lower in self.__RTRANS_CI: orig_name = name name = self.__RTRANS_CI[name_lower] self.__casemap[name] = orig_name else: continue values = [str(value) for value in values if value] if values: metadata[name] = values self._info(metadata, file) return metadata def _save(self, filename, metadata): log.debug("Saving file %r", filename) file = ASF(encode_filename(filename)) tags = file.tags if config.setting['clear_existing_tags']: tags.clear() cover = [] for image in metadata.images.to_be_saved_to_tags(): tag_data = pack_image(image.mimetype, image.data, image_type_as_id3_num(image.maintype), image.comment) cover.append(ASFByteArrayAttribute(tag_data)) if cover: tags['WM/Picture'] = cover for name, values in metadata.rawitems(): if name.startswith('lyrics:'): name = 'lyrics' elif name == '~rating': values = [int(values[0]) * 99 // (config.setting['rating_steps'] - 1)] elif name == 'discnumber' and 'totaldiscs' in metadata: values = ['%s/%s' % (metadata['discnumber'], metadata['totaldiscs'])] if name in self.__TRANS: name = self.__TRANS[name] elif name in self.__TRANS_CI: if name in self.__casemap: name = self.__casemap[name] else: name = self.__TRANS_CI[name] delall_ci(tags, name) else: continue tags[name] = values self._remove_deleted_tags(metadata, tags) file.save() def _remove_deleted_tags(self, metadata, tags): """Remove the tags from the file that were deleted in the UI""" for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) if real_name and real_name in tags: del tags[real_name] @classmethod def supports_tag(cls, name): return (name in cls.__TRANS or name in cls.__TRANS_CI or name in ('~rating', '~length', 'totaldiscs') or name.startswith('lyrics:')) def _get_tag_name(self, name): if name.startswith('lyrics:'): name = 'lyrics' if name == 'totaldiscs': return self.__TRANS['discnumber'] elif name in self.__TRANS: return self.__TRANS[name] else: return None def _info(self, metadata, file): super()._info(metadata, file) filename = file.filename if isinstance(filename, bytes): filename = filename.decode() if filename.lower().endswith(".wmv"): metadata['~video'] = '1' picard-release-2.3.1/picard/formats/id3.py000066400000000000000000000723351362601763300203640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2009, 2011-2012 Lukáš Lalinský # Copyright (C) 2008-2011, 2014, 2018-2020 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2011-2012 Johannes Weißl # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2011-2014 Wieland Hoffmann # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013-2014, 2017-2019 Laurent Monin # Copyright (C) 2013-2015, 2017 Sophist-UK # Copyright (C) 2015 Frederik “Freso” S. Olesen # Copyright (C) 2016 Christoph Reiter # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 tungol # Copyright (C) 2019 Zenara Daley # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict import re from urllib.parse import urlparse from mutagen import id3 import mutagen.aiff import mutagen.apev2 import mutagen.dsf import mutagen.mp3 import mutagen.trueaudio from picard import ( config, log, ) from picard.coverart.image import ( CoverArtImageError, TagCoverArtImage, ) from picard.file import File from picard.formats.mutagenext import ( compatid3, delall_ci, ) from picard.metadata import Metadata from picard.util import ( encode_filename, sanitize_date, ) from picard.util.tags import parse_comment_tag id3.GRP1 = compatid3.GRP1 id3.TCMP = compatid3.TCMP id3.TSO2 = compatid3.TSO2 id3.TSOC = compatid3.TSOC __IMAGE_TYPES = [ ("obi", 0), ("tray", 0), ("spine", 0), ("sticker", 0), ("other", 0), ("front", 3), ("back", 4), ("booklet", 5), ("track", 6), ("medium", 6), ] __ID3_IMAGE_TYPE_MAP = dict(__IMAGE_TYPES) __ID3_REVERSE_IMAGE_TYPE_MAP = dict([(v, k) for k, v in __IMAGE_TYPES]) def id3text(text, encoding): """Returns a string which only contains code points which can be encododed with the given numeric id3 encoding. """ if encoding == 0: return text.encode("latin1", "replace").decode("latin1") return text def image_type_from_id3_num(id3type): return __ID3_REVERSE_IMAGE_TYPE_MAP.get(id3type, "other") def image_type_as_id3_num(texttype): return __ID3_IMAGE_TYPE_MAP.get(texttype, 0) def types_from_id3(id3type): return [image_type_from_id3_num(id3type)] class ID3File(File): """Generic ID3-based file.""" _IsMP3 = False __upgrade = { 'XSOP': 'TSOP', 'TXXX:ALBUMARTISTSORT': 'TSO2', 'TXXX:COMPOSERSORT': 'TSOC', 'TXXX:mood': 'TMOO', } __translate = { # In same sequence as defined at http://id3.org/id3v2.4.0-frames # 'TIT1': 'grouping', # Depends on itunes_compatible_grouping 'TIT2': 'title', 'TIT3': 'subtitle', 'TALB': 'album', 'TSST': 'discsubtitle', 'TSRC': 'isrc', 'TPE1': 'artist', 'TPE2': 'albumartist', 'TPE3': 'conductor', 'TPE4': 'remixer', 'TEXT': 'lyricist', 'TCOM': 'composer', 'TENC': 'encodedby', 'TBPM': 'bpm', 'TKEY': 'key', 'TLAN': 'language', 'TCON': 'genre', 'TMED': 'media', 'TMOO': 'mood', 'TCOP': 'copyright', 'TPUB': 'label', 'TDOR': 'originaldate', 'TDRC': 'date', 'TSSE': 'encodersettings', 'TSOA': 'albumsort', 'TSOP': 'artistsort', 'TSOT': 'titlesort', 'WCOP': 'license', 'WOAR': 'website', 'COMM': 'comment', 'TOAL': 'originalalbum', 'TOPE': 'originalartist', 'TOFN': 'originalfilename', # The following are informal iTunes extensions to id3v2: 'TCMP': 'compilation', 'TSOC': 'composersort', 'TSO2': 'albumartistsort', 'MVNM': 'movement' } __rtranslate = dict([(v, k) for k, v in __translate.items()]) __translate['GRP1'] = 'grouping' # Always read, but writing depends on itunes_compatible_grouping __translate_freetext = { 'MusicBrainz Artist Id': 'musicbrainz_artistid', 'MusicBrainz Album Id': 'musicbrainz_albumid', 'MusicBrainz Album Artist Id': 'musicbrainz_albumartistid', 'MusicBrainz Album Type': 'releasetype', 'MusicBrainz Album Status': 'releasestatus', 'MusicBrainz TRM Id': 'musicbrainz_trmid', 'MusicBrainz Release Track Id': 'musicbrainz_trackid', 'MusicBrainz Disc Id': 'musicbrainz_discid', 'MusicBrainz Work Id': 'musicbrainz_workid', 'MusicBrainz Release Group Id': 'musicbrainz_releasegroupid', 'MusicBrainz Original Album Id': 'musicbrainz_originalalbumid', 'MusicBrainz Original Artist Id': 'musicbrainz_originalartistid', 'MusicBrainz Album Release Country': 'releasecountry', 'MusicIP PUID': 'musicip_puid', 'Acoustid Fingerprint': 'acoustid_fingerprint', 'Acoustid Id': 'acoustid_id', 'SCRIPT': 'script', 'LICENSE': 'license', 'CATALOGNUMBER': 'catalognumber', 'BARCODE': 'barcode', 'ASIN': 'asin', 'MusicMagic Fingerprint': 'musicip_fingerprint', 'ARTISTS': 'artists', 'WORK': 'work', 'Writer': 'writer', 'SHOWMOVEMENT': 'showmovement', } __rtranslate_freetext = dict([(v, k) for k, v in __translate_freetext.items()]) __translate_freetext['writer'] = 'writer' # For backward compatibility of case # Freetext fields that are loaded case-insensitive __rtranslate_freetext_ci = { 'replaygain_album_gain': 'REPLAYGAIN_ALBUM_GAIN', 'replaygain_album_peak': 'REPLAYGAIN_ALBUM_PEAK', 'replaygain_album_range': 'REPLAYGAIN_ALBUM_RANGE', 'replaygain_track_gain': 'REPLAYGAIN_TRACK_GAIN', 'replaygain_track_peak': 'REPLAYGAIN_TRACK_PEAK', 'replaygain_track_range': 'REPLAYGAIN_TRACK_RANGE', 'replaygain_reference_loudness': 'REPLAYGAIN_REFERENCE_LOUDNESS', } __translate_freetext_ci = dict([(b.lower(), a) for a, b in __rtranslate_freetext_ci.items()]) # Obsolete tag names which will still be loaded, but will get renamed on saving __rename_freetext = { 'Artists': 'ARTISTS', 'Work': 'WORK', } __rrename_freetext = dict([(v, k) for k, v in __rename_freetext.items()]) _tipl_roles = { 'engineer': 'engineer', 'arranger': 'arranger', 'producer': 'producer', 'DJ-mix': 'djmixer', 'mix': 'mixer', } _rtipl_roles = dict([(v, k) for k, v in _tipl_roles.items()]) __other_supported_tags = ("discnumber", "tracknumber", "totaldiscs", "totaltracks", "movementnumber", "movementtotal") __tag_re_parse = { 'TRCK': re.compile(r'^(?P\d+)(?:/(?P\d+))?$'), 'TPOS': re.compile(r'^(?P\d+)(?:/(?P\d+))?$'), 'MVIN': re.compile(r'^(?P\d+)(?:/(?P\d+))?$') } def __init__(self, filename): super().__init__(filename) self.__casemap = {} def build_TXXX(self, encoding, desc, values): """Construct and return a TXXX frame.""" # This is here so that plugins can customize the behavior of TXXX # frames in particular via subclassing. # discussion: https://github.com/metabrainz/picard/pull/634 # discussion: https://github.com/metabrainz/picard/pull/635 # Used in the plugin "Compatible TXXX frames" # PR: https://github.com/metabrainz/picard-plugins/pull/83 return id3.TXXX(encoding=encoding, desc=desc, text=values) def _load(self, filename): log.debug("Loading file %r", filename) self.__casemap = {} file = self._get_file(encode_filename(filename)) tags = file.tags or {} # upgrade custom 2.3 frames to 2.4 for old, new in self.__upgrade.items(): if old in tags and new not in tags: f = tags.pop(old) tags.add(getattr(id3, new)(encoding=f.encoding, text=f.text)) metadata = Metadata() for frame in tags.values(): frameid = frame.FrameID if frameid in self.__translate: name = self.__translate[frameid] if frameid.startswith('T') or frameid in ["GRP1", "MVNM"]: for text in frame.text: if text: metadata.add(name, text) elif frameid == 'COMM': for text in frame.text: if text: if frame.lang == 'eng': name = '%s:%s' % (name, frame.desc) else: name = '%s:%s:%s' % (name, frame.lang, frame.desc) metadata.add(name, text) else: metadata.add(name, frame) elif frameid == 'TIT1': itunes_compatible = config.setting['itunes_compatible_grouping'] name = 'work' if itunes_compatible else 'grouping' for text in frame.text: if text: metadata.add(name, text) elif frameid == "TMCL": for role, name in frame.people: if role or name: metadata.add('performer:%s' % role, name) elif frameid == "TIPL": # If file is ID3v2.3, TIPL tag could contain TMCL # so we will test for TMCL values and add to TIPL if not TMCL for role, name in frame.people: if role in self._tipl_roles and name: metadata.add(self._tipl_roles[role], name) else: metadata.add('performer:%s' % role, name) elif frameid == 'TXXX': name = frame.desc name_lower = name.lower() if name in self.__rename_freetext: name = self.__rename_freetext[name] if name_lower in self.__translate_freetext_ci: orig_name = name name = self.__translate_freetext_ci[name_lower] self.__casemap[name] = orig_name elif name in self.__translate_freetext: name = self.__translate_freetext[name] elif ((name in self.__rtranslate) != (name in self.__rtranslate_freetext)): # If the desc of a TXXX frame conflicts with the name of a # Picard tag, load it into ~id3:TXXX:desc rather than desc. # # This basically performs an XOR, making sure that 'name' # is in __rtranslate or __rtranslate_freetext, but not # both. (Being in both implies we support reading it both # ways.) Currently, the only tag in both is license. name = '~id3:TXXX:' + name for text in frame.text: metadata.add(name, text) elif frameid == 'USLT': name = 'lyrics' if frame.desc: name += ':%s' % frame.desc metadata.add(name, frame.text) elif frameid == 'UFID' and frame.owner == 'http://musicbrainz.org': metadata['musicbrainz_recordingid'] = frame.data.decode('ascii', 'ignore') elif frameid in self.__tag_re_parse.keys(): m = self.__tag_re_parse[frameid].search(frame.text[0]) if m: for name, value in m.groupdict().items(): if value is not None: metadata[name] = value else: log.error("Invalid %s value '%s' dropped in %r", frameid, frame.text[0], filename) elif frameid == 'APIC': try: coverartimage = TagCoverArtImage( file=filename, tag=frameid, types=types_from_id3(frame.type), comment=frame.desc, support_types=True, data=frame.data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.images.append(coverartimage) elif frameid == 'POPM': # Rating in ID3 ranges from 0 to 255, normalize this to the range 0 to 5 if frame.email == config.setting['rating_user_email']: rating = int(round(frame.rating / 255.0 * (config.setting['rating_steps'] - 1))) metadata.add('~rating', rating) if 'date' in metadata: sanitized = sanitize_date(metadata.getall('date')[0]) if sanitized: metadata['date'] = sanitized self._info(metadata, file) return metadata def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) tags = self._get_tags(filename) if config.setting['clear_existing_tags']: tags.clear() images_to_save = list(metadata.images.to_be_saved_to_tags()) if images_to_save: tags.delall('APIC') encoding = {'utf-8': 3, 'utf-16': 1}.get(config.setting['id3v2_encoding'], 0) if 'tracknumber' in metadata: if 'totaltracks' in metadata: text = '%s/%s' % (metadata['tracknumber'], metadata['totaltracks']) else: text = metadata['tracknumber'] tags.add(id3.TRCK(encoding=0, text=id3text(text, 0))) if 'discnumber' in metadata: if 'totaldiscs' in metadata: text = '%s/%s' % (metadata['discnumber'], metadata['totaldiscs']) else: text = metadata['discnumber'] tags.add(id3.TPOS(encoding=0, text=id3text(text, 0))) if 'movementnumber' in metadata: if 'movementtotal' in metadata: text = '%s/%s' % (metadata['movementnumber'], metadata['movementtotal']) else: text = metadata['movementnumber'] tags.add(id3.MVIN(encoding=0, text=id3text(text, 0))) # This is necessary because mutagens HashKey for APIC frames only # includes the FrameID (APIC) and description - it's basically # impossible to save two images, even of different types, without # any description. counters = defaultdict(lambda: 0) for image in images_to_save: desc = desctag = image.comment if counters[desc] > 0: if desc: desctag = "%s (%i)" % (desc, counters[desc]) else: desctag = "(%i)" % counters[desc] counters[desc] += 1 tags.add(id3.APIC(encoding=0, mime=image.mimetype, type=image_type_as_id3_num(image.maintype), desc=id3text(desctag, 0), data=image.data)) tmcl = mutagen.id3.TMCL(encoding=encoding, people=[]) tipl = mutagen.id3.TIPL(encoding=encoding, people=[]) for name, values in metadata.rawitems(): values = [id3text(v, encoding) for v in values] name = id3text(name, encoding) if not self.supports_tag(name): continue elif name.startswith('performer:'): role = name.split(':', 1)[1] for value in values: if config.setting['write_id3v23']: # TIPL will be upgraded to IPLS tipl.people.append([role, value]) else: tmcl.people.append([role, value]) elif name == 'comment' or name.startswith('comment:'): (lang, desc) = parse_comment_tag(name) if desc.lower()[:4] == 'itun': tags.delall('COMM:' + desc) tags.add(id3.COMM(encoding=0, desc=desc, lang='eng', text=[v + '\x00' for v in values])) else: tags.add(id3.COMM(encoding=encoding, desc=desc, lang=lang, text=values)) elif name.startswith('lyrics:') or name == 'lyrics': if ':' in name: desc = name.split(':', 1)[1] else: desc = '' for value in values: tags.add(id3.USLT(encoding=encoding, desc=desc, text=value)) elif name in self._rtipl_roles: for value in values: tipl.people.append([self._rtipl_roles[name], value]) elif name == 'musicbrainz_recordingid': tags.add(id3.UFID(owner='http://musicbrainz.org', data=bytes(values[0], 'ascii'))) elif name == '~rating': # Search for an existing POPM frame to get the current playcount for frame in tags.values(): if frame.FrameID == 'POPM' and frame.email == config.setting['rating_user_email']: count = getattr(frame, 'count', 0) break else: count = 0 # Convert rating to range between 0 and 255 rating = int(round(float(values[0]) * 255 / (config.setting['rating_steps'] - 1))) tags.add(id3.POPM(email=config.setting['rating_user_email'], rating=rating, count=count)) elif name == 'grouping': if config.setting['itunes_compatible_grouping']: tags.add(id3.GRP1(encoding=encoding, text=values)) else: tags.add(id3.TIT1(encoding=encoding, text=values)) elif name == 'work' and config.setting['itunes_compatible_grouping']: tags.add(id3.TIT1(encoding=encoding, text=values)) tags.delall('TXXX:Work') tags.delall('TXXX:WORK') elif name in self.__rtranslate: frameid = self.__rtranslate[name] if frameid.startswith('W'): valid_urls = all([all(urlparse(v)[:2]) for v in values]) if frameid == 'WCOP': # Only add WCOP if there is only one license URL, otherwise use TXXX:LICENSE if len(values) > 1 or not valid_urls: tags.add(self.build_TXXX(encoding, self.__rtranslate_freetext[name], values)) else: tags.add(id3.WCOP(url=values[0])) elif frameid == 'WOAR' and valid_urls: for url in values: tags.add(id3.WOAR(url=url)) elif frameid.startswith('T') or frameid == 'MVNM': if config.setting['write_id3v23']: if frameid == 'TMOO': tags.add(self.build_TXXX(encoding, 'mood', values)) # No need to care about the TMOO tag being added again as it is # automatically deleted by Mutagen if id2v23 is selected tags.add(getattr(id3, frameid)(encoding=encoding, text=values)) if frameid == 'TSOA': tags.delall('XSOA') elif frameid == 'TSOP': tags.delall('XSOP') elif frameid == 'TSO2': tags.delall('TXXX:ALBUMARTISTSORT') elif name in self.__rtranslate_freetext_ci: if name in self.__casemap: description = self.__casemap[name] else: description = self.__rtranslate_freetext_ci[name] delall_ci(tags, 'TXXX:' + description) tags.add(self.build_TXXX(encoding, description, values)) elif name in self.__rtranslate_freetext: description = self.__rtranslate_freetext[name] if description in self.__rrename_freetext: tags.delall('TXXX:' + self.__rrename_freetext[description]) tags.add(self.build_TXXX(encoding, description, values)) elif name.startswith('~id3:'): name = name[5:] if name.startswith('TXXX:'): tags.add(self.build_TXXX(encoding, name[5:], values)) else: frameclass = getattr(id3, name[:4], None) if frameclass: tags.add(frameclass(encoding=encoding, text=values)) # don't save private / already stored tags elif not name.startswith("~") and name not in self.__other_supported_tags: tags.add(self.build_TXXX(encoding, name, values)) if tmcl.people: tags.add(tmcl) if tipl.people: tags.add(tipl) self._remove_deleted_tags(metadata, tags) self._save_tags(tags, encode_filename(filename)) if self._IsMP3 and config.setting["remove_ape_from_mp3"]: try: mutagen.apev2.delete(encode_filename(filename)) except BaseException: pass def _remove_deleted_tags(self, metadata, tags): """Remove the tags from the file that were deleted in the UI""" for name in metadata.deleted_tags: real_name = self._get_tag_name(name) try: if name.startswith('performer:'): role = name.split(':', 1)[1] for key, frame in tags.items(): if frame.FrameID in ('TMCL', 'TIPL', 'IPLS'): for people in frame.people: if people[0] == role: frame.people.remove(people) elif name.startswith('comment:'): (lang, desc) = parse_comment_tag(name) if desc.lower()[:4] != 'itun': for key, frame in list(tags.items()): if (frame.FrameID == 'COMM' and frame.desc == desc and frame.lang == lang): del tags[key] elif name.startswith('lyrics:') or name == 'lyrics': if ':' in name: desc = name.split(':', 1)[1] else: desc = '' for key, frame in list(tags.items()): if frame.FrameID == 'USLT' and frame.desc == desc: del tags[key] elif name in self._rtipl_roles: role = self._rtipl_roles[name] for key, frame in tags.items(): if frame.FrameID in ('TIPL', 'IPLS'): for people in frame.people: if people[0] == role: frame.people.remove(people) elif name == 'musicbrainz_recordingid': for key, frame in list(tags.items()): if frame.FrameID == 'UFID' and frame.owner == 'http://musicbrainz.org': del tags[key] elif real_name == 'POPM': for key, frame in list(tags.items()): if frame.FrameID == 'POPM' and frame.email == config.setting['rating_user_email']: del tags[key] elif real_name in self.__translate: del tags[real_name] elif real_name in self.__translate_freetext: tags.delall('TXXX:' + real_name) if real_name in self.__rrename_freetext: tags.delall('TXXX:' + self.__rrename_freetext[real_name]) elif not name.startswith("~") and name not in self.__other_supported_tags: tags.delall('TXXX:' + name) elif name.startswith("~"): name = name[1:] tags.delall('TXXX:' + name) elif name in self.__other_supported_tags: del tags[real_name] except KeyError: pass @classmethod def supports_tag(cls, name): unsupported_tags = ['r128_album_gain', 'r128_track_gain'] return ((name and not name.startswith("~") and name not in unsupported_tags) or name in ("~rating", "~length") or name.startswith("~id3")) def _get_tag_name(self, name): if name in self.__rtranslate: return self.__rtranslate[name] elif name in self.__rtranslate_freetext: return self.__rtranslate_freetext[name] elif name == '~rating': return 'POPM' elif name == 'tracknumber': return 'TRCK' elif name == 'discnumber': return 'TPOS' elif name == 'movementnumber': return 'MVIN' else: return None def _get_file(self, filename): raise NotImplementedError() def _get_tags(self, filename): try: return compatid3.CompatID3(encode_filename(filename)) except mutagen.id3.ID3NoHeaderError: return compatid3.CompatID3() def _save_tags(self, tags, filename): if config.setting['write_id3v1']: v1 = 2 else: v1 = 0 if config.setting['write_id3v23']: tags.update_to_v23() separator = config.setting['id3v23_join_with'] tags.save(filename, v2_version=3, v1=v1, v23_sep=separator) else: tags.update_to_v24() tags.save(filename, v2_version=4, v1=v1) @property def new_metadata(self): if not config.setting["write_id3v23"]: return self.metadata copy = Metadata() copy.copy(self.metadata) join_with = config.setting["id3v23_join_with"] copy.multi_valued_joiner = join_with for name, values in copy.rawitems(): # ID3v23 can only save TDOR dates in YYYY format. Mutagen cannot # handle ID3v23 dates which are YYYY-MM rather than YYYY or # YYYY-MM-DD. if name == "originaldate": values = [v[:4] for v in values] elif name == "date": values = [(v[:4] if len(v) < 10 else v) for v in values] # If this is a multi-valued field, then it needs to be flattened, # unless it's TIPL or TMCL which can still be multi-valued. if (len(values) > 1 and name not in ID3File._rtipl_roles and not name.startswith("performer:")): values = [join_with.join(values)] copy[name] = values return copy class MP3File(ID3File): """MP3 file.""" EXTENSIONS = [".mp3", ".mp2", ".m2a"] NAME = "MPEG-1 Audio" _IsMP3 = True _File = mutagen.mp3.MP3 def _get_file(self, filename): return self._File(filename, ID3=compatid3.CompatID3) def _info(self, metadata, file): super()._info(metadata, file) id3version = '' if file.tags is not None and file.info.layer == 3: id3version = ' - ID3v%d.%d' % (file.tags.version[0], file.tags.version[1]) metadata['~format'] = 'MPEG-1 Layer %d%s' % (file.info.layer, id3version) class TrueAudioFile(ID3File): """TTA file.""" EXTENSIONS = [".tta"] NAME = "The True Audio" _File = mutagen.trueaudio.TrueAudio def _get_file(self, filename): return self._File(filename, ID3=compatid3.CompatID3) class DSFFile(ID3File): """DSF file.""" EXTENSIONS = [".dsf", '.dff'] NAME = "DSF" _File = mutagen.dsf.DSF def _get_file(self, filename): return self._File(filename, known_frames=compatid3.known_frames) def _get_tags(self, filename): file = self._get_file(filename) if file.tags is None: file.add_tags() return file.tags def _save_tags(self, tags, filename): if config.setting['write_id3v23']: tags.update_to_v23() separator = config.setting['id3v23_join_with'] tags.save(filename, v2_version=3, v23_sep=separator) else: tags.update_to_v24() tags.save(filename, v2_version=4) @classmethod def supports_tag(cls, name): return (super().supports_tag(name) and name not in {'albumsort', 'artistsort', 'discsubtitle', 'titlesort'}) class AiffFile(DSFFile): """AIFF file.""" EXTENSIONS = [".aiff", ".aif", ".aifc"] NAME = "Audio Interchange File Format (AIFF)" _File = mutagen.aiff.AIFF picard-release-2.3.1/picard/formats/midi.py000066400000000000000000000034611362601763300206210ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from mutagen.smf import SMF from picard import log from picard.file import File from picard.metadata import Metadata from picard.util import encode_filename class MIDIFile(File): EXTENSIONS = [".mid", ".kar"] NAME = "Standard MIDI File" _File = SMF def _load(self, filename): log.debug("Loading file %r", filename) metadata = Metadata() file = self._File(encode_filename(filename)) self._info(metadata, file) return metadata def _save(self, filename, metadata): log.debug("Saving file %r", filename) def _info(self, metadata, file): super()._info(metadata, file) # mutagen.File.filename can be either a bytes or str object filename = file.filename if isinstance(filename, bytes): filename = filename.decode() if filename.lower().endswith(".kar"): metadata['~format'] = "Standard MIDI File (Karaoke File)" @classmethod def supports_tag(cls, name): return False picard-release-2.3.1/picard/formats/mp4.py000066400000000000000000000357311362601763300204040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2009-2011, 2015, 2018-2020 Philipp Wolfer # Copyright (C) 2011 Johannes Weißl # Copyright (C) 2011-2014 Wieland Hoffmann # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013 Frederik “Freso” S. Olesen # Copyright (C) 2013-2014, 2018-2019 Laurent Monin # Copyright (C) 2014-2015 Sophist-UK # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2019 Reinaldo Antonio Camargo Rauch # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from mutagen.mp4 import ( MP4, MP4Cover, ) from picard import ( config, log, ) from picard.coverart.image import ( CoverArtImageError, TagCoverArtImage, ) from picard.file import File from picard.formats.mutagenext import delall_ci from picard.metadata import Metadata from picard.util import encode_filename def _add_text_values_to_metadata(metadata, name, values): for value in values: metadata.add(name, value.decode("utf-8", "replace").strip("\x00")) _VALID_KEY_CHARS = re.compile('^[\x00-\xff]+$') def _is_valid_key(key): """ Return true if a string is a valid name for a custom tag. """ return bool(_VALID_KEY_CHARS.match(key)) class MP4File(File): EXTENSIONS = [".m4a", ".m4b", ".m4p", ".m4v", ".mp4"] NAME = "MPEG-4 Audio" _File = MP4 __text_tags = { "\xa9ART": "artist", "\xa9nam": "title", "\xa9alb": "album", "\xa9wrt": "composer", "aART": "albumartist", "\xa9grp": "grouping", "\xa9day": "date", "\xa9gen": "genre", "\xa9lyr": "lyrics", "\xa9cmt": "comment:", "\xa9too": "encodedby", "cprt": "copyright", "soal": "albumsort", "soaa": "albumartistsort", "soar": "artistsort", "sonm": "titlesort", "soco": "composersort", "sosn": "showsort", "tvsh": "show", "purl": "podcasturl", "\xa9mvn": "movement", "\xa9wrk": "work", } __r_text_tags = dict([(v, k) for k, v in __text_tags.items()]) __bool_tags = { "pcst": "podcast", "cpil": "compilation", "pgap": "gapless", } __r_bool_tags = dict([(v, k) for k, v in __bool_tags.items()]) __int_tags = { "tmpo": "bpm", "\xa9mvi": "movementnumber", "\xa9mvc": "movementtotal", "shwm": "showmovement", } __r_int_tags = dict([(v, k) for k, v in __int_tags.items()]) __freeform_tags = { "----:com.apple.iTunes:MusicBrainz Track Id": "musicbrainz_recordingid", "----:com.apple.iTunes:MusicBrainz Artist Id": "musicbrainz_artistid", "----:com.apple.iTunes:MusicBrainz Album Id": "musicbrainz_albumid", "----:com.apple.iTunes:MusicBrainz Album Artist Id": "musicbrainz_albumartistid", "----:com.apple.iTunes:MusicIP PUID": "musicip_puid", "----:com.apple.iTunes:MusicBrainz Album Status": "releasestatus", "----:com.apple.iTunes:MusicBrainz Album Release Country": "releasecountry", "----:com.apple.iTunes:MusicBrainz Album Type": "releasetype", "----:com.apple.iTunes:MusicBrainz Disc Id": "musicbrainz_discid", "----:com.apple.iTunes:MusicBrainz TRM Id": "musicbrainz_trmid", "----:com.apple.iTunes:MusicBrainz Work Id": "musicbrainz_workid", "----:com.apple.iTunes:MusicBrainz Release Group Id": "musicbrainz_releasegroupid", "----:com.apple.iTunes:MusicBrainz Release Track Id": "musicbrainz_trackid", "----:com.apple.iTunes:MusicBrainz Original Album Id": "musicbrainz_originalalbumid", "----:com.apple.iTunes:MusicBrainz Original Artist Id": "musicbrainz_originalartistid", "----:com.apple.iTunes:Acoustid Fingerprint": "acoustid_fingerprint", "----:com.apple.iTunes:Acoustid Id": "acoustid_id", "----:com.apple.iTunes:ASIN": "asin", "----:com.apple.iTunes:BARCODE": "barcode", "----:com.apple.iTunes:PRODUCER": "producer", "----:com.apple.iTunes:LYRICIST": "lyricist", "----:com.apple.iTunes:CONDUCTOR": "conductor", "----:com.apple.iTunes:ENGINEER": "engineer", "----:com.apple.iTunes:MIXER": "mixer", "----:com.apple.iTunes:DJMIXER": "djmixer", "----:com.apple.iTunes:REMIXER": "remixer", "----:com.apple.iTunes:ISRC": "isrc", "----:com.apple.iTunes:MEDIA": "media", "----:com.apple.iTunes:LABEL": "label", "----:com.apple.iTunes:LICENSE": "license", "----:com.apple.iTunes:CATALOGNUMBER": "catalognumber", "----:com.apple.iTunes:SUBTITLE": "subtitle", "----:com.apple.iTunes:DISCSUBTITLE": "discsubtitle", "----:com.apple.iTunes:MOOD": "mood", "----:com.apple.iTunes:SCRIPT": "script", "----:com.apple.iTunes:LANGUAGE": "language", "----:com.apple.iTunes:ARTISTS": "artists", "----:com.apple.iTunes:WORK": "work", "----:com.apple.iTunes:initialkey": "key", } __r_freeform_tags = dict([(v, k) for k, v in __freeform_tags.items()]) # Tags to load case insensitive. Case is preserved, but the specified case # is written if it is unset. __r_freeform_tags_ci = { "replaygain_album_gain": "----:com.apple.iTunes:REPLAYGAIN_ALBUM_GAIN", "replaygain_album_peak": "----:com.apple.iTunes:REPLAYGAIN_ALBUM_PEAK", "replaygain_album_range": "----:com.apple.iTunes:REPLAYGAIN_ALBUM_RANGE", "replaygain_track_gain": "----:com.apple.iTunes:REPLAYGAIN_TRACK_GAIN", "replaygain_track_peak": "----:com.apple.iTunes:REPLAYGAIN_TRACK_PEAK", "replaygain_track_range": "----:com.apple.iTunes:REPLAYGAIN_TRACK_RANGE", "replaygain_reference_loudness": "----:com.apple.iTunes:REPLAYGAIN_REFERENCE_LOUDNESS", } __freeform_tags_ci = dict([(b.lower(), a) for a, b in __r_freeform_tags_ci.items()]) __other_supported_tags = ("discnumber", "tracknumber", "totaldiscs", "totaltracks") def __init__(self, filename): super().__init__(filename) self.__casemap = {} def _load(self, filename): log.debug("Loading file %r", filename) self.__casemap = {} file = MP4(encode_filename(filename)) tags = file.tags or {} metadata = Metadata() for name, values in tags.items(): name_lower = name.lower() if name in self.__text_tags: for value in values: metadata.add(self.__text_tags[name], value) elif name in self.__bool_tags: metadata.add(self.__bool_tags[name], values and '1' or '0') elif name in self.__int_tags: for value in values: metadata.add(self.__int_tags[name], value) elif name in self.__freeform_tags: tag_name = self.__freeform_tags[name] _add_text_values_to_metadata(metadata, tag_name, values) elif name_lower in self.__freeform_tags_ci: tag_name = self.__freeform_tags_ci[name_lower] self.__casemap[tag_name] = name _add_text_values_to_metadata(metadata, tag_name, values) elif name == "----:com.apple.iTunes:fingerprint": for value in values: value = value.decode("utf-8", "replace").strip("\x00") if value.startswith("MusicMagic Fingerprint"): metadata.add("musicip_fingerprint", value[22:]) elif name == "trkn": try: metadata["tracknumber"] = values[0][0] metadata["totaltracks"] = values[0][1] except IndexError: log.debug('trkn is invalid, ignoring') elif name == "disk": try: metadata["discnumber"] = values[0][0] metadata["totaldiscs"] = values[0][1] except IndexError: log.debug('disk is invalid, ignoring') elif name == "covr": for value in values: if value.imageformat not in (value.FORMAT_JPEG, value.FORMAT_PNG): continue try: coverartimage = TagCoverArtImage( file=filename, tag=name, data=value, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.images.append(coverartimage) # Read other freeform tags always case insensitive elif name.startswith('----:com.apple.iTunes:'): tag_name = name_lower[22:] self.__casemap[tag_name] = name[22:] if (name not in self.__r_text_tags and name not in self.__r_bool_tags and name not in self.__r_int_tags and name not in self.__r_freeform_tags and name_lower not in self.__r_freeform_tags_ci and name not in self.__other_supported_tags): _add_text_values_to_metadata(metadata, tag_name, values) self._info(metadata, file) return metadata def _save(self, filename, metadata): log.debug("Saving file %r", filename) file = MP4(encode_filename(self.filename)) if file.tags is None: file.add_tags() tags = file.tags if config.setting["clear_existing_tags"]: tags.clear() for name, values in metadata.rawitems(): if name.startswith('lyrics:'): name = 'lyrics' if name in self.__r_text_tags: tags[self.__r_text_tags[name]] = values elif name in self.__r_bool_tags: tags[self.__r_bool_tags[name]] = (values[0] == '1') elif name in self.__r_int_tags: try: tags[self.__r_int_tags[name]] = [int(value) for value in values] except ValueError: pass elif name in self.__r_freeform_tags: values = [v.encode("utf-8") for v in values] tags[self.__r_freeform_tags[name]] = values elif name in self.__r_freeform_tags_ci: values = [v.encode("utf-8") for v in values] delall_ci(tags, self.__r_freeform_tags_ci[name]) if name in self.__casemap: name = self.__casemap[name] else: name = self.__r_freeform_tags_ci[name] tags[name] = values elif name == "musicip_fingerprint": tags["----:com.apple.iTunes:fingerprint"] = [b"MusicMagic Fingerprint%s" % v.encode('ascii') for v in values] elif self.supports_tag(name) and name not in ('tracknumber', 'totaltracks', 'discnumber', 'totaldiscs'): values = [v.encode("utf-8") for v in values] name = self.__casemap.get(name, name) tags['----:com.apple.iTunes:' + name] = values if "tracknumber" in metadata: if "totaltracks" in metadata: tags["trkn"] = [(int(metadata["tracknumber"]), int(metadata["totaltracks"]))] else: tags["trkn"] = [(int(metadata["tracknumber"]), 0)] if "discnumber" in metadata: if "totaldiscs" in metadata: tags["disk"] = [(int(metadata["discnumber"]), int(metadata["totaldiscs"]))] else: tags["disk"] = [(int(metadata["discnumber"]), 0)] covr = [] for image in metadata.images.to_be_saved_to_tags(): if image.mimetype == "image/jpeg": covr.append(MP4Cover(image.data, MP4Cover.FORMAT_JPEG)) elif image.mimetype == "image/png": covr.append(MP4Cover(image.data, MP4Cover.FORMAT_PNG)) if covr: tags["covr"] = covr self._remove_deleted_tags(metadata, tags) file.save() def _remove_deleted_tags(self, metadata, tags): """Remove the tags from the file that were deleted in the UI""" for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) if real_name and real_name in tags: if tag not in ("totaltracks", "totaldiscs"): del tags[real_name] @classmethod def supports_tag(cls, name): unsupported_tags = ['r128_album_gain', 'r128_track_gain'] return ((name and not name.startswith("~") and name not in unsupported_tags and not (name.startswith('comment:') and len(name) > 9) and not name.startswith('performer:') and _is_valid_key(name)) or name in ('~length')) def _get_tag_name(self, name): if name.startswith('lyrics:'): name = 'lyrics' if name in self.__r_text_tags: return self.__r_text_tags[name] elif name in self.__r_bool_tags: return self.__r_bool_tags[name] elif name in self.__r_int_tags: return self.__r_int_tags[name] elif name in self.__r_freeform_tags: return self.__r_freeform_tags[name] elif name in self.__r_freeform_tags_ci: return self.__r_freeform_tags_ci[name] elif name == "musicip_fingerprint": return "----:com.apple.iTunes:fingerprint" elif name in ("tracknumber", "totaltracks"): return "trkn" elif name in ("discnumber", "totaldiscs"): return "disk" else: return None def _info(self, metadata, file): super()._info(metadata, file) if hasattr(file.info, 'codec_description') and file.info.codec_description: metadata['~format'] = "%s (%s)" % (metadata['~format'], file.info.codec_description) filename = file.filename if isinstance(filename, bytes): filename = filename.decode() if filename.lower().endswith(".m4v") or (file.tags and 'hdvd' in file.tags): metadata['~video'] = '1' picard-release-2.3.1/picard/formats/mutagenext/000077500000000000000000000000001362601763300215025ustar00rootroot00000000000000picard-release-2.3.1/picard/formats/mutagenext/__init__.py000066400000000000000000000020351362601763300236130ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. def delall_ci(tags, key): """Delete all tags with given key, case-insensitive""" key = key.lower() for k in list(tags.keys()): if k.lower() == key: del tags[k] picard-release-2.3.1/picard/formats/mutagenext/aac.py000066400000000000000000000035401362601763300226020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from mutagen._util import loadfile from mutagen.aac import AAC from mutagen.apev2 import ( APENoHeaderError, APEv2, _APEv2Data, error as APEError, ) class AACAPEv2(AAC): """AAC file with APEv2 tags. """ @loadfile() def load(self, filething): super().load(filething) try: self.tags = APEv2(filething) # Correct the calculated length if not hasattr(self.info, 'bitrate') or self.info.bitrate == 0: return ape_data = _APEv2Data(filething.fileobj) if ape_data.size is not None: # Remove APEv2 data length from calculated track length extra_length = (8.0 * ape_data.size) / self.info.bitrate self.info.length = max(self.info.length - extra_length, 0.001) except APENoHeaderError: self.tags = None def add_tags(self): if self.tags is None: self.tags = APEv2() else: raise APEError("%r already has tags: %r" % (self, self.tags)) picard-release-2.3.1/picard/formats/mutagenext/ac3.py000066400000000000000000000053041362601763300225240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from mutagen._file import FileType from mutagen._util import ( MutagenError, loadfile, ) from mutagen.apev2 import ( APENoHeaderError, APEv2, _APEv2Data, error as APEError, ) try: from mutagen.ac3 import AC3 native_ac3 = True except ImportError: native_ac3 = False class AC3Error(MutagenError): pass class AC3Info(object): """AC3 stream information. Attributes: (none at the moment) """ def __init__(self, fileobj): header = fileobj.read(4) if len(header) != 4 or not header.startswith(b"\x0b\x77"): raise AC3Error("not a AC3 file") @staticmethod def pprint(): return "AC3" class AC3(FileType): @loadfile() def load(self, filething): self.info = AC3Info(filething.fileobj) @staticmethod def score(filename, fileobj, header): return header.startswith(b"\x0b\x77") + (filename.endswith(".ac3") or filename.endswith(".eac3")) class AC3APEv2(AC3): @loadfile() def load(self, filething): super().load(filething) try: self.tags = APEv2(filething.fileobj) # Correct the calculated length if not hasattr(self.info, 'bitrate') or self.info.bitrate == 0: return ape_data = _APEv2Data(filething.fileobj) if ape_data.size is not None: # Remove APEv2 data length from calculated track length extra_length = (8.0 * ape_data.size) / self.info.bitrate self.info.length = max(self.info.length - extra_length, 0.001) except APENoHeaderError: self.tags = None def add_tags(self): if self.tags is None: self.tags = APEv2() else: raise APEError("%r already has tags: %r" % (self, self.tags)) picard-release-2.3.1/picard/formats/mutagenext/compatid3.py000066400000000000000000000045651362601763300237510ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2005 Michael Urman # Copyright (C) 2006-2008, 2011-2012 Lukáš Lalinský # Copyright (C) 2013-2014 Sophist-UK # Copyright (C) 2013-2014, 2018 Laurent Monin # Copyright (C) 2014, 2018-2019 Philipp Wolfer # Copyright (C) 2016 Christoph Reiter # Copyright (C) 2016 Ville Skyttä # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from mutagen.id3 import ( ID3, Frames, Frames_2_2, TextFrame, ) try: from mutagen.id3 import GRP1 except ImportError: class GRP1(TextFrame): pass class TCMP(TextFrame): pass class TSO2(TextFrame): pass class TSOC(TextFrame): pass class XDOR(TextFrame): pass class XSOP(TextFrame): pass known_frames = dict(Frames) known_frames.update(dict(Frames_2_2)) known_frames["GRP1"] = GRP1 known_frames["TCMP"] = TCMP known_frames["TSO2"] = TSO2 known_frames["TSOC"] = TSOC known_frames["XDOR"] = XDOR known_frames["XSOP"] = XSOP class CompatID3(ID3): """ Additional features over mutagen.id3.ID3: * iTunes' TCMP frame * Allow some v2.4 frames also in v2.3 """ PEDANTIC = False def __init__(self, *args, **kwargs): if args: kwargs["known_frames"] = known_frames super().__init__(*args, **kwargs) def update_to_v23(self): # leave TSOP, TSOA and TSOT even though they are officially defined # only in ID3v2.4, because most applications use them also in ID3v2.3 frames = [] for key in ["TSOP", "TSOA", "TSOT", "TSST"]: frames.extend(self.getall(key)) super().update_to_v23() for frame in frames: self.add(frame) picard-release-2.3.1/picard/formats/mutagenext/tak.py000066400000000000000000000045721362601763300226430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2008 Lukáš Lalinský # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """Tom's lossless Audio Kompressor streams with APEv2 tags. TAK is a lossless audio compressor developed by Thomas Becker. For more information, see http://wiki.hydrogenaudio.org/index.php?title=TAK and http://en.wikipedia.org/wiki/TAK_(audio_codec) """ __all__ = ["TAK", "Open", "delete"] try: from mutagen.tak import ( Open, TAK, TAKHeaderError, TAKInfo, delete ) native_tak = True except ImportError: from mutagen import StreamInfo from mutagen.apev2 import ( APEv2File, delete, error, ) native_tak = False class TAKHeaderError(error): pass class TAKInfo(StreamInfo): """TAK stream information. Attributes: (none at the moment) """ def __init__(self, fileobj): header = fileobj.read(4) if len(header) != 4 or not header.startswith(b"tBaK"): raise TAKHeaderError("not a TAK file") @staticmethod def pprint(): return "Tom's lossless Audio Kompressor" class TAK(APEv2File): """TAK(filething) Arguments: filething (filething) Attributes: info (`TAKInfo`) """ _Info = TAKInfo _mimes = ["audio/x-tak"] @staticmethod def score(filename, fileobj, header): return header.startswith(b"tBaK") + filename.lower().endswith(".tak") Open = TAK picard-release-2.3.1/picard/formats/vorbis.py000066400000000000000000000373531362601763300212120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2012 Lukáš Lalinský # Copyright (C) 2008 Hendrik van Antwerpen # Copyright (C) 2008-2010, 2014-2015, 2018-2019 Philipp Wolfer # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2012-2014 Wieland Hoffmann # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013-2014, 2017-2019 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Ville Skyttä # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import base64 import re import mutagen.flac import mutagen.ogg import mutagen.oggflac import mutagen.oggopus import mutagen.oggspeex import mutagen.oggtheora import mutagen.oggvorbis from picard import ( config, log, ) from picard.coverart.image import ( CoverArtImageError, TagCoverArtImage, ) from picard.file import File from picard.formats import guess_format from picard.formats.id3 import ( image_type_as_id3_num, types_from_id3, ) from picard.metadata import Metadata from picard.util import ( encode_filename, sanitize_date, ) FLAC_MAX_BLOCK_SIZE = 2 ** 24 - 1 # FLAC block size is limited to a 24 bit integer INVALID_CHARS = re.compile('([^\x20-\x7d]|=)') def sanitize_key(key): """ Remove characters from key which are invalid for a Vorbis comment field name. See https://www.xiph.org/vorbis/doc/v-comment.html#vectorformat """ return INVALID_CHARS.sub('', key) def is_valid_key(key): """ Return true if a string is a valid Vorbis comment key. Valid characters for Vorbis comment field names are ASCII 0x20 through 0x7D, 0x3D ('=') excluded. """ return INVALID_CHARS.search(key) is None def flac_sort_pics_after_tags(metadata_blocks): """ Reorder the metadata_blocks so that all picture blocks are located after the first Vorbis comment block. Windows fails to read FLAC tags if the picture blocks are located before the Vorbis comments. Reordering the blocks fixes this. """ # First remember all picture blocks that are located before the tag block. tagindex = 0 picblocks = [] for block in metadata_blocks: if block.code == mutagen.flac.VCFLACDict.code: tagindex = metadata_blocks.index(block) break elif block.code == mutagen.flac.Picture.code: picblocks.append(block) else: return # No tags found, nothing to sort # Now move those picture block after the tag block, maintaining their order. for pic in picblocks: metadata_blocks.remove(pic) metadata_blocks.insert(tagindex, pic) class VCommentFile(File): """Generic VComment-based file.""" _File = None __translate = { "movement": "movementnumber", "movementname": "movement", "musicbrainz_releasetrackid": "musicbrainz_trackid", "musicbrainz_trackid": "musicbrainz_recordingid", "waveformatextensible_channel_mask": "~waveformatextensible_channel_mask", } __rtranslate = dict([(v, k) for k, v in __translate.items()]) def _load(self, filename): log.debug("Loading file %r", filename) file = self._File(encode_filename(filename)) file.tags = file.tags or {} metadata = Metadata() for origname, values in file.tags.items(): for value in values: name = origname if name == "date" or name == "originaldate": # YYYY-00-00 => YYYY value = sanitize_date(value) elif name == 'performer' or name == 'comment': # transform "performer=Joe Barr (Piano)" to "performer:Piano=Joe Barr" name += ':' if value.endswith(')'): start = len(value) - 2 count = 1 while count > 0 and start > 0: if value[start] == ')': count += 1 elif value[start] == '(': count -= 1 start -= 1 if start > 0: name += value[start + 2:-1] value = value[:start] elif name.startswith('rating'): try: name, email = name.split(':', 1) except ValueError: email = '' if email != sanitize_key(config.setting['rating_user_email']): continue name = '~rating' try: value = str(round((float(value) * (config.setting['rating_steps'] - 1)))) except ValueError: log.warning('Invalid rating value in %r: %s', filename, value) elif name == "fingerprint" and value.startswith("MusicMagic Fingerprint"): name = "musicip_fingerprint" value = value[22:] elif name == "tracktotal": if "totaltracks" in file.tags: continue name = "totaltracks" elif name == "disctotal": if "totaldiscs" in file.tags: continue name = "totaldiscs" elif name == "metadata_block_picture": try: image = mutagen.flac.Picture(base64.standard_b64decode(value)) coverartimage = TagCoverArtImage( file=filename, tag=name, types=types_from_id3(image.type), comment=image.desc, support_types=True, data=image.data, ) except (CoverArtImageError, TypeError, ValueError, mutagen.flac.error) as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.images.append(coverartimage) continue elif name in self.__translate: name = self.__translate[name] metadata.add(name, value) if self._File == mutagen.flac.FLAC: for image in file.pictures: try: coverartimage = TagCoverArtImage( file=filename, tag='FLAC/PICTURE', types=types_from_id3(image.type), comment=image.desc, support_types=True, data=image.data, ) except CoverArtImageError as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.images.append(coverartimage) # Read the unofficial COVERART tags, for backward compatibility only if "metadata_block_picture" not in file.tags: try: for data in file["COVERART"]: try: coverartimage = TagCoverArtImage( file=filename, tag='COVERART', data=base64.standard_b64decode(data) ) except (CoverArtImageError, TypeError, ValueError) as e: log.error('Cannot load image from %r: %s' % (filename, e)) else: metadata.images.append(coverartimage) except KeyError: pass self._info(metadata, file) return metadata def _save(self, filename, metadata): """Save metadata to the file.""" log.debug("Saving file %r", filename) is_flac = self._File == mutagen.flac.FLAC file = self._File(encode_filename(filename)) if file.tags is None: file.add_tags() if config.setting["clear_existing_tags"]: channel_mask = file.tags.get('waveformatextensible_channel_mask', None) file.tags.clear() if channel_mask: file.tags['waveformatextensible_channel_mask'] = channel_mask images_to_save = list(metadata.images.to_be_saved_to_tags()) if is_flac and (config.setting["clear_existing_tags"] or images_to_save): file.clear_pictures() tags = {} for name, value in metadata.items(): if name == '~rating': # Save rating according to http://code.google.com/p/quodlibet/wiki/Specs_VorbisComments user_email = sanitize_key(config.setting['rating_user_email']) if user_email: name = 'rating:%s' % user_email else: name = 'rating' value = str(float(value) / (config.setting['rating_steps'] - 1)) # don't save private tags elif name.startswith("~") or not self.supports_tag(name): continue elif name.startswith('lyrics:'): name = 'lyrics' elif name == "date" or name == "originaldate": # YYYY-00-00 => YYYY value = sanitize_date(value) elif name.startswith('performer:') or name.startswith('comment:'): # transform "performer:Piano=Joe Barr" to "performer=Joe Barr (Piano)" name, desc = name.split(':', 1) if desc: value += ' (%s)' % desc elif name == "musicip_fingerprint": name = "fingerprint" value = "MusicMagic Fingerprint%s" % value elif name in self.__rtranslate: name = self.__rtranslate[name] tags.setdefault(name.upper(), []).append(value) if "totaltracks" in metadata: tags.setdefault("TRACKTOTAL", []).append(metadata["totaltracks"]) if "totaldiscs" in metadata: tags.setdefault("DISCTOTAL", []).append(metadata["totaldiscs"]) for image in images_to_save: picture = mutagen.flac.Picture() picture.data = image.data picture.mime = image.mimetype picture.desc = image.comment picture.width = image.width picture.height = image.height picture.type = image_type_as_id3_num(image.maintype) if is_flac: # See https://xiph.org/flac/format.html#metadata_block_picture expected_block_size = (8 * 4 + len(picture.data) + len(picture.mime) + len(picture.desc.encode('UTF-8'))) if expected_block_size > FLAC_MAX_BLOCK_SIZE: log.error('Failed saving image to %r: Image size of %d bytes exceeds maximum FLAC block size of %d bytes', filename, expected_block_size, FLAC_MAX_BLOCK_SIZE) continue file.add_picture(picture) else: tags.setdefault("METADATA_BLOCK_PICTURE", []).append( base64.b64encode(picture.write()).decode('ascii')) file.tags.update(tags) self._remove_deleted_tags(metadata, file.tags) if is_flac: flac_sort_pics_after_tags(file.metadata_blocks) kwargs = {} if is_flac and config.setting["remove_id3_from_flac"]: kwargs["deleteid3"] = True try: file.save(**kwargs) except TypeError: file.save() def _remove_deleted_tags(self, metadata, tags): """Remove the tags from the file that were deleted in the UI""" for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) if real_name and real_name in tags: if real_name in ('performer', 'comment'): tag_type = r"\(%s\)" % tag.split(':', 1)[1] for item in tags.get(real_name): if re.search(tag_type, item): tags.get(real_name).remove(item) else: if tag in ('totaldiscs', 'totaltracks'): # both tag and real_name are to be deleted in this case del tags[tag] del tags[real_name] def _get_tag_name(self, name): if name == '~rating': if config.setting['rating_user_email']: return 'rating:%s' % config.setting['rating_user_email'] else: return 'rating' elif name.startswith("~"): return None elif name.startswith('lyrics:'): return 'lyrics' elif name.startswith('performer:') or name.startswith('comment:'): return name.split(':', 1)[0] elif name == 'musicip_fingerprint': return 'fingerprint' elif name == 'totaltracks': return 'tracktotal' elif name == 'totaldiscs': return 'disctotal' elif name in self.__rtranslate: return self.__rtranslate[name] else: return name @classmethod def supports_tag(cls, name): unsupported_tags = ['r128_album_gain', 'r128_track_gain'] return (bool(name) and name not in unsupported_tags and (is_valid_key(name) or name.startswith('comment:') or name.startswith('lyrics:') or name.startswith('performer:'))) class FLACFile(VCommentFile): """FLAC file.""" EXTENSIONS = [".flac"] NAME = "FLAC" _File = mutagen.flac.FLAC class OggFLACFile(VCommentFile): """FLAC file.""" EXTENSIONS = [".oggflac"] NAME = "Ogg FLAC" _File = mutagen.oggflac.OggFLAC class OggSpeexFile(VCommentFile): """Ogg Speex file.""" EXTENSIONS = [".spx"] NAME = "Speex" _File = mutagen.oggspeex.OggSpeex class OggTheoraFile(VCommentFile): """Ogg Theora file.""" EXTENSIONS = [".oggtheora"] NAME = "Ogg Theora" _File = mutagen.oggtheora.OggTheora def _info(self, metadata, file): super()._info(metadata, file) metadata['~video'] = '1' class OggVorbisFile(VCommentFile): """Ogg Vorbis file.""" EXTENSIONS = [".ogg"] NAME = "Ogg Vorbis" _File = mutagen.oggvorbis.OggVorbis class OggOpusFile(VCommentFile): """Ogg Opus file.""" EXTENSIONS = [".opus"] NAME = "Ogg Opus" _File = mutagen.oggopus.OggOpus @classmethod def supports_tag(cls, name): if name.startswith('r128_'): return True return VCommentFile.supports_tag(name) def OggAudioFile(filename): """Generic Ogg audio file.""" options = [OggFLACFile, OggSpeexFile, OggVorbisFile] return guess_format(filename, options) OggAudioFile.EXTENSIONS = [".oga"] OggAudioFile.NAME = "Ogg Audio" OggAudioFile.supports_tag = VCommentFile.supports_tag def OggVideoFile(filename): """Generic Ogg video file.""" options = [OggTheoraFile] return guess_format(filename, options) OggVideoFile.EXTENSIONS = [".ogv"] OggVideoFile.NAME = "Ogg Video" OggVideoFile.supports_tag = VCommentFile.supports_tag picard-release-2.3.1/picard/formats/wav.py000066400000000000000000000035161362601763300204750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2012-2013, 2017 Wieland Hoffmann # Copyright (C) 2013 Michael Wiencek # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import wave from picard import log from picard.file import File from picard.metadata import Metadata class WAVFile(File): EXTENSIONS = [".wav"] NAME = "Microsoft WAVE" _File = None def _load(self, filename): log.debug("Loading file %r", filename) f = wave.open(filename, "rb") metadata = Metadata() metadata['~channels'] = f.getnchannels() metadata['~bits_per_sample'] = f.getsampwidth() * 8 metadata['~sample_rate'] = f.getframerate() metadata.length = 1000 * f.getnframes() // f.getframerate() metadata['~format'] = self.NAME self._add_path_to_metadata(metadata) return metadata def _save(self, filename, metadata): log.debug("Saving file %r", filename) @classmethod def supports_tag(cls, name): return False picard-release-2.3.1/picard/i18n.py000066400000000000000000000113661362601763300170060ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2012 Frederik “Freso” S. Olesen # Copyright (C) 2013-2014, 2018-2019 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2017-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import builtins import gettext import locale import os.path from PyQt5.QtCore import QLocale from picard.const.sys import ( IS_MACOS, IS_WIN, ) builtins.__dict__['N_'] = lambda a: a def setup_gettext(localedir, ui_language=None, logger=None): """Setup locales, load translations, install gettext functions.""" if not logger: logger = lambda *a, **b: None # noqa: E731 current_locale = '' if ui_language: try: current_locale = locale.normalize(ui_language + '.' + locale.getpreferredencoding()) locale.setlocale(locale.LC_ALL, current_locale) except Exception as e: logger(e) else: if IS_WIN: from ctypes import windll try: current_locale = locale.windows_locale[windll.kernel32.GetUserDefaultUILanguage()] current_locale += '.' + locale.getpreferredencoding() locale.setlocale(locale.LC_ALL, current_locale) except KeyError: try: current_locale = locale.setlocale(locale.LC_ALL, '') except Exception as e: logger(e) except Exception as e: logger(e) elif IS_MACOS: try: import Foundation defaults = Foundation.NSUserDefaults.standardUserDefaults() current_locale = defaults.objectForKey_('AppleLanguages')[0] current_locale = current_locale.replace('-', '_') locale.setlocale(locale.LC_ALL, current_locale) except Exception as e: logger(e) else: try: locale.setlocale(locale.LC_ALL, '') current_locale = '.'.join(locale.getlocale(locale.LC_MESSAGES)) except Exception as e: logger(e) os.environ['LANGUAGE'] = os.environ['LANG'] = current_locale QLocale.setDefault(QLocale(current_locale)) logger("Using locale %r", current_locale) try: logger("Loading gettext translation, localedir=%r", localedir) trans = gettext.translation("picard", localedir) logger("Loading gettext translation (picard-countries), localedir=%r", localedir) trans_countries = gettext.translation("picard-countries", localedir) logger("Loading gettext translation (picard-attributes), localedir=%r", localedir) trans_attributes = gettext.translation("picard-attributes", localedir) except IOError as e: logger(e) trans = gettext.NullTranslations() trans_countries = gettext.NullTranslations() trans_attributes = gettext.NullTranslations() trans.install(['ngettext']) builtins.__dict__['gettext_countries'] = trans_countries.gettext builtins.__dict__['gettext_attributes'] = trans_attributes.gettext logger("_ = %r", _) logger("N_ = %r", N_) logger("ngettext = %r", ngettext) logger("gettext_countries = %r", gettext_countries) logger("gettext_attributes = %r", gettext_attributes) # Workaround for po files with msgctxt which isn't supported by current python # gettext # msgctxt are used within attributes.po, and gettext is failing to translate # strings due to that # This workaround is a hack until we get proper msgctxt support _CONTEXT_SEPARATOR = "\x04" def gettext_ctxt(gettext_, message, context=None): if context is None: return gettext_(message) msg_with_ctxt = "%s%s%s" % (context, _CONTEXT_SEPARATOR, message) translated = gettext_(msg_with_ctxt) if _CONTEXT_SEPARATOR in translated: # no translation found, return original message return message return translated def gettext_attr(message, context=None): """Translate MB attributes, depending on context""" return gettext_ctxt(gettext_attributes, message, context) picard-release-2.3.1/picard/log.py000066400000000000000000000113751362601763300170100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007, 2011 Lukáš Lalinský # Copyright (C) 2008-2010, 2019 Philipp Wolfer # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013, 2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Sophist-UK # Copyright (C) 2018 Wieland Hoffmann # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import ( OrderedDict, deque, namedtuple, ) import logging import os from threading import Lock from PyQt5 import QtCore _MAX_TAIL_LEN = 10**6 VERBOSITY_DEFAULT = logging.WARNING def set_level(level): main_logger.setLevel(level) def get_effective_level(): return main_logger.getEffectiveLevel() _feat = namedtuple('_feat', ['name', 'prefix', 'color_key']) levels_features = OrderedDict([ (logging.ERROR, _feat('Error', 'E', 'log_error')), (logging.WARNING, _feat('Warning', 'W', 'log_warning')), (logging.INFO, _feat('Info', 'I', 'log_info')), (logging.DEBUG, _feat('Debug', 'D', 'log_debug')), ]) # COMMON CLASSES TailLogTuple = namedtuple( 'TailLogTuple', ['pos', 'message', 'level']) class TailLogHandler(logging.Handler): def __init__(self, log_queue, tail_logger, log_queue_lock): super().__init__() self.log_queue = log_queue self.tail_logger = tail_logger self.log_queue_lock = log_queue_lock self.pos = 0 def emit(self, record): with self.log_queue_lock: self.log_queue.append( TailLogTuple( self.pos, self.format(record), record.levelno ) ) self.pos += 1 self.tail_logger.updated.emit() class TailLogger(QtCore.QObject): updated = QtCore.pyqtSignal() def __init__(self, maxlen): super().__init__() self._log_queue = deque(maxlen=maxlen) self._queue_lock = Lock() self.log_handler = TailLogHandler(self._log_queue, self, self._queue_lock) def contents(self, prev=-1): with self._queue_lock: contents = [x for x in self._log_queue if x.pos > prev] return contents def clear(self): with self._queue_lock: self._log_queue.clear() # MAIN LOGGER main_logger = logging.getLogger('main') main_logger.setLevel(logging.INFO) def name_filter(record): # provide a significant name from the filepath of the module name, _ = os.path.splitext(os.path.normpath(record.pathname)) prefix = os.path.normpath(__package__) # In case the module exists within picard, remove the picard prefix # else, in case of something like a plugin, keep the path as it is. if name.startswith(prefix): name = name[len(prefix) + 1:].replace(os.sep, ".").replace('.__init__', '') record.name = name return True main_logger.addFilter(name_filter) main_tail = TailLogger(_MAX_TAIL_LEN) main_fmt = '%(levelname).1s: %(asctime)s,%(msecs)03d %(name)s.%(funcName)s:%(lineno)d: %(message)s' main_time_fmt = '%H:%M:%S' main_inapp_fmt = main_fmt main_inapp_time_fmt = main_time_fmt main_handler = main_tail.log_handler main_formatter = logging.Formatter(main_inapp_fmt, main_inapp_time_fmt) main_handler.setFormatter(main_formatter) main_logger.addHandler(main_handler) main_console_handler = logging.StreamHandler() main_console_formatter = logging.Formatter(main_fmt, main_time_fmt) main_console_handler.setFormatter(main_console_formatter) main_logger.addHandler(main_console_handler) debug = main_logger.debug info = main_logger.info warning = main_logger.warning error = main_logger.error exception = main_logger.exception log = main_logger.log # HISTORY LOGGING history_logger = logging.getLogger('history') history_logger.setLevel(logging.INFO) history_tail = TailLogger(_MAX_TAIL_LEN) history_handler = history_tail.log_handler history_formatter = logging.Formatter('%(asctime)s - %(message)s') history_handler.setFormatter(history_formatter) history_logger.addHandler(history_handler) def history_info(message, *args): history_logger.info(message, *args) picard-release-2.3.1/picard/mbjson.py000066400000000000000000000444111362601763300175140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2017 David Mandelberg # Copyright (C) 2017-2018 Sambhav Kothari # Copyright (C) 2017-2019 Laurent Monin # Copyright (C) 2018-2020 Philipp Wolfer # Copyright (C) 2019 Michael Wiencek # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from picard import config from picard.const import RELEASE_FORMATS from picard.util import ( format_time, linear_combination_of_weights, parse_amazon_url, translate_from_sortname, ) _artist_rel_types = { "arranger": "arranger", "audio": "engineer", "chorus master": "conductor", "composer": "composer", "concertmaster": "performer:concertmaster", "conductor": "conductor", "engineer": "engineer", "instrumentator": "arranger", "librettist": "lyricist", "live sound": "engineer", "lyricist": "lyricist", # "mastering": "engineer", "mix-DJ": "djmixer", "mix": "mixer", "orchestrator": "arranger", "performing orchestra": "performer:orchestra", "producer": "producer", # "recording": "engineer", "remixer": "remixer", "sound": "engineer", "writer": "writer", } _TRACK_TO_METADATA = { 'number': '~musicbrainz_tracknumber', 'position': 'tracknumber', 'title': 'title', } _MEDIUM_TO_METADATA = { 'format': 'media', 'position': 'discnumber', 'title': 'discsubtitle', 'track-count': 'totaltracks', } _RECORDING_TO_METADATA = { 'disambiguation': '~recordingcomment', 'title': 'title', } _RELEASE_TO_METADATA = { 'asin': 'asin', 'barcode': 'barcode', 'country': 'releasecountry', 'date': 'date', 'disambiguation': '~releasecomment', 'title': 'album', } _ARTIST_TO_METADATA = { 'gender': 'gender', 'name': 'name', 'type': 'type', } _RELEASE_GROUP_TO_METADATA = { 'disambiguation': '~releasegroupcomment', 'first-release-date': 'originaldate', 'title': '~releasegroup', } def _decamelcase(text): return re.sub(r'([A-Z])', r' \1', text).strip() _REPLACE_MAP = {} _PREFIX_ATTRS = ['guest', 'additional', 'minor', 'solo'] _BLANK_SPECIAL_RELTYPES = {'vocal': 'vocals'} def _transform_attribute(attr, attr_credits): if attr in attr_credits: return attr_credits[attr] else: return _decamelcase(_REPLACE_MAP.get(attr, attr)) def _parse_attributes(attrs, reltype, attr_credits): prefixes = [] nouns = [] for attr in attrs: attr = _transform_attribute(attr, attr_credits) if attr in _PREFIX_ATTRS: prefixes.append(attr) else: nouns.append(attr) prefix = ' '.join(prefixes) if len(nouns) > 1: result = '%s and %s' % (', '.join(nouns[:-1]), nouns[-1:][0]) elif len(nouns) == 1: result = nouns[0] else: result = _BLANK_SPECIAL_RELTYPES.get(reltype, '') return ' '.join([prefix, result]).strip().lower() def _relations_to_metadata(relations, m): use_credited_as = not config.setting['standardize_artists'] use_instrument_credits = not config.setting['standardize_instruments'] for relation in relations: if relation['target-type'] == 'artist': artist = relation['artist'] value, valuesort = _translate_artist_node(artist) has_translation = (value != artist['name']) if not has_translation and use_credited_as and 'target-credit' in relation: credited_as = relation['target-credit'] if credited_as: value, valuesort = credited_as, credited_as reltype = relation['type'] attribs = [] if 'attributes' in relation: attribs = [a for a in relation['attributes']] if reltype in ('vocal', 'instrument', 'performer'): if use_instrument_credits: attr_credits = relation.get('attribute-credits', {}) else: attr_credits = {} name = 'performer:' + _parse_attributes(attribs, reltype, attr_credits) elif reltype == 'mix-DJ' and len(attribs) > 0: if not hasattr(m, "_djmix_ars"): m._djmix_ars = {} for attr in attribs: m._djmix_ars.setdefault(attr.split()[1], []).append(value) continue else: try: name = _artist_rel_types[reltype] except KeyError: continue if value not in m[name]: m.add(name, value) if name == 'composer' and valuesort not in m['composersort']: m.add('composersort', valuesort) elif relation['target-type'] == 'work': if relation['type'] == 'performance': performance_to_metadata(relation, m) work_to_metadata(relation['work'], m) elif relation['target-type'] == 'url': if relation['type'] == 'amazon asin' and 'asin' not in m: amz = parse_amazon_url(relation['url']['resource']) if amz is not None: m['asin'] = amz['asin'] elif relation['type'] == 'license': url = relation['url']['resource'] m.add('license', url) def _translate_artist_node(node): transl, translsort = None, None if config.setting['translate_artist_names']: locale = config.setting["artist_locale"] lang = locale.split("_")[0] if "aliases" in node: result = (-1, (None, None)) for alias in node['aliases']: if not alias["primary"]: continue if "locale" not in alias: continue parts = [] if alias['locale'] == locale: score = 0.8 elif alias['locale'] == lang: score = 0.6 elif alias['locale'].split("_")[0] == lang: score = 0.4 else: continue parts.append((score, 5)) if alias["type"] == "Artist name": score = 0.8 elif alias["type"] == "Legal Name": score = 0.5 else: # as 2014/09/19, only Artist or Legal names should have the # Primary flag score = 0.0 parts.append((score, 5)) comb = linear_combination_of_weights(parts) if comb > result[0]: result = (comb, (alias['name'], alias["sort-name"])) transl, translsort = result[1] if not transl: translsort = node['sort-name'] transl = translate_from_sortname(node['name'] or "", translsort) else: transl, translsort = node['name'], node['sort-name'] return (transl, translsort) def artist_credit_from_node(node): artist = "" artistsort = "" artists = [] artistssort = [] use_credited_as = not config.setting["standardize_artists"] for artist_info in node: a = artist_info['artist'] translated, translated_sort = _translate_artist_node(a) has_translation = (translated != a['name']) if has_translation: name = translated elif use_credited_as and 'name' in artist_info: name = artist_info['name'] else: name = a['name'] artist += name artistsort += translated_sort or "" artists.append(name) artistssort.append(translated_sort) if 'joinphrase' in artist_info: artist += artist_info['joinphrase'] or "" artistsort += artist_info['joinphrase'] or "" return (artist, artistsort, artists, artistssort) def artist_credit_to_metadata(node, m, release=False): ids = [n['artist']['id'] for n in node] artist, artistsort, artists, artistssort = artist_credit_from_node(node) if release: m["musicbrainz_albumartistid"] = ids m["albumartist"] = artist m["albumartistsort"] = artistsort m["~albumartists"] = artists m["~albumartists_sort"] = artistssort else: m["musicbrainz_artistid"] = ids m["artist"] = artist m["artistsort"] = artistsort m["artists"] = artists m["~artists_sort"] = artistssort def countries_from_node(node): countries = [] if "release-events" in node: for release_event in node['release-events']: try: country_code = release_event['area']['iso-3166-1-codes'][0] # TypeError in case object is None except (KeyError, IndexError, TypeError): pass else: if country_code: countries.append(country_code) return countries def release_dates_and_countries_from_node(node): dates = [] countries = [] if "release-events" in node: for release_event in node['release-events']: dates.append(release_event['date'] or '') country_code = '' try: country_code = release_event['area']['iso-3166-1-codes'][0] # TypeError in case object is None except (KeyError, IndexError, TypeError): pass countries.append(country_code) return dates, countries def label_info_from_node(node): labels = [] catalog_numbers = [] for label_info in node: if 'label' in label_info and label_info['label'] and 'name' in label_info['label']: label = label_info['label']['name'] if label and label not in labels: labels.append(label) if 'catalog-number' in label_info: cat_num = label_info['catalog-number'] if cat_num and cat_num not in catalog_numbers: catalog_numbers.append(cat_num) return (labels, catalog_numbers) def media_formats_from_node(node): formats_count = {} formats_order = [] for medium in node: text = medium.get('format', "(unknown)") or "(unknown)" if text in formats_count: formats_count[text] += 1 else: formats_count[text] = 1 formats_order.append(text) formats = [] for medium_format in formats_order: count = formats_count[medium_format] medium_format = RELEASE_FORMATS.get(medium_format, medium_format) if count > 1: medium_format = str(count) + "×" + medium_format formats.append(medium_format) return " + ".join(formats) def track_to_metadata(node, track): m = track.metadata recording_to_metadata(node['recording'], m, track) m.add_unique('musicbrainz_trackid', node['id']) # overwrite with data we have on the track for key, value in node.items(): if not value: continue if key in _TRACK_TO_METADATA: m[_TRACK_TO_METADATA[key]] = value elif key == 'length' and value: m.length = value elif key == 'artist-credit': artist_credit_to_metadata(value, m) if m.length: m['~length'] = format_time(m.length) def recording_to_metadata(node, m, track=None): m.length = 0 m.add_unique('musicbrainz_recordingid', node['id']) for key, value in node.items(): if not value: continue if key in _RECORDING_TO_METADATA: m[_RECORDING_TO_METADATA[key]] = value elif key == 'user-rating': m['~rating'] = value['value'] elif key == 'length': m.length = value elif key == 'artist-credit': artist_credit_to_metadata(value, m) # set tags from artists if track: for credit in value: artist = credit['artist'] artist_obj = track.append_track_artist(artist['id']) add_genres_from_node(artist, artist_obj) elif key == 'relations': _relations_to_metadata(value, m) elif key in ('genres', 'tags') and track: add_genres(value, track) elif key in ('user-genres', 'user-tags') and track: add_user_genres(value, track) elif key == 'isrcs': add_isrcs_to_metadata(value, m) elif key == 'video' and value: m['~video'] = '1' if m['title']: m['~recordingtitle'] = m['title'] if m.length: m['~length'] = format_time(m.length) def performance_to_metadata(relation, m): if 'attributes' in relation: for attribute in relation['attributes']: m.add_unique("~performance_attributes", attribute) def work_to_metadata(work, m): m.add_unique("musicbrainz_workid", work['id']) if 'languages' in work: for language in work['languages']: m.add_unique("language", language) elif 'language' in work: m.add_unique("language", work['language']) if 'title' in work: m.add_unique("work", work['title']) if 'relations' in work: _relations_to_metadata(work['relations'], m) def medium_to_metadata(node, m): for key, value in node.items(): if not value: continue if key in _MEDIUM_TO_METADATA: m[_MEDIUM_TO_METADATA[key]] = value def artist_to_metadata(node, m): """Make meatadata dict from a JSON 'artist' node.""" m.add_unique("musicbrainz_artistid", node['id']) for key, value in node.items(): if not value: continue if key in _ARTIST_TO_METADATA: m[_ARTIST_TO_METADATA[key]] = value elif key == "area": m["area"] = value['name'] elif key == "life-span": if "begin" in value: m["begindate"] = value['begin'] if "ended" in value: ended = value['ended'] if ended and "end" in value: m["enddate"] = value['end'] elif key == "begin-area": m["beginarea"] = value['name'] elif key == "end-area": m["endarea"] = value['name'] def release_to_metadata(node, m, album=None): """Make metadata dict from a JSON 'release' node.""" m.add_unique('musicbrainz_albumid', node['id']) for key, value in node.items(): if not value: continue if key in _RELEASE_TO_METADATA: m[_RELEASE_TO_METADATA[key]] = value elif key == 'status': m['releasestatus'] = value.lower() elif key == 'artist-credit': artist_credit_to_metadata(value, m, release=True) # set tags from artists if album is not None: for credit in value: artist = credit['artist'] artist_obj = album.append_album_artist(artist['id']) add_genres_from_node(artist, artist_obj) elif key == 'relations': _relations_to_metadata(value, m) elif key == 'label-info': m['label'], m['catalognumber'] = label_info_from_node(value) elif key == 'text-representation': if 'language' in value: m['~releaselanguage'] = value['language'] if 'script' in value: m['script'] = value['script'] m['~releasecountries'] = release_countries = countries_from_node(node) # The MB web service returns the first release country in the country tag. # If the user has configured preferred release countries, use the first one # if it is one in the complete list of release countries. for country in config.setting["preferred_release_countries"]: if country in release_countries: m['releasecountry'] = country break add_genres_from_node(node, album) def release_group_to_metadata(node, m, release_group=None): """Make metadata dict from a JSON 'release-group' node taken from inside a 'release' node.""" m.add_unique('musicbrainz_releasegroupid', node['id']) for key, value in node.items(): if not value: continue if key in _RELEASE_GROUP_TO_METADATA: m[_RELEASE_GROUP_TO_METADATA[key]] = value elif key == 'primary-type': m['~primaryreleasetype'] = value.lower() elif key == 'secondary-types': add_secondary_release_types(value, m) add_genres_from_node(node, release_group) if m['originaldate']: m['originalyear'] = m['originaldate'][:4] m['releasetype'] = m.getall('~primaryreleasetype') + m.getall('~secondaryreleasetype') def add_secondary_release_types(node, m): for secondary_type in node: m.add_unique('~secondaryreleasetype', secondary_type.lower()) def add_genres_from_node(node, obj): if obj is None: return if 'genres' in node: add_genres(node['genres'], obj) if 'tags' in node: add_genres(node['tags'], obj) if 'user-genres' in node: add_user_genres(node['user-genres'], obj) if 'user-tags' in node: add_user_genres(node['user-tags'], obj) def add_genres(node, obj): for tag in node: key = tag['name'] count = tag['count'] if key: obj.add_genre(key, count) def add_user_genres(node, obj): for tag in node: key = tag['name'] if key: obj.add_genre(key, 1) def add_isrcs_to_metadata(node, metadata): for isrc in node: metadata.add('isrc', isrc) def get_score(node): """Returns the score attribute for a node. The score is expected to be an integer between 0 and 100, it is returned as a value between 0.0 and 1.0. If there is no score attribute or it has an invalid value 1.0 will be returned. """ try: return int(node.get('score', 100)) / 100 except (TypeError, ValueError): return 1.0 picard-release-2.3.1/picard/metadata.py000066400000000000000000000412661362601763300200110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2009, 2015, 2018-2020 Philipp Wolfer # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2012 Johannes Weißl # Copyright (C) 2012-2014, 2018 Wieland Hoffmann # Copyright (C) 2013-2014, 2016, 2018-2020 Laurent Monin # Copyright (C) 2013-2014, 2017 Sophist-UK # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017-2018 Antonio Larrosa # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2018 Xincognito10 # Copyright (C) 2020 Ray # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import namedtuple from collections.abc import ( Iterable, MutableMapping, ) from PyQt5.QtCore import QObject from picard import config from picard.mbjson import ( artist_credit_from_node, get_score, ) from picard.plugin import ( PluginFunctions, PluginPriority, ) from picard.similarity import similarity2 from picard.util import linear_combination_of_weights from picard.util.imagelist import ImageList from picard.util.tags import PRESERVED_TAGS MULTI_VALUED_JOINER = '; ' # lengths difference over this number of milliseconds will give a score of 0.0 # equal lengths will give a score of 1.0 # example # a b score # 20000 0 0.333333333333 # 20000 10000 0.666666666667 # 20000 20000 1.0 # 20000 30000 0.666666666667 # 20000 40000 0.333333333333 # 20000 50000 0.0 LENGTH_SCORE_THRES_MS = 30000 SimMatchTrack = namedtuple('SimMatchTrack', 'similarity releasegroup release track') SimMatchRelease = namedtuple('SimMatchRelease', 'similarity release') def weights_from_release_type_scores(parts, release, release_type_scores, weight_release_type=1): # This function generates a score that determines how likely this release will be selected in a lookup. # The score goes from 0 to 1 with 1 being the most likely to be chosen and 0 the least likely # This score is based on the preferences of release-types found in this release # This algorithm works by taking the scores of the primary type (and secondary if found) and averages them # If no types are found, it is set to the score of the 'Other' type or 0.5 if 'Other' doesnt exist # It appends (score, weight_release_type) to passed parts list # if our preference is zero for the release_type, force to never return this recording # by using a large zero weight. This means it only gets picked if there are no others at all. skip_release = False type_scores = dict(release_type_scores) score = 0.0 if 'release-group' in release and 'primary-type' in release['release-group']: types_found = [release['release-group']['primary-type']] if 'secondary-types' in release['release-group']: types_found += release['release-group']['secondary-types'] other_score = type_scores.get('Other', 0.5) for release_type in types_found: type_score = type_scores.get(release_type, other_score) if type_score == 0: skip_release = True score += type_score score /= len(types_found) if skip_release: parts.append((0, 9999)) else: parts.append((score, weight_release_type)) def weights_from_preferred_countries(parts, release, preferred_countries, weight): total_countries = len(preferred_countries) if total_countries: score = 0.0 if "country" in release: try: i = preferred_countries.index(release['country']) score = float(total_countries - i) / float(total_countries) except ValueError: pass parts.append((score, weight)) def weights_from_preferred_formats(parts, release, preferred_formats, weight): total_formats = len(preferred_formats) if total_formats and 'media' in release: score = 0.0 subtotal = 0 for medium in release['media']: if "format" in medium: try: i = preferred_formats.index(medium['format']) score += float(total_formats - i) / float(total_formats) except ValueError: pass subtotal += 1 if subtotal > 0: score /= subtotal parts.append((score, weight)) class Metadata(MutableMapping): """List of metadata items with dict-like access.""" __weights = [ ('title', 22), ('artist', 6), ('album', 12), ('tracknumber', 6), ('totaltracks', 5), ('discnumber', 5), ('totaldiscs', 4), ] multi_valued_joiner = MULTI_VALUED_JOINER def __init__(self, *args, deleted_tags=None, images=None, length=None, **kwargs): self._store = dict() self.deleted_tags = set() self.length = 0 self.images = ImageList() self.has_common_images = True d = dict(*args, **kwargs) for k, v in d.items(): self[k] = v if images is not None: for image in images: self.images.append(image) if deleted_tags is not None: for tag in deleted_tags: del self[tag] if length is not None: self.length = int(length) def __bool__(self): return bool(len(self)) def __len__(self): return len(self._store) + len(self.images) @staticmethod def length_score(a, b): return (1.0 - min(abs(a - b), LENGTH_SCORE_THRES_MS) / float(LENGTH_SCORE_THRES_MS)) def compare(self, other, ignored=None): parts = [] if ignored is None: ignored = [] if self.length and other.length and '~length' not in ignored: score = self.length_score(self.length, other.length) parts.append((score, 8)) for name, weight in self.__weights: if name in ignored: continue a = self[name] b = other[name] if a and b: if name in ('tracknumber', 'totaltracks', 'discnumber', 'totaldiscs'): try: ia = int(a) ib = int(b) except ValueError: ia = a ib = b score = 1.0 - (int(ia != ib)) else: score = similarity2(a, b) parts.append((score, weight)) elif (a and name in other.deleted_tags or b and name in self.deleted_tags): parts.append((0, weight)) return linear_combination_of_weights(parts) def compare_to_release(self, release, weights): """ Compare metadata to a MusicBrainz release. Produces a probability as a linear combination of weights that the metadata matches a certain album. """ parts = self.compare_to_release_parts(release, weights) sim = linear_combination_of_weights(parts) * get_score(release) return SimMatchRelease(similarity=sim, release=release) def compare_to_release_parts(self, release, weights): parts = [] if "album" in self: b = release['title'] parts.append((similarity2(self["album"], b), weights["album"])) if "albumartist" in self and "albumartist" in weights: a = self["albumartist"] b = artist_credit_from_node(release['artist-credit'])[0] parts.append((similarity2(a, b), weights["albumartist"])) try: a = int(self["totaltracks"]) b = release['track-count'] score = 0.0 if a > b else 0.3 if a < b else 1.0 parts.append((score, weights["totaltracks"])) except (ValueError, KeyError): pass weights_from_preferred_countries(parts, release, config.setting["preferred_release_countries"], weights["releasecountry"]) weights_from_preferred_formats(parts, release, config.setting["preferred_release_formats"], weights["format"]) if "releasetype" in weights: weights_from_release_type_scores(parts, release, config.setting["release_type_scores"], weights["releasetype"]) rg = QObject.tagger.get_release_group_by_id(release['release-group']['id']) if release['id'] in rg.loaded_albums: parts.append((1.0, 6)) return parts def compare_to_track(self, track, weights): parts = [] if 'title' in self: a = self['title'] b = track.get('title', '') parts.append((similarity2(a, b), weights["title"])) if 'artist' in self: a = self['artist'] artist_credits = track.get('artist-credit', []) b = artist_credit_from_node(artist_credits)[0] parts.append((similarity2(a, b), weights["artist"])) a = self.length if a > 0 and 'length' in track: b = track['length'] score = self.length_score(a, b) parts.append((score, weights["length"])) releases = [] if "releases" in track: releases = track['releases'] search_score = get_score(track) if not releases: sim = linear_combination_of_weights(parts) * search_score return SimMatchTrack(similarity=sim, releasegroup=None, release=None, track=track) if 'isvideo' in weights: metadata_is_video = self['~video'] == '1' track_is_video = track.get('video', False) score = 1 if metadata_is_video == track_is_video else 0 parts.append((score, weights['isvideo'])) result = SimMatchTrack(similarity=-1, releasegroup=None, release=None, track=None) for release in releases: release_parts = self.compare_to_release_parts(release, weights) sim = linear_combination_of_weights(parts + release_parts) * search_score if sim > result.similarity: rg = release['release-group'] if "release-group" in release else None result = SimMatchTrack(similarity=sim, releasegroup=rg, release=release, track=track) return result def copy(self, other, copy_images=True): self.clear() self._update_from_metadata(other, copy_images) def update(self, *args, **kwargs): one_arg = len(args) == 1 if one_arg and isinstance(args[0], self.__class__): self._update_from_metadata(args[0]) elif one_arg and isinstance(args[0], MutableMapping): # update from MutableMapping (ie. dict) for k, v in args[0].items(): self[k] = v elif args or kwargs: # update from a dict-like constructor parameters for k, v in dict(*args, **kwargs).items(): self[k] = v else: # no argument, raise TypeError to mimic dict.update() raise TypeError("descriptor 'update' of '%s' object needs an argument" % self.__class__.__name__) def _update_from_metadata(self, other, copy_images=True): for k, v in other.rawitems(): self.set(k, v[:]) for tag in other.deleted_tags: del self[tag] if copy_images and other.images: self.images = other.images.copy() if other.length: self.length = other.length def clear(self): self._store.clear() self.images = ImageList() self.length = 0 self.clear_deleted() def clear_deleted(self): self.deleted_tags = set() @staticmethod def normalize_tag(name): return name.rstrip(':') def getall(self, name): return self._store.get(self.normalize_tag(name), []) def getraw(self, name): return self._store[self.normalize_tag(name)] def get(self, key, default=None): values = self._store.get(self.normalize_tag(key), None) if values: return self.multi_valued_joiner.join(values) else: return default def __getitem__(self, name): return self.get(self.normalize_tag(name), '') def set(self, name, values): name = self.normalize_tag(name) if isinstance(values, str) or not isinstance(values, Iterable): values = [values] values = [str(value) for value in values if value or value == 0] if values: self._store[name] = values self.deleted_tags.discard(name) elif name in self._store: del self[name] def __setitem__(self, name, values): self.set(self.normalize_tag(name), values) def __contains__(self, name): return self._store.__contains__(self.normalize_tag(name)) def __delitem__(self, name): name = self.normalize_tag(name) try: del self._store[name] except KeyError: pass finally: self.deleted_tags.add(name) def add(self, name, value): if value or value == 0: name = self.normalize_tag(name) self._store.setdefault(name, []).append(str(value)) self.deleted_tags.discard(name) def add_unique(self, name, value): name = self.normalize_tag(name) if value not in self.getall(name): self.add(name, value) def delete(self, name): """Deprecated: use del directly""" del self[self.normalize_tag(name)] def unset(self, name): """Removes a tag from the metadata, but does not mark it for deletion. Args: name: name of the tag to unset Raises: KeyError: name not set """ name = self.normalize_tag(name) del self._store[name] def __iter__(self): return iter(self._store) def items(self): for name, values in self._store.items(): for value in values: yield name, value def rawitems(self): """Returns the metadata items. >>> m.rawitems() [("key1", ["value1", "value2"]), ("key2", ["value3"])] """ return self._store.items() def apply_func(self, func): for name, values in list(self.rawitems()): if name not in PRESERVED_TAGS: self[name] = [func(value) for value in values] def strip_whitespace(self): """Strip leading/trailing whitespace. >>> m = Metadata() >>> m["foo"] = " bar " >>> m["foo"] " bar " >>> m.strip_whitespace() >>> m["foo"] "bar" """ self.apply_func(str.strip) def __repr__(self): return "%s(%r, deleted_tags=%r, length=%r, images=%r)" % (self.__class__.__name__, self._store, self.deleted_tags, self.length, self.images) def __str__(self): return ("store: %r\ndeleted: %r\nimages: %r\nlength: %r" % (self._store, self.deleted_tags, [str(img) for img in self.images], self.length)) _album_metadata_processors = PluginFunctions(label='album_metadata_processors') _track_metadata_processors = PluginFunctions(label='track_metadata_processors') def register_album_metadata_processor(function, priority=PluginPriority.NORMAL): """Registers new album-level metadata processor.""" _album_metadata_processors.register(function.__module__, function, priority) def register_track_metadata_processor(function, priority=PluginPriority.NORMAL): """Registers new track-level metadata processor.""" _track_metadata_processors.register(function.__module__, function, priority) def run_album_metadata_processors(album_object, metadata, release): _album_metadata_processors.run(album_object, metadata, release) def run_track_metadata_processors(album_object, metadata, track, release=None): _track_metadata_processors.run(album_object, metadata, track, release) picard-release-2.3.1/picard/oauth.py000066400000000000000000000222451362601763300173450ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2014 Lukáš Lalinský # Copyright (C) 2015 Sophist-UK # Copyright (C) 2015 Wieland Hoffmann # Copyright (C) 2015, 2018 Philipp Wolfer # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2018-2019 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import time from PyQt5.QtCore import ( QUrl, QUrlQuery, ) from PyQt5.QtNetwork import QNetworkRequest from picard import ( config, log, ) from picard.const import ( MUSICBRAINZ_OAUTH_CLIENT_ID, MUSICBRAINZ_OAUTH_CLIENT_SECRET, ) from picard.util import ( build_qurl, load_json, ) class OAuthManager(object): def __init__(self, webservice): self.webservice = webservice self.setting = config.setting self.persist = config.persist @property def host(self): return self.setting['server_host'] @property def port(self): return self.setting['server_port'] @property def refresh_token(self): return self.persist["oauth_refresh_token"] @refresh_token.setter def refresh_token(self, value): self.persist["oauth_refresh_token"] = value @refresh_token.deleter def refresh_token(self): self.persist.remove("oauth_refresh_token") @property def refresh_token_scopes(self): return self.persist["oauth_refresh_token_scopes"] @refresh_token_scopes.setter def refresh_token_scopes(self, value): self.persist["oauth_refresh_token_scopes"] = value @refresh_token_scopes.deleter def refresh_token_scopes(self): self.persist.remove("oauth_refresh_token_scopes") @property def access_token(self): return self.persist["oauth_access_token"] @access_token.setter def access_token(self, value): self.persist["oauth_access_token"] = value @access_token.deleter def access_token(self): self.persist.remove("oauth_access_token") @property def access_token_expires(self): return self.persist["oauth_access_token_expires"] @access_token_expires.setter def access_token_expires(self, value): self.persist["oauth_access_token_expires"] = value @access_token_expires.deleter def access_token_expires(self): self.persist.remove("oauth_access_token_expires") @property def username(self): return self.persist["oauth_username"] @username.setter def username(self, value): self.persist["oauth_username"] = value def is_authorized(self): return bool(self.refresh_token and self.refresh_token_scopes) def is_logged_in(self): return self.is_authorized() and bool(self.username) def revoke_tokens(self): # TODO actually revoke the tokens on MB (I think it's not implementented there) self.forget_refresh_token() self.forget_access_token() def forget_refresh_token(self): del self.refresh_token del self.refresh_token_scopes def forget_access_token(self): del self.access_token del self.access_token_expires def get_access_token(self, callback): if not self.is_authorized(): callback(access_token=None) else: if self.access_token and time.time() < self.access_token_expires: callback(access_token=self.access_token) else: self.forget_access_token() self.refresh_access_token(callback) def get_authorization_url(self, scopes): params = {"response_type": "code", "client_id": MUSICBRAINZ_OAUTH_CLIENT_ID, "redirect_uri": "urn:ietf:wg:oauth:2.0:oob", "scope": scopes} url = build_qurl(self.host, self.port, path="/oauth2/authorize", queryargs=params) return bytes(url.toEncoded()).decode() def set_refresh_token(self, refresh_token, scopes): log.debug("OAuth: got refresh_token %s with scopes %s", refresh_token, scopes) self.refresh_token = refresh_token self.refresh_token_scopes = scopes def set_access_token(self, access_token, expires_in): log.debug("OAuth: got access_token %s that expires in %s seconds", access_token, expires_in) self.access_token = access_token self.access_token_expires = int(time.time() + expires_in - 60) def refresh_access_token(self, callback): log.debug("OAuth: refreshing access_token with a refresh_token %s", self.refresh_token) path = "/oauth2/token" url = QUrl() url_query = QUrlQuery() url_query.addQueryItem("grant_type", "refresh_token") url_query.addQueryItem("refresh_token", self.refresh_token) url_query.addQueryItem("client_id", MUSICBRAINZ_OAUTH_CLIENT_ID) url_query.addQueryItem("client_secret", MUSICBRAINZ_OAUTH_CLIENT_SECRET) url.setQuery(url_query.query(QUrl.FullyEncoded)) data = url.query() self.webservice.post(self.host, self.port, path, data, partial(self.on_refresh_access_token_finished, callback), mblogin=True, priority=True, important=True, request_mimetype="application/x-www-form-urlencoded") def on_refresh_access_token_finished(self, callback, data, http, error): access_token = None try: if error: log.error("OAuth: access_token refresh failed: %s", data) if http.attribute(QNetworkRequest.HttpStatusCodeAttribute) == 400: response = load_json(data) if response["error"] == "invalid_grant": self.forget_refresh_token() else: access_token = data["access_token"] self.set_access_token(access_token, data["expires_in"]) except Exception as e: log.error('OAuth: Unexpected error handling access token response: %r', e) finally: callback(access_token=access_token) def exchange_authorization_code(self, authorization_code, scopes, callback): log.debug("OAuth: exchanging authorization_code %s for an access_token", authorization_code) path = "/oauth2/token" url = QUrl() url_query = QUrlQuery() url_query.addQueryItem("grant_type", "authorization_code") url_query.addQueryItem("code", authorization_code) url_query.addQueryItem("client_id", MUSICBRAINZ_OAUTH_CLIENT_ID) url_query.addQueryItem("client_secret", MUSICBRAINZ_OAUTH_CLIENT_SECRET) url_query.addQueryItem("redirect_uri", "urn:ietf:wg:oauth:2.0:oob") url.setQuery(url_query.query(QUrl.FullyEncoded)) data = url.query() self.webservice.post(self.host, self.port, path, data, partial(self.on_exchange_authorization_code_finished, scopes, callback), mblogin=True, priority=True, important=True, request_mimetype="application/x-www-form-urlencoded") def on_exchange_authorization_code_finished(self, scopes, callback, data, http, error): successful = False try: if error: log.error("OAuth: authorization_code exchange failed: %s", data) else: self.set_refresh_token(data["refresh_token"], scopes) self.set_access_token(data["access_token"], data["expires_in"]) successful = True except Exception as e: log.error('OAuth: Unexpected error handling authorization code response: %r', e) finally: callback(successful=successful) def fetch_username(self, callback): log.debug("OAuth: fetching username") path = "/oauth2/userinfo" self.webservice.get(self.host, self.port, path, partial(self.on_fetch_username_finished, callback), mblogin=True, priority=True, important=True) def on_fetch_username_finished(self, callback, data, http, error): successful = False try: if error: log.error("OAuth: username fetching failed: %s", data) else: self.username = data["sub"] log.debug("OAuth: got username %s", self.username) successful = True except Exception as e: log.error('OAuth: Unexpected error handling username fetch response: %r', e) finally: callback(successful) picard-release-2.3.1/picard/plugin.py000066400000000000000000000156371362601763300175320ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007-2008 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009, 2014, 2017-2020 Philipp Wolfer # Copyright (C) 2011 johnny64 # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013 Sebastian Ramacher # Copyright (C) 2013 Wieland Hoffmann # Copyright (C) 2013 brainz34 # Copyright (C) 2013-2014 Sophist-UK # Copyright (C) 2014 Johannes Dewender # Copyright (C) 2014 Shadab Zafar # Copyright (C) 2014-2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict import os.path from picard import ( config, log, ) from picard.const import USER_PLUGIN_DIR from picard.version import ( Version, VersionError, ) _PLUGIN_MODULE_PREFIX = "picard.plugins." _PLUGIN_MODULE_PREFIX_LEN = len(_PLUGIN_MODULE_PREFIX) _extension_points = [] def _unregister_module_extensions(module): for ep in _extension_points: ep.unregister_module(module) class ExtensionPoint(object): def __init__(self, label=None): if label is None: import uuid label = uuid.uuid4() self.label = label self.__dict = defaultdict(list) _extension_points.append(self) def register(self, module, item): if module.startswith(_PLUGIN_MODULE_PREFIX): name = module[_PLUGIN_MODULE_PREFIX_LEN:] log.debug("ExtensionPoint: %s register <- plugin=%r item=%r" % (self.label, name, item)) else: name = None # uncomment to debug internal extensions loaded at startup # print("ExtensionPoint: %s register <- item=%r" % (self.label, item)) self.__dict[name].append(item) def unregister_module(self, name): try: del self.__dict[name] except KeyError: # NOTE: needed due to defaultdict behaviour: # >>> d = defaultdict(list) # >>> del d['a'] # KeyError: 'a' # >>> d['a'] # [] # >>> del d['a'] # >>> #^^ no exception, after first read pass def __iter__(self): enabled_plugins = config.setting["enabled_plugins"] if config.setting else [] for name in self.__dict: if name is None or name in enabled_plugins: for item in self.__dict[name]: yield item class PluginShared(object): def __init__(self): super().__init__() class PluginWrapper(PluginShared): def __init__(self, module, plugindir, file=None, manifest_data=None): super().__init__() self.module = module self.compatible = False self.dir = os.path.normpath(plugindir) self._file = file self.data = manifest_data or self.module.__dict__ @property def name(self): try: return self.data['PLUGIN_NAME'] except KeyError: return self.module_name @property def module_name(self): name = self.module.__name__ if name.startswith(_PLUGIN_MODULE_PREFIX): name = name[_PLUGIN_MODULE_PREFIX_LEN:] return name @property def author(self): try: return self.data['PLUGIN_AUTHOR'] except KeyError: return "" @property def description(self): try: return self.data['PLUGIN_DESCRIPTION'] except KeyError: return "" @property def version(self): try: return Version.from_string(self.data['PLUGIN_VERSION']) except (KeyError, VersionError): return Version(0, 0, 0) @property def api_versions(self): try: return self.data['PLUGIN_API_VERSIONS'] except KeyError: return [] @property def file(self): if not self._file: return self.module.__file__ else: return self._file @property def license(self): try: return self.data['PLUGIN_LICENSE'] except KeyError: return "" @property def license_url(self): try: return self.data['PLUGIN_LICENSE_URL'] except KeyError: return "" @property def files_list(self): return self.file[len(self.dir)+1:] @property def is_user_installed(self): return self.dir == USER_PLUGIN_DIR class PluginData(PluginShared): """Used to store plugin data from JSON API""" def __init__(self, d, module_name): self.__dict__ = d super().__init__() self.module_name = module_name def __getattribute__(self, name): try: return super().__getattribute__(name) except AttributeError: log.debug('Attribute %r not found for plugin %r', name, self.module_name) return None @property def version(self): try: return Version.from_string(self.__dict__['version']) except (KeyError, VersionError): return Version(0, 0, 0) @property def files_list(self): return ", ".join(self.files.keys()) class PluginPriority: """ Define few priority values for plugin functions execution order Those with higher values are executed first Default priority is PluginPriority.NORMAL """ HIGH = 100 NORMAL = 0 LOW = -100 class PluginFunctions: """ Store ExtensionPoint in a defaultdict with priority as key run() method will execute entries with higher priority value first """ def __init__(self, label=None): self.functions = defaultdict(lambda: ExtensionPoint(label=label)) def register(self, module, item, priority=PluginPriority.NORMAL): self.functions[priority].register(module, item) def run(self, *args, **kwargs): """Execute registered functions with passed parameters honouring priority""" for priority, functions in sorted(self.functions.items(), key=lambda i: i[0], reverse=True): for function in functions: function(*args, **kwargs) picard-release-2.3.1/picard/pluginmanager.py000066400000000000000000000413051362601763300210540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2014 Shadab Zafar # Copyright (C) 2015-2019 Laurent Monin # Copyright (C) 2019 Wieland Hoffmann # Copyright (C) 2019-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import imp import importlib import json import os.path import shutil import tempfile import zipfile import zipimport from PyQt5 import QtCore from picard import log from picard.const import ( PLUGINS_API, USER_PLUGIN_DIR, ) from picard.plugin import ( _PLUGIN_MODULE_PREFIX, PluginData, PluginWrapper, _unregister_module_extensions, ) import picard.plugins from picard.version import ( Version, VersionError, ) _SUFFIXES = tuple(importlib.machinery.all_suffixes()) _PACKAGE_ENTRIES = ("__init__.py", "__init__.pyc", "__init__.pyo") _PLUGIN_PACKAGE_SUFFIX = ".picard" _PLUGIN_PACKAGE_SUFFIX_LEN = len(_PLUGIN_PACKAGE_SUFFIX) _FILEEXTS = ('.py', '.pyc', '.pyo', '.zip') _UPDATE_SUFFIX = '.update' _UPDATE_SUFFIX_LEN = len(_UPDATE_SUFFIX) _extension_points = [] def is_update(path): return path.endswith(_UPDATE_SUFFIX) def strip_update_suffix(path): if not is_update(path): return path return path[:-_UPDATE_SUFFIX_LEN] def is_zip(path): return path.endswith('.zip') def strip_zip_suffix(path): if not is_zip(path): return path return path[:-4] def is_package(path): return path.endswith(_PLUGIN_PACKAGE_SUFFIX) def strip_package_suffix(path): if not is_package(path): return path return path[:-_PLUGIN_PACKAGE_SUFFIX_LEN] def is_zipped_package(path): return path.endswith(_PLUGIN_PACKAGE_SUFFIX + '.zip') def _plugin_name_from_path(path): path = os.path.normpath(path) if is_zip(path): name = os.path.basename(strip_zip_suffix(path)) if is_package(name): return strip_package_suffix(name) else: return name elif os.path.isdir(path): for entry in _PACKAGE_ENTRIES: if os.path.isfile(os.path.join(path, entry)): return os.path.basename(path) else: file = os.path.basename(path) if file in _PACKAGE_ENTRIES: return None name, ext = os.path.splitext(file) if ext in _SUFFIXES: return name return None def load_manifest(archive_path): archive = zipfile.ZipFile(archive_path) manifest_data = None with archive.open('MANIFEST.json') as f: manifest_data = json.loads(str(f.read().decode())) return manifest_data def zip_import(path): if (not is_zip(path) or not os.path.isfile(path)): return (None, None, None) try: zip_importer = zipimport.zipimporter(path) plugin_name = _plugin_name_from_path(path) manifest_data = None if is_zipped_package(path): try: manifest_data = load_manifest(path) except Exception as why: log.warning("Failed to load manifest data from json: %s", why) return (zip_importer, plugin_name, manifest_data) except zipimport.ZipImportError as why: log.error("ZIP import error: %s", why) return (None, None, None) def _compatible_api_versions(api_versions): versions = [Version.from_string(v) for v in list(api_versions)] return set(versions) & set(picard.api_versions_tuple) class PluginManager(QtCore.QObject): plugin_installed = QtCore.pyqtSignal(PluginWrapper, bool) plugin_updated = QtCore.pyqtSignal(str, bool) plugin_removed = QtCore.pyqtSignal(str, bool) plugin_errored = QtCore.pyqtSignal(str, str, bool) def __init__(self, plugins_directory=None): super().__init__() self.plugins = [] self._available_plugins = None # None=never loaded, [] = empty if plugins_directory is None: plugins_directory = USER_PLUGIN_DIR self.plugins_directory = os.path.normpath(plugins_directory) @property def available_plugins(self): return self._available_plugins def plugin_error(self, name, error, *args, **kwargs): """Log a plugin loading error for the plugin `name` and signal the error via the `plugin_errored` signal. A string consisting of all `args` interpolated into `error` will be passed to the function given via the `log_func` keyword argument (default: log.error) and as the error message to the `plugin_errored` signal.""" error = error % args log_func = kwargs.get('log_func', log.error) log_func(error) self.plugin_errored.emit(name, error, False) def _marked_for_update(self): for file in os.listdir(self.plugins_directory): if file.endswith(_UPDATE_SUFFIX): source_path = os.path.join(self.plugins_directory, file) target_path = strip_update_suffix(source_path) plugin_name = _plugin_name_from_path(target_path) if plugin_name: yield (source_path, target_path, plugin_name) else: log.error('Cannot get plugin name from %r', source_path) def handle_plugin_updates(self): for source_path, target_path, plugin_name in self._marked_for_update(): self._remove_plugin(plugin_name) os.rename(source_path, target_path) log.debug('Updating plugin %r (%r))', plugin_name, target_path) def load_plugins_from_directory(self, plugindir): plugindir = os.path.normpath(plugindir) if not os.path.isdir(plugindir): log.info("Plugin directory %r doesn't exist", plugindir) return if plugindir == self.plugins_directory: # .update trick is only for plugins installed through the Picard UI # and only for plugins in plugins_directory (USER_PLUGIN_DIR by default) self.handle_plugin_updates() # now load found plugins names = set() for path in [os.path.join(plugindir, file) for file in os.listdir(plugindir)]: name = _plugin_name_from_path(path) if name: names.add(name) log.debug("Looking for plugins in directory %r, %d names found", plugindir, len(names)) for name in sorted(names): try: self._load_plugin_from_directory(name, plugindir) except Exception: self.plugin_error(name, _("Unable to load plugin '%s'"), name, log_func=log.exception) def _get_plugin_index_by_name(self, name): for index, plugin in enumerate(self.plugins): if name == plugin.module_name: return (plugin, index) return (None, None) def _load_plugin_from_directory(self, name, plugindir): module_file = None zipfilename = os.path.join(plugindir, name + '.zip') (zip_importer, module_name, manifest_data) = zip_import(zipfilename) if zip_importer: name = module_name if not zip_importer.find_module(name): error = _("Failed loading zipped plugin %r from %r") self.plugin_error(name, error, name, zipfilename) return None module_pathname = zip_importer.get_filename(name) else: try: info = imp.find_module(name, [plugindir]) module_file = info[0] module_pathname = info[1] except ImportError: error = _("Failed loading plugin %r in %r") self.plugin_error(name, error, name, [plugindir]) return None plugin = None try: existing_plugin, existing_plugin_index = self._get_plugin_index_by_name(name) if existing_plugin: log.warning("Module %r conflict: unregistering previously" " loaded %r version %s from %r", existing_plugin.module_name, existing_plugin.name, existing_plugin.version, existing_plugin.file) _unregister_module_extensions(name) full_module_name = _PLUGIN_MODULE_PREFIX + name if zip_importer: plugin_module = zip_importer.load_module(full_module_name) else: plugin_module = imp.load_module(full_module_name, *info) plugin = PluginWrapper(plugin_module, plugindir, file=module_pathname, manifest_data=manifest_data) compatible_versions = _compatible_api_versions(plugin.api_versions) if compatible_versions: log.debug("Loading plugin %r version %s, compatible with API: %s", plugin.name, plugin.version, ", ".join([v.to_string(short=True) for v in sorted(compatible_versions)])) plugin.compatible = True setattr(picard.plugins, name, plugin_module) if existing_plugin: self.plugins[existing_plugin_index] = plugin else: self.plugins.append(plugin) else: error = _("Plugin '%s' from '%s' is not compatible with this " "version of Picard.") % (plugin.name, plugin.file) self.plugin_error(plugin.name, error, log_func=log.warning) except VersionError as e: error = _("Plugin %r has an invalid API version string : %s") self.plugin_error(name, error, name, e) except BaseException: error = _("Plugin %r") self.plugin_error(name, error, name, log_func=log.exception) if module_file is not None: module_file.close() return plugin def _get_existing_paths(self, plugin_name, fileexts): dirpath = os.path.join(self.plugins_directory, plugin_name) if not os.path.isdir(dirpath): dirpath = None filepaths = [os.path.join(self.plugins_directory, f) for f in os.listdir(self.plugins_directory) if f in [plugin_name + ext for ext in fileexts] ] return (dirpath, filepaths) def _remove_plugin_files(self, plugin_name, with_update=False): plugin_name = strip_zip_suffix(plugin_name) log.debug("Remove plugin files and dirs : %r", plugin_name) dirpath, filepaths = self._get_existing_paths(plugin_name, _FILEEXTS) if dirpath: if os.path.islink(dirpath): log.debug("Removing symlink %r", dirpath) os.remove(dirpath) elif os.path.isdir(dirpath): log.debug("Removing directory %r", dirpath) shutil.rmtree(dirpath) if filepaths: for filepath in filepaths: log.debug("Removing file %r", filepath) os.remove(filepath) if with_update: update = filepath + _UPDATE_SUFFIX if os.path.isfile(update): log.debug("Removing file %r", update) os.remove(update) def _remove_plugin(self, plugin_name, with_update=False): self._remove_plugin_files(plugin_name, with_update) _unregister_module_extensions(plugin_name) self.plugins = [p for p in self.plugins if p.module_name != plugin_name] def remove_plugin(self, plugin_name, with_update=False): self._remove_plugin(plugin_name, with_update=with_update) self.plugin_removed.emit(plugin_name, False) def _install_plugin_zip(self, plugin_name, plugin_data, update=False): # zipped module from download zip_plugin = plugin_name + '.zip' dst = os.path.join(self.plugins_directory, zip_plugin) if update: dst += _UPDATE_SUFFIX if os.path.isfile(dst): os.remove(dst) with tempfile.NamedTemporaryFile(dir=self.plugins_directory) as zipfile: zipfile.write(plugin_data) zipfile.flush() os.fsync(zipfile.fileno()) try: os.link(zipfile.name, dst) except OSError: with open(dst, 'wb') as dstfile: zipfile.seek(0) shutil.copyfileobj(zipfile, dstfile) log.debug("Plugin (zipped) saved to %r", dst) def _install_plugin_file(self, path, update=False): dst = os.path.join(self.plugins_directory, os.path.basename(path)) if update: dst += _UPDATE_SUFFIX if os.path.isfile(dst): os.remove(dst) shutil.copy2(path, dst) log.debug("Plugin (file) saved to %r", dst) def _install_plugin_dir(self, plugin_name, path, update=False): dst = os.path.join(self.plugins_directory, plugin_name) if update: dst += _UPDATE_SUFFIX if os.path.isdir(dst): shutil.rmtree(dst) shutil.copytree(path, dst) log.debug("Plugin (directory) saved to %r", dst) def install_plugin(self, path, update=False, plugin_name=None, plugin_data=None): """ path is either: 1) /some/dir/name.py 2) /some/dir/name (directory containing __init__.py) 3) /some/dir/name.zip (containing either 1 or 2) """ assert path or plugin_name, "path is required if plugin_name is empty" if not plugin_name: plugin_name = _plugin_name_from_path(path) if plugin_name: try: if plugin_data: self._install_plugin_zip(plugin_name, plugin_data, update=update) elif os.path.isfile(path): self._install_plugin_file(path, update=update) elif os.path.isdir(path): self._install_plugin_dir(plugin_name, path, update=update) except (OSError, IOError) as why: log.error("Unable to copy plugin '%s' to %r: %s" % (plugin_name, self.plugins_directory, why)) return if not update: try: installed_plugin = self._load_plugin_from_directory(plugin_name, self.plugins_directory) if not installed_plugin: raise RuntimeError("Failed loading newly installed plugin %s" % plugin_name) except Exception as e: log.error("Unable to load plugin '%s': %s", plugin_name, e) self._remove_plugin(plugin_name) else: self.plugin_installed.emit(installed_plugin, False) else: self.plugin_updated.emit(plugin_name, False) def query_available_plugins(self, callback=None): self.tagger.webservice.get( PLUGINS_API['host'], PLUGINS_API['port'], PLUGINS_API['endpoint']['plugins'], partial(self._plugins_json_loaded, callback=callback), priority=True, important=True ) def is_available(self, plugin_name): return any(p.module_name == plugin_name for p in self._available_plugins) def _plugins_json_loaded(self, response, reply, error, callback=None): if error: self.tagger.window.set_statusbar_message( N_("Error loading plugins list: %(error)s"), {'error': reply.errorString()}, echo=log.error ) self._available_plugins = [] else: try: self._available_plugins = [PluginData(data, key) for key, data in response['plugins'].items() if _compatible_api_versions(data['api_versions'])] except (AttributeError, KeyError, TypeError): self._available_plugins = [] if callback: callback() # pylint: disable=no-self-use def enabled(self, name): return True picard-release-2.3.1/picard/plugins/000077500000000000000000000000001362601763300173275ustar00rootroot00000000000000picard-release-2.3.1/picard/plugins/__init__.py000066400000000000000000000014741362601763300214460ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. picard-release-2.3.1/picard/releasegroup.py000066400000000000000000000140121362601763300207130ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013, 2018-2020 Laurent Monin # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2017 Wieland Hoffmann # Copyright (C) 2017-2018 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict from functools import partial from itertools import combinations import traceback from picard import log from picard.dataobj import DataObject from picard.mbjson import ( countries_from_node, label_info_from_node, media_formats_from_node, ) from picard.metadata import Metadata from picard.util import ( limited_join, uniqify, ) class ReleaseGroup(DataObject): def __init__(self, rg_id): super().__init__(rg_id) self.metadata = Metadata() self.loaded = False self.versions = [] self.version_headings = '' self.loaded_albums = set() self.refcount = 0 def load_versions(self, callback): kwargs = {"release-group": self.id, "limit": 100} self.tagger.mb_api.browse_releases(partial(self._request_finished, callback), **kwargs) def _parse_versions(self, document): """Parse document and return a list of releases""" del self.versions[:] data = [] namekeys = ("tracks", "year", "country", "format", "label", "catnum") headings = { "tracks": N_('Tracks'), "year": N_('Year'), "country": N_('Country'), "format": N_('Format'), "label": N_('Label'), "catnum": N_('Cat No'), } extrakeys = ("packaging", "barcode", "disambiguation") try: releases = document['releases'] except (TypeError, KeyError): releases = [] max_tracks = 10 for node in releases: labels, catnums = label_info_from_node(node['label-info']) countries = countries_from_node(node) if len(node['media']) > max_tracks: tracks = "+".join([str(m['track-count']) for m in node['media'][:max_tracks]]) + '+…' else: tracks = "+".join([str(m['track-count']) for m in node['media']]) formats = [] for medium in node['media']: if "format" in medium: formats.append(medium['format']) release = { "id": node['id'], "year": node['date'][:4] if "date" in node else "????", "country": limited_join(countries, 10, '+', '…') if countries else node.get('country', '') or "??", "format": media_formats_from_node(node['media']), "label": ", ".join([' '.join(x.split(' ')[:2]) for x in set(labels)]), "catnum": ", ".join(set(catnums)), "tracks": tracks, "barcode": node.get('barcode', '') or _('[no barcode]'), "packaging": node.get('packaging', '') or '??', "disambiguation": node.get('disambiguation', ''), "_disambiguate_name": list(), "totaltracks": sum([m['track-count'] for m in node['media']]), "countries": countries, "formats": formats, } data.append(release) versions = defaultdict(list) for release in data: name = " / ".join([release[k] for k in namekeys]).replace("&", "&&") if name == release["tracks"]: name = "%s / %s" % (_('[no release info]'), name) versions[name].append(release) # de-duplicate names if possible for name, releases in versions.items(): for a, b in combinations(releases, 2): for key in extrakeys: (value1, value2) = (a[key], b[key]) if value1 != value2: a['_disambiguate_name'].append(value1) b['_disambiguate_name'].append(value2) for name, releases in versions.items(): for release in releases: dis = " / ".join(filter(None, uniqify(release['_disambiguate_name']))).replace("&", "&&") disname = name if not dis else name + ' / ' + dis version = { 'id': release['id'], 'name': disname, 'totaltracks': release['totaltracks'], 'countries': release['countries'], 'formats': release['formats'], } self.versions.append(version) self.version_headings = " / ".join(_(headings[k]) for k in namekeys) def _request_finished(self, callback, document, http, error): try: if error: log.error("%r", http.errorString()) else: try: self._parse_versions(document) except BaseException: error = True log.error(traceback.format_exc()) finally: self.loaded = True callback() def remove_album(self, album_id): self.loaded_albums.discard(album_id) self.refcount -= 1 if self.refcount == 0: del self.tagger.release_groups[self.id] picard-release-2.3.1/picard/resources.py000066400000000000000000041761211362601763300202460ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Resource object code # # Created by: The Resource Compiler for PyQt5 (Qt v5.14.0) # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore qt_resource_data = b"\ \x00\x00\x11\x83\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ \x00\x00\x11\x4a\x49\x44\x41\x54\x78\xda\xed\x5d\xf9\x73\x13\xd7\ \x1d\x77\x9b\x4c\x92\xa6\x9d\xa6\x4d\x3a\xd3\xa6\xc7\xaf\x9d\xf6\ \xe7\xf4\x48\x8f\xc9\xa4\x6d\xce\xce\xb4\x39\xda\xfc\x01\x9d\x4c\ \x7f\xe9\x4c\x3a\x60\x2b\x50\x08\x4d\x84\x25\x0e\xdb\x84\x00\x01\ \xd2\xc4\x21\xe1\xca\x65\x30\xc6\x80\x39\x7c\xec\xae\x6c\x49\x36\ \xb6\x6c\x30\x60\x30\x60\x5b\x36\x36\xb2\x75\xac\xc0\xc6\xc6\x37\ \xaf\xef\xbb\x92\xec\xdd\x67\x49\xbb\x92\xf6\xed\xae\xd6\xfb\x9d\ \xf9\xce\x68\x74\xac\xde\xdb\xef\x77\xdf\xfb\x7e\x3f\xdf\xe3\x15\ \x14\x58\x64\x91\x45\x16\x59\x64\x91\x45\x16\x59\x64\x91\x45\x16\ \x59\x64\x91\x45\x16\x59\x64\x91\x45\x16\x99\x86\x6c\x65\x67\xbe\ \x59\xe8\x74\xfd\xa4\x68\x23\xfb\xb3\xa2\x62\xe6\x09\x9b\x83\x7d\ \xc6\xe6\x64\x5e\x12\x18\xbf\x86\xf7\xe0\x33\xf8\x0e\x7c\xd7\xba\ \x63\x79\x4a\x2b\xec\xec\x77\x56\x3a\xd8\x17\x8a\x1c\xdc\x4a\x2c\ \xd8\xff\x15\x39\x59\xa6\xc8\xc1\x06\x30\xa3\x0c\x39\x20\xfc\xd6\ \xc9\x7e\x60\x73\xb2\x2b\x8a\xd6\x33\xcf\xc3\xb5\xad\x3b\x6c\x30\ \xb2\xdb\x8f\x3f\x0c\x4f\x70\xa1\x83\xdd\x8c\xd9\x8d\x05\x37\x93\ \x85\xb0\x95\xf2\x1c\x66\x5f\x61\x31\xb7\xbd\xd0\xc9\xbd\xb6\x7a\ \x73\xdd\x23\x96\x04\x74\xa0\x37\x76\x9c\x7c\x10\x0b\xe2\xef\x45\ \xc5\xec\x31\xca\x02\x97\x61\x6e\x1a\x73\x75\xa1\x93\xf9\x1b\x8c\ \xc9\x92\x0c\xed\x7d\xbc\x98\xfb\x0d\x2c\xc9\xf8\xe6\x47\x95\x08\ \xe8\x4d\x27\x87\xec\xdb\x3d\x68\xeb\x5e\x1f\x2a\x3f\x72\x01\x1d\ \x38\xd5\x85\xbe\xa8\xbb\x82\x0e\xbb\xae\xa1\xa3\x9e\x1e\x74\xa2\ \xb5\x4f\x60\x78\x0d\xef\xc1\x67\xf0\x9d\xf2\x23\x9d\xc2\x6f\xec\ \xdb\xbd\xc2\x35\x14\x2a\x44\xd4\xe6\x60\x76\x17\x3a\xd9\x27\x2d\ \x49\xa9\x49\x08\x7d\xad\xd0\xc1\xfc\x19\x3f\x69\x1e\x39\x21\xbc\ \xb3\xcd\x83\x76\x7e\x71\x0e\x1d\xe6\xae\xa2\x86\x8b\x03\xa8\xa5\ \x7f\x18\xb5\x0e\x8c\xe4\xc4\x70\x0d\xb8\xd6\x21\x7c\xcd\x5d\xf8\ \xda\x6f\xbf\xe7\x96\x55\x06\x61\x2b\x5a\xcf\xbd\x68\x09\x2f\xa7\ \xbd\xdd\xfe\x75\x58\x5a\xf1\x0d\xed\x48\x75\xa3\x6d\xf8\xe9\xdc\ \xf2\x49\x1b\xfa\xb2\xa1\x1b\xb1\x5d\x83\x39\x0b\x5b\x29\xc3\x7f\ \x7d\x85\xff\xb3\x0c\xff\xb7\x2d\xfd\x0a\xe1\x2b\x72\x30\xaf\xc2\ \x5c\x2c\x89\x66\x40\x6f\x16\x33\xbf\xc3\x37\xef\x7c\xaa\x1b\xeb\ \xd8\xe9\x15\x96\x6a\x57\xf7\x90\x66\x42\x4f\xc5\xae\x2b\x83\x68\ \x3f\x1e\x0b\x8c\x29\x8d\x22\x74\xc0\xf6\x65\x49\x56\x86\x8a\xec\ \xec\xf7\x8a\x9c\xdc\x1e\x7c\xc3\xee\x2d\x79\xda\x31\x6f\xdd\xe7\ \x43\xa7\xda\xfd\xba\x0b\x3d\x15\x9f\xf2\xf9\x05\xdb\xc1\x96\x54\ \x09\x98\x79\x6c\xbf\x94\xaf\xd9\x58\xff\x98\x25\xe9\x24\xfb\xbc\ \xcd\xc1\xfd\x13\xef\xf3\x7c\xb2\x65\x7e\xfb\xc1\x0e\x54\xd7\x39\ \x60\x58\xc1\x93\x5c\x7b\x7e\x00\x8f\xb9\x3d\xd5\xf6\x10\xc1\x0a\ \xf2\x3a\xcc\xd9\x12\x3c\xa6\x95\xf6\xd3\x8f\x16\x16\xb3\x47\x93\ \x2d\x9d\xa5\xe5\x3e\xc4\x5c\xbc\x91\x37\x82\x27\xb9\x01\x8f\x1d\ \x6c\x94\xa4\x86\x62\x31\x7b\xe4\x3f\x9b\x9a\xbe\xbb\xbc\x85\xef\ \x64\x7f\x81\x97\xfc\x5e\xf2\xe6\xac\x29\x75\xa3\x8f\x0f\xf7\xa0\ \x53\xcd\x51\x74\xd6\x3f\x92\xb7\x0a\x90\x60\x70\x33\xdf\xde\xea\ \x4e\xe2\x2d\x70\x03\x85\xce\x86\xdf\x2e\xcb\x25\x1f\xdf\x80\x22\ \x12\xc4\xc1\xdb\x00\xda\xbe\xef\x12\x3a\xd6\x18\x41\x35\xee\xa8\ \xc0\xec\xc5\x70\xde\x2b\x00\xb0\xa7\x27\x80\x3e\xaa\xbc\x90\x64\ \x5b\x10\xc0\xa4\x95\xcb\x46\xf6\xaf\x55\x54\xdc\x27\x60\xf4\xe4\ \x53\x5f\xe2\x46\x07\x8e\x0d\x2c\x08\x3e\xc1\x27\x3d\x51\xd4\x62\ \x82\x55\x20\xc1\x00\x3c\xad\xdb\xd2\xb4\x74\x5b\x70\xb2\x9f\xda\ \xed\xec\xfd\xa6\x87\x70\xb1\xf0\x2b\xc8\xc9\x3b\x77\xb6\xa1\x23\ \x4c\x68\x89\xf0\x13\xcc\x74\x86\x4d\xa3\x00\xc0\x8d\x57\x6f\x0a\ \x18\x42\x12\xbb\xe0\xe8\xca\xad\xde\x6f\x98\x52\xf8\x10\x38\xc1\ \xc2\xe7\x48\xd7\x6e\xd7\xc1\xcb\xa8\xa6\x89\x4f\x29\xfc\x04\x37\ \xf7\x8c\x98\x4a\x09\xce\xf6\x0f\xa3\x4f\xaa\x2f\x25\x73\x19\x59\ \xd3\x05\x99\x60\x42\xd8\xe0\x69\x27\xdd\xbb\x3d\xd8\xd0\x93\x13\ \x7c\x82\xeb\xdb\x23\xa6\x52\x80\x04\x03\x8a\x69\xdb\xc0\x91\xc6\ \x61\xbb\x69\x94\xc0\x6e\xaf\x78\x00\x4f\xaa\x4e\x1a\xa4\x71\xa1\ \xbd\x55\x7d\x8a\x85\x9f\x60\xcf\xb5\xa0\x29\x95\x00\xbc\x84\x55\ \x1b\x39\x12\xf8\xe2\xb0\x4d\xf0\x50\xde\x1b\x7c\xe0\xef\x8a\x27\ \xb6\x7a\x53\x23\xfa\xbc\x66\x30\x63\xe1\x03\xd7\xb6\xf2\xa6\x54\ \x00\xe0\x9a\xb6\x3e\x6c\x08\x37\x4a\x95\xa0\x98\x3d\x0c\xf7\x30\ \x7f\x5d\x3d\x27\x5b\x2e\x79\xf2\xf1\x52\xf7\x59\x96\xc2\x4f\x70\ \x53\x77\xc8\xb4\x4a\x00\x30\xf7\xea\x4d\x2e\xc2\x3b\xe0\x3e\xcc\ \x4f\x5c\x3f\xe6\xe7\x4b\xf6\xfc\x7d\xd5\xfd\x39\x09\x1f\xf8\x74\ \x8b\x79\x57\x01\xe0\x2a\xf7\xf5\x25\x36\x01\xa4\xa4\xe5\x19\xc2\ \xd7\xf0\xab\x18\xc0\xb1\x68\xed\x97\x1f\xea\xc9\x59\xf8\x09\x76\ \x5d\x0a\x9b\x5a\x09\x2a\xd8\xab\xa4\x77\x30\x93\x37\xd1\x44\xc0\ \xb7\xf1\x80\xfb\xc5\x1a\x2c\xb8\x7a\x2a\x09\x1f\xf8\x54\x33\x8f\ \xdd\xa8\x11\x53\x2b\x01\xb8\x88\x04\x50\xe4\x37\x7e\xec\x20\x06\ \xf1\x56\x91\x20\xcf\x09\x37\xaf\xaa\x02\x00\x73\x17\xcc\xbd\x0a\ \x00\x4e\x50\xb6\xa7\x95\xc4\x08\x8e\x1b\x3a\x8a\x18\x0b\xe9\x2e\ \x0e\x78\x6d\x49\x13\xaa\x62\x82\xaa\x0b\x5f\x80\x88\xbd\x51\xd4\ \xd2\x67\xee\x55\xa0\xb1\x7b\x08\xbd\x45\xc0\xc6\x42\x28\xd9\x88\ \x04\x89\x0e\x78\x80\x61\xd1\x92\x85\x0e\x1e\xbf\x41\x45\xf8\x0b\ \x10\xf1\xf9\x88\xa9\x15\x20\x11\x3b\x90\x06\x90\x38\x1e\x12\x67\ \x8c\x67\xf5\xc7\x32\x79\x16\x06\x0a\x51\x3d\x9a\xc2\x17\xd8\x13\ \x45\xcd\xbd\x41\xd3\x2b\x01\x44\x11\x09\x7b\xa0\xdc\x88\x39\x7c\ \x0b\x69\x5c\x6f\x95\xba\x51\xb5\x2b\x42\x5f\x01\x32\x80\x88\xcf\ \x0d\x85\x50\x77\x30\x8a\xfa\xf9\x31\x14\x18\x1d\x47\xa1\x3b\x77\ \x51\x64\x7c\x52\x60\x78\x0d\xef\xc1\x67\xf0\x1d\xf8\xae\x91\x14\ \xc0\xdb\x1b\x40\xeb\xde\x75\x4b\xd2\xcb\x0c\xe3\x15\x40\xc6\x2b\ \x99\xc0\xb9\xef\xa8\x5f\x13\xe1\x2f\x42\xc4\xc9\x05\x06\xc2\x0c\ \x62\xe1\x4e\xce\xcc\xa2\x4c\xe9\x2e\xfe\x4d\xf0\xce\x84\x70\x0d\ \x23\x28\x41\x65\xe3\xf5\x25\x89\xa6\x86\x30\x08\x85\x0a\x1d\xd1\ \xc0\x36\xec\xf6\x69\x2a\x7c\xe0\x33\x22\x88\xb8\x63\x30\x84\x6e\ \xde\x1e\x47\xd3\x73\x73\x48\x2d\x82\x6b\xc1\x35\xe1\xda\x7a\x2a\ \xc1\x96\xa5\x5e\xc1\xcb\x46\x70\xfb\x3a\xc4\x68\x5f\x65\xfd\xb0\ \xe6\x0a\x20\x84\x8b\xaf\x85\xd1\xc8\xd8\x04\x9a\xbf\x77\x0f\xd1\ \x22\xb8\xf6\xf0\xe8\x04\x6a\x1f\xd4\xc7\xee\xa8\xbf\x70\x03\x50\ \x41\x49\xdd\x81\xae\xf2\x8f\x55\xec\x2c\x0e\x68\xc7\xc1\x0e\x21\ \x87\x0f\x7c\x74\xc8\xe4\xd1\x4a\xf8\x9d\xd7\xf0\x13\x3f\x33\x8f\ \xb4\xa2\x99\xb9\x79\xd4\x1b\xb9\xad\x8b\x12\x6c\x3b\xd0\x2e\x59\ \x05\xa0\x12\x5a\xcf\xe5\xbf\x49\x0c\xf7\x8a\x53\xb7\x5b\xfa\x82\ \x82\x9b\x56\x43\x51\x11\xce\x34\xdf\x42\x81\xf0\x34\xd2\x8b\xa2\ \x77\xa7\x34\xdf\x16\x6a\xcf\xf7\x93\x30\xb1\x57\x1f\xd0\x07\x0a\ \x35\x45\x03\x81\xa2\x8d\x64\x03\x6e\xee\x09\xa2\xfa\x0e\xf5\x3d\ \x02\x57\xc7\x28\x9a\x98\x9c\x47\x7a\xd3\xd4\xec\x1c\xba\x18\xd0\ \x16\x8f\x80\xe2\x13\x69\xd8\x98\xf9\xb5\x0e\x7e\xbf\x50\xa5\xbb\ \x30\x08\xb9\x8a\x1d\xf7\xd5\x20\xaa\x6d\x55\x47\x11\x3c\xe7\xc7\ \xf0\x92\x9f\xfd\x5e\x3f\x3f\x7f\x0f\xcd\xcc\xce\xa2\xe9\x38\xcf\ \x60\x21\xe6\x62\x3b\xcc\xce\xcf\xa3\xcb\x23\xbc\xa6\x61\x63\x29\ \x3a\xc8\xec\xd6\x23\xcb\x27\x92\x18\x40\xf1\xfb\x5e\x65\xf8\x36\ \xc0\x9b\x97\x43\xe8\x74\x73\xf6\xb1\x01\x6f\xe7\x18\x9a\x9b\xcf\ \x4c\x58\x73\x58\x40\xe3\x77\x27\x51\x74\x74\x0c\x05\xf9\x28\x1a\ \x8e\xf0\x49\x19\x3e\x8b\x8e\x8d\x09\xdf\x85\xdf\x64\x6a\x20\x6a\ \xa9\x04\xd2\x5a\x44\x8e\xd7\xb4\x3f\x01\x74\xc7\x10\x6b\x20\x14\ \x6a\x66\x14\xe8\x18\x08\x22\x57\x57\x48\x88\xea\x65\xba\xec\xcf\ \xcc\x2a\x17\xfe\xf4\xcc\x0c\xe2\xb1\xd0\x53\x09\x5c\x8e\xe1\xb7\ \x70\x8d\x4c\x56\x02\xad\xb6\x83\xfd\x35\x5d\x64\x09\xdd\x2b\xda\ \x2d\xff\xb1\xce\x1c\x0b\xae\x5f\xb6\x55\xba\x67\xfd\xd8\x50\xec\ \x8c\x60\x8f\x41\x5e\x11\x6a\x5b\x6e\x29\xde\xf3\x67\xb1\xdf\x9e\ \x8b\xe0\x93\x29\xc2\xac\x42\x5c\x01\x6c\x02\x2d\xdc\x44\xa8\x4a\ \x16\xc7\x08\x20\xf5\x4e\x13\xe1\xff\xcb\xce\x7e\x4b\x5c\xd1\x03\ \xb5\x6f\x39\x37\x61\xe8\x95\xf7\x18\x86\x23\xca\x9e\xc4\x89\xc9\ \x29\x34\xc2\xf3\xaa\x09\x3f\xc1\x70\xcd\x89\xc9\x49\x65\xde\xc1\ \xc4\xa4\x26\xab\x40\xe9\xc7\x12\x60\x68\x0a\xfa\x25\xd1\xcf\xf6\ \x11\x3a\x70\x2d\x2e\x3d\x90\xd6\xac\x1a\xe6\x7d\x3d\x84\x6a\xdb\ \x22\x49\xfd\x7c\x25\x74\xfb\xce\x1d\xd5\x05\x4f\xf2\xed\x3b\xca\ \xc6\xa2\x05\x4e\x00\x2d\x6d\x24\x39\x97\x8e\x86\xe7\x34\xf0\xfd\ \x99\x52\xf1\x9f\xd2\xe8\xcc\x01\x1e\xc3\x99\xb3\xfc\xc2\xd2\xaf\ \xc4\xe2\x07\xe3\x8d\xb6\xf0\x13\x1c\x1d\xbb\xa3\x08\x2c\xa2\xbd\ \x15\x40\xf5\xb1\xb4\x9e\x80\xd9\xa8\x05\xf8\xe3\x13\xf7\xe4\xa1\ \x96\x11\x23\x78\x0c\x61\xe4\x0f\x4c\x1a\xe2\xc9\xcf\x66\x25\x18\ \x1e\x1d\xa7\xbe\x0a\x10\x3d\x8b\x5a\xa8\x0a\x1f\x1a\x25\xc6\x7b\ \xe5\xc5\x72\xfd\xbe\x3c\x47\x75\x72\x80\xb2\xc9\xf9\xe7\xb0\x2f\ \x6b\x2d\xfc\x04\x83\xbd\x21\xe7\x1a\xd2\x46\x0a\x77\x7e\xd1\x21\ \xe9\x63\x48\xb5\x99\x25\xb9\xff\x43\x37\x2e\x9a\x93\x83\x08\x9c\ \x9c\xb5\x3f\x92\x9d\xf0\x6e\x07\x22\xbc\x07\xff\xf6\x08\x30\xbc\ \xc6\xef\x8d\x66\x63\x18\xca\x79\x07\x30\x07\xda\x19\xc4\x9a\xd9\ \x01\x50\xc7\x2e\xfe\x33\x68\x9f\x46\x73\x72\x72\x21\xdd\x4c\x5d\ \xbd\x40\x24\x7a\x34\xc8\xf3\xcf\x76\x21\xf4\x00\x39\x37\x78\x2f\ \xc0\xf3\xcf\x0d\x47\xa2\xd5\x99\xba\x88\x69\xb1\x08\xec\x16\xd2\ \x8e\x10\x4a\xf1\x00\xe6\xdf\x14\x93\x3e\x17\xeb\xfa\xa1\x81\xa2\ \x1a\x7d\xf8\x52\x31\x24\x62\xc8\x81\x3c\x19\x08\x6a\x20\x10\x8d\ \xfe\x5e\xe9\x3c\x03\xa1\x5b\x4f\xe1\xdf\xdc\x50\x7a\x7d\x39\xb0\ \x88\x66\x52\x49\x8b\x7f\x58\x5a\x48\xe2\xe4\x76\xd1\x34\x00\xd9\ \xc4\x1f\xad\xdf\xee\xa1\xaa\xd9\x90\xc9\xa3\xd2\xd3\xdf\x1a\x0c\ \x06\xbf\x9f\xe9\x5c\x43\xa1\xd0\x0f\xf0\x6a\xe0\x53\xe4\x15\xc8\ \xac\x02\x90\xa7\x40\xf3\x5e\xbd\x83\x65\x21\xca\x17\xac\xa7\xa9\ \x00\xc3\x0b\xd1\xbf\xbd\x3e\xaa\x93\x4a\x97\xc6\x05\x38\xbd\xd2\ \x27\x3f\x1b\xe1\x4b\x95\x40\xd9\x4a\x90\x2e\x76\x00\xe9\x65\x34\ \xef\xd5\xbb\x9f\x4a\x9a\x4d\x0c\xd1\x44\x00\x17\xfe\x08\xfa\xe9\ \xd2\x9a\x10\x24\x65\xa6\x23\x08\xd6\x28\xda\xf3\x33\x58\xf6\x53\ \xd1\x70\x38\xfc\xb4\x92\xff\x1a\x97\x41\x09\x69\x26\x9a\x12\x59\ \xc3\xf7\xa8\x20\x82\xab\xec\xec\x8f\x73\x09\x00\xa9\xb9\xff\x47\ \x15\x2c\xff\x60\xf0\xa9\x35\xf7\xe1\x48\xe4\xb8\x3c\x38\x34\xa6\ \x9b\x1d\x00\x9d\x4a\xc5\xb2\x59\xb1\xa1\xf1\x71\xf5\x31\x00\x87\ \xeb\xe7\x12\x08\xb8\xbe\x9b\xda\x84\xfa\xa3\xe9\x6f\x66\xba\x90\ \xee\x82\x02\x60\x8b\x5e\xad\xb9\xe3\x6b\xbd\x20\xf7\x7f\x30\xa6\ \x74\xd4\xcf\x8f\x52\xbb\x5f\x9f\x13\x90\x70\xe1\xc6\xfa\x9f\x52\ \xaa\xf8\x15\x63\x00\xd7\xa8\x4d\x08\x10\xb4\x74\xc9\x1c\x4a\xfc\ \xfc\x64\xae\x5e\xb6\x74\xfd\x3a\x7a\x50\x09\x4e\x90\x0e\xb4\x0a\ \x50\x44\x05\x01\x8f\x91\x64\x0b\x17\x33\x4f\x50\x70\x01\x1b\xfe\ \x28\xfe\x93\x6a\x6f\x0f\xb5\x09\x85\xd2\x78\x00\x90\xbd\x23\xbf\ \xfc\xf3\x1e\xb5\xe7\x8f\xaf\xdb\x22\xf7\xbf\xe9\x40\x21\xf0\x6a\ \x68\xb6\x98\x21\xea\x07\x9f\x56\x5f\x01\x9c\xcc\x4b\xe2\x3f\x39\ \x71\xb6\x8f\xda\x84\xa0\x5a\x27\x35\xb0\x32\xab\x64\x05\x38\x4c\ \x41\x01\x2a\x65\xf1\x80\xd9\xd4\x9e\x0b\xcc\x89\x66\xfd\x20\x11\ \x14\xfa\xeb\x72\x57\x80\x4a\xb5\xe7\x0f\x90\xf1\xf2\x56\x00\x83\ \x6c\x01\xb3\x0a\xb6\x00\xcc\x5e\x6b\x0b\x50\x3d\x0d\x8c\xfb\xe5\ \x32\x37\x02\xc7\x96\xb5\x11\x98\x87\x6e\xe0\xf3\xaa\x3d\xfd\xd1\ \xe8\x8b\xcb\xde\x0d\xcc\x37\x20\x08\xa2\x7a\xaa\x29\x00\xcf\xd7\ \xe4\x0a\x04\x5d\xa1\x09\x04\x9d\xbc\x4c\x1f\x08\x82\xe3\x54\xf3\ \x0e\x0a\x0e\xdd\x7a\x4a\x05\x28\xf8\x0f\x6a\x40\xc1\x34\x13\x43\ \x34\x81\x82\xe3\xc1\xa0\x40\x9e\x05\x83\x6e\x0e\x46\x22\x3f\xca\ \x31\x18\x34\x68\xf4\x60\x10\x71\x2a\xc9\xa0\x26\xe1\x60\x3b\xf5\ \x70\xf0\x84\x4a\xe1\xe0\xa8\x0f\x04\x99\xe9\x5c\xc3\xe1\xf0\xe3\ \xf8\xb7\xed\xf9\x10\x0e\xb6\x6b\x15\x0e\xce\xe3\x84\x90\x41\x88\ \xea\x65\xb2\xec\x63\xbf\x7f\x48\xad\x84\x90\x2b\x23\xa6\x49\x08\ \xc9\xef\x94\x30\x88\xea\x81\x77\x90\xcc\x45\x04\x57\x4f\x08\xfa\ \xf0\xfc\x89\x8c\x52\xc4\x97\x53\x4a\x18\x99\x14\x7a\xc8\x08\x49\ \xa1\xd9\x55\x01\x81\x4f\xef\x1d\x89\x44\xab\x80\xf1\xeb\x66\x25\ \x7e\xfe\xd2\xa4\xd0\xa8\x6c\x52\xe8\xd0\xed\x3b\xe6\x49\x0a\x25\ \xd3\xc2\xe1\x9c\x5e\x2b\x2d\x3c\x5d\x55\xb2\xc9\xd2\xc2\xe3\x76\ \x40\x5b\xe2\x0f\xa1\x28\x81\x76\xe1\x03\xf4\xe4\x91\x2f\x0c\x19\ \x37\x64\x61\x48\x40\x8b\xc2\x90\xad\x1a\x16\x86\xc4\x21\xe1\x12\ \xda\xa5\x61\x62\x86\xf2\x2a\x28\xb3\x92\x2f\x0d\xd3\xae\x3a\xe8\ \x96\x82\xd2\xb0\xa9\x99\x79\xe4\xe9\x8e\xa0\x56\x8a\x4d\xad\x19\ \x3d\x4a\xc3\x48\x3b\xe0\xab\x86\x6e\xea\x5a\x0e\x85\x96\xca\x8a\ \x43\xc7\x0d\x53\x1c\x7a\xee\xea\xf8\xc2\xf9\x06\x4d\x57\x42\x9a\ \x40\xc0\x45\xeb\xb9\x67\xa9\x2b\x40\x0c\x11\x5c\x3c\x0b\xa0\x4c\ \x85\xf2\x70\x45\x21\xe2\x09\x65\xa5\xd9\x60\x13\xd0\x29\x0f\x8f\ \xca\xee\xf9\x0b\x4b\x7f\x78\x7a\x69\x7f\x83\xb6\x88\x50\xfd\x9c\ \xf7\xe5\xe1\x71\x77\xb0\x5a\x74\x9a\x85\xd0\xac\x80\xb6\x02\xc0\ \x56\x00\xcd\x17\xf4\x68\x10\x01\xae\xde\x9c\xc2\x06\x11\xe3\x77\ \xe7\x85\xee\x65\x29\x5b\xdb\x76\x44\x54\xe9\x6f\x4c\x36\x88\xc0\ \x32\xa9\x2c\xd0\x8a\xc8\xee\xa0\xfb\x29\x06\x86\xc4\x7c\xe1\x66\ \x58\x91\x3d\xa0\x56\x8b\x98\x68\x86\x2d\x62\xa0\x8c\xdd\xd5\x3e\ \x2a\xdf\xea\xde\xc3\x0b\x9d\x51\xa0\x43\x4a\xb6\xf7\x62\x1f\xd1\ \x22\x46\xd3\xae\xa1\xd9\x36\x89\x52\x83\xa1\x11\x53\xa6\x1d\xbd\ \x84\x26\x51\x78\x6b\x80\x88\x9d\xa2\x26\x51\x93\x99\x37\x89\x9a\ \x9b\xbb\x87\x3c\x9d\x63\x19\x9f\x79\x00\x4d\x35\xb3\x39\xfd\x04\ \xee\xb9\x6e\x4d\xa2\x84\x55\x80\x6c\x13\xe7\xf3\x6b\xa6\x04\x5d\ \xc3\xbc\xd0\x90\x29\x97\x96\xaf\x90\x59\x94\x68\x13\x37\x9b\x63\ \x9b\x38\x68\x5c\xe5\xcd\x50\xf8\x92\x83\xb0\x9a\xb1\xa1\x78\x39\ \x24\xf4\x44\x50\xd4\x26\xce\xe7\x27\x4f\x16\xdb\x55\xa0\x35\x15\ \x3a\xd9\x27\x25\x8d\x22\x29\x47\x07\x49\x86\x6e\x5c\x4a\x6d\x02\ \x9a\x04\x7b\x3e\xa7\x60\xd9\x57\xa4\x08\x67\x95\x79\x0c\x44\x29\ \x98\x3e\x8d\x22\xe3\xb6\x80\xa4\x55\x6c\xed\xf9\x01\x4d\x95\x00\ \x0c\x43\x5e\xa1\x77\x40\x83\xa0\x71\x15\xb4\xb0\x51\xbb\x0b\x6a\ \x9d\x8f\x47\x9e\x14\x1e\x83\x61\x5a\xc5\x0a\x0a\xb0\x9e\x7b\x51\ \x72\x4a\xc8\xc1\x76\x5d\x1a\x28\x03\x4e\x90\x89\x71\x98\x73\x7b\ \xd8\xe9\xf9\x05\x3f\x9f\xea\x61\x18\x49\x3c\x86\x6d\xfb\x7d\x84\ \xef\xcf\x3c\x5f\xa0\x27\x89\x7b\x06\x81\x5b\x02\x8d\x8b\xf4\x50\ \x02\x58\x0d\x20\x99\x94\x66\xbb\x78\xc0\xf6\x7b\x87\x26\xd3\xba\ \x79\xaa\x1f\x8e\xe5\xe6\x85\x16\x7a\xd0\x7c\x1b\x9a\x71\x13\xed\ \xe2\x5b\x0b\xf4\xa6\x22\x07\xf3\xaa\x58\x23\x4b\xf7\xb4\xe9\xa2\ \x00\x4b\x0e\x8c\x50\xd1\x3e\x80\x6b\x41\x54\x0f\xae\xed\xea\x0a\ \xeb\x72\x1e\xc2\x49\x2f\x8f\x4a\x3e\x6a\x23\x43\xbf\x2f\xe9\xae\ \x00\xf1\x23\x63\x3a\xc4\x03\xab\x6c\xba\xa6\xab\x12\x88\x93\x4a\ \x20\x1b\xe7\x6e\x96\x47\xc6\xc0\x6f\xc9\x64\x0e\x68\x73\x0b\xf0\ \xae\xd6\x0a\xf0\xc9\x91\x3e\xd2\xef\xf7\x19\xe6\x0c\xc1\x58\xcd\ \x00\x33\x9f\x18\xdc\xba\xad\x4d\xc8\xd3\x13\x30\xd4\xc1\x4b\xf0\ \xf4\xc6\x0e\x8d\x1a\x4d\x73\x68\xd4\xa8\xf0\x1d\xb9\x10\x2e\x58\ \xea\x5a\x0a\xff\x98\x2b\x82\xd6\x96\x4a\x0f\x8d\x02\x2f\xac\xc0\ \x48\x44\x9e\x14\x0e\x99\xaa\x66\x3e\xca\x0d\x8e\xb2\xd7\x4a\x01\ \xde\xfb\xf4\x92\xf1\x4f\x14\x5f\x69\x3f\xfd\xa8\xf8\xe0\x48\x30\ \x56\x8e\x35\xf7\x9a\x56\x01\x3c\xd7\x82\x9a\x08\x1f\x0e\xdf\xb4\ \x39\x24\xa7\x89\x47\x0c\x79\x70\x64\x3c\x59\xe4\x75\xb1\xa6\xc2\ \xb1\xa7\x8d\x59\x76\x12\xcf\x07\x86\x33\x0b\x69\x0a\xff\x08\x13\ \x42\x6b\x4a\xc8\xa3\x63\xb9\x7f\x14\x18\x96\x84\x53\xc4\xb8\x4a\ \xf1\x80\x4b\x3e\x3a\x2b\x1c\x84\x6c\x46\x05\x00\x1f\x9d\xda\x99\ \x48\x4d\xbc\x70\xf0\xb6\xb4\xe6\x8f\x3d\x66\xe8\xc3\xa3\x81\x84\ \xe3\xe3\x9d\xac\x5f\x3c\x70\x38\x0a\xdd\xac\xab\x80\xd0\xe6\x9e\ \x82\x02\xbc\x7f\xe0\x32\xb9\xef\xf7\x52\xcf\xf7\x53\xd7\x2b\x58\ \x4c\x1a\xb1\x69\x94\x39\xa4\xcb\x31\xef\xfe\xa0\xea\x47\xe4\x95\ \x57\xf4\x90\x2e\xdf\x8c\xe1\xac\xfe\x4c\x6b\x08\xa0\x78\xa1\xca\ \x7d\xdd\x94\x4a\x00\x21\x5d\xb5\x84\xbf\xf7\xa8\x9f\x34\xfa\xe8\ \xe6\xfa\x53\x46\x09\x77\x88\x27\xb2\x6a\x23\x87\x4e\xb6\xf6\x99\ \x6f\x15\xe8\x1f\x41\xa7\xbc\xb9\x0b\xff\xb3\x13\x37\xd0\x9b\x1b\ \x38\xf2\xa4\xf0\x0f\x0a\xf2\x95\x5e\xab\xa8\xb8\x8f\x34\x0a\xd7\ \x94\x34\xa2\x9a\x36\xf3\x29\x81\xeb\x52\x38\x67\xe1\xaf\xde\xd4\ \x48\x2e\xfd\x87\x00\x69\x2d\xc8\x67\x12\xb2\x87\x9c\x6c\xad\x64\ \x25\xc0\x5a\x6e\x14\xb8\x58\x4d\xce\x16\x22\x86\xd3\xd6\x97\x3c\ \xf9\x0e\x96\xb5\xdb\xd9\x87\x0a\xcc\x40\xab\x37\xd7\x3d\x52\xe8\ \xe0\xda\x49\x9b\xe0\x4b\x93\x19\x86\x4d\xdd\xa1\xac\x0c\x3e\x72\ \xcf\x07\x9c\xff\x0d\xfb\xc9\x6f\x17\x98\x89\x40\x09\xc4\xe5\xe5\ \x09\xef\x00\x5c\x44\x33\xe1\x04\xb5\x6d\xca\x56\x81\x13\x6e\x5e\ \x70\xf5\x88\xe4\x0e\xd8\xf3\x19\xd3\x09\x3f\x41\x90\xb8\x88\x6d\ \x82\xaf\x08\x6d\x17\xc0\x22\x2d\x52\xcb\x35\x81\x88\xaf\xcb\x43\ \xc4\x55\x4c\x10\x6d\xd8\xe5\x23\x9f\x7a\xe0\x2a\xd3\x2c\xfb\x69\ \x0d\x43\x22\xa1\x54\x80\x8d\xcb\x1a\xd1\x31\x8a\xad\xe7\x8c\x02\ \x11\x03\xb6\xbf\x96\x80\x77\xe3\x40\xcf\x1e\x2c\xfc\xfb\x0b\x96\ \x0b\xd9\x9c\xec\x0a\x31\x58\x94\x08\x20\x41\x14\xd1\xdb\x1b\xc8\ \x6f\x88\xb8\x67\x64\x89\xe0\xab\xb9\x70\x2c\xaa\xe7\x24\x9f\x7a\ \x6e\x3a\x6f\xfd\xfc\xdc\x11\x43\xe6\x09\x7c\x13\x7a\xc8\xa7\x61\ \xdd\x96\x26\x54\xc1\xe4\xb7\x81\xc8\x74\x2e\xba\x85\xfb\xaa\xfb\ \xd1\xda\x32\xcf\x92\xa7\x1e\x1b\xc6\x03\x79\x87\xf0\xa9\x4d\xf1\ \x9e\x03\x55\x49\xf6\x43\x21\xbd\x0c\x3a\x60\xe4\xa3\x02\xb4\xf8\ \x47\xd0\xa1\xba\x00\xda\xb0\x33\xe9\x5e\x2f\x94\x72\x81\x61\x5c\ \x60\x51\x2c\x8a\x18\x0f\x25\x47\xc8\x1b\x05\xdb\xc2\xb6\x03\xed\ \x42\x3a\x74\xde\x78\x02\x78\xac\x42\xf6\xae\x33\x99\xe0\xd9\xb0\ \xb1\x43\xba\x3a\xd2\x9a\x8d\xf5\x8f\xc5\x32\x8b\x16\xd3\xcb\xc4\ \x2e\x23\x14\x44\x9c\x6a\xf7\x1b\x56\xf0\x50\xb1\x03\x63\xb4\x25\ \x7d\xe2\xf1\x9c\x9c\xdc\x87\x90\x38\x63\x49\x5a\x86\xe2\x55\x47\ \x1d\xc9\x97\xce\x58\x2d\xe2\xfe\x93\x5d\x86\x70\x1d\x5d\x97\x87\ \xd0\xfe\x9a\x2e\xb4\x7e\x87\x17\xa5\x1a\x2f\x00\x3b\x70\xe0\x86\ \x25\xd9\x4c\xb7\x05\x27\xf7\x8a\xb8\xee\x20\xd9\xf6\x50\xb6\xa7\ \x55\x38\x45\x9b\xb9\xa4\x9d\xad\x00\xb5\x0f\xd0\x9c\x01\xea\xf3\ \x6d\x4e\x36\x9d\xe0\x5b\x85\xd4\x6d\xa3\x27\x71\x18\x9d\xa0\x2b\ \x49\xa1\x83\x75\xa7\xb9\xd1\xb1\x9e\x45\x5b\xdd\x42\xd3\x24\xe8\ \x9c\x55\x8f\x85\xa4\x46\x1f\x43\xe8\xc3\x07\xd7\x82\x6b\xc2\xb5\ \xff\x2b\xed\xc9\x93\x94\xf1\x58\x1b\x75\xaf\xd8\x31\xeb\xd6\x60\ \x73\x30\xbb\xa1\x1c\x5a\x4e\x08\x89\x78\x03\x1c\xaa\x08\xfb\x72\ \x79\xe5\x05\xa1\xa9\x32\xac\x16\xd0\xea\x1e\x7a\xec\xc3\x41\x0b\ \xc0\xf0\xfa\x10\x7e\x0f\x3e\x83\xad\x05\xb0\x08\xf8\x0d\xfc\xd6\ \xb6\x34\x48\x93\xca\xaa\xe7\xa1\x4a\x57\xb7\x42\xcd\xe5\x44\x00\ \x29\xc7\xb7\x07\x70\x1f\xa7\x94\x09\x88\x0a\x4f\xc5\xc7\xf0\x32\ \x44\x3d\x2d\xc9\xe8\x12\x6e\x3e\xfe\x30\xb6\xba\x9f\xc1\x6c\xc7\ \x82\xa8\x83\xf4\x29\x8a\x02\x87\x1e\x89\x3e\xbc\xc4\x6f\xc6\x0a\ \xf8\x17\xd3\x06\x6d\xf2\x3d\xea\x08\xdd\x32\x01\x5e\x15\xb6\x0b\ \x27\x5b\x0f\x1d\xb4\xb3\x10\xf6\x20\xfc\x16\xae\x01\xd7\x82\x6b\ \x5a\x02\xcf\xf3\x95\x62\x95\xbd\xf6\x87\x70\x9a\x06\x40\xd0\x85\ \xeb\x99\x3f\x81\x85\x0e\x0c\xaf\x85\xf7\xf0\x67\xf0\x1d\xcd\xba\ \x6d\x59\x64\x91\x45\x16\x59\x64\x91\x45\x16\x59\x64\x91\x45\x16\ \x59\x64\x91\x45\x16\x59\x64\x91\x45\x16\x69\x42\xff\x07\x29\xf3\ \x53\xa4\xe8\x29\x8f\xad\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x00\xf7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x39\x50\x4c\x54\x45\xe7\xec\xed\xe7\xec\xee\xe7\xed\ \xed\xe7\xec\xec\xe7\xec\xed\xfe\xed\x4d\xfd\xec\x50\xff\xed\x46\ \x47\x70\x4c\xe7\xec\xed\xe7\xec\xec\xeb\xeb\xeb\xf2\xec\x9f\xeb\ \xeb\xeb\xf3\xed\x9e\xf8\xec\x74\xf9\xed\x71\xf8\xec\x72\xf8\xed\ \x76\x95\xef\xac\xa7\x00\x00\x00\x13\x74\x52\x4e\x53\xff\xb1\xb5\ \xb3\xf5\xff\xff\xff\x00\xf7\xb2\x19\x28\x1a\x2a\xe5\xe4\xe5\xe3\ \x3c\x6b\xb2\x20\x00\x00\x00\x5a\x49\x44\x41\x54\x78\x01\xed\xd7\ \xb7\x15\x80\x30\x10\xc0\xd0\x73\xb6\xc9\xb0\xff\xb0\xf4\x24\xa7\ \x8e\x27\x0d\xf0\x7b\x49\xec\xec\x8f\xc0\x3c\x58\x79\xcd\xaa\x31\ \x0b\x68\xf9\xcc\x64\x81\x24\x9f\xa5\x2c\x20\x99\x00\x00\x8a\x80\ \x90\x09\x00\x00\x00\xa0\x09\x00\x00\x00\x00\x00\x00\xf0\xe1\x33\ \x9f\x05\xd6\x6f\xe0\xc8\x02\xcb\xee\xc2\x6b\x6e\x9b\xee\x00\xef\ \x7c\x02\x7b\xf9\x6e\xef\x10\xf3\xdd\x52\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xe5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x01\xac\x49\x44\x41\x54\x78\x01\x9d\x91\x03\xb2\x5b\x61\ \x18\x86\xb3\x81\x1a\xdb\x28\xb7\x50\xef\xa1\x9b\xe8\x2a\x6a\x0c\ \x8a\x41\x6d\xf7\xda\x8a\xad\x63\xc4\x38\x3e\x27\x4e\x8a\xb7\xbd\ \x61\x15\xcc\xfd\x67\x9e\xd1\xff\xce\xf3\xc9\x66\x28\xa2\x30\x8a\ \x8c\x18\xf4\x65\x08\x62\xbf\x6d\xd8\xfb\x15\xc2\x28\x12\x9c\x17\ \x2c\xb1\x69\xf2\x7c\xe4\xf0\x8e\x05\x44\x78\x69\xb8\xa4\x17\x54\ \xf2\x0c\xf2\xe9\x68\x1b\x29\x47\xf5\x05\x29\xde\x0b\x2a\xba\xda\ \x86\xa7\x1c\x45\x8e\xe3\x76\xff\x57\xa0\x49\x1c\xe4\x3c\xd5\x46\ \x2d\xb0\x43\x3b\x32\x15\xe1\xe4\x7f\x05\x6a\x5f\xf0\x2f\x6a\x91\ \x19\x2f\xd8\x0e\x66\x93\xe1\x7f\x48\x89\x21\xac\xda\x23\x58\x70\ \x52\x6d\x9e\x4e\x45\xde\x5e\x79\xe0\x38\x3a\xd1\x12\x45\x91\xc3\ \xf3\x69\x0e\x76\xba\x08\x6f\x6a\xc0\xb4\x57\x54\xef\x3c\x0b\x5e\ \xfa\x43\x50\xcc\x12\x48\x0b\xfe\x3e\x29\xde\x87\xe7\x53\x34\x66\ \xec\x3a\x16\xfd\x2a\xe2\x05\x15\x8c\xa4\xc3\x9f\x96\xda\x92\xc5\ \x70\xd2\xba\xfa\xc8\x7f\x61\x68\x07\xbe\x10\x85\x4d\x32\x8f\x95\ \x90\x02\x21\x57\x47\xb9\x5a\x83\x51\x2a\xa3\xda\x6c\x22\x94\x95\ \xdb\x92\x47\x33\xf1\x2f\x43\x3b\x58\xd8\x08\xb5\x43\xc1\x8c\x8c\ \x5a\xa3\x01\x45\x93\xa1\x29\x19\x28\x86\xd5\xca\x9a\xe5\xf6\xdf\ \x9b\x55\x9a\x1e\xda\xc1\x9a\x9b\xda\x0e\xb5\xab\x55\xeb\x0d\xa8\ \x9a\x04\x5d\x49\x42\x31\xad\x66\xce\xac\x74\x04\x2b\x34\x3b\xb4\ \x83\x35\xbb\x1f\x0e\x3e\xd7\x0e\x4a\xe5\x1a\xac\x72\x05\xaa\x55\ \x42\xb5\xd1\x84\x23\xae\xc3\x25\x4a\x78\x3c\x13\x9f\x1d\xda\x81\ \x26\x89\xf8\xb2\x41\xf5\x37\x4f\x4b\x3a\x04\xd5\x84\x9d\xd4\xda\ \x8b\xfd\xb0\x5a\xf8\x71\xe7\x69\xf0\xe2\xc8\x33\xf2\x1c\x87\x29\ \x3b\x03\x4f\xb2\xd0\x17\x79\x92\x45\xbc\x5b\xce\x7d\xbf\xf7\x96\ \x78\xd6\x3b\xa3\x30\x8a\x42\x8e\x4f\x2c\xdb\x09\x63\xd6\x41\x57\ \x67\xed\x74\xfd\xd9\x54\x6c\xea\xc6\x23\xf7\x69\x5b\xf7\xfd\x04\ \x71\xb2\x20\x55\xd5\xc0\x71\x24\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x03\x22\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x04\x00\x00\x00\x00\x60\xb9\x55\ \x00\x00\x02\xe9\x49\x44\x41\x54\x78\x01\xd5\xd9\x03\x90\xe4\x4e\ \x14\xc7\xf1\xf7\xb7\x6d\xdb\xb6\x6d\xdb\x36\xce\x2e\xfb\xac\xc2\ \x59\x65\x4d\xe1\x54\x3a\x9b\xf9\xbd\x4e\xa6\xb6\xd6\xb6\x6d\xbe\ \xc3\x7a\x77\xd8\x9d\x64\xea\x3e\xdf\x32\xf2\x32\x4c\xba\x43\xa7\ \xb8\xe4\x0b\x93\x2f\xa4\x44\xb2\xa6\xf3\x34\x4a\x1c\x9c\x8f\x72\ \x54\x26\xf0\x3d\xc0\x14\x08\x04\x93\x29\x31\x76\x9d\x8b\x62\x08\ \x84\x4b\x71\x3e\x25\x02\x4f\x84\xf4\x35\x81\xfc\x97\x79\x0e\x8a\ \x20\x7d\x95\x1c\x3c\x8f\xfc\x66\x8d\x85\x0c\xc6\x63\xc8\x5f\xc9\ \x67\x23\x0f\x32\xa4\xc2\xcc\x73\xc8\x4f\xf8\x0f\x32\xa2\x7f\xc9\ \x3f\x38\x0b\xb9\x90\x11\xe5\x27\x9f\x4d\x7e\xe1\xbf\x21\xa3\xe3\ \xbf\xfc\x7b\xfd\x39\x90\x10\xe5\xf9\xf4\x1e\x58\xbf\x43\x42\xc7\ \xbf\x91\xf7\x02\x67\x20\x03\x12\xa6\xac\x5d\x67\x92\xd7\xf0\x0b\ \x24\x7c\xd6\xcf\xde\xbf\xfe\x34\x48\xf8\x38\xd3\xe3\xf7\x80\x7f\ \x84\x44\x8e\x7f\x20\xef\xc8\xe9\x48\x8a\x7a\x02\x29\x72\x3a\x79\ \xc5\xfa\x16\x12\x3d\xfe\xc6\x93\x6b\x9f\xba\xdf\xfe\x84\x53\x63\ \x3a\x81\x54\xfb\x13\x75\xbf\xf1\xb5\x61\xd7\x99\xd6\xed\xea\x4d\ \xfe\x1b\x73\x78\x33\x67\xa3\x0b\x12\x77\x35\xd8\xcf\x2b\xd5\x0c\ \x7c\xc5\x4f\xc4\x78\xb9\x56\xd7\xf7\x8e\x44\x00\x40\x2b\xc4\xc5\ \x3a\x39\x9b\xb7\xf5\x9e\x8e\xf3\x40\xe0\x0c\x1a\xc4\x2f\xf1\xdf\ \x98\x8f\x0d\x9c\x82\x36\x88\x4f\xb5\x71\x0a\x36\x60\x3e\xff\xcd\ \x2f\x11\x7f\x68\x3a\xd8\xa0\x76\xfe\x9c\x88\xac\xf7\xd0\x9a\x98\ \xf1\xf8\x94\x7a\xf1\x3b\x68\xf1\x7d\x7c\xdb\xd1\x8f\x68\x90\x7a\ \x99\x1b\x7d\x1d\xdf\xac\xde\xa4\xe1\xf0\x22\xea\x7d\x1b\xdf\xc4\ \xaf\xd3\x68\xea\x49\x54\xfb\x32\xbe\x4e\x3d\x47\xa1\xe1\x71\x54\ \x79\x3e\xbe\x16\xcf\x50\x78\xf6\xa3\xa8\xf4\x74\x7c\x8d\xfd\x14\ \x45\xc6\xf7\xa1\xc4\xb3\xf1\xe5\xfc\x30\x45\x17\xbc\x07\x45\x9e\ \x8c\x2f\x0b\x3e\x48\xb1\xb1\xef\x42\xa1\xeb\xe3\x4b\xd4\xfd\x14\ \x3b\x75\x0b\x67\xbb\x3a\x3e\x1f\x77\x50\x7c\x70\x33\x67\xba\x36\ \x3e\xd7\xba\x9d\xe2\x77\xf4\x5a\x24\xbb\x32\x3e\x3d\x78\x23\xe9\ \x49\xba\x06\x49\xa6\xe3\x39\x55\x5d\x4f\xfa\x70\x33\xc4\xb0\x9b\ \xc9\x84\xfd\x28\xc4\x2c\xf5\x88\xc7\xeb\x00\x8f\xd7\x09\x6a\xb6\ \xf1\x3b\x30\x8b\x4c\xf0\x66\x88\x59\xd6\x26\x32\x81\x5c\x88\x61\ \x39\x46\x5b\xd1\xe8\x81\x18\xd6\xb3\xff\x22\xd2\xc5\xcf\x42\x5c\ \xe8\x19\xd2\x85\x3f\x21\xe6\xa9\x3f\x48\x17\x2f\x86\x98\xc7\x8b\ \x48\x17\x6f\x83\xb8\xd0\x56\xd2\xe5\xd2\xbd\x51\x31\xe9\x39\x72\ \x05\x24\x4a\x0e\x7f\xc8\x1f\xc2\x81\x44\xee\xc8\x15\xa4\xe3\xe8\ \x2b\x90\x08\xe5\xf1\xdf\xbd\xab\x5c\x39\x0d\x5f\x21\x03\x12\x3e\ \xf5\x32\xe9\xe0\x31\x90\x30\x15\x61\xc2\xf0\x0d\x08\x9c\x65\xfd\ \x1c\xe1\x4f\xeb\x7f\xd2\xa1\x96\x41\x42\x54\xad\x66\x84\xde\x6e\ \x48\x3e\x9b\xff\x46\x19\x24\x44\x4b\x49\x07\xf6\x8e\x5e\x52\x61\ \x8e\x7d\x69\xe4\xff\x4e\x35\x03\x75\xa3\xae\x07\x7b\x48\x07\xaa\ \x47\xac\xe5\x57\x1e\xbd\x36\xc6\x2f\xef\x9c\x11\xab\xed\x1a\x8a\ \x9f\x73\xc3\x90\x03\x74\x23\x10\xbc\x8d\xe2\x10\xbc\x91\x57\xa2\ \x73\xf0\x08\x1a\xb7\x65\xfc\x4e\xff\xc5\x04\x01\xe7\x6e\xd2\x60\ \xdf\xca\x2b\xfb\x37\xb7\x9c\xb7\x35\x9f\x09\xf2\x36\x3c\x4e\x06\ \x9c\x07\x10\xd0\x7c\xb6\xc8\xeb\xf8\xa0\xf3\x1a\xb9\x40\x3d\x87\ \x9d\xbc\x96\xe2\xc5\xf7\x91\x39\xf3\xa3\x79\xef\x18\x68\xeb\x15\ \xf4\x50\xb9\xbd\x82\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x01\xcc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x01\x93\x49\x44\x41\x54\x78\x01\xed\x99\x05\x6a\x25\x41\ \x10\x40\x6b\x5d\x4e\xb5\xd8\xba\x4b\x77\xb3\xc8\x4a\x04\x27\x57\ \xc8\x05\xe2\x6e\x48\xdc\xad\x7b\xe2\xee\x7e\x80\x9c\x22\xee\xae\ \x15\x97\x81\x82\xa2\xa7\x1e\x14\xfe\xff\xcc\x7b\xe3\x33\x20\x08\ \x82\x20\x08\x82\x20\xf8\xc8\x2e\x3c\x80\x40\xc7\x82\xd5\x33\xe0\ \xf4\xe6\xfe\xac\x41\x60\xfa\xc0\x99\x0f\xe0\x3d\x53\xf1\x4f\xf6\ \x45\xab\xf6\xa5\x77\xaf\x1c\x6b\x12\xfd\x96\x0f\x74\xc3\x75\xf2\ \x38\xea\x4d\x24\xe5\x71\x54\x47\x34\xe5\x71\xe6\xa3\x29\x8f\xb3\ \x14\x4d\x79\x9c\x81\x68\xca\xe3\xfc\x8a\xb2\x7c\x61\x74\xe5\x03\ \x5d\x09\xbd\xaf\x1e\x8b\xfc\x05\x44\x5e\xe4\x45\x5e\xe4\x45\x5e\ \xe4\x5b\xde\x3d\x03\xfb\xe9\x25\x0b\x79\xa7\xea\x43\xc9\x3b\x53\ \x02\xd5\xbf\x1e\xc1\xbd\x08\xcc\xef\xc3\x37\x27\xf8\x47\xb3\x60\ \x75\x02\xfe\x91\xcf\xf2\x4e\x25\x5f\xff\x87\xca\x41\xef\xdf\xe7\ \xfe\xca\x5b\xf3\xed\x0e\xc7\x53\x3b\x46\xf0\x43\x1e\x71\xba\x7f\ \x7f\x76\xe9\x23\x70\x93\xc7\x00\x4b\x77\x5f\x90\xea\xd8\x5f\xd0\ \x0b\x56\xf2\x78\xb6\x07\x82\x00\x04\x7b\x02\x93\x2d\x8f\x04\xa6\ \x0f\xff\x90\x3e\x02\x17\x79\xc4\xaa\xaf\xf8\xa7\xf4\x11\x38\xc9\ \x23\x4e\xa7\xd3\x47\xe0\x29\x8f\x9f\x90\xac\xca\x0c\xb1\x42\x78\ \x62\x64\x70\xc2\xe3\x1f\x81\x50\x9e\x7f\x04\x42\x79\xfe\x11\x08\ \xe5\xf9\x47\x20\x94\xe7\x1f\x81\x9f\x7c\x88\x08\x4e\xe7\x86\xbd\ \x44\xee\x4f\x03\xfd\xa5\x8e\xf1\x9e\xe0\xc9\x6b\x2c\x8c\xc0\x40\ \x9e\x4d\x04\x7a\x79\xfe\x11\xe8\xe5\xf9\x47\xa0\x97\xe7\x1f\x81\ \x5e\x9e\x7f\x04\x7a\x79\xfe\x11\xe8\xe5\xf9\x47\xa0\x97\xe7\x1f\ \x81\x58\x9e\x7f\x84\x9b\xdf\x2c\x99\x22\xbc\xbd\xf5\x19\xa7\xbf\ \xef\xcf\xd0\xfe\xac\xed\xcf\x3a\x58\x3d\x0a\x4e\x1b\xe0\x85\x20\ \x08\x82\x20\x08\x82\xb0\x07\x54\x50\x5e\x90\xd6\xa6\xe8\x8d\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x05\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x02\xcc\x49\x44\x41\x54\x78\x01\xed\xd9\x03\x70\x5c\x5b\ \x18\xc0\xf1\x7d\x83\x67\x8c\x9e\x5d\x8f\x99\x8e\x51\xdb\xe6\xb2\ \xb6\xdd\xde\xa4\xb6\x6d\x0e\x62\xdb\xb6\xb3\xde\x78\xbd\x5b\x1b\ \x5f\xcf\xa2\xd6\xf2\xcb\x49\x7a\xee\xcc\x3f\xc6\x39\xbf\xbd\xbe\ \xbc\xeb\x26\xcd\x32\x12\xb4\x75\x46\x6d\xdd\x23\x8d\xaa\x60\x33\ \x0f\x79\xa1\x06\xc0\xd0\x5a\x0b\xb5\x15\x29\x80\x80\x40\x33\x40\ \x32\x3e\x02\x65\x00\xf8\x08\x94\x01\xe0\x23\x50\x06\x80\x8f\x40\ \x19\x00\x3e\x02\x65\x00\xf8\x08\x94\x01\xe0\x23\xd0\x0d\x80\x80\ \x40\x19\x00\x3e\x02\x65\x00\xf8\x08\x94\x01\xe0\x23\x50\x06\x80\ \x8f\xe0\x2a\x80\x59\xa7\x80\x7a\x45\x21\x68\xe4\xf9\x2e\x67\x6c\ \xa9\xf3\x00\x00\x19\xc1\x55\x80\x66\x4d\x99\xdb\x83\x23\x08\x2e\ \x03\x98\xf5\x0a\x68\xd2\x94\x7a\x54\x8b\xa6\xec\xb1\x59\x5b\xd5\ \xc3\xaf\x00\x16\xbd\x12\x9a\xd4\xa5\xa4\x12\x97\x6a\x54\x17\x83\ \x49\x2b\x43\xdb\x84\x6e\x9a\xd5\x01\xed\x7a\x1f\xc0\x00\x18\x00\ \x03\x60\x00\x0c\x80\x66\x00\xa3\x56\x0a\x0a\x69\x36\x28\x6a\xb3\ \xd0\x52\x49\x73\xc1\x6a\x50\xd1\x01\xd0\xd2\x60\x3f\x11\x42\x8f\ \xc0\xd3\x01\x60\x35\xaa\x41\xd7\x54\x45\x20\x2a\xd0\xd2\x37\xd7\ \xb2\x7d\x00\x03\x60\x00\x0c\x80\x01\x30\x00\x1a\x00\x74\x2d\x35\ \x50\x57\x99\x8a\x7a\x0e\x20\xad\x4e\x07\x8b\x5e\x41\x07\x40\x6b\ \x63\x05\xf6\x49\x10\x01\x4f\x06\x93\x4e\x4e\xcf\x26\x60\xbb\xc3\ \x63\xd4\x4a\xd1\x32\xeb\x15\x6c\x1f\xd0\x81\x00\x18\x00\x03\xd8\ \xb4\x65\x2f\xcc\x98\xbb\xc6\xa7\xcd\x9a\xbf\x0e\x4e\x9c\x3a\x0f\ \x66\x9d\xbc\x27\xf5\x00\x71\x71\xb1\x70\xee\xc2\x65\x9f\x76\xfc\ \xe4\x79\xe8\x3f\x5c\x0c\xeb\x36\xec\x58\xea\xff\xa3\x80\x4e\x8e\ \x7a\x14\xb0\x18\x94\x2e\x8d\x6b\x9a\x78\x39\x48\xe6\xad\x39\xe8\ \x57\x00\x6d\x63\x65\x1b\x9c\x07\xa4\xb8\x74\x1e\x30\x4d\xb2\xc2\ \x06\x70\xc8\xaf\x00\xfa\xe6\x1a\xdb\x80\x70\xcf\x04\xab\xd2\x6c\ \x67\x82\x74\x00\xd8\xb2\x9a\xd4\xb6\xd5\x12\xad\xeb\x46\xb5\xed\ \xff\xfa\x14\x60\xd0\x82\x43\x5f\x4d\x10\x04\x05\x8c\x9b\xb9\xe3\ \x27\xf4\x9d\xa0\x41\xab\x80\xc5\x2b\x02\xa1\xcf\x10\x21\xf4\x1e\ \x2c\xf0\x67\xf7\x7b\x0f\xe6\xbf\xf1\xc4\xd8\x36\xe1\xb1\x7c\x6e\ \xe5\x38\x01\xd7\x4a\x02\x92\x71\xdc\x74\xee\x1f\x54\x80\xdc\x9c\ \x74\xdb\xe0\xb0\x7a\x68\x9b\xf8\x44\x11\xf7\x07\x99\xec\x2e\xd2\ \x4d\x12\xbc\xde\x78\x01\x37\x1b\x15\x20\x23\x3d\x05\x13\xc0\x36\ \xc9\x33\xa4\x87\x24\xf8\x40\x4b\x3b\x3a\xc0\x33\x12\xf8\x02\x80\ \x01\x58\x8d\x1a\xd0\x35\x57\x83\xb6\xa9\xca\xe3\x92\x12\xa3\xdb\ \x2f\x40\x4b\x43\xb9\xd7\xc7\xf5\xd0\x90\x4b\xed\x17\xc0\xd0\x2a\ \x05\x79\x4d\x26\xc8\xab\x33\x3c\x2e\x22\xec\x1a\xdb\x07\x30\x00\ \x06\xc0\x00\x18\x00\x03\x60\x00\x0c\x00\x25\x06\xc0\xe7\x1e\x7f\ \xd6\x00\x63\x26\x73\x9d\xc6\x0a\xb9\x83\x64\xa2\x77\xa9\x00\xa8\ \xab\x29\x85\xbe\x43\x45\x38\x00\x43\xf8\x4a\x9e\x73\x19\x35\x8d\ \xfb\x65\xac\x80\x0b\x22\x13\xb6\xbc\x79\x43\x24\x70\x18\x2a\x80\ \xad\x9c\xec\x34\xdb\xfd\x7c\x9f\x47\x1e\x92\x1c\xee\x3d\x44\xb0\ \xca\x91\x70\x79\xef\x41\xfc\xce\xbc\xb7\x96\x69\xd3\x76\x7f\x37\ \x9e\xcf\x2d\x1c\x27\xe4\xe2\xc6\xf1\x03\xd7\x91\x2f\x7d\xf1\x1c\ \x2a\xf2\x6a\x86\xbc\x8d\xdc\xc5\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x00\x76\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x3d\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x78\x08\x18\xf0\x7f\x2d\xc3\x7f\x3c\x98\x38\x03\x46\x0d\x18\ \x35\xe0\xcf\x76\xf5\x9f\xb8\x34\xff\x06\xca\x61\x33\x80\x22\x0c\ \x00\x9a\xc1\xdf\x21\x0b\x49\x28\xac\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x00\x7e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x45\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x98\x1e\x06\x8c\x1a\x10\x1e\x1e\xfe\x1f\x0f\x26\xc6\x80\x51\ \x03\x22\x23\x23\x71\x6a\x06\xca\x11\x36\xa0\xb8\xa4\xe4\x07\x2e\ \x03\x40\x72\xd8\x0c\xa0\x08\x03\x00\x18\xff\xd4\xd4\xbe\x82\x08\ \xf2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xfb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\xc2\x49\x44\x41\x54\x78\x01\x63\x40\x05\x97\xc5\x2f\ \x8b\x33\xe0\x03\xe7\x7a\xce\x74\xe3\x91\x3e\x23\x72\xf6\xf3\x99\ \x2f\x17\xc5\x70\x2b\xe8\x38\xf3\xff\xcc\xff\x73\xed\x38\xa4\x4f\ \x0a\x9f\xf9\x04\x52\x70\xe6\xcb\x39\x51\x14\x89\xab\x6c\x67\x34\ \xce\xf9\x9d\x29\x3e\xb3\x0b\x28\x09\x86\x40\x56\x31\x50\x44\xe3\ \x2a\x1b\xc8\xd8\xee\x33\x7f\xa0\xc2\x98\xf0\x0f\xd0\xc9\xab\x98\ \xcf\x2e\xc2\xa5\xe0\xec\xca\x33\xac\x0c\x0c\x40\x25\x67\xe6\x63\ \x55\xb0\x6c\x3f\x0b\xd4\x15\xff\x19\xcf\x4c\xc5\x90\x9e\xf3\x9f\ \x09\xc5\x07\xe8\x0a\x4e\x0a\xa3\x86\xa0\x1d\x86\xfd\xb6\xa8\x41\ \x94\x85\x61\x45\x26\x8a\x02\xa8\x1b\x2e\x9d\x09\x3d\xe7\x72\xf6\ \x14\xd8\x84\x29\x28\x0a\x4e\x1f\x3c\x7b\xfd\x4c\xe8\x7f\x46\xa8\ \x85\x2e\x67\x2e\x9c\x3d\x80\xa2\xe0\xbc\xff\x2a\x66\x38\x07\xec\ \xf5\xf3\xfe\x10\x16\x00\x95\x3d\xd8\x2a\xc3\x87\xc6\x71\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x7e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x45\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x98\x1e\x06\x8c\x1a\xf0\x5f\x4b\xeb\x3f\x1e\x4c\x94\x01\xa3\ \x06\xe8\xea\xe2\xd4\x0c\x94\x23\x6c\xc0\xef\x80\x80\x1f\xb8\x0c\ \xf8\x05\x94\xc3\x66\x00\x45\x18\x00\xc4\x9f\xe5\xc7\xe9\xfc\x52\ \xce\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x71\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x38\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x34\xc0\xf9\ \x4a\xcc\x7f\x7c\x78\xa4\x18\x30\x6a\xc0\xa8\x01\x51\xd7\x0b\x7f\ \xe1\xd2\x1c\x75\xbd\xe0\x17\x36\x03\x28\xc2\x00\xeb\x46\xae\x1d\ \x4d\x3c\x05\xb0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x27\xd5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5c\x72\xa8\x66\ \x00\x00\x27\x9c\x49\x44\x41\x54\x78\xda\xed\x7d\x79\x54\x1c\xe9\ \x75\x2f\xe3\x8c\x13\xaf\x49\x5e\x62\xe7\xbd\x9c\xec\xef\xbd\xd8\ \x63\xfb\x9f\x3c\xc7\x76\x9c\x89\x97\x38\x76\x4e\x36\xdb\x49\x1c\ \x8f\x93\x9c\xf8\x4c\x3c\x71\x32\xe7\x1d\x1f\xcf\xb3\xe8\x06\x69\ \xb4\x8c\xa7\xe9\x2e\xd0\x36\x23\x8d\x04\x12\x5a\xac\x75\x24\x21\ \x21\x69\xb4\x20\xc9\x48\x40\x55\xb1\x75\xd3\x08\x01\x62\x11\x20\ \xb4\x20\x21\x96\xa6\xbb\x1a\x81\xd8\xb7\xef\x7d\xb7\x24\x34\x48\ \x43\x2d\xdd\x55\xd5\xd4\x57\x75\x7f\xe7\xdc\x73\x38\x40\x57\xd7\ \x57\xdf\x77\x6f\xdd\xfd\xa6\xa5\x21\x10\x08\x04\x02\x81\x40\x20\ \x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\ \x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\ \x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\ \x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\ \x08\x04\x22\x79\x64\x6c\xbc\xf8\xe1\xe5\x01\xfe\x93\x1e\xae\xec\ \x79\x4f\x80\xff\x76\x46\x40\x7c\xc9\xc3\x09\x19\x5e\xbf\xb0\x36\ \xc3\x2f\x6c\xf4\x72\xe2\x4e\x99\x02\xc2\xfe\x8c\x80\x50\x08\x04\ \x3f\xcf\xff\x5e\xfe\x1f\xfa\xbf\xf0\x19\xf8\x6c\x06\x27\x7e\x0b\ \xae\x05\xd7\x84\x6b\xe3\x13\x46\x20\x6c\xc0\xe4\xe9\x5c\xd9\x17\ \x28\x83\xfe\x97\x27\x20\xac\xf3\x06\xc4\x63\x94\xc2\x94\x99\x07\ \x28\x33\x13\x6b\x49\x8c\xc0\x77\xd1\x9f\x8f\xca\xdf\xed\x17\xfe\ \xd3\xeb\x17\x3f\xef\xf3\x15\x7d\x08\x77\x06\x81\x30\x19\x3f\xf2\ \x09\x1f\xf1\x64\xf1\x5f\xf7\x04\xc4\xd7\xe8\xdb\xf9\x84\x97\x13\ \x3a\xbd\x01\x7e\xd6\x7a\x46\x4f\x94\xe4\x7b\xba\x4e\xe9\x38\xbd\ \xc7\x35\x19\x81\xb2\xbf\x80\x7b\xc7\x1d\x44\x20\x12\x80\xd7\x27\ \x7c\x8c\xaa\xdf\xff\x4c\x19\x6a\x2b\x65\xfa\x2b\x94\xa1\xa6\xed\ \xc7\xec\xba\x09\xee\xbd\xce\xe3\x17\xb7\x64\xf8\xf9\xef\xad\xcc\ \x29\xfd\x75\xdc\x61\x04\x62\x01\x7c\x3e\xdf\xfb\xbc\x7e\xfe\x8f\ \xa9\xfa\xbe\x82\x32\x4b\x09\xe3\x0c\xaf\x47\x4b\xa8\x93\x4d\x07\ \x4e\xf8\x12\xac\x1d\x4f\x00\xc2\x75\x78\xa1\xb0\xf0\x17\x40\x45\ \x96\x9d\x6e\x29\xb1\xdb\xed\x4a\x62\x84\x0a\x82\x7c\x4f\x96\xf8\ \x35\x78\x26\x78\x32\x10\xce\x05\x21\xcf\x78\xb9\xb2\xaf\x50\xa6\ \xdf\x46\x0f\x7f\xbf\x7b\x99\x5e\x91\xfa\xa8\xe9\x93\x0b\x9a\x01\ \x3c\x2b\x3c\x30\x08\x47\x20\xc3\x77\xf1\x37\xbc\x1c\xbf\xfc\x91\ \x83\x2c\x25\xcc\x94\x91\x2d\x92\xd5\x6f\x54\x12\x7f\x6e\x90\xac\ \xdf\x1d\x26\x9b\x0f\x5c\x21\xdb\x8e\x36\x90\xdd\xa7\x9a\x64\xda\ \x73\xa6\x99\x1c\x3c\xdf\xfa\x04\xc1\xef\xe4\xbf\xbf\xd3\x24\xff\ \x2f\x7c\x66\xdd\xae\xb0\x7c\x0d\xb8\x16\x5c\x33\x85\xc2\xa0\x1d\ \xc2\x90\xaf\xe4\x54\x7c\x1c\x4f\x10\x82\x49\x80\xe7\xfe\x61\x8c\ \x5d\x9c\xb4\x8a\xc9\x81\x39\xb7\x1c\xba\x42\xf6\x9e\x69\x21\xc7\ \xca\x3a\xc8\xb9\xda\x5b\x44\x68\xed\x26\xe1\xdb\x7d\xa4\xf6\x4e\ \xbf\xa9\x04\xd7\x84\x6b\x9f\x0b\xdf\x92\xbf\x6b\x2f\x15\x18\x5b\ \xde\xbe\x42\xb2\xb6\x06\x2d\x14\x0e\xf0\xec\xc4\x63\xf0\x2c\xf1\ \x44\x21\x18\x70\xe8\x15\xfe\xa2\xc7\xcf\xbf\x48\x0f\x6f\xa3\xa9\ \xcc\xce\x89\x84\xdb\x16\x22\x3b\x8e\x37\x92\x42\xbe\x83\x5c\x6c\ \xe8\x22\x21\x0b\x98\x3c\x59\x82\x7b\x81\x7b\x82\x7b\x83\x7b\x84\ \x7b\x85\x7b\x36\x59\x20\x34\x78\xfc\xc2\xf7\x5f\xde\x59\xf7\x7e\ \x3c\x69\x08\x5b\x61\xc5\xba\x92\x5f\x79\xa4\xe6\xdf\x33\xeb\xed\ \xbe\x76\x57\x0d\xd9\x7b\xb6\x99\x14\xd5\xdc\x24\xd5\x37\x7a\x6d\ \xc3\xec\x7a\x29\x78\xb3\x97\x9c\x0d\xdd\x24\xfb\xce\xb6\x90\x75\ \x3b\xc3\x66\x6a\x09\xdd\xb2\x79\xe0\xbb\xf0\xcb\x78\xf2\x10\x4b\ \x0a\x39\x49\x27\x20\xac\xa6\x87\x32\x6e\xf4\x60\xaf\x79\xb3\x8a\ \xe4\x15\x34\x90\x93\x15\x9d\xa4\xaa\xb3\x87\x39\x86\xd7\xa2\xea\ \xce\x5e\x79\x6d\x79\x05\xf5\x64\xcd\x1b\x95\x66\x98\x07\x92\x97\ \x13\x5e\xc5\xf4\x64\x44\xca\xf1\xca\xd6\x0b\xbf\xe4\xf5\xf3\x2f\ \x83\xe7\xda\xc8\x21\x5e\xb5\xb1\x82\xe4\x1e\xae\x97\xdf\xf2\xe1\ \xae\x3e\xc7\x31\xbd\xa2\x3f\x81\xae\xf5\xfc\xe5\x5b\xd4\x5c\xb8\ \x6a\x86\x30\x88\x42\x0e\x45\xfa\xa6\xe0\x07\xf1\x64\x22\x2c\xb6\ \xf1\x7d\xef\xa3\x87\xed\x87\xf4\xd0\xf5\x26\x7b\x60\x5f\x5d\x57\ \x2e\x7b\xd9\xc1\x61\xe7\x26\xa6\x57\x13\x06\xe0\x58\xdc\x46\xb5\ \x9f\x15\x6b\xcb\x8d\x68\x04\x3d\x1e\xbf\xf0\x03\x4c\x2e\x42\x58\ \x82\x0c\x3f\xff\x27\xf4\xa0\x85\x92\x3d\xa0\xdc\xf6\x10\x29\x28\ \x69\x93\x6d\x63\xb7\x33\xbd\x9a\xdf\x00\x9e\xd1\xda\x9d\xe1\xa4\ \x05\x01\xa4\x4f\x67\xfa\xc5\x2f\xe3\x89\x45\x98\xe3\xe0\xf3\x95\ \xfc\xee\xc3\x6a\xbb\xc4\x0f\x63\x66\xb6\x48\x72\x8f\x34\xc8\x1e\ \x72\x64\xf0\xc4\x08\x9e\x19\x98\x47\x99\xc9\x45\x13\xe6\x28\x15\ \x2c\xf7\x09\xbf\x8d\x27\x18\x91\x1c\x20\x73\xef\xa1\x9d\x3f\x9c\ \xb8\x9a\x5f\x21\xdb\xb7\xe2\xb5\x7b\xc8\xcc\x06\xa9\xa2\xfd\x9e\ \x1c\x49\x58\xb9\xa1\x22\x19\x6d\x60\x14\xfc\x03\x98\x66\x8c\x48\ \x08\xe9\x7e\xfe\x33\xf4\x00\x05\x93\x71\xea\x1d\xbc\x70\x8d\xc9\ \xb0\x1d\x0b\xe6\xc1\x81\xf3\xad\x49\x0a\x02\xa1\x6a\x59\xa0\xfc\ \x53\x78\xb2\x11\x1a\x4e\x3e\xe1\x59\x2f\xc7\xff\x34\xd1\xec\xbd\ \x57\xd7\x97\x93\xfd\xe7\x5a\xd0\xbe\x4f\x45\x38\xf1\x46\x0f\xd9\ \x57\xd4\x2c\x6b\x59\x09\x0a\x82\x09\xe8\x53\x00\x7b\x8c\x27\x1d\ \xf1\x1e\x64\x06\xca\xfe\x17\x3d\x24\x35\x89\x1c\xaa\xe5\x39\x22\ \xd9\x73\xba\xd9\x91\x71\x7b\x16\xf2\x0a\xa0\x76\x21\x33\x27\x61\ \x1f\x41\x30\x23\x50\xfe\x07\x78\xe2\x11\x8f\xf1\x28\x7d\x37\x21\ \x5b\x7f\x6d\xfe\x15\x52\xda\x84\x36\xfe\x52\x13\xf8\x59\xc0\x59\ \x98\xa0\x10\x18\x06\xff\x0e\x9e\x7c\x97\x03\xd2\x49\x1f\x35\xc5\ \xd4\x7d\x78\x7c\x6f\xd5\x90\xc3\xe7\xee\x92\xf3\x55\x71\x52\xd6\ \x10\x45\x26\xb4\x09\x41\x2e\x81\x3f\x2f\x94\xa8\x20\x28\x58\xbe\ \xbe\xea\xa3\xc8\x09\x2e\x04\x74\xb9\xf5\xfa\xc5\xd6\x44\x42\x7a\ \xf9\x47\xda\xc9\xb9\x2a\x49\x66\x7e\xa0\x0b\x94\x82\x37\x22\xc8\ \x80\x76\x49\x2a\xba\xdd\x47\x0e\x15\x5f\x4b\x2c\xa1\xc8\x2f\x76\ \x80\xd3\x17\x39\xc2\x4d\x2a\x7f\x80\xff\x36\xdd\xfc\xfb\x7a\x0f\ \x49\x20\xf7\x32\x39\x5e\xd2\xf7\x98\xf1\x17\x52\x49\x5d\x0c\x99\ \xcf\x66\xc4\xb7\xdc\x25\x1b\x7e\x56\x9b\x98\x49\x10\x10\xbe\x8b\ \x9c\xe1\x70\x40\x3c\xd8\x1b\xe0\x37\x3c\x4a\x14\xd1\x3c\x18\x2b\ \xd6\x56\x90\xdd\xc7\x6f\xd0\xb7\x7e\x7c\x51\xe6\x9f\xa7\xaa\x0e\ \xd4\x02\x6c\xa7\x0d\x50\x3a\x5a\xda\x2e\xa7\x5e\xeb\x4d\x1e\xa2\ \x2f\x86\x1c\x4c\x25\x76\x28\xa0\x6a\xcc\xe3\x17\x4e\xeb\x7d\x2b\ \x64\x6d\x09\x93\xe3\x97\xfa\x54\x19\x7f\x9e\x2e\xd6\xc6\xe4\x03\ \x87\x8c\x67\x3f\x82\x26\x26\x89\xa4\x16\xd3\x33\xf2\x0e\xce\x38\ \x70\x5a\x88\xcf\x27\xfc\x0f\xba\xb9\xb5\x7a\x9b\x6f\x6c\x39\xd0\ \x4a\x8a\x2a\x25\x5d\xcc\x3f\x4f\x95\x6d\x03\xc8\x70\x36\xf6\x0d\ \x40\x36\xa1\xfe\x26\x25\x62\xf8\x27\xd9\xa5\xff\x1d\x39\xc7\x01\ \xf0\xe6\x94\x7e\xda\xcb\x09\xb7\xf5\x6c\xfc\xca\x0d\x55\xe4\xf0\ \xf9\xee\x84\x18\x7f\x9e\x7e\x1e\x92\x48\xb8\x0b\x4d\x01\xbb\x47\ \x0a\x56\x6f\xd4\x59\x7e\xcc\x89\x37\xbd\x39\xc2\x73\xc8\x41\x0c\ \x03\xc6\x67\xe9\x6d\xd6\xe1\xcf\xad\x25\xa7\xf8\x81\xa4\x98\x7f\ \x9e\xca\x5b\x50\x0b\xb0\x3b\x95\xb7\x75\x93\x9c\x1d\x35\x7a\x4d\ \x82\x58\x3a\x27\x7c\x0e\x39\x89\x45\xb5\xdf\x2f\x7e\x99\xaa\x72\ \x43\x7a\x36\xfa\xcd\x3d\x4d\xe4\x5c\x45\xcc\x10\xf3\xcb\x61\xc1\ \x20\xd5\x02\x6e\xa3\x16\xc0\x82\x49\x00\x59\x84\x3a\x85\xc0\x03\ \x98\xe1\x80\x1c\xc5\x92\xda\x9f\xc5\xff\x15\x54\x82\x69\xf7\xde\ \x2b\x27\x3f\x3b\x7e\xc3\x30\xe3\x2f\x24\xe1\x2a\x26\x07\xb1\x42\ \x10\x25\xd0\x59\x6e\x3c\xe2\xcd\x12\xff\x12\x39\x8b\x05\x6f\x3f\ \x27\x7e\x4b\x2e\xfc\xd0\x11\xe2\x3b\x54\x74\xc7\x54\xe6\x97\xa9\ \x3a\x4e\x42\xb7\x50\x0b\x60\x85\x8a\x42\x37\xf4\x16\x16\x4d\x78\ \x02\xc2\x37\x91\xc3\xec\xcc\xfc\x01\xe1\x1b\x74\xa3\xc6\x35\xcb\ \x76\x37\x54\x91\x63\xc5\x3d\xe6\x33\xff\x23\x2a\x6d\xc0\xe4\x20\ \x96\xa8\xe4\xea\x1d\xf2\xd3\x4d\x55\xfa\xe6\x14\x64\x89\x7f\x83\ \x9c\x66\x47\xb5\x9f\x2b\xfb\x8a\x1e\xb5\xff\xf5\x4d\x35\x86\x9d\ \x7d\x9a\xbe\x00\x4a\xd5\x9d\xe8\x10\x64\xcd\x39\x08\x83\x56\x74\ \x99\x03\x30\xbe\x0c\x61\x3b\x6f\xff\xb0\x76\x21\x4f\x98\x9c\x11\ \xac\x65\xfe\x79\xba\x74\x19\xb5\x00\x16\x4b\x8c\xf5\x45\x08\xc4\ \x21\xaf\x5f\xfc\x3c\x72\x9e\x5d\xe2\xfc\x3a\x42\x7d\x10\xe6\x3b\ \x23\x46\x53\xc2\xfc\xf3\x54\x8d\x29\xc2\x4c\x36\x1c\xd1\x99\x39\ \x18\x83\x82\x32\xe4\xc0\xa5\x0c\xf5\x41\x86\x9f\x8e\x24\x9f\xec\ \xbc\x3a\x72\xd6\x84\x30\x5f\xa2\x54\x5c\x2b\x61\x8a\x30\xa3\xed\ \xc7\xd6\xef\xae\xd5\x95\x2c\x04\xc3\x5f\x91\x13\x97\x42\xed\xdf\ \x14\xfc\xa0\x9e\x36\xdd\x59\x5b\xa9\xda\x5f\x9e\x7a\xe6\x7f\x9c\ \x22\x7c\x0d\x7d\x01\x2c\x52\x88\x0a\x01\x98\x8e\xac\x19\x4a\x0e\ \x08\x97\x71\x3a\x51\x8a\x01\x15\x5b\x50\xb4\xa1\xe9\xf0\xdb\x5c\ \x93\x72\xb5\xff\xbd\x29\xc2\x71\x12\xee\x42\x86\x62\xd5\x1c\xc8\ \xde\xae\xab\xc9\x48\x11\x76\x1e\x4e\xa5\xdd\xff\xb0\xa4\x57\xd3\ \xdb\x7f\x3a\x45\x0e\x3f\xed\x14\x61\x4c\x0e\x62\x95\x2a\x3b\x7a\ \x74\x45\x07\xa0\x94\x18\x39\x33\x05\xf0\x70\xe2\x0b\x5a\xf5\xfc\ \x6b\xde\xa8\xb6\x3c\xd4\x97\x90\x16\x10\x8c\x63\x8a\x30\xe3\x21\ \xc2\xd7\x36\x55\xea\x19\x46\xf2\x0f\xc8\xa1\x16\x42\x6e\xe3\xa5\ \x91\xdf\x0f\x19\x7e\xc7\x8a\x7b\x6d\xc3\xfc\xf3\xc4\x5f\xc5\xb0\ \x20\xeb\xc9\x42\x2b\xd7\x57\x68\x77\x16\xca\x29\xfd\x34\x72\xaa\ \x15\xcc\xbf\xbe\xea\xa3\x19\x01\xe1\x9a\x6a\xdf\x3e\x4e\x24\x87\ \x8a\xee\xda\x8e\xf9\x1f\x26\x07\x49\x24\x74\x13\xb5\x00\xd6\xcb\ \x89\xa1\x37\xa4\x86\x10\x68\x87\x66\xb3\xc8\xb1\xe6\xa7\xf9\x6a\ \x76\xef\x35\xbb\xb0\xc7\xf4\x14\xe1\x7a\xd4\x02\x9c\x50\x40\xa4\ \xc3\x29\x78\x08\x39\xd6\x54\xe6\x17\x5f\xd2\x7a\xe8\x6f\xed\x6b\ \xb1\x35\xf3\xcf\x53\x10\x53\x84\x99\xa7\xfc\xe3\x8d\x3a\x72\x04\ \x84\x7f\x43\xce\x35\x23\xde\xef\x2b\xfd\x9f\x5a\x76\xbf\x7f\x6b\ \xad\x29\xf5\xfc\x29\x49\x11\xc6\x2e\xc2\xcc\x53\x4d\x57\x1f\x59\ \xbb\x4b\x33\x65\xf8\xfe\x32\x9f\xf0\xfb\xc8\xc1\x86\xe2\xfd\xc2\ \xb3\x5a\x43\x3a\x57\xae\xaf\x24\xa7\xca\x22\x4c\x30\xff\xbb\x5d\ \x84\x51\x0b\x70\xc2\xd4\xe2\x35\x6f\x56\x69\x0e\x25\xc5\xfc\x00\ \x23\xf1\x7e\x79\x50\xa7\x7a\x03\xcf\x64\x7b\xf8\x2d\x25\x15\xd7\ \x48\xa4\x16\x93\x83\x1c\xe1\x14\xd4\x6c\x34\xca\xf1\xab\x90\x93\ \x93\x61\xfe\x1c\xe1\x39\xad\xc6\x1e\x79\x87\xda\x98\x63\xfe\x79\ \xaa\xc0\x14\x61\x47\xd0\x9e\x33\xcd\xda\x53\x89\x31\x34\x98\x44\ \xaa\x2f\x55\x9f\xd4\xfb\xf6\xd7\x24\xdc\xba\xdb\x56\x5a\x00\xa6\ \x08\x3b\xa6\xbf\x60\x4e\xbe\xa6\x3f\x20\x88\x03\x47\x12\x4a\xf5\ \x15\x7e\xa2\x9a\xec\x93\x53\x4e\x4e\x94\xf4\x31\xcb\xfc\xf3\x24\ \x36\x63\x8a\xb0\x53\x46\x91\x69\xce\x23\xf4\x0b\xff\x17\x39\x5b\ \x07\x56\xf8\x4a\x7e\x17\x3a\xb1\xaa\x3d\xcc\xdd\x36\x8f\xf7\xeb\ \x4e\x0e\xaa\xc6\x14\x61\x17\xe5\x07\xdc\x4f\xe7\xca\x7e\x0b\x39\ \xdc\x60\xc2\x0f\x97\x77\x59\x73\x56\x1f\x4b\xc4\x37\xa2\x16\xe0\ \x94\x59\x84\x5a\x03\x49\xe9\xd9\x7e\x1b\x39\x5c\xb5\xd0\xa7\xec\ \x79\xb5\x42\x9f\x4c\x87\xa8\xfe\x4f\x53\x2a\x52\x84\xeb\xee\x46\ \x48\xe3\xbd\x28\x69\xea\x8d\x91\xd6\x3e\x89\xb4\x47\xe2\xe4\xfa\ \xc0\xa0\x4c\xf0\x33\xfc\x0e\xfe\x06\xff\x03\xff\x8b\x4c\x9d\x84\ \x29\xd0\x7c\x97\x2c\xcf\x11\xd5\x0b\x86\xb0\x9f\xa0\xb2\xe3\x0f\ \x9a\x2b\xa8\x49\xd0\xfc\x82\x0e\xc7\x31\xbf\xd9\x29\xc2\xf5\xdd\ \x03\xa4\x83\x32\xf4\x9d\xf8\x30\x19\x78\x30\x46\x86\xc6\x27\xc9\ \xd4\xcc\x2c\x49\x14\xf0\x19\xf8\x2c\x5c\x03\xae\x05\xd7\x84\x6b\ \x23\xa3\xab\xd3\x81\xf3\xad\x5a\xa6\x40\x1d\x3a\x04\x17\x57\xfd\ \x7f\xa8\xde\xd0\xb3\x86\xaa\xfe\x92\x23\x05\x80\xdc\x3f\xb0\x33\ \x92\xf4\x9b\x1d\xde\xe0\xbd\x43\x23\xe4\xc1\xc4\x14\x99\x9b\x23\ \x96\x62\x6c\x6a\x5a\x16\x0a\x37\xa2\xf7\xc9\x95\x6e\xd4\x14\x16\ \x8b\x0a\xf8\xf3\x42\x1a\x13\x88\xf9\x17\x91\xe3\x9f\x78\xfb\x17\ \x7d\x88\x3e\x98\x5e\xb5\x87\x76\xf8\xdc\x5d\xc7\x32\x7f\xa2\x5d\ \x84\x81\xe9\x81\x01\x07\xc7\x26\x2c\x67\x78\x35\xc0\x77\xc3\x3d\ \xc0\xbd\xa0\xd9\xf0\x64\x82\x90\x86\x16\x70\xcf\xe7\x13\x3e\x80\ \x9c\xff\x6e\xb1\x4f\xa6\xda\x03\x5b\xbf\xb3\xc1\xd1\xcc\xff\x38\ \x45\xb8\x5d\x5d\xc5\x6e\xeb\x97\xe4\xb7\xef\xcc\xec\x12\x72\xbd\ \x02\xe0\x9e\xe0\xde\xae\xd1\x7b\x44\x21\xd0\x4f\x36\x1f\xb8\xa2\ \x31\x86\x5e\x58\x86\x9c\x4f\xf1\x23\x9f\xf0\x11\x6f\x40\x8c\x28\ \x3a\xfe\xb2\x45\x72\xa2\xa4\xdf\x15\x02\xa0\x38\xbc\x78\x8a\x30\ \x38\xea\x40\xbd\x67\x05\xa3\x93\xd3\xb2\x56\xe0\x66\x01\x20\xb4\ \x76\x93\x4c\x15\x87\x20\x35\x79\x07\xe0\xec\xa3\xe7\x3f\x20\xac\ \x56\x93\x94\xb9\x07\xaf\xb9\x82\xf9\x17\x4b\x11\x06\xc6\x1f\x99\ \x64\x87\xf1\x17\xf3\x17\xdc\x8a\xdd\x27\x97\x5d\x2a\x04\xb4\x26\ \x10\x53\x21\xb0\xc2\xdd\x49\x3f\xeb\x4a\x7e\x45\x6d\xa8\xc7\xab\ \xeb\x2b\xc8\xcf\xc3\x11\x57\x09\x00\xe8\x22\xdc\xd6\x17\x97\x99\ \xc7\x29\x80\xb5\xb4\xf5\xc7\x5d\x27\x00\xaa\xae\xf7\x68\x0d\x1e\ \x8d\x41\xa7\x2b\x37\x7b\xfe\x57\xa8\x49\xc8\xfd\x45\x2d\x8f\x46\ \x36\x45\xc8\xa5\x5a\xc9\xf1\xcc\x5f\x5a\x7b\x9f\xdc\x8b\x4c\x12\ \xa7\x42\x1a\x1d\x27\x0d\xf7\xdc\x15\x4a\xdc\x77\xb6\x45\xcb\x21\ \xe8\x75\x25\xf3\xbf\xbc\xb3\xee\xfd\x74\xf1\x77\x15\x27\xf8\x6e\ \xac\x90\x27\xb4\x3c\xd1\xa2\xb9\x6d\x40\x2e\xa5\x75\x1a\xe3\xc3\ \x30\xd1\xd6\x9b\xa3\x64\x7a\x66\x8e\x38\x1d\xe0\x2c\xec\x8a\x0f\ \xbb\x6a\xb6\xc0\xca\x0d\xaa\x5a\x40\x37\xf0\x82\xfb\x6c\x7f\x3f\ \xff\xa2\x9a\x64\x3c\x78\xe1\x9a\x72\x9b\xe6\xd6\x01\x72\x21\xe8\ \x0c\x41\x50\x12\x1e\x24\x03\xf1\x29\xe2\x36\x40\x92\x91\x5b\xb4\ \x81\x03\xe7\x5a\xb1\x7d\xd8\x22\x15\x7f\x0d\xca\xb6\x7f\x39\x95\ \x9c\xbd\x1a\x09\x17\xfd\x44\x6c\x8a\xca\x05\x35\xcc\xa6\x00\x37\ \x0d\x93\xf1\xc9\x59\xe2\x56\x4c\xce\xcc\xc8\xa1\x4d\x37\xcc\x1a\ \x54\xf7\x05\x88\x57\xd3\x08\x79\xc6\x3d\x6f\xff\x2c\xfe\xeb\xaa\ \xd5\x7e\xa7\x9a\xf4\xf7\x67\xbb\x15\x21\x7c\x63\x8c\x9c\x67\x4c\ \x10\x74\xdc\x19\x5b\xd2\x24\x1e\xbb\x00\x1e\x41\xf7\xe0\x03\xe7\ \x47\x04\x4e\xaa\x47\x04\x3c\x59\xe2\xd7\xdc\xf4\xf6\x3f\xae\xd6\ \xdb\xbf\xfc\xda\xbd\xc4\x87\x39\xde\x88\xc8\x39\xf5\x2c\x94\x00\ \x77\xf7\x4f\x20\xe7\x3f\x85\xd8\xc8\x38\xb9\x7c\xd7\xd9\xd3\x85\ \x34\x66\x0a\x14\xb8\x83\xf9\x7d\xc2\xc7\xd4\x5a\x7d\xe5\x15\xd4\ \x1b\x0b\xbd\x74\x40\xc4\xc0\x9e\x82\xa0\x38\xe8\x4e\x7b\x3f\x11\ \xbf\x80\x93\x53\x8a\x73\x0f\xd7\xab\x99\x01\x93\xaf\xe4\x54\x7c\ \xdc\xf9\x02\x80\xe3\x97\xab\xa9\x42\x17\x1b\xba\xcc\x19\xea\x68\ \xb3\x88\xc1\xa5\x9a\x41\x12\x1f\x5a\xba\xd8\xfe\xec\xec\x1c\x99\ \x9c\x9e\x26\xe3\x93\x93\x64\x74\x7c\x82\x8c\x8c\x8f\x93\x07\x63\ \x63\x32\xc1\xcf\xf0\x3b\xf8\x1b\xfc\xcf\xec\x12\xda\x26\x90\xf8\ \xe4\xd4\xaa\xc3\x8b\xf5\x5d\xea\x66\x00\xc7\x7b\x9c\xcd\xfd\x84\ \x3c\xe3\xf5\x8b\x1d\x4a\x0f\x20\x3b\x3f\x64\x72\x93\x86\x88\x1c\ \x31\xf8\x79\x68\x69\x05\x41\x09\x65\xfe\x07\xa3\x33\x29\x2c\xd2\ \x99\x23\x13\x94\x91\x86\x47\x46\x49\xec\xfe\x10\x89\x48\x71\xd2\ \x17\x93\x12\x22\xf8\x0c\x7c\x76\x78\x74\x54\xbe\xd6\x5c\x0a\x85\ \x02\x24\x0e\x39\x55\x08\x70\xdb\x54\x2b\x05\xdb\x1d\xed\x0c\xf4\ \x72\x65\x5f\x51\x93\x80\x05\x25\x6d\x16\x95\x68\x46\xe4\xe1\x9c\ \x17\xaa\xa5\x25\x51\xfb\x53\xf1\xe6\x87\xb7\x36\xbc\xc5\x25\xca\ \xb4\x89\x32\xbb\x5e\x92\x86\x86\xe4\xef\x48\x85\x86\x00\x9a\x80\ \x13\xcd\x81\x23\x97\xda\x34\xb4\x80\xb2\xe7\x1d\x9c\xf9\xc7\x6f\ \x57\x0c\xfd\xad\x2b\x97\x93\x26\x2c\x9d\xe8\x72\x33\xb5\x11\x03\ \x70\xf8\x59\x6d\xf3\x4f\x4e\x4d\x91\xc1\xe1\x07\xa4\x5f\x92\x2c\ \x63\xfc\xa7\x09\xbe\x0b\xbe\x73\xd2\xe2\x74\x65\x28\x35\xbe\xec\ \xc0\xc4\x20\xb5\x06\xa2\x1e\xbf\xb8\xc5\x91\xcc\x0f\x13\x52\xe8\ \x02\xfb\x95\x16\xbe\xed\x68\x43\xea\x36\xa1\x73\x40\xae\xbf\xb7\ \x5a\x00\x74\x5b\x98\xd6\x0b\xb6\xba\x34\x34\x9c\x32\xa6\x57\xd4\ \x0a\xa8\xc6\x31\x61\x61\xc1\x12\x44\x07\x9c\xa6\x05\x80\xa3\x5b\ \xc5\x19\xd8\xe3\xc8\x8e\x41\x5a\xb1\x7f\x68\xa2\x90\xf2\x62\x8d\ \x8e\x01\x72\x31\x2c\x59\x16\xe7\xb7\x02\x53\x94\xf1\x63\x16\xaa\ \xf9\xc9\x12\xdc\xd3\xd4\xb4\x35\x7e\x0e\xa7\xe5\x09\x14\xd5\xdc\ \x54\x35\x03\xd2\xfd\xfc\x57\x1d\x58\xf6\xcb\xef\x52\x5a\xf0\xea\ \x37\x2a\x49\xb8\xab\x6f\xc9\xba\xb9\x42\xc4\xc0\x4c\x47\x21\x64\ \xf8\x99\x6d\x26\x83\x13\x6e\x68\x64\xd4\x76\x8c\xff\x34\xdd\x7f\ \x30\x62\xba\x8f\x00\xae\xe6\xa4\x46\x23\x70\xd6\x57\x6f\xac\x54\ \x29\x13\xe6\xb7\x3b\x8a\xf9\x1f\x35\xfc\x1c\x50\x5a\xf0\x8e\xe3\ \x8d\x36\xd8\x94\x7e\x79\x50\x87\xd1\xd4\x62\xc8\xed\x37\x3b\xbd\ \x17\x6c\xed\x81\xf8\xa0\xed\x99\x7f\x9e\xe0\x5e\xc1\x44\x31\x3b\ \x6d\xd8\x49\x91\x81\xfc\x42\xd5\x11\xe3\x7d\x8e\x8a\x06\xa4\x73\ \x65\x5f\x50\x53\x79\x2e\xd4\xdd\xb2\x8f\x74\xbe\x1d\x21\x42\x53\ \x34\x29\x47\x21\x54\xf5\x0d\x0c\x9a\x6b\x0f\x8f\x8e\x8f\x33\xc3\ \xf8\x4f\xd3\x83\x51\x73\xcd\xa0\xfb\x63\x13\xae\xe9\x1b\x98\x99\ \x5d\xf6\x59\x27\x75\xfd\x79\x5d\x69\xa1\x30\x62\x79\xa9\xd4\x7f\ \xd5\xd4\xe2\x9b\x89\xa7\x16\x43\x49\xaf\x99\x2a\x7f\x7c\x78\x98\ \x59\xe6\x9f\x27\x58\x83\x99\x39\x04\x5d\xd2\x90\x2b\xcc\x00\xe8\ \x94\xe5\xa4\xdc\xff\x1a\xe5\xd4\xdf\x06\x7b\x57\x72\xe9\x8c\x18\ \x94\x86\xef\x93\xa9\x69\x73\x0e\x3a\xd8\xd0\x92\x0d\x1d\x7d\x46\ \x1c\x84\x66\xf9\x05\xa0\x9f\x80\x53\xca\x88\x73\x8f\x34\xa8\x69\ \x01\x95\x4e\xca\xfd\x9f\x51\x5a\xe8\xc9\xca\xeb\x6c\xb4\x77\xea\ \x88\xa8\x46\x0c\x7a\x06\x26\x4d\x3a\xe0\xb3\x24\x3a\x78\xdf\x31\ \xcc\x3f\x4f\xb0\x26\x58\x9b\x19\x88\x8e\x8c\x39\x42\x00\x9c\x10\ \xaf\xab\x09\x80\x99\x74\x5f\xf1\xaf\xb1\xaf\xfe\x73\xc2\x3f\x2b\ \x7a\x3b\xb3\x45\x52\xd5\xd9\xc3\xce\xa6\x75\xf5\xcb\x4d\x3b\x61\ \xb4\xf7\x42\xe6\xaf\x69\x1e\x36\xed\xcd\xef\x44\xe6\x5f\x28\x04\ \xcc\xd2\x04\x9c\xd0\x47\x00\x7a\x06\x66\x70\xa2\x5a\x6d\xc0\x3f\ \x39\x41\x00\xe4\x2a\x2d\x70\xed\xae\x1a\x46\xed\xb7\x77\x23\x06\ \x40\x66\xe4\xf9\xcf\x39\x4c\xed\x57\x33\x07\xcc\xf0\x09\x8c\x4e\ \x4d\x3b\x42\x0b\xc8\xc9\xaf\x51\xc9\x0a\x14\x36\x3b\xc0\x01\x28\ \x5e\x51\x5a\xe0\xde\xb3\xcd\x8c\x8f\x81\x8a\x90\xd6\x2e\x73\xde\ \xfe\x4e\x70\xf8\xe9\x77\x0c\x3e\x30\xe5\x99\x39\x61\xf6\xc0\xde\ \x33\xcd\x6a\x66\x40\x2d\xd3\xcc\xff\x70\xe8\x87\x30\xad\x9c\xfd\ \x77\x93\xf9\x0d\x34\xa3\x7d\x37\x94\xe4\xba\x85\xf9\xe7\x69\x64\ \x6c\xdc\xb8\x16\x30\xc9\xbe\x16\x70\x36\x78\x43\x4d\x00\x4c\x33\ \x3d\x3c\x24\x23\x20\x7c\x43\xcd\xfe\xd7\xea\xfb\x67\x77\x82\xc1\ \x1d\x66\x24\xf9\xb8\x8d\xf9\xe7\xc9\x8c\x64\x21\xd8\x03\xd6\x8b\ \x83\x54\xfd\x00\x2c\xb7\x0a\xa3\xea\xff\x6b\x4a\x0b\x83\xba\x68\ \xd6\xa5\xb7\xd1\x71\x5d\xe0\x10\x63\x29\xc3\xcf\x8a\x8c\x41\xa3\ \xfe\x00\x28\x1b\x66\xfd\x1c\x05\x54\xa6\x09\x33\x9d\x0f\x90\xe1\ \x17\x4e\xd8\x39\xfd\xd7\x08\x41\x6e\xba\xe1\x16\x58\xa9\xcd\xed\ \x9f\xec\x93\xa4\x8a\xbe\x58\x3c\xaf\x2f\x16\xfb\x31\xfd\xf9\x85\ \x5e\x49\xfa\x6b\x20\xf8\x59\xfe\x1d\xfc\x2d\x2a\x55\xca\xff\x9b\ \xa2\xfb\x82\x67\x60\x14\xac\xd7\x09\xec\x50\x49\x0b\xa6\x5a\x74\ \x21\xc3\x0d\x40\x84\x4e\xa5\x85\x15\xf2\xed\x4c\x6f\x1a\x4c\xc2\ \x35\x5a\xd5\x97\x12\xa6\x8f\x49\x27\xfa\xa3\xd1\x6f\xf7\xf6\xf6\ \x7e\x48\xef\xbe\xf5\xf7\xf7\x7f\xb8\x37\x16\xfb\x07\xfa\xd9\x93\ \xa9\x10\x06\x46\xab\x08\x61\x2f\x58\x3e\x4b\xc7\xca\x3a\xd4\xbb\ \x04\x31\xf9\xf6\xdf\x78\xf1\xc3\xde\x00\x3f\xab\xb4\xb0\x4b\x8d\ \x5d\xcc\x6e\x18\x74\xaa\x31\x3a\xa2\xdb\xda\x92\xde\xd8\x44\x6f\ \x4c\x7a\xeb\x9e\x24\xfd\xb6\xd1\x7d\xec\x91\xa4\xdf\xa1\x9a\xc1\ \x56\x2b\x05\x01\x3c\x0b\x23\x98\x9e\x9d\x25\x97\x19\xee\x1e\xa4\ \xd1\x2b\x70\xc6\xe7\x2b\xfa\x10\x7b\xf6\x3f\x27\x7c\x51\xcd\x01\ \x18\xba\xdd\xc7\xec\x86\x41\xf8\xc9\x08\xa0\x81\x86\x85\x6f\xd4\ \xb2\x7b\xd1\xe8\x27\xcc\xde\x4f\xaa\x11\x3c\x47\x05\x81\x60\xd5\ \x7d\x4f\x4c\x19\xf3\xa7\x74\x46\xd9\x75\x06\x86\x6e\xf5\xa9\x3a\ \x02\xd3\x39\xe1\x73\xec\xa9\xff\x7e\xe1\x3f\x95\x16\xe4\xcf\x0d\ \x32\xad\xb2\x41\xab\x2a\x23\xb0\x28\xe1\x67\x9a\xda\xef\x3e\x7a\ \x79\xcb\xba\xc9\xd0\x6b\x3f\xd3\x2f\x49\x3f\xa1\xdf\x35\x65\x37\ \x2d\x60\x90\xf1\x4a\xc1\xac\x2d\xd5\x2a\x7e\x00\xf1\x25\x16\x2b\ \x00\xd7\x29\x2d\x68\xcb\xa1\x2b\xcc\x6e\xd4\x95\xee\x88\xa1\x66\ \x1f\xd0\xc3\xcf\x02\xe6\x1f\xed\x8b\xc7\xff\x26\x55\x7b\x1b\x89\ \xc5\xbe\x41\xbf\xf3\x81\xe9\x61\x41\x03\x39\x15\x10\x4d\x60\xb9\ \x89\xe8\x5b\x6f\x5f\x51\x89\x04\xf0\x39\x0c\x56\x00\x8a\xc7\x14\ \x33\x00\xcf\xb4\x30\xbb\x51\x1d\x06\x63\xff\xd0\x4c\xd3\x64\xc6\ \x19\xe9\x89\xc7\xff\x2c\xd5\xfb\xdb\x1b\x8f\x7f\x49\x16\x3c\x26\ \xae\x65\xd0\x60\x86\x60\x47\x24\xce\xec\xb9\xda\x73\x5a\x2d\x23\ \x90\x3f\xc2\x62\x09\x70\xad\xd2\x82\xc0\xeb\xc9\xea\x46\xf5\x0d\ \x8d\x1a\x8a\xfb\x9b\xdc\xbd\x77\x1a\xc2\x78\x4b\xb5\xc7\x7d\xd1\ \xf8\xdf\xc9\xa6\x87\x69\xdd\x86\xe3\x86\x8a\x85\x7a\x87\x46\x98\ \x3d\x57\x47\x4b\xdb\xd5\x1c\x81\x21\x16\x05\x40\x54\x31\x05\xb8\ \xf6\x16\xb3\x1b\x35\x62\xa0\x03\x2e\xf4\xd4\x37\xf7\xed\x1f\x5f\ \xb1\xd4\xfb\xdc\x1b\x8b\xad\x31\x73\x4d\xf0\x8c\xdc\x98\x14\xa4\ \xd1\x28\xb4\x8f\xc1\x10\xa0\x72\xbb\x23\xa1\xb5\x9b\x5d\xfb\xdf\ \x3e\xce\xbf\x32\x2b\x1d\x7e\x09\x38\x06\xdf\xd7\x17\x8b\x89\x66\ \x0e\x1f\x31\xd2\x3c\x14\xf6\x88\xc5\xb3\xc5\xb7\xdc\x55\x13\x00\ \x73\x4c\x85\x02\x97\x07\xf8\x4f\xaa\x85\x00\xc3\x8c\x86\x00\x8d\ \xd8\xff\xe0\xa4\x32\x33\xc1\x07\xc2\x72\x76\xd9\x6f\x08\x3b\x42\ \xee\x81\x59\xeb\x33\x92\x1e\xcc\xaa\x1f\xa0\xa6\x4b\x3d\x14\x98\ \x19\x28\xff\x43\x66\x04\x40\xa6\x9f\xff\x33\xc5\x1e\x80\x6f\x54\ \x32\xab\xa6\xdd\x89\x0f\xdb\x22\xf6\x0f\x49\x3e\x76\xdb\x73\x2a\ \x00\xb6\xd9\x21\x27\x00\xf6\x88\xd5\xf3\xb5\x4a\xad\x47\x20\x27\ \x7c\x91\x1d\x13\x80\xe3\xff\x5e\x69\x21\x81\xbc\xa0\x2b\xd3\x7f\ \x61\xc8\xa6\x59\x6f\x7f\x33\x32\xfc\x4c\xf7\x05\x0c\x0e\xfe\x9e\ \x59\xf9\x01\xf0\xac\x92\x45\xe4\xc1\x28\xbb\xb9\x00\x5b\x83\x6a\ \x45\x41\xdf\x64\x27\x07\xc0\xcf\xff\x87\xd2\x42\xd6\xef\x0a\x33\ \xbb\x41\xc3\xe3\xc9\xf7\xfd\x33\x31\xf5\xf7\x84\x5d\xf7\xbd\x3f\ \x16\x3f\x65\xd6\xb8\xb1\xa4\x0b\xac\xe8\x1e\xb1\x7a\xbe\xa0\x43\ \x96\xa2\x1f\x80\x13\xfe\x9d\xa1\x22\x20\x7e\xb9\xd2\x42\xde\x3a\ \x58\xc7\xec\x06\x4d\xcd\x24\xdf\xd4\x32\x99\x11\xdd\x8b\x86\xca\ \x62\xb1\xbf\xb7\xeb\xbe\xf7\xc6\x62\xdf\x31\x63\x8d\xf0\xac\x92\ \x1f\x20\x32\xcb\xec\xf9\xda\xb4\xbf\x4e\xcd\x11\xe8\x65\x29\x0d\ \x78\xad\xd2\x42\xb6\x1f\x63\xb3\x0c\x18\xb2\xcc\x92\x8e\xff\xcf\ \x9a\xe6\x00\x9c\x84\x4a\x3d\xbb\xee\xfb\xc0\xc0\xc0\x47\xcc\x32\ \x03\x8c\xe4\x03\xb0\x9a\x11\x08\x03\x72\x15\x05\x80\x5f\xcc\x66\ \xc8\x04\x10\x36\x2b\x2d\x64\xd7\xc9\x26\x26\x37\xa7\xf1\x5e\xd4\ \xd0\x24\x5f\x53\x04\x80\x24\x55\xd8\x7d\xef\x7b\x63\x52\xb5\x39\ \x25\xc2\xc9\xa7\x05\xb3\x3a\x37\x60\xe7\x89\xab\x6a\x1a\xc0\x1b\ \x0c\x99\x00\xe2\x36\xa5\x85\xfc\xec\x34\x9b\x02\xa0\xb9\x37\x96\ \xf4\x81\x1c\x9f\x9c\x34\x2b\xf1\x27\xd7\xee\x7b\x6f\x56\x34\x00\ \x9e\x59\xb2\x68\xea\x89\x32\x79\xc6\x76\xbf\xd3\xa4\x16\x05\xc8\ \x65\x48\x00\x08\xbb\x95\x16\xb2\xef\x2c\x9b\x75\x00\xad\x7d\xc9\ \x77\x00\x1a\x9b\x30\x2b\x03\x30\xf6\x63\xbb\xef\x7d\x7f\x2c\xf6\ \xff\xcc\x58\x2b\x3c\xb3\x64\x01\x7b\xe5\xb8\x0e\xc1\x9c\xb8\x93\ \x9d\x30\x60\x40\x3c\xa0\xb4\x90\xfd\x45\x6c\x0a\x80\xf6\x48\xf2\ \x8e\xa9\x11\xb3\x06\x7c\x4a\xd2\x0b\xb6\x17\x00\xd1\xf8\xbf\x98\ \x93\x12\x9c\x7c\xd7\xe0\x36\x46\x93\x81\xf6\x9f\x6b\x51\x33\x01\ \xf6\xb3\x54\x07\x50\xa0\xb4\x90\x83\x17\xae\xb9\xae\x03\xb0\x69\ \x6d\xbf\x53\x58\xf2\x9b\xb4\x09\x30\x10\xff\x5b\x53\x26\x0b\x8f\ \x25\x9f\x73\xc1\x6a\xa7\x60\xe0\x0d\x15\x01\x50\x80\x02\x00\x05\ \x00\x0a\x00\x14\x00\x68\x02\xa0\x09\x80\x26\x00\x9a\x00\xe8\x04\ \x74\x9d\x13\xb0\x3f\x16\x7b\xc5\xf6\x02\xe0\x61\xcb\x30\x74\x02\ \xba\xd9\x09\xa8\x1a\x06\x3c\x85\x61\x40\x0c\x03\x62\x18\xd0\xd1\ \x61\x40\x4c\x04\xb2\x28\x11\x28\x2a\x55\x62\x22\x10\x26\x02\x61\ \x2a\x30\xa6\x02\xdb\x12\xd1\x68\xf4\xa3\x98\x0a\x8c\xa9\xc0\xe0\ \x04\xcc\x54\x2c\x06\x3a\xc0\x6e\x47\x60\x3b\x14\x03\xc1\xc4\x1e\ \xdb\xaa\xff\x92\xf4\x5d\x2c\x06\x32\x50\x0c\x74\xa0\x4e\xc5\x04\ \xe0\x3d\x2c\x09\x80\x97\x14\xcb\x81\x77\x63\x39\xb0\x41\x3a\x69\ \xdf\x2c\x40\x2c\x07\x36\x42\xeb\x76\x86\x95\x05\x80\x9f\x7f\x91\ \x1d\x1f\x40\x80\xff\xb6\x13\x87\x82\xd8\xa5\x21\x08\x8c\xeb\xb2\ \x9d\xed\x8f\x0d\x41\xac\x1d\x0e\x92\xcd\xff\x1d\x3b\x02\x80\x2b\ \x7b\x5e\x69\x21\xab\xb1\x25\x98\x19\xd1\x80\xad\x36\xf4\xfe\x6f\ \xc7\x96\x60\xc6\x68\xf5\xc6\x0a\x65\x01\xe0\xe7\xff\x84\x1d\x01\ \x90\x53\xfa\x09\x47\x36\x05\x35\x90\x0c\x64\x41\x53\xd0\x4f\xd9\ \xc8\xf6\xff\xb4\x99\xe3\xc2\xb0\x29\xe8\x22\xf3\x01\x7d\xc2\xff\ \x66\xc7\x07\x80\x6d\xc1\x17\x6f\x0b\x3e\x64\x66\x5b\xf0\x38\x6f\ \x9b\xb6\xe0\x92\x54\x6e\x5e\x5b\xf0\xe4\xb5\x2c\x6c\x0b\x6e\x2b\ \x47\xa0\x30\xa0\x38\x18\x24\x8c\x83\x41\x4c\xca\x0c\x5c\x69\x83\ \xb7\xff\x6b\x38\x18\x04\x07\x83\x2c\x52\x10\x24\x86\x9d\x39\x1a\ \x6c\xc4\x56\xa3\xc1\x60\x3c\xd7\x12\xe6\xfd\x7f\x8b\xde\xc3\x0c\ \x8e\x06\xb3\x7c\x34\x58\x90\x45\x01\xe0\xcc\xe1\xa0\x06\xfc\x00\ \x16\x0d\x07\x1d\x85\x41\x9d\x29\xf7\xfa\x0f\xc4\xbf\x8c\xc3\x41\ \x53\x33\x1c\xd4\x13\x10\x0f\x33\x27\x00\x9c\x3a\x1e\x1c\xb2\xcc\ \x8c\x8d\x07\x9f\x36\x5b\x00\x3c\x1c\x0f\x9e\x42\x4d\xe0\xd1\x9b\ \x7f\xd4\xec\x75\xb8\x7a\x3c\xf8\xc1\x3a\x67\x64\x01\x2e\xf0\x01\ \xfc\x50\x69\x41\x30\x00\x81\xd5\x8d\x02\x1a\x1c\x9b\x30\xf4\xa6\ \x32\x79\x46\xe0\x3c\xcd\xf4\x45\x25\x9f\x95\x8e\x41\x7a\xed\x67\ \x1e\x55\xfb\x4d\x9b\x7d\xff\x46\x66\x02\x02\xe2\x74\x4f\x58\x3e\ \x53\x3e\x95\x1c\x00\x8f\x5f\xf8\x01\x73\x02\x20\x9d\x2b\xfb\x82\ \x5a\x28\xb0\xe6\x56\x1f\xb3\x9b\x75\x23\x7a\xdf\xd0\x61\x85\x38\ \xb7\x05\x02\x60\xbe\x6f\xa0\x08\x61\x39\x0b\x9c\x7d\x9f\x81\xae\ \xc4\x56\xdd\xb7\x91\xd8\x3f\xa0\x33\x3a\xc8\xec\x79\x0a\xdd\xd2\ \x98\x0b\x98\x5d\xf6\x59\xf6\x04\xc0\xa6\xe0\x07\xe9\xcd\xcf\x28\ \x2d\xea\x62\x43\x17\xd3\x66\xc0\xcc\xec\x9c\xa1\x03\x1b\xb3\x46\ \x0b\x98\xa7\x29\x28\xcb\x85\xec\x3c\x73\x32\xfc\xe4\x24\x9f\x29\ \xab\xee\xd7\x48\xea\x2f\x60\x7a\x76\x96\x5c\x66\x58\xfd\x2f\xbe\ \xd2\xa5\xe6\x00\x9c\x01\x5e\x4a\x63\x11\xd4\x76\xe9\x70\x62\x24\ \xc0\x68\x5a\x30\x60\x6a\x7a\xc6\x4a\x01\xf0\x58\x10\x40\x7e\x3e\ \x4c\xec\x81\xa1\x1d\x7a\xf7\x4d\x1e\xf0\x21\x49\xdf\xed\x8d\xc5\ \x4f\x5b\xc9\xf8\xf3\x34\x3d\x33\x63\xe8\x59\x46\xe8\x5e\xb0\x7c\ \x96\x8e\x95\x29\x47\x00\xa8\x29\x7d\x2d\x8d\x55\xd0\x05\x1c\x57\ \x5a\xd8\x8e\xe3\x8d\x4c\x6f\xda\xb5\x7e\x89\x18\xc5\xd0\xc8\x68\ \x2a\x84\xc0\xbb\xc2\x20\x2a\x55\x81\x66\x20\xdb\xf1\x92\xf4\x02\ \xf4\x18\x94\x49\x92\xbe\xf7\xd0\xb6\x8f\x6d\x7f\x54\xcf\x3f\x9d\ \xaa\xfb\x1a\x1e\x19\x35\xfc\x1c\x61\x2f\x58\x3e\x4b\xf9\x85\x8d\ \x6a\x1a\xc0\x51\x76\x05\x00\x27\xac\x51\x5a\x18\xb7\x2d\xc4\xf4\ \xa6\x01\x3d\x98\x30\x66\xb7\x82\xe7\x7a\x20\x3e\x98\x4a\x21\x60\ \x2b\x82\xb5\x1b\x49\xfb\x95\x1b\xae\x4e\x4c\x31\x7f\x8e\x02\x79\ \x21\x95\x56\x60\xfc\x2a\x66\x05\x40\x46\xa0\xec\x2f\x14\x55\x1b\ \x4e\x24\xd5\x37\x7a\x98\xde\x38\x23\x9d\x82\xdf\x35\x05\xa6\x5d\ \x2b\x00\x26\x0d\x74\xfd\x61\xbd\x03\xf0\x3c\x01\x0f\xa8\xd6\x00\ \xf8\xf9\xaf\xb2\x2b\x00\x1e\xd6\x04\x4c\x2b\x2d\x0e\xd2\x1f\x59\ \x97\xde\xa3\x53\xc6\x0f\xf1\x88\x59\x6d\xc3\x19\xa2\x91\xb1\x71\ \xc3\xcf\x6d\x74\x92\xfd\xb7\xff\x99\xa0\x6a\x0a\xf0\x14\x73\x35\ \x00\x8b\xf8\x01\xea\x9c\xd6\x21\xd8\xcc\x90\xe0\xe3\x38\xf6\xf0\ \xb0\x6b\x98\xdf\x68\xc6\x9f\x13\x42\x7f\x8f\x33\x00\xd5\x3a\x01\ \x07\xc4\x70\x1a\xeb\xf0\xf8\xc5\x2d\x4a\x0b\x84\x0e\x28\xac\x6f\ \xe0\x65\x4a\x63\x26\x68\x01\x60\x0b\x4b\xd6\x86\x06\x6d\x41\x10\ \xfe\x34\x6a\xf7\x3f\x7c\xfb\x4f\x33\x7f\x76\x80\x72\x76\xd4\xa8\ \xf4\x00\x10\xdf\x64\x5e\x00\x64\xf8\xf9\xef\xa9\x25\x04\x55\x77\ \xf6\x32\xbf\x89\x6d\xfd\x71\x53\xde\x68\xc0\x18\xd1\xc1\xfb\x8e\ \x65\x7e\x58\xdb\xac\x09\xcc\x2f\xf7\xfe\xef\x95\x98\x3f\x37\x55\ \xd7\xd5\xed\x7f\x6f\x80\xff\x0e\xf3\x02\x20\xdd\x57\xfc\x6b\x6a\ \x09\x41\x27\x2b\x3a\x1d\x21\xc9\x63\x23\xe3\xa6\x1c\xec\x99\xd9\ \x59\x47\x0a\x01\x58\x13\xac\xcd\x0c\x74\xf7\x4f\x90\x0b\xc1\x38\ \x11\x9a\xa2\x24\xdc\xc5\xee\x99\x39\x21\x76\xa8\xd9\xff\xd3\xcb\ \x7c\xc2\xaf\xa6\x39\x01\x74\x31\x21\xa5\x85\xe6\x15\xd4\x3b\x42\ \x00\x40\x2f\x7a\xa3\xd9\x81\x0b\xcb\x86\x9d\x64\x0e\x80\xda\x6f\ \xd6\x9b\x7f\x6a\x7a\x8e\x94\x84\x07\xc9\xf9\xaa\xb8\x4c\x3f\x0f\ \xc5\x49\x79\xeb\x00\xa9\x65\x50\x10\xe4\x1e\xae\x57\xa9\x00\x14\ \x2a\xd2\x9c\x02\x4f\x40\x7c\x4d\x69\xa1\x6b\xde\xa8\xa4\x52\xbc\ \xcf\x11\x42\xa0\x4b\x1a\x26\x66\x01\xcc\x81\xb8\xf9\xa5\xc3\x4b\ \xe2\xf0\x9b\x33\x89\xf9\x01\xcd\x37\x46\x1f\x33\xff\x42\x2a\xae\ \x91\x48\x65\x1b\x3b\x03\x41\xe0\xcc\xaf\xda\x58\xe9\xcc\xf8\xff\ \x22\x29\xc1\x9f\x57\x6b\x11\x76\xa1\xf6\x96\x23\x04\x80\x19\x95\ \x82\xef\xed\x22\x34\xce\x2c\xf3\x3f\x18\x1d\x33\xf5\x59\x44\xe2\ \x53\x8b\x32\xff\x42\xba\x58\x2b\x91\xea\xeb\xf6\xaf\x0b\x38\x17\ \x56\x0d\xff\x11\x8f\xbf\xfc\xff\x38\x46\x00\xf8\x7c\xbe\xf7\xd1\ \x45\xf5\x2b\xa6\x05\x17\x36\x3a\x46\x00\xd4\x77\x0f\x90\xc9\xe9\ \x19\x53\x0f\x3e\x24\xcc\xb0\x94\x31\x08\xf7\x3a\x65\x42\x92\xcf\ \x13\xf3\x15\x27\x66\x49\x49\xcd\xa0\xa6\x00\x98\xa7\x92\x2b\x31\ \x12\xba\x61\x5f\x41\x90\x7f\x4c\x35\xfd\xb7\x37\x8d\x90\x67\xd2\ \x9c\x04\x2f\x27\xe4\x2b\xb6\x0a\xdf\xe8\x1c\x33\x60\xbe\x4e\xc0\ \x44\xad\xf7\xb1\x49\x60\xe2\x6c\x01\xcb\x08\xea\x1b\xe6\x4c\x5e\ \x3c\x5c\x2e\xd8\x34\xac\x9b\xf9\x17\x12\xdf\x18\x23\x35\xb7\x6d\ \xa6\xfe\xdf\x56\x57\xff\x99\x1a\x04\xaa\xdb\x0f\x90\x25\x7e\x4d\ \x4d\xe5\x61\xb9\x51\xe8\x62\xd4\x3d\xf8\x80\x58\x01\xa8\x22\x8c\ \xd9\xd0\x41\x08\x4e\x4b\xa3\x55\x7d\x4a\x68\xbb\x3d\x96\x14\xf3\ \xcf\xd3\x85\xea\x38\x11\x9b\xed\x13\x31\x28\x0a\xdd\x50\x55\xff\ \xe9\xcb\xf2\x4b\x8e\x13\x00\x2f\x14\x16\xfe\x02\x74\x37\x55\x5a\ \xf4\xb6\x82\x06\x47\x09\x00\xa0\xe8\x83\x31\x62\x15\xc0\x2c\x80\ \x16\xda\x76\x60\xfc\x89\xc9\x29\xcb\xd6\x79\x2f\x32\x69\x88\xf9\ \x17\x92\x5d\x22\x06\xb9\x47\x1a\xd4\x04\xc0\x3d\x30\x99\xd3\x9c\ \x08\x50\x6d\x94\x16\xbe\x62\x6d\x39\xf3\xc5\x41\x8b\x65\x09\xc6\ \x47\x27\x88\x95\x80\x3e\x7a\xe0\x69\xef\x37\x69\xf8\xa8\xde\xee\ \xbd\xf0\x9d\x93\x53\xd3\x96\xae\x2d\x22\x4d\xc9\x6f\x6f\xb3\x04\ \xc0\x63\x47\xe1\x12\x46\x0c\xe0\x8c\x2f\xa7\x67\x5d\x25\xf9\x67\ \x53\x9a\x53\x01\xaa\x8d\x9a\xea\x73\xa4\xa4\xcd\x71\x5a\x00\x74\ \x0f\x32\x5a\x36\xac\x37\x77\x00\x7a\xea\x9b\x3b\x7c\xe4\xbd\x43\ \x3b\xe0\x3b\x66\xcd\x76\x70\x2c\xda\x3d\x79\x9a\x14\x87\x06\x4d\ \x67\xfe\x85\x74\xe9\x72\x8c\x04\x3b\x53\x2b\x08\x8e\x5c\x6c\x53\ \xf7\xfe\x73\xc2\x17\xd3\x9c\x0c\xe8\x70\xa2\xd8\x23\x60\x7b\xc8\ \x71\x02\x60\x3e\x32\x30\x66\xf1\xdb\xf2\x69\x87\x21\xf4\xd8\x03\ \xa7\x21\xa8\xe8\xc9\x8c\x26\x87\xcf\xc0\x67\xe1\x1a\x70\xad\xb9\ \x14\x30\xfd\xe3\x41\xaa\x23\x33\xe4\x52\x8d\xb5\xcc\xbf\x90\x4a\ \xeb\x63\x24\x74\x33\x35\x11\x03\xe8\x83\xa1\xdc\xfd\x57\x68\x73\ \x9c\xf7\x7f\x11\x33\x20\x43\x4d\x02\x5e\xac\xef\x72\xac\x10\x48\ \x85\x26\xa0\xa6\x21\x40\x68\x6e\x7c\x72\x92\x8c\x4d\x4c\x90\x91\ \xf1\x71\xf2\x60\x6c\x4c\x26\xf8\x19\x7e\x07\x7f\x83\xff\x99\x4d\ \x21\xb3\x2f\xf6\xe6\x5f\x98\xe9\x97\x2a\xba\x50\x25\x11\xe1\x2a\ \x44\x0c\xac\x13\x04\x1a\xbd\xff\xa0\xfa\x2f\x3d\xcd\xe9\xf0\xfa\ \x84\x8f\xd1\xc5\x4e\x28\x3d\x04\x48\x8f\x74\xa2\x00\x90\x7d\x02\ \xd4\x1c\xb0\xda\x27\xc0\x32\xc0\xe6\x2f\x0e\xa6\x9e\xf9\x9f\x10\ \x04\xc1\x38\x11\x2d\xaa\x31\xd8\x72\xa8\x5e\x8d\xf9\x27\x5f\xc9\ \xa9\xf8\x78\x9a\x1b\x40\xcd\x80\x42\xc5\x16\xc8\x9c\x48\xc4\x6b\ \xf7\x9c\x2b\x04\x4c\x68\x28\xea\x44\x74\x47\x26\x2d\x71\xf8\x25\ \x1f\x31\x90\x4c\x8d\x18\x94\xd3\x33\x9d\xa9\x5e\xf9\x77\x24\xcd\ \x2d\x50\x6b\x15\x06\xb4\xfb\x9d\xab\x8e\x15\x00\x0b\xf3\x04\xe6\ \x90\xef\xe5\x24\x1f\xa3\x71\x7e\x2b\xa9\x38\x6c\x4e\xc4\x60\xd7\ \xc9\x26\x55\xf5\x9f\xbe\x14\xff\x3c\xcd\x4d\xa0\x8b\xae\x57\x7a\ \x18\xaf\xae\xab\x70\x5c\x48\x70\x31\x6a\xed\x93\xc8\xc4\xf4\x8c\ \x6b\x99\x1f\xd2\x7b\x93\xcd\xf0\x4b\x35\x41\xc4\xa0\x3a\xc9\x88\ \x01\x9c\x65\x38\xd3\x2a\x02\xa0\x2e\xcd\x6d\xf0\xf8\x85\xef\xab\ \x49\xc4\x83\xe7\x5b\x1d\x2f\x00\xe6\x9d\x83\x66\x17\x10\xb1\x62\ \xef\xa7\xd2\xd3\xbf\x94\x11\x83\xfd\x45\x2d\x1a\x99\x7f\xe2\xbf\ \xba\x4e\x00\xbc\xbc\xb3\xee\xfd\x9e\x80\x78\x47\xe9\xa1\xac\xdc\ \xe0\x0e\x2d\xe0\xdd\x52\xe2\x21\x79\xc2\x8d\xd3\x01\xf5\xfc\x4a\ \x25\xbd\xac\x10\x44\x0c\xe4\x1a\x83\x5b\x11\x5d\x6f\x7f\x38\xcb\ \x2a\x02\xa0\xcb\xe7\x13\x9e\x4d\x73\x23\x32\x02\x62\xa6\x9a\x64\ \xdc\x57\xd4\xec\x1a\x01\x30\xaf\x0d\xf4\x0f\x8f\x3a\x96\xf9\x21\ \xad\x77\x29\x42\x7c\xd6\x45\x0c\x24\xb9\xc6\x40\xcd\x51\xb8\x57\ \xb5\xe9\x27\xb4\xc7\x17\x96\xa5\xb9\x15\xaf\xf8\x2e\xfc\xb2\x37\ \x20\x4a\xaa\xbe\x00\x07\xf4\x0c\x4c\xbc\xc7\xa0\x64\x4a\xbb\x71\ \xbb\x60\x68\x64\x86\x19\x5b\x3f\xa9\x88\x41\xcd\xe2\x11\x03\xe8\ \xf9\xa7\x61\xfb\x47\x7f\xe4\x13\x3e\x92\xe6\x66\x78\x39\xe1\x55\ \xd5\x88\xc0\xa9\x26\xd7\x09\x80\x85\x83\x47\x46\x26\xa7\x98\x65\ \x7c\x10\x62\xad\xb7\x47\x6c\x15\xde\xb3\x3a\x62\x50\xd5\xf1\xae\ \xa3\x70\xb7\x86\xe7\x1f\x92\xe2\xd2\xdc\x8e\x47\xc3\x43\xfa\x95\ \x47\x23\x8b\x84\x6f\xbe\xeb\x5a\x21\x00\xd4\x1e\x89\x2f\x69\x16\ \x61\xa2\x80\x7b\x9d\x9f\xd8\x03\x0e\x33\xb0\x99\xdd\x20\x00\x1e\ \x37\x23\xa9\x93\x48\x49\x63\x37\x59\x9e\xad\x16\xf7\x17\xfa\x98\ \x1f\xfa\x61\x5e\x7a\x30\xef\x51\x93\x94\x9b\x0f\x5c\x71\xb5\x00\ \x58\xd8\x68\x04\x92\x88\xec\xe8\x2c\x84\x7b\x82\x29\xbd\x8b\x0d\ \xea\xe4\x1b\xa3\xae\x12\x00\x40\xeb\xf2\xeb\xb5\xd2\x7e\x5f\x41\ \xce\x7f\x04\x98\x7f\x4e\x1f\x48\x8f\x9b\x1a\x86\x18\x4d\x29\xee\ \x8c\xde\x97\xc3\x87\x73\x4b\x98\xb7\x0f\xdf\x0d\xf7\x00\x13\x7a\ \xe0\x9e\x94\x3b\xe0\x44\x5c\x63\x06\x00\xbd\x7d\xf6\xae\x06\xf3\ \x0b\x77\x7d\x3e\xe1\x03\xc8\xf9\x4f\xe6\x05\xfc\x40\xed\xa1\xf9\ \xf3\x42\x72\x2b\x25\x14\x00\xef\x2d\x37\x06\x13\xa1\xe7\xfe\x08\ \x19\x1a\x9f\x24\x56\xca\x03\xb8\x34\xf8\x24\x20\x52\x01\x23\xd1\ \xae\x74\xeb\x8f\x87\x83\xb7\xdc\x0d\xcc\x5f\x54\x29\x91\xd7\x37\ \x85\x34\x1a\x7e\x0a\xdf\x47\x8e\x7f\x0a\x0f\x1b\x87\x8a\x61\x4c\ \x0e\x32\x46\xc0\x94\x1d\x54\x20\xdc\x89\x0f\xcb\x2a\x39\x08\x85\ \xc9\x99\xc4\x4d\x86\xc9\x99\x19\xf9\xb3\x70\x0d\xb8\x16\x5c\x33\ \x11\x86\x7f\x6f\x1b\xec\x7e\x39\xbf\xde\xe9\x02\x60\xdb\xe1\x36\ \xad\xb7\x7f\xc8\xf1\x25\xbf\x49\x3b\x04\xfd\xe2\x9f\xd2\x07\x34\ \xa7\xf4\xf0\xc0\xa9\x52\xea\x72\x87\xa0\x11\x4d\xa1\xf1\xde\x00\ \x69\xea\x89\xca\x29\xc8\xa0\x35\x80\xa3\x0e\x08\x7e\x86\xdf\xc1\ \xdf\x60\xc0\x49\xdd\x5d\x6b\x4a\x62\x2b\xae\x0d\x38\x9a\xf9\x8f\ \x97\xf4\xc9\x4e\x6b\x15\xe6\x9f\x4b\xe7\xca\xbe\x80\x9c\xae\x5e\ \x23\x50\xa0\x26\x41\xd7\xef\x0e\x93\x30\x32\x34\x9b\x44\xb5\x00\ \x08\x95\x39\x91\xf9\xcf\x51\xe2\xf2\xea\xb4\xde\xfe\xfb\x91\xc3\ \x35\x23\x02\xe5\xbf\x43\x1f\xd4\xb0\xda\x83\x3c\x5a\xda\x8e\xcc\ \xc4\xea\x40\xcc\x76\x67\x6a\x01\xbb\x8e\x75\x6a\x31\xff\xe0\xb2\ \xec\x8a\xdf\x44\x0e\xd7\x65\x0a\x08\x3f\x56\x7b\x98\xd0\x40\xb4\ \xac\xf9\x0e\x32\x14\xa3\x74\xa9\x2e\xe6\x2c\xd5\xff\x52\x1f\x59\ \x9e\x53\xae\x51\xee\x2b\xfe\x17\x72\x76\x42\x0e\x41\xa1\x52\xed\ \x81\x42\xff\xc0\x9a\x2e\x8c\x0a\xb0\x48\xc1\xce\x88\xa3\xbc\xfe\ \x59\x5b\xc2\x5a\x31\xff\x72\x74\xfc\x25\x88\xe5\x01\xfe\x93\xf4\ \xe1\x8d\xab\x3d\xd8\x3d\xa7\x9b\x91\xa1\x18\x25\x28\xab\x75\x82\ \x00\xd8\x72\xa0\x55\x4b\xf5\x9f\x58\x16\x28\xff\x14\x72\x74\x72\ \x75\x02\x6b\xd4\x2b\xa9\x44\x4c\x10\x62\x94\xe4\x14\xe1\x6a\x89\ \xf1\x84\x9f\x3b\x30\xc5\x47\x6b\xca\xcf\xab\xc8\xc9\x49\x9b\x02\ \xc2\xb3\x54\x7d\xaa\x56\x7b\xc0\x30\x57\xb0\xdc\xc1\x3d\x04\x9d\ \x4c\x2c\xa7\x08\x9f\x2c\x8b\x90\x95\xeb\x2a\xb5\xde\xfe\x95\x30\ \x11\x0b\x39\xd9\x88\x43\x30\x50\xfe\x07\x54\x08\x0c\xa9\x3d\xe8\ \x9c\xfc\x1a\x12\xc2\x2c\x41\xe6\x08\x1a\x6a\xb0\x98\x22\x5c\x54\ \x19\xd3\x61\xf7\x0b\xf7\x97\xf9\x84\xdf\x47\x0e\x36\x25\x4d\x98\ \x7f\x51\xe3\x61\x93\xfc\xe3\x8d\xc8\x54\x0c\x12\x8b\x29\xc2\x6f\ \xee\xb9\xaa\xc5\xfc\xee\x6c\xf3\xb5\x94\x09\x42\x98\x1f\xc0\x26\ \xc9\x29\xc2\x35\x92\x93\xe2\xfd\x10\xf2\x3b\x80\x1c\x6b\x32\xa0\ \x73\x0a\x7d\xb8\x2d\x6a\x0f\x1e\xfa\xae\xc3\xe8\x65\x64\x2c\xb6\ \x88\x95\x14\xe1\x83\x67\xef\xc8\x8e\x67\x0d\x01\xd0\x04\x3d\x2e\ \x90\x63\xad\x30\x05\x72\x4a\x3f\x01\xb6\x95\x56\x92\xd0\xa5\xc6\ \x2e\x64\x2c\x96\xb4\x00\x4a\x17\x6d\x9e\x22\x5c\x78\xb1\x97\x9e\ \xad\x0a\x2d\xe6\x1f\xf6\xe6\x08\xcf\x21\xa7\x5a\xe9\x14\xe4\xc4\ \x7f\x54\x2b\x18\x02\x7a\x6d\x53\x25\x29\x6f\xeb\x46\xe6\x62\x29\ \x45\xb8\xc3\xbe\x5a\xc0\x3b\xa5\x11\xb2\x6a\x43\x95\x16\xf3\xcf\ \xd1\xb3\xf9\x2d\xe4\xd0\x54\xf8\x03\xfc\xc2\x5a\x2d\x3b\xcc\x9f\ \x1b\x24\x95\x1d\x3d\xc8\x5c\x0c\x11\xb4\xd2\xb2\x1b\xf3\x9f\x12\ \x06\xc8\x4f\x37\x05\x75\xd8\xfd\xbc\x1f\x39\x33\xa5\xa9\xc2\xe2\ \x49\xad\x4d\x09\xe4\x85\x5c\xd9\x55\x98\xdd\x14\x61\x7b\x69\x01\ \x67\xc4\x28\xf1\xbd\x15\xd6\xc1\xfc\x42\x21\x9c\x49\xe4\xcc\x14\ \xe2\x61\x1b\x31\x21\xa8\xb5\x39\x90\x23\x50\x7d\x03\x85\x00\xa6\ \x08\x27\x18\xeb\x2f\x8f\x51\x2d\xb2\x56\x3b\xdc\x17\x10\xc3\xd8\ \xdc\x73\xa9\xfc\x01\xbe\x8b\xbf\xe1\xe5\xc4\x9b\x5a\x9b\xb4\x7e\ \x77\x2d\x09\xde\x44\x21\xc0\x4e\x72\xd0\xd2\x9a\x02\x67\x28\xf3\ \x07\x72\x2f\xeb\x88\xf5\x0b\x9d\x30\xee\x1e\x39\x71\x29\xfd\x01\ \x39\xc2\x73\x74\x33\x62\x5a\x9b\xb5\x76\x67\xd8\x55\xa3\xc6\x98\ \x4e\x11\xbe\x1a\x5b\x52\xb5\x3f\x6b\xab\x2e\xb5\x7f\x20\x33\x50\ \xfe\x87\xc8\x81\x36\x40\x66\xb6\xf0\x47\x74\x53\xe2\x5a\x9b\xc6\ \x6d\x0b\x91\x0a\x74\x0c\xda\x3f\x2c\x08\x5d\x84\x83\xa9\xd7\x02\ \x4e\xf1\x11\xf2\xfa\xe6\x1a\x1d\x6a\xbf\x70\x3f\x9d\x13\x3e\x87\ \x9c\x67\x27\x4d\x80\x13\xbe\x44\x37\x66\x44\x4f\x74\x00\x43\x84\ \xf6\xa7\xf2\x96\x68\xca\x43\x7d\x7a\xbc\xfd\x70\xc6\x3c\x5c\xd9\ \xf3\xc8\x71\x76\x4c\x14\xca\xe2\xbf\xae\xd5\x43\x00\x68\xcd\x9b\ \x55\xe4\x62\x03\x26\x0b\xd9\xbe\x7f\x60\x8a\xba\x08\x1f\x2b\xee\ \x25\xab\xb5\xe3\xfc\xe0\xf0\x9b\x4c\x0f\x08\x7f\x8d\x9c\x66\x67\ \x21\x10\x10\xbe\x09\x4d\x18\xb4\x36\x13\x86\x36\x62\xda\xb0\xbd\ \xa9\x32\x05\x29\xc2\x07\xcf\xdc\xd1\x6c\xe7\xf5\x88\xc6\x3d\x01\ \xfe\x6f\x91\xc3\x58\x30\x07\xb2\xc4\xbf\xd4\x63\x0e\x40\xed\x00\ \x16\x10\xd9\x3b\x45\xf8\x52\x6d\xcc\xd2\xc2\x1e\x1d\xb9\xfd\x0f\ \xd5\x7e\xaa\x5d\x22\x67\xb1\xe7\x13\xb8\xaf\x63\x73\xc9\xf6\x63\ \x8d\xa4\x06\xfb\x09\xd8\x92\xaa\xaf\x0f\x58\x52\xcf\xbf\x79\x5f\ \x8b\x1e\xc6\x97\x1d\x7e\x68\xf3\xb3\x9a\x2c\xc4\x09\x9f\xd3\x13\ \x22\x94\x13\x86\x76\xd4\xa0\x73\xd0\x05\x29\xc2\xd0\xc9\x47\x47\ \x33\x8f\x79\x8a\x66\x66\x97\x7d\x16\x39\x89\x61\xc8\xcd\x45\x75\ \x24\x0b\xcd\xb7\x17\xc3\x1e\x83\x36\xec\x1f\xd8\x09\x23\xc6\xcd\ \xe9\xe1\xa7\xa3\x8d\xd7\xe3\x24\x1f\x8c\xf3\x3b\x04\x2b\x73\x4a\ \x7f\x5d\xab\xcd\xf8\x82\x04\x0f\xb2\xe3\xf8\x55\x34\x09\xec\x96\ \x22\xdc\x90\xbc\x2f\xe0\x5c\xa5\x44\xf2\x0e\xb5\x41\xa3\x0e\xbd\ \x6f\xfe\x10\x64\x99\x22\xe7\x38\x08\xaf\x6c\xbd\xf0\x4b\x7a\xba\ \x0a\xcd\x53\x76\x7e\x08\x87\x8f\xd8\x2a\x45\xb8\x3f\xa9\xfe\x81\ \x27\x4b\xfb\x75\x65\xf6\x3d\x7e\x01\xf8\x85\x13\x50\x67\x82\x1c\ \xe3\x40\x40\xc5\x96\x27\xc0\xe7\x68\xf5\x13\x78\x37\x54\x58\x2e\ \x47\x09\x70\x16\xa1\x3d\x48\xb8\x1a\x4d\x68\x56\x1f\x78\xf9\x97\ \x67\x97\xeb\x65\xfe\x39\xb9\xa4\x17\x07\x78\xb8\x26\x57\x60\x50\ \xef\x5b\x61\xed\xae\x1a\x9c\x4a\xcc\x50\x8a\xf0\x89\x92\x3e\x3d\ \x83\x3a\x17\x26\xf8\x0c\x79\x03\xfc\x77\x90\x33\x5c\x04\x70\xf0\ \xd0\xcd\x6f\xd6\x7b\x48\x96\xe7\x88\x64\xdf\xd9\x16\xf4\x0d\x2c\ \x79\x8a\xf0\x80\xaa\xad\x9f\x7f\xa4\x5d\x6b\x44\xf7\x93\xe4\x17\ \xda\x70\x72\x8f\x4b\x01\x8d\x46\x3d\x01\xf1\xb0\xfe\x37\x85\x40\ \xfc\x79\x21\x8c\x14\x2c\x69\x72\x50\x84\x14\x2f\xd2\x45\xf8\xed\ \xb3\x77\xc9\xeb\x9b\x42\x24\x91\xbd\x84\xee\xbd\xd8\xc0\x13\x91\ \xe6\xe1\xc4\x17\xf4\x54\x13\x2e\xa4\x37\xf7\x5d\x26\x7c\x0b\x9a\ \x05\x4b\x92\x22\xdc\x36\xf0\xc4\x64\xde\xf5\x3b\xea\x13\x62\x7c\ \x50\xf9\x3d\x7e\xe1\xfb\x78\xf2\x11\x8f\x01\x53\x5c\x3c\x01\xa1\ \x2a\x91\x83\x94\x49\xcd\x82\xdd\xa7\x9a\x48\xd5\x75\x2c\x31\x4e\ \x75\x8a\xf0\xb9\xea\x7e\xb2\x65\x7f\x0b\xc9\xd0\xef\xe4\x93\x89\ \xee\x71\x85\x97\x2b\xfb\x3d\x3c\xf1\x88\xf7\x00\xe6\xb8\x79\x39\ \x7e\x95\x9e\x62\xa2\xa7\x0b\x8b\xf6\x9e\x6d\xc6\x86\x23\xa9\xe8\ \x1e\xdc\xd9\x43\xf6\x9e\x69\x91\x9f\x79\x62\x6f\x7d\x61\x1c\x06\ \x75\xe2\xac\x3e\x84\x26\xa0\xcb\x90\xfc\xa6\x48\xec\x80\x91\x95\ \x1b\x2a\xc8\x81\x73\xad\x28\x08\xac\xa8\x09\xa0\xcf\x74\xff\x39\ \xca\xf8\xeb\xcb\x13\x65\x7c\x48\xee\x12\x61\xa6\x04\x9e\x6c\x84\ \x7e\x10\xf2\xcc\xc3\x99\x84\xa2\x94\xe8\x81\x83\xe1\x24\x90\x4d\ \x28\x5e\xc3\xda\x02\xc3\x5e\xff\xf6\x7b\x72\xf4\x65\xe5\xfa\x84\ \xdf\xf8\xe4\x51\x31\xd8\x4f\xb0\x63\x2f\x22\x69\xa4\x73\x65\xbf\ \x45\x0f\xd1\x21\xbd\xc9\x43\x4f\x97\x1b\xe7\x1e\xae\x27\x17\xeb\ \xb1\xf9\x48\xa2\x54\x7c\xa5\x8b\x6c\x39\x54\x2f\x3f\xc3\x24\x18\ \x7f\x0e\x3c\xfc\xcb\xb2\x2b\x7e\x13\x4f\x30\xc2\x24\x41\x00\x95\ \x85\x62\x75\x12\x87\x51\xa6\xac\xad\x41\x72\xf0\x7c\x2b\x3a\x0c\ \x35\xd4\xfc\x82\x92\x36\xb9\x77\x63\xb2\xcf\x99\xaa\xfb\x97\xb1\ \x7c\x17\x61\xb1\x59\x20\xdc\x4b\xf6\x80\x82\x79\x90\x57\x50\x4f\ \x8a\x6a\x6e\x92\x70\x17\x26\x15\x85\x6f\xf7\xc9\x9d\x99\x72\x8f\ \x34\x90\xe5\x6b\xcb\x93\x66\x7c\x4a\x77\xe5\xd0\x1e\xa6\xf2\x22\ \xac\x86\xcf\x57\xf8\x8b\x5e\x3f\xff\x32\x3d\x74\xbd\x06\x0e\xac\ \xec\x34\x04\x13\xe1\x74\xf5\x0d\x99\x11\xdc\x33\x12\xbc\x8f\x9c\ \xbf\x7c\x4b\xf6\x93\xac\x7e\xa3\xd2\x08\xd3\xcb\xed\xb9\x29\xad\ \xc0\x02\x1e\x44\xca\x01\x59\x64\x70\xf8\xf4\x36\x1d\xd1\xea\x45\ \x00\x6f\xc1\x13\xe2\x75\x47\x9a\x09\xb0\xa6\xe3\x74\x6d\x20\xf0\ \x56\x6d\x34\xc6\xf4\xf3\xcd\x3a\x3c\x9c\x90\x81\x53\x79\x10\x4b\ \x8e\xe5\xeb\xab\x3e\x4a\x0f\xa4\xd7\x13\x10\xef\x98\x70\xb0\xe5\ \x3e\x75\xd0\xa1\x68\xef\x99\x66\x72\x36\x78\x83\xc9\xb0\x22\xdc\ \xf3\x99\xe0\x4d\xb2\xe7\x74\xb3\x3c\x9e\x2d\x23\x39\x67\xde\x62\ \xd4\x95\xc1\x09\xcb\x20\x8d\x1b\x4f\x1e\xc2\x56\x78\x79\x67\xdd\ \xfb\xbd\x9c\xf0\x6f\xf4\x90\xd6\x9b\x74\xd8\x1f\x0b\x04\x18\x74\ \xba\xa3\xb0\x91\x1c\x2b\xeb\x90\xa3\x0a\xa1\x5b\xf6\x31\x19\xe0\ \x5e\x8a\xe9\x3d\x1d\x2d\x6b\x27\xf9\xc7\x1b\xe5\x7a\x09\xca\xa4\ \xc4\xcc\x67\x40\x85\xeb\x15\x2f\x27\xfe\xab\xcf\x27\x3c\x8b\x27\ \x0d\x61\x7b\x78\xb2\xc4\xaf\xd1\x83\x7b\x34\xd1\xac\xc2\x44\x84\ \x42\xd6\x96\x6a\xf2\xd6\xc1\x3a\xb2\x87\x6a\x0a\xd0\xb7\x00\x1c\ \x8b\x50\x9f\x50\x63\x81\x73\x11\xae\x09\xd7\x86\xef\x80\xef\x82\ \x37\x3b\x7c\xb7\x8f\xde\x83\x89\x6f\xf7\xa7\x09\x9e\x5d\x01\x35\ \xb3\xfe\x1c\x4f\x14\x82\x49\xc0\xf0\x48\x0f\xc7\x7b\xa0\xec\xd4\ \x22\x26\x59\x54\x38\x80\x9d\x0d\xa1\x47\xe8\x65\xb0\xe9\x40\x1d\ \xc9\x2b\x68\x20\xbb\x4e\x36\xc9\xb5\x0b\x3f\x3b\xdd\x24\x87\x24\ \x17\x12\xfc\x0e\xfe\xb6\xeb\xe4\x55\xf9\x7f\xe1\x33\xf0\x59\xb8\ \x06\x5c\xcb\x42\x26\x5f\xa4\x44\x57\x6c\xf5\x06\xc4\x74\x68\xe5\ \x86\x27\x08\xe1\x1c\xad\x80\x2b\x7b\xde\xe3\x17\xb7\xd0\xc3\xdd\ \x93\x32\x66\x62\x87\x20\xb4\xfa\x96\x87\x13\xbe\x88\x27\x05\xe1\ \x68\x40\x6a\x6a\xba\x9f\xff\x2a\xb5\x69\xb7\xd1\x43\xdf\xe7\x62\ \xa6\x87\x30\x6a\x5e\xa6\x5f\xfc\x32\xa6\xeb\x22\x5c\x0b\x2a\x0c\ \x3e\xf3\x28\x9c\x58\x42\x69\xca\xc1\x0c\x3f\x43\xa9\xce\x13\x10\ \xd6\xc1\xe0\x16\x64\x7a\x04\xe2\x29\xbc\xba\xb6\xf2\xbf\x79\x38\ \xfe\x9f\x3c\x7e\x61\x33\x65\x96\x5a\x4a\xd3\x0c\x33\x3c\x08\xb3\ \x1a\x6f\x80\xdf\x94\xc1\x89\xff\xb8\xcc\x27\xfc\x2a\xee\x30\x02\ \x91\x00\x20\xd9\x08\x22\x0a\xf4\xad\xb9\x9a\x6a\x09\x85\x94\xa1\ \xda\x1f\xbd\x49\xed\xf7\x76\xf7\x0b\x6d\xf2\x3d\x72\xfc\x2a\xf0\ \xdc\x63\x92\x0e\x02\x61\x85\xc9\xb0\x29\xf8\x41\x28\x4e\xf2\xf8\ \xf9\xff\xf0\xfa\xc5\x6c\xfa\x86\x3d\x02\xc3\x2c\x52\xe4\x4f\x80\ \xef\x08\xca\xdf\x49\xbf\x3b\x23\x20\xbe\xe4\xf5\xf3\x7f\xec\xf3\ \x09\x1f\xc0\x9d\x41\x20\x6c\x20\x1c\xa0\xe3\x71\x86\x5f\xfc\x53\ \xb9\xfd\x39\x27\xfc\xfb\xc3\x30\xa4\x98\x0d\xb6\x37\x7d\x33\xef\ \xf0\x72\xe2\x4e\xfa\xfb\x7d\xf0\xb6\x7e\xf8\xc6\x16\xf6\xc1\xef\ \xe0\x6f\xb2\x7d\x0e\xff\x0b\x9f\x81\xcf\xd2\x6b\x80\x67\x1e\xae\ \x89\xf9\xf6\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\ \x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\ \x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\ \x81\x40\x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x81\x40\ \x20\x10\x08\x04\x02\x81\x40\x20\x10\x08\x04\x02\x61\x10\xff\x1f\ \x2b\xbd\xff\xa0\xa6\x7b\xf9\x40\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x00\x68\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x2f\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x38\x6f\x88\x79\x00\xc4\xff\x71\xe0\x07\xc4\x18\xf0\x1f\ \x1f\x1e\x09\x06\x8c\x1a\x30\x6a\x00\xe1\xcc\x14\x7d\x1f\x9b\x01\ \x14\x61\x00\x53\xca\x93\x62\xb0\xee\x5e\xa7\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xcd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x04\x03\x00\x00\x00\x58\x47\x6c\xed\ \x00\x00\x00\x2a\x50\x4c\x54\x45\x47\x70\x4c\xeb\xeb\xeb\xec\xec\ \xec\xec\xec\xec\xec\xec\xec\xec\xec\xec\xeb\xeb\xeb\xed\xed\xed\ \xec\xec\xec\xec\xec\xec\xed\xed\xed\xec\xec\xec\xec\xec\xec\xea\ \xea\xea\x62\xa2\xe4\x8b\x00\x00\x00\x0e\x74\x52\x4e\x53\x00\x1a\ \xb2\xf5\xff\xb1\x19\xb5\xb3\xf7\xb4\xb0\xaf\x18\xe0\xe7\x19\x08\ \x00\x00\x00\x44\x49\x44\x41\x54\x78\x01\x63\x18\x4c\x40\xc8\xc4\ \x05\x09\x38\x87\x61\x28\x28\x71\x41\x01\x1e\x18\x0a\xa6\xa0\x2a\ \xf0\xc4\x50\xe0\x82\x06\x68\xa2\x60\x54\xc1\xa8\x82\x51\x05\xa3\ \x0a\x46\x15\x8c\x2a\x20\x5c\x25\x2d\x41\x55\xe0\x84\xa1\x20\x1b\ \xb5\x5a\x3c\xcb\x30\x88\x00\x00\x71\x54\xef\xab\x1a\x06\xe8\xfb\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xcd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x04\x03\x00\x00\x00\x58\x47\x6c\xed\ \x00\x00\x00\x2a\x50\x4c\x54\x45\x47\x70\x4c\x45\xb1\x58\x43\xb0\ \x5c\x43\xb0\x5c\x43\xb0\x5c\x44\xb0\x5c\x47\xad\x5c\x44\xb0\x5c\ \x43\xb1\x5d\x43\xb0\x5c\x43\xb0\x5c\x43\xaf\x5b\x43\xb0\x5c\x40\ \xb5\x60\x9e\x3e\x86\x6c\x00\x00\x00\x0e\x74\x52\x4e\x53\x00\x1a\ \xb2\xf5\xff\xb1\x19\xb5\xb3\xf7\xb4\xb0\xaf\x18\xe0\xe7\x19\x08\ \x00\x00\x00\x44\x49\x44\x41\x54\x78\x01\x63\x18\x4c\x40\xc8\xc4\ \x05\x09\x38\x87\x61\x28\x28\x71\x41\x01\x1e\x18\x0a\xa6\xa0\x2a\ \xf0\xc4\x50\xe0\x82\x06\x68\xa2\x60\x54\xc1\xa8\x82\x51\x05\xa3\ \x0a\x46\x15\x8c\x2a\x20\x5c\x25\x2d\x41\x55\xe0\x84\xa1\x20\x1b\ \xb5\x5a\x3c\xcb\x30\x88\x00\x00\x71\x54\xef\xab\x1a\x06\xe8\xfb\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xfa\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x3c\x50\x4c\x54\x45\xcc\xcc\xcc\xd0\xd1\xd1\xe7\xec\ \xee\xe7\xed\xed\xe7\xec\xed\xce\xcf\xcf\xd6\xd9\xd9\x47\x70\x4c\ \xe7\xec\xed\xe7\xec\xed\xd7\xd9\xd9\xe7\xec\xec\xd4\xd6\xd6\xe7\ \xec\xec\xd5\xd6\xd6\xcf\xd0\xd0\xdf\xdf\xdf\xeb\xeb\xeb\xde\xde\ \xde\xeb\xeb\xeb\x47\x8d\xda\x12\x00\x00\x00\x14\x74\x52\x4e\x53\ \xff\xfe\xb1\xb5\xf5\xfe\xdb\x00\xff\xf7\xd9\xb3\xe0\xb2\xdf\xfe\ \x20\x19\x1f\x1a\xfa\xe0\xd3\x9e\x00\x00\x00\x59\x49\x44\x41\x54\ \x78\x01\xed\xd7\xb5\x11\xc0\x30\x00\xc0\x40\x33\x84\x61\xff\x5d\ \xd3\x87\x4c\x9d\x4f\x1a\xe0\x7b\x09\xdf\x58\x8f\xc0\x39\x9b\xf0\ \x99\x51\x7b\x12\xd0\xe1\xb7\x31\x09\xc4\x7f\x20\x26\x81\x90\x28\ \x09\x88\x44\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\ \xc0\x2a\x7e\x93\x49\xc0\xfd\x03\x43\x12\xd8\x26\x2b\x3e\xb3\xcb\ \xf1\x04\x78\xe7\x0b\x20\xcd\x43\x72\x5d\x5e\x34\x64\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x67\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x2e\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\xbc\x79\xf3\xe6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x78\x44\x18\x30\x6a\xc0\xa8\x01\x84\x33\xd3\x7d\x6c\x06\x50\ \x84\x01\x3d\x99\x36\xa2\x14\xc7\x6a\xe6\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x39\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x01\x00\x49\x44\x41\x54\x78\x01\xc5\x90\x03\x6e\x84\x41\ \x1c\x47\xf7\x6a\xb5\x6d\x9b\x41\x75\x81\xef\x00\x8d\x1a\xa3\xbe\ \x40\x6d\xb7\xd1\xda\xb6\xbd\x1b\xd6\xfd\x77\xed\xcf\x9a\xe4\xc5\ \xbf\x37\x6f\x46\x10\x0b\xd9\xcc\xb1\x90\x15\xd0\xf0\xbb\xd4\x1f\ \x36\x8b\x68\x4d\x80\x76\xf0\x04\x3e\xa7\x0a\xb4\x8a\x3b\xb0\x99\ \x44\xab\x94\x05\x1a\xf9\x2d\xba\x24\x2b\x08\xfb\x0d\xe0\xb6\xcb\ \x53\x78\x9d\xca\x82\x27\x68\xc0\xa0\x7a\x4a\x61\x54\x3f\xff\x7a\ \x6c\xd2\xc1\xca\x05\x41\x0b\x84\x12\x92\x24\x11\xbf\x11\x30\xaa\ \x36\x2b\x0a\xa2\x01\x33\x04\xbd\x3a\x34\xf0\x05\xc9\x5b\x13\xe9\ \x95\x71\xa9\x12\x43\x0b\xb6\x80\x04\x95\x05\x21\xaf\x1e\x9c\x16\ \x71\x45\x1c\x09\x62\x41\x92\x05\x6e\x87\x16\xce\x2f\xce\xca\xb8\ \xbb\xbb\xde\xa7\x55\xb0\xb3\x7b\x78\x42\xa8\xc0\xe7\x32\x40\x7d\ \xfb\x34\x54\x37\x4f\x96\x51\xd7\x3e\x7b\xdf\x37\x85\x1c\xf7\x4d\ \x22\x72\xd4\x02\x9d\xea\xad\xe2\x38\x49\x43\xe7\xb2\x2c\x31\x86\ \x04\x66\xd4\x02\x97\x5d\xc3\xb3\x20\xe0\x31\xc0\xd8\xcc\x06\x0c\ \x4d\xac\x15\xd1\xd1\xbf\x14\xaf\x69\x9b\x3d\xec\x9f\x44\xb6\x12\ \xff\x70\xf1\x0f\x7c\xfd\xc2\x6d\x65\x2d\x79\x12\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xfb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x39\x50\x4c\x54\x45\xe7\xec\xed\xe7\xec\xed\xeb\xeb\ \xeb\xe7\xec\xee\xb6\xb6\xb6\xb7\xb7\xb7\xe7\xec\xed\xb5\xb5\xb5\ \x47\x70\x4c\xc0\xc1\xc1\xe7\xed\xed\xe7\xec\xec\xcf\xd1\xd1\xc6\ \xc9\xc9\xe7\xec\xec\xc7\xc8\xc9\xce\xd1\xd1\xe3\xe3\xe3\xeb\xeb\ \xeb\xb2\xda\x92\x95\x00\x00\x00\x13\x74\x52\x4e\x53\xff\xf5\x19\ \xb1\xff\xff\xf7\xff\x00\xfd\xb5\xb3\xd3\xdc\xb2\xdb\xd1\x1b\x1a\ \x42\xaf\xd8\x60\x00\x00\x00\x5e\x49\x44\x41\x54\x78\x01\xed\xd7\ \xb7\x01\x80\x30\x10\x43\xd1\x73\xb6\xc9\xb0\xff\xb0\xf4\x04\x39\ \x75\xa0\xdf\xeb\xf5\x92\xd8\xd9\x17\x81\x63\x51\xf2\x9a\x32\x3a\ \x0b\x0c\x02\x1b\xb3\x80\x17\x98\xcf\x02\x92\x89\x00\x01\x02\x85\ \x40\xc8\x44\x80\x00\x01\x02\x04\x08\x10\x20\xf0\x47\xc0\xe1\xbd\ \xcb\x02\x09\x03\x29\x0b\x4c\x18\xd8\xb2\xc0\x3e\xdb\xf7\xb9\x5d\ \xf5\x1d\xe0\x77\x3e\x01\xdf\x06\x6b\x64\xed\x94\xcb\x10\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x17\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\xde\x49\x44\x41\x54\x78\x01\x63\xc0\x0b\x1a\x1a\x38\ \x18\x9a\x9b\x35\x81\xb4\x17\x43\x63\x63\x36\x90\xee\x01\xe2\xb5\ \x40\x7c\x0e\x88\xdf\x03\xc5\x9c\xb1\x6b\x6c\x6a\xb2\x05\x2a\x78\ \x06\xc4\xff\x09\x60\x2f\xac\xfa\x81\x26\x87\x82\x14\xd0\xc2\x80\ \xbf\x40\xfc\x18\x88\x0f\x01\xf1\x01\x42\x06\xec\x06\xe2\x4e\x20\ \xce\x00\xf2\xdd\x81\xb4\x1a\xc3\xa4\x49\xec\x48\xe1\xe3\x43\xc8\ \x00\x07\x6c\x52\x43\xd8\x00\x20\x5f\x0e\x88\xe7\x01\xf1\x49\x28\ \x9d\x41\xb4\x01\x40\x36\x1b\x10\xdf\x42\x8f\x11\xe2\x0d\x68\x6a\ \x32\xc4\x11\xad\x6e\x30\x1b\xf4\x80\x78\x1b\x10\xdf\x07\xe2\xf5\ \x40\x03\x2a\x51\x0c\xe8\xe8\xe0\x07\xf2\x3f\xa2\x69\xfe\xc2\xd0\ \xd6\x26\x0a\xd2\xcc\x07\xc4\x2f\x31\x4c\xc7\x0c\x03\x17\x20\xbe\ \x03\x92\x83\x5a\xe4\x05\x73\x9e\x35\x36\xe7\x01\xc5\x2d\x71\x84\ \x3e\x17\xaa\x40\x7b\xbb\x20\x28\x67\xa1\x19\xf0\x8a\xa1\xbb\x9b\ \x9b\x81\x28\x80\x70\xc5\x49\x90\xbf\x80\xf8\x28\x90\x6f\x4a\xac\ \x56\x00\x6d\x3f\xda\x72\x3c\x7e\x4d\xf2\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x95\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x03\x5c\x49\x44\x41\x54\x78\x01\xed\xd9\x03\x90\x2c\x47\ \x18\xc0\xf1\x89\x6d\xdb\xb6\x53\xae\xd8\xb6\x4b\xb1\xed\x64\x11\ \xdb\x28\x3c\x9f\x6d\xdb\xe6\x62\xd6\xde\x3d\x5f\xec\x7c\xf9\xba\ \xea\xcc\x6f\x0e\x9d\xa9\x7e\x3d\x55\xff\xf7\xce\x77\xdf\x6f\xd5\ \x33\xad\x0c\xf7\x7b\x5e\x19\x19\xf0\xc0\xff\x9d\xcf\xd9\xd4\xeb\ \xf5\x56\x6c\xaf\x70\x3e\x74\x03\xa0\x5a\xaa\xc0\x69\xaf\x0d\x10\ \x10\xc4\x05\xb0\x74\x96\xd0\x11\x44\x05\xa0\x23\x08\x0c\x40\x47\ \x10\x18\x80\x8e\x20\x30\x00\x1d\x41\x60\x00\x3a\x82\x88\x00\x74\ \x04\xf1\x01\xe8\x08\x02\x03\xd0\x11\x04\x06\xa0\x23\x08\x07\x40\ \x40\x10\x00\x80\x3f\x02\x15\x20\xec\xef\x02\xb5\xa7\x02\xab\x24\ \xe5\xb4\x56\xc3\x50\x9f\x53\x2b\x00\x7f\x04\x2a\x80\xd7\xd1\xa4\ \xf9\x8f\xeb\x8f\xd8\xc8\x00\x03\x11\x95\x7d\xfd\x92\x1a\x8c\xaa\ \xf7\xae\x32\x00\xd6\xef\x86\x58\xc8\x02\xb1\x20\xad\xb1\xe1\xb9\ \x34\x3c\xe0\xbe\x53\xc7\xcf\x01\x12\x40\x02\x48\x00\x09\x20\x00\ \x00\x7e\x1d\x7b\x66\xe7\x57\xd4\xae\x2f\x00\xaf\x6b\x6c\x1d\xc0\ \xb1\xa0\xb7\x5d\x3f\x00\x21\x6f\x07\xd8\xba\xcb\xb9\x65\xc7\xa2\ \x81\x1e\x3d\x00\xc8\xe7\x00\x09\x20\x01\x24\x80\x04\x90\x00\x03\ \x51\x15\xfc\xee\x56\x08\x70\xab\x0d\x86\x62\x8e\x95\x05\x30\x18\ \x76\x57\x4c\xa6\x33\xf0\xff\x1b\xb1\xa7\x14\xb3\xf9\x08\x32\x80\ \x47\x6d\xe0\xbd\x10\x42\xf0\x16\x6d\x00\x5f\x7c\xb1\x1d\x0e\x76\ \xbc\x62\x34\x5e\x81\xff\x3f\x82\x7d\x88\xa5\x62\x6d\xd8\x30\x06\ \x33\x7a\x81\x0c\xd0\x17\xb6\x81\xc7\xd1\xc8\x20\xb8\x84\x57\xa0\ \xd8\xbd\x6e\xd6\xdf\x61\xf7\x5b\x20\xb7\xab\x01\xbe\xae\x29\x86\ \x17\xf2\x32\xe0\xb6\x84\x0d\xb0\xef\xfb\xef\xa9\x38\x4c\x18\xfb\ \x17\x03\x6a\x08\xf5\x22\x01\x40\x3f\xf9\xc3\x2a\x6c\x6d\x32\x12\ \x86\x13\x14\x40\x0d\x58\x57\x64\x70\x09\x20\x01\x24\xc0\x08\xf6\ \x8b\xc8\x00\x7f\x60\x6e\xac\x04\xfb\x9e\x0d\x8a\xdd\xa2\x98\x4c\ \x67\xe1\xfb\x07\x8e\xad\x09\x0a\x34\x01\x44\xfc\xdd\xa0\xf6\xb2\ \x5d\x1f\x4e\x59\xaa\xd8\x3e\xc4\xbc\x00\xbb\xbf\xfb\x0e\x9c\xfe\ \xf5\x17\x70\xfd\xc6\xb5\x70\xfe\xf7\x5f\x67\xe3\xc7\x1e\xc0\x2e\ \xc6\x8e\xc4\xb6\x54\x16\x3b\xb4\x02\x78\x1d\x8d\xdc\x17\x42\x01\ \x4f\xdb\x9c\x00\x56\x5f\x2f\x7d\x25\xb8\x52\x00\xc3\xfd\x6e\x60\ \x57\x68\x22\x81\x6e\x2e\x45\x83\x3d\xec\x77\xce\x09\xa0\xfa\x2d\ \x1c\x00\x74\x94\x04\x90\x00\x12\x40\x02\xe8\x00\xc0\x0d\x03\x51\ \x3b\xb7\x9d\xa1\x81\x88\x7d\x79\x00\x1f\x7e\xb8\x13\x0e\xf8\xf8\ \xd8\x62\xc8\x85\xf5\x62\xf1\xf8\xb1\x4b\x96\x04\xe0\x73\xb6\x70\ \x5f\x07\x84\x7c\xed\x4b\x03\x30\x9b\x4f\xc0\xaf\x73\x62\x30\x4f\ \x71\x58\xb9\x26\x00\xb6\x4d\x65\xed\xe2\x37\xbc\xb5\xb3\x94\xad\ \x07\xb4\x03\x18\x0c\xbb\x62\x01\xf1\x4e\x86\xe8\x00\x2f\x61\xb0\ \x39\x03\x14\x61\x40\xec\x05\x11\x01\x2a\x34\x00\x3c\xa2\x3b\x80\ \x32\x4b\x0b\xdc\x8a\x17\x3a\x0f\xfe\xf8\x43\xd8\xf5\x9d\xb7\xe1\ \xf0\x4f\x3e\x86\xfb\x92\xe3\xa0\xc9\xd1\x41\x05\xf8\x90\x0c\x60\ \x32\x9d\xa3\x2b\x80\xd7\x0a\xb3\x60\x4b\xe3\xdc\x17\x3d\xb7\x31\ \x19\xe1\xa5\xfc\x8c\xc5\x01\xde\x7a\xeb\x30\xfc\x9a\x9f\x09\x00\ \xa5\xba\xda\x19\xfa\xae\xb6\x94\x78\xb7\x25\xbc\x0c\x1a\x8d\x57\ \x2d\x82\xd0\x83\xed\xab\x1b\x00\x76\xda\x8b\x77\xf5\x15\x03\x18\ \x7b\x28\x1c\x8b\xad\xc7\x46\x30\x18\xcb\x89\x38\xaf\x2a\x9f\x7c\ \xb2\x83\xae\xf6\x06\xf1\x02\x07\x79\x78\x96\x2b\x68\x5b\x14\x60\ \x06\xc6\xde\x6c\x65\xa8\xdb\xcd\x51\x8b\x57\x1b\x40\x24\xea\x10\ \x6b\x77\x98\x3d\x04\x0e\xfa\xe8\x03\xd2\xf0\xa7\x7c\xf5\x85\x98\ \xdb\xe3\x9f\x56\x16\x92\x00\x36\x34\x56\xae\x2c\x00\x9e\xe5\x3d\ \x8d\x3f\x64\x58\x0f\x3d\x9c\x9e\xf4\xdb\x7c\x83\xb3\x97\xc7\x57\ \xf2\x33\x7f\x9d\xeb\xfb\x46\xfb\x3d\x37\x2b\xc2\x1c\x06\xc3\x85\ \x58\xd6\x94\x67\xef\x01\x2c\x45\x31\x99\xce\x5b\x8d\x5f\xf7\x1f\ \x3f\x9a\x26\xe2\x6f\x69\x7b\xf7\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x00\x81\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x48\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x98\x08\x03\x46\x0d\x68\x68\x68\xf8\x8f\x07\xd3\xc5\x80\x51\ \x03\x9a\x9a\x9b\x71\x6a\x06\xca\x11\x36\x60\xda\xf4\xe9\x3f\x70\ \x19\x30\x6d\xfa\x8c\xef\xd8\x0c\xa0\x08\x03\x00\x40\x01\xe5\x9c\ \x90\x52\x8d\xc4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x08\x3c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x08\x03\x49\x44\x41\x54\x78\x01\xed\x9b\x05\x70\x2a\xfd\ \x11\xc0\x53\x19\xeb\x78\xdd\xc6\xdd\x2b\xa3\xb5\x71\xab\xbb\xeb\ \xf8\xd4\x1b\xfb\xfc\xfb\x68\x02\x79\xee\xee\xee\x6e\x51\x1e\x77\ \x87\xc6\x83\x06\x0e\x02\xe1\xe1\x70\x77\x48\x1c\xdd\xde\xf2\xe6\ \x86\xde\x04\x8b\xf4\x42\x4a\x76\x66\x9f\x22\xff\xfd\xb1\xf6\xdf\ \x25\x2d\x49\x76\xf6\x8d\xad\xd6\x68\xd0\xd6\x0e\x00\x1f\x6e\xd9\ \x0a\x49\x30\x1e\xd8\x6a\x0d\x7a\x4d\xe0\x76\xe8\xec\x08\xa1\x69\ \x01\xd8\x8c\x43\x25\x08\xcd\x0a\x40\x0c\xa1\x49\x01\x88\x21\x34\ \x29\x00\x31\x84\x26\x05\x20\x86\xd0\xa4\x00\xc4\x10\x9a\x14\x80\ \x18\x42\x93\x02\x10\x43\x68\x52\x00\x62\x08\x4d\x0a\x40\x0c\xa1\ \x49\x01\x88\x21\x34\x29\x00\x31\x04\x89\x00\x44\x83\xd3\x10\xf2\ \x99\xeb\x56\x36\xea\x5a\x3f\x00\x69\x20\xd4\x0f\x80\x09\x39\xd6\ \x71\x38\x7d\xdd\x00\x22\x7e\x1b\xcc\x38\xb4\xeb\x52\xdf\xec\xe4\ \x93\xff\x39\x80\x78\x6c\x06\xdc\xb4\x1e\x9c\x36\x75\x5d\xea\x9a\ \x56\x43\xe8\x95\x49\xaa\x10\x9a\xda\x30\x80\x6d\xac\x3b\x00\x76\ \x00\xec\x00\xd8\x01\xb0\x03\x40\x82\x32\xe8\x01\xaf\x6b\x0c\x3c\ \xb4\x41\x32\xf5\xcf\x4e\x36\x0e\x80\x58\x58\x68\x84\xa4\xd3\x69\ \x93\x12\x12\x31\x77\xe3\x84\x00\x36\x36\x3e\xcf\x84\x64\x1a\x0e\ \x58\x81\xa6\x69\x18\x24\x8c\x70\xf9\xce\x28\xec\x3f\xad\x87\x7f\ \x1f\xd2\xc0\xdb\x7b\x28\x78\x67\xaf\x1a\xba\x8f\x68\xe1\xe8\x45\ \x03\xfe\x1f\xd3\xda\x45\xfc\xf6\x9f\x0a\xf5\xe7\xfe\x2f\x72\x40\ \x38\x30\x03\x2f\x06\xa7\xa0\xe7\x98\x16\xda\xba\x09\x78\xff\x90\ \x16\x8e\x5c\x9f\x80\x8b\x4f\x2d\x70\x6b\xc8\x0e\x0f\x28\x27\xdc\ \x23\x69\xb8\x39\x60\x87\x73\x0f\x4d\x70\xf0\xd2\x58\xe1\x8d\x5d\ \x54\xb6\x4d\x4e\x14\x3a\x7a\x48\x75\xab\x9c\xf8\xc5\xcf\xee\xde\ \xfd\xc8\xb6\x03\xc0\x44\xdd\xf0\xb4\x7f\xaa\xf8\x09\xbf\xb7\x5f\ \x03\x17\x1e\x5b\x40\x69\xf1\xc1\xe8\xab\x48\x4d\x1d\x99\x0d\xc3\ \xf3\x11\x0f\x1c\xbf\x39\x99\xef\x90\x93\xf9\x0e\x05\xe9\xe5\xe1\ \xfd\x70\xdb\x00\xb0\x4d\x3b\x40\x7e\x44\x07\x6f\xed\xd1\xc0\x8d\ \x7e\x3b\x18\x66\xc3\x68\xd8\xba\x94\x72\x04\xe0\xf4\x3d\x63\xa1\ \x4d\x4e\x16\x78\x18\x2f\xde\xea\x51\x7e\xa2\xa1\x01\xa8\xd4\x66\ \xe0\x3f\x31\xd8\x73\x76\x0a\x9e\x10\x31\x50\x99\x58\x34\x64\xc3\ \x3a\x68\xf4\x82\xec\xb0\x3e\xdd\xa9\x20\x22\xad\x5d\xd4\x97\x1b\ \x12\xc0\x8b\x01\x23\xb4\xcb\x49\x38\x73\x9b\x86\x17\xda\x78\x51\ \x7b\xb5\x1c\x18\xdc\xd1\x4d\x81\xa0\x77\x87\xe0\xd0\x95\x71\x0c\ \x89\xa5\x36\xf9\xcb\x6f\x35\x14\x80\x41\xc2\x54\x34\xfe\xe2\x43\ \x0f\x1a\x2e\x52\xe5\xe4\xe6\x78\x01\xea\x88\x37\x0c\x27\x6e\x4f\ \xf1\x10\xa8\x45\xf4\x84\x75\x01\xe0\xa2\x2e\x70\x58\x88\x4d\xab\ \xf1\x43\x4a\x25\xb4\x77\x93\x70\xee\xde\x0c\x1a\x5c\x56\xf5\xae\ \xd8\xa6\x42\x38\x7c\x65\x3c\xc7\x57\x89\x68\x9b\x8c\xf8\xe4\x9a\ \x01\xb0\x61\x27\xd8\x4c\xca\x4d\x31\x7e\x62\x74\x88\xaf\xe3\x14\ \x1c\xba\x64\xa9\x68\x3c\xea\xd0\x38\xb7\x69\x00\x84\x70\x90\x1d\ \xd6\x65\x3a\xe4\x44\xdf\xba\x42\x00\x67\x7c\xb1\x90\x7d\xc3\x7a\ \xf9\xce\x08\xbc\x77\x50\x0f\xcf\x34\x6c\x55\x00\xa8\x5a\x47\x29\ \x17\x4c\xfa\x63\x60\x8f\xc6\xc1\xcd\x26\xc1\xc5\x24\x60\x3a\xc2\ \xc1\x98\x2f\xba\xd6\xc4\x88\x61\x97\x6f\x95\xab\x7e\xb2\x25\x39\ \xc0\x49\xd3\xbc\xeb\x13\x70\xfd\x99\xaf\xa6\xf1\xa8\xfd\xa3\x1c\ \xd0\xb1\x04\xcc\xad\xa4\xa1\x00\xab\x25\x97\x2f\x00\xbb\xb0\x0c\ \xe6\x50\xfd\x39\x03\x4b\x24\x9f\x0f\x7c\x32\x19\xf1\x51\xc9\x01\ \x60\x4b\xbb\xfb\xcc\x30\x0c\x7b\xa2\xa0\x32\x32\xf0\x42\x57\xd9\ \xf8\xc1\xe1\x04\xc4\x12\x19\xa8\x47\x10\x4e\x30\xb9\x50\x17\x00\ \xb5\x23\xc0\x97\x5d\x22\xc7\x77\x8e\xbf\x91\x14\x00\xb6\xb8\x9d\ \x0a\x12\x1e\x69\x5d\xc2\x61\x8a\xe5\x4e\x39\xc1\xae\xae\x02\xa3\ \x49\x58\x58\xca\x8b\x8c\x5c\x49\x67\x20\xb5\xb0\x08\xf1\xb9\x39\ \x48\xcc\xcd\xc3\xfc\xe2\x12\x64\xb3\x39\xd1\x63\xb8\xc5\xe5\xba\ \x20\x1c\xbf\x65\xcc\x77\xf6\x90\x7a\x49\x01\x60\xc3\xf3\x36\x7f\ \x89\x19\x2e\xd3\xe5\xe9\x9c\x51\x18\x18\xe5\x8a\xc6\xf7\xe9\xe2\ \xbc\x91\x59\x10\x24\xc3\x1b\xc9\x24\x92\x10\x66\xb9\xb2\x8a\x30\ \xf2\x85\x52\x80\x04\x53\xb5\x3d\xe1\xc5\xa8\x07\xef\x19\x85\x4e\ \x19\xf1\x45\xc9\x00\x9c\xbf\x39\x0a\x47\xaf\x4f\x56\x3d\x98\xc6\ \x1e\x03\xbb\x77\x11\x04\x49\x67\xb3\x10\xe1\xe2\x68\x68\x55\x45\ \x40\x02\x04\xfc\xd5\x12\x62\x6b\x96\xc5\x37\x76\x53\x19\xfe\x16\ \xf9\xc7\x35\x6c\x86\xec\xb8\xf1\x59\xb7\x7e\x70\x40\x0d\x37\x87\ \xec\x55\x0f\x86\x59\x3d\x9b\xcf\xbf\x36\x84\x37\x28\x1a\x4f\x88\ \x0c\x8d\xb2\x31\x60\xd8\x20\xc4\x78\x8d\xb0\xcc\x2a\x4f\x58\x4b\ \x28\x1c\xb8\x34\x96\x6b\x97\x13\xe7\xeb\x02\xc0\x84\xe9\x0d\xd5\ \xfe\xa9\xf1\x21\x74\x39\xe8\x1d\xf3\x54\x3d\x14\x1d\x8d\x83\x20\ \xf3\x4b\x4b\x22\x03\x59\x36\x20\x9e\x52\xf1\x1a\x63\x22\xa2\xc7\ \x64\x78\x8f\x41\x41\x6f\x18\xaf\x51\x22\xcf\x3f\x36\x43\x67\x0f\ \x35\x56\xe7\x48\xcc\x5d\x5c\x43\xd1\x16\x72\x5d\x6a\xd0\x91\x45\ \x00\x94\xdd\x5f\xf5\x50\x21\x3e\x7e\x05\xf9\xef\xb8\x67\xd8\x70\ \xf9\x73\xf1\x1a\x61\x98\x15\xe1\x71\x73\x8b\xa5\xf0\xb1\x47\xe2\ \x55\xdf\xeb\xb6\xd2\xc1\x03\x20\x63\x92\xe4\x00\x8b\xd5\x5e\x04\ \xa0\x9b\x09\x55\x3d\x14\xc3\xd7\x74\x41\x22\x5c\xe9\x93\x8d\xb3\ \xbe\xca\xde\xc9\x86\xc3\xc2\xe3\xb0\x42\x08\x82\x0d\x53\xb5\xf7\ \xc2\xc1\x0a\xde\x0f\x24\x01\x60\x36\xbf\x06\x60\xf0\x54\xbf\xe7\ \x63\xec\x0a\x82\x06\x95\x00\xbc\xaa\x0c\x80\x09\x06\x85\xc7\x71\ \xa9\x12\x00\x0f\x97\xaa\xfa\x5e\x58\x8e\xdb\x15\xe4\x8a\x24\x00\ \xec\xf6\xd7\x00\x34\x74\xb0\xea\xa1\x22\x73\x25\x17\x8e\x95\x12\ \x20\xb0\x4c\xa0\x72\x72\x66\xa3\x29\xe1\x71\xc9\xf9\x52\x08\xd1\ \xd1\xea\x21\x70\x57\x45\x43\xa7\x82\x8a\x4b\x02\xc0\xe7\x75\x22\ \x00\xec\xc5\xab\x1e\xca\xc3\xa6\x40\x10\x34\x46\x30\x2c\xc2\xb2\ \x10\x67\xbc\xab\xef\x27\xac\x5f\xe4\x29\xcb\xe9\x34\x08\x32\x15\ \xa8\x7e\x9b\xbc\xf2\xdc\x86\x49\x90\x96\x04\x40\x9c\xd7\xb7\x76\ \x93\x18\x77\x55\x0f\x85\x17\x1e\xa1\xa5\xc9\xe6\x72\x22\xe3\x10\ \x02\xcb\x04\x8b\x20\x38\x5e\x19\x26\xb4\xaa\x17\x10\x64\x21\x9d\ \xa9\xdd\x0d\xde\x9c\x2a\xb4\x77\xab\x1e\x48\xd6\x08\x1d\xb9\x60\ \x80\x33\xf7\x4d\x35\x0f\xc6\xcc\x2f\x95\x0c\x11\x4a\x61\x0d\x8d\ \x70\xa5\x12\x88\xe2\x62\x92\x35\xdf\xe7\xbd\x43\x9a\x15\x7e\x26\ \xd1\x51\xf7\x66\xc8\xe7\x1e\xdf\xd0\xa6\xe7\xce\x23\x0d\x74\x1d\ \xd5\xd6\x3c\x98\x31\xc0\x60\x33\x54\xbe\x1f\x28\xa3\x51\x2e\x0e\ \xe9\x4c\x06\x04\xe1\x92\x59\x18\x18\xe1\x40\x4b\x57\x0e\x01\x95\ \xd5\x57\x0c\xc9\xb6\x2e\xd5\x57\xeb\x02\x80\xf7\xf8\x8d\x0e\x42\ \x74\x5a\x65\xf1\x4d\x07\xa6\xbc\x35\x21\x38\xa2\x71\x21\x14\x84\ \x70\xc0\x9c\x20\x74\x86\x82\xcb\xe3\x85\x48\x74\x0f\x58\x5a\xc9\ \x83\x72\x24\x59\xba\x51\x8e\xb1\xa0\x2b\x33\x59\xba\xf4\xcc\x8a\ \x09\x30\xd4\x02\xf0\xa1\x96\xfa\xbf\xc8\x64\x44\x2f\xd8\x90\xee\ \x3b\xa5\xc6\xf9\x5c\x4d\x00\x42\x57\x28\x78\x82\x20\x42\x8b\x5c\ \x4e\x52\x0b\x39\x50\x8d\x09\xc6\xaf\x9e\x31\x0a\x83\xd6\x61\x6f\ \x18\xde\xdd\xaf\x4d\xf3\x73\x09\x99\xe4\xf3\x00\xc3\x88\xb5\x38\ \x02\x27\xa7\xfd\x75\x41\x30\x06\x19\x51\x73\x04\x15\x86\x22\x4e\ \xff\x12\xf4\xeb\x13\x35\x07\x2c\x2a\x23\x0b\xb7\x86\x68\xe0\xef\ \x00\x2b\x38\x1b\x94\x1c\x00\xb6\xd4\xfb\x4e\xeb\xf9\x01\xe5\xc4\ \x9a\x46\x59\x58\xd2\x66\xb9\x14\x44\xf9\x04\x99\x58\x5a\xc1\x86\ \xa9\xd8\x33\x38\x63\x09\xec\xf9\xf1\x16\x59\xd7\x84\xe9\x09\xc9\ \xe0\xf2\x05\x17\x26\x8a\x2d\x1b\x8b\x5b\x6d\x76\xe0\x0f\x00\x0f\ \xd4\xae\x4d\x1d\x7a\x0e\x8e\x72\x35\x01\xec\x3b\x67\x84\xce\x5d\ \x54\x54\x26\x7b\xf6\xb1\x2d\xdd\x0b\x3c\xe9\x9b\x82\x37\x77\x53\ \xc2\xee\x6f\x53\x14\x87\x2a\xd5\x8c\x3f\x77\x77\x06\x8a\x0b\xd4\ \x2e\xd5\xd7\xb7\x7c\x31\xc2\xc5\xdc\x70\xea\xca\x48\x71\xf3\x4b\ \x4e\x07\x36\x0d\x42\xb9\xf1\x1a\xea\x95\x27\x5e\x68\x53\x90\x85\ \xb6\x6e\xf2\x6f\x0d\xb3\x19\x62\xc2\x33\x70\xf8\x9c\x1e\x21\x6c\ \x96\x27\x60\xa6\x5f\x35\x68\xbd\xf8\xc0\x0d\xed\x0a\x8a\x5f\x96\ \x52\xbb\x1a\x6e\x37\x88\x10\xd0\x13\xde\xda\x4d\x6d\x5a\x4e\xc0\ \x4c\x8f\x86\x3f\xd3\x70\x70\xe4\xb2\xf5\xb5\xdb\xcb\x89\x37\x1b\ \x76\x3b\x8c\xe1\xf0\xb8\x77\x12\x4b\x13\x1c\xbe\x3a\x2e\x94\xc8\ \x75\xeb\xb0\x27\x02\x37\x5e\xf8\x78\xcf\x32\x14\x3a\x7a\xa8\x85\ \x76\x85\xea\x3b\xdb\xe2\x0b\x12\x56\xab\x1d\xf6\x9e\xd2\x15\x47\ \xe7\x27\xef\x4c\xc1\x50\xe9\xe6\x58\xf7\x97\x24\x1e\xeb\x67\xf8\ \x35\xfb\x68\x06\x3b\xce\x37\x7a\xc8\xbb\x1d\x32\xe2\xb3\xdb\xea\ \x2b\x32\xd8\x27\xe8\x86\x2d\xc5\x5e\x01\x8d\xe8\x3e\xa6\x87\xb3\ \x0f\xcc\xf0\x50\xe3\x04\xa5\xd9\x07\x5a\x57\x10\x04\x63\xd5\x74\ \x10\xfa\x27\xbc\x70\xe7\x25\x0d\xc7\x6e\x4c\x16\xde\xde\xa3\x49\ \xb7\x75\xab\x70\x0b\xfc\xb8\x43\xf1\xf2\x2b\xdb\xfe\x7b\x82\xb8\ \x46\xc3\x72\x79\xe8\x9c\x1e\x3f\x4d\x04\x52\x56\xdf\xde\x47\xf1\ \xd3\x5d\xea\x79\x6b\x37\xf1\x97\x76\xd9\xc0\xa7\x5b\xd6\x2a\xf8\ \xe3\xeb\x8d\xae\xbc\x67\xbc\x69\x36\x3b\x76\x6b\xb4\xd6\xe3\x83\ \x84\xe9\xdc\xe0\x4b\xd3\x39\x9d\xc1\x72\x74\xc6\xe9\xec\x4a\xc4\ \xdc\x7f\x6a\xd9\x80\xfc\x07\xde\x0a\xa5\x0c\x92\x0b\xc9\x9e\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xa1\ \x47\ \x49\x46\x38\x39\x61\x10\x00\x10\x00\xf2\x00\x00\xff\xff\xff\x00\ \x00\x00\xc2\xc2\xc2\x42\x42\x42\x00\x00\x00\x62\x62\x62\x82\x82\ \x82\x92\x92\x92\x21\xff\x0b\x4e\x45\x54\x53\x43\x41\x50\x45\x32\ \x2e\x30\x03\x01\x00\x00\x00\x21\xfe\x1a\x43\x72\x65\x61\x74\x65\ \x64\x20\x77\x69\x74\x68\x20\x61\x6a\x61\x78\x6c\x6f\x61\x64\x2e\ \x69\x6e\x66\x6f\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\ \x00\x00\x10\x00\x10\x00\x00\x03\x33\x08\xba\xdc\xfe\x30\xca\x49\ \x6b\x13\x63\x08\x3a\x08\x19\x9c\x07\x4e\x98\x66\x09\x45\xb1\x31\ \xc2\xba\x14\x99\xc1\xb6\x2e\x60\xc4\xc2\x71\xd0\x2d\x5b\x18\x39\ \xdd\xa6\x07\x39\x18\x0c\x07\x4a\x6b\xe7\x48\x00\x00\x21\xf9\x04\ \x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x03\ \x34\x08\xba\xdc\xfe\x4e\x8c\x21\x20\x1b\x84\x0c\xbb\xb0\xe6\x8a\ \x44\x71\x42\x51\x54\x60\x31\x19\x20\x60\x4c\x45\x5b\x1a\xa8\x7c\ \x1c\xb5\x75\xdf\xed\x61\x18\x07\x80\x20\xd7\x18\xe2\x86\x43\x19\ \xb2\x25\x24\x2a\x12\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\ \x00\x00\x00\x10\x00\x10\x00\x00\x03\x36\x08\xba\x32\x23\x2b\xca\ \x41\xc8\x90\xcc\x94\x56\x2f\x06\x85\x63\x1c\x0e\xf4\x19\x4e\xf1\ \x49\x42\x61\x98\xab\x70\x1c\xf0\x0a\xcc\xb3\xbd\x1c\xc6\xa8\x2b\ \x02\x59\xed\x17\xfc\x01\x83\xc3\x0f\x32\xa9\x64\x1a\x9f\xbf\x04\ \x00\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\ \x10\x00\x00\x03\x33\x08\xba\x62\x25\x2b\xca\x32\x86\x91\xec\x9c\ \x56\x5f\x85\x8b\xa6\x09\x85\x21\x0c\x04\x31\x44\x87\x61\x1c\x11\ \xaa\x46\x82\xb0\xd1\x1f\x03\x62\x52\x5d\xf3\x3d\x1f\x30\x38\x2c\ \x1a\x8f\xc8\xa4\x72\x39\x4c\x00\x00\x21\xf9\x04\x09\x0a\x00\x00\ \x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x03\x32\x08\xba\x72\ \x27\x2b\x4a\xe7\x64\x14\xf0\x18\xf3\x4c\x81\x0c\x26\x76\xc3\x60\ \x5c\x62\x54\x94\x85\x84\xb9\x1e\x68\x59\x42\x29\xcf\xca\x40\x10\ \x03\x1e\xe9\x3c\x1f\xc3\x26\x2c\x1a\x8f\xc8\xa4\x52\x92\x00\x00\ \x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\x10\ \x00\x00\x03\x33\x08\xba\x20\xc2\x90\x39\x17\xe3\x74\xe7\xbc\xda\ \x9e\x30\x19\xc7\x1c\xe0\x21\x2e\x42\xb6\x9d\xca\x57\xac\xa2\x31\ \x0c\x06\x0b\x14\x73\x61\xbb\xb0\x35\xf7\x95\x01\x81\x30\xb0\x09\ \x89\xbb\x9f\x6d\x29\x4a\x00\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\ \x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x03\x32\x08\xba\xdc\xfe\ \xf0\x09\x11\xd9\x9c\x55\x5d\x9a\x01\xee\xda\x71\x70\x95\x60\x88\ \xdd\x61\x9c\xdd\x34\x96\x85\x41\x46\xc5\x30\x14\x90\x60\x9b\xb6\ \x01\x0d\x04\xc2\x40\x10\x9b\x31\x80\xc2\xd6\xce\x91\x00\x00\x21\ \xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\ \x00\x03\x32\x08\xba\xdc\xfe\x30\xca\x49\xab\x65\x42\xd4\x9c\x29\ \xd7\x1e\x08\x08\xc3\x20\x8e\xc7\x71\x0e\x04\x31\x30\xa9\xca\xb0\ \xae\x50\x18\xc2\x61\x18\x07\x56\xda\xa5\x02\x20\x75\x62\x18\x82\ \x9e\x5b\x11\x90\x00\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \ \x00\x00\x03\x2d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x02\xf4\x49\x44\x41\x54\x78\x01\xed\xdb\x03\xac\x5c\x41\ \x14\xc6\xf1\x53\xdb\xb6\x6d\x33\x7e\x41\x19\x54\x71\x6d\xdb\xed\ \x99\xdd\xda\xb6\x6d\xdb\x36\xa3\xda\xb6\x8d\xdb\xef\x6e\xed\xc9\ \xee\x4c\xde\xce\xee\x9c\xe4\x97\x1b\x54\xe7\xff\xb4\x73\x7b\x97\ \x42\x6e\x06\x0f\x8e\x47\xcc\xf9\x49\x88\x2a\xb8\xb6\x82\xe1\xb0\ \x02\x4e\xc2\x53\x38\x42\xa3\x46\xc5\x22\x63\x67\xe2\xc4\x18\xe4\ \xf5\x66\x23\xe6\x08\x2c\xd9\x10\xd7\x7e\x30\x1f\x0e\xc0\x1d\x70\ \xfe\x07\xbf\x3f\x07\x05\xf5\xf4\xef\x9f\x84\x3c\x9e\x62\x58\xb0\ \x06\x74\x26\xe6\x89\xb0\x19\x2e\xc0\x3b\x70\x02\x94\x93\x22\x75\ \x86\x0d\x8b\x43\xcc\x59\x21\x02\x1a\xc1\x00\x58\x04\x47\xe0\x99\ \xc4\x02\x86\x04\x60\x2e\x4b\x42\x34\xc7\x75\x08\x2c\x85\x63\xf0\ \x48\xc1\x02\x06\x04\xc0\xf2\xba\x16\x30\x25\x40\x75\x1b\xc0\x06\ \xb0\x01\x6c\x80\x48\x62\x03\xd8\x00\x36\x80\x0d\xf0\x1a\x4e\xc3\ \x7a\x18\x07\x23\x43\x31\xc0\x43\x38\x02\x8b\x60\x00\x34\x82\x08\ \xc8\x4a\x8b\x16\x45\xa3\x1f\xc7\xe3\x29\x14\xe4\x01\x24\x16\x14\ \xa2\x35\xd4\xf0\x9d\x14\x99\xe3\x92\xc4\x04\x7b\x80\xd7\x70\x01\ \x36\xc3\x44\xf7\xe8\xfb\x6d\xc1\x01\x03\x12\x91\xec\x18\x10\x60\ \x13\x4c\x84\x2e\x58\xb0\x16\xae\x25\xa9\x5f\xbf\x14\x24\x3f\x86\ \x07\x20\x8a\x42\x8a\xc6\x06\xb0\x01\x6c\x00\x1b\xc0\x06\xb0\x01\ \x6c\x00\x1b\xc0\x06\xb0\x01\x6c\x00\x1b\xc0\x06\x70\xff\x17\x99\ \xb9\xf4\x97\x67\x01\xaa\x42\x71\x48\x19\xda\x01\x98\xe3\x63\xe1\ \xf6\xb8\x1e\x84\xf7\xe0\xfc\xc1\x51\x12\xa2\x3b\xf5\xed\x9b\x2a\ \xa4\x02\x7c\x79\x20\xe2\x01\x38\x92\x9e\xe0\xf7\x74\x74\x1f\xaa\ \x30\x3b\x80\xbb\x00\xf3\x3c\x70\xfc\xb4\x1e\xca\x9a\x19\x80\x39\ \x2a\xcc\x07\x27\x40\x57\xcc\x0c\x80\x1b\xa1\xea\xef\x26\x9b\x12\ \xc0\xbd\x6f\x88\xaf\xe3\xf0\x0d\xc0\xdc\x06\x9c\x70\x0e\xb0\x33\ \xdc\x03\xdc\x08\xf7\x00\x6f\xb4\x04\xf0\x7a\xb3\x98\x12\xe0\xba\ \x86\x00\x1f\xdd\xe7\x14\xfd\x39\x4c\xe4\x23\xe6\x36\x30\x12\xe6\ \xc1\x4c\xe8\xe7\x7b\x75\xd6\xa7\x4f\x3a\x4d\x01\xb6\x6b\x08\x70\ \x95\xa4\x87\x39\x26\x16\xac\x8f\xeb\x59\x70\xfe\xe1\x03\xec\x85\ \x8a\x4a\x03\x08\xd1\x52\x43\x80\xe1\xb2\xcb\xe7\x86\x13\x7e\xfc\ \x05\x6b\xdd\x43\x88\xa2\xcf\x80\xe4\x8a\x9f\x2c\x7d\x07\x79\x65\ \xfe\xe2\xf2\x01\x3e\xb3\x7b\xd6\x3d\x84\x28\x7a\x29\xdc\x4c\x61\ \x80\xa1\xb2\x5f\xeb\x2a\xaa\x7f\x50\x78\x16\x98\x0d\x4e\x80\xb6\ \x43\x6c\x99\xbf\x6c\x9f\xaa\xe2\x8a\x4f\x83\xb3\xc0\xf1\xd3\x16\ \x48\x28\xf3\x4d\xa7\x86\xf2\xe5\x55\xde\x0f\x60\xae\x03\x77\xc0\ \x91\xf4\xf4\xcb\xfb\x0d\xa2\xca\xfe\x05\x2b\x75\x07\x50\x10\x21\ \x2e\xb4\x82\x3d\x7f\x79\xf3\xc4\x47\x38\x8a\xc5\x7b\xe2\x9a\x94\ \xe4\x87\xa2\x10\xf3\x0b\x0d\x01\xde\x69\xbb\x27\xc8\x9c\x10\x8a\ \x42\x45\xdf\x7d\x41\x8f\xa7\x14\x4e\x90\xc9\x28\x80\xa3\xa7\xa3\ \xc1\x73\x32\x62\x98\xd3\x6b\x0a\xf0\x82\x8c\x18\x3c\x57\xf7\xfd\ \x6b\x4a\xa9\xd3\x64\xcc\x30\x1f\xd1\x10\x60\x2e\x19\x33\xb8\xdf\ \xae\x3c\x80\x10\x95\xc8\x98\x61\x4e\xa8\xf8\x26\xc4\x11\xdf\x97\ \x96\x51\xc3\x5c\x13\x3e\x2a\x58\xfe\x0d\x14\x27\x23\x47\x88\xae\ \x81\x9f\x03\x10\xd2\xe8\x61\x6e\x02\xaf\xfc\x58\xfe\x9e\xef\x45\ \x89\x29\x23\x71\x32\x5c\x2e\xf9\x25\xf1\x06\xa6\xf8\xee\x0e\x85\ \xdc\x78\xbd\x79\x88\xb9\x0b\x6c\x86\x8b\xf0\x12\x9e\xc1\x19\x58\ \x0d\x2d\x20\x3d\x19\x38\x9f\x00\x36\x4e\x56\x98\x53\xe6\x4c\x5f\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x77\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x3e\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x98\xf6\x06\x9c\x39\x73\xe6\x3f\x1e\x4c\x27\x03\x46\x0d\x18\ \x35\xe0\xfc\x85\x0b\xbf\x71\x69\x3e\x7f\xfe\xfc\x6f\x6c\x06\x50\ \x84\x01\x85\xd6\x15\x8d\xa2\x4b\xaf\xf1\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x28\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x03\xef\x49\x44\x41\x54\x78\x01\xed\x5b\x03\xac\xa5\x39\ \x14\xee\xda\xb6\x6d\xdb\xd6\xed\xe9\xf3\xda\xb6\x1d\x67\x83\xb5\ \x82\xb5\x62\xbd\x60\x15\xad\xcd\xb9\x3d\x1d\xdb\xd6\x6d\x3b\xb6\ \xbe\xb1\xe7\xb2\xfd\xf1\xbe\xe4\x4b\x26\xea\x9c\xef\x9c\xde\xbe\ \xa3\x5f\x74\x21\x22\x26\xf6\xb9\x74\x47\x50\xe4\x15\x5e\xcb\x17\ \xbc\xa1\xe7\x45\x1e\x31\xb6\xd8\xbc\xbd\x63\x9a\xb0\x84\x93\x72\ \x79\x0b\x1c\xcb\x67\x1d\xd3\xa2\xe5\x7c\x46\xe4\x09\xc3\x7e\xb9\ \x74\x5b\xc7\x72\x0c\xc4\x83\x9e\x69\x1c\x6e\x44\x7e\xa2\xaf\xe5\ \x53\x10\xbe\x06\x0d\x3d\x29\xf2\x80\x45\x83\xe4\x36\x8e\x69\x34\ \x44\xaf\xc5\xb1\xa3\xfe\xbe\x7e\x3b\x91\x75\x58\x2d\x1f\x83\xe0\ \xf5\xd1\x6a\x7a\x34\xdb\xd1\xef\x73\xfd\xd6\x8e\x69\x38\xc4\x6e\ \x80\xa3\x70\x43\xb2\x1b\x7d\x96\x0f\x43\xe8\xc6\x68\x99\x1e\xca\ \x66\xf4\x8b\x67\x6c\xe5\x98\x86\x41\xe4\x26\x38\x02\x37\x25\x83\ \x59\x9f\x7a\x00\x02\xcb\xa1\x37\xf2\xfe\x2c\x46\x7f\x28\xc4\x95\ \xc9\xe1\x99\xba\x05\x8e\xe5\x3d\x10\x56\x11\x35\xdd\x9d\x8d\xe8\ \x77\x5e\xbf\x85\x63\x1a\x08\x51\x15\x72\xf0\xa2\x5f\x2e\xdd\x32\ \xfd\xd1\x37\xea\x4e\x08\xaa\x8e\xf2\x8e\xd4\x47\xdf\x6a\xea\x5f\ \xbd\x03\xd4\xa0\x54\xdf\x02\xab\xd5\x6d\x10\x52\x0b\xad\x91\xb7\ \xa6\x33\xfa\x8b\x5e\xda\xdc\x69\xea\x55\xab\x03\x3c\x53\x5f\x9c\ \x95\xc2\xac\x4f\xdd\x04\x01\xf5\xa0\xd7\xf2\xc6\xd4\x54\x7a\x25\ \x96\xc7\x3b\x43\xad\x9e\xa9\x5f\xbd\x1c\x80\xb3\x70\x26\xce\x8e\ \x5e\x2b\xe0\x51\xf2\xdd\xd4\xe1\x9e\xd5\x95\xc8\xee\x2c\xcb\xd7\ \x9c\xa1\x6f\x97\x70\x88\x63\x9a\x0f\x83\x03\xd0\x2e\xe1\x9f\xd6\ \xc8\x8f\x3d\xab\x17\xbd\x51\xd7\x7b\xad\xce\xa8\x6b\x39\x3d\x89\ \x5b\xf6\x5f\x43\x24\x53\xe7\x12\x16\x2d\xd3\x2c\x18\x91\x50\xce\ \x5b\x1e\x88\x1f\x56\x77\x4e\xa9\xfb\x35\x27\xe0\x2f\xd2\x86\x5e\ \xea\x8b\x3c\x44\x6a\xf9\xa6\x63\xfa\x0a\x8f\x8e\x63\x9a\x8d\x03\ \x33\xc6\xd9\xd0\x06\x8d\xd0\x0a\xcd\xd0\x2e\xac\xa6\xa6\xf8\x82\ \xa3\x70\x8e\xd3\xaa\x63\x45\x9d\x2e\x71\xb5\x73\x25\xde\xc8\x36\ \xb1\x3a\xa6\x68\x75\x8d\x63\x9a\x99\x03\xf1\xb3\xad\x96\xcd\x1b\ \xa8\xda\xe8\x62\xc7\x6a\x5a\x86\xc5\xcf\xc0\xc3\x2e\x36\x06\x5b\ \x2c\x5c\xe8\x98\xa6\x64\x50\xfc\x74\xaf\xe5\xe5\xa2\x1c\x78\xa6\ \x33\x1d\x53\x29\x43\xe2\x7d\x89\x9b\xce\x13\x95\xc0\x17\x9b\x4f\ \x77\x2c\x27\x67\x40\xbc\x9b\x52\xa4\x73\xaa\xac\xe5\xe9\x54\x0c\ \x2f\x53\x2c\xde\x4e\x31\x85\xb3\x44\x2d\x98\xac\xd5\x71\x98\xda\ \xa4\x50\xfc\x04\xab\x0b\x27\x8b\x7a\x60\x6a\x8f\xc2\x31\x6b\x8c\ \xb3\x92\xcf\xf1\xb6\x87\x3a\x51\xd4\x13\x53\x4c\xd3\x51\x98\xdc\ \xa4\x40\xfc\x58\x54\x8d\x0d\xea\xee\xd2\x21\x28\x36\x12\x2c\x7e\ \x84\x2f\xca\x23\x44\x23\x61\x8b\xcd\x07\xa3\x57\x97\x40\xf1\xc3\ \x50\xa6\x87\x59\x6e\xfa\x9f\xf6\x75\x4c\x7d\x12\x24\x7e\x40\xa9\ \x87\x3c\x50\x84\xc4\xf4\x5e\x2d\xfb\xd4\xde\xf3\xab\x4f\xb7\x08\ \xbd\x0b\x11\x03\xf8\x39\xc4\x76\x00\x6c\x10\xb1\x80\x44\x29\xfe\ \xf5\x6f\x3a\x25\xd5\x7d\xff\x54\xcf\x0d\x3c\xd3\xab\x09\x78\x03\ \x5e\x89\xf9\x13\xf8\x16\x46\x44\xe6\x37\x22\x16\xd6\xdc\xf8\x88\ \xc6\xa1\xd1\x16\x9d\x1d\xd3\xc2\x04\x38\x60\xe1\xa4\x3f\x5b\x76\ \x12\xa1\x51\xd2\xf2\xdc\xa4\x24\x42\xcb\xeb\xfd\xb0\xf0\x86\xee\ \x4b\x8a\x03\x3c\xab\x7b\x23\x3c\x80\xf2\xdd\xc4\xa4\xc2\x86\xde\ \x89\xf1\x00\xfe\x90\xa0\x5a\xe0\x7b\x11\x1a\xc9\xea\x12\xc9\x31\ \x22\x24\xa6\xfe\xd7\xbe\x47\x1d\x0c\xef\x8e\xb1\x1c\x88\x7f\xd7\ \x7a\x1e\x6c\x0a\xb9\xf6\x76\x49\x0d\xc6\x0e\xc7\x60\x72\xf5\x69\ \xed\xa2\x45\x62\x33\x4c\x71\x2b\xde\x26\x5b\x93\x17\x07\xac\x01\ \xe8\xd1\x2a\x0c\x1c\x8d\x6f\x02\xb0\xe0\xb0\xf1\x85\x4a\x79\x47\ \x35\x09\x96\x35\xea\x91\x80\x35\x80\xfa\xa0\x02\xe3\x4a\x98\xd3\ \x63\x79\xa1\x92\xad\xf2\xe5\xab\xb5\xe3\xcb\x5f\xa3\xa1\xf7\x43\ \x3e\x80\xbf\x97\x33\x8a\x5a\xb6\x3d\xd2\xb6\x6b\x2d\xd9\x26\x9c\ \xe7\x98\x7c\x19\xff\xdf\x6f\x22\x14\x36\x31\x36\x9b\x83\xed\x0c\ \xb4\xcd\xea\xf9\xe8\xc2\x99\x9b\x98\x5e\x5b\x11\x02\x93\xbb\x37\ \x1d\xb0\x01\x03\x16\x2c\x61\xa7\xef\xd1\x7c\x98\x68\x10\xd0\xf7\ \x83\x73\xb1\x0a\xb3\x3e\x1b\x82\xb4\xc6\xb0\x47\xb0\x76\x31\x02\ \xe1\x53\xbb\xd3\xd1\xe1\xb2\xd0\xc2\xa1\x70\xc4\xda\x4b\x59\xbe\ \xbb\xbc\x3a\xf4\xf7\x7e\x3f\x60\x88\x2a\x22\x01\xcb\x4f\x70\x7e\ \xd0\xef\x0f\x9d\xa1\x2f\x3c\xcb\xbf\x5d\x77\x75\x99\x48\x08\x30\ \xfa\x76\x9a\x7e\x76\xac\x3e\x17\x8d\x06\x86\xa5\x22\x10\x02\xd8\ \xd6\x85\xc5\x9b\x14\xbe\xab\x9c\xbc\xce\xcc\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x77\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x04\x00\x00\x00\x00\x60\xb9\x55\ \x00\x00\x02\x3e\x49\x44\x41\x54\x78\x01\xed\xd7\x43\xb4\x1c\x41\ \x14\xc6\xf1\x8e\x6d\xdb\xda\xc5\x59\xc7\x5a\xc5\x76\xdf\x8a\x6d\ \x7b\xf5\x56\x31\x56\xb1\x6d\x27\xeb\xf0\xd9\x1c\xcf\xc4\x76\xbe\ \x18\x93\xdc\xce\xe9\xd4\xd4\xa9\xa8\xeb\xbf\x1b\xfe\x66\x9a\xd7\ \x08\xcd\xb9\x85\x48\x4b\x8f\xcf\x2a\x68\xc8\x2e\x15\x80\x04\x24\ \xbb\x78\x82\x36\x40\x34\x4f\xd0\x09\xe0\x09\x5a\x01\x3c\x41\x17\ \x80\x21\xe8\x05\x30\x04\xbd\x00\x86\xa0\x17\xc0\x10\xf4\x02\x18\ \x82\x5e\x00\x4b\xd0\x0a\xe0\x09\x5a\x01\x3c\x41\x2b\x80\x27\x48\ \x00\x5c\x88\x67\x4b\x44\xc8\x0a\x20\x4f\xe0\x00\x69\x96\x1f\xe7\ \x67\x01\xfe\x9f\x16\x1c\xfc\xcb\x80\x9b\xf0\xc2\xc3\xc4\x7c\xbd\ \x8d\x6e\xf6\x57\xbc\x0f\x38\x00\x07\xa0\x01\x70\x13\x7e\xb9\x54\ \x01\xd2\x11\x2d\x59\xb6\x1a\x40\x36\x62\xa5\x8a\x83\xdb\xd9\x09\ \x1d\x80\x03\x50\x03\x08\x20\x53\xb2\xa0\x4d\xc0\xd0\x92\xa3\x9a\ \x98\xdd\xcd\x49\x66\x2d\x16\x90\x8a\x68\xc9\x32\x2c\x00\xe3\x0b\ \x88\x86\xd4\x99\xc6\x50\x14\xed\xa3\x6b\x74\x87\xf0\x31\x31\x83\ \x05\xf8\x90\x2a\x55\x1a\x02\x5f\x3e\x23\x0b\x57\x70\x1a\xbb\xb0\ \x16\x53\x52\xc8\x4b\x6f\x08\x5c\x23\x67\x32\x00\x15\x79\x30\x12\ \xc4\xa7\x07\x90\x0d\x72\x00\x7f\x01\xe0\x2e\x3d\xd6\x0b\x78\x2e\ \x32\xe8\xac\xd8\x30\x72\xa6\xe8\x35\xba\xd9\xf0\xca\x86\x61\x9e\ \xb4\x00\xb8\x10\x2f\x55\x02\xbc\x61\x80\x09\x58\x84\x95\x58\x7e\ \xc4\x14\xd4\x6e\x78\xed\x45\xb9\x8d\xf0\x65\x0d\x48\x43\xb4\x64\ \x59\xdf\x00\x32\xf9\x33\xa1\x1d\xc0\x4d\xb8\xa5\xf2\xe0\xe6\x37\ \x80\x6c\x09\x80\x82\x14\x01\x1c\x80\x03\x08\x44\x38\x19\xf1\x80\ \x69\x45\x46\x8e\xa7\xb3\x94\x4e\xf1\xb4\x63\x64\x7b\x06\xa0\x6e\ \x32\xe2\x00\x63\x1a\x51\x1a\xe1\x6b\xe6\x76\xba\x60\x01\xc8\x46\ \x8c\xd4\xd7\xc7\xc0\x6d\x09\x18\x5f\x5c\xb8\xf4\x5d\x8c\x18\x80\ \x98\x45\xf8\xad\x00\x3a\xcd\x01\xc4\x0c\x7d\x80\x8b\x04\xa6\x31\ \xca\x00\xd1\x58\x8b\xe9\x18\x8f\x99\xd8\x88\x24\x0e\x10\xc5\x02\ \x5a\x28\x02\xec\x85\x00\x7d\x69\x14\x76\xff\x00\x18\x5b\x83\x1e\ \x11\xc2\x33\xcf\x29\x9a\x8c\xce\x82\x98\xbe\x3f\x0c\x45\xd7\x70\ \x82\x88\x1b\x55\x5e\x09\xe0\x26\x66\xda\x02\x18\x06\xd5\xa7\xcd\ \x74\x97\x40\xa0\x34\x31\x77\x72\x21\x45\xb3\x61\x26\x88\x2d\xc7\ \xe2\x54\x2c\xca\x4e\x2b\xa2\x74\x38\xcd\x00\xb1\xf9\x75\x4d\xc7\ \x37\x31\x9d\xf9\xfa\x05\x3a\xc7\xf3\x13\x0c\xe0\x92\x5d\xc0\xed\ \xc9\xb7\xee\x44\xde\xe6\xa7\x61\xfb\x37\xf6\x3c\xf9\xfa\x5c\xa8\ \xa7\xa1\x63\x99\x6d\xe8\x30\xdd\x25\xd0\x4d\xda\x2b\x5a\xd9\x7f\ \xdf\x5b\x51\x00\x3a\xda\x5f\xe3\xc4\xae\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x1e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x4e\x50\x4c\x54\x45\xe7\xec\xed\x58\x58\x58\x99\x9b\ \x9b\xe7\xec\xee\xe7\xec\xed\xeb\xeb\xeb\x5d\x5d\x5d\x57\x57\x57\ \x47\x70\x4c\xe7\xec\xed\xe7\xed\xed\xe7\xec\xec\xc7\xcb\xcb\x9f\ \xa2\xa3\xe7\xec\xec\xa0\xa3\xa4\xc6\xca\xca\x97\x99\x9a\xea\xea\ \xea\xeb\xeb\xeb\x5a\x5a\x5a\x5a\x5b\x5b\x63\x63\x63\x62\x63\x63\ \x72\x72\x73\x72\x73\x74\xeb\x73\x5d\xe8\x00\x00\x00\x14\x74\x52\ \x4e\x53\xff\xff\xfb\xb1\xf5\x19\xff\xff\x00\xf7\xb5\xb3\xbf\xd0\ \xb2\xcf\xc1\xfb\x18\x1a\x46\xbe\x10\x1a\x00\x00\x00\x6b\x49\x44\ \x41\x54\x78\x01\xed\xd7\x35\x02\x84\x50\x14\x43\xd1\xef\x32\x82\ \xeb\xfe\x37\x4a\x8f\x3c\xdc\x73\xfb\x9c\x3e\xcc\xad\xec\x89\x40\ \x1a\x28\x36\x98\x92\x7a\x14\xf8\x30\xb2\xef\x28\xe0\x69\xc0\x8f\ \x02\x6c\xa4\x59\x00\x00\x00\x00\x00\x00\x00\x60\x47\x3a\x12\x00\ \x00\x00\x00\x00\x00\x9c\xde\xf3\x51\xa0\xa4\x81\x62\x14\xa8\x68\ \xa0\x1e\x05\x62\x1a\x10\xa3\x40\x94\x51\xfb\xfc\x37\x0a\xe8\xbf\ \x19\xde\x9b\x30\xe9\x02\xf8\xce\x0d\x19\x23\x61\x52\x01\x7c\x68\ \xc3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x77\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x3e\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x98\xf6\x06\xfc\x7f\xeb\xf6\x1f\x0f\xa6\x93\x01\xa3\x06\x8c\ \x1a\xf0\xe7\x6d\xd4\x6f\x5c\x9a\xff\xbc\x89\xfc\x8d\xcd\x00\x8a\ \x30\x00\x61\xe6\x04\x69\xc4\xdb\x93\xe2\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x7a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x01\x41\x49\x44\x41\x54\x78\x01\x9d\x91\x25\x54\xc5\x60\ \x14\x80\x47\x3f\x68\xc7\xa9\xd0\x23\x19\xc9\xf4\x82\xf4\x86\xbb\ \x4b\xcf\xaf\xe0\xee\xee\xce\x73\x77\x9d\xe2\xee\x97\xbb\xe1\xf0\ \xef\xd9\x3d\xe7\x9b\xef\xbb\x46\x9d\x09\x4e\x27\x02\x72\xd0\x6e\ \xf5\xb9\xdb\x71\x98\x4f\xc9\x45\x28\x81\xcf\xa9\x04\x93\x76\xe9\ \xc5\xe3\x3c\x2a\x8c\x5a\x60\x50\x2f\x80\xf9\x5b\x42\x16\x08\xb4\ \x19\xbc\xce\x23\x09\xda\xa3\xfd\x6e\xc1\xa3\x01\xab\x61\x5d\xc2\ \x6e\xda\xba\x63\x1d\xda\x6c\xa2\xe0\x94\x77\xc2\x09\x67\x13\xc1\ \x6b\xbb\x6c\x45\xe7\xbc\xab\x88\x28\x38\x66\xad\x40\x7b\xb5\x44\ \x58\x9f\x21\x0c\x01\x67\x13\x3f\x24\xc2\x05\x4c\xa1\x05\x62\xd9\ \x02\x6b\x21\x72\xc2\x5a\xc9\x82\xda\xda\xa4\xef\x21\x32\x16\xf0\ \xbb\xd5\x44\xc4\x36\x4e\x78\x07\x94\x0c\xf7\x41\x4a\x57\x87\x12\ \x7f\x34\x20\xb7\x88\x83\xb0\x46\x32\x1c\x6b\x07\xfc\xe1\x93\x7b\ \xc4\x8c\xcc\x7d\x09\x78\xda\x04\x5e\xc7\x21\x11\xbf\x5b\x29\x09\ \x5a\x96\xa6\x60\x4c\xb3\x53\x86\xc5\xc7\x7c\xb4\x50\x10\x51\x05\ \x43\x47\x9b\x7f\x67\x50\x10\x5e\x05\x2e\xe5\x6f\x41\x6d\x6d\x3b\ \x22\x20\x63\x21\x2b\x60\x39\x3b\xf4\xac\xce\x82\x62\x6f\xf5\xa7\ \xc0\xf1\x31\x8b\xbd\x90\x82\xfa\xf9\x89\xaf\xe1\x8d\x28\xb7\x3e\ \x05\x39\x54\x5d\x5d\x05\x9e\xb3\x44\x81\x02\x59\x90\xa3\xff\x60\ \xe3\x20\xae\xb9\xe9\x21\xb3\xa7\xfb\xd2\xe6\x35\xad\x9c\x09\xae\ \x5c\xea\x47\xbc\x01\xea\x0e\xe2\x20\xfb\x51\xc5\xde\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x80\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x47\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x98\x08\x03\x46\x0d\xf8\x9f\xce\xf0\x1f\x0f\xa6\x8b\x01\xa3\ \x06\xfc\xcb\x66\xc3\xa9\x19\x28\x47\xd8\x80\x5f\x2d\x46\x3f\x70\ \x19\xf0\xab\xd9\xe4\x3b\x36\x03\x28\xc2\x00\x40\xee\xdf\x2a\x02\ \x21\x5b\xeb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x2d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x54\x50\x4c\x54\x45\x80\x80\x80\xd9\xde\xde\xe7\xec\ \xee\xe7\xed\xed\xe7\xec\xed\xeb\xeb\xeb\xb9\xbc\xbd\xe7\xec\xed\ \x47\x70\x4c\xe7\xec\xed\x85\x85\x85\x84\x85\x85\xba\xbd\xbe\xd7\ \xdc\xdc\x86\x86\x86\xe7\xec\xec\x85\x86\x86\xb8\xbb\xbb\x9c\x9d\ \x9d\xe7\xec\xec\x8f\x8f\x8f\x8e\x8e\x8f\xb8\xbb\xbc\x9c\x9e\x9e\ \x83\x83\x83\x82\x82\x83\xea\xea\xea\xeb\xeb\xeb\xbd\x0e\x6f\x06\ \x00\x00\x00\x1c\x74\x52\x4e\x53\xff\xba\xb1\xb5\xf5\x19\xcc\xff\ \x00\xf7\xff\xff\xfa\xbd\xff\xb3\xfe\xfb\xff\xb2\xff\xff\xcd\xff\ \xff\xff\x18\x1a\xae\xb6\xf8\x6a\x00\x00\x00\x6c\x49\x44\x41\x54\ \x78\x01\xed\xd7\x35\x02\x84\x50\x14\x43\xd1\xef\x32\x3e\xb8\xec\ \x7f\x9f\xf4\xc8\xc3\x3d\xb7\xcf\xe9\xc3\xdc\xcc\xae\x08\x94\xa1\ \xb2\x9d\x29\xa1\x7b\x01\x69\xc9\xbe\xbd\x80\xa7\x01\xdf\x0b\xd8\ \x9e\x46\x00\x00\x00\x00\x00\x00\x80\xf5\x04\x60\x5b\x00\x00\x00\ \x00\x00\x00\x3c\xe8\xfd\xa7\x17\x88\x69\x20\xea\x05\x02\x1a\x48\ \x7b\x81\x3f\x0d\xbc\x7a\x81\x77\x4e\xed\x33\xde\x0b\xe8\xe4\xd9\ \xbd\xff\x99\xa2\x09\xe0\x3b\x57\x92\xa7\x5e\x38\x70\x19\xa8\x47\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xf6\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x3f\x50\x4c\x54\x45\x47\x70\x4c\xe7\xed\xed\xeb\xeb\ \xe0\xf7\xc4\x55\xf3\xcd\x78\xeb\xeb\xeb\xe7\xec\xee\xe7\xec\xed\ \xe7\xec\xed\xfb\xb9\x2e\xf3\xcc\x76\xe7\xec\xec\xe7\xec\xec\xf7\ \xc4\x53\xec\xe3\xd9\xfb\xb9\x2d\xeb\xeb\xeb\xe7\xec\xed\xff\xad\ \x00\xfe\xb0\x0a\xfe\xaf\x07\x3f\xa5\xce\xc3\x00\x00\x00\x11\x74\ \x52\x4e\x53\x00\xb5\x19\xdb\xd1\x19\xb1\xf7\xf5\xfd\xd3\xb3\xb2\ \xdc\x1b\xfd\x1a\xb0\x5f\x8d\x73\x00\x00\x00\x55\x49\x44\x41\x54\ \x78\x01\xed\xcc\xc1\x01\x40\x30\x10\x04\xc0\x05\x00\x24\xb9\xeb\ \xbf\x56\x7f\xb8\xf5\xb7\x53\xc0\xe0\x4e\xd2\x3a\xe6\x57\x63\xdf\ \x81\xa9\x72\x68\x01\x33\xe4\xd0\x00\x26\x13\x0a\x14\x28\xf8\x18\ \x14\x42\x81\x82\x3f\x06\x0a\x14\x28\x50\xa0\x40\x81\x95\x90\x81\ \x39\x4a\x68\x02\x33\x97\x50\x0b\x66\xdf\xbc\xbc\xf2\xa6\xc6\x8d\ \x9c\x1c\x20\x7b\x64\x34\x04\xa6\xbb\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x01\x25\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x51\x50\x4c\x54\x45\xe7\xec\xed\xe7\xec\xee\xe7\xed\ \xed\xe7\xec\xec\xe7\xec\xed\xeb\xeb\xeb\xfc\x79\x21\xff\x67\x00\ \x47\x70\x4c\xe7\xec\xed\xf3\xae\x80\xf2\xb1\x85\xf2\xb0\x81\xe7\ \xec\xec\xe9\xd8\xc8\xea\xda\xcb\xf3\xb0\x82\xea\xea\xea\xeb\xeb\ \xeb\xf9\x8b\x40\xf8\x8c\x42\xfe\x6d\x0b\xfd\x6d\x0b\xfe\x6e\x0d\ \xfe\x6e\x0c\xfe\x6b\x07\xfe\x6a\x07\xf8\xc3\x2c\x5c\x00\x00\x00\ \x19\x74\x52\x4e\x53\xff\xb1\xb5\xb3\xf5\x19\xff\xff\x00\xf7\xcd\ \xfa\xfb\xb2\xbd\xba\xcc\x18\x1a\xff\xff\xff\xff\xff\xfe\x05\xac\ \x45\x91\x00\x00\x00\x6a\x49\x44\x41\x54\x78\x01\xed\xd7\xb5\x01\ \x80\x00\x10\x43\xd1\xc3\xdd\x9d\xfd\x07\xa5\x47\x82\x7b\x7e\x9f\ \xd7\x47\xec\x9d\x7d\x11\x48\x03\x5d\x26\xd3\x15\x63\x16\x50\x05\ \xa6\xcd\x02\x8e\xc0\x9c\x59\x40\x66\x22\x40\x80\x00\x01\x02\x2b\ \x00\x6b\x26\x02\x04\x08\x10\x20\x40\xe0\x5a\xa0\xc0\xfb\x6a\x16\ \x30\x31\x60\xce\x02\x19\x06\xf2\x59\xc0\xc7\x80\x37\x0b\x84\x2d\ \xda\x37\xd1\x2c\x60\xb8\xe5\xf4\xbe\x8e\x93\x21\xc0\xef\xdc\x01\ \x6a\xaf\x64\xeb\x0d\x0d\x4c\x7f\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x00\xca\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x91\x49\x44\x41\x54\x78\x01\x63\x18\xa2\x60\x73\x94\ \x2a\xc3\xd6\xf0\xf5\x0c\x9b\xc3\x32\x48\xd7\xbc\x3d\x54\x9d\x61\ \x4b\xf8\x53\x20\xfe\x0f\xc4\x9f\xc8\xd6\x0c\xc1\x61\x4d\xc4\x6b\ \xde\x1a\xae\x86\xaa\x39\xbc\x07\x22\xb1\x25\x4a\x90\x61\x4b\xa8\ \x31\x29\x36\x03\x0d\xeb\x84\xcb\x01\x05\xae\x41\x25\xfa\x19\xfe\ \x33\x30\x92\xa2\x19\x61\x00\x42\x72\x02\xd4\x10\xc2\x9a\x11\x7e\ \x8b\x92\x07\x4a\xde\x47\xf2\xdb\x0c\x90\x21\x58\xfd\x8c\x13\x6c\ \x0b\x57\x06\x6a\x78\x84\xa4\x78\x3e\x41\x9b\x09\xbb\x04\xd3\x66\ \xa2\x0d\x21\x4b\x33\x22\x50\xa3\x94\x18\x36\x87\xaf\x01\x26\x92\ \xe2\xa1\x91\xaf\x00\xe0\x1e\x85\xfc\x92\xfe\x81\xd9\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\x78\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x3f\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x63\xc0\x7f\ \x7c\x78\x08\x18\xb0\x75\xeb\xd6\xff\x78\x30\x71\x06\x8c\x1a\x30\ \x6a\xc0\xde\xbd\xfb\x7e\xe2\xd2\xbc\x77\xdf\xbe\x9f\xd8\x0c\xa0\ \x08\x03\x00\x10\xc9\x02\xf8\xe0\x54\xb8\x4c\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x75\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x56\x00\x00\x00\x40\x08\x06\x00\x00\x00\x80\xd9\x80\x71\ \x00\x00\x01\x3c\x49\x44\x41\x54\x78\x01\xed\xdc\x37\x52\x03\x41\ \x10\x40\xd1\x3d\x0e\x2e\xe6\x3a\x24\x98\x4c\xae\x87\x22\xc2\x4d\ \x0f\xfe\x2e\xf8\x54\xd3\x43\xa8\x4b\x60\x8f\x81\xb7\x11\x25\xef\ \x77\xff\xaf\x6a\x1d\xe0\x49\x5a\xbf\x93\xe5\x2d\x09\xb6\xf4\x39\ \x77\xa2\xf6\x54\x0b\xe6\x32\xea\x3f\xb7\x67\x0b\xa2\xf1\x55\xd4\ \xde\xff\xa6\xa6\x76\x88\xcc\x20\x7e\xad\x9f\x98\xff\xc6\xdb\x01\ \x3a\x7d\x54\xd1\x9b\x59\x51\x7b\x19\x02\x2e\xd5\xd4\xd6\x44\xed\ \x6d\x08\xb8\xe4\x34\xad\x34\xc3\x75\xde\x4e\x10\x02\x77\x34\x81\ \x0b\x2e\xb8\xa2\xf1\x18\xa1\x3e\x12\x1f\x57\xc1\x05\x77\x02\x02\ \x17\x5c\x70\x7d\x3a\x42\x68\x70\xa7\xbf\xe0\x82\x0b\x2e\x89\x5a\ \xb9\x19\x2e\x17\xcb\xfb\xcc\x05\xab\x4c\x2d\x2e\xb8\xe0\xbe\x8f\ \x1e\x17\xdc\x6d\x84\xc0\x1d\x5c\xe0\x82\x4b\xa2\xa9\xda\x0c\x57\ \x42\xdc\x42\x28\x07\xb8\xe0\x56\x43\x7d\xd1\x69\x5a\x77\x6a\x1b\ \x4c\xfb\x11\xb5\xab\xe6\xdb\xdc\xfa\x59\xf3\x0b\x10\x4c\x5f\x53\ \xd3\xd4\xc8\x3e\x3f\x1e\xc0\x18\x30\xec\xe7\x0c\x09\x16\xd8\x61\ \x6c\x0a\x80\x0d\xb1\xc1\xce\xab\x87\x11\x1f\xaf\x9b\xa2\xfa\xcf\ \x9d\x17\x71\x2c\x0b\x2a\xa8\x04\x2a\xa8\x5c\x2e\x24\x50\x41\x05\ \x95\xb8\xed\x0d\x2a\x4f\xbf\x10\x0f\xc3\xf1\xf8\x26\xa8\x04\x2a\ \x2f\x75\x80\x9a\xa7\x78\xb7\x0b\x54\x50\x89\xd7\xe9\x59\x00\x02\ \x54\x62\x79\x28\x16\x34\x63\x09\x3e\x62\xd1\x48\x96\x39\xfd\x00\ \xbd\xc4\x96\x2e\x69\xae\xfa\xcc\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\xa1\x25\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5c\x72\xa8\x66\ \x00\x00\xa0\xec\x49\x44\x41\x54\x78\x01\xec\xc1\xb1\x01\x40\x30\ \x00\x45\xc1\x0f\x63\x40\x6f\x1c\xb3\x03\x6d\x86\x00\x00\xe8\xb5\ \xc8\xbb\x73\xe2\x30\xa9\xf5\x2b\x00\x56\x47\xa9\x31\x45\xae\x07\ \xae\x00\x58\xcb\xd7\x6d\x6c\x07\x2d\xd3\x24\x00\xdf\xe4\xec\x37\ \x62\xcd\x03\x39\x72\x1d\x06\xa2\x68\x38\xa7\xfb\x1f\xea\x87\x1b\ \xfc\x70\x86\x9f\xa3\x7a\xd3\x50\x7e\x05\x09\x2a\x8d\x3c\xb5\xe6\ \x26\x8e\x04\x91\x8d\x26\x1f\x85\xa9\xf5\xed\xcb\xc3\xb1\x03\xe0\ \x13\xfc\xff\xff\xfb\x5f\xdc\x5c\x5f\xeb\xf6\x36\xc7\x88\xe3\x1f\ \x71\x12\xde\x5b\x04\xf0\x62\xe2\x7a\x8d\x10\xba\x5e\xbf\x21\xb9\ \x4e\x81\x4f\x28\x61\xb4\x36\x3b\xf5\x8f\xc8\x46\xb3\x1a\x8d\xd4\ \x5f\x9b\x7a\x65\x0c\x59\x77\x46\xbc\x8c\x5c\xcc\x88\x76\x72\x21\ \x67\x98\xf0\x1a\xee\x90\x98\x72\x55\xa3\xce\xac\xe2\x57\xbf\x64\ \x75\x99\x63\xa2\x14\x38\xe1\xf0\x69\xf4\xe4\x33\xf3\x13\xa9\x39\ \x89\xe5\xf8\x6a\x7c\xcc\xc6\x23\x36\x35\xee\x3b\x22\x24\x0e\x0d\ \xe7\xba\x3d\xad\x76\xaf\xa7\xba\xe9\x1b\x44\x15\xe1\x36\x46\x5a\ \xae\x6f\xe7\x89\x82\x96\x7e\xf7\xed\x8f\x7f\xfd\xef\x3c\x56\x01\ \xb0\x5d\x5d\x29\xee\x6e\xaf\x32\x04\x6c\x44\xc3\xe9\x5c\xd2\xc5\ \x30\xcd\xcc\x86\x2b\xc1\x7e\xde\x12\xaf\x3a\x52\x88\xc1\x40\xf4\ \x45\xa9\x11\x2e\x25\x62\x1a\x40\xd5\x2c\x79\x9e\xc4\x4e\xc8\xd7\ \x61\x4c\xeb\x48\x0c\x22\x74\xe6\x98\xcc\xe6\x40\x81\x7e\x53\x7f\ \xf1\x01\xa2\x99\x6f\x92\x6a\xdc\x14\x3d\xe7\xa3\x43\x54\x07\x42\ \x0a\xf2\xe8\x44\x93\x97\x98\x97\xa1\xd9\x8d\x66\x2e\x3c\x00\xa9\ \x39\x66\xc4\x64\xab\x82\x9f\x75\xbd\x52\xeb\x6b\xa7\xed\xc3\x54\ \xc3\x32\x31\xdf\x3e\x77\x5e\x67\x7c\x16\x78\xa7\x99\x4f\x4c\x5a\ \x7d\x18\x24\xd4\x75\xe4\xbe\xc5\xa3\x76\x05\x9f\xdc\xad\x30\x90\ \x4b\xb1\xdf\x7f\xf7\xf3\x5f\xe1\x78\xfb\x01\x10\x42\xe2\x34\xb9\ \x03\x9f\xc2\x2e\x06\xbe\xce\x03\x5f\x17\x00\xff\xf4\xc7\xf2\x50\ \x00\xf0\x75\x19\xf0\xb5\x17\x7c\x82\xb0\x0d\xbe\xbe\x2a\xf8\xba\ \x08\xf8\x9f\xda\x64\xd1\x87\xe3\xe0\xb3\xa9\x80\xaf\xb7\x83\x3f\ \x60\x9f\x22\xe4\xdd\xe0\x23\x2f\xf4\xeb\x5b\x3b\x2c\x79\xc5\xa3\ \xdc\x05\x3e\x63\x32\x6a\xb3\x2d\xa4\xe7\xdd\x07\x00\x05\xf4\xe0\ \x57\x03\x36\xc1\x2f\x67\x21\xa1\x3e\x0c\x3e\x4a\xdc\xf7\x04\x1f\ \x4d\xef\x0f\x3e\xf3\x3f\x0e\x3e\xcb\x75\xeb\x55\xa7\xdb\x75\x09\ \xe5\x16\xf8\x80\x7a\x80\x1f\xa1\xe3\xe0\xaf\x90\x6b\x66\x25\xa9\ \xe6\xbb\x0d\x3e\xaf\xa6\x8e\x83\x1f\x52\x5f\x3d\x14\xf0\xe3\x00\ \xf8\xe5\x46\x88\xd0\x6d\x37\x46\x79\xf3\x00\x90\xce\x00\x9f\xa1\ \x1e\x40\xb6\x9b\x4d\x75\xf3\xd0\x00\xc3\x80\x65\x8c\x66\xe9\x33\ \xf8\x96\x64\x88\xb2\x22\xb2\x07\x9f\x9f\x26\x79\xe0\x1d\x56\xcc\ \x7d\xbe\xe9\x0c\xf0\xe7\xa1\xa9\xc7\xc6\xf7\xd1\xec\xc1\xa7\x8a\ \xe6\xab\x0a\x8d\x34\xc0\x1f\x96\xf2\xb0\x52\x89\x67\x76\x16\x24\ \x8c\x0d\x68\x98\xef\x5d\x55\x01\x60\xd7\x30\xba\x01\x9f\xf1\xa3\ \x17\xe8\x2b\x14\x9e\xf5\xcb\xb9\x00\xdf\x61\x31\x5f\xd9\xa7\xeb\ \x19\x69\xf8\x63\xc1\x6f\x82\x0f\x6d\x25\x97\xcd\xca\xb3\x42\x46\ \xfd\x27\x2d\x5e\x8e\x05\x41\xd8\x25\x9c\x81\x63\xb1\x6f\x2a\x6c\ \xc1\x1f\x41\xe5\x59\x10\xe4\xb2\x57\x66\xc3\x2d\xd2\x6d\x4f\x39\ \xdc\xe2\x65\x12\xb3\x7a\x00\xa4\xb6\x4a\x41\xa0\x80\x98\x23\xe0\ \x83\xde\x1e\x7c\xbe\x01\xf9\xc6\x37\xa7\xd8\x0d\x3e\x61\x2f\x39\ \x5a\x6a\xde\xf8\x0b\xf0\x23\x0e\x80\xdf\x57\x2c\x6a\xde\xf8\x15\ \xfc\xec\xdf\x80\x98\x76\xd8\xa1\x62\x7e\x0b\x7e\xcd\xeb\x4c\xf0\ \xd9\xad\xfe\xb3\x62\x21\xf8\x03\x76\x4b\x98\x5b\x58\x64\x32\xae\ \x38\x0e\x3e\xb3\x46\xaf\xaf\xea\xa4\xd0\x2e\xf0\x97\xb5\x6d\xdf\ \x3f\x0f\xfc\xed\x8a\x96\x7d\xee\x15\x47\x6d\xd3\xf4\xff\x27\xb6\ \x6f\x22\xe6\xb3\x6c\x42\x7f\xc0\xe7\xf9\x07\x81\xfe\xfe\xf5\x8f\ \xcf\xff\x0b\xf0\xf4\x78\xab\xa7\x87\x9b\x04\xf8\x85\x44\x4b\x55\ \xf4\xd6\x66\x2b\x47\xb0\x70\xac\x6b\x13\xfc\x24\x08\x4b\x63\x28\ \x09\x37\x1b\x4f\x09\x6e\xf1\xb6\xd1\x2f\xf2\xa1\x1d\xa5\x3e\xa7\ \x40\x4c\x5b\xca\xe6\x97\x40\x4f\x5a\x3b\xe8\xfc\x81\x9a\xf3\x4c\ \x70\x5b\xb9\x1d\x38\x30\xa4\x48\xd5\x95\x56\xdb\x9b\x7b\xb7\xff\ \xbd\x24\x39\x4c\x3e\xe7\x02\xb9\x40\x0e\x90\xcf\x39\xc2\x2b\xe7\ \x78\xe5\x00\xaf\x17\x77\x7b\x7b\x55\xaf\x44\x38\x5c\xc8\x9c\x87\ \x70\xb8\xa2\xac\xd7\x6c\xcf\x0a\x3b\x0b\xd2\xe2\xcc\xfc\x00\xcc\ \x00\x2b\xb1\x06\x92\xb3\x2f\xca\xaa\x83\x72\xe2\xec\x91\x15\x2f\ \xc6\xf4\x50\x5f\xae\x58\xa9\xce\x1d\xe2\xfd\x4b\x7d\xdb\x98\xa4\ \x82\x6c\x82\xcf\x9a\x53\x8c\xaf\x05\x7c\x5e\x55\x86\x43\x25\xcc\ \x02\xbe\xb1\x03\x9c\x48\xd6\x31\x8d\xe2\x1f\x22\x63\x67\xa3\xe4\ \x8e\x89\xaf\x9d\x0d\x7c\x8e\xae\x22\xe9\xc3\x8f\x3e\x6b\x05\x01\ \x40\x7e\xb1\x1c\xfd\xac\xd7\x6f\xff\xf9\xf0\xf0\xe5\x37\x1a\x7c\ \x6e\xe3\xb8\x19\x01\x8e\x34\x00\xe5\x92\xaf\x4a\x05\x0f\x93\x43\ \x7d\x42\x8e\x03\x50\xcc\x6b\x22\xf8\xca\xe2\xf1\x51\x58\xbb\x0c\ \x7b\x40\x01\xbe\x00\x21\x89\x65\x0b\xec\xc9\xe7\x29\x4a\x4c\x8e\ \x1d\x7c\x39\x35\xf6\x85\x39\x93\xc7\x17\x76\x85\xaf\xb1\x9c\x66\ \xfb\xbe\x87\x61\x53\x39\x3f\xe7\xe8\xfe\x5c\x2e\x07\x80\x0a\x2f\ \x65\x57\x11\x00\x8d\x47\x63\xd2\xea\xe3\xf1\x08\x82\x80\x48\x7f\ \x19\x0c\x86\xba\x85\x5d\xe3\x74\xf0\x51\x82\x2c\x65\xc5\x72\x1a\ \xf8\x14\x8b\xa0\x52\x0d\x81\x02\x49\x2d\x5d\x3d\xbe\x26\xbc\x24\ \x96\x8c\x9a\xc5\xe3\xcb\xf9\xb6\x6e\x1b\x30\x09\xfc\xab\xce\x7a\ \x10\xa6\x3d\xbc\x46\x4c\x03\x9f\x5f\x42\x03\xf0\x79\x2b\x18\x03\ \xe4\xeb\xa5\x48\xa7\xd5\xbe\xf8\xcb\xe9\xe9\xee\xb7\x0c\xfc\x90\ \xdb\x20\x6c\x23\xee\xa3\xc4\x08\xa0\x52\xf6\x55\xb1\xe0\x25\x44\ \x39\x11\xf6\x1a\x63\xc5\x53\x8d\x28\xf1\x4f\xb4\x88\xbc\xa4\xed\ \xd6\x8e\x83\x58\x35\x35\xf8\xca\x12\xca\x26\xc3\x62\xf1\xf8\xd2\ \x10\x61\x16\xf0\x2d\x87\x69\xa9\x11\x0b\xa2\x99\xef\x97\x46\x8c\ \x12\x22\x13\x44\x07\x4a\xe5\xa2\xa3\x5b\xbe\x54\x70\x4a\x95\xb2\ \x53\x2a\x16\x9c\x62\x31\xef\xe4\x0a\x9e\xf2\x73\x9e\xf2\x7c\x1f\ \x51\x19\x4b\x83\x28\x79\x3f\x4a\x24\x42\xfd\x58\x9f\x28\xa0\x41\ \x7f\x48\xc3\xe1\x70\xdc\xef\x0f\xa8\xd7\xe9\x8d\xbb\xed\xee\xb8\ \x1b\xbe\xb6\x3b\x9d\x71\xbb\xdd\x19\xf7\x3a\xdd\x00\x51\x78\x40\ \x63\x5c\x02\x32\x11\x12\xe3\x28\x8c\xbb\x3d\xb5\x2c\x27\x2b\x15\ \x7c\x71\xd9\x1c\x42\xfd\xb4\xf9\xc6\x84\xb0\x7f\x2a\xf0\xaf\x36\ \x9a\xd2\x2b\x29\xe1\xe4\xc8\xbc\x8c\x1d\xa9\x74\x7e\x1f\x7e\xfc\ \x69\x5b\x1b\x00\x9f\x23\x80\x46\xf3\xf8\xaf\x17\x17\x47\xdf\x31\ \xf8\x3d\x6e\xdd\xb0\x0d\xb8\x6f\x9c\x68\x00\x16\x2a\xbe\x2a\xe4\ \x7d\x04\x65\x38\x2a\x01\x3f\x22\x29\xfd\x42\x04\x38\xd5\x1e\xdf\ \xba\xff\x8d\x14\xd3\xc1\xb7\x4f\x20\xce\x0c\xbe\xc5\xd3\x29\xa5\ \xae\x5c\x08\xa0\x31\x50\x59\x42\x7d\x34\x64\x01\xbe\x21\x68\x0f\ \x5e\x5b\xaa\xb9\xd5\x5a\xc5\xad\x2e\xd6\x1c\xfd\x5a\x59\xa8\xb8\ \xca\x51\x28\x3d\x3e\x50\x2c\xdb\xc0\xe7\x7f\x51\xbf\xbc\x1e\x59\ \x5f\x02\x22\xaf\x8f\x74\xf8\xf9\x47\xa3\x51\xd0\xb8\x68\x8e\x5b\ \x8d\xe6\xb8\x71\xde\x1c\x35\x1a\xad\x51\xf3\xa2\x31\x1a\x8e\x46\ \xec\xb5\x53\xc0\xc7\x2b\xb7\x43\x76\xf0\xf9\x65\xf6\x5c\xbe\xca\ \x0e\xbe\x0c\xd1\x89\x30\x35\xd4\x37\xbf\x4a\xf0\x55\x52\xc2\x0c\ \x2d\x1e\x5f\x80\x8f\x28\xc1\x8f\xf5\x04\x24\x1f\x7d\xf4\x59\xe7\ \x72\x0b\x70\x19\x01\x9c\x5f\x1c\xfe\xad\xd9\x3c\xfd\x91\xc1\xef\ \x84\xad\x19\xb6\x36\xcb\x93\x48\x20\xf8\x57\x03\x50\xcd\xab\x62\ \xde\x93\x1b\x99\x08\x7e\x5e\xfa\x8a\x08\x14\xdb\x2b\x7e\x9b\xca\ \xf4\xf8\x98\x6c\xf9\x94\x1d\x7c\x09\x8b\xad\x9a\x10\x65\x3a\x2f\ \x1d\x7c\x36\x44\x28\x40\x9e\xcd\xe3\x93\x98\xa8\x6c\xe0\xa3\xdc\ \xba\x94\xab\x15\xb5\xbc\x5a\xcf\xd5\xeb\x35\xb7\xbe\x5a\x0f\xc1\ \x5f\x70\x53\x72\xf9\x0c\x64\xf2\xb9\x00\x11\x25\x82\x4c\x00\xe9\ \xe0\xcb\xe7\x14\xe0\x4b\x0f\xa8\xbb\xcd\xfe\x20\x20\xd0\x91\xc2\ \xd9\xf1\xd9\xe8\xe4\xf8\x74\xd4\x0c\x0d\xc3\x45\x68\x20\xa6\x02\ \x5f\xce\xb7\xfc\x31\x8f\xf7\xcc\xe0\x2b\x4c\x00\x3f\x7d\xbe\x15\ \x72\xfe\x5c\x1e\xe8\xa9\x74\xf0\xd3\xd6\xb4\x4a\x8d\x70\xe4\x7d\ \xa5\x2c\x37\x82\x12\x7c\x26\x2b\x8a\x00\x3e\xeb\x9a\x06\xe0\xf4\ \x6c\xef\xef\xed\xf6\xc5\x33\x03\xfe\xf3\xb0\x35\xc2\xd6\x62\xa3\ \x30\x4c\x34\x00\xd5\x6a\x5e\x15\xf2\x9e\xc8\x6b\x90\xe6\x48\x11\ \x80\x13\x05\xab\x04\x0e\xbf\x31\x23\x02\x90\x21\x66\x2c\x09\xd8\ \xb2\x1d\x80\x18\x8a\xe2\xb1\x65\x25\x9c\x58\x0c\x81\xd6\x49\xdd\ \x03\xca\x3a\x16\x00\xcb\xc9\xbe\x25\xf4\x57\xb6\x73\x81\x84\xea\ \xbd\x7c\xb1\xa0\x36\xb6\xd6\x73\x1b\x5b\xab\xb9\xe5\xb5\x25\xd7\ \xf7\x3c\x35\x81\xcd\x0e\xbe\x04\x79\x16\xf0\x85\x3e\x5a\xc1\x17\ \x3a\x02\x7c\xf9\x8c\xac\x2b\x17\x76\xbf\xdb\xa7\xa3\xc3\x93\xe1\ \xf1\xc1\xd1\xf0\xf0\xe0\x48\x47\x08\x94\x0e\xbe\x80\x85\x24\xec\ \x12\x7c\x95\x02\x3e\x61\x42\x4a\xce\x02\xbe\x98\x6b\x3e\x7d\x91\ \xf3\x98\x1d\x7c\xe9\x7c\xe4\xbd\x94\x1d\x7c\xb1\xcf\xbf\x0a\x7c\ \xb3\xeb\xa3\x8f\x3f\xed\x69\x03\xe0\xd7\xde\x19\x80\x7f\x74\x3a\ \x8d\xe7\xec\xf5\xcf\x75\x57\xd8\xce\xd8\x08\x74\x27\xdb\x00\x37\ \xb5\x08\x9a\x87\x93\xd3\x8d\x1c\x0d\x81\x09\x3e\x12\x10\x13\x8e\ \x28\x73\xc0\x32\xb7\x3a\x91\x95\x30\x19\x0c\x72\x42\x8d\xbf\x40\ \x4e\xe4\xcb\x2d\x29\x3d\x88\x53\x7a\x24\xbc\x09\x89\x05\x26\xea\ \x08\xf8\x29\x38\xd4\x8f\x8b\x3c\x28\xb9\x38\x86\x88\xf5\xcd\x3c\ \x2f\xd2\x3b\x30\x97\xd7\x57\x9d\x8d\xed\x75\x2f\x84\x5e\x7b\x78\ \xc7\x9c\xc7\x48\xe7\xd2\x86\x5e\x09\x3e\x5a\xc0\x47\x0b\xf8\x68\ \x01\x1f\xf1\x4a\xf0\x75\x93\x67\x04\x02\x7c\x43\x3f\xc1\x50\xfb\ \x05\x1f\x77\xae\x6f\x7a\x3b\x37\x36\x3d\x1d\x21\x34\xce\x1a\xa3\ \xc3\xc3\xa3\xf1\xc1\xdb\xc3\x61\xb3\xd1\x1a\x83\xb2\x2c\xb7\xc0\ \x28\x34\x26\x00\x53\x66\x9f\xcc\x53\x41\xe6\x94\x09\x7d\xd6\xe1\ \xa2\x31\x02\xb9\xf6\x64\x84\x77\xa9\xc1\x4b\x9a\x65\xf8\xa9\xcc\ \x03\x49\x10\x1b\x3b\x32\x72\xbb\x04\x68\xc8\x00\x60\x65\x20\x7e\ \xb3\x26\xf8\xb2\xee\x03\x21\x30\x6a\x40\x48\x80\x4f\x06\xf8\xc2\ \xf8\x8a\x1a\x43\x22\xca\x03\x40\x81\x43\x7d\x9f\x53\x82\x0e\xeb\ \xa1\xbd\x10\x08\x30\xad\x7a\x0f\x63\x76\x08\xf9\x5b\x9c\x26\xbc\ \x36\xa1\x66\xf0\x59\x2f\x2b\xf8\x70\x35\xf8\xf6\xc3\x9f\x8c\xd5\ \x7b\x09\xe0\x0b\x7d\x79\xb2\xbf\x58\xaf\xa9\xad\xeb\xdb\xde\xce\ \xcd\x2d\xaf\x52\x2e\x29\x56\x4f\x07\x9f\xaf\x9f\x1d\x7c\x02\x64\ \xad\x24\x78\x11\xad\x27\xfb\xe9\xe0\xf3\xc2\x4e\x00\x5f\xe4\xef\ \x59\x9f\x0c\x7d\xfe\xbd\x92\xda\x52\xd5\x5d\x0c\xcf\x36\xee\x3f\ \xba\xeb\xb7\x9a\xed\x60\xef\xed\xfe\x70\xef\xcd\xc1\xb0\xd9\x6a\ \x8e\xe3\x40\x69\xf6\xea\x3d\xf9\x5c\x12\xfc\xac\xd5\x7b\x32\x7d\ \x9d\xe1\x64\x7f\xca\x2c\x4a\x5a\x4a\x0f\x45\x16\x44\x10\x60\x8f\ \xa2\x50\x62\xcc\x6c\x73\x63\xf0\x05\xfc\x69\x95\x80\x82\x2f\x04\ \xc5\xf0\x11\xc5\xfb\x6a\x8a\x8d\x25\x02\xa5\xef\x95\x18\x7c\xb0\ \x82\x2f\x8c\x83\xb0\x77\x10\x98\x0b\xde\x94\xd3\xcb\x76\xe5\xfb\ \xc9\x00\xbe\xac\x72\x33\x7a\x45\x19\x6e\x65\xa1\xac\x6e\xdd\xbd\ \x1e\x42\xbf\x93\x2b\x14\x0b\x8a\x75\xe6\x00\xbe\x09\xe3\xa4\x1f\ \x13\xc0\xc7\x04\xf0\x29\x2b\xf8\x46\x24\x43\x66\xc5\x61\x46\xf0\ \xc5\xf3\x1a\x0f\x58\xae\x94\xd5\xdd\x87\x77\xfc\x7b\x61\x6b\x34\ \x9a\xc1\xee\xeb\xfd\xe1\x9b\x97\xbb\xc3\x41\xaf\x17\xd8\xc0\x17\ \x8c\xa5\x3a\x1a\x5e\x9f\x66\x3a\xd0\x5c\x7c\x46\x14\x68\x80\x4f\ \xc6\xbd\xc8\xdc\xf3\xcf\x01\xfc\x49\x18\x43\x02\x7c\x32\xc0\x27\ \xe2\x90\x18\x4d\x4e\x12\x9d\x32\x49\xd9\x9a\xf4\xe6\x00\xc2\xf0\ \xf8\xc6\x2b\xa6\x47\x00\x89\x85\x23\x84\x71\x4a\x0f\x2d\xb5\xca\ \x59\x4e\xf6\x25\xf8\xe2\xca\xe9\xaa\xf7\x7e\x2e\xf0\x85\x7a\x32\ \xf8\xca\x45\xd8\xbe\xbe\xed\xde\xba\x73\xdd\x5f\x59\x5f\x71\xc5\ \xed\x53\x41\x00\x8b\x07\x4f\x06\x9f\x24\xf8\x0c\xef\x5c\xc0\x97\ \x07\x8c\x16\xf0\x61\x3a\xf0\xf9\x59\xae\x7e\x5e\x80\x85\x85\x8a\ \x5a\x78\x5c\xf1\xef\x3d\xba\xed\x9f\x9f\x5c\x8c\x5e\xbd\x78\x3d\ \xdc\xdf\x3d\x1c\x42\x10\x88\x91\x9f\x6b\xf5\x9e\xb5\x6c\xf7\x67\ \x01\x1f\xaf\xf0\xf8\x32\x33\x66\x01\x9f\x65\xcb\x38\xd8\xfe\x50\ \x8c\x92\x5d\x2d\xa1\x14\x58\x25\x85\x55\x97\x56\x53\x23\xa7\x42\ \x99\xc8\x5a\xb6\x9b\x21\x97\x2f\x14\x2d\xd5\x7b\x68\x2d\xe2\x41\ \xfb\x69\xf6\x2c\xe0\x8b\xaf\x36\xf0\x0b\x95\x02\xde\x7b\x70\xc7\ \xbf\x79\xe7\x9a\xa7\x73\xf0\x44\x64\xea\xa4\x83\x60\xf7\xe0\x56\ \xf0\x65\x2e\x5f\x17\xf9\x94\x4a\x25\x28\x16\x8b\x50\x28\xe4\xc1\ \xf7\xf3\xe0\x79\x9e\x4e\x23\x46\x3f\x43\x54\xe0\xba\x0e\x28\xa5\ \xa2\x31\x50\x8e\x13\x5d\x37\x1e\x8f\xa3\xfb\x05\x14\x44\x32\x05\ \x01\x0c\x86\x03\x18\x0c\x86\x30\x1c\x0c\xa0\x3f\xe8\x43\xb7\xdb\ \x85\x56\xb3\x05\xbd\x5e\x4f\xa7\xfd\x0c\xf0\x85\xa1\xb0\x81\x0f\ \x49\xe0\x27\x64\x2f\x8d\x2f\x0e\x3a\x50\x5f\x59\x74\x75\xeb\x75\ \xfb\xf9\xd7\xcf\xdf\x0c\x5e\x3d\x7f\x3d\x18\x0d\x86\x53\x83\x4f\ \xe9\xe0\x4f\xff\x6b\xe5\xb3\x80\xcf\x2a\x73\x06\x9f\x85\x2b\xc1\ \xb7\x19\x01\x14\xaf\x30\xb5\x01\xe0\x5d\xbd\xc8\xe5\x9b\xfb\xa1\ \xc9\x24\x13\xd2\xac\xe0\xf3\xf7\x12\xfc\xd9\xaa\xf7\x30\x03\xf8\ \xac\x0f\xd9\xc1\xaf\x2f\xd7\x9c\xbb\x8f\xef\x79\xdb\x3b\xeb\x9e\ \xe3\xba\x11\x54\x30\x01\x41\x82\x0f\xf0\x5e\xe0\x2b\xc4\x10\xf2\ \x32\xd4\xeb\x8b\x50\xad\x56\xa1\x52\xa9\x84\xb0\x17\x42\xc8\xfd\ \x08\x72\xc7\x51\xef\xf4\x95\x9a\x14\xf3\x40\x24\xdb\xab\xf7\x0c\ \x6f\x1e\x5d\xf3\xd3\x7e\xc5\xee\x4f\xcb\xc1\x78\x0c\xc3\xd1\x48\ \x1b\x84\xa8\xb5\x5a\x4d\x38\x3f\xbf\x80\x93\x93\x13\x18\xf4\xfb\ \xe6\xf1\x98\x21\xa7\x83\x4f\x09\xe3\x4b\x44\x26\xbc\xda\xa0\xe1\ \xfd\x47\x77\xfc\x3b\xf7\x6e\x7a\x6f\x5e\xef\x0e\x5f\x3c\x7d\x39\ \xec\xb6\xba\xc1\xf4\xe0\x5b\x80\x9d\x17\xf8\xf6\x88\x96\x3b\x25\ \x0f\xf3\x07\x3f\x39\xd2\xb4\x73\x9e\xdd\x00\x80\x02\xc5\x68\x93\ \xb1\xf7\x07\x8a\x4f\x1f\xe7\x0b\x3e\x7f\x4d\x07\x5f\xde\x6e\x66\ \xf0\x33\x96\xed\xe2\xfa\xce\x9a\xfb\xf0\xf1\x3d\x7f\x65\x6d\xd9\ \x35\x5c\x31\xeb\xcd\x07\x7c\x0d\xf7\xea\xca\x0a\x2c\x2d\x2d\x85\ \xc0\xd7\xa0\x5c\x2e\x85\x90\x3b\x7c\xb9\x0c\xdd\x15\x98\xa1\x7e\ \x10\x4c\xfa\x27\x3a\x4a\xe6\xf2\x79\xfe\xe2\x94\x1e\x05\x7c\x2d\ \x11\xff\xa2\x0e\x42\x10\x04\xac\x7f\x19\x35\xf8\x61\xcb\xfb\x3e\ \xd4\x6a\x35\x00\xd8\x88\x8c\x52\x40\x41\x14\x31\x74\xda\x6d\x38\ \x3b\x3f\x8b\x0c\xc2\xc9\xf1\x89\x8e\x1e\x66\x03\xdf\x98\x33\xb3\ \xdf\x71\x15\x5e\xbf\xb9\x13\x66\x12\xb6\xbc\xe3\xfd\xe3\xd1\xd3\ \xef\x9f\x0d\x1a\x17\xad\xb1\x04\xdf\xb8\x78\xee\xe0\xb3\x38\x1d\ \xf8\x92\x07\x29\x2b\x36\x92\x72\x1c\xac\x51\x2f\x0a\x79\xfe\xe0\ \xdb\x0d\x80\x71\x20\x21\x0f\x76\x24\xf8\x6a\xd2\x6f\xaf\xde\xfb\ \x75\xc1\x9f\xbd\x88\x07\xd7\x36\x57\xdc\x47\xff\xf9\xc8\x5f\x59\ \xa9\x9b\xe0\x27\xbe\x4f\x20\x4a\x05\x5f\x1e\x04\x15\x43\xe0\x37\ \x37\xb7\x60\x79\x79\x19\x6a\xd5\x2a\xe4\xf3\x79\x4b\x88\xcb\x20\ \xa3\x48\x1b\x31\xc8\x80\x09\x45\x3c\x40\x31\xec\x46\x64\x10\x81\ \x6f\xf6\xf3\xf6\x84\x82\x20\xea\x44\x44\xee\x17\x69\x29\xfe\x3f\ \x03\x02\x50\xa8\xa2\xad\x86\x6e\xf5\x7a\x1d\x6e\xdf\xbe\x1d\x19\ \x8e\x6e\xb7\x17\x19\x84\xc3\xc3\x43\x38\xd8\xdf\x87\xfe\x60\x20\ \x6a\x11\xa6\x03\x5f\x7e\x80\x87\x02\x84\xd5\xcd\x55\x77\x2d\x6c\ \x07\x7b\x87\xa3\xa7\xdf\x3d\xeb\x37\x1b\xed\x60\x2e\xe0\xdb\xab\ \xf7\x2c\xc0\xe1\xcc\xe0\x27\x79\x7d\x32\xd0\x7f\x2f\xf0\xe7\x1c\ \x01\x18\xe0\x8b\x13\x47\x8a\x69\x43\x31\xbb\x38\x4f\xf0\x01\x26\ \x11\xc8\xfc\xc0\xc7\xe9\xc1\x5f\x5e\x5f\x72\x9e\xfc\xc7\xa3\xfc\ \xea\xfa\xb2\x0b\xe6\x81\x97\xfd\x80\x4f\xae\x3e\xa1\xc3\x0b\x79\ \x6d\x15\xd6\x37\xd6\x61\x65\x79\x45\xef\xe1\x8d\x4f\x8b\xc1\x4b\ \xa8\x6d\x11\xc3\x04\x4c\x24\x50\x91\xcc\xf3\x61\xd9\x04\x1a\xe0\ \xb3\x7c\x19\x25\x28\x85\x06\xf8\x2c\x83\x51\x1d\x28\xbd\x36\x91\ \x61\xdc\x91\x8d\x00\x6f\x15\xd0\x84\x4a\x41\xa9\x5c\x0a\x9f\xa9\ \x08\xdb\x5b\xdb\x51\x94\xd0\x6c\x34\x22\x63\xf0\x76\x77\x17\x1a\ \x17\x17\x59\xc1\xe7\x7e\x04\x53\x7f\x7d\x73\xcd\x5d\xdb\xd0\x86\ \xe0\x60\xf8\xe3\x77\xcf\x07\xad\x66\x27\x10\x29\xbd\xcc\xe0\x33\ \x4c\xd9\xc1\x4f\xaf\xde\xe3\x70\x3f\x19\x7c\x98\x33\xf8\x62\x44\ \xdf\xdf\x00\x80\x93\x04\x9b\x02\x40\xc3\xb3\x18\x6f\xc9\x7e\xb2\ \x8f\xac\x6e\xcf\xe5\xb3\x7e\xb6\x93\x7d\xc4\x0c\x1f\xc1\x35\xed\ \xfe\x0e\xb1\xb4\x50\xc0\x7f\xff\xaf\x27\xf9\x9d\x1b\xdb\x5e\xd2\ \x49\x77\xa6\x22\x1e\xfe\xbe\xbe\xb8\x08\xd7\xae\x5d\x8b\xe0\x2f\ \x16\x8a\xb2\x7a\x8f\x81\xd2\x92\x31\x26\x13\x28\xf8\xaf\x59\xbd\ \xc7\x20\xdb\xc0\x37\xb7\x0a\xec\xf1\x45\x7a\x4f\x82\xcf\x7f\x65\ \x1a\x72\xd2\xab\x26\x3a\xe6\xc2\x44\x88\xef\x31\x01\x96\xa3\x88\ \xc9\xf9\x45\xb5\x56\x83\xc5\xf0\xd9\xef\xde\xbd\x0b\x9d\x6e\x07\ \x8e\x0e\x8f\xe0\xd5\xab\x57\x70\x7e\x7e\xae\x2f\x4e\x07\x1f\xd0\ \x0e\x96\x42\x58\xdb\x5c\xcf\xe9\x76\xb0\xbb\x3f\xfc\xf6\xcb\x1f\ \xfa\xfa\x97\x97\x10\x71\x1e\xe0\x5b\x1c\x8e\x0d\x7c\x09\xe6\xcf\ \x08\xbe\x35\xba\x64\x99\xe6\xb9\x05\x88\xfe\x98\x0f\x2a\x3d\x8e\ \x79\x16\x90\x9e\xcb\xc7\xab\x8b\x78\x7e\x65\xf0\x01\x3d\x3f\x07\ \x0f\xff\xfd\x41\xfe\xee\x83\xdb\x9e\xa3\x14\xbe\x2f\xf8\x0b\xd5\ \x2a\xdc\xbe\x75\x0b\x56\x57\x57\xc1\xcf\xfb\x9c\x3b\x8f\xf6\xd8\ \x1c\x5d\x29\xc6\x4b\x37\x60\x23\x10\x1f\xa8\x45\x12\xe9\xfe\x20\ \x61\xcf\xcf\x20\x2b\x59\xda\xcb\xfd\xec\x65\x65\xbf\x42\x43\xdf\ \xa8\xf7\x97\x20\x30\xf8\xa9\x1e\x3f\x08\x88\xe7\x85\xc1\x57\xca\ \x88\x52\x10\x14\xcb\x01\x10\x28\xa5\x22\xc3\x77\xfd\xfa\x75\xb8\ \x11\xb6\x56\xab\x05\x7b\xfb\x7b\xf0\xf2\xc5\x0b\xe8\x74\x3a\x02\ \x7c\x8b\x47\x35\x22\x29\xd3\xa3\xac\x6f\x6d\x84\x25\xd5\x2b\xee\ \xb3\x1f\x9e\xf5\x5f\x3d\x7f\x3b\xa4\x20\xb0\x83\x6f\x5f\x07\xbf\ \x35\xf0\x59\xc8\x00\x3e\x43\x35\x27\x03\x20\x06\xd0\xc8\x0d\xd3\ \xaf\x0f\x3e\x7f\x3f\x1f\xf0\xb5\xce\xcd\xfb\xd7\x73\xff\xf6\x9f\ \x8f\xf3\xf9\xbc\xaf\x32\x81\x2f\xde\xa7\xeb\xba\xb0\xb5\xbd\x1d\ \x2d\xf2\x85\x85\x85\x68\xfc\xcc\x3c\x3a\x30\x78\x06\xf8\x31\x6a\ \x06\xc8\x86\xc7\x37\x6a\xf0\x03\x30\x2c\x32\x43\x18\x70\x24\x40\ \x5a\xc7\x88\x10\xf8\xfe\xc6\x29\x3f\x4e\xf4\x31\x06\x15\x29\x31\ \xbd\x27\x8c\x83\x59\x72\x8d\xf2\xcc\x21\x06\x56\xc3\x6b\x1a\x1e\ \x47\xe9\xd4\x9e\x96\xf9\xff\xe5\x03\x46\x85\x50\xa9\x94\xa1\x5c\ \xbe\x13\x1a\xc8\xdb\x70\x76\x76\x0a\x2f\x42\x43\xb0\xb7\xb7\x67\ \xce\xae\x1d\x7c\x49\x07\x91\x4e\x77\xe2\xbd\x47\xf7\xf2\xdb\xd7\ \xb6\xbd\xef\xbe\xfa\xbe\x7f\x7c\x78\x3a\x9a\x5b\x2e\x5f\xba\x3c\ \x9c\x2b\xf8\x57\xa7\xf4\x10\x2d\xe0\xf3\xd6\x96\xe4\xe5\x73\x32\ \x00\x8a\x69\x37\x3f\x7b\x4f\x80\xcf\xfd\x64\x07\xff\xd7\x2f\xe2\ \x49\xad\xde\x2b\x57\xcb\xea\x7f\xff\xf4\x5f\x85\x55\x3e\xd9\x9f\ \x15\x7c\xbd\x97\xbf\x13\x86\xb9\x9b\x1b\x1b\x3a\x3d\xc7\xb0\x00\ \xd7\xa3\x33\xf8\x88\x5a\x32\x3c\x3e\xc3\x18\xc3\x2e\x7e\xaf\x80\ \xf7\xe9\x09\xb0\x19\xc6\x41\x43\x65\x78\x79\x36\x2f\x14\x44\xba\ \x30\x82\xd8\xf8\x70\xc4\x30\xa6\x31\x28\xe3\xa6\x5a\xd6\xfd\x91\ \x43\x67\x1d\x5b\xd1\x52\x40\x24\x6b\xf4\x85\x11\xc3\x77\xe7\x15\ \xea\x32\x62\xe1\xfb\x2b\xfe\xa8\x79\xa5\xdf\x6f\xd8\x58\x47\x81\ \xce\x78\xe8\x43\xd0\x28\xcd\xf8\xfa\xf5\x6b\x78\xfa\xec\x29\x8c\ \x86\x23\x01\x7e\x82\x37\xe4\x67\x32\x80\xd5\x67\x10\xea\xbf\xff\ \xf0\x9f\x85\xfd\xdd\x83\xe1\xf7\x5f\xfd\x30\x18\x0c\x86\xc1\x7b\ \x17\xf1\xcc\x0e\xbe\xbc\xf6\xe7\x05\x9f\x05\x9c\x9f\x01\x00\xc0\ \xc4\xcf\xde\x93\x9f\x64\x23\x90\xfb\x1d\x54\xef\xa1\x83\x10\x96\ \xa1\x7a\x4f\xfe\xe3\x61\xde\xc9\xb9\x28\xc1\x9f\xb6\x7a\x4f\xef\ \x6f\x6f\xdf\xb9\x0d\xeb\x6b\xeb\x0c\x38\xf1\xb8\xc4\xb9\x7c\xe6\ \x25\x36\x02\x46\xf5\x1e\x7b\x70\xa3\x9f\xd8\xb3\x83\x09\xfe\x44\ \x60\x6f\x3a\x0e\x5b\x5c\xc4\x13\xd0\x25\x50\x40\x14\xc9\xf4\x4f\ \xe6\xce\xc3\x3b\x8a\x1c\x5b\xe3\x57\xaa\x6e\x27\x3c\xe4\xc1\x26\ \x83\xb3\x3d\x38\x92\xd9\x09\x2f\xfc\xfb\x9b\x19\x1e\x19\x36\xa7\ \x09\x64\xb0\x07\xbb\xf4\x74\x4b\xfd\x9d\xfa\xb8\x56\x97\xed\x99\ \x22\x9c\x3d\xbd\xe7\x4e\x9f\x2a\x77\x77\xa1\x9f\x6e\xfa\x24\x91\ \x54\xb7\xee\xf7\x27\x18\x01\x3e\x6c\xfb\x6f\xe7\x8b\x34\x21\x69\ \xeb\xd1\x79\x05\xd4\xc7\x57\x51\x5d\x57\x78\xdf\x24\x41\xa6\x89\ \xae\xd6\x11\x70\xf7\x22\xd9\xe9\xbb\x74\xbc\xda\x29\xb5\x40\x64\ \x32\x34\x3c\x24\x33\x33\x33\x32\x31\x31\x51\xa5\x07\xf7\xef\x3f\ \xd0\x54\x81\xc7\x07\x17\x37\x09\x58\x5b\xb6\x14\x39\x1e\x6b\x03\ \x47\x3f\x3f\xda\x79\x78\xe7\xe1\x4f\x7f\xfb\xeb\xdf\x7f\xfa\x18\ \x22\x9e\xbc\x7a\xaf\x2d\xf0\xf9\x4a\xd6\x0b\xb4\x5b\x03\xe8\xb3\ \x3c\x35\x48\x12\x04\xaa\xc5\x85\x87\x4f\x5e\xbd\x57\xd9\x87\x8e\ \x1c\xf2\x57\x7e\xb5\x3a\xa2\x9b\x6d\x90\x88\xc7\x80\xdf\xac\xde\ \xfb\x3c\xf6\xea\x67\xe7\x66\x63\xeb\xee\x60\x06\x7c\xe8\xcc\x7b\ \x78\xf0\x86\x1c\xdb\x3c\x38\x0a\x7a\x75\xa8\xcf\xe0\xab\x08\x47\ \x41\x57\x35\x9e\x8a\x72\xb6\xca\x2d\x82\x97\xf2\x7a\x96\x66\x89\ \x43\xba\x01\xf0\x95\xb0\x9e\x97\x0f\xd8\x51\x38\xd9\xf0\xdf\x48\ \x3b\x4a\xb5\x83\x94\x9b\xa5\x08\x79\x73\x0c\x7e\x9d\x18\x7c\xa5\ \x0f\x48\x13\x43\xa7\x28\xaa\x6b\xac\x64\xb8\xf0\x1e\x5f\x0e\xe0\ \xa3\xd8\xc7\x95\x7d\x30\x24\x1d\xdf\xa9\x26\x01\xfd\x5b\x9d\x6e\ \x57\x4e\x9d\x3a\x5d\xa5\x52\xff\xf9\xf7\xbf\xe5\xce\x9d\xbb\xf2\ \xe2\xc5\x8b\xfa\x5e\x8e\xc4\xe8\x79\x5a\x07\x30\x30\xd0\x71\x73\ \x8b\xb3\x83\xc7\x62\xc7\xe0\xf6\xcd\xdb\x51\xd4\xb8\x51\x7e\xca\ \xea\xbd\x86\x0e\x52\x1a\xef\xcd\xe0\xb3\xdd\x52\x04\x50\xd0\xb7\ \xf3\x0e\x8e\x1b\x71\x23\x6c\xeb\xf1\x3f\x49\xf5\x1e\x22\x96\xb9\ \xa8\xe0\xbb\xb0\xf6\xc5\x90\x73\xce\xf5\x55\xef\x85\xfe\x22\x1e\ \xed\x79\xcf\xcd\xcf\xc5\xaa\xfe\xe1\x1d\x3c\xbe\x33\xc2\x1d\x1e\ \xb4\x81\x3d\x3e\xe5\xf8\x41\x62\xcc\xaa\xc0\x2b\xf8\x15\xf4\xf8\ \x6e\x08\xcb\x61\x03\x5e\xe7\xf0\x9d\x49\x1b\x40\xcf\xd1\xa6\x16\ \x48\x3d\x5c\x8d\xbe\x08\x26\x71\x8f\xfb\x3d\xfd\x2e\x4a\x3d\x42\ \x88\xdf\xe9\x6d\xe5\xe1\xdd\x66\x5d\x23\x2a\x7c\x92\x1b\xeb\xab\ \x0b\x65\x24\x60\x4f\xa2\x01\x0b\xfe\xf6\x76\xa0\x4b\xd1\x47\x08\ \x75\x5d\x43\xa3\xa0\xb1\xb1\xf1\xf8\x1a\x93\x7f\xa7\x89\xa0\x52\ \x22\x5a\xf0\xf5\xc5\x03\xdf\x76\x3e\x8e\x7c\x7e\xa8\xb8\xf6\xf5\ \x95\x91\x7b\xb1\x36\xf0\xcf\x98\x1a\x7c\xd2\xea\xbd\x3c\xf8\xb8\ \xb8\x75\xf0\x9b\x23\x00\xb8\x2f\x2b\xe4\xa0\xa1\xe3\x2b\xcb\xeb\ \xc5\x9f\xa4\x7a\x0f\xf6\xc8\xe8\x90\xbb\xf2\xab\xcb\x23\xaa\xe2\ \x4b\x6f\xed\x4d\xbd\xa7\x32\xdc\xf9\x85\x79\x39\x7a\xe4\xa8\x39\ \x6f\xaa\x59\xaf\xcf\xe0\xe7\x16\xea\xbc\x7d\xbb\xa9\x50\x29\xf8\ \x0a\xbc\x9d\x1d\xeb\x9e\x3d\xfa\xf7\x54\x08\xb3\x20\xe3\x39\x22\ \xdd\xf0\xc9\x86\x23\xa6\xca\x3e\xa1\x4f\x2b\x37\x43\x40\xf4\x53\ \xe2\x5e\xfa\x37\xa6\x7b\xc3\xbb\x11\xc3\x66\xb9\x29\xa8\xf8\x6f\ \x38\xa9\x26\x81\x41\x37\xa4\x39\x83\xbe\x9f\xe9\x10\xe4\x0b\x7c\ \x78\x46\xde\xa3\x5e\x90\x8a\x87\xea\xf1\xc7\xc7\xc7\xab\xa8\xeb\ \x5f\x51\x5c\x74\xe7\xce\x1d\xad\x17\x34\x82\x6f\x21\xd3\x22\xe1\ \x42\xd4\x74\x1c\x39\x7a\xb8\xb8\x7b\xe7\xc1\x46\xac\x31\x84\x4f\ \x48\xbd\x97\x49\xa3\x19\x7c\x2a\x46\xec\xb8\x44\xba\x4d\x21\x50\ \xe1\x18\x7c\x2a\x6a\x7d\xfa\xea\x3d\xde\x7b\xef\xe4\xb9\x93\x9d\ \x4b\xd7\xd7\x46\x06\xba\x5d\xb7\x57\xf5\x9e\x6a\xee\x35\xd4\x57\ \x61\x8b\xf7\x9e\xae\xf7\x0c\x3e\x55\xe0\x43\x65\xb3\xa2\x4e\x2f\ \x40\x41\x2c\x48\x59\x01\x11\xc3\x51\x95\xcd\x6a\x58\x4f\xfa\x0a\ \x5b\xb8\xb4\x1e\x1c\xef\xe7\xd5\x7b\xb8\x1e\x83\x0b\x6d\x45\xdb\ \xd2\x13\x4a\xed\x18\xfc\x34\x95\x27\xf0\xd3\xbd\x00\x96\xd2\x0a\ \x5f\xdb\xac\x1b\x28\xa5\xbe\x7e\xab\x2a\xf2\x6d\x55\xbb\x0e\x8b\ \x73\x55\x9a\xe0\x42\x50\x0f\xdf\x58\xd9\xb7\x0a\x45\xe9\xd5\x22\ \x52\xd1\xb0\xac\xec\x13\x27\x4e\x54\x6d\x55\x6d\x1f\x3e\x78\xf0\ \x50\xa3\xa5\x46\xf0\xad\x76\x61\xfc\xd4\x78\xf7\xc0\xe1\x83\xc5\ \xad\x3f\xdc\x5e\x7f\xf6\xf4\x79\xf9\x89\xa8\xf7\x18\xe3\x86\x33\ \x2a\x9a\xce\x78\xc0\x35\xed\xd6\x00\xcc\x97\xb3\xbb\x7e\x86\x8c\ \x27\xfd\xb8\xea\xbd\xda\x4e\xf9\xef\xc2\xf2\x17\x43\x0b\x8b\x33\ \x83\x19\xf0\x1b\xd5\x7b\xde\xb9\x58\xd5\x9f\x92\xf3\xe7\x27\x24\ \x4e\x1c\xc2\xab\xfa\x04\xc5\x3b\x56\xef\x39\xb3\x05\x97\x69\x89\ \xbd\xdd\x7a\x2b\x1b\xeb\xeb\x15\xf8\x3a\x68\xbd\x77\x04\x3e\xbc\ \x39\x47\x0f\xf0\xfe\xb0\x01\x85\xa7\x7e\x39\xe7\xdd\xe6\x14\x21\ \x92\xed\x26\x30\x21\xd0\xa1\x91\x68\x06\xbc\x05\xbf\x14\x21\x0f\ \xee\xc4\x55\x76\xc8\xe6\xb0\x7c\xbd\xbe\xb8\x5b\xa1\x91\x8d\xda\ \xbe\xf4\x29\x55\x28\x7c\xba\xd1\xca\x91\xf3\x39\x7e\xaa\x3b\xf8\ \xaa\x7b\x90\x5a\x7e\x45\x27\x4a\x8f\xa7\xe4\x64\x94\x50\xdf\xbd\ \x77\x4f\xfe\xfe\xf7\xbf\x37\x83\x6f\xbe\xec\xf0\xbe\x61\xbf\x76\ \x6d\x75\xf8\xd1\xfd\xc7\x3f\xfd\xe5\xd1\x5f\xdf\x7e\x7c\xf5\x1e\ \x8b\x78\x98\xe5\xbd\x81\xdf\xbe\x14\xd8\xf5\xa9\x6a\x5a\xf0\xc3\ \xc7\x57\xef\xd9\xbd\xf7\x06\x47\x86\xe5\xea\x97\x97\xf7\x8d\xa9\ \x8c\x77\x8f\x22\x9e\x43\x87\x0f\xc9\xe2\xe2\x92\x7c\x36\x3a\xaa\ \xd7\x90\xff\xa4\x3c\x9c\xd4\x7b\x12\x42\xae\x25\xa6\x86\xbc\x59\ \x7f\x13\xc3\xfb\x0d\x89\x2a\x35\x7c\x8c\xbe\xb2\x7a\x7d\xdb\xcb\ \x27\xd9\x6e\xb4\x09\x46\xc7\xde\x5c\x1a\xce\x0d\x34\x22\x1e\x7a\ \xe6\x25\xd2\x93\x90\xae\x0c\x66\x12\xa7\x70\x9d\xc1\xe7\xc9\x8d\ \xda\x81\x1c\x81\x24\x2d\x84\x8d\x4c\xa4\x57\x7b\x28\xb7\x82\x88\ \x4e\x80\xd4\x61\xc0\x67\x19\xf0\xed\x9a\x84\xf4\x1b\x0a\x5f\xfd\ \xed\xad\xaa\x6b\x30\x2c\x2b\xcb\xcb\x51\x5c\x74\x46\xfe\xf8\xc7\ \x3f\xea\xc2\x24\x80\x9f\x49\x98\xed\x52\x77\xe7\xa6\x66\x27\x06\ \xf7\x7f\xb6\xcf\xdf\xfe\xbf\xfb\x1b\x5a\xf4\xfc\xa8\xea\x3d\xdb\ \xd2\xdb\x2b\xf8\xfc\x7b\x5b\x98\x00\xcc\xf6\x5d\x5e\x82\x43\xce\ \x88\x0b\xd8\x2e\xc5\x7d\x24\xf5\x5e\xee\x70\x8d\x43\xb1\xe8\x73\ \xe3\xab\xab\x23\x23\xa3\xc3\x7e\x2f\xe0\xab\xa7\x59\xf8\xe2\x0b\ \x39\x7d\xea\x54\x5d\xe0\x0b\xf5\xe0\xf5\x04\x1e\xab\xf7\x18\x0a\ \x80\xff\xf2\xd5\xcb\x98\xa7\xbe\xe6\xa5\xba\x7d\x17\xea\x00\x1c\ \xa3\xf6\xab\x3b\x04\x2c\xfa\x71\x9e\x6b\x16\x80\x04\x7a\xfd\x46\ \xd9\x2e\xd4\x7b\x49\x9c\xc4\x13\x57\x00\xc8\xe2\x0d\xf8\xb4\xf7\ \x1e\x22\x01\x02\x9f\xfe\x4e\x05\x95\x07\xb0\x6a\x67\x43\x7d\x6e\ \x73\x86\xb0\x55\x45\x43\x45\xd1\x89\x2f\x8f\xb0\x9f\xc1\xa7\x76\ \x3f\x4d\xf0\xde\x4b\x51\x5d\x93\x52\x03\x5d\xa5\xf8\xab\x5f\xdd\ \x90\x87\x0f\x1f\xca\xa3\x47\x8f\xf5\x9a\xbe\xe0\x5b\xf5\xde\x58\ \xdc\x9c\x35\x9e\xb1\xe0\x6f\xfe\xfe\xd6\xfa\xfa\x9b\xf5\xd0\xbe\ \x7a\xaf\x75\xf0\x1b\xd5\x8a\xae\x2d\x25\xa0\x77\x7c\x72\x2e\x8d\ \x21\xaa\xf7\x05\x54\x09\x43\x7a\xf3\x43\xab\xf7\x72\xa7\xea\x9c\ \x3a\x7b\xa2\x13\x3d\xff\x88\x2f\xbc\xdb\xcb\x16\x5c\xc7\x62\xa5\ \x79\xf1\xc2\x05\xcd\xf9\xf1\x66\x5f\x8f\xcf\x22\x1e\x56\xef\x6d\ \xbe\xdd\xaa\x64\xad\x1b\x1b\xeb\x14\xc6\xd3\xf2\x5c\x82\xc2\xce\ \x41\x9c\x90\xf3\xee\xa8\xce\x6c\xc1\xc5\x87\x40\x86\x44\x52\xad\ \xf6\x0b\x38\x6b\xbf\xb4\xb2\x5d\x52\xef\x31\xf8\x66\xe2\x4a\xb2\ \x5d\xaa\x57\x04\x33\x21\x08\xb7\x36\x2d\xf8\x0a\xa3\x7a\x7f\xaa\ \xec\x63\x82\xe4\xf0\x1e\xcf\xbd\xae\x95\xc4\x22\x68\x7c\x89\x4e\ \x04\x88\x0c\xc0\x3a\x83\x4f\xa3\xb0\x5e\x0e\x0d\x21\x94\xde\x3b\ \x3b\x3b\x2b\xc7\xa3\x10\xeb\xe6\xcd\x9b\xf2\x3c\xb6\x0d\xed\xad\ \x0c\x3e\xcf\xba\xa3\xfb\x47\x8b\x4b\xd7\x56\x47\x6e\xfe\xee\xd6\ \x9b\x78\xde\x41\xf9\x31\xd4\x7b\xd6\xd8\x09\xfc\x66\x67\xdb\x46\ \x04\x20\x5e\x4a\xc7\x47\x66\x73\xbb\x14\x21\xae\xa3\x41\xf5\x81\ \xd4\x7b\x0d\x47\x66\xcf\xc4\x16\xdf\xe2\xda\xc2\xb0\x77\x6e\xd7\ \xe0\x2b\x94\xf3\x73\x73\xaa\x51\xa7\xbf\xab\x03\xba\xbf\x7a\xcf\ \x2e\xce\x51\x2f\xf6\x2a\x86\x9f\xd1\x85\xa4\xeb\xad\x16\xdf\x7b\ \x96\xed\xf2\xd8\x63\xf5\xde\xbb\x0a\x3c\xde\x9c\xa3\x67\x33\xf8\ \xec\xf1\xa5\xac\xef\x95\x52\x38\x6d\x31\xbf\xb7\x59\xc4\xe3\x1d\ \x7d\x4f\x2e\x2a\xd6\x37\x9b\x15\x86\x0e\xd7\x43\xf2\x9c\xde\x23\ \xf0\xd1\x55\x10\x21\xa1\x43\xa0\x5d\x72\x49\xd0\x93\x04\x4e\x29\ \xd4\xaf\x84\x48\xce\x59\xf0\xed\xc9\xd6\xbd\x5d\x8f\x3c\x0a\x85\ \x51\x62\xbc\x5f\xae\x5e\xbb\x16\x23\x81\x47\xf2\xe8\xe1\x23\x9b\ \x26\x99\x70\xab\x1e\x5b\xba\xa3\xd3\xda\x95\x95\xe1\xdb\x37\xef\ \x6c\xfc\xfb\x5f\xdf\x6d\x7e\x68\xf5\x9e\xec\x54\xd9\x77\x4d\x36\ \x70\x6a\xb3\x0d\xe8\xb2\x67\xe5\xa7\x20\x38\x38\xb0\x4b\xf9\x63\ \x68\x57\xbd\xb7\x07\xf0\x55\x73\xbe\x72\x79\x71\x78\x6a\x66\x62\ \x60\x2f\x7b\xef\xa9\x88\x67\x79\x79\x59\xe5\xa3\xf8\x98\x1e\xf8\ \x65\x93\x7a\x8f\x4e\xc8\xa9\xc1\xa7\x6f\x6f\x65\xbb\xa4\xf6\x23\ \xb8\x1c\xc0\x4f\x5e\x9b\xe1\xa5\xbd\xf7\x92\x37\x07\x58\x0d\xe7\ \xe0\x49\xb0\xe1\x3e\xd7\x28\x24\xeb\xf1\xf9\x99\x42\x95\x98\x7e\ \x23\x43\x2d\x59\xaf\x6d\xfb\xd1\xa8\x3c\xfa\xa2\xa0\xae\x02\xa9\ \x7f\x2a\xdb\x2a\xf6\x3c\xd9\x8e\xd3\xad\x6a\x32\xf0\xbe\xe8\x4d\ \x04\x16\xfc\xfc\x2a\x55\x5f\xa4\xdf\x10\xef\xd2\xd5\x87\x95\xc4\ \xf8\x66\xac\x0d\xac\x6f\x6c\x10\xf8\xc2\xe0\x73\x7e\x52\x55\x92\ \x16\x16\xe7\x87\xf6\x8d\x8e\xfe\xf4\xf8\xe1\x9f\x7e\x7a\x6f\xea\ \x3d\xe6\xbd\x6d\xf0\x9d\x6b\xad\x06\xe0\x12\xf0\x99\xaa\x24\x60\ \xf9\x70\xea\x3d\x06\x9f\xaf\xd7\x01\xe2\x6e\x7c\x7d\x65\x78\xfc\ \xf4\x78\x37\x0f\x7e\xde\xeb\xe9\x22\x14\xad\xf2\x17\xde\x63\x6c\ \x9a\x96\x9e\xfd\x13\x75\x2e\xbf\xb5\x55\xaa\x44\x55\xc1\x67\x49\ \xaa\x95\xed\x72\x48\x4f\x50\xf3\x9e\x0a\x41\x6d\x80\xcf\xea\xbd\ \x8c\x62\x0f\x8c\xa0\x5a\x6c\x40\xb6\x7a\x7d\x7d\xcb\x14\xfb\x90\ \xe0\xa2\x46\x20\xa8\xef\x24\x00\x4c\xf7\x82\xf8\xcd\xd7\x08\x4c\ \x61\xd1\x61\x75\x62\x4e\xb6\x9b\xe2\x2a\xef\x8c\x1a\xb2\x9a\x70\ \xa0\x27\x50\x9b\x44\x51\xae\x17\x11\x68\x8d\x40\x27\x02\x2f\x8c\ \x8c\x6d\x61\x02\x34\xbd\x36\xf8\x20\x5b\x9b\x9b\x95\x68\xeb\xfa\ \x8d\x1b\x72\xeb\xdb\x6f\xe5\x3f\xdf\xfd\xa7\x2f\xf8\x0c\xa2\x3e\ \xe8\x73\x13\x67\x06\xba\x9d\xc2\xdd\xbf\xf7\x68\xe3\x43\xab\xf7\ \x9a\x61\xe7\xb1\x6c\xc1\xff\xe5\x52\x20\x4f\x36\x40\xad\xcf\xfd\ \x72\x0c\x85\xb7\xbb\xc9\xd2\xba\x61\xdc\x4c\x50\x60\x98\xf2\x25\ \xfc\xff\x0e\x3f\xc0\xd1\xad\xfa\x27\xeb\xf3\xdf\x93\x5d\x5f\x1f\ \x5c\x55\x6d\x76\x5f\xfe\xf7\xf5\x91\xb1\x53\x63\x5d\xee\xe5\x0b\ \x81\xa8\xf7\xb1\x50\x46\x5b\x48\x4b\xcb\x4b\x31\x5f\x9c\x51\x05\ \x1b\x7d\x93\xed\xa7\xde\x38\xee\xe5\xa7\xef\x10\xc1\x7f\x25\xdf\ \x7f\xff\x5d\xcc\xf5\x5f\x25\xfd\x3d\xbc\x12\xfe\x9f\x40\x4e\xb0\ \x1b\xf0\xf1\x1b\x19\x5e\x8e\x34\x7a\xc5\x36\x80\x1f\x02\xb5\xb5\ \x42\xba\xce\x16\xf8\xf0\x5f\x41\x24\xbb\xa6\x1f\x57\x40\x15\x84\ \x34\x46\x42\xcf\xd3\x83\x24\x02\x5f\x0d\xce\xf3\x45\xe8\x5e\xd3\ \x85\x48\x3f\x37\x28\xa4\x66\x71\x0e\xa7\x0a\xa9\x46\x40\x7a\x05\ \x80\x9f\x5b\xca\x4c\x60\xa6\x53\x8c\x55\x30\x95\x26\x09\x9a\x70\ \xfa\x69\x3a\x54\xb2\xac\xb5\x88\x4a\x0e\xdc\x95\x95\xd5\x55\x99\ \x9d\x99\xc5\x38\xc3\x73\x20\xe9\xb4\x6d\x81\x68\x2d\xe9\x64\x37\ \xaa\x46\x07\xd1\xa6\x05\xd4\xb0\x19\x00\xd8\xbc\x73\x56\x72\x44\ \x16\x03\x92\xd7\x93\x4d\x4c\xe0\xb9\x1b\xdb\x8c\x65\xc7\xf0\xe3\ \x7d\x76\xc2\x2d\x4c\x00\xc9\x53\xd0\xef\xe3\x0f\xf3\xf5\x01\x9a\ \xbb\x02\x5f\x76\x0d\xbe\xd4\xe0\xcb\x76\xf0\x69\xd6\xeb\x76\x23\ \xfc\xff\x7b\x7d\xe4\xd8\xf1\xa3\x1d\x3c\xac\x26\xf0\xf5\xbf\x46\ \xf6\x8d\xc8\x8d\x1b\xd7\xab\xfe\x31\xc0\x32\xe0\x27\x78\x29\x74\ \x87\x97\xd2\x36\xde\x77\xd1\x8b\x3c\x7f\xfe\x4c\x23\x00\x06\xbf\ \x86\x2f\x84\x1e\xbc\x00\x36\xbc\x0b\xb2\x63\x90\x7b\xd7\x33\xf8\ \xdc\xcb\x0f\x19\x78\xc9\x76\x06\xfc\x04\xb5\xf5\x06\x24\xfa\x09\ \x01\x77\x33\xf8\x80\x1a\xb2\xdd\x3a\xaa\xa3\x75\xf9\x76\xf0\x86\ \xc0\xe0\x33\x07\x3e\x07\x3e\x9d\x46\x8c\xcf\x75\xf8\xfd\x5c\x53\ \x80\x47\xae\x9f\x83\xd9\x72\x74\x73\x4b\x55\x93\x5b\xe9\x79\x66\ \x27\x3a\x61\x10\xab\x49\x40\x27\x79\xb5\xcf\x9d\x3f\x2f\x17\xd7\ \x2e\x56\xa2\x24\x0b\x7e\x60\x75\x1b\xc1\x17\x77\x1e\xea\x2e\x2c\ \xce\x0e\x15\xbe\x9e\x04\x9c\xf1\x7c\x34\x36\x0d\xf8\xc1\x39\xd7\ \x32\xf8\xfa\x32\x11\xb7\x75\x56\xed\xb5\x01\xcd\x21\x18\xde\xe4\ \xb5\x74\x21\x92\xd8\x56\xd5\x7b\xe2\xa8\x1f\x6b\xfa\xaa\x83\xc3\ \x03\xee\xeb\xff\xb9\xb1\xef\xe0\xe1\x43\xc5\x6e\x37\xdd\xd4\x8d\ \x36\x97\x96\x96\xab\x2a\xb5\x04\xac\x40\x23\xcf\x63\xd4\x7b\xfa\ \x3f\x4c\x02\xcf\x5f\x3c\x91\xf5\x37\x6f\x38\xc4\x65\xf0\x91\xdf\ \x5a\xd9\x2e\xa7\x07\x28\x84\xf1\xc0\x26\x28\xf2\xd2\x5b\x9c\x66\ \x6b\xd5\x7b\x4d\xb2\x5d\xda\x9c\x03\xe0\x5b\xe9\xad\xd9\x66\x8c\ \x17\xea\xf0\xbd\x99\x7a\x01\x45\xce\xb9\xdf\xe8\xbd\x55\x2b\xda\ \x5e\x3e\x49\xa1\x79\x02\xe1\x67\x42\xe5\x00\xfa\xbd\xd8\x3c\x25\ \xad\x76\xdc\x2c\xc5\x27\x71\x50\x0d\x46\x6e\x23\x93\x90\x8a\xa3\ \x85\xeb\xa8\xe2\xb2\xaa\x09\x5c\xbb\x76\x5d\x7e\xff\xbb\xdf\xc9\ \xab\x18\xc1\xd5\x73\xa4\x33\xc5\xbe\x3a\x75\xfb\x3c\xea\x48\x8a\ \xc2\x0f\xdd\xfe\xf6\xee\x46\xd4\x1e\x84\xf6\xd5\x7b\x4d\x7d\x7d\ \x72\x33\x06\xfc\x66\xbb\x8d\x14\x00\x82\x88\xed\xb3\x8c\xeb\xef\ \xf1\x85\x73\xf0\xbd\x78\x7c\x07\x8f\x0f\xf8\x79\x09\x31\x87\x10\ \xdd\xc1\xae\xfb\xe6\x7f\xbf\xdc\x77\xf0\x08\xc1\x6f\x2a\xba\xc1\ \x14\x57\xce\x9d\x3d\x27\xab\xab\x6b\x0a\x7f\xb6\x7e\xc1\x21\x2e\ \xc0\x87\x88\x47\xbd\xfe\xeb\x57\xaf\xeb\x81\xcd\xfd\x34\xc7\x1f\ \xcf\xbb\xf5\x66\x40\x00\x8c\xd4\xd4\x0e\x81\xa4\xb4\x19\xaf\x97\ \xd6\xf4\x07\xae\xae\x73\x48\xc6\xf7\x02\x7c\x4c\x2c\x6a\xb3\xc7\ \x47\x5a\x82\xdf\xc8\x5e\x1e\x36\xdf\x6b\x56\xd7\x01\x2c\x2e\xa0\ \xc3\xc6\xe4\x86\xf6\x5d\xe8\xdd\x6b\x7e\x23\xc3\x2e\x6c\x27\x83\ \x3f\x05\x50\x52\xe8\x61\x3d\x7e\xbd\x42\x12\x9f\x85\x54\x85\xa3\ \x1d\x57\xb7\x52\xbd\x2f\x52\x14\x38\x32\x2c\x57\xae\x5e\x91\x23\ \x87\x8f\x10\x98\xf4\x7c\x11\x9e\x91\xc7\x3f\x72\xec\x48\x27\xee\ \x14\x35\xe8\x9d\x67\x8f\x8c\xb1\xcc\x5f\xd3\x59\x2f\x9f\x6c\xc3\ \x81\xf1\xf2\x64\x13\x73\xe4\xf1\xad\x97\xb7\xb6\x59\x54\xd5\x4e\ \x0a\xc0\x45\x2d\x1b\xea\xe7\x0b\x7c\x56\x20\x41\xd7\xd0\x64\x81\ \xb7\x09\x7c\x01\xf8\x16\x64\xce\x1d\xd2\x22\x13\xf7\xd5\xff\xdc\ \x18\x39\x70\xf8\x40\x61\xc1\xe7\x2d\xaf\x71\xbf\x57\x29\xf0\xfc\ \x82\xcc\xcd\xcd\xf5\xd6\xb2\x23\xd4\x2e\x69\xc0\xa4\xeb\x6d\x78\ \xac\xa1\xfe\x93\x1f\x9f\x54\x21\x27\x40\x66\xf0\x03\x06\x8a\x34\ \xe4\xb0\x18\x1e\x9c\x6f\x12\xbc\x6a\x53\x9e\x9e\x40\x36\xe0\xb3\ \x6c\x39\x50\x67\xc2\x44\xad\x80\x97\x27\xb1\x26\xf0\xd3\x67\x11\ \xc5\xb0\xed\x02\x26\x0b\x3e\x7b\x76\xb6\x39\x7d\xa2\xdd\x8f\x2c\ \xf8\x66\xa2\x7b\xd7\x16\x7a\x3e\x98\x27\xa9\x02\x91\xb3\xb4\xd8\ \x97\x24\xc2\xce\x2e\x2c\xe0\x30\x09\x29\x41\x21\x0a\xb1\x3a\x82\ \x95\xd5\x15\x5d\xdf\xd1\x1f\x7c\x06\x40\x74\x45\x61\x9c\x04\x16\ \xe7\x86\x3c\xc6\x1c\x8a\xb1\xc4\xf2\x9e\xc1\x07\xec\x06\x7c\x69\ \x00\x5f\xd8\x06\xf8\x3c\xe9\xb4\xa7\x04\xec\x81\x6f\xa6\x07\x7b\ \x72\x6e\x28\x01\x75\xf8\xc5\x22\x1e\xf6\xe0\x76\x47\xe2\x4e\xb7\ \x70\x5f\x46\xf8\x8f\xd0\xd6\xdc\xec\x11\x1c\x81\x0f\xd0\x56\x63\ \xf1\x67\xec\xd8\x31\xd6\xeb\x27\xc0\x09\x1c\x2b\xf3\x55\x51\xca\ \x93\x27\x4f\x63\xd1\xe9\x2d\x5a\x77\x56\xbd\xc7\xcb\x79\x21\x48\ \xe1\x4d\x3a\x93\x0d\xa0\x8c\x17\x4d\x62\x1d\x6f\xd5\x7b\x18\x34\ \x06\x7c\x23\xe2\xa9\x0c\x54\xe3\xc5\xee\xbd\xc7\x0b\x75\x58\xa3\ \xcf\xb2\xdd\x5a\xdf\xdf\x9b\x04\xbc\xf7\x39\xd9\x2e\x80\xb4\xea\ \x3d\x84\xfd\xb0\x79\xd1\x0e\xc0\xb7\x51\x96\x29\x4d\x1a\xa4\x9d\ \xdb\x51\xb6\x1b\xcc\x64\x25\x42\xb6\x73\x55\x78\x1f\x42\x25\x06\ \x02\xc8\x74\x0d\xaa\xa8\xf5\x92\x63\xd9\x4a\xe3\x59\x57\x77\xea\ \xb6\xe6\xaa\x19\x68\x52\xef\x61\x02\xd5\xa3\xdc\x67\x36\xa7\x86\ \xee\xdd\x7e\xb0\xde\xbe\x7a\xaf\xb9\xb2\x0f\xbb\xb9\x8b\x10\xda\ \x2b\x02\x7a\xf3\x81\x90\x04\x39\x16\xfe\x70\xf1\x5f\xbc\xbe\xc8\ \x31\xdb\xf4\x60\x77\x95\x7d\xdc\xcf\x20\x17\x5d\x2f\x37\xbe\xb9\ \x3a\x7c\xf4\x58\xda\xb6\xcb\xca\x42\x6c\xa1\x45\x07\xf5\x95\xcb\ \x97\x23\xfc\x63\xe9\x1a\x12\xf1\x08\x01\x10\x7a\xd5\x70\x78\xf3\ \x57\x51\xbe\x1b\x8f\xaf\xae\x26\x01\x78\x34\x84\x9f\xd6\xe3\xa3\ \x38\x18\x02\x55\xed\xcb\x40\xea\x3d\x0a\xf5\x25\xd8\x2a\xbf\xed\ \x0a\x70\xa8\xcf\xe0\xf3\xf7\xcf\x56\xe3\xc9\x46\x45\x9d\xd2\x81\ \xc0\xde\x06\xd7\x73\x35\x9e\x6d\x2e\x6c\x35\x56\xf2\x25\xd9\x80\ \x9f\xa5\xbf\x1c\xf9\xf1\x35\x6a\x63\x80\xc2\x36\x60\xe0\x5d\x4e\ \x93\x28\x35\x03\xf0\x54\xb1\x0d\x65\x89\x49\x24\x2d\x4b\x7e\xfb\ \x96\x3a\x7b\xc1\x0c\x12\x3c\xd0\x34\x09\x60\xc3\x92\x89\xc9\x89\ \xaa\x23\xe4\xb8\xda\x6d\x45\x43\xe4\x5d\xc7\x4f\x8d\x75\xa6\xe7\ \x27\x06\xa9\x5e\xd7\xe4\xf1\x73\x6d\x80\x8c\xcd\x95\x7d\x2e\xfc\ \x59\x9b\x0b\x88\x6c\x43\x3a\xde\x66\x0d\x00\x9f\x6a\x41\x0e\xd1\ \x66\xf0\xeb\xf5\xe5\xce\x39\x7d\xe1\xdd\x5f\x06\x3e\x83\x70\xe9\ \xea\xc5\xe1\x63\xb1\x22\xeb\x5c\x1e\x7c\xde\x44\x53\xab\xbc\x57\ \xaf\x5c\x91\xc3\x47\x8e\x10\x38\xa1\x07\x3e\x7a\xde\x69\xc0\xf2\ \xc0\xfc\xe1\x87\x1f\x63\xd8\xff\x5c\x9c\xa9\x2b\xb0\x49\x36\x3c\ \x0c\xbe\x73\x23\xf8\xc9\x66\xf0\xf9\x44\x9e\x12\x22\x1e\xf2\x8d\ \xdb\x73\xc4\xdc\x44\x07\xf0\x59\xb2\xcc\xa1\x3e\xc6\x3c\xc3\xe8\ \xcc\x32\x65\x23\xdb\x4d\x8c\x00\x45\x6a\x07\xb2\x4e\x5f\x08\x7c\ \x40\x4d\xd9\xb0\xa5\xae\x57\x23\x10\xb2\x4d\xb8\xcb\xbc\x5b\x60\ \xad\xf7\xcb\x87\xfa\xb8\x57\x5b\x86\x78\xa6\x16\x7c\x12\x37\xa4\ \xe2\x60\xa7\x93\xca\x48\x67\xce\x9e\xd5\x35\x20\x7d\xc1\xb7\x6d\ \xc2\xe3\xa7\x8e\x77\xe3\x96\xf1\x5d\x06\x1c\xb6\x2d\xf0\x59\xd8\ \x1d\xdb\x8d\xe0\x73\x48\x9f\x01\xdf\x59\xf0\x1d\x5c\x74\x8b\x29\ \x00\x87\x27\x61\x7b\xa8\x0f\xb8\xbc\xb3\xeb\xa3\x7f\x7e\xa8\x6f\ \x57\x55\x5c\x58\x5d\x18\x3c\x33\x71\x6a\x60\x37\x27\xe7\xea\x46\ \x14\x57\xae\x5e\xd5\x13\x76\xcc\x6e\xb5\xa6\x40\x67\x36\xe4\xf8\ \xf1\xc7\x1f\xb0\xfb\x0e\x64\xbb\x10\xfd\x50\x11\x4f\xac\x7a\x8f\ \xa5\xc6\xdb\xf7\xdb\x13\x9a\x40\xcc\x8f\x86\xc9\xe0\xe3\x1f\xb1\ \x87\xd6\xce\x9b\x6e\x9a\xb5\x0a\x5c\x2d\x76\x41\x6d\xc8\x7b\x01\ \xbb\x83\x4d\x3b\x15\x93\x00\xcf\xa8\xf7\x58\x00\x04\xd9\xae\x55\ \xef\xe1\x43\x11\xfe\xe7\x65\xbb\xf6\xc0\x0e\xc3\x98\x77\xf6\x56\ \x2e\x48\x92\x7a\xcf\x93\x8d\xc9\x37\xff\xb1\xa5\xb6\x69\x0b\xc0\ \xe0\x28\x8c\x37\x11\xbe\xf7\xe2\x7b\x51\xd0\x89\x93\x27\x2b\xa7\ \x70\xeb\xd6\x2d\x73\xce\x60\x9d\x49\x70\x7d\xeb\xdc\xe4\xd9\x81\ \xb8\x89\x4b\xf8\x2e\x1e\x57\xd6\x86\x7a\xcf\x86\xf7\xcd\x55\x7e\ \xfc\x76\xa8\x72\x18\xba\xf6\x22\x00\xf6\xf8\x6a\xe3\x22\xea\x61\ \x66\x84\x3e\xee\x67\x7a\x7c\x2b\xe2\xf1\x4e\xe2\xa9\xbb\x51\x8c\ \x31\x3d\x44\xbd\x7c\xe3\xf1\xb1\x39\x47\xea\xf9\x5e\x8b\x1a\xf0\ \x43\x07\x0f\xf6\xdd\x7b\xcf\x56\xb0\xe3\x49\x12\x5a\xe5\xd7\x7c\ \x1f\x22\x1e\x1d\x0c\x78\xc0\x58\x7f\x9e\xed\xbf\x87\x32\x01\xc9\ \x6b\x06\x4a\xd8\x80\xca\xde\x6b\x74\x09\x46\xb6\x9b\x2e\x32\xc5\ \xbe\x40\xc5\xc1\x64\x23\x6d\x61\x07\x47\x22\x1e\x4a\x1b\x6c\xb1\ \x8f\x8b\x83\x1c\xdd\xf1\xbd\xdc\xed\xe0\xd0\x9f\xd5\x7b\x56\xe1\ \xc1\xeb\x1b\x78\x72\xc8\x09\xc1\x50\x23\x09\x80\xab\x0c\x59\x8f\ \xaf\x36\xf6\x30\x30\x0f\x1f\xcf\xdb\xf6\xff\x78\x12\xd3\x49\x40\ \x97\x0c\xd3\x8f\xa2\x08\x9f\x75\x17\xde\x6b\x4b\xb1\xba\x46\x4f\ \x6b\xd2\x48\x80\xb7\xb0\xe7\x09\xdb\xee\x7a\x3c\x3b\x3f\x33\xb0\ \xff\xc0\x7e\xbf\x73\x2f\xbf\xd9\xe3\x37\x7a\xf9\x9d\x3d\x3e\x4d\ \xac\xe9\x8a\x76\x22\x00\x0f\x28\xad\xc8\xd1\x9c\x0f\xc0\x7d\xdb\ \xdd\x7a\xfc\x86\x25\x93\x58\x6e\x3a\x16\xcf\xd9\x5f\xbd\xba\x32\ \x82\x87\xd0\x74\x64\xb6\x2a\xd0\x34\xec\xd7\x7d\xf8\xed\x4c\xc9\ \x93\x80\x50\xef\x5f\x65\xbc\x4f\x9e\x3c\x01\xf8\xf0\xa4\xed\xc8\ \x76\x81\x3a\x26\xd0\x64\xf3\x06\x9e\x76\xef\x3d\xf6\x99\x66\x69\ \x2f\xc0\xa7\x55\x7a\x76\x79\xae\x33\xb2\x7b\xab\x89\x60\xf0\x3d\ \x3f\x07\xc0\x6e\xda\xa2\xd4\xbf\x4f\xc5\x4d\xcf\x6d\xc1\x04\x2d\ \xc1\xed\x7d\x81\x6f\x8f\xdf\x88\x0d\xe3\xcc\xca\xda\xf4\xbe\xd5\ \x5b\xdb\x99\x99\x05\x36\x9c\xe3\x3b\x93\x61\x18\xf0\xed\xce\xa3\ \xa9\x2e\x10\x4a\xb4\x7f\x59\xa5\x49\x63\x13\x51\x48\x51\x15\x13\ \xc7\xc7\xc6\xaa\x89\xff\xee\x9d\x3b\xd4\x15\x70\x46\x5b\x52\x87\ \xb8\x0b\xf1\x20\x99\x3f\xfe\xe6\xdb\x38\x9c\xde\x94\x3b\xcb\x76\ \x9b\x37\xc7\x31\x36\x79\xf9\x9d\x3d\x7e\x10\xe8\xe7\x5a\x6b\x03\ \x3a\xce\x46\x05\x5b\x83\xdb\x5e\xbe\xcd\xd9\x1b\x3c\xbe\xc9\xd9\ \x61\x10\xf8\x3d\xf8\xf7\x8d\x8e\xf8\x2b\x5f\x5e\x1e\x86\x02\xcb\ \x7a\x7c\x2e\x6a\xa9\xf7\xb9\x7c\xf9\xb2\xea\xbe\xad\xc7\xe7\x87\ \x07\xd9\xae\x5e\xaf\x3b\xcc\x6a\xa5\xdf\x82\x6f\x65\xbb\xb6\x6d\ \xf9\xee\xee\x3b\x14\xee\x93\x63\x02\xfa\x56\xbd\x97\xee\x6e\x90\ \xed\x8a\xcb\x68\x25\xcc\xa0\xb3\x05\x3e\x56\xef\x71\xf4\x60\x34\ \x0d\x1c\x6d\x24\xef\x6b\x0e\x0c\x05\x45\x00\xdf\xd4\x0b\x9a\x65\ \xbb\x54\x5f\x30\xed\x4c\x00\xd4\x57\xa6\xcc\xf5\x11\xa3\x5c\xe4\ \xe7\x80\xeb\x18\x76\xe4\xf9\x46\xc9\xe7\x92\x4d\x32\x4f\xd7\xd3\ \x0c\x94\x28\x24\x1a\x47\x84\x9f\x8f\x9d\x8e\x45\xa4\x3a\xdb\x61\ \x7a\x66\xfa\x5d\xc9\xb3\x89\x7c\xd3\xfb\x49\x91\xba\xb0\x34\x3f\ \x58\x74\xbb\x7b\x57\xef\xed\xdc\xd7\xdf\x95\xc7\x0f\xce\xb9\x7a\ \x82\x68\xab\x0b\x10\x02\x3e\xa6\x9e\x90\xfd\x4e\xe0\x1b\x69\xe4\ \x1e\xc1\x17\x27\x5a\xc4\x73\xd7\xe3\x0e\xae\x83\x43\x03\xbe\x09\ \x7c\x3c\x44\x85\x5f\x0f\x95\x60\xf5\x1e\x0a\x59\x0e\x83\x8f\xc2\ \xd4\x67\xcf\x9e\xc7\xcd\x3a\x5e\xd5\x27\x19\x79\xea\xa1\x1a\xd9\ \xae\x90\x6c\x97\x7b\xe4\x56\xc4\xc3\x3e\x22\x3f\x39\x66\x65\xbb\ \xe8\xed\x13\xd4\xf4\x59\x46\xc4\x63\x0b\x7c\x34\xe6\xf3\xe0\x37\ \xcb\x76\xc9\x0e\xe0\x2b\xaf\xd7\xa7\xef\xc0\xf7\xe2\xc1\x38\x4f\ \x13\x7d\x66\xa2\xdb\x49\xb6\x6b\x27\x0d\xdb\xea\x0b\xd4\xcb\x0f\ \x39\xa1\x10\xdb\x54\x94\xb5\xb2\xdd\x32\xa4\x94\x20\x0d\x63\x87\ \xe7\x65\x8b\xc4\x98\x04\x2a\x8d\xc0\xf9\x89\xf3\xd1\x0a\x39\xf0\ \xeb\xf7\x9d\x4a\xcc\x87\xfc\x4c\xdc\x5d\x88\xfb\xfa\xcd\x22\x9e\ \xbd\x81\x2f\x04\xbe\x10\xf8\xfa\x22\x42\x71\x7f\x7b\x5d\x80\x06\ \xf5\x9e\x48\xad\xde\x73\x8d\xea\xbd\x06\xf0\x05\xe0\xd3\x67\xc4\ \xb0\x7f\xe8\x60\xdc\xb4\x51\x6d\x84\xfb\x1c\x8b\x70\xcb\x68\x71\ \x71\xb1\xda\x29\x96\x43\x5c\x06\x04\xde\x0d\xd1\xe1\xd3\x67\xcf\ \x20\x01\xa5\x02\x5f\x6e\xbd\x7b\x69\xc1\x57\x9b\xb4\xec\x46\x81\ \x17\x4a\xab\xde\x33\x6a\xb6\xda\x3b\x59\x01\x90\x2d\x78\x59\xf0\ \x8d\x5e\x1f\x80\x18\x9b\xf2\x48\x0b\x7e\x1d\xee\x03\x3f\x63\x73\ \x4b\xcf\xfc\xc6\x90\xee\xb5\x13\x1d\x43\x56\x14\x9e\x27\x3a\xeb\ \xf1\x79\xa2\xb3\x32\x1e\x56\xef\xe1\x37\xd6\xed\x3d\x80\x9f\x6f\ \xe9\xe1\xf9\xf4\x55\xef\x99\x18\x9b\x16\x42\x85\xc6\x53\x7f\x0b\ \x5f\xa8\x60\x48\x2f\x56\x05\xa9\x1e\xdd\x6e\xc1\xcf\xaa\xf7\x8e\ \xc6\xdd\xa6\x4f\x9e\x39\xde\xfd\x99\xea\x3d\xb2\x2d\xf8\x80\x1f\ \x3f\x89\xc0\xcf\xac\xbd\x69\x4d\x09\xe8\xbd\xcb\xa9\xf7\x52\x95\ \xbc\x9f\x7a\xcf\x5b\xf5\x5e\x33\xf8\x36\xdc\x9d\x9c\x3e\x37\xa0\ \x4b\x31\xb9\xb8\x86\xfb\x6d\x0b\x70\x7a\x6a\x2a\xb6\x6f\xce\xf0\ \x80\xd7\xef\x6c\x66\xc3\x7a\xb7\xdd\x67\xcf\x9f\xe9\x56\xd2\x78\ \x1f\xd7\xe3\x21\xaa\xdd\x2c\xdb\x95\xbd\xcb\x76\x59\xbd\x67\x77\ \x54\xb6\x0a\xbc\xbc\x6c\x97\xc1\x57\x3b\x90\x54\xd7\xca\x76\x79\ \x10\x59\xf0\x59\x97\x5f\xe6\x42\x7d\xdc\xcb\xe0\x5b\xaf\x4d\x93\ \x1b\xf0\x0e\xd8\xd3\xcf\x82\x5f\xbd\xc7\xb0\xd3\x81\x9d\x0c\x29\ \xc1\x4b\xe1\x3e\xea\x0c\x06\x7c\x23\x80\xa1\x42\x61\x56\xbd\x97\ \x0b\x77\x34\xcf\xd7\x67\xca\x3f\xcc\xd8\xa9\xd6\x02\x51\xd1\xcc\ \xf4\x0c\xb5\x94\x9b\xd5\x7b\x67\x27\xcf\x0c\x1c\x3c\xbc\xbf\xd8\ \xb3\x7a\x8f\xc0\x77\x06\xfc\x9a\xbf\x46\xf0\x99\xb1\xb6\x22\x00\ \xbb\xe4\x17\x5e\xa7\xac\xfc\x97\xb7\x79\xbe\x6f\xee\xe5\x33\xf8\ \x39\x1d\xf5\x81\x43\x07\xfc\xf2\xc5\xa5\xa1\x66\xf0\x93\x7d\xe2\ \xe4\x09\xdd\xfe\x89\x45\x3c\xb6\xca\xcf\x1a\xf2\xaa\xd8\x97\x76\ \xeb\x11\xde\x7b\xde\xd6\x9e\x52\x08\xe8\x5c\xa3\x6c\xd7\x86\xbb\ \x6a\x65\x65\xbb\x09\x76\x02\x39\xe4\x41\xe6\x02\x9d\x2d\x92\x3a\ \x61\x99\x2f\xbc\x29\x81\x4c\xed\xc3\x46\xbd\xbe\xb3\x93\x40\x83\ \x6c\xd7\x7a\x6a\x92\xea\xd2\x24\xa0\xd7\xa5\x4d\x3d\xe9\xf3\xe9\ \x0e\xfa\xe3\x68\xaf\x72\xce\xdf\x28\xdb\xcd\x83\x6f\xf4\xfa\xa4\ \x76\xa4\xfc\xdf\x82\x6f\xec\x64\x6a\x87\xc0\x4e\x02\xbc\x61\x49\ \x40\xaa\xd0\x5b\x49\xb8\x30\x3f\x2f\xa3\xa3\x9f\x11\xec\x46\xc7\ \x20\x75\xda\x35\xbd\x30\x1d\xc5\x85\x5d\xc7\xe0\x37\xaf\x08\x6c\ \x0f\x7c\xbc\xdf\x9a\x12\x10\xb9\x87\xff\x05\x22\x1e\x35\x2c\xf8\ \xf6\xa1\x68\xde\x7f\xe5\xc6\xda\x3e\xef\x9d\x63\xf0\x81\x17\x17\ \x92\x0f\x1e\x3c\x20\x2b\xcb\x2b\x18\xd4\xb6\x52\x8a\x2f\x83\x2d\ \xb2\x54\xd3\xaf\xbb\xf2\x72\x71\x90\x44\x3c\x40\x9d\xe4\xb4\x80\ \xc4\xa8\xf7\x92\xbd\xb3\x7a\x4f\x0d\x5b\x94\x63\xc5\x1e\x7b\x7c\ \xa3\xde\xc3\xfb\xb8\x17\xc0\xe6\xea\x0f\x46\xbd\x07\x38\xfb\x17\ \xf4\x84\x6d\x2a\x66\x06\x02\x9f\xb1\xe7\xe7\x8b\xf7\x39\x6d\xc0\ \x24\xca\xe0\x31\xff\xb6\xa5\xc7\xb6\x73\x92\x05\x1f\xde\xdc\xe4\ \xf5\x74\xc0\xaa\x69\xe9\x61\x62\x61\xd5\x26\x5d\xc3\xe0\x5b\xd8\ \x31\x09\x30\xf8\xe8\x1c\x00\xb2\x22\x1d\x7f\x56\xb5\x98\x2f\x5c\ \xf8\x42\x3a\x9d\xae\x48\x06\x7c\x86\x7d\x70\x60\xc0\x4d\xcc\x4d\ \x0e\xee\x4d\xbd\x67\xc1\xc7\x18\x04\xf8\xb2\x4b\xf0\x5d\x8b\xfb\ \x01\x38\xe9\x0b\xbe\xb7\x1e\xbf\x09\x7c\xdf\x07\x7c\x0a\xe7\x16\ \x57\x16\x86\x0e\xc4\x7e\x6a\x16\x7c\xca\x7f\x06\x06\x06\x64\x6d\ \xed\xa2\xfe\xc3\xe4\xd7\x19\xa8\x41\x1b\x78\xbc\x78\xf1\x3c\x85\ \xfd\xbc\x54\xd5\x7c\x67\x1e\xdf\x9e\xd6\x7d\xab\xcd\xea\x3d\xb0\ \x65\xd5\x7b\xfc\x7b\x01\x99\xfd\xbd\x54\x94\x63\x8f\xdf\x00\x3e\ \x58\xca\xc9\x76\x6d\xa8\xaf\xbf\x2b\xbe\x4c\x9a\x56\xaf\x4e\xf4\ \x98\x44\x08\x5e\xab\xe2\xb4\x6b\xfa\xa9\x68\x19\x0c\xf8\x14\xe1\ \xf8\xa2\x30\x69\x12\x81\xdf\x20\xdb\x05\xf8\x74\x93\x0d\xef\xd3\ \xf5\x46\xbd\x17\x24\xd8\x5e\x3e\xa4\xc9\x04\x3b\xa9\x31\x2d\xf8\ \x0c\x3b\x26\x81\x12\x93\x60\xc0\x23\xe2\xe2\x71\x9a\x04\x9c\xd7\ \x2d\xc8\xab\x49\xc0\xf5\x01\x9f\xc7\xec\x91\xb8\x52\x75\xfc\xc4\ \xb1\xce\x5e\xd4\x7b\x16\xfc\x9a\xe5\x64\x34\x83\x0f\xfe\xda\x4c\ \x01\x0a\x61\xf0\xc5\x37\x81\x2f\x4d\xe0\x4b\x0e\x7c\xa0\xad\xa7\ \xb8\x76\x26\xe2\x5e\x7e\x1c\xe2\x32\xf8\xec\xb5\x2f\x5d\xba\x28\ \xfb\xf6\x8d\xf0\xb8\xc2\xf7\x63\xf0\xd5\xac\x64\xbd\x6f\x5e\xbf\ \xe6\x34\x13\x15\x7f\xdb\x56\x63\x6f\xc3\xb9\xa9\x5e\x5f\xcb\x76\ \xc5\xc8\x76\x93\xc1\xb0\xf6\x5b\x61\x48\xe0\xdb\x56\x12\x2e\x36\ \x8a\x55\x53\xe0\xc3\x20\x77\x49\xbe\x6c\x66\xb1\xde\x80\x62\xc9\ \x6f\x59\x92\x97\xaf\x6d\x47\x40\x60\x02\xe2\xfe\x3d\xcb\x76\x7b\ \x78\x89\xc3\x00\xb7\x13\x9d\xdd\x12\x0c\x11\x96\xe7\x3d\x0f\x8c\ \x6c\xd7\x16\x55\x8d\x22\xd2\x3e\x04\xac\xda\x94\x34\x81\xd7\x4a\ \x4b\xa9\x3d\x3e\xea\x0b\x0c\xbb\x9d\x04\x02\xc0\x37\x72\x6b\xdc\ \x4b\x1b\xa1\x64\xab\xfc\x90\x0c\x1f\x3c\x74\x50\xd7\x0e\xf4\x05\ \x9f\x61\x3f\x3f\x79\x6e\x20\x2e\x3d\xf6\xef\x05\x7c\xb1\xe0\x3b\ \x76\xc2\xad\xd5\x00\x1c\x87\xfa\xa5\xa3\x89\xdd\x89\xcb\xaa\xf7\ \x9c\x67\xf0\x9b\x96\x46\x62\xbb\x26\x77\xf1\xea\xb2\x3e\xa5\x1a\ \x7c\x53\x25\xc5\xc0\x5c\x58\x98\x8f\x33\xeb\x51\xf4\xfe\x45\xac\ \xa2\x8b\x66\x43\x05\x5f\xf7\xe4\xc7\xb7\x04\xf8\x12\x58\x3e\x0b\ \x8f\xcf\x6d\x2c\x66\xcb\xc8\x76\x85\xc1\xcf\x87\xfa\xb8\xdf\xa8\ \xf7\x90\x2a\x18\x6f\x63\xd5\x7b\x36\xe7\xf7\x34\xf8\x3d\x7f\x2f\ \xa3\xde\x4b\x11\x00\xab\xf7\x00\x0f\x44\x4e\x54\x1b\x48\x2f\x1a\ \x45\xc1\xfc\x1b\x62\x12\x08\x90\xac\xd1\x7d\xfc\x05\xf9\x98\x34\ \x0e\xbf\x31\x59\x25\xe6\xfb\x80\x1f\x08\x4a\xc8\x81\x65\xbb\x5e\ \xdf\xd6\x41\x18\xfc\xc0\x1e\x9f\xc1\x27\x28\xf0\x19\xcd\xbd\x7c\ \x2c\x0f\x97\xfe\x55\x7e\x27\x68\x0f\xea\x89\xc5\xd5\xd1\x64\x79\ \x67\x45\xb2\xf0\xc2\xbb\xa9\xb9\x89\x94\x0a\x34\x82\x2f\xcd\xe0\ \x4b\x06\x7c\xba\xce\xda\xad\xe9\x00\x6c\x8e\xef\xa9\x18\x93\xdf\ \x7b\xcf\xef\x1a\x7c\x11\x5f\x5d\xbf\xb4\xb6\x38\x34\x38\x34\xe8\ \x9b\xc0\x77\x2e\x9d\x10\x3b\x39\x39\x99\x0d\xf5\xed\xa6\x9b\x9a\ \xef\xeb\x9e\xf0\xe9\x89\x1a\x0f\x23\x14\xde\x67\xf2\xfa\x6d\xe7\ \xe5\xb3\x18\x25\xd3\xe2\xb2\xb2\x5d\x2b\x82\x81\x6c\x97\xf2\xfc\ \xbe\xe0\x43\xfb\x6f\xab\xc2\x12\xb8\xaa\x0f\x19\x6d\x02\xbd\xc4\ \xb9\x03\x8e\xd6\xe5\x53\x24\xe3\xf0\x1b\xa1\x65\x67\x05\xa5\xde\ \x0b\xbd\x7f\x4f\xc9\x48\xf8\xa4\x41\xeb\xe9\x60\x8f\x9e\x34\x1a\ \xbf\xd7\x23\xb5\x20\xd9\xae\xb3\xea\xbd\x1d\xf7\xde\x43\xc4\x12\ \xb6\x81\x2f\x16\x7c\xf3\xac\xed\xfe\x0f\x6c\xa3\xc0\xd7\x0c\x3e\ \x60\x47\x2a\xb1\xc5\x51\x97\x0d\xf5\x91\x4a\xa5\x23\xe3\x62\x07\ \x6a\x68\x68\xc8\xb4\xf7\x38\x02\x4d\xef\x7f\xb6\x7f\xd4\x9f\x88\ \x07\x8f\x34\x83\xef\x9a\xc1\x37\x35\x36\x73\x9d\xb1\x5b\x6c\x03\ \x52\x74\x87\xbf\x9d\x03\xdf\x39\xef\xf6\x0c\xbe\x73\x7a\x10\xc7\ \x91\xce\xd9\x89\xd3\x03\x4d\xe0\xeb\x5d\x7a\x50\xc7\xf2\xf2\x12\ \x3e\xd0\x80\xcf\xe1\x67\x3a\x4b\x5f\x85\x3e\xde\x3b\xd6\xdf\x71\ \x74\x81\xfb\xd9\x9b\x42\xba\x8a\x3b\xac\xa0\xc7\x6e\x42\xb9\x77\ \xf5\x1e\x79\x2b\x76\x76\xf8\x1d\x10\x2a\xb9\x77\xf4\xfa\xa4\xde\ \x0b\x42\xe2\x10\x0c\xf4\x04\x73\x59\x22\x57\x67\x1b\xf3\x91\x4e\ \x3e\xf9\x50\x1f\xf5\x05\xa4\x02\x25\x4b\xd6\xec\x44\x47\xa9\x92\ \x17\xc1\xe6\x1a\x46\xfc\x04\x99\x32\xe9\xf5\x45\x6c\xad\xa4\xaf\ \x7a\x0f\x61\xbc\xed\xba\x40\xe0\xc5\x1d\x15\xa3\xd1\xcf\x86\xe2\ \xef\xd8\x21\x58\xf0\x8d\x4d\x72\x70\xfa\x4c\x49\xb6\x39\xb5\x38\ \xd5\xa2\x74\x93\x99\x3c\xf8\x8e\xc7\xb2\x9c\x89\xab\x06\x87\x87\ \x86\x7d\xb3\x7a\xaf\x19\x7c\xd7\x04\x3e\xa5\xb0\xa1\xcd\x4d\x41\ \x0b\xe7\xcc\x36\x47\xae\xc9\xe3\xbb\xdd\x82\x2f\xd5\x51\xcd\xde\ \x2d\x5f\x5a\x1a\xc6\x60\xb3\xea\x3d\x16\xfd\xac\xac\xac\xc4\xd9\ \xf6\xff\x79\xfb\x0e\xf4\xb6\x92\xa4\xc9\xcc\x7c\x00\x25\x92\x22\ \x25\xca\xb4\x91\x6b\xdf\xfd\xfb\x99\xb9\xff\x05\x76\x0f\xb0\xde\ \x7b\xbf\xed\x48\x8a\xb6\x6a\x51\xc5\x0a\x45\x20\x59\xcd\x6f\x0c\ \xbe\x1d\xd7\x25\x0c\x04\x3c\xe0\x21\xd2\x46\x46\xee\xf3\x87\x22\ \xc0\x57\x20\x97\x72\x57\xf4\x43\x05\x3c\x70\x7d\x08\xf5\x53\x0f\ \x9a\xa4\x16\x7a\xb4\xf1\xb0\x9e\xb9\xb5\xd7\x2d\xb3\xf7\xf4\xc7\ \x38\x55\xe2\xc9\x2d\x3d\x0d\x33\x73\xa5\xba\x20\x57\xaf\x43\xd6\ \x1b\x5d\x33\xd5\x63\xac\x3a\x67\xbf\x3d\x6e\x3b\x32\x36\x52\x84\ \x71\x3d\xc1\x50\x5f\x73\x47\x55\xe2\xc1\xe0\x16\xd0\x5d\xc4\x16\ \xe4\xe2\x5e\xa9\x15\x29\x00\x0c\x66\x1a\x9d\xad\x1f\x0d\x01\xd8\ \xba\x75\x22\x5f\xe4\x1e\x6a\xbc\xa7\xc0\xb7\x6c\x58\xe7\xf5\x95\ \xc9\xb9\x2a\x9f\xe2\x61\xe0\x9b\x6f\xb5\x58\x6f\x5b\x24\x90\xc4\ \x61\xf5\x8c\xdf\x52\x5b\x17\xff\xfe\xfd\xfb\xdf\x02\x3e\xb7\x39\ \x45\xf8\x57\xdf\x7f\xb9\xf7\x30\x7b\xef\x2f\x01\xbe\x5b\x4d\xbc\ \x83\x1d\x0a\x82\xb8\x67\xe0\x1b\x81\x9f\xb7\xcd\x92\xae\xa8\x3c\ \x26\x01\x3e\xc2\xab\xbf\xfe\xbb\x1f\x1e\x1d\x3d\x7d\x12\x99\xbd\ \xb7\x3d\x5f\x6d\x7d\x33\xef\xa7\x9f\x7d\xb6\x0d\x7c\x39\x6b\xc4\ \xd0\xc0\xdf\xd4\x7a\xdd\x78\x33\x95\xbb\x1f\xf8\x82\xb2\x62\xee\ \xbc\xa5\x87\xe7\x4e\xf9\xfa\x99\x7a\x9b\xe5\xc4\x82\x1e\x49\x57\ \x71\xcd\xb9\xe2\x35\xb5\x86\x02\x2f\x4b\x56\x5e\x29\x6c\xf7\x55\ \x0a\x57\x6c\x8f\x11\x83\xb8\x53\xaa\xd5\xc2\x90\xbf\x9d\xad\x90\ \x8b\x80\x74\x84\x2b\xbb\x60\x90\x44\xbc\xb3\xda\x78\x1e\x8d\x90\ \x56\xda\x7d\x09\xb6\x27\x75\x54\xb7\xa2\x71\x8c\x4d\x47\x29\x8c\ \x2f\x12\xc8\xe1\xd1\x09\xf0\x09\x55\x9f\x0e\x95\xe1\xde\xa6\x33\ \x01\x8e\xd4\x23\xe5\xf5\x53\xe0\xbb\x78\x7c\xa4\x39\xb5\x66\xe0\ \xab\x8e\x04\xea\x0b\xdd\x00\x1c\x1f\x3f\x35\xcb\xc0\x4f\x45\xec\ \x4d\x87\x6b\x69\x4c\xc1\x49\x2f\x7f\xa7\xc0\x27\x1a\x77\xd2\x05\ \x70\x57\xe0\x57\x30\x83\x05\xf8\x1a\x82\x85\xe6\x58\x02\xfc\xfc\ \x83\x7f\xf2\xf4\x70\xf9\xb6\xf5\x49\xa9\x0e\x3b\x55\x4e\xd9\x3f\ \x38\x68\x92\x4d\xb9\xc0\x37\x59\xad\x55\xed\xfc\xfc\x83\x5d\x5f\ \x5d\xf3\x72\x09\x64\x00\x3f\x69\xe4\x27\x2f\x8f\x2f\x38\x15\x17\ \x85\x5d\x06\x89\xaf\x87\x14\x5a\x00\x7c\x65\xef\x31\x2c\x2b\x45\ \x58\x71\xd5\x8a\x84\xfe\xda\xd2\xa3\xbc\x5d\x7f\xfe\xb8\xa6\x34\ \x27\xd0\x01\xad\x8c\x3d\x9c\x73\x67\x01\x85\x38\xb0\x36\x1b\x60\ \x2b\x79\x12\x08\xf5\x5d\x37\xbd\x56\x7a\x7f\x09\x83\x6b\x61\x81\ \x71\xf1\x90\x9e\x28\xc0\x8c\xef\x07\x51\x91\x33\x92\xab\xf0\x1d\ \x04\x5b\xfe\x7e\x6b\xcd\xf0\x9c\x93\x78\x6c\xa6\x21\x90\x7a\xf9\ \x9e\xe7\x9b\x13\xa5\x3c\x93\x78\xb2\xc7\xc7\xf0\x50\x3b\xcf\x66\ \x4c\x9a\xfe\x01\xae\xe3\xfb\xef\xbf\xc7\x94\xe6\x56\xdc\x9b\xb9\ \x48\xef\xbf\x7a\xbf\xd7\xf8\x04\x7f\x6c\x2f\x5f\xc1\x3e\x05\xbe\ \xcd\x80\x5f\x77\xa9\x09\x48\xd4\x65\x0f\x88\xf1\xd6\xd9\x46\x93\ \x3a\xd5\x31\x63\x84\xf0\xbb\x3f\xfc\x6d\xab\x8c\x6a\xb1\x64\xaa\ \x07\xd7\x42\xff\xd6\x7e\xd1\xfe\xb7\x6e\xda\x45\x2f\xfa\xe6\xfa\ \xa6\x55\xfd\x95\xd3\xad\x0b\x34\x79\xe3\x65\x2b\x4e\xb1\xb2\xed\ \x39\x9c\x60\xd2\x6b\xc6\xe6\xdc\x2c\x87\xae\xeb\xbf\x21\xba\x31\ \x97\xd9\xf6\xac\xb6\x0b\x0d\x3f\xf6\xf6\x85\x08\x13\x8b\xee\xc7\ \x07\x28\xd8\x46\x9a\x8f\x3a\x73\xfb\x0f\xae\x39\x4b\x49\xb3\x48\ \xa6\xcb\x3e\x02\x29\x40\x56\x49\xc6\xae\x41\xd9\x41\x38\xce\xe3\ \xd9\x2d\xff\xa7\x95\x48\xda\x7b\x65\x00\xdd\xf8\xfd\x6e\x31\x1d\ \xd5\xe3\xa7\x9d\x87\x73\xe0\x33\x84\x98\x8f\xff\xe2\xda\xf0\xa0\ \xe6\x5a\x0f\xc8\x8f\xe1\x82\xf2\xbd\xd5\x7b\xb5\x84\x3c\xbe\x4d\ \xc4\x6a\x23\xc6\x4d\x44\x66\x7f\x7f\xdf\xbe\xdc\x28\x0a\xfd\xbb\ \x7f\xf7\xef\xb3\x84\x20\x81\x3e\x3a\x5e\x6f\xde\xbd\x5e\xff\xa7\ \x7f\xff\x9f\xaf\xb7\x25\xbe\x1f\x1c\x11\x66\x6a\x93\x47\xee\x59\ \xaf\x22\xf0\x77\x98\x02\x6c\xb3\xf7\x46\x0f\x36\x80\xd1\x10\xaf\ \x37\x53\x3b\x4d\x72\x46\x31\xc0\xff\x72\xa3\xb1\xfe\xe9\xe7\x9f\ \xac\xef\x31\x9b\x34\xac\xad\x2d\xb4\x7a\x67\xaf\x5e\xbd\xdc\x0a\ \xbb\x6a\x65\xbe\xa8\x7c\xfd\x5f\x51\xf1\x67\xb8\x9e\xd9\x8a\xb3\ \x50\x9f\x6d\x2c\xdb\x9e\x18\xd4\x88\x25\xeb\xc1\xf1\x2c\xac\x41\ \x05\x7e\x01\x45\xd6\x85\x5a\xa7\xad\x4a\xb7\x10\xd0\xc2\x91\x7b\ \x8c\xf0\xbe\x88\x31\x11\x03\xd6\xce\x15\x9e\x52\xc0\x5c\x8b\xd4\ \xb7\xf9\x9d\xe0\xbe\x8d\x33\x0d\x87\x7e\xd7\xac\xc6\xc9\x7d\x2e\ \x95\xd1\x90\x18\x4e\x37\x4a\xe2\x90\x29\xe9\xe3\x1a\xa7\xda\x7b\ \x58\x5f\x86\xf4\x63\x64\x83\xb8\x37\x21\xe2\x29\x04\xbb\x6e\x3f\ \x22\xbb\x08\x27\xed\xf1\x17\xf5\xf8\x33\xb0\x33\xdc\xf7\xd8\x62\ \xef\x15\xcc\x33\xe8\x25\xcf\xeb\x0b\x48\x97\x08\xc2\x54\xe5\x87\ \xd2\xf4\x67\x9f\x7d\x6e\x4f\x9e\x1c\x4e\xe9\xe8\x7a\xfe\x6c\xd3\ \x11\x78\x7c\xf0\xd8\xe7\x1e\x3f\x45\xaf\x1a\x1d\xe5\xc9\x5b\x46\ \xb3\xd9\x59\xef\x50\x14\xd4\x22\x8d\xea\xce\x36\x9a\x58\x0a\xf5\ \x73\x48\x2c\x94\xe2\x70\xfb\x87\x3f\xfc\xcd\x7e\xfe\xc0\x99\xc4\ \xd3\x54\x5a\xff\xfa\xaf\xff\x1a\x0f\xab\xe8\xe6\x78\x80\xc5\xb8\ \xd3\x5f\x4f\x61\x9d\x1f\xe4\xeb\x6b\xa8\x1f\x1e\x08\x21\xb7\x7e\ \x1c\xc1\x9c\x8a\x52\x67\x11\xf3\x6d\x2e\xe3\xe6\x63\xc1\x7b\x2d\ \x10\xce\xa0\x70\xa6\xaa\xfc\x84\xab\x87\x61\x38\x8b\xd0\xbc\x96\ \x71\x2d\x63\x80\x47\x49\xee\xec\xc5\x11\x17\xae\x5d\x81\xec\x1a\ \x95\xaf\x6f\xae\xf5\x02\x99\x4d\xd7\x41\x78\x89\x53\x23\xd8\x5b\ \x4f\x6c\x43\xaf\x83\x1c\xe5\xcb\x38\x8f\x7b\x82\x42\x1f\x6d\x5e\ \x6e\xe9\x0d\xe4\xa5\x24\x2c\xd8\xcb\xcf\xf2\xce\x3c\xe7\xb0\x96\ \x60\xaf\x0a\x7c\xb7\x0c\x7c\x4d\x03\x72\x4b\x2f\x83\x3d\x9f\x73\ \x26\x2d\xc0\xd7\xd1\xf4\x7e\x1e\x6a\xc4\xcb\xa6\x4d\xfd\xed\x1c\ \xd4\x72\x0f\xdc\x7b\x57\x60\x4f\xc0\xfe\x20\xa1\x27\x03\x3f\x75\ \xf9\x35\xff\xdf\xfd\x66\xa0\x50\x50\x53\xd2\x44\xfe\xc8\xb7\xcb\ \x21\x54\x28\x3f\x7f\xdc\xd0\xf7\x5f\xbf\x7f\xf4\xf4\xd9\x71\xe4\ \xd8\x27\xe7\xf8\xff\xb0\x19\xf1\x7d\xfc\xf8\x11\xbd\xbc\xb3\x3d\ \xa7\x15\xe9\x26\xe7\x75\x75\x7d\x35\x18\x7b\xd1\x41\x07\x75\x97\ \x52\xea\x7c\x50\x47\xe5\x59\x9c\xad\xaa\xca\xc2\x27\x23\x04\x0b\ \xe6\xf2\x96\x8b\x81\xfc\xb3\xd2\x47\x4b\x29\x52\xf4\xd4\xf9\x79\ \x1a\x91\x2a\x9b\x97\x29\xb7\x02\xb0\x04\x81\x5c\x9d\xb9\xbb\xe2\ \x22\xcb\x2a\x89\x46\x5c\xb5\xc2\x1c\x14\xe0\x15\x90\xc0\x78\x54\ \xaf\xf7\x39\xfa\x58\x5d\xde\xcf\x00\xa8\x9b\x27\x37\xb9\xac\x02\ \x3f\x52\x82\xb4\xc0\xd3\xea\x06\x61\x11\xa8\x8c\xa4\xc4\x83\xc8\ \x24\xeb\xed\x21\xce\x95\x6d\xc9\x66\x2e\x69\x16\x73\x7f\x8d\xf8\ \x54\xc3\xd0\x27\x8b\x3c\x09\x7c\x3a\xa4\xdc\xaa\xcd\xb4\x5d\x05\ \x7e\xc4\x22\x2a\x54\x58\x19\x77\x6b\x45\xe6\x06\x8e\x8f\x8f\xec\ \xf3\xcf\x5f\xdb\x7f\xfb\x6f\xff\x35\xa7\xb3\x5b\xa2\x33\x27\x2f\ \x9e\x2d\x4f\x8f\x8f\x63\xc3\x55\x61\xfc\x96\xc7\xd1\x79\x4e\x83\ \xd8\xf5\xff\xdf\x66\x20\x8b\xaa\xed\x8a\xf9\x30\x8f\x92\x20\xc6\ \x31\x54\xd0\xa0\x1f\xfb\xa2\x46\xdf\x68\xfb\xed\xcd\x3c\xbe\xb6\ \xa5\x4e\x4e\x9e\x6d\xa8\xc1\xaf\xa7\x9c\xfb\xac\xbd\x77\x7e\x76\ \x26\x51\x41\xe5\x8f\xb7\x02\xc8\x08\xb9\x03\x69\xcb\x56\xae\xeb\ \x0f\x6c\x14\x82\xb7\x08\x87\x72\xf0\x8c\xf2\xdf\x0f\x93\x89\x3d\ \x0d\x5f\x9d\xde\x51\x04\x54\x5d\xd9\x7b\x40\xd1\x56\xd5\x19\xde\ \x5d\xec\x41\xfe\xbe\x74\x82\xa7\x56\xd4\x0e\x74\xb6\xa6\x9f\xe7\ \x6d\x38\x59\x00\xca\x21\x07\x92\x8c\x32\x7b\xaf\xdd\x86\xdb\xbb\ \x87\x16\x5f\xf1\x86\xa5\x5e\x3e\xf8\x04\x2e\xc4\x31\x50\xa9\xcd\ \x83\x55\xfe\x30\x2b\xca\x10\xde\x22\x97\x25\xf6\xde\x00\x3f\xda\ \x8f\xb9\xe2\x2f\x6d\xd5\x9c\x86\x12\x80\x62\xc3\x4a\x29\x29\xa4\ \xb7\x07\x09\x3d\xed\xd8\x46\x88\xdd\xc6\xb9\xdc\xde\x29\x0f\x97\ \x9a\x3d\x7e\x4f\x5d\x31\x30\x64\xce\x36\x64\x26\xf1\xbc\xfe\xe2\ \xf5\xde\x6f\x31\xf9\x6a\x2e\xfc\xd1\xf5\xfd\x31\xda\x02\xbb\x33\ \x00\x8b\x2f\xa9\x97\xcf\x74\x60\x76\x01\x19\xf8\x1a\x06\x7d\xb5\ \x51\x50\xdd\x3f\xdc\x8f\x7b\x24\x9e\x14\xae\xff\xfd\xdf\xfd\xbd\ \x2d\x4b\xe0\x07\x8b\xea\x6a\x9e\xca\xeb\xfa\xfd\x00\xab\x7a\x3a\ \x05\x32\x80\x8f\x5e\x7e\x72\x84\xf3\x1a\x01\x79\x00\x89\x40\x62\ \xe0\xa3\xb3\x2b\xa0\xa1\x33\x05\x38\x12\x89\x07\x00\x05\x98\x59\ \xe5\x37\x6f\x60\xe1\xdf\x85\xe1\xc2\x73\x6a\x55\x6e\x04\x3f\x97\ \x84\xf3\xca\xf5\x1f\x3d\x67\xde\x45\xbc\x3f\x95\x9a\x48\xa2\x41\ \x68\xac\x95\x7c\xa8\xfb\x58\x85\x99\x14\x06\xa1\x57\xa6\x50\x4b\ \x7c\x24\x1d\x55\xa1\xdb\x6e\x09\xf0\x0e\x2e\x41\x51\xda\x2e\xd2\ \x38\xe8\x2a\x22\x2b\x50\xf2\xd4\x9c\xc4\xd3\x53\xc0\x10\xc3\x6c\ \x95\xc0\xcf\x35\x1b\x0d\xf5\xb3\x70\xaa\x2e\x7d\xc5\x59\xc0\xfe\ \x50\xa8\xdf\x40\x3f\xfe\x5b\xa6\xed\xb9\x5a\xad\x81\xbf\x69\x54\ \xb0\x9d\x9a\x80\x0f\xfe\xc6\xf1\xd3\xa3\x78\x7a\x72\xbc\xcc\x81\ \xef\x7f\x3c\xf0\xc7\x9f\x53\x2b\x61\x47\x29\xc0\x42\xe0\x6f\xbf\ \x47\x6e\xc3\x51\x66\x7b\x5a\xcd\x5c\x56\xfe\xed\x5f\x7f\xb3\x07\ \x30\x29\xf0\x35\x04\x7c\xfb\xf6\x8d\x9d\x3c\x3f\x19\x40\xa6\x75\ \x46\x78\x6f\x15\x62\x9e\x97\x4d\xca\x7b\x7b\x69\xa6\x6c\x95\xf4\ \xca\x76\x13\x80\x58\x2b\xbd\x08\x06\x9b\x4a\x2d\x30\x02\x14\x95\ \xa8\x49\x0a\x2b\xa5\x40\x4a\xb2\x01\x19\xaa\xa2\xdf\x8d\xa2\xdc\ \x00\xa1\x10\x6f\x68\x42\x03\xa4\x1f\x44\x29\xed\x73\xe9\x42\x52\ \x4b\xba\x83\xc3\x68\x48\x76\x50\x41\x12\xb2\x32\x12\x15\x67\x0c\ \x5d\xdc\xaa\x77\x32\x8b\x4a\x8c\x69\xcd\x9b\x69\xdd\xd0\x3e\xc0\ \x79\x65\x0b\x40\xce\x00\x46\x0b\x7f\x61\x34\x10\x8b\x93\x2f\x30\ \x0c\x52\x54\x14\x29\x93\x32\x32\xe8\xd0\x4e\x40\x31\xba\x32\xf0\ \x11\xf0\x38\xcf\x60\x3b\xca\xdf\x65\x3a\xa0\x46\x5c\xf2\x74\xcf\ \x9e\x9d\xe1\xfd\xfc\xfc\x1b\x02\xb2\x56\xe5\x75\x4a\xab\xf6\x37\ \xe0\x37\xfd\x3f\x05\x1c\x80\xaf\x3a\x10\x6d\x4e\xa0\xa5\x01\x7d\ \x0a\x15\x58\xd0\xce\x0e\x9e\xfc\x76\xd3\x11\xf8\xa7\x3f\xff\x8b\ \x5b\xa6\xcf\x93\xca\x7e\x7e\x7c\x0b\x3b\x3e\xd3\xef\xdc\x9d\x01\ \x30\x0f\xbd\x80\x0c\x7c\x07\xf0\xab\x17\xcf\xba\xe7\x8a\x9c\x6f\ \x37\x2c\xa8\xc6\xf7\xcf\xd7\xab\x43\x62\xee\xbe\x19\xf6\xf9\xdb\ \xd9\xcd\x23\x18\x87\xe5\xbe\xe8\x5f\x2c\x80\xec\x56\x08\x5e\x0e\ \xb8\xe4\x02\x92\xe8\xf6\xd7\x4a\x1e\x40\xcf\xe5\x9c\x46\x86\xde\ \x02\x3a\xfa\x92\xe3\x4b\xb8\xeb\x78\x5f\xaf\x16\x22\xd1\x6d\x81\ \xeb\x75\x31\x8e\xc2\x93\x29\xa0\xfc\x02\xe0\xf4\xa0\xea\xa5\x4c\ \xfe\x6e\x00\x88\x92\xf7\xd6\x4a\xc0\xdc\x36\xad\xbb\x9b\x62\x37\ \xe5\x06\x86\x52\x6b\x1a\x3c\x27\xa5\xde\xd1\xae\xe0\xdb\x8d\xd3\ \xaa\x5d\xdf\x12\x7d\xc1\xca\x6a\x59\x59\x34\xca\xef\xa8\x0b\xac\ \xf6\x56\x92\xf3\x6b\xab\xcf\xa9\x8c\x9c\x39\xfa\x0a\x16\x01\x78\ \xa9\xc3\x80\xb9\x4e\xe8\xc9\xeb\x58\x18\x6e\x63\xb4\xb3\x17\x09\ \xf8\x95\x1d\x59\x27\x5a\x98\xce\xef\x72\x0e\x7c\xde\x1b\xaf\x3c\ \x2b\xf0\x9b\x21\x1d\xeb\xc8\x71\xfd\xb7\xb7\x43\x61\x18\xc5\xe9\ \x34\x79\x88\xb1\xf3\x2f\xbf\xfc\xca\xfe\xf9\x3f\xff\x67\x13\xe0\ \xf3\x77\x7d\x78\x74\x18\x27\x27\x4f\x97\x9f\x7e\xfa\xe5\x36\x03\ \x7f\x0e\xf6\x3f\x0e\xf8\xb1\xbb\x22\xa0\xd3\x10\x18\xef\x68\x20\ \x44\xf3\x3a\x00\x92\x7a\xc8\xec\xc5\x7b\x2c\x2b\xfb\x6e\xe3\xfd\ \xdd\xf3\x9a\xb5\xed\xe7\x7f\xbb\xa9\xa0\x1e\xec\xef\x67\x6a\x67\ \x0e\xd7\xfb\x84\x5f\x49\x2c\xb0\x06\xe4\x5c\xe1\xa5\x53\x74\xca\ \x6c\x4f\x16\x68\x42\xee\x5a\x8d\x83\x0d\x21\x88\x0e\x26\xe5\x01\ \x90\x2e\xca\x62\x12\xa2\x1f\xcd\x69\xd5\x50\xc6\x60\xa3\x15\x1f\ \xde\x13\x15\xff\x24\x07\x2e\x51\x74\x75\xbc\x0e\x41\x16\x43\x3e\ \x1c\xd3\x76\x37\x3d\x14\x6d\xb9\x68\x99\x2e\x93\xe0\xae\x01\xa3\ \x0a\xd1\xc7\xcf\x5e\x46\x85\x77\x9c\x3b\x00\x39\x80\xd4\x5d\xd2\ \xcd\xad\xdd\xf4\xbc\xf7\x6a\xec\x65\x5c\x75\x51\x8c\xc7\xf6\xb8\ \x3d\x47\xde\x22\x91\x78\x72\x61\x11\x23\xe4\xe3\xad\xfa\x35\x0d\ \xa3\x89\x02\xaf\x4a\x8d\x87\x8f\x22\x5b\xbf\xa2\x42\xe0\x68\x71\ \x93\xb2\xe6\x4c\x39\xa6\x62\x29\x30\xfa\xed\xa8\x29\x1a\xce\x0c\ \xef\x51\x67\xd0\x91\xe8\xeb\xab\x1b\x35\x16\x22\x9a\x7a\x6b\x11\ \x4b\x06\xbe\x82\xbd\x8b\xd6\x34\x05\xa1\xd3\xd3\x5f\x33\xf0\xe5\ \xfa\xda\x86\xa1\xcf\xd6\x3f\xff\xf4\xeb\xed\xae\x80\x8f\x8c\x6d\ \x67\xa2\xa0\xe4\xfb\x57\xe7\xa0\xcf\x84\xbd\x17\x32\xa8\xe3\xd5\ \xeb\xe0\x0d\x7e\xf1\xe5\x9b\xbd\xf5\xde\x3a\x32\x2b\x4a\x95\x78\ \x96\x88\x0d\xe5\xf7\x2b\xd5\x5e\x9f\xaa\xc6\xb6\x1f\x64\x67\xfb\ \x69\x4b\x2f\x42\x69\xbb\xc2\xd8\xe3\xdf\x7d\x88\xbd\xa7\x39\x7e\ \x5e\x99\x1d\x11\xfa\x77\x55\xa1\x87\xe0\x37\xf2\xec\x97\xd8\xae\ \x89\x98\xab\xc0\x44\x1d\x6d\x33\xce\xe8\xf7\x53\x19\xc6\xa1\x26\ \xa2\x55\xd2\xbf\xbf\xad\xb7\x76\x75\x7d\x6d\xe7\xe7\xe7\x5d\xd4\ \xf4\xea\xf2\xda\x6e\x1a\xf8\xdd\xe4\xf3\xcf\xbb\x03\xcc\xf9\xd9\ \x56\xac\xc5\x48\xdb\xad\x52\xd7\xa9\x94\xf2\xd6\x6e\x5c\xdb\xb9\ \xd7\xa6\x2c\xaf\x6e\x36\xff\xbc\xbc\xea\x86\xa7\x28\x75\x17\xa4\ \x28\x8a\x73\xd0\x28\x14\x90\x83\x64\xde\x1e\x75\x8c\xc4\xde\xab\ \x88\xd4\xb4\x15\xa7\xf5\x27\x15\x03\x0d\xbe\x86\x6a\xef\x65\xf6\ \x5e\x29\x69\x46\x43\x25\xb8\x92\x06\x62\x3b\x5c\xf7\xcf\x7a\x2d\ \x21\x38\x8b\xb5\xe0\x6f\x64\x6a\x7a\x56\x5f\x8a\x88\x5e\x10\xcc\ \x1d\x85\xdc\xe3\x7f\xf2\xe4\x49\x1c\x1f\x3d\x09\xd5\xa4\xe0\xd9\ \xf5\x3c\x59\x57\x27\x67\xb2\x31\x76\x2c\x09\xe6\x1d\xc8\xbe\xb5\ \xfb\xcf\xfe\x78\x5d\xb2\x6f\x7e\xf8\x6a\x6f\x4a\x8e\x10\xbe\x7e\ \xf3\xfe\x8d\x4d\x95\x7b\xf9\x59\x74\xb3\x79\xff\xb9\xf2\x10\x9f\ \x4f\xf0\x92\xb6\x4b\x20\xdb\x1f\xad\xbd\x67\xb2\x39\xd7\x21\xae\ \x19\x41\x11\x51\xcd\x41\xdd\x10\x09\x89\xb4\xb8\x6f\x11\x74\x6a\ \xcd\x72\xe0\x52\xa1\xf7\x9a\xe9\xe0\x28\xc4\x75\x4f\xdf\x68\xce\ \xa7\xa7\x67\x76\x71\x71\x61\xb7\x28\xbc\xb9\xda\x07\x14\xac\x20\ \xd3\x4a\x10\xb3\xca\x8f\xcf\x05\x82\xcf\xa4\xd8\x67\x36\xce\xce\ \xe8\xa9\xf2\x3b\x5d\xc5\x62\x3e\x42\xf4\xcb\x0d\x48\x2e\x3e\x5c\ \xd8\xd5\xf5\x48\x3b\xda\x33\xc0\x9a\xcb\x1a\xfe\x74\xe2\xcc\xb5\ \x4d\x00\x83\xeb\x06\x69\x48\x35\x0a\x2a\x47\xb4\x01\xde\x4a\xf9\ \x33\x92\xbb\x06\x50\x33\xc0\x95\xcb\x51\x8a\x3c\x5e\x4d\xee\x0d\ \xc2\xfb\xdb\x5e\x5f\xaa\xb5\xcc\x80\x8f\xfa\xc6\x68\x01\x96\x29\ \xf0\x15\xec\x4f\x8f\x9f\xb6\x45\x35\xfd\x9c\x7b\xfc\x3a\x2c\xf6\ \xe9\x66\xe7\xe5\x0c\xec\x73\xe0\x33\x65\xce\xc8\xe3\x77\xba\xab\ \x69\xc0\xb0\xa4\x5d\xf6\x9b\xec\x3d\x1e\xe5\xfc\xfa\xcd\xe7\xab\ \x27\x47\x4f\x22\x6b\xef\xe9\x02\xcd\x96\x4f\x35\x85\x95\x0c\xfc\ \x08\x9c\xbd\x9f\x5b\xbf\xff\xb6\xef\xe9\x87\x27\x70\x15\x8e\x99\ \x4a\x70\xe5\x50\xdf\xaa\x18\x36\x9d\xc9\x17\xba\xad\x4e\x0f\x86\ \xe4\x8e\xb1\x04\x6b\x09\xd8\x85\xbc\xe0\xf9\x98\x8b\x97\xd5\xdd\ \x08\xbb\x75\x1a\xce\x58\xd0\x63\xd1\x29\xa9\x0b\x19\x73\xcf\xd3\ \xb3\x0f\xf6\xe1\xfc\x43\x3f\xc3\x3a\x54\x2b\x3a\x29\x44\xaf\x0b\ \xac\x91\xef\x0e\x50\x13\xc8\x45\xc6\x83\x25\xdb\x44\xc5\xbe\xd6\ \x2a\x84\x1e\x8e\xe7\xc6\xe0\x2c\xac\xf7\xf6\xac\x4a\x1f\x1a\xbb\ \xf9\x2f\xaf\xae\xba\xc7\x2c\x2d\x57\x4e\x1b\x9e\xaa\xeb\x7b\xa1\ \x62\x38\xf4\x11\x0a\xb7\x26\xe1\x6e\xe3\x3a\x90\x8d\x3b\x6f\x5b\ \xaa\xec\xab\x7d\x22\xb7\x01\x46\x43\xd9\x7b\xf0\xec\x11\x68\x25\ \x22\xdc\x67\xe8\x7e\xd9\xa3\x9a\x1b\x11\x51\x35\x9c\xdb\x21\x7b\ \x7c\xd4\x05\x08\x7c\x2d\xdc\x4a\x0c\xff\xfe\xdd\x7b\xf5\xec\x02\ \x7c\x02\xbc\x75\x03\xf6\xf7\x0f\x42\x81\xef\x0f\x02\xdf\x19\x84\ \xdb\x34\x62\xd8\xd9\x2c\x80\x4f\x2b\xfb\x75\x2b\xa4\xe4\x31\xe7\ \xf5\x3f\x7c\xbd\x47\xe0\xdb\x34\x0c\xfa\xe6\xeb\xaf\xdb\xbc\xff\ \xb4\x2b\x10\x31\xda\x35\xc5\x5a\xd8\x99\x3c\x3e\xe7\x01\x24\xd4\ \x27\x73\x6a\xf0\xfd\xf3\x34\x20\x8b\x7e\x68\x05\xb9\x9c\xc1\xc6\ \xab\xe3\x9c\x36\x0b\x55\xd9\xc1\x8f\x7c\x2f\x90\xdc\x62\xf2\xb1\ \x8c\x0e\x83\x4b\xe1\x70\x0c\x47\x25\xbd\xb9\x7b\xcc\xb7\x31\x8a\ \x7a\x71\x71\x45\x59\x2e\xd7\x11\x60\xfd\x2e\x55\xbe\x6c\x5c\x0f\ \x0c\x68\x5e\xa6\x29\x03\x3d\x1e\x42\xd5\x0d\x87\xf7\xc7\x85\x49\ \x71\x50\x22\xb0\xd1\x8a\x5d\x56\x0b\x0b\x6a\x49\x6f\xaf\x5d\x77\ \xb9\x2a\xb6\xdc\x84\xad\xf6\xd6\x64\x8e\xf4\xee\x08\x4b\x79\xa5\ \x56\x49\x1d\x11\xab\x8c\x4e\x4a\x3b\x41\x4e\x0e\x83\x4e\xb8\x66\ \x7e\x76\x1a\x78\x74\x4f\x8c\x5c\x11\x0d\xdb\xb5\xca\xdf\x6e\x6f\ \x8c\xda\x83\xa6\x27\xcd\x70\x35\xcf\x1f\x71\x7f\x80\xc7\xf2\xc8\ \xb9\x02\x7c\x44\x0c\xad\x48\x3a\x9b\x4e\x84\x51\x3f\x3a\x3e\xb2\ \xa3\xa3\x23\xfb\xf5\x97\x5f\xad\xa6\x62\xba\x82\xfd\xd3\xd7\xaf\ \x56\xff\xf1\xdf\xfd\xa7\xab\x5c\xc3\xb1\xdc\x45\xe2\xd7\xf7\x5b\ \x35\x82\x1d\x0e\x03\xa5\x2f\x65\xcb\xe3\xcf\xd6\x43\x09\xd8\x9f\ \x9d\x3c\x8d\xe7\xaf\x4e\x56\x0a\x40\x5a\x27\xaa\xb9\x7e\xf1\xe5\ \x97\x02\xfc\x24\xb3\x3d\x2a\xdd\xd7\xb7\xd7\xed\x07\xc6\xc2\x19\ \xc0\x2c\x21\x57\xc9\x4b\x2f\xe5\x26\x38\x7b\xbf\x69\x2b\x6d\x80\ \xe8\x32\xce\x9a\x72\xa0\xb0\xa9\xe4\x1a\xb6\xe5\x4c\x85\x4b\xf1\ \x03\xc6\xb9\xcf\xe6\xeb\xb6\x1d\xb7\xad\xbb\x57\x9d\x67\xa3\x22\ \xce\xc5\x55\xcb\xeb\xaf\x53\x25\x5b\x0b\x9a\xb2\x05\x88\x33\xc3\ \x64\xec\x29\x6d\x17\x1a\x01\xca\xd6\x43\xcd\x0f\x67\x84\xdb\xb9\ \xc3\x81\x70\x3d\x44\x9c\x65\x59\x34\x95\xe2\xbf\x92\x90\xe7\x4d\ \x33\x04\x97\xa5\x03\x63\x59\x9b\x45\x09\xab\x2c\xc6\x8d\x3c\x7f\ \xa8\x0f\x8d\x62\x5f\xd4\x42\x6d\x00\xa3\x37\xcf\xb2\x09\xca\x08\ \xd5\xfa\xc0\x68\xea\xe2\x43\x0e\x4a\xb6\xdd\x6b\xe9\x95\x4a\x8d\ \xcb\xd6\xd6\x6b\xe9\x95\x27\x8f\xab\xdd\x23\x66\x51\xd9\x71\xf1\ \x33\xa3\x93\x81\xf7\xd2\x96\x2e\x9e\xf7\x7a\xc3\x0e\xfc\x17\xbf\ \xfc\x8b\x07\xd9\x7b\x2f\x5f\xbe\x58\xfe\xeb\x7f\xfc\x6f\x7e\x53\ \x6e\xaa\x59\x06\xf5\x1f\x0f\x7c\x62\x70\x17\x35\x80\x45\xf9\xfa\ \x31\xdd\x95\x9f\xc7\x83\xc1\x81\xf9\x22\x2f\xf7\xc8\x52\xe2\x63\ \xff\x5a\x17\xf8\xd4\x96\x51\xde\x65\x37\xfa\xfe\x59\x6d\x17\x55\ \x78\xbc\x60\xc0\x38\x4c\xf7\xb4\xdf\x17\x1a\xc9\x35\x02\xf4\xb9\ \xb3\x6e\xfb\xdd\x41\xff\xbf\x48\x03\x43\x81\x6e\x08\xa2\x07\xe6\ \xda\x83\x50\x4c\x36\x0d\x88\x2c\x08\xd9\x4b\xff\xd3\xe5\x06\xf8\ \x67\xe7\xe7\x00\xff\x50\xf0\xe1\x94\x9c\xd7\x9a\xb4\xf7\xc0\xc3\ \x27\x07\xc2\x4d\x38\x10\x15\x67\x01\x7f\x3f\x2b\x3b\x4d\xee\xc7\ \x56\xd1\x9e\x46\x41\x49\x3c\xeb\x65\x35\x0c\xb0\x93\xdd\xb8\x45\ \x55\xd1\x36\xa5\xf5\x82\x6d\x2f\x54\xb6\xb4\xad\x81\x5f\x07\x69\ \xaa\x5b\xd1\x19\x7d\xdc\xdb\xb4\xfa\xab\xca\x6f\x4d\xf5\x03\x6b\ \x96\x18\xef\xc7\x60\x65\x7f\x78\x7c\xab\xdb\x55\x7e\xb0\x00\x2f\ \xaf\x2e\x37\xd7\x75\xcd\xdc\x22\x6f\x2b\xa6\x9c\x12\x8b\x8c\x89\ \xb1\x87\xc7\x6b\xad\x9a\xff\xf3\x2c\x79\xfe\xc9\xc9\x49\x93\x0f\ \x9b\x92\xe7\x18\x99\xb9\x6f\x1c\xe6\x82\x5f\xaf\x0a\xf1\xaa\x10\ \x57\xc6\x51\x3e\x4b\x69\x73\x27\x5d\x00\xb0\x3f\x84\x75\xc4\xa8\ \x3f\xda\xc3\x00\x85\x63\x54\xe0\x4e\xe3\xff\xf5\x86\xe4\x30\x07\ \x3e\xc1\xfe\xed\x77\xdf\xe5\x65\x9a\x59\x74\xb3\x57\xbe\x4b\x2d\ \x89\xb6\x3b\x5f\xcc\x11\x1e\xfa\xf1\x35\xcf\xcf\xd3\x8a\x5a\xe5\ \x47\x3a\xc1\xe1\x91\x48\x85\x14\x28\x0a\xa7\xbc\x10\x2e\x23\x3c\ \x84\xb1\x17\x49\xb1\x18\x1e\x4a\xb5\xf1\x00\x66\xef\x85\xb4\xeb\ \xab\xcb\xf6\x00\x80\x9f\xc6\x65\x99\x43\xe7\x5c\x0b\xef\x03\x50\ \xa2\x4b\xd1\xcf\x45\x73\xaa\xb4\x94\x1e\x69\x4e\x9e\xa5\x31\x65\ \x34\x86\x86\x65\x8d\x0b\x40\x23\x2d\x95\xca\x22\xef\x59\xac\x0a\ \x89\x6b\xb4\xd2\x36\x40\xbb\xbc\xb9\xd6\x91\x63\x82\x9d\xf7\x93\ \xc5\x3d\x6d\xef\x51\x7d\x28\xfd\x2e\xc6\xe3\x56\x92\x50\x07\xc1\ \x0e\x23\xc0\xf4\xcd\xba\xd7\xbf\xbe\xbe\xb2\x8a\x62\xa0\x16\xcc\ \x44\x08\xc4\xb6\x3a\x14\xa9\xca\x9f\xce\x45\xb6\x1d\x65\xe0\xab\ \x97\x7f\xf3\xe6\x0d\x81\xaf\x83\x5d\xf2\x43\x79\xf9\xea\xc5\x2a\ \x03\x1f\x59\xf5\x1c\xf8\x3e\x05\xbe\xef\xae\x08\xb8\xe0\x41\x60\ \x82\x17\x30\xc0\x06\xe0\x97\xca\x12\xda\x9b\x77\x9f\xaf\xda\xec\ \xb3\x46\x0c\x35\xa5\x0a\x27\xcf\x9f\xdb\xb3\xa7\x4f\xe7\x13\x7b\ \x1e\x06\xfb\x7b\x7d\x75\x95\xdb\x81\x7f\x94\xf6\x1e\x40\x9d\x16\ \x68\x4e\x0a\x85\x21\x94\x61\x1a\x28\x05\x3a\x05\x48\xa4\x15\x95\ \x79\x00\x79\x3d\x99\x7b\x9e\xe3\x17\x0e\xc1\x9d\xe0\xc4\xf9\x87\ \xb3\x1e\x86\x96\x0e\x9e\x21\x5e\xa2\x86\x2e\x9f\x8d\xb4\xe3\xdc\ \x2b\x64\x91\x51\x47\x59\xc9\xd2\xfb\x58\xcd\x73\x0e\xe1\x58\xf0\ \xc7\x84\xe7\x61\xb5\x1b\x26\xfd\xd0\x15\xdc\x5b\xad\xd9\xad\xa8\ \xca\x51\x77\x3e\x6e\xe0\x39\x14\x16\x3b\xdb\x9f\x6f\x8b\x5d\x5e\ \x5f\xc1\x54\xf1\xfe\x51\x46\x0d\xa1\x3b\x82\x4d\x0d\xa1\xd3\x19\ \x3e\x09\x5a\x87\x65\x4b\x89\x27\x78\x13\xc7\xeb\x78\x6f\x59\x5e\ \x5d\x5e\xf6\xa8\x04\xeb\x6e\x15\xf8\x2c\xf0\x71\xcc\x58\xa9\xbe\ \x04\x7b\x9d\x56\xfc\xdb\xbd\xcc\xc0\xcf\xf5\xae\x17\x2f\x5e\x34\ \xc7\x28\x9d\x9b\x7c\x6f\xcd\xf6\x0f\x0f\xe2\xc9\xc1\x41\x6c\x03\ \xdf\x1e\x04\xfe\x3d\xa9\x53\xaf\x3b\x14\x05\xf5\xea\xea\x0c\xf5\ \x4d\x21\x04\x53\x52\x46\xd6\x07\x22\xbe\xfa\x62\x9d\x2d\x5d\xfe\ \x00\xdf\x34\x6d\x75\x67\x95\x3f\x8b\x50\xc6\x50\x65\xb9\x2d\x65\ \x5b\x89\xc7\x70\x9e\x8f\x26\xab\xb4\x58\x9e\xef\x8f\xc8\xaa\xc5\ \x91\xde\xdb\x2d\x1c\xb9\x23\xaa\xfc\x32\xdf\xef\xfd\x2c\x60\x67\ \x74\xc1\xcf\xa8\xca\x40\x2a\x16\x42\xc5\xdf\xab\xeb\x4b\x3b\xbf\ \xf8\x60\xe5\xb6\x8a\x47\x1c\x20\x10\xe0\x57\x9c\x2b\x4c\x64\xb0\ \x60\x37\x5a\x75\xb5\xc0\xe3\x13\xc0\xb4\xda\x2c\x14\x6a\x32\x4d\ \x0f\x9e\xd5\x76\x7d\xbc\xde\x38\x73\x60\x68\x08\x80\xba\xa6\x68\ \x14\xfc\xb1\x00\x03\xa5\x9f\xab\x3b\x18\x92\x7c\x9d\xd2\x53\x1d\ \xf0\x1f\x18\xea\x4b\x0d\x35\x92\x00\x8a\x6a\x02\x16\x1a\x9d\x21\ \x77\x36\x04\x4b\xd0\x05\x19\x8f\x17\xed\xb6\xdc\xd6\xce\x5d\x68\ \x7d\x7d\xde\x61\x83\x06\xc3\x88\x5e\x66\xbb\x13\xb3\xf7\xaf\xea\ \xf1\x13\xc0\xa9\xf8\x3c\xab\x77\x71\x81\xea\xb2\xf1\xf0\xaf\xa6\ \xc0\xd7\xf1\xf5\x17\x9f\x3e\x5f\x3d\x08\x76\x3d\x6f\xfd\xaf\x76\ \xda\x76\xb6\x1c\x74\xe1\xf5\xea\x05\x04\xf3\xbf\x48\x12\x5c\x6d\ \xaf\xff\x8b\x17\xcf\x56\xe9\x83\x11\xbc\x76\x57\x4d\xfe\xec\xd3\ \xcf\xa6\x9b\x73\xf5\x4b\x69\xde\x3f\x87\xeb\xe6\x38\xdb\x34\xd4\ \x07\x78\x66\x7d\x7d\xf1\xd4\xa3\xb5\x07\x22\x4b\xee\xe5\x83\xb8\ \x03\x29\x68\x5e\x43\x96\x5d\x62\xf0\xcc\xd0\x6d\x5b\x98\x44\xf5\ \x08\xad\x8f\x30\x5f\xf6\x2a\x3f\x81\xaf\x82\xab\x2a\x6f\x6d\x90\ \xe0\x92\xc5\xa3\x85\xeb\xbc\x00\x0a\x02\x1f\xc3\x43\x5a\x47\x10\ \x85\xdb\x2c\x96\x52\xb7\x6a\x0a\xb9\xa0\xc4\xe4\x73\xc3\xe4\xb2\ \x9a\x43\x7d\xab\xb4\x29\xb5\x8a\x41\xa8\x9a\x84\x25\xd1\xcd\xde\ \x6e\xeb\x69\x41\x75\x23\xd8\xa1\xee\x04\x98\xa2\x4f\x29\x2d\x3c\ \xcc\x2b\x15\x49\x7f\x6a\xd1\x8a\x3f\xd5\x88\xda\xf1\xfa\xa6\xb5\ \x26\xaf\x10\x55\x30\x67\xe7\xde\x03\x44\x1a\x93\xf0\x9e\xc0\xef\ \xa7\xe4\xd9\x4b\x29\xea\xf1\x39\x1e\x9c\xbe\xdf\xc4\xe5\x6a\x06\ \xe0\x37\x81\x8f\x07\x4f\x36\xd8\xf1\x25\xe6\x60\x9f\x03\x7f\x1a\ \x25\xec\xc8\x00\xc8\x9b\x22\x25\x04\x89\x33\x01\x1f\x6d\xa3\xb7\ \xef\x5f\xaf\xf3\xc5\xe4\xb9\xfc\x2f\x37\x95\xff\x75\x6b\x15\xa9\ \xba\x8d\x00\xc1\xc7\x06\xd7\x26\xf1\x9d\xc5\x39\xac\x12\x50\xba\ \x31\x46\xc3\xfb\x1c\xea\x67\x35\x57\x1d\x95\xc5\xd2\x86\x14\x43\ \xdc\xa3\x95\x3a\x40\x22\x45\xb0\x10\xe3\x15\xba\xfe\x4c\xeb\x6e\ \x76\xc7\xab\xaf\x9d\xc6\x7c\xd1\x6b\x1a\x49\x67\x31\xaf\x04\x13\ \x81\xca\xa4\x70\x53\x99\x45\x53\xeb\x8f\xce\xfd\xe1\x5d\xf9\x8c\ \x8a\x04\xf8\x10\x13\x25\x88\x0a\x5b\x86\xf0\xa8\x7d\xbc\xd5\xd8\ \xd6\xf4\xa4\xc4\x83\xcf\xa0\xb1\x58\xd6\xde\x2b\xa2\x81\xd8\x07\ \x6b\xfa\xbd\x8d\xf6\x38\xee\x43\x2a\xe2\x15\xa1\xe7\x26\xa1\x16\ \xe5\x40\x48\xbd\x00\xa3\xba\x17\x2d\xdc\xef\x9c\x04\x14\xe8\xf2\ \xd6\x62\x76\x5e\x3c\x12\x3d\xd7\x6d\xc2\xde\x33\x9c\x73\xba\x49\ \xe3\x52\xca\x1c\xf8\x72\x07\x0f\x0e\x0e\xec\xf0\xf0\x10\x8f\x0b\ \xf0\xf9\xec\xb6\x91\xf8\xe9\xf1\xd1\xe2\x19\xf8\x3e\x03\x7e\x9d\ \xa7\x07\x3b\x48\x01\x58\xf5\x8e\x76\x46\x8e\x1f\x0a\xfc\x29\x75\ \xf1\xf3\x37\x9f\xae\xe7\xc0\xe7\xf3\x9b\x92\x6a\x9d\xae\xc9\xe6\ \xb9\xfd\x48\x28\xb3\x3d\xa7\xed\x02\xf8\x1a\x21\xe0\xe6\xe9\x19\ \xff\x55\x73\x1b\xe1\xea\xd9\x29\x25\xbe\x44\x92\xd0\x62\xa3\x89\ \x53\xaf\x4c\x13\xb0\x40\x83\x9b\x76\x84\x81\x27\xb4\xe4\xf3\x0f\ \x1f\xb4\xed\x24\x84\x22\x52\x89\xf1\x00\xd9\x7b\x6a\x98\x00\x3a\ \x11\x45\x29\xac\xf2\x3b\x8b\x2c\x14\x0c\x55\xa3\xe5\x4e\x7d\x00\ \x2d\x78\xc8\x0f\x5d\x2f\x41\xf9\xe8\xab\xf5\x22\x45\x43\xa5\x20\ \x6a\x8a\xc2\xa2\x64\x62\x86\xb2\x78\xe7\x30\x16\xde\x00\xda\x22\ \x01\xca\x74\x49\xf7\xa4\x1a\xc3\xfb\x82\x7b\x0e\xb0\xd3\x56\xaa\ \xd6\x40\xf7\xe8\x57\x83\x90\x34\xbc\x37\x6b\x20\x0e\x80\x83\x9c\ \x05\x80\xd3\x08\x90\xfe\xe0\x5c\xab\x6e\xf7\xf4\x1f\x13\xf0\x2d\ \x47\x54\x53\xe0\x2b\xc0\xdb\xa4\x20\xbb\x68\x7c\x5c\xc1\xfe\xec\ \xc5\xc9\xf2\xc7\x01\xdf\xa7\xa9\x42\xdd\x45\x11\x10\xe0\x6f\xc0\ \xaf\x1d\xfc\x78\x02\xc0\x54\x3d\x5f\xe4\xd1\xd1\x61\x1c\x3f\x7b\ \xba\x3c\xb4\x39\xf7\xb8\xd1\x23\x47\xf1\x0f\xe0\x9d\x09\x67\xb6\ \x1f\x07\x28\x9c\xbf\x49\xdb\xad\x5b\x5e\x81\x1e\x1e\xe1\xba\x27\ \xda\xae\x02\xbf\x9a\x4c\xfb\x55\xac\x34\x1b\xde\x50\xf7\xef\x21\ \xea\x70\x9d\x75\x67\x31\xca\xab\xc8\x98\x03\x8d\x64\x4b\x96\x5a\ \x7b\x8b\xaf\x87\x8d\xe0\x1e\x68\xbc\x51\x99\x94\xea\xa4\x54\xf5\ \x6d\x34\x66\xbe\xbe\x8a\x62\xa4\x9e\x12\x1e\x4f\x0b\x34\x33\xf0\ \xa5\xdf\x3d\x8c\x3d\xab\x90\x38\x83\x11\xb9\xf4\xcf\x0f\x26\xe1\ \x5c\x7b\x0f\x7c\x08\xcf\x3b\x07\x44\xa8\x94\x9f\x01\x44\x1a\x44\ \x44\x18\x00\xb2\xa4\x99\xe0\xde\x1f\x4f\x05\x3e\x4a\x70\x63\x19\ \xcc\xc5\xe5\x20\x4f\x71\x1d\x7a\x92\x21\xaf\xc2\x1b\xa9\x5b\x00\ \x37\xdd\xe4\x34\xde\x07\xf7\xce\x29\xf5\x2e\xca\x66\x59\x87\x8f\ \xf2\xed\x73\xe0\x23\x1a\xea\x82\x37\x74\x50\x09\xf8\xb8\xff\x8d\ \x19\x18\x8b\x0a\xec\xff\xf1\xc0\xaf\xbe\x9b\x71\x60\x78\x38\x01\ \x3e\x27\xfc\xa0\x03\x58\x7d\x14\xaf\x46\xa8\xfb\xfa\xdd\xe7\x6b\ \xe4\xbc\xf2\x23\x55\xc6\x48\x1f\x90\x08\xa1\xfc\x52\x42\x9b\x3f\ \x99\xf6\xc3\x50\x6b\x5b\xf3\x1e\xf8\xc4\xd1\x66\xb8\xc6\xe9\x3e\ \x13\x69\x30\x2d\x5d\x6b\xbc\xe8\x59\x82\x5a\xdf\x44\x29\xa6\xe6\ \x28\x77\x8e\x1f\x54\xa1\x72\x17\xe0\x90\x2a\xfe\x65\xac\xfd\xbe\ \xbc\xb8\xf8\x98\xab\xd6\xa5\xc7\xc2\x22\x36\x51\xb2\x20\x26\xb9\ \x04\x12\xe6\x7a\x0a\x02\x4a\x65\x18\xee\x21\xfc\x77\xd5\x38\xe5\ \x90\x54\xae\xe5\x90\x30\x15\x86\xe2\x21\xda\x76\x2a\x95\x36\xa6\ \x00\xd7\x98\xb8\xc4\xfd\xd7\xb6\xca\x78\x81\xb0\xea\x9a\x12\x81\ \xe9\x20\x9a\x08\x49\xa7\x8f\xbb\x12\xbb\xe7\x6e\x9b\x76\xb4\xb0\ \xaa\x24\x1e\x7a\x6b\x4c\x14\x61\x54\xb7\xdc\x0e\x5d\x08\x74\x3d\ \xfc\xa3\xed\x2e\x69\x0a\xd0\x0d\x0e\xad\x58\x58\xf0\x7b\xf4\x50\ \x2f\x0f\xfe\x03\x9c\x4c\x32\x44\x66\x3e\xd7\xde\x23\x29\xa8\x86\ \xfc\x0e\xb2\x34\x5b\xed\x9d\x80\x67\xcf\x9e\xd9\x8f\x3f\xfe\x08\ \x03\x9d\xa7\xe4\xda\x73\x9a\x60\xc8\xf2\xf3\x8f\xbf\xde\x52\x8c\ \x95\xaf\x93\xcf\xf5\xde\xe3\x3b\x60\x02\xa2\x78\x1e\x0a\x62\x51\ \x01\xe4\xce\x47\x8a\x71\x7c\xf6\xfa\xd5\x7a\xbe\x32\x9b\x7f\x6c\ \x4b\x3e\x2c\x8d\xbd\x46\x57\x88\x65\x3f\xa1\x55\x6d\x7b\xad\x31\ \xb1\xf7\x8a\x30\xd5\xaa\x9e\x51\x0b\xf0\xc0\x59\xc6\x74\x7b\x44\ \x91\x37\xcf\x2a\x58\xf5\x35\x25\xd4\x4e\x13\x82\x16\x69\x84\xb4\ \x24\x8a\x34\x97\x6b\x14\x68\x16\x5e\xf4\xd6\xd3\xb6\x34\xb7\x87\ \xa8\x1b\x05\xe9\xcb\xb1\xdd\x46\xaa\xd4\xbe\xe7\x63\x66\x52\x34\ \xbc\x3b\x5b\x19\xd7\x0f\x6f\x1d\xcb\x88\xde\xb0\xf4\x14\x3f\x7e\ \x89\x28\x54\xd1\x79\xed\x56\x05\x08\xf0\x8e\xb5\x94\xbb\xd9\xf7\ \x65\xe9\x09\x50\x51\xdf\xae\x42\xa4\x54\x88\x22\xf5\x5a\x8c\xb4\ \xf3\x7b\xa1\x66\x80\xb4\x0c\x7d\x18\xca\x26\xed\xde\xc4\x36\x08\ \x58\x44\x17\x3c\x63\x76\xbf\xfd\xfb\xea\xa2\xf3\x43\x34\x1b\x81\ \xb5\x56\x41\x18\x52\xca\xdb\x79\x8c\x64\x67\xa0\xa2\xbd\xcb\xd1\ \xde\x18\x91\xa0\x91\x6e\x9e\xb4\x15\xf4\x5f\x55\xc0\x5e\x4b\xe9\ \xac\xc9\x0c\xc6\x4a\x4b\x62\xcf\x4f\x4e\xec\xa7\x9f\x7e\xca\x2d\ \x32\x2d\x2c\x37\x23\xb1\xfc\xd2\x74\x02\xfe\x48\xe0\xf3\xb8\x2b\ \x51\x50\x77\x4a\x7c\x19\x44\x1a\x33\xdd\x94\x4b\x24\xf6\x1f\x3d\ \xf2\xa7\x9b\x8b\xce\xc0\xd7\x7c\xa9\xf5\xfd\x8f\x8f\x8e\xf8\x85\ \xd5\xa4\xc2\x8a\x2d\x38\xad\x5f\xcb\x5e\x3e\x05\x26\x63\x90\x35\ \x74\x3c\x37\x51\x51\xdd\x43\x86\x58\x18\x01\xe0\x46\xf6\x00\x2f\ \xb0\x3e\x1b\xc0\x63\x6e\xc9\xd0\xb2\x8a\x91\xa9\x56\x18\x85\x10\ \x30\xb5\x9a\x72\x7c\x94\x27\x7f\x79\xd5\xab\xdd\xdb\xe1\x79\xa9\ \xb4\x9c\x85\xec\x22\xa7\xb2\x04\x01\x94\x74\xaa\x59\xa4\x62\xab\ \xce\xe2\x4e\x99\x38\x1a\x4d\x77\x09\x1a\x36\x46\x11\x54\xf7\xa5\ \x7a\x13\x1c\x8a\x84\xcb\x21\xde\x39\x6c\x89\x3b\xea\x6f\xa3\x72\ \xec\x1f\x1e\x9a\xf7\x19\x05\x23\x18\x2b\xb5\x11\x5c\xee\x21\x2f\ \x3d\xcf\xe8\x8b\x17\x06\x2f\x3f\xf8\x7d\x61\x12\xaf\x1d\xd6\x8b\ \xb6\x1b\xeb\x3d\xb5\xa9\xeb\xeb\x66\x98\xae\xdb\x63\xb9\x30\xb8\ \xcd\x7b\x52\x95\xa5\x92\x8c\x00\x80\xaf\x44\xb2\xa2\xdd\xa2\xa2\ \x34\x71\x89\x30\x29\x9a\xcc\x7c\x1f\xc5\x66\xb6\x16\x17\x62\x92\ \x64\x26\x29\x66\xb7\x14\x38\xdc\xb7\x14\xa9\xf2\x7e\x85\xa3\x67\ \x47\xe1\xe6\xdb\x00\x57\xe0\xcf\x29\xc0\x3c\xfb\x2e\x6a\x00\x90\ \xb0\x0a\xf8\x66\x3c\x80\x33\x09\x41\xaf\x3e\x7b\xb9\xce\x49\x7a\ \x5e\xc9\xf0\xae\xcd\x47\x43\xa4\x53\x68\xbb\x1a\x4a\xb7\xea\x70\ \x3b\x68\x2f\x3f\xcf\xe8\xe7\x99\x7e\x97\x5e\x3e\x8b\x3d\xb8\x61\ \x00\x3f\xc0\x41\xea\x28\x07\x2c\x08\x90\xf6\xdf\x60\xe7\x83\x85\ \x42\x74\x0b\xea\x10\xe1\x72\x1b\x5e\x36\x18\xfe\x0f\x4d\xff\x56\ \xec\x6b\xc4\x13\x0e\xea\x58\xe2\x31\x50\x6d\x89\xfc\x53\xa2\x47\ \xc5\x44\x95\xb6\xdb\x8f\x03\xf8\xb1\x72\x5b\xaf\xd7\x77\x83\x37\ \x1e\xa8\x66\x62\x91\x89\x0a\x6d\x72\xb1\x07\xdb\x84\xc3\x53\xb2\ \x30\xd8\xbd\xfc\x28\xb4\xe1\x79\x11\x61\xab\x58\x59\x2c\xab\xb6\ \xd4\x02\x74\xe0\xf1\x39\x70\xc9\x69\x34\x57\xef\x39\x0b\x63\x58\ \x32\x92\xbc\x6a\x95\x1e\x7f\xed\xd3\x9e\xb7\xc3\x48\x32\x4d\x86\ \x81\xa8\x43\x0a\xee\xb2\x9d\x45\x89\xa7\x20\x57\x47\x4b\x97\x63\ \xbb\x62\xdc\x0a\xef\xbf\xb2\x2a\x99\xd2\xe4\xb6\x62\x62\x0b\xe2\ \xd9\xa5\xe4\x49\xe7\x2a\x67\x0a\xd9\xc2\x28\xe1\xda\xd4\xe0\xb4\ \x65\x37\x1b\x67\x99\xd9\x7b\x9a\xef\xb5\x68\xc8\x37\xc6\x37\xb4\ \x46\x50\xe9\xf5\x1f\xd4\xb3\xdc\x09\x0f\x20\x16\xd2\xff\x14\xec\ \xf1\x1b\x6f\xfa\xf2\xd3\x4f\x56\x0a\xfc\x19\x0f\xe0\xd3\x4f\x3e\ \xc5\x12\xcc\x0c\x7c\xe4\xc0\xe0\x68\xcf\x7a\xf9\xb3\x59\x01\x54\ \x8b\x53\x28\xce\x22\x1c\xc0\xa9\xfd\x78\x55\x80\xb1\x62\xfc\x81\ \x02\x88\xaa\x5b\x58\x35\xfd\x0e\xd8\xbf\x41\x78\xc1\xeb\xe0\x35\ \x7a\xf4\xd1\x7a\xfd\xfd\x9c\x6f\x90\x39\xa3\x11\xb6\xf3\xc4\x88\ \xa1\xa2\x3d\xe6\x04\xf0\x3d\x94\x7e\x1e\x0a\x4c\x4b\xeb\xcb\xaf\ \x3f\x2a\xcf\x96\x02\x7d\x40\xf2\xe2\x8b\x48\xb8\xb7\x02\xd9\x87\ \x8b\xcb\xae\xa0\x7c\x7a\x76\xda\x15\x6a\x9a\xb6\xc0\xe9\xf9\x59\ \x2f\x4e\x5e\xf5\x96\xd9\x0d\x07\x87\x9c\xcb\x2a\x63\xb5\x12\xef\ \xde\x95\x9d\x7b\xae\xde\x5a\x55\x55\x28\xb9\x55\x6a\x13\x7a\x3f\ \x8d\x23\xde\x3c\x6b\x9a\x53\x6c\xa4\x7a\x81\xe8\xb2\xdf\xff\x52\ \x94\xea\xef\x9d\x40\x74\x75\x75\x31\x5a\x86\xb2\xe3\xa0\x54\xa1\ \x24\x8b\x32\x84\x54\xf9\x0b\x06\xbd\xac\x6a\xb1\x8f\x86\x55\x22\ \x18\x16\xfe\x38\x6e\x4e\xf0\xf2\x54\xf2\x1a\x03\xce\x0d\x40\x5f\ \x72\x0a\x7c\x79\xa7\x16\x0d\xa7\xd6\xb3\xe5\x7e\x7f\x17\x0e\xdd\ \xea\x18\x25\xdc\xcd\x80\xef\xbb\x2a\x02\xc6\x24\xf7\x48\xcb\x0c\ \x74\xd5\x94\xbf\xfc\xf4\xf9\x3a\x7b\x7c\xcd\xaf\xdb\x0f\xe7\x70\ \x6c\x4e\xc9\x05\xbe\xfa\xd1\xca\x17\x14\x60\xf2\x98\x2f\x85\x40\ \x94\xf4\x51\x49\xbd\x45\x3f\x59\xc7\x7c\x11\x39\xa8\x51\x60\xd1\ \x0e\x7f\x57\x16\xd7\xe8\xfb\x56\x0d\xdd\xd4\x5b\xe0\x07\x38\x5a\ \x46\x94\xd0\xef\xde\xeb\xc3\x06\x50\xaa\xbc\xe3\x52\x14\x34\xd5\ \xf5\x87\xb0\x9a\x8b\x6a\x4e\xbe\xbe\x11\xad\x00\x90\xcb\xb2\x40\ \x8a\x2a\xe9\x06\xb2\xbc\xd1\x8c\x4f\x2b\xaa\xf5\x81\x97\xeb\x1b\ \xae\x64\xf3\x10\x5d\x7c\x0e\xcf\x30\xda\xb9\x33\x2c\x8f\x1e\x3d\ \xb6\xbd\x47\x7b\xf6\x78\xef\x51\xcb\xff\x71\x0f\x08\x94\xb1\x16\ \x3c\x06\xc5\xb6\xf5\xdd\xb5\x10\x5b\x6a\x6a\xdb\xca\x7b\xb9\xab\ \xe8\x26\xf9\xfa\x1e\xb2\x5f\xa1\xde\x19\x81\xf5\x7a\xaf\xff\xb3\ \xfd\xb7\x16\xb6\xa6\x33\xc1\xaa\xd6\x20\x71\x4b\xc6\x71\xad\x30\ \xea\x28\x2a\xf7\x56\xa9\xf9\x57\x75\xca\x26\xe9\x26\x86\xac\xe2\ \xba\x37\x23\x2a\xf7\x9c\xf7\x8c\xc6\x21\x92\xc6\xb1\x9e\x11\xba\ \x1c\x1d\x1d\xab\xca\xff\x94\x84\x75\xb4\x29\x04\xfe\x8f\xff\xfe\ \x3f\x6f\x14\x83\xf9\xcc\x87\x76\x5c\x04\xf4\x1e\xf3\xa6\x37\xaa\ \xce\x85\x0d\x6c\xe2\x37\xfd\xb3\x65\x03\x70\x9f\x01\x1f\x5f\xf4\ \xdb\xb7\x6f\xb9\x40\x31\x4f\xe8\x81\x9a\x59\x6e\x39\xa1\x97\xa4\ \x9b\x99\x63\x6a\x5e\x48\x40\xe9\xae\x40\x0a\x7c\x22\xe7\x04\x87\ \x5d\xda\x7f\x98\x9f\x97\x51\x53\x93\x82\x51\x75\x08\x51\x22\x44\ \x74\x2a\x10\xf3\x1a\x68\x38\x4a\xcb\x4f\x9b\xa8\x04\x04\x24\x17\ \x69\x4b\xb5\xbf\x23\x67\x96\x40\x10\x86\xcb\x7c\x0e\x72\xd8\x6d\ \x79\xf6\x65\xbd\x82\x17\x41\xb8\x0f\xd5\x9e\xd6\x4a\x6b\xbb\x11\ \x9b\x62\x90\x2e\x41\x51\x0f\x41\xa1\x95\x34\xc4\xa4\x4a\x44\x57\ \xd7\x4d\x00\xf3\xd4\xce\xce\xee\x08\x29\x6f\xde\xbc\x6e\x82\x2d\ \xa3\xc8\x98\x89\x51\x61\xcb\xd2\x8d\x52\x8f\x20\x0a\x96\x8a\xf0\ \x83\x41\x93\x30\x29\xec\x82\x8e\x2b\x7a\x81\x45\x64\xd3\x2c\x9a\ \xe1\x6a\x05\xd4\xd1\xd6\x75\x00\x3f\x89\xa8\x06\xce\x09\x5c\x32\ \x19\x38\x54\x9c\x86\x93\x49\xd7\x00\xaf\xca\xef\xd3\xb6\x6a\xb9\ \xa3\xa0\xcb\xef\x87\x8c\x16\x2a\x1e\xcb\xfe\x0a\xd6\x16\x58\xea\ \x49\xc5\x16\x39\x37\x87\xf8\x78\x7f\xbf\x09\xdc\x26\xf0\x32\x95\ \x3d\x78\xb2\x1f\x6d\x9f\x46\x69\x39\xcf\xc3\xc0\x4f\xe7\x9d\x74\ \x01\x42\x3d\x7e\xe6\xa3\x30\xa2\xad\xe6\x27\xaf\x9a\xf7\x9f\x03\ \xdf\xdd\x49\x80\xe0\xe3\x02\x7c\x16\x5f\x6e\x4b\x01\x78\xfb\xe3\ \xda\xd2\x53\xfd\xb8\x2c\x52\x52\x67\x9a\x6c\xcb\xf2\xb1\xd0\x17\ \x01\xbe\x36\xca\x4b\xf2\x13\x18\xbd\xff\x60\x4e\x8b\x34\x61\xcc\ \xad\x87\x15\x8e\xc1\x25\x35\x59\x83\x44\x56\x33\x5e\xcd\xf3\x22\ \x7a\xe0\x64\x60\xa9\xac\xd8\x89\xd1\x32\xad\xa8\x0f\xe3\xb2\x05\ \x7c\x78\xfd\x58\x3a\x93\xd0\xb2\x04\x7a\xb5\x2e\xcb\x75\x76\x7a\ \xda\xbc\x3e\xc0\xce\x31\xd2\x01\xd2\x58\xda\x59\x38\x11\xe0\x22\ \xe8\x78\xb1\xe9\x64\x5b\x98\x0f\x51\xd4\xd6\x8d\x69\x85\xcc\x55\ \x8b\x0c\x5a\xe8\xdf\xd4\x70\xfb\xfd\xd1\x81\x27\x6b\xb5\x08\x18\ \x01\x5c\xf7\x08\xbd\x49\xa0\xa1\xb1\x4f\x06\x2f\x49\xcb\x5f\x5c\ \x9c\x75\xba\x70\xbb\xf6\xc3\xc3\xfd\x8f\xd1\x91\x83\x89\xa5\x22\ \x20\x36\xce\x45\x55\xa4\xb5\xdd\x38\xf6\x09\x78\x0c\x27\x90\x5a\ \xbf\x95\x1d\x14\xe1\x5e\xc0\xc3\xa3\xe6\xa3\xb3\x13\xf8\xed\xe5\ \x24\x17\xba\x11\x89\x76\x1e\x09\xf8\xac\xf8\x63\x09\xce\x7f\xbb\ \xb8\xb8\x07\x7c\x73\x2a\x5e\x1f\x1e\x1d\xf8\xaf\x3f\x9f\xd6\x3f\ \x1e\xf8\x3b\xe4\x01\xe4\xf0\x08\x67\x47\xfb\x77\x14\xc6\x9e\x3f\ \x7f\xba\xcc\x81\xcf\xb0\xea\xe4\xd9\x33\xd5\xd4\x47\x25\x9f\xda\ \xf5\x83\xfe\x9b\xc7\x28\x5d\xc2\x7b\x17\xfe\xb8\x9e\x83\x8b\x32\ \xb4\xaf\xce\x2e\x00\x5a\x8a\x56\xa5\x0a\x5e\xf0\x34\xcd\xf1\x74\ \x77\x80\x54\x70\xf5\xe3\x67\x0e\x7a\x69\xe7\x56\xf5\x17\xab\x28\ \xb2\xdf\x21\x83\x3a\x94\x2e\x67\x8e\x28\x45\x30\x4f\xa3\xb9\x1d\ \x70\x5b\x1d\xf4\x11\x22\x97\x62\x3f\xff\xfc\x53\x9b\xb7\x87\x3c\ \xda\x78\x7e\x58\x78\x6f\x05\x76\xe0\x63\x5f\x61\x13\xe9\xa8\xb7\ \x05\x95\x73\xd6\x3f\xba\x17\xef\x7f\xa7\xbf\xd7\xa3\x47\x6b\x68\ \x21\xf6\xbf\xf3\x7f\xfe\xef\xff\xb1\x47\x8f\x1f\xdb\xc1\xc1\x61\ \x8f\x6c\xd6\xed\x39\xfb\xfb\xb6\xa0\xe8\x21\x63\xd6\xad\x18\xd9\ \x24\xc1\x7a\x3d\xc1\xd8\xde\xa3\x41\x4d\x2b\x03\x8b\xce\x98\xf4\ \xe8\xa9\xeb\xe8\xa3\xa6\x51\xac\xf4\xda\xc5\xfe\xfe\xe3\x8f\xad\ \xba\xd0\xa2\x62\x3e\x5b\x5a\xac\x8a\x30\x1e\xe4\x9e\xd4\x46\x46\ \x5b\x94\x06\x97\xb2\x85\x5e\x53\xe7\xa5\xf2\xc1\x3a\xf1\xec\xac\ \x51\xc9\x56\xe7\x02\xab\x95\x81\x4f\xc0\x1e\x3d\x39\xb2\xff\xee\ \xff\x3d\x03\x7f\xeb\x39\x4f\x0e\x0f\x97\xd3\x5f\x4e\xcb\x14\xf8\ \x29\x6d\xa0\x6c\xe7\x4e\x22\x80\x0c\x7e\x15\x4a\xd9\xb6\x9a\x27\ \xcf\x9f\xad\x6d\x02\x7c\x18\x84\x27\xc7\x47\x6d\xe1\x27\x46\x61\ \x45\xb5\x95\xe1\x7a\x1f\xa9\x4c\x8a\xae\xba\x0a\x5c\xdb\x79\x98\ \xdb\xd6\x1f\x81\x31\xa8\x63\x0e\x5f\xa4\xb8\x53\x70\x03\xc0\x83\ \x07\x78\x21\xe5\x95\xa4\xa0\x2c\x2b\x14\xf1\x5f\x6c\x11\xf5\x73\ \x9f\x38\x43\x1b\xcb\x6b\x95\xcf\x99\x80\xcf\x96\x5e\xde\x8b\xa0\ \xc9\xd3\xf0\xdc\xc1\x1b\x2c\x72\x67\x67\xa7\x67\x76\x76\x76\x3e\ \x5a\xa4\x04\xfe\x12\xbd\x3e\xd0\xd5\x83\x7b\x2a\x72\x51\x28\xd6\ \x99\x83\xc2\xd4\x63\x24\xe9\xb1\x57\x9f\x7b\xfe\xdd\x42\xd4\x62\ \xb5\xcf\x2f\x34\x25\xe2\xcd\x62\x07\x3b\x7a\xf2\xa4\x45\x69\xbd\ \x46\xb0\xb7\x7e\x84\xa8\x09\x3e\xb0\xa7\x03\xbd\x9a\xff\x71\x3a\ \x4e\xf3\x7f\x13\xb5\x1e\x56\xbf\x1b\x99\xa7\x7d\xa6\xf6\xba\x40\ \x23\xda\x76\xb7\xb7\xad\x06\xb0\xb6\xf5\x7a\x19\xc6\xc4\x2d\xc7\ \x70\x2a\x02\x5a\xbd\xf6\x6b\x5e\x8c\x34\x62\x38\x87\x92\x56\xdb\ \xc9\x0c\x94\x2e\x4a\x25\x49\x49\xc2\x54\xda\x80\x62\x86\x82\xa5\ \xb6\x8d\xd4\x08\x60\x3e\x02\x9c\x80\xf0\x04\x6a\x9e\x0f\x0e\x0f\ \xdb\x81\x91\xdd\x44\x17\xef\xe0\x70\x3f\xfc\x81\xb6\xdf\x1c\xf8\ \xbb\x28\x02\x2e\xee\x24\x7d\xa4\xfd\xe5\x2c\xca\x35\x45\x9f\xd8\ \x7b\xbc\xb7\xd5\xcd\xcc\xa1\xfe\x27\xaf\x5e\xa5\x2a\x3d\x81\x0f\ \xf6\x5e\xe7\xfe\x4f\x96\x59\x2a\xe9\xa7\x1d\xd8\xb7\x2e\x92\xef\ \x15\xd9\x22\x4c\xcc\xdc\x5f\xfe\xb0\x15\x49\x0c\x29\xa7\x2a\x15\ \x6d\x21\x0a\xde\x42\x90\x43\x55\x33\x44\xbe\x0f\xfc\x80\xce\x41\ \xbf\x49\x21\xa1\xee\xd9\xa7\x21\xc0\x4b\x11\xfd\x62\x58\xf1\x65\ \x61\xf7\x7e\xd2\xf8\x2f\xb7\x65\x43\x1e\xf9\xb9\x87\xe4\xc8\xe5\ \xdb\xf3\x96\x41\xd4\xb9\x6e\x60\xb9\xbc\x40\xc1\x8c\xa1\x3d\xbf\ \xc7\x44\xac\xd1\xc7\x69\x98\x1a\x97\xbe\x55\xdd\xe3\xfc\xbc\x1b\ \x81\xfd\x83\x7d\x5b\x7c\xdd\x65\xc1\xff\xef\x8f\xff\xd7\x0e\xf6\ \x0f\x9a\x94\x75\x6f\xd9\xed\xef\x1f\x20\x4a\x62\xa1\x72\xb5\x36\ \xef\x72\x5b\x25\x71\x33\x28\xd3\x85\xeb\xb8\xf8\x70\xde\x07\x77\ \xcc\x19\xbe\x47\xd2\xde\x6b\xc6\x75\x59\xf6\x2d\x9c\x91\x53\xe4\ \x35\xdd\x6c\x47\xb2\x78\xfb\x91\xce\x8b\xdf\x1b\x7b\xe8\x73\xcd\ \x69\x91\x01\x73\xd7\xdc\x84\x43\x43\x5a\xff\x61\x7b\x15\xc5\x5e\ \x44\x86\xc9\xe3\xfb\x34\x5c\x87\xc6\xe2\xfe\xc1\x41\xaf\xdf\xe8\ \xe3\x2e\xc2\x27\xcd\x00\xa0\xd3\xf5\x30\xf0\xf9\xf8\x2e\xf4\x00\ \x9a\x30\x65\x69\xc5\x98\x7b\x3a\xa5\xbe\x95\x1e\xf8\xc9\x8b\x93\ \x75\xe6\xeb\xc3\xe2\xe3\xd1\x17\x2f\x5f\x5a\xc4\x3d\xdd\x76\x86\ \xaf\x5c\xd3\x45\x7a\x6b\xa2\x9c\xea\x74\x59\x6a\x98\xeb\xa4\x1e\ \xd6\x73\xeb\x24\x9a\x52\x69\xc9\xa7\x8e\xa0\xf7\x27\x5f\x8e\x83\ \x26\x41\x40\xd3\x13\x44\xea\x0f\x7a\x2f\x58\x95\x72\xcb\x22\x29\ \x79\x38\x89\x56\x1b\xf7\x16\x57\x06\xce\x94\x0e\xea\xa1\x78\xce\ \x39\x5a\xa8\xdf\xc2\xf1\x56\x11\x8f\xa1\x50\xdc\x42\xee\xd5\xd2\ \x80\x79\x27\x2c\x72\x7d\x79\xd7\x3e\x2b\x9a\xd7\x67\x3e\x85\x50\ \x71\xdd\x73\x6d\x07\xdf\x32\xbd\x6c\xab\x69\xfc\xbc\x31\x3a\x67\ \x67\x67\x16\xd1\xb7\x04\xb5\x30\xbd\xd1\x58\x5b\x4f\xbe\x3f\x5e\ \x4a\xc9\x63\xaa\x9d\x37\x10\x11\x32\x69\x28\xad\x4a\xf7\xbb\xd7\ \xfd\xf9\x17\xbb\xb8\xba\x84\xc1\x4f\x51\x91\x9b\x8b\x04\x77\x17\ \x1c\x55\xe3\xcd\x5a\x00\x8d\xbe\x30\x10\xb3\x72\x8f\xe7\x14\x44\ \x5a\x87\xb5\xd2\x83\x8b\x51\x18\x34\xe9\xc2\xbd\x0f\x85\x5c\x03\ \xca\x85\x69\xd8\xc8\x14\x38\x0b\xb8\xb0\xbd\xcf\x5d\x8f\x38\xb7\ \xa8\x0a\xe7\x3c\xbd\xd9\xce\xb1\x2c\x4d\x32\x3f\xee\x4f\xfb\x35\ \xe0\x03\x3d\xf2\xb8\xef\x48\x11\xe8\xfc\xfc\xba\xfe\xa3\x7f\xfc\ \x6f\x3e\x9c\x9f\x5d\x55\x4f\x3d\x48\x3a\x96\x3b\x49\x63\xf5\xfa\ \x59\x7b\xaf\x9d\x37\xab\x90\x39\x88\x91\x26\xfc\x70\xdf\x5a\x4b\ \x89\x58\xc3\x1c\x3e\xbe\x14\x14\xb1\x18\x3d\x48\x81\x32\xc7\x71\ \xd0\xe9\x13\xaa\x2f\x7a\xf5\x79\x5c\x52\x00\x00\xcc\x04\x7f\xc8\ \xb0\xec\x68\x65\xb9\xe4\xed\x5e\x1d\x1e\xb3\x9f\xbd\xaa\xe6\x3b\ \x8c\x18\x68\xb8\xc1\xf9\x02\x21\x1b\x25\xa6\x51\x07\x18\xea\x1e\ \x78\xad\xff\x47\xdd\x55\x30\x39\xb2\x24\xe7\xac\xea\x16\xcc\x2c\ \x3d\x46\x33\x33\x33\x33\x04\xdf\x6f\x32\x04\x87\x1d\x68\xa6\x60\ \x33\x3b\xc0\xec\x63\xe6\xc7\xfc\xde\xce\xb2\x46\x34\x6a\xac\x4a\ \x4f\x97\x2a\xef\xcb\xae\xeb\x95\xe4\xf0\xde\xc4\xbd\x8a\x50\x4c\ \x6d\xa9\xbb\x47\xb3\xaa\x2f\x2b\xf1\xcb\xce\xb7\x30\x5f\xcc\x23\ \x90\xc2\xb3\x3a\x15\x3d\xfc\xbe\xa2\x2c\x42\x04\x80\x19\x74\xd7\ \x00\x38\x53\x16\xf2\xde\x5b\xca\xa8\xa6\x9c\x6b\xca\x4c\x43\x23\ \x53\xd3\x88\xce\xe7\x54\x51\x46\x25\x59\xae\xc9\x50\x27\xe8\x3d\ \x7a\x04\x28\x92\x13\x0a\xa7\x70\x13\x40\xdf\x01\x77\x94\x8f\xc8\ \x47\x1f\x44\x59\x96\xa1\x67\x81\x6b\xdb\x58\xc0\x03\xbb\x39\xcf\ \xf3\xe0\x5f\x90\x04\x24\x22\x13\x7c\x3c\xeb\xd5\x3a\x34\x36\xf1\ \xec\x95\x09\x84\xf2\x63\x12\x55\x9e\x01\x98\x4e\x00\x6a\x07\xaf\ \x2e\xee\x41\x06\x29\x22\x04\x00\x3e\x0e\x72\x9d\xcd\x07\xb7\x2c\ \x42\xae\xd8\xe3\x4a\xeb\xb4\x46\x09\x01\x9c\xce\xb0\xe6\x18\xd5\ \x99\x2a\x7a\x25\x40\xf4\xaa\xfd\xb1\x08\xb9\x14\xec\x97\x2e\x5f\ \x4e\x81\x9f\x46\x18\x3a\x2d\xcc\x1e\x08\x7c\x49\xdc\x7b\x30\xac\ \xc0\x67\x9b\x8a\x3f\xf8\xa1\x57\xcb\xef\xf9\xee\xaf\x9c\x3c\xfe\ \xf8\xd5\x0c\xdd\xa3\x4c\xa4\x75\x63\xba\x7c\xf9\x38\x87\xfd\x9f\ \xaa\xee\x4c\xe3\xe9\x34\xd4\x40\x23\xec\xf7\xc5\x7d\xfa\x9d\x6b\ \x11\xcb\xa7\x2f\x8e\xe5\x0f\xf7\x0a\x94\x07\xc8\xf5\xf8\xb2\x35\ \x23\x0b\x92\x8e\x90\xc6\xa9\x4f\x12\xec\x10\x25\xe1\x7b\x6a\x9c\ \x25\x76\x20\xe0\x64\xc6\x75\x6d\xdd\x12\xfb\x7e\x9a\xa7\x22\x25\ \x86\x6a\xa8\x34\x99\xb0\x62\xd1\x85\x46\xf2\xe3\x47\x36\xeb\x67\ \x5c\xd2\x16\xe0\xcb\xc5\x22\xcc\xd9\x50\x70\xc2\x75\x42\xa2\x6e\ \xeb\xd0\xb6\x0a\xaa\x32\x4e\x73\xcb\x8e\x2c\xfb\x60\xf5\x96\x9b\ \xc2\x2f\xe6\x4b\xb7\x39\x2b\x7c\xb1\x29\xb8\xa9\x1b\x76\xec\x38\ \xda\xeb\x66\x34\x1e\x99\xf3\x1a\x75\x7b\xee\x69\xb6\xd7\x1e\xba\ \x6a\xa7\x47\x53\xcb\x21\x23\xb0\x03\xae\xd0\x5d\x43\xa0\xaf\xd6\ \x67\x41\x20\x75\x15\x9d\xec\x3d\xad\x16\x4b\x12\xcd\xeb\xe8\x28\ \x3c\xb3\x07\xb8\xbc\x23\x12\x69\x42\x95\x5e\xf0\x25\x74\x02\x03\ \x43\x85\xd2\xb4\xf7\xdc\x23\x3d\x5b\x22\x12\x52\xf4\x33\x1e\xe5\ \xf8\xfe\x24\x72\x41\x9e\x84\x10\xd6\x8b\x13\x30\x51\x93\x59\xa3\ \x49\x39\xf9\x7c\xfc\x3e\xba\x85\xa0\xa3\xa5\x79\x2c\x9a\x02\x3e\ \x3c\x16\xf7\xc3\x7e\xf2\xf0\x21\x0d\x14\xf7\x78\x9f\x74\x08\x56\ \x9a\x8e\x61\xea\x4c\x68\x3c\x0a\xeb\x48\xdb\x0e\x66\xc0\xd4\x9c\ \xde\x1b\x54\xf5\x31\xb7\x6a\xfe\x80\x68\xc1\x25\x93\x8c\x3f\xf6\ \x89\x37\xca\x6f\xfd\xe6\xa7\xc7\x5f\xfb\xb5\x4f\x8c\xd3\xd6\x5d\ \x97\xaf\x5e\xce\x53\xe0\xc3\xcb\x1f\xbc\xff\x28\x44\x49\x1c\x6c\ \xc0\x1a\xef\x88\xe5\xf7\xe7\x88\xe5\x02\xa7\xe9\xb3\x50\xf2\xa9\ \x78\xfe\x0d\xba\xcf\x20\xf6\x2c\x50\x03\xc7\x5c\xd0\xfc\xb0\x21\ \x90\x49\xa6\xdb\x6a\xc7\xa6\x16\x75\x53\xf7\x2b\x13\x3d\x25\xdc\ \xf0\x49\x04\x21\xd6\x29\x84\xeb\x50\x37\x10\x1c\x6f\x49\x33\xe8\ \x90\xf9\xb6\x5a\x2e\x49\xac\x88\xc9\x68\x42\x64\x29\xd8\xcc\x4e\ \xa2\x25\xea\x2b\xcf\xc8\x91\x61\xdf\x09\x0d\x7f\xf7\xe6\x9d\xf6\ \xf6\xf9\xab\xaa\xa2\xf6\xa6\x0b\x66\x10\xe5\x61\xda\x14\xd4\x09\ \x08\x11\xca\xc7\xc7\x47\xf6\x89\xa7\x9f\xc8\x9f\x78\xea\xb1\x3c\ \xcf\x47\xc6\x9b\x8c\xd8\xe4\xaa\xf9\x8a\x09\xad\xd9\xe6\xa7\x33\ \xba\x76\xed\xa1\xa0\xea\xaf\xd6\x6b\x31\x01\x3a\x8f\x7d\x10\x02\ \x69\xee\xfa\x7c\xbe\x24\xef\x1d\x9e\xa3\x4c\x8e\x30\x4f\x1a\x68\ \x82\x5d\xd8\x87\x75\x6b\x43\x81\x58\x10\x7e\x5a\xd4\xca\x7e\xf1\ \xec\xc1\xeb\xa8\xbd\xf8\x7d\x34\x20\x25\x3a\x15\x02\xdc\x5d\xeb\ \x83\xe0\xb3\xa6\xc7\x60\x91\x94\x66\x63\x3d\xcc\x59\x58\xa0\x18\ \x42\x00\x12\x50\x51\x9a\x69\x64\xeb\x70\x70\x14\xea\x79\x16\x34\ \x60\x59\x4f\x84\x57\x97\x9c\x65\x0d\xed\x08\xfb\x59\xcc\x1f\x54\ \x2a\x30\x46\x04\xf4\x73\x2f\x9c\xd4\x1f\xfb\xf8\xeb\x65\xeb\x1c\ \x8b\xc4\x99\x1e\x4d\x6c\x97\x00\x44\xc6\xa4\xf5\xfd\xf2\x19\x3b\ \x4a\x64\x48\x4e\x8b\x7c\x76\x2d\x28\xe1\xc4\x83\xea\x86\xfa\x7e\ \xcd\x00\x84\x13\x5f\x4b\x42\xa8\xad\x3a\x0c\xa8\xb9\x06\xad\xe4\ \xd5\xa3\x93\xaf\xed\xdb\xdf\x9a\x77\x5e\x6a\xef\x59\xcc\x00\x90\ \x52\x4a\xec\x38\xb6\xdf\x66\x32\xb2\xdf\x55\x4d\x02\x6b\x95\x4e\ \xd6\xd3\x0d\x21\xa6\x8a\x8d\xa1\x3b\xd5\x71\xc8\xb5\x0d\x9d\x2e\ \xe6\xe2\xc9\xd8\xb2\x27\x59\xd3\x51\x89\x09\x51\x0a\x7c\x0a\xe4\ \x29\xa7\x86\xaa\xf2\xcc\xbf\xf2\xc2\xcb\xd5\xa7\x3e\xfc\xa9\xe2\ \xed\x37\xaf\x37\x75\x04\x3f\xa3\x84\x3f\xf5\xe6\xa4\xf3\xee\x94\ \xf6\x6f\xbe\xf6\x56\xfd\x89\x8f\x7c\xaa\x78\xeb\xb5\xb7\x6b\xdf\ \x54\x9c\x53\x4d\x36\xc6\xc3\x85\xf3\xcf\x39\xa6\xd3\xf9\x3c\xfc\ \x1f\x64\x36\x0b\xa9\xc5\x4d\x5b\x87\xf8\x3d\x33\x68\xb6\x8b\xa2\ \xea\x9c\x96\x5d\x1d\x01\xdc\x39\x43\x6c\xbb\x00\x2f\x6c\x7f\xa5\ \x2d\x86\x70\x66\xeb\x41\xbb\xa5\xd5\x7e\x75\x0f\xfe\x5e\x4d\x7e\ \x22\x23\xb1\xdf\x75\x72\xaf\x44\x69\xc8\x93\xe7\x24\xa2\x44\xf0\ \x2f\x85\xb9\x87\x9e\x07\xe6\x66\x23\x1c\x6c\x61\xae\x19\x9d\xbc\ \xd3\x76\x0e\xda\xd0\x13\x8b\x6f\xc4\x06\xc7\x2a\x51\x5a\xeb\x8f\ \x8a\xd4\x4e\x33\x8b\x62\x07\xd7\x08\xf0\x6d\x62\xbe\x3c\x18\x27\ \xe0\xf0\xb8\x75\x7b\xe1\xde\xfb\xbe\x97\x8a\xe5\xb2\xf0\x86\xba\ \x54\xc5\xab\xf9\x20\xf0\x91\x47\x10\x7a\xa3\x69\x0a\x2e\x6b\x53\ \xee\xb5\x61\xb6\x55\xa4\x8c\xc2\x1e\x95\x18\x2f\xe6\xac\x24\x1e\ \xab\xfa\x77\xa1\x30\x83\xc7\x19\x39\xd5\x28\xf6\x01\x3b\x6d\xb8\ \x02\xd9\x7d\x36\xe9\x2a\x2c\x89\xd1\x8a\x82\x2b\x00\xd1\x6a\x07\ \x0f\x4e\x15\xd8\x72\x19\x51\xef\x54\xb3\x49\x51\x15\x49\xba\x6d\ \xb8\x49\xd2\x50\xe7\x8b\x85\xec\xdc\x90\x84\x63\x4d\x16\x9c\x6e\ \xde\xb9\x00\x40\xd8\xf8\x2d\x19\xae\xe9\xfa\x9b\x6f\xd7\x9f\xfc\ \xe8\xa7\x8b\xdb\x37\xef\x06\xbb\xe0\x40\xe0\xa7\x73\xd4\xbd\x3b\ \xcf\x27\x27\x27\xcd\x67\x3e\xfe\x99\xe2\xce\x79\x2a\x6a\xc6\x35\ \x59\x6a\xfb\x94\x5a\x9e\x43\x54\xc2\x79\x17\x1c\x55\xeb\xd5\x59\ \x38\xe5\xab\xaa\x0c\x3e\x83\xa2\x2a\x22\xe3\x31\xd3\x68\x32\x0e\ \x8e\x4b\x46\x34\x5b\xfc\x02\x69\xb9\xb3\xf2\x15\x41\xd5\x97\x50\ \x5f\xdb\x38\xb0\x07\xa9\x02\x19\x44\x38\x74\x7d\x02\x50\xaf\x34\ \xe7\x94\xd2\x1c\xdf\xb9\x24\x7a\xf5\x3a\x16\x10\xea\x05\xb8\x1f\ \x62\x4e\xab\x3a\xc1\xb1\x98\x6a\x0c\x24\xf3\x1e\xf0\x09\xd7\x84\ \x48\x40\x02\x7c\x5d\x1d\x1a\xf6\xc8\x68\x3a\x26\x32\x4a\xdd\x4f\ \x81\x9f\x90\xf6\x3e\x70\x01\x00\xe7\x60\xc5\xef\xfb\xe0\xcb\xe5\ \x0b\x2f\xdd\x6c\xce\x09\x40\xb3\x21\xe0\x6b\x3b\xff\xf2\x95\x2b\ \x0a\xec\x50\xef\xd3\x93\x40\x54\xfd\xd4\xae\x85\xa4\x05\x78\x45\ \x82\x43\x08\x48\xe6\xa2\x8d\x6a\xa1\x6c\x86\xa1\x82\x14\x15\x71\ \x4b\x5a\x68\x49\x85\x9f\xf8\x0f\x51\xa8\x23\xa8\x02\xd2\xdb\xd6\ \xc5\xeb\x95\xc7\xc6\xa2\xb8\x05\xa1\x80\x84\x2c\x04\xd5\x74\x21\ \x0c\x24\xdd\x97\x45\x4b\x58\x2e\x96\x42\x1d\xd6\xa5\xe3\x86\x57\ \x55\x96\x1d\x28\x63\x05\x61\xac\x71\xe7\x96\x9a\xaa\xe0\xe7\x3e\ \xf9\x5c\xf1\xe6\xeb\xef\x34\xe8\xd7\x7f\x18\xf0\xc9\xd0\x7d\xe6\ \x70\xd0\x36\x4d\xcb\xaf\xbf\xfc\x7a\xf5\xf2\xf3\xaf\x56\xe4\x6a\ \xce\x4d\x9b\xe6\x4a\x04\x6f\xbe\x38\x76\x57\xab\x35\xdd\x9b\xcd\ \x82\x00\x63\xdf\x8f\x04\x85\x53\xce\xc0\x89\xa7\x85\xbd\xa6\xe0\ \x02\xc3\x32\xca\x71\x05\x88\xad\x6b\x74\x17\x61\x24\x52\x11\xc2\ \xb8\xac\xb4\xd6\x54\x03\x00\x28\x21\x26\xd1\xd9\x18\x66\xa2\x3c\ \x88\x39\x65\x5c\x52\x20\xf3\x02\x6a\xb0\x11\x83\xbe\x8b\xb1\xd1\ \x08\x27\x3e\xae\xef\x0b\x81\xa3\xe9\x34\x01\x7e\x62\x06\x50\x57\ \x6e\x3f\xb6\xbd\xca\xdc\x14\xf8\xe9\xc2\x97\x4a\x00\x88\x4a\xf6\ \xca\x2b\xb7\x9a\xb7\xae\xaf\xa9\x69\xfc\xe0\xe6\xe2\xb0\x66\x3b\ \xbb\x92\x88\xf8\x3e\xe1\x19\x42\x18\x09\xaa\xbe\x06\x7e\x18\x00\ \x6f\x5a\x7b\xce\xaa\x31\x27\x80\xae\xfe\x57\xf0\x1e\x13\x22\x01\ \x69\x2f\x3c\xd3\x6b\x0d\x26\x55\x27\xb0\xe1\xb9\x47\xf1\x1c\x1c\ \x52\x52\x58\xc0\x5e\x04\x90\x41\x0d\x7a\xb8\x01\xf6\xa6\x56\xdd\ \xd2\x34\x5f\x32\xd0\x0c\x3a\x9f\x42\x59\x16\x31\x8a\x90\x05\xfb\ \xb0\x0d\xbd\xeb\x22\x98\xa2\xdd\x99\x51\x43\xc5\x7a\xe5\x3f\xfd\ \xb1\xcf\x15\xe7\xa0\xf3\xca\xea\x81\xf0\xc7\xf7\x91\xcc\xa1\x9d\ \x61\xde\x07\x3e\x58\xc5\xb7\x0f\x9c\xdf\x9b\xb5\xcf\x7d\xe6\x85\ \xb2\xa9\x4a\x1e\x99\x26\x5e\x83\xef\xaf\x03\x7c\xa7\x05\x54\x21\ \x75\xd8\x51\x19\x4f\x7f\x22\x38\xf7\xba\xf7\xc7\xe3\x09\x3c\xe6\ \x0c\x1a\x2d\xdd\x30\x36\x8d\xcf\x73\x98\xe3\xf0\x70\x92\xdc\xc4\ \xa4\x58\x91\x8d\x06\xbe\x36\xfa\x41\xb6\x4a\xb2\x9e\x84\xfd\xd4\ \x33\x62\xfe\x37\xe6\x94\x9a\xb4\xa6\xe7\x50\xf4\x50\xf5\x75\x7e\ \x88\xae\xb7\x86\xda\x0f\x80\x27\x73\xea\xb2\x2d\x13\xe0\x9b\x34\ \x12\x40\xa3\xc9\xc4\xec\x01\xfe\x83\x25\x05\x3d\x64\x98\x7c\x92\ \xbd\x79\x7d\x4d\x77\x66\xa5\xe4\x81\xeb\xbf\x31\x64\xff\xe5\xf9\ \x48\xb3\xef\xe8\x39\xd4\xaf\xa4\xf1\x83\xd2\x99\xd5\xf5\x9c\x76\ \xd4\x8d\x0c\x38\x60\x7c\x67\xb9\x46\x9b\xda\x8c\x58\x3e\xfb\xbe\ \xcd\x2f\xf7\x1a\x36\x08\x37\xca\xdc\x1a\x62\xc4\xec\x70\x5a\xc5\ \x92\x55\xf4\x1a\x80\xbf\x00\xa5\xfe\x56\x57\x2d\x62\x4b\x23\x74\ \x19\x00\xd1\x3d\x0f\xed\xcd\x38\xc4\xdc\x29\xfa\x03\xba\x70\x9b\ \x73\x1c\xb2\xfa\x74\xea\x69\x6e\x1a\x5a\xaf\x56\xfe\xb3\x9f\x7e\ \xbe\x68\xdb\x86\x05\xf8\x9c\x00\xdf\x24\xf3\x61\xe0\x23\xd3\x6d\ \x00\xf8\xa0\xe6\x22\x63\x8a\xcd\x86\x9f\x0f\x42\xa0\xe2\xdc\x36\ \x44\xa8\xbd\x0f\x25\xc7\xcb\xe5\x8a\x46\x79\x26\xbe\x9c\xe0\xf5\ \xf7\xcc\xdd\x4b\xb4\x9c\xd8\x04\x56\xce\x48\x68\x78\xbe\x9f\x7e\ \x09\xdc\x52\xc2\x9e\xcc\xdc\x99\x5e\xb0\xde\x51\x82\xdc\x07\x38\ \xee\x04\xd8\x19\x5a\x81\x06\x2c\xc5\x3a\x11\x71\x44\x72\x14\x30\ \x9c\x02\x11\x9e\xfd\xf8\x8c\xde\x1c\xc0\xff\x82\x39\x81\x12\x53\ \x06\xd8\x71\x20\x00\xe0\xa1\x0a\x73\x18\xf8\x00\xf5\x78\x3a\x32\ \x07\x01\xdf\x3c\xb0\xe6\xa0\xfb\xc7\xe5\xab\x97\x72\x66\xa2\xd3\ \x45\x4d\x67\x9b\x96\x9e\x7a\xfc\x88\xa6\x47\xb9\xa8\x7d\x41\xfd\ \x87\xaa\x8f\x2f\x06\x73\x15\xd2\x83\x7d\x99\x5c\xcf\x89\xd0\xb0\ \x98\xeb\xe4\x72\x55\x59\x17\xdc\xba\x1e\x71\x7d\x29\xe0\xa6\x6c\ \x3b\x67\xb8\x58\x93\xcf\x04\x87\x90\xa8\xf4\xf0\x50\x87\xaa\xa1\ \x70\xb5\x8b\x5a\x4b\x6f\xab\xe9\xb0\x1f\x25\x64\xa7\x46\x50\x8a\ \x6a\x42\x39\xfd\x29\x36\xc6\x5c\xaf\x37\x81\x3e\xcc\x92\xdd\x7a\ \xd2\x4d\x88\x04\xf4\x6c\xdb\x9c\xda\x2e\x6b\xcc\xbf\xf8\xb9\x17\ \x0b\xdf\xb6\x00\xbd\x80\x3d\x6d\xd8\x89\x39\x2e\x4b\xbb\x3a\x2b\ \xe0\xa7\xde\x7b\x28\x3e\x92\x0f\x50\xf1\x8b\xcf\xbd\x54\x7e\xdb\ \x77\x7d\xeb\x34\xcb\x33\xe3\x28\x13\xe7\x5e\x08\x59\x4e\xa7\x93\ \x6d\x0f\x01\xe2\xe0\xb5\x77\x1d\xcd\xd7\x24\x70\x0a\x8a\xd0\xeb\ \x7c\x1a\x61\x5d\x00\x20\x43\x93\x7a\x58\x25\x28\x65\xc8\xcc\x39\ \x0f\x17\x9e\x87\x16\xe0\x39\x23\x43\x51\x93\xf3\x8c\x2e\xce\x62\ \xdb\xdb\x28\x78\xa3\xb0\xcd\xb2\xd0\xc9\x94\x6c\x16\x3d\xc2\x21\ \x6d\x97\x05\x4c\x60\xbd\x52\xde\x7b\x9d\x7d\xc8\xc2\xc3\x60\x4c\ \x0c\x3f\x72\xff\xe0\xb7\x71\xee\x3d\x51\x66\xe3\xb3\xc0\x39\x60\ \x09\x34\x74\x79\x30\xf5\x6c\xf8\xdb\xe4\x9a\xd4\xe3\x3f\x19\x8d\ \x91\x89\x77\xff\xb2\x60\x60\xe2\x22\x04\xc0\x95\x2b\x97\x33\x99\ \xd7\x8d\xa7\xb7\x4e\xce\xe8\xf2\xa5\x11\x3d\xf1\xd8\x11\x8d\xf2\ \x98\xe5\x94\x14\xee\x90\x06\x39\xf7\x10\xa4\xe9\xb8\xe2\xf5\x69\ \x01\x90\x20\x0d\x25\xbe\xf0\xf8\x4b\xba\x6d\xbf\xe3\xad\x27\x23\ \x09\x1d\xb0\x03\xbc\xe8\x0b\x88\xf1\x12\xc1\x5c\x4b\x68\x6d\x7a\ \xb1\x7c\xef\x5a\xa5\x0e\x62\x3d\x4c\x92\xbc\x7f\x36\x9c\x30\xfd\ \x88\xe6\x91\x01\x98\x26\xeb\x04\x4a\x77\xaa\x0b\x59\x65\x27\x00\ \x62\x4f\x44\x64\x40\x5a\xe3\x88\x5c\xcb\xe7\xe0\xaf\xaa\xa4\xb7\ \x80\x4c\x07\xc0\xfe\x40\x80\x8f\xc7\x84\x48\x01\xbf\xf2\xe2\x6b\ \xd5\x37\x7d\xdb\x37\x4c\x8d\x99\x74\x4f\x90\xe8\x4a\xe7\x03\xe8\ \xba\xdc\x4a\x3a\x76\xe8\x7e\x74\x75\x3c\xd6\xed\xdf\x42\x93\xcc\ \x55\xb3\x8a\x1b\xdd\xe2\x64\x64\xa2\xba\xdd\x86\x6e\x5b\x6f\xc8\ \xf9\xad\x5f\xc0\x39\xde\xfe\xdb\x21\xcb\xf1\xe1\x47\xc6\xc1\x31\ \xaa\x99\xab\x52\x47\x66\x6a\x0a\x5b\x8b\x62\xaf\x74\xcd\x18\x34\ \x29\xcf\xf3\xee\x9a\xee\x3d\x4f\x59\x46\x61\x2d\xb3\x4c\x79\xc6\ \x61\x8d\x20\x04\x22\xf0\x13\x12\x52\xf1\xf9\x28\xfe\x52\xee\xae\ \xcb\x55\x24\x90\x28\xde\x1b\xb1\x11\x9b\xaf\x94\xbe\xbc\x6f\xdd\ \x7f\x3e\x1e\x19\x20\x7d\x30\xec\x87\xf5\x8b\xd0\x00\x8e\x8e\x26\ \x76\x34\x1e\xd9\x74\x7d\x7d\xd6\x04\x6d\xe0\xe1\x6b\x63\xfa\xf6\ \x6f\xbb\xa4\xf2\xf2\x11\xbf\xd7\xc0\xd7\xbd\xdd\xb4\x70\x40\x98\ \x10\xde\x71\x42\x3e\x7b\xc2\x86\xab\x8b\xca\x25\xde\x8b\xc4\x0b\ \xe4\xee\xeb\xb4\x51\x16\x15\x10\x7e\x9a\x78\x2f\xa3\xb7\xbf\x2e\ \x03\xe8\xa7\x2c\xab\x9a\x04\x66\x82\x99\x40\xfd\x5a\x7f\x94\x12\ \xc3\xd6\x16\xf5\x5f\xd4\xd2\x62\x53\x48\xd8\x2b\xa4\xf7\x32\x51\ \xc8\xbd\x97\xcf\x1d\x36\x21\xb5\xf4\xca\x2b\xaf\xd5\x9b\xa2\xf0\ \x43\x5f\xb6\x31\x5f\x5a\xe0\xeb\x5f\xb6\x9c\x2f\xfc\xad\x1b\xb7\ \x9b\xa7\x9e\x79\x72\xd4\xd2\x54\x54\xe1\xe0\x18\x2d\xca\x92\xa6\ \x93\xe9\x36\x3e\xef\x7d\x30\x61\xba\x72\x61\x4f\x39\xf9\x86\xc8\ \xd3\x11\x2d\xce\x0a\xda\x94\x4d\xb8\xbe\x71\x86\x5a\xc7\x09\x13\ \x93\x4f\xc0\xcd\xbd\x72\xdc\xa2\xa8\xbb\xf4\xd8\x24\xdd\x16\x07\ \x08\xd6\xb0\x8f\xa4\x08\x09\x8c\x3f\x58\x13\xf3\xce\x87\xbc\x17\ \xf9\xbb\x91\x7d\xaa\xb5\xbd\x2c\x8b\x02\xc1\x74\x02\xc2\x53\x66\ \x3d\x8d\x2c\x93\xb1\x8e\xba\x81\x70\x32\x7e\x7f\x1a\x04\x30\x94\ \x68\x02\xd1\x0f\x50\x55\x55\x1a\xe3\x87\x99\x30\x19\x9b\x5d\xc0\ \x57\xa5\x01\x17\x23\x00\x2e\x5d\xb9\x7c\xdf\x6b\x99\x99\x66\xf3\ \x8a\x9c\x7d\x94\xd8\x5c\x26\xf2\xeb\x68\x4a\xeb\xe4\x1e\x54\xf8\ \xe9\x13\x1f\xda\xb9\x94\x6d\x82\x17\x6f\xa8\x83\xb0\x1c\xb2\x66\ \x9b\xb1\x07\x5e\x7b\xaf\xff\xa7\xa1\x5e\x26\x2a\x33\x54\x39\xd6\ \x54\x52\x5a\x68\x68\x67\x94\x38\x00\xe1\x41\xd6\x44\xa0\x12\x44\ \x32\x11\x60\x8e\x94\x83\xd3\x80\x74\x53\x36\x94\x34\x04\x2d\x8a\ \x0d\x19\xd4\xe1\x77\xaa\xb6\x08\xac\x08\xd6\x96\x3a\x86\xd8\x5b\ \x37\xee\xb4\x00\xe6\x6e\xe0\x03\xec\xfb\x80\x1f\xae\xb8\x2f\xf0\ \xf5\x0f\x7d\xcf\xf5\xb7\x4f\x9a\x47\x1f\x7b\x38\xcb\x27\xb9\x6d\ \x39\x0f\xbf\xbb\x71\x9e\x6e\xdd\x5a\xd0\xa3\x4f\x1c\x53\x51\xb4\ \x54\x37\x4c\x76\xe4\xe8\xda\xb5\x47\x88\x15\x25\xf9\xba\x3a\x0e\ \xe9\xcd\x69\x83\x0c\x6b\x01\x64\xa4\xd7\xa6\x45\x42\x14\xc2\x8c\ \xd3\x29\x04\x4f\x26\xe6\xb7\x00\x1a\x67\x45\x72\x6f\x5a\x4b\x80\ \xb5\x3e\xd9\x48\xaa\xb5\xc2\xc3\xef\x5c\xf7\xfc\x6d\x82\xb5\x69\ \xb1\x57\xb6\x9a\x43\x4b\xa3\x8c\x29\xb7\x2d\xe5\x99\x27\x36\x0c\ \x21\x30\x94\x13\x84\x12\xe1\xc0\xb7\xa0\x00\x9e\xee\xd5\x90\xb9\ \xd9\xe1\x87\x45\x38\xa6\xc0\x87\xc3\xf9\x22\x4c\x80\x90\x9e\x68\ \xf7\x6b\x09\xc7\xc4\xe6\xfc\x65\xa7\x64\xa8\x20\xe3\xce\x04\xf8\ \x3a\x34\x28\xaa\x19\xe0\xcd\x00\xbe\xae\x43\xd6\x94\x43\x70\xb2\ \xf5\x33\xf6\x8c\x24\x91\x64\x41\x20\x00\xf8\xac\x29\xad\x0d\x58\ \x5f\x2c\x54\x7d\x12\x41\xa4\x33\xca\x44\x68\x85\x35\x8e\x9d\x60\ \x49\xfb\x11\x00\x30\x79\x5c\x14\x03\xf2\x85\x49\xf3\x4c\xef\x3b\ \x15\xd3\xa2\x71\xa9\xe9\x04\x8a\xa3\xa6\x45\xd8\x6f\xeb\x54\x73\ \x48\x45\x0d\x9f\xd7\xd1\x6b\x2f\xbf\x5e\x03\xe0\x87\x02\x9f\x0f\ \x07\x3e\xde\xdb\x09\xfc\xba\x76\x3c\x5f\xac\x79\x71\xba\xe1\x77\ \x4e\x96\xe5\xb7\x7f\xdf\x77\x1d\x9f\x9e\x8d\xe9\xac\x72\xd4\xb6\ \x4c\xdd\xf8\xea\xaf\x9e\x76\xe9\xc2\x91\x25\xa8\xa4\x4b\x57\x3c\ \xd2\x84\x63\x19\x6c\x97\x48\x24\x7d\x05\x45\x15\x07\xd1\x14\xa8\ \xca\xe4\x1e\x0f\x85\x2d\x36\xfb\xc4\xc9\xed\x3c\x53\x66\x51\x2d\ \xd8\x6f\x32\x8a\xb3\x40\x9e\xae\x85\x00\xd6\x0e\x17\x02\x5a\x90\ \xc0\x37\x61\xc8\x99\x11\x35\x2d\x91\xb5\x93\xf0\x7e\x6e\x5d\xd0\ \x18\xc6\x59\x13\xcc\x09\x1c\x14\x00\xbe\x24\x0f\x75\x5a\x52\x72\ \x48\x25\x00\x0f\x5d\xab\x8c\x77\x1e\xec\x40\x71\x9d\x1f\x3c\x23\ \xd0\xfe\x31\x99\x4e\x32\xda\x33\xba\x72\x52\x94\xec\x1e\x13\x67\ \x47\xc4\x5c\x92\x31\x1b\x22\x6e\x91\x57\xaf\x73\xab\xd2\xaa\xa9\ \xa4\xc3\x8d\x51\xa7\xae\x90\x7c\x30\x83\xc8\x83\x13\x52\x8f\xbe\ \xef\x50\x48\x22\xe2\x60\x78\x4e\x25\x6e\x0d\x11\x0d\x56\x5e\x13\ \x55\x47\xef\x10\x09\x50\x9a\xbd\x12\x28\x78\x2e\xab\x2a\x40\x66\ \x96\xfe\x07\xb1\x30\x08\x5a\x4c\x51\x14\x20\xe7\xb0\x59\x2c\xac\ \x41\x3a\xa9\xe5\x86\x4e\x67\x73\xb7\xd9\x14\xfe\xff\x0b\x7c\x32\ \x89\x4e\x60\xee\x0f\xfc\x62\x53\xf1\x6c\xb6\xf6\xa7\xa7\x6b\xbe\ \x77\x6f\xc1\xf7\x4e\xcf\xfc\xec\xde\x92\xbb\xfa\x10\xcd\x19\x31\ \xba\xf4\xc8\xe4\xca\xa3\x4f\x65\xce\x8f\xe5\x6e\x5a\xcc\xe7\x1d\ \xaf\xbd\xd4\x3b\x04\x0d\xe7\xf2\xe5\x2b\xa2\xa2\x87\x62\xa6\xce\ \x0f\x22\xe9\xc1\xce\x0b\xe0\xa1\xc6\xbb\x28\x18\x14\xe0\x10\xeb\ \x6f\x5d\xbf\x7f\x82\xc1\x33\xcc\xb0\x10\x50\x87\x00\xd6\x74\x9d\ \x40\xaa\xf9\x28\x21\xa0\x89\x63\xc0\xf9\xd0\xa7\x5a\x83\x33\x5b\ \x99\x16\x8d\xcb\xc8\xf9\x2e\xbc\x3b\xa2\x86\x47\x34\xce\x99\x8c\ \xa9\x29\x37\x15\x65\xda\xa8\x65\xee\xc0\x9d\xb4\x65\x4b\xeb\x4b\ \x28\xf0\x22\x54\xde\xed\x00\xbe\xcc\x2f\x40\x03\xe8\x2a\x94\x68\ \xf7\xe8\xd4\x34\x64\xf4\x09\xa8\xcd\x51\x78\x11\x57\xc4\xee\x8c\ \x98\x9a\xbe\xaa\x0f\x3f\xba\x06\xb5\x2e\xd4\x01\x09\xa6\x86\x92\ \xb0\xf2\x3a\xaf\x34\x09\xd5\x93\x4e\xa9\xf7\x26\x00\x94\x7b\x26\ \x8b\x01\x9a\x55\x25\x97\x64\xec\x79\xa1\xfe\x4a\x9b\x9a\x28\x0e\ \xfb\x61\xea\x2b\x24\xae\xc4\x40\x84\xcd\xb7\xb9\xeb\xf1\x1a\xa1\ \xbf\x92\x90\x5d\xe3\x5a\x90\x52\x44\xfb\xff\xe4\x9d\x93\xe6\x00\ \xe0\x43\xbb\x21\x1a\x3a\xf5\x21\x1a\x0c\xd6\xcb\xa2\x3a\x07\xf7\ \xca\xcf\x66\x67\x3c\x0b\x40\x5f\xfb\x7b\x77\x97\x5c\x94\x0d\xd3\ \x9e\xe1\x99\xe9\xb3\x9f\xf8\x7c\xf9\x93\xbf\xf0\xc8\x25\xa2\x91\ \x7c\x0c\x5a\x2e\x17\x44\xcc\x94\x45\x61\x57\x95\x65\xe0\x10\xd0\ \x6a\x45\x67\xc3\xaf\xa5\x8e\x80\x50\xd9\x97\x68\x04\x10\x5a\xba\ \xde\x23\xf2\x17\x4e\xc6\x23\xf5\x4c\x3c\xc3\x02\x98\x3b\x85\x80\ \x16\x38\xe9\x1a\x84\x80\x5e\x53\xcf\xa3\x61\x21\x60\x55\x1a\xb2\ \xf8\x19\xa4\xc7\x7e\xeb\x33\x62\xce\xa8\xa6\x8e\x55\xc9\x51\x6e\ \xba\xea\xca\x86\x88\x7c\xd4\xfe\xd2\x3a\x00\xee\x81\x3a\xcf\x73\ \x53\xd5\x35\xef\x00\xfe\xc5\x39\x01\xa7\xc7\xd3\x83\x34\x00\x8c\ \xc4\x11\x68\x26\xe4\x28\xa3\xd6\x8c\xc9\xf8\x92\x4c\xc8\x39\x6f\ \xd3\xca\xbf\x2f\x66\x18\x52\xf5\xe7\xe4\x3d\xec\x28\x96\x84\x0f\ \x38\x6c\x8c\xc4\x78\x41\xdc\x82\x9e\x05\x1e\x71\x59\x1b\x27\x3e\ \x6a\x09\x9e\x11\x2d\x40\x62\x90\x97\xee\x2e\xea\xf4\x47\xf8\x91\ \x54\xa2\x0e\x72\x11\x54\x0e\xc1\x17\xb8\xf8\xe2\x26\xf1\x52\xb0\ \x14\xd2\x65\x43\x41\x08\x99\x90\x62\x8c\x7e\x07\x1c\x78\x06\x79\ \xb9\x58\xbb\xe1\xf0\xde\xe1\xc0\x5f\x6f\x4a\x9e\x9f\xae\xdd\xec\ \xf4\x8c\x67\x77\x97\x5b\xa0\xcf\x96\x5c\xee\x01\xfa\xbe\xf1\xd2\ \x73\xaf\x56\x3f\xfe\x33\x3f\x72\x9c\xe7\x2e\x84\x05\xc5\x54\x5a\ \xad\x97\x21\x0d\x9c\x3d\x87\xf4\x60\xd3\x3b\x9c\x38\x84\x0c\x3b\ \x01\x90\x7c\xc7\xa9\x46\x80\x9c\x01\x25\x08\xa4\x91\x88\xf3\x79\ \x50\xfd\x99\x75\x2a\xb9\x18\x5d\x5a\x03\x3c\x48\x08\x60\x8f\x40\ \x08\x0c\x6a\x09\xb2\xa6\x85\x80\xdc\x0c\xc7\x22\xae\x67\xcf\xc8\ \x77\x89\xc3\xf9\x8c\xbc\x39\xa6\xba\xe6\xe0\x2f\xa8\xda\x4d\x48\ \x75\x1e\x8d\x73\xec\x97\x04\xe0\x36\xcf\x4d\x42\x30\x92\x78\xff\ \x2f\xce\x04\xe8\xbe\x40\xbb\xf3\x41\x79\x1e\xec\x9a\x7d\x83\xd9\ \x06\xcf\x30\x71\xf7\xda\xd6\xae\x1b\x53\x91\x21\x97\xc4\xd9\xb9\ \xc7\xbd\x4f\x92\xc9\xe3\xbd\xf6\xf8\x40\x22\xb3\x3e\x41\x40\x44\ \xc9\x72\xbd\x91\x55\xb1\x1d\xd5\x3a\xc3\x36\x33\xc4\x30\x03\xbc\ \x47\x97\x24\xaf\x75\x0f\x71\x52\x8a\xca\x2a\xe0\x63\x68\x29\xb1\ \x8d\xb9\x14\x9d\x1a\x1b\x48\x57\xc2\xfb\x42\xb0\xd9\x7a\x80\x81\ \x43\xd2\x0f\xd3\x9d\x3b\xb3\xf6\x40\xe0\x87\xb5\xe5\xb2\xe4\xd3\ \xd9\x19\x9f\x2e\x56\x3c\x9f\x75\x20\x5f\xf3\xe9\xe9\xca\x57\x75\ \x4b\x0f\x7e\x84\xea\x44\x3e\xb9\x7e\xb3\x79\xe6\xab\x8f\xc6\x8e\ \x2c\x4a\xc9\xd7\xab\x50\x09\xea\x69\xab\x91\x39\xdf\x86\xe4\x26\ \x11\xee\xc1\xe9\x85\xa6\x22\x0a\x84\xc3\x1a\x01\x33\x72\x04\x24\ \xe2\x30\x99\xc0\xbe\x07\x68\x61\x2a\xd8\xed\x1a\xa0\x9e\xc8\x84\ \x14\xf0\x00\x2f\xd6\x98\x77\x68\x09\x62\xc3\xcb\x5a\xfc\x99\x46\ \x17\xe4\x34\x1f\x1e\x86\x5a\x97\x51\x51\x4f\xe9\xbf\x3e\xf0\x32\ \x3d\xf9\xc4\x15\xfa\xea\x67\x1f\xa1\x6b\xd7\x8e\x93\x12\x61\xd4\ \x8d\xec\x01\xfe\xc5\x38\x01\xf3\x3c\xdb\xf9\x5b\xac\x8d\x09\x2d\ \xc9\xc9\xaf\xe7\xcc\xa9\x6a\x95\x53\xcb\x19\xb1\x9f\x06\x1f\xba\ \xa5\x2d\x89\x85\xa1\x56\xc2\x7b\xfd\xf2\x5c\x56\xcc\xbb\x56\xc5\ \xf2\x8d\x81\x04\x10\x7f\x00\xa5\x5e\x7e\x29\xcf\x55\x82\x85\x59\ \x7f\xc7\x4a\xbd\x43\xd9\xa9\x91\x1c\x04\xab\x93\xcf\x4d\xc2\x4a\ \xe8\x13\xe9\x2d\xfd\xe7\x32\x34\x15\x21\x1f\xd3\x65\x89\x38\xa6\ \x05\xbb\xa6\x4e\xfa\xbc\x39\x5a\xcc\x57\xce\x90\x51\xc0\xdf\x6e\ \xfe\xe5\x72\xc3\xf3\x4e\x6d\x9f\xaf\xfd\xec\x74\xc5\x8b\xd3\xb5\ \x3f\x9d\x6f\xb8\x75\x8e\x2e\x7a\x5c\x7f\xeb\xa4\xfd\x8a\xaf\xf9\ \xaa\xb1\x41\x94\xb7\x3b\xdd\xc5\xe1\x2b\x1d\x9f\xba\x8c\x37\x41\ \x62\x57\x21\x88\xd0\x1d\xac\xe1\x41\x8d\x40\x00\x25\x82\x51\x9c\ \xb1\xda\x2e\x67\x05\x78\xed\x38\x34\x8c\xf0\x9f\xc5\x7b\xfa\xb9\ \x87\x0b\x81\x44\x68\xa4\xa1\x58\xad\x7f\x32\x93\xf6\x07\x84\x9f\ \x11\x0e\x89\xe9\x09\x66\xe5\xee\x9a\x1b\x37\x97\xe1\x75\xf5\xf2\ \x94\xbe\xea\x2b\x1f\xa1\x67\x9f\x7a\x48\x34\x0c\x74\xc5\x4a\x80\ \x9f\x46\x05\x2e\x44\x03\xb0\x76\xaf\x00\x08\x2f\xfd\x1f\xb8\x53\ \xbd\x4f\xd6\x98\xb3\xa0\x19\x38\x3f\xa5\x30\xb8\x0d\x02\xc1\x66\ \x8e\x28\xb0\xd8\xa0\x97\xbb\x91\x0c\x3f\x32\xa1\x3c\x97\x9d\x47\ \xab\x6b\x71\x9a\x2a\xb6\x07\x8e\x04\x12\x88\x1d\xcb\x1c\x15\x68\ \x2c\x47\x0d\x0b\xf8\x52\x86\x30\x43\xe8\xc3\x03\x1f\xb3\x50\x87\ \x41\xe2\x43\x85\xb5\xa6\xef\x59\xae\xdb\x96\x84\xfe\x99\x54\x1f\ \x04\x49\x68\xaa\x2b\x47\x2f\x3e\xf7\x46\x7b\xfb\xde\xc2\xaf\xe6\ \x67\x3c\x5f\x9d\xf9\xd9\x6c\xc3\xeb\xd5\x86\x3d\x33\x7d\xb9\x8c\ \x9b\xd7\x6f\x35\x86\x3d\x91\x0a\xcd\xd6\x55\x19\x7c\x00\xde\xc4\ \x74\xe1\xa6\x8b\xdd\x4f\x91\x42\x9d\xd9\x40\x66\xea\x5a\xa7\x13\ \x82\x06\x34\x02\x1a\x72\x14\x6a\xea\x33\xac\x25\x42\x20\x49\xbf\ \xdf\x2b\x04\x60\x59\x26\x6b\x10\x4c\xf2\xde\x0e\xa7\x20\x0f\x3a\ \x05\xc9\xd0\x2e\x1c\x84\x97\x1e\xcb\x75\x49\x9f\x7b\xfe\x84\x5e\ \x7e\xed\x0e\x7d\xcd\xb9\x20\xf8\xaa\x67\x1e\xd1\xbd\x3a\x52\xe0\ \x27\xf3\x0b\xa8\x05\xb0\x76\xf7\x6f\xca\xb2\x4c\x57\xa1\xed\x4f\ \x56\xd9\xb3\xc6\x81\xf2\xe2\x88\xea\xf6\x12\x55\xee\x61\x2a\xdb\ \x6b\x54\xfb\x63\x72\x3c\x25\xe7\x47\xc4\x36\x8b\xc4\x8c\x92\xe4\ \x2f\xc0\x8f\xea\x37\x08\xf2\x74\xa2\x75\x9c\x93\xe2\xcc\xd7\x94\ \x7f\x41\x14\x44\x65\x02\x76\x5d\x8f\x8f\x30\x55\xc2\xb0\x49\xc3\ \x1c\xf4\x5f\x9c\xb0\xc6\x74\x20\x69\x69\x5d\x38\x9a\xaf\x1d\xdd\ \x9d\x35\xf4\xca\x9b\x2b\x7a\xee\xd5\x25\x7d\xf2\xb9\x39\x7d\xe4\ \xd3\xb7\xe9\xc3\x9f\x78\x8b\xff\xfa\xef\x3e\x50\xbd\xf7\xbd\x9f\ \x6f\x3e\xf5\xd9\x37\xda\x37\xde\xb8\xe3\x97\xcb\x33\x80\xff\xcb\ \x64\xcc\xee\x9e\xba\xed\xdf\xe9\x45\x6d\xdd\x92\xa5\x36\x55\x4c\ \xc1\x65\xf8\x6e\x50\xbe\x13\x55\x5a\x09\x9b\x46\x21\x9c\x64\x8a\ \x21\x2d\x1c\x60\xe6\xad\xad\x8d\x62\x20\x30\x40\xc7\x35\x59\x87\ \xb3\xd2\xab\xb9\x7e\x8f\x09\xf7\xc2\xf1\x9b\xae\x41\x08\x40\x9d\ \xc7\x67\x11\x67\x2f\x64\xbe\x2a\x73\x96\xa5\xa1\x62\x25\xac\x05\ \xbc\x0c\x8d\xaa\x6a\xe8\xc5\x57\x6e\xd1\x7f\xbe\xff\x45\xfa\xe8\ \x47\x5f\x76\xe5\x59\xdd\x6f\x21\x66\x06\xe7\x17\x20\x00\x32\x4b\ \xfb\x04\xc0\x01\x63\x50\x48\x1c\xb2\xe6\xc9\x92\xe3\x09\xd5\xee\ \x88\x6a\x7f\x99\x8a\xfa\x2a\x9d\x35\x0f\x51\xe9\xae\x50\xd5\x9c\ \xaf\xb9\x29\xb5\x3c\x21\xe7\x46\x21\x3e\xeb\x58\x90\x6d\x50\x11\ \x98\x14\x54\xb3\x6e\xdf\x65\x60\x26\x68\xea\x6b\x91\xf0\x3a\x73\ \xcd\x24\x2a\x42\xeb\x88\x3a\x93\xbb\xa8\x88\x16\x1b\xa2\xd9\xca\ \xd3\xdd\xb9\xa1\xbb\x8b\x9c\x6e\x9f\x8e\xe8\xfa\xdd\x9c\xde\xbc\ \x3d\xa2\xcf\xbf\xba\xa1\x97\x5e\xdf\xd0\x1b\xd7\x4b\x3a\xb9\xe7\ \xe8\xe6\xdd\x92\xe6\xcb\x9a\xca\xca\x87\x4d\xb1\x59\x6f\x1c\xbd\ \x0b\xc6\xa6\x28\xb9\x6d\x5a\x36\x12\xb6\x8d\x2f\x2f\x54\xef\x56\ \x92\xb2\xe5\x3d\x54\x83\xca\xbf\xa5\x20\x8a\xd1\x58\x13\x42\x40\ \xd7\xed\x47\x90\x4b\x07\x26\xe7\xc3\x1a\xc0\x2a\x6b\x71\x11\x3f\ \x77\x09\x01\xcc\x21\x04\x92\x35\x59\x54\xc0\xd7\x43\x0a\x7e\xf0\ \x9e\xe6\x2a\xbc\x2f\xf0\x35\x0e\x76\x02\xb7\x75\x9e\x3e\xf9\x99\ \xd7\xdc\xaf\xff\xe6\x9f\x6d\xfe\xfd\xdf\x3e\xde\xd4\x75\x33\x0c\ \xfc\x0b\xc8\x04\x14\x80\x9b\x3d\x4e\x40\xa8\x3b\x18\x3b\xd7\x52\ \xf5\xc8\x27\x6b\x50\xf7\x90\x44\x61\x10\x32\x8b\x49\x3b\xdd\x7b\ \x59\xb8\x97\x9b\xb8\x11\x5a\xf9\x62\x7c\xbc\x1f\x1b\x8d\x48\xba\ \x9c\xe8\xb2\x51\xa8\x6d\x24\xdb\xda\x7b\x9a\xad\xb6\xb5\x72\xde\ \xfb\xb8\x09\xb3\x90\xab\xee\xd9\x86\x66\x1d\xec\x65\x43\x5a\xc4\ \xac\x99\xe3\x3d\x1d\x7f\x62\x06\x7e\x63\x03\x22\x4b\xa3\x78\x10\ \x34\x69\x75\x47\xe9\x45\xef\x92\xd1\x34\x0d\xe7\x63\x36\x86\x49\ \x01\xd2\xa9\xc2\x1e\xd2\xa9\xec\x12\x26\x44\x08\x56\xfc\x39\x01\ \x2c\xfe\x00\xb3\x00\x1a\x9c\xee\x35\xc0\x49\xc1\x4d\x9a\xed\xe7\ \x75\x98\x70\xf8\x7a\xa8\xf9\xd0\xf0\x52\x3f\xc0\x2e\xa7\x20\xc2\ \xb8\xf8\x7c\xe1\x95\x9a\xbd\xfa\xb9\xd6\xda\xfd\x98\xb3\xd6\x14\ \x45\xcd\xff\xfc\x2f\x1f\xac\xff\xe7\xbd\x9f\x6e\x7e\xf5\x57\x7e\ \x78\xfc\x23\x3f\xfa\xed\xb9\x1c\xb6\x88\x3a\x5f\x88\x0f\xc0\xee\ \xf3\x01\xec\x00\x37\xd6\x76\xbd\x6f\xd1\x40\x44\x80\x2e\x4e\x38\ \x70\xec\x49\x5c\x9f\xd4\xbd\xf0\xa6\xe3\xd9\xb2\xc1\x48\x8a\x4a\ \xb2\x08\x78\xa8\x94\x02\x7c\x86\xfa\x89\x35\x66\x3a\x2b\xa5\x00\ \xc8\xc6\x9f\x4c\x9e\xc5\xe9\x83\xcf\x9a\x36\x23\x05\xe3\x11\xa4\ \x3c\x4e\x1a\xac\xb3\x02\x0f\xc7\x13\xf4\xdd\x30\xc4\x31\x99\x13\ \xda\x6f\x11\xd3\x90\xda\x0f\xaf\xbc\x35\x64\x33\x83\xbe\x81\xaa\ \x2e\x84\xc4\x64\x62\xcd\x0f\xc8\xe9\x09\x2c\x36\xbd\x16\x02\x12\ \xfa\xd9\x2f\x04\x28\x2c\xec\x15\x02\xda\x6f\x90\x60\x5c\xff\xdc\ \x9b\x29\x28\x93\x61\x21\x90\x3a\xc8\x87\x87\x51\x42\x62\xb5\xda\ \xf0\x5f\xfc\xe5\x7f\x56\xff\xfd\x3f\x9f\x6e\xde\xf3\x9e\x9f\x1a\ \x7f\xcb\xb7\x7c\x75\x2e\x75\x6f\xc4\x17\xe0\x03\x70\xce\xf1\xee\ \x0d\xd1\x0e\xda\xfb\xc9\xda\x41\xea\xbf\x8d\x73\x7b\x9f\xeb\x30\ \xf4\x5a\x7a\x6a\x1c\xec\x73\x48\xc0\x8a\xb5\xf4\xf7\xc2\xb2\x4b\ \x9f\xa3\x80\xac\x7f\xb7\xa6\x34\xb3\x36\xf6\x26\x10\x41\x69\x7b\ \xef\xd3\x96\x0b\xd0\xd0\xbb\x64\xc8\x67\xd5\x1b\x3e\x1f\x65\x64\ \x22\x25\x7b\x16\xfe\x56\x34\x04\x35\x22\xe0\x0c\xc1\x3c\xd0\xaa\ \x3f\xb3\x32\x0b\xd0\x76\x9b\x52\xe1\x9c\xa8\xdb\xa2\x75\x0d\xa9\ \xf7\x0a\x5b\xb8\x2e\xd9\x3b\x1e\xf7\x26\xbf\x03\x42\x1b\x75\x0a\ \x58\x1b\xf6\x07\xa4\x8c\xf5\xb8\x57\x5e\x32\xa4\x49\xce\x8e\x11\ \x1c\xa6\xe9\xb8\x75\x6b\xe6\x7f\xf7\x77\xff\xae\xfc\xd3\x3f\xfa\ \xa7\x72\x39\x5f\x4b\xa1\xc0\x45\x08\x00\xcf\x7b\x04\x44\x0a\xf8\ \x9d\x82\xe0\xff\xe4\x14\x34\xc3\xa0\x45\x4b\x33\x59\xc3\x9c\x92\ \x8d\x20\x52\x7d\xdf\xb3\x89\xfa\xa0\xd5\x80\x66\x4a\xef\x1d\x16\ \x08\x58\x4b\x3e\xab\x55\xaa\x1b\xe1\xf9\x72\xfd\x64\x32\x79\x37\ \x08\x80\x00\xee\xb1\x08\xab\x00\x64\x38\xf9\xc4\x07\xb0\x95\x6f\ \xc2\xf8\x04\x13\x81\xd8\xab\xc6\xa7\x3d\x6e\x9f\xee\x3d\x74\x6e\ \xee\x0b\x08\x68\x4c\x1c\x41\x4b\x26\x05\xb7\x80\x32\x11\x02\x43\ \x4e\xbc\xc4\x6e\x97\xf7\x01\xe4\xfd\x4e\xc1\x61\x7f\x80\x5c\xbb\ \xcb\x01\x78\xb8\x00\xf0\xf7\x3f\x74\x3f\xf5\xd9\x57\xdb\xdf\xf8\ \xf5\x3f\xdb\xfc\xc7\x7f\x7c\xa2\xf6\x17\x11\x05\x60\xe7\x79\x8f\ \x4d\x78\xf8\xc9\xbf\xe7\x64\x3f\x68\xcd\x0c\xac\xa5\x5a\x83\x4d\ \x7e\x9f\x85\xea\xad\x7e\x0e\x3e\x27\xbd\x17\x82\xc0\xa4\x9f\x4b\ \x9f\xfe\xe9\x1a\xae\x8f\xcd\x33\xf4\x33\xb4\x1d\xe8\xc9\x76\x94\ \xeb\xb6\x03\xd7\x97\xfb\xb8\xf2\xd0\xd5\x4c\x3a\x01\xa9\x11\x62\ \xfd\x36\xaa\xa5\x9d\x30\x40\x78\x45\xa8\xd9\x3d\x29\x3e\x27\x01\ \x14\x80\x2f\x66\x01\xa1\x2e\x04\xbe\x9f\x01\x20\x0b\x28\x0f\x14\ \x02\xdc\x03\x62\x2a\x04\x64\xfd\x60\xa7\x20\x9e\x01\x75\x1f\xc2\ \x6d\x4f\x14\xc0\xfb\xfd\xb0\xf5\x6e\xf7\x35\x55\xd3\xd2\xdf\xfd\ \xfd\x7b\xeb\xdf\xfe\xad\xff\xa5\xee\x3a\x98\xdb\x46\x96\xe6\x02\ \x24\x45\x8a\x51\x22\xa9\xe4\x9c\x2d\x9f\xe5\x53\xb0\xcb\xe1\x72\ \xce\x5f\x7c\x39\xe7\x1c\xfe\xd7\xfb\x3f\x97\xa3\xa3\x2c\x07\xe5\ \x70\x41\x12\xf7\xa1\x41\x0c\xd4\x1a\x1b\x5c\xea\x24\xfb\xf0\xb6\ \x0a\x85\xd3\x12\x04\xe0\x2b\x76\xcf\x4c\xcf\xec\xec\xbf\xd6\x70\ \xbf\x47\x4a\x00\x1b\x8e\x07\x88\x8b\xe3\x02\xb2\x63\x8e\xe6\xe3\ \x33\x40\xcd\x75\xe2\xfa\xba\x5d\x3d\x8f\x81\xcb\x20\xd7\xba\x86\ \xd1\xf7\xf1\xb6\x91\x89\xaa\x99\x57\x75\x0e\x38\xa2\xe6\x18\xdb\ \x3a\xfe\x64\x73\xf4\x1d\x2f\x2c\xb6\xaa\x61\xe7\xe5\x94\x8f\x66\ \xb3\x2e\x15\x4e\xb0\xf2\x38\xb0\x70\xa5\xbd\xc2\xcd\xf3\xa4\x70\ \x0c\xa0\x27\xb5\xda\xa0\xc9\xa7\x00\x9f\x76\xda\xb1\x1c\x16\x10\ \x09\x88\x20\x60\xc5\xeb\xc0\xdf\x44\x02\xe4\x7f\x58\xa3\x40\x9c\ \x4c\x02\xad\x87\x82\xd6\x53\xd6\x3f\x19\xc8\xdc\x53\x54\x13\x8e\ \x47\xdf\x55\x81\xf9\xc3\x42\x80\xdd\x79\xdd\x34\xae\x5e\x9d\x69\ \x21\x6b\xf0\x68\x3d\x00\x87\x06\x80\x7f\x10\x0e\x06\x49\x42\xda\ \xc3\x91\xff\x37\xda\x95\x4f\x74\xd1\x13\xe2\x73\x7a\x9e\x43\x4b\ \xf0\x5c\xde\x85\x80\x3c\x99\x4c\xb8\xe7\x3f\xcf\x93\x18\x28\xef\ \x0a\x17\x9f\x89\x03\x80\xe1\xfe\x62\x21\x09\x1c\x38\x38\x82\xc9\ \x54\x8f\xfd\xc1\x3b\xb6\xd4\x8f\x1c\x8b\x7d\x84\x0c\x70\xc0\xdb\ \xc1\xf0\x28\xfe\x97\x65\xd6\x5e\x54\xb5\x49\x10\xa6\xca\x3a\x1c\ \x32\x84\x20\xc8\x1b\xc0\x55\x2a\x46\x67\xa0\x03\x33\xdd\x92\x80\ \x25\x70\xba\xf4\x00\x36\xe4\x44\x20\xca\x23\xe0\x85\x4c\x5c\x01\ \xab\x88\x44\x42\x66\xc7\x78\x0c\xa2\x70\xd7\x04\x80\xa6\x0c\x2d\ \x97\x08\x88\x30\x40\xbb\xff\xfa\xef\x3d\x11\x00\x65\x3e\xd1\x6d\ \x67\xd0\xfa\x4c\x0c\x2e\xf7\x9f\xe6\x18\xa0\x44\x08\x0e\xef\xc2\ \xd2\x73\xf0\x83\x97\x58\x1f\xd7\xa0\x5f\x82\xdc\x07\x9f\x85\x84\ \x40\x3f\xf8\x96\x97\x35\x07\x8f\x1c\x48\x3d\x01\x1c\x38\xb2\x2f\ \x67\xa9\x25\x36\x8e\x5a\x15\xed\xe0\xb7\xda\xbd\xe7\x22\x41\x50\ \x32\x01\xe8\x7e\x4c\xe0\x8e\x40\xdd\xa2\x2a\x3a\xbb\xe5\xfa\x2b\ \x82\x30\xd1\xce\xba\xf0\x0c\x76\x48\x02\x18\xca\xf5\x77\x8b\x82\ \xdd\xea\x01\xba\x3e\xc0\x1a\x2e\x79\xef\x1c\x02\xa0\x1b\x90\x6b\ \x60\x61\x58\x5a\x08\x00\xfb\xbc\xb5\x5c\x21\x80\xce\x04\xf0\x79\ \xcf\x05\x40\xe5\x29\x3c\x40\x08\x9e\xfb\x3e\xda\xed\xd7\xd6\x1e\ \xf9\x56\x5d\x6c\xc1\xee\x7f\x4b\x7d\x57\xdf\x1b\x2c\xcf\x9e\x49\ \xa1\xb7\x37\xbe\x27\x08\x00\x2b\xe4\x38\x6d\x86\x4e\x3b\x87\x8f\ \x1e\xcc\x15\xd0\x0e\x2a\xa5\xa3\x39\xd0\xc8\xd4\x1b\xfd\x19\xe3\ \xfb\x71\xb5\x23\x0e\xf4\x03\x30\xd1\xb2\x67\xec\xe9\x27\xa4\x27\ \x16\x1f\xa5\xc2\x22\xe8\x69\x22\xc0\x7f\xf3\x67\x32\x2f\x82\xa1\ \xe1\x2a\x42\x22\x01\x1c\x9a\x04\x30\x98\x04\x74\xc5\xa0\x9e\x53\ \xa2\xa0\x22\x10\x5d\x29\xc8\x80\xf6\x54\x28\xc0\xbe\x9c\x73\x74\ \x45\x00\x5f\xae\x02\x73\xe9\x20\x00\x6c\xfb\xb4\xd9\x05\x49\x38\ \xc0\xfd\x68\x05\x40\x7d\x6f\x1e\x2e\x6b\xcf\x86\x80\x5d\x74\x26\ \x04\x35\x92\x63\xff\xe8\x8c\xce\x3f\x7c\x1d\x40\x51\x2c\x96\xb6\ \xfd\x90\x4a\x45\xd9\x26\xaa\x2d\x04\x62\x09\xe8\xe8\xd8\xa9\xbc\ \x49\xe9\x18\x1b\x1f\x2d\x58\xde\x63\x31\x04\xa7\x1f\x10\x40\x35\ \xee\xca\x8c\x65\xe1\x1e\xd5\x01\x60\xac\xa1\x0d\x9a\xc7\x10\x65\ \x21\xd0\x72\x58\x20\xc0\x27\x81\x50\x56\x56\x5a\xcc\xe9\xea\xc1\ \x64\xa0\xdb\xe4\xcf\xb4\x96\xa0\x45\xc1\x07\x2b\x05\xf5\x75\x09\ \x02\xa0\x0a\x2d\xe8\xbc\x53\x02\xc0\xee\x50\x29\xf2\x00\x56\xbf\ \x6c\x75\xe1\xb2\xe8\xa9\x5d\x11\x82\x9e\xf3\xbe\x25\x71\xf0\xe0\ \x8c\x80\xe3\x1d\xd5\xea\x46\xe5\x29\x98\x6e\xde\xc1\x8b\xbc\x22\ \x2f\xf6\x1a\x2a\x95\x0a\xce\xb1\x6b\x8b\xc6\x19\xdc\xf0\x71\xc3\ \xe4\xcc\xf8\x85\x73\x85\x34\x66\x03\x4a\xc5\x5e\x3f\x24\x27\x58\ \x77\xb2\xc0\xcd\x66\xb3\xbd\x1a\x14\xc5\x3e\x61\xc3\xcb\x9e\xad\ \x70\x2c\x02\xfa\xea\xea\xaa\xc0\x92\x88\x80\x84\x40\x0c\x45\x02\ \xb4\xeb\xbc\x54\x11\x0a\x09\xa8\x34\xa1\x76\xef\x09\xac\xda\xea\ \x6b\xa1\x30\x01\xc8\xad\xe4\x10\x00\xf3\x1d\xc5\x43\x93\x54\xfc\ \x43\x67\x18\x4b\xb7\xd1\xfd\x2a\x4d\x21\x80\xd3\x03\x40\xbb\xab\ \x8e\xb1\x3f\x0e\x37\x68\x19\x6c\xac\x22\x77\xba\x4e\x67\x04\xb4\ \x00\x28\x7f\xef\x2c\x73\x10\x0a\x59\x9a\x94\xfc\xce\xef\xa0\xb3\ \x04\x08\x03\xf8\xda\x5a\xad\x06\xb0\x48\x18\x80\x9d\x94\x22\xa2\ \xb1\x11\x01\x64\xb1\x07\x63\xe6\x6c\x60\x69\x4d\xca\xc6\x85\x2b\ \x53\xbd\xb9\x7c\x8e\x77\xcb\x0e\x01\x39\x32\x3c\x64\x6c\x6b\x33\ \xfe\x7f\x86\x65\xc0\x98\x97\x4c\x21\x7e\x17\x61\x7b\x75\x8e\x91\ \x1f\xac\x01\x10\x12\x50\xd9\x00\x59\x87\x62\x59\x2f\xe0\x34\x21\ \xae\x53\x71\xbb\xaa\xea\x74\x58\x7d\x87\x1e\x80\xa1\x42\x01\x1a\ \xf2\x36\xea\xb9\x1a\xf0\x7a\xae\x2b\x0f\x60\x2d\x45\x21\x40\xb0\ \xe7\xbc\x93\x00\xb0\x26\xdc\x6d\x7d\xbb\x5f\x00\x64\x6d\x12\xd0\ \x5d\x79\x7b\x19\x1a\xb4\xae\xcc\x81\xaf\x9e\xa7\x85\x40\x77\xf6\ \x42\xbf\x2b\xbc\x22\x4b\xdf\x01\x40\xaa\xd5\x0a\x88\x29\x56\xc5\ \xd1\x48\x83\x85\x6f\x68\x01\x17\x9f\xb9\x10\x70\x43\x21\x35\x5a\ \xc0\xe0\x60\x33\x33\x36\x79\xa6\x60\x7d\x3f\x06\x2f\xc0\x5a\xa9\ \x56\x4c\xad\xaf\x66\xbc\xc8\xfa\xf7\x16\xf2\x38\x53\x5d\x06\xf6\ \x13\x9c\x97\x02\x1a\x5d\x03\xc0\xde\x00\x17\x09\x31\x09\x80\x50\ \x30\xd7\x91\x04\x70\x66\x12\xb0\x9a\x04\xba\x17\x05\xf5\xe2\x1e\ \x1d\x0a\x38\x04\x40\x6e\x71\x66\xf5\x19\x87\x60\xc5\x95\x02\x44\ \xf3\x95\xf4\x78\x00\x2b\xcb\x2b\x9b\xae\xca\xa5\xc5\xc5\x45\x0d\ \xf8\xc4\x35\x03\xbb\xd5\x08\x7c\xbe\x6e\xef\x05\x47\xae\xce\xe3\ \x0a\x2f\x6d\xed\x9d\xef\x80\x1f\x8e\x88\x81\x72\x5d\xa3\xd1\x88\ \xc3\x00\x14\xc7\xd4\x6a\x55\x6a\xfe\x60\xcc\x86\x97\x35\xf9\xde\ \xa2\xf7\xc2\xeb\xcf\x96\x53\x51\xf6\x9b\xcd\x78\x2f\xbf\xf5\x7c\ \xd9\x8f\xda\x98\x31\xbd\x1e\x39\x7c\x28\xb2\xfe\x16\x96\x1a\xbd\ \x23\x63\xe0\xfb\x11\x58\xf0\xbb\x10\xc2\x10\xa0\x50\xa9\x14\x93\ \x00\x65\x03\xc4\x4b\x00\x09\x67\x35\xe0\x31\x78\x0e\x0f\x72\x92\ \x80\x4b\x0f\x78\x10\xb4\x9e\x5e\x3e\xec\xd6\x0d\x12\x86\xc6\xce\ \xd2\xd2\x92\x13\x6f\x38\xa7\x85\x00\xd0\xbf\xcc\xba\xbc\x80\xb9\ \xb9\x39\x06\x80\x33\x1c\xd8\xb1\xc5\xd6\x73\xbe\xbb\x02\x70\x97\ \x55\x88\x54\xdc\x42\x42\x90\xdb\xfd\xe7\x7f\x30\xdc\x3d\xba\x6f\ \x5b\xf8\x2b\x95\x4a\xe1\x7b\x82\x1c\xf0\x19\xe2\x68\x6e\x7b\xba\ \x6e\x7a\xcc\xb1\x53\x47\x7b\x26\x02\x3d\xc0\x7c\xc7\xe3\xd9\x57\ \x9e\x2e\x36\x07\x1b\x59\xe3\x0b\x40\xdb\x60\xeb\x0b\x2c\x7f\xbd\ \xde\x1f\x2f\xe4\x82\xf5\xcf\x48\x19\x70\x54\x05\x84\x56\x61\x70\ \xff\x59\x34\xb4\xa6\x45\x71\xbe\x2c\x8c\x91\x55\x9b\xca\xd2\xfb\ \x20\xa0\x6c\x02\xe0\x93\x48\x40\x86\x22\x01\xdb\x59\x0f\x88\xff\ \xd6\x64\xa0\x81\xac\xca\x81\x55\x05\x20\xf5\x08\x4c\x4e\x03\x3a\ \x09\x60\x69\xa5\x95\x12\x02\x60\x56\x5a\xed\xd8\x68\xee\xfe\xfd\ \xfb\x1a\x50\x3b\xb3\xf6\x9e\x9a\xdb\x65\x83\x11\x07\x71\xb8\xef\ \xed\x85\x8a\x36\xac\xf3\x8e\xdc\x7f\xf6\x18\xa4\x4c\x9a\x77\x45\ \xc6\x79\x70\x70\x00\xa0\x89\x1b\x5e\x22\x0c\x28\xf4\x16\xc8\xa1\ \x44\x63\xb4\x1e\xf3\xf4\x0b\x97\x4a\xc7\x4f\x1e\xed\x31\xdf\xd1\ \x38\x7f\x69\xbc\x70\xf6\xc9\xd1\x82\x01\x06\xbd\xad\x03\x3f\xf2\ \xd3\xa7\x4f\x85\x1e\x8c\x1f\xfd\x0d\x3d\x83\x81\x8e\x7f\xc7\xdd\ \x7b\x77\xc5\x65\xc7\xdf\x1c\x61\x6f\x0b\x0b\x64\x68\x12\x80\x3e\ \x42\xe2\x20\x89\x80\x34\x47\xe4\x2c\x24\x20\x5e\x80\x02\xf4\xce\ \xf4\x00\x26\x0f\x5d\x60\x94\xac\x39\x24\x0a\x80\x5c\x33\xe3\x10\ \x01\xb1\xf9\x6a\xfa\x08\x60\x79\x69\x65\xc3\x11\x02\xe0\x87\xbe\ \x63\xa5\x5f\x5b\x71\xbf\xfb\x14\x60\xd7\x96\xdd\x45\x1c\xd6\x26\ \x5f\x87\x30\x60\xe7\x84\xc6\xf7\x96\x14\xe9\xd6\x35\xc5\x52\xd1\ \x0c\x0c\x0c\x98\x7d\xfb\xf6\x99\xfd\xfb\xf7\x07\x24\xb0\x61\x86\ \x87\x87\x8d\x4f\xe2\x67\x0b\xfd\x0e\xfc\x1e\xf3\xda\x3b\x2f\x96\ \x8f\x1d\x3f\xfc\xd8\x49\x60\xe2\xfc\x58\xe1\xca\x73\x17\x4b\x5e\ \xa4\x85\xb2\xf5\x3f\x76\xec\x28\xea\x18\xe2\xd4\x1f\xc0\x8f\x5c\ \xbd\x4f\x65\x13\xab\x41\x9c\xfb\xe5\xda\x2a\x00\xcc\xa2\x21\xbb\ \xfb\x2e\x12\x88\x9a\x89\xea\x0c\x41\x4c\x02\x6a\x35\x21\x5b\x5d\ \x9b\x00\x50\x05\xfc\x2e\x5d\x76\xdb\x29\x75\xa8\xd3\xc8\x26\x59\ \x00\xc4\x58\x5b\x5b\x03\x4e\x5c\x58\xdb\x4c\x1f\x01\xa0\x5d\xb5\ \x23\x0d\x98\x24\x04\x7e\x0b\xd0\xba\x5d\x79\xc7\x9c\xa7\xe2\x76\ \x97\xa0\xa8\xaf\x93\xcf\x65\xbf\x03\xed\x36\x86\x73\x7a\xf0\x1c\ \xbd\x17\xc2\x80\x56\x68\x2d\xc3\x9a\xff\x30\x1b\x00\x0b\x8a\x73\ \xb9\x54\x82\xf5\x0f\x89\x66\x68\x68\xd0\xf0\xd8\xf4\xb2\xc6\xeb\ \x29\x78\x6f\xfc\xef\x2b\x95\xb1\x89\x33\x8f\xa5\x3e\x00\xef\xf8\ \xf4\xf3\x97\x8a\xcf\xbc\x7c\xa5\xe4\xe7\xbc\x10\x58\x3c\x9a\x8d\ \x86\x39\xb0\x7f\xbf\x58\x7f\x6c\x6f\x06\x02\x68\xd7\xf3\x4b\x4b\ \x36\x0f\x4b\x57\x67\x22\x70\xcb\x26\x8d\x0c\x10\x4b\x69\x3d\x9b\ \x44\x02\xd8\x72\x5e\x55\x0f\x92\xf5\x97\x7b\xf1\x1c\x69\x04\x5a\ \x0f\xe0\x4a\x41\x77\x28\xa0\xca\x80\x93\x6b\x00\x34\xa9\xc0\x63\ \xe4\xeb\x12\xb4\x32\x17\xd6\xd2\xe7\x01\x60\x3f\xfb\x75\xe3\x18\ \x0b\x0b\x0b\x26\x69\x28\xa0\xef\x82\x24\xf6\x58\x00\x74\xbc\x03\ \x80\x29\x1b\x7c\x2a\xd0\x33\xc1\x38\x7a\x15\xb4\xb7\xd0\x46\xef\ \xfc\x7a\xbd\x0e\xcb\x06\xf7\x16\x7f\xe3\x53\x58\x7f\x5c\x64\xfa\ \xfb\xfb\x43\x80\x19\x6f\xcb\xe5\x0d\xfb\xef\x67\x0b\xe6\x85\xd7\ \x9e\x2d\xbf\xfa\xd6\x0b\xe5\x5c\x2e\xeb\x3d\xb2\x5c\x7f\xa9\xe8\ \xff\xcf\x0f\xdf\xae\x4e\x5d\x1e\xef\xf5\xb3\x20\x61\xb8\xb4\x71\ \x8c\x8e\xcf\xcd\x99\x33\xa3\x50\xe7\x63\x8f\xa6\x56\xad\x1a\x2f\ \x22\x0e\x59\xc3\xbf\xb8\xb4\x18\x58\xba\x55\x01\x3b\xa9\xfc\xdb\ \xbd\x01\x21\x08\xf1\x12\xf8\xfa\x7c\x3e\x07\x30\x29\x50\xb7\x34\ \x09\x04\x67\x9a\x4b\x10\x05\x31\xd4\xf6\xe4\xce\x50\x80\x87\x26\ \x11\x5d\x01\xc8\x59\x0f\x3d\x74\x16\x00\x18\x71\x8d\xf9\xd9\xc5\ \xf4\x79\x00\xf7\xee\xcc\xba\x08\x00\x3a\x40\xc7\x62\x1c\x5e\x06\ \xbb\x7b\xd0\x3a\x53\x85\xdd\x13\x87\xa3\xba\x10\x5e\x80\x9e\xc3\ \xb0\x7a\x4e\x11\x01\xde\x0b\x04\x32\x30\xd0\x04\xb8\xa3\x98\x96\ \xee\x1b\x7c\x06\xe5\x1c\xe9\xc1\xe1\xe1\xa1\x30\x3e\x1c\x1a\x1a\ \x0a\x4b\x6b\x79\xb4\x50\x53\xe0\xe7\xcc\xe8\xb9\xd3\xf9\x9f\xfd\ \xee\x87\x7d\x7b\xad\x0b\x00\xbc\xe3\x53\x67\x0b\x3f\xfd\xdd\x0f\ \xfa\x0e\x1c\x19\xc9\xf9\xb9\xb6\x00\xa7\x77\x7e\x9a\x98\x18\x87\ \xc5\x8f\xf7\x3d\x28\x97\x8b\xd1\xdf\xb4\x96\xc3\x5a\x73\xf3\xe6\ \x0d\x63\xc5\xea\xb3\x38\xc7\xc5\x3c\x9a\x04\xc2\xeb\xe5\x23\x58\ \xff\x3c\x03\x5e\xbe\xc2\x80\x17\x4b\x4c\x12\xbc\xd6\x08\x34\xc0\ \xf5\x59\xd7\x00\xe8\x82\xa0\xe4\x50\x00\x83\x5b\xca\xe9\xdf\x86\ \x0e\x01\x58\x2c\x77\x95\xd5\xcf\xde\x9f\x4b\x1f\x01\xcc\xde\x9f\ \x5d\x77\xc5\x2e\x33\x33\x33\xee\x8a\xbc\x3d\xb0\xf6\xd6\xee\x28\ \xb5\xd7\x65\x58\x42\x43\x3d\x0f\xab\xdd\x76\x4a\x54\x10\x10\xa1\ \xee\x0f\x0e\x0e\x86\xdf\xf7\xa3\x76\xd9\x3a\xfa\x44\x35\x20\x3c\ \x82\x62\xb1\x88\x14\x21\x96\xcd\x86\xba\x40\xbd\x7f\x3b\x09\x84\ \xc2\xa0\x9f\x33\xa5\x5a\xd5\x7f\xf3\xff\x5e\xad\xfc\xf0\x17\xff\ \x5b\x83\x36\x80\xfb\x7e\xdb\x81\x32\xde\x27\xce\x9d\xca\xff\xf4\ \xb7\x3f\xe8\x7b\xee\x95\xa7\x4b\xbd\xe5\x1e\x0f\xe0\x0f\x9f\x46\ \x47\xb9\x54\x34\xe7\xa7\x26\x11\xbe\x88\xf5\x87\x06\x00\x52\x00\ \x11\x90\x97\x60\xcc\xed\xdb\xd3\xd8\xee\x5c\x8a\x74\x68\x35\x9f\ \x76\xfd\x95\x1b\xaf\x48\x00\xe9\x3f\x0c\x4d\x02\x0c\x78\x7c\x37\ \x59\x23\xd0\xd6\xd7\xb1\x72\x10\x7f\xea\xcf\x3b\x84\x02\xfa\x7a\ \xcc\x21\x0b\xa2\x81\xaf\xc7\xec\xec\xac\xcb\xfd\xdf\x0c\x16\xdf\ \xd9\xd4\x11\x00\x52\x81\x4b\x0b\xcb\x1d\x85\xc0\x5b\xb7\x6e\x39\ \xc5\xb7\x5d\x79\x00\xbb\x08\x09\x78\xec\xf0\x3a\x58\x68\x58\xa4\ \xce\x15\x8c\xd1\x19\xa9\xc3\x7a\xa3\x01\xb7\x5e\x13\x47\x7b\x0f\ \xfd\xa8\x64\x9a\xf7\xa3\x47\x71\x50\xf8\xbd\xfe\xfe\x30\x44\x80\ \x27\x70\xe0\xc0\x01\x78\x03\xaa\x58\xc6\x9a\x16\x36\xda\xcc\x64\ \xcd\xc0\xbe\xa1\xec\x5b\xdf\x7b\xbd\xf2\xab\x3f\xff\xb4\xff\x99\ \x17\x2f\x17\x0f\x1e\xda\x97\x03\xa0\x5d\x03\xdd\x7c\x8e\x1e\x3b\ \x94\x7b\xe9\xf5\x67\x4b\xbf\xfe\xeb\xcf\xeb\x2f\x07\x61\x45\x7d\ \xb0\x96\xf1\x7b\xb0\xbb\xaf\xb4\xdf\xdc\x1a\xf0\x46\x26\x27\x01\ \xfe\x6c\xec\xea\x83\xb0\xa0\x5d\xf8\x52\x96\xeb\x49\xef\xba\x25\ \x73\x2f\x54\xfe\x01\x5a\xba\x17\x80\xcf\x45\x3b\x34\xcf\x6e\xbc\ \x90\x00\xbc\x22\x26\x36\x26\x01\x0d\x78\xed\x11\x28\x3d\x00\xef\ \xe2\x0a\x05\x68\xde\x2d\x0a\xda\x84\xf4\x1f\x6f\x4d\xae\x49\x80\ \xc3\x40\x57\x0a\x70\x36\x68\xbb\x8e\x73\xea\x08\x00\x63\x6e\x76\ \x7e\xdd\x15\x02\xa0\xf4\x93\xc0\xe8\x02\x6f\x57\xe0\xf7\x3a\x01\ \xd4\x7b\x3c\x5a\x02\x16\xf2\xe8\x4a\x41\xbd\x37\x22\x2c\xf8\xd0\ \xd0\x30\xac\x79\xe2\xea\x45\xfc\x08\x00\x70\x4f\x09\x9d\xd0\x03\ \x60\xf5\x70\x8f\x81\x66\x33\xbc\x0e\x04\x70\xfc\xf8\xf1\x90\x1c\ \x58\xf0\xc2\xc0\xde\x08\x36\x93\x31\xa5\x5a\xc5\x9f\xbc\x38\xde\ \xfb\x3f\x3f\x7e\xa7\xfa\x87\x7f\xfe\xba\xfe\xd3\xdf\x7c\xbf\xf6\ \xe6\x7f\xbf\x52\x7e\xf1\xd5\x67\x4a\x10\xf3\x40\x0e\x00\xfb\xdb\ \xff\xf7\x5a\xe5\x67\x81\x8b\xff\xfb\x7f\xfc\xb2\xfe\xce\xf7\xdf\ \xa8\x9e\x9d\x1c\x2d\x94\x2a\x79\x2f\x93\x6b\x19\x3f\x43\xe0\xa4\ \x66\x1c\x07\x0e\xee\x37\x4f\x8e\x9f\x43\x38\x10\x77\xf7\xc1\x7e\ \x76\x95\x4a\x39\x06\xbd\xb4\xfd\xda\x08\xbc\x9b\x6b\xd7\xae\x12\ \x21\xb0\xc5\x17\xa8\xc0\x7b\x10\xd0\x26\x93\x40\x21\xdf\xa3\xe7\ \x40\x84\xda\xea\x0b\x51\x91\x28\x28\x43\x17\x0e\x75\x2e\xe6\xd1\ \xb1\xbf\xf2\x02\x3a\xa5\xfd\xe8\x6c\x11\x0e\x75\xb4\xfe\xf3\xf3\ \xf3\xce\x0c\xc0\xec\xdd\xb9\xd4\x12\x00\x62\x93\x75\x57\x63\x90\ \x7b\xf7\xee\x75\x69\x7d\xd3\x2f\x00\xf2\x39\x17\x00\x1c\x56\x50\ \xeb\x0f\xd8\xfe\x1a\x56\x7b\x60\x20\x74\xf5\xe9\x73\xb9\xaf\xae\ \x5c\x6c\x67\x4c\xe4\x87\xe0\x47\xcf\xc3\x82\x97\x6a\xad\x1a\x3e\ \xa3\xbf\xbf\x2f\x0c\x03\xac\xdd\x0c\xc9\xe4\xf4\xe9\xd3\x78\x06\ \xff\xc8\x89\x08\x3c\x63\xd1\x71\x37\xeb\x9b\x6c\x21\xe7\x35\x86\ \xea\xd9\x13\x4f\x1c\xcb\x8f\x4d\x3d\x51\x80\x98\x37\x79\xe9\xc9\ \x5e\x80\xfd\xf8\xe9\xc3\x3d\x8d\xa1\xbe\x4c\x2e\xef\x1b\x58\xfb\ \x4c\x16\x71\x3e\xc7\xce\x22\xf8\x19\x00\x3c\x70\xf9\xa7\xcc\x89\ \xe3\xc7\x65\x99\x2f\x80\x07\xcd\x02\xa2\x5f\x7c\x9d\x1f\x11\x03\ \xfa\xfd\x7d\xf1\xc5\x17\x70\xfd\x39\xf6\x16\x22\x90\xba\x7e\x05\ \x78\xf2\x12\x68\xae\x1d\x56\xf8\x2c\x1e\x6a\x40\xd1\x56\x2d\xca\ \xfa\x73\xcd\x00\x66\x13\x52\x72\x56\x79\x04\xae\xc2\x1d\x3d\x1e\ \x98\x09\xb3\x21\x9e\xee\xf4\xab\xef\x0b\x6c\xb8\x31\x36\x3b\xb7\ \x91\x5a\x02\x98\xb9\x75\xf7\x1b\xe3\x18\xd3\xd3\xd3\x4e\x90\xf9\ \xbe\xbf\xf7\xa0\xdd\xb5\xd8\x97\xbc\xb8\x88\xe3\x75\x26\x04\x58\ \x6b\xe4\xf3\xf1\xa3\x75\x93\x9c\x5e\x60\xf5\x25\xb7\x88\x8e\x05\ \x52\x78\x02\x3d\x91\x26\x70\xe8\xd0\xa1\xf0\x0c\x00\xe2\xbf\x4f\ \x9d\x3a\x85\x15\x85\xaa\x00\x86\x5c\x5b\xfc\x8d\x2d\x1c\xa0\x35\ \x66\xa3\x23\x63\x8d\x8f\xb3\xa8\xfa\x38\x0c\x86\x02\x7e\x7b\x13\ \xd8\xe0\x19\x27\xcd\x54\x10\xef\x97\xcb\x25\x00\x5b\xfe\x0d\x20\ \x37\xcc\xe1\x5a\x39\xc4\xdd\x0e\xc0\xff\xb9\x59\x5d\x5b\xd1\x62\ \x1f\x65\x0b\xc4\x15\x27\x51\x50\x0b\x84\x06\xef\xe6\xc1\xfa\x93\ \x55\xd7\x6e\xbe\x16\x05\xb5\x1e\x40\x64\x20\xd7\xa8\x50\x80\x53\ \xbc\xc9\xb1\x3f\x59\x79\x77\xf1\x8f\x10\xb9\x73\x11\xd0\xdd\xbb\ \x77\x8d\x6b\xdc\xbe\x75\x27\xad\x04\x80\x97\x9b\xf9\xc6\xe5\xc2\ \x5c\xbf\x7e\xdd\x05\x5a\x1c\x69\xb1\xec\xee\x55\x82\xde\x36\x61\ \x0f\x65\xbc\xb0\xc6\x02\x7c\x67\x07\x64\xad\xb6\x73\x6a\x10\xe1\ \x92\xa5\x18\x56\xae\x01\xd1\xe0\x39\xf0\x06\x10\x06\xa0\x60\xa8\ \x27\x00\x46\xb1\xb7\x60\x4e\x9e\x3c\x89\x1a\x02\xbc\x03\x08\x43\ \x81\xd9\xa8\x61\x89\x78\x14\xf0\xcd\x16\xf0\xb1\x1e\x01\xf7\xbc\ \x78\xf1\xa2\x19\x89\x52\x92\x38\xfc\xb6\x67\x82\x8e\x3f\x58\x0e\ \x1c\x5b\x71\xee\xf6\x7b\xf5\xea\x17\x41\x5c\xbb\x68\x3c\x79\x56\ \x08\x5a\xdd\xde\x3b\x99\x04\x18\xa4\xc8\xfb\xa3\xfb\x8f\x47\x44\ \xc2\x19\x03\xb7\x1e\x10\xdf\x53\x48\x40\xf5\xf6\x6b\xa9\x55\x82\ \x9e\xf6\x08\xdc\xab\xf9\x12\x4a\x84\xf5\xfe\xb9\x98\xd3\x7f\x43\ \x24\xef\x34\x96\x82\xfc\xff\x32\xca\x80\xd3\x49\x00\xd8\xdf\x6e\ \xdd\xce\xcf\x2e\x74\x0c\x03\xae\x5d\xbb\x86\xf2\x56\x57\x18\xf0\ \x1f\x17\x12\x20\x85\x07\x50\x8e\x8c\x8c\xb0\xab\xaf\x07\xbe\x90\ \x44\x78\xdb\x89\x20\x52\x8c\xe3\xca\x30\xf9\x98\xf2\xe0\xa2\x0b\ \x80\x68\xf0\x5c\x84\x05\xd0\x03\x8a\xc1\xf3\x8f\x1d\x3f\x16\xa6\ \xe5\x8e\x1d\x3b\x66\x9a\xcd\x86\x54\xcd\x29\xa0\x3f\x1c\xfc\x00\ \x59\xa3\x51\x0f\x2b\xfa\x2e\x5d\xba\x68\xc6\xc7\xc7\xcd\xf0\x10\ \x96\xf5\xb6\xa2\x82\x1e\x13\x1e\x85\xde\xbc\xa9\xf5\x55\xb1\x0f\ \x40\x1b\x58\xa4\x05\xb4\xec\xa6\xf9\xec\xd3\x4f\xcc\xc2\xfc\x3c\ \xdf\x5b\x11\x01\xa5\xf8\x64\x9e\xc1\x2d\xe2\xa0\x64\x5b\x0a\x05\ \x9a\x23\xeb\xaf\xea\xef\x31\xa7\xf5\x00\x7c\xae\xad\x3f\x93\x90\ \xd7\x49\xd8\xd3\x31\xbd\xf2\x12\x5a\x8e\x8a\xc2\xd0\xf1\xf2\xbd\ \x8e\xa4\x01\xf1\xcf\x55\x02\x3c\x33\x7d\x8f\xb0\x95\x2e\x02\xa0\ \x97\xbc\xb3\xee\xea\x0c\xa4\x63\x1d\xcf\x01\x0a\x17\x18\xcd\x9e\ \x59\x7b\xf7\x75\x34\x04\xf8\x70\xc3\xe1\x7a\x03\x7c\xb0\xba\xb0\ \xcc\xc9\x0b\x80\x92\xf6\x46\xf0\x1e\x9c\xf3\xc4\x13\x58\x5b\x8b\ \x49\x53\x3f\xbb\x12\x7b\x03\x19\x78\x20\xb8\x5e\x14\x65\x7c\x39\ \xf4\x04\x40\x02\x93\x81\xdb\x7e\xe1\xc2\x79\x73\x6e\x6c\xcc\x9c\ \x38\x71\xc2\x1c\x3d\x7a\xc4\x1c\x3e\x7c\xc8\x1c\x3c\x78\xc0\x1c\ \x39\x72\x24\xf4\x1c\xc6\xc6\xce\x9a\x8b\x01\xe0\x9f\x79\xfa\x69\ \xfc\x77\x9b\x50\xb2\x59\x00\x1f\x80\x06\xc0\xe3\x65\xcb\x88\xf5\ \xa1\xf4\xc3\x03\x60\xab\x8f\x33\x62\xfd\x4f\x3f\xf9\x04\x05\x3f\ \x20\x0c\xb1\xc2\x8a\x08\xc2\xb3\x02\x3c\x1d\x8a\x04\xe0\x61\x84\ \xa1\x21\x81\x46\x00\xce\x64\x80\xa1\x57\x25\xea\xb3\xe5\x67\x70\ \xc9\xb1\x0a\x05\x5a\x6a\x1f\x42\xa7\xf5\x37\x6a\x8e\xac\xbf\xde\ \x0a\x5f\x8d\xae\xdc\xff\x3b\xd3\x33\x1b\xa9\x27\x00\xb7\x0e\x00\ \xb7\xf0\x2a\x4e\x6e\xcb\xff\xf8\xad\xbd\xf3\x5d\x58\xa7\x80\xe5\ \x05\xf8\x00\x7c\x0c\xae\x0e\xe4\x74\x66\xf2\xe8\x7e\x31\x13\xc2\ \x01\xe9\xaa\xa4\xef\x89\xe7\x83\x08\xf0\x5c\x80\x40\xf7\x1e\xc4\ \x7e\xfc\xc8\x2c\x60\x0e\x64\x05\xeb\x8e\xb2\x62\x84\x0e\x48\x27\ \xee\x0f\xce\x28\x46\x0a\x45\xc6\x4c\x26\xb8\x76\x1d\xdf\x03\xf0\ \xc1\x5d\x31\xf0\xe1\x45\x00\xf8\x7d\xb5\xb6\xe7\x11\x87\x09\x94\ \xee\x43\xaa\xef\x83\x0f\xde\xc7\x99\x76\xf8\x91\xe5\xbe\x4a\xec\ \xe3\x83\xe6\xd5\x1c\xc8\x0d\x21\x0e\xcd\xa9\x9d\x79\x1d\x7a\x80\ \xf6\x02\x30\xac\xf2\x02\x30\xd3\x09\xdc\xda\xaa\xb7\x5c\x7b\x07\ \x10\xc5\x40\x00\xd4\x43\x3f\xeb\xe6\xcd\x9b\xc6\x35\xa6\x6f\xcc\ \xa4\xdf\x03\xb8\x7e\xf5\xe6\x37\xae\xde\x00\x1f\x7d\xf4\x91\x9e\ \xda\x73\x20\xef\x3d\x49\x70\xef\xbe\xa2\x00\x3f\xf1\x79\x00\xa3\ \xbe\x8f\x5b\x0f\xb0\x72\x7e\xe8\xb5\xa8\x11\x80\x07\xc5\x7b\x29\ \x86\x87\xbf\x75\x2d\x42\x81\x91\x7d\x23\x71\xed\x80\xd4\x12\xe0\ \x6c\xd4\x36\x54\xb0\x76\xa1\x75\x6f\x1f\x98\xd8\xba\xde\xb4\x81\ \x9f\xcd\x65\xf1\xef\x45\x0d\x42\x74\xcf\xec\x96\x28\x29\x87\xef\ \xc5\x45\x3e\x1f\x7f\xf4\x91\xd4\x32\x3c\xb4\xd1\xa7\x78\x04\x5a\ \x6f\xd0\x29\x41\x39\xf0\x1c\x90\x9b\xbe\x8e\x33\x03\x49\x05\x3e\ \xac\xf8\xb3\x47\xa5\x52\xa6\x52\x95\xa8\xda\x8b\xe3\x50\x6b\x14\ \xbb\x8c\xfd\xf5\x9e\x00\xd9\x4c\x67\x01\x10\xe4\x7c\xfb\xf6\x6d\ \x57\x0b\xb0\xd6\xfd\x7b\xb3\x9b\xa9\x27\x80\xd5\x95\xd5\x56\x50\ \xac\xd0\xc9\x55\x01\xdb\x51\x1f\x38\xb3\x5b\xd0\x3e\x0e\x2d\x81\ \x2d\xbe\xa4\xfb\x3a\xf5\x37\xc0\x35\xdc\x2f\x40\x3b\xa2\x2a\x05\ \x68\x35\x49\x30\x11\xc4\x67\xf9\xb1\xac\xad\xae\xc0\x1b\xd0\xcf\ \x86\xdb\x1f\xd7\x1c\x60\x09\x31\x8a\x8d\x40\x08\xf5\x46\x1d\xef\ \x8d\xf7\x47\x2e\x1a\x80\x55\xef\x6c\x31\x1f\x87\x11\xe8\x49\x80\ \xd8\x1e\x59\x0c\x00\x1f\xee\x37\x3e\x17\xd0\x4b\x8a\x4f\x62\xfe\ \x95\x95\x65\xf3\xfe\xfb\xef\x99\xe9\xe9\x5b\xb1\x06\xe0\x45\x87\ \x21\xb2\x51\x1e\x81\x22\x01\x5a\xf8\x43\x02\x65\x11\xe2\x22\x89\ \x8a\x0c\x50\xf2\x08\x5c\xb1\xbf\xfc\xad\xc0\x4a\xef\xe0\x06\x37\ \xd7\x05\x24\x2b\xfe\x6a\x64\x7d\xd9\xb8\x44\xdd\x4f\xd5\xc7\xe8\ \xb6\xf9\x7a\xdc\xb8\x3a\xbd\x0e\x02\x4a\x31\x01\xd0\xcb\x7e\x71\ \xe3\x1b\x57\x3d\x00\xaa\x02\x69\x38\xab\x02\xad\x8e\xf7\x4d\x32\ \x68\xb7\x87\xd6\xbb\xf3\x24\x10\x67\xc3\x9a\xc3\x0a\x0a\xa0\xf5\ \x77\x3a\x2d\x15\xc6\xf7\x5d\x64\xd1\x3d\x79\x6d\x95\xb1\xc0\x13\ \x00\x11\xc0\x55\xc7\x3c\xce\x38\x74\x16\x05\x31\x3c\xde\x1d\x15\ \x7b\x28\x3d\x16\x52\xc0\xda\x02\x08\x7b\x28\x45\x1e\x1e\x19\x46\ \x36\x01\x9f\x03\xf0\x48\xe7\xe1\xdd\xa3\xfd\xfc\xb6\x08\x50\xbc\ \x02\xcc\x89\x47\xf2\x6f\xf6\xae\x82\x39\x8e\x24\x56\xf7\xf4\xa2\ \xf1\xf8\xa7\x3f\xe6\xf7\x8e\xf9\xc2\x70\x39\x87\xc9\x61\x4e\x0c\ \x17\xe6\x38\x60\xc7\x31\xf7\x9b\x2f\x6b\x95\xe5\xcf\xdd\xab\x5e\ \xe7\x52\x75\x76\x56\x55\x5b\x33\xee\x99\x05\x7b\xad\x4f\xd2\x27\ \xe8\x5b\x65\x38\x37\x72\xe3\x86\x9b\x9d\x99\x51\x23\x01\x94\x40\ \xd1\xd3\xe3\xbd\x99\x17\xd0\x9e\x00\xaa\x12\xc1\xfc\x6b\x85\x27\ \xa5\x8d\x0c\xe0\xd0\x56\x9d\xfa\x09\x20\xdc\x33\xa0\xb3\x2c\xec\ \x41\x88\x84\xf8\x79\xbc\x17\x80\x52\x82\xf5\xaa\xe7\xd7\x63\x30\ \x10\xeb\x6f\x00\xc0\x6d\x20\xc4\xc6\x00\x80\x5b\x7f\xde\x35\xa7\ \x1a\x5e\xbd\x7a\x95\x56\x8c\x41\xa1\x61\x3d\xee\xff\xba\xbd\x0b\ \x71\xe3\xc1\xe8\x43\xf1\xd7\xad\xc0\x1c\x0a\x44\xee\xb7\xc7\x95\ \x17\x6b\xd7\x64\x70\x28\x3c\x29\xb4\x59\x83\x45\xd6\x1e\x83\xfc\ \xfe\xda\x5d\xa7\xf1\x6b\x00\x27\x58\x76\xf1\x42\x28\xa4\x60\xcf\ \x24\x08\x17\xe0\x66\x4a\x3e\xe2\xf6\xad\x5b\xb0\xfa\x65\xf5\xda\ \x84\x4e\x1b\xae\x9c\xe3\xc1\x16\x9f\x27\xfb\x12\x08\x40\x19\xe5\ \x35\x24\xab\x02\x29\xa8\x81\x27\x42\xe2\x29\xeb\x4f\xa9\x3e\x9c\ \x70\x5a\x50\x84\x7a\x07\xa8\x44\xd8\x18\xf5\x65\x90\x82\xb2\x67\ \x41\xb5\xe0\xfb\x18\x08\x90\x19\x33\x1b\x80\x6e\x8e\xdd\xd9\x28\ \x00\x00\xb2\xe2\xc1\x7c\xd9\xe3\x1e\x2c\x00\x00\xb1\xd5\x46\xc8\ \x05\x17\xcb\xdf\x79\x48\xe0\x73\x67\x07\xb8\x02\x8a\xc1\x16\xdf\ \xb4\xf6\x24\xd1\xd0\x81\xef\xb5\x80\xa0\x13\xfe\x00\xdb\x44\xc1\ \xa3\xba\x57\x86\x56\x13\xcf\x27\xe0\x4e\xae\x78\x4f\x5e\x94\x5b\ \x5c\xf7\xe5\xd7\xe2\xd7\x16\x90\x28\x82\x9c\xcb\xba\x78\x18\x68\ \x54\x01\xbb\x5f\x72\x38\xd7\xdc\xc4\xc4\x33\xb5\xdb\x4f\x79\xbf\ \xec\xf8\x8b\xd7\xe7\x14\xa3\x28\x6f\x4c\xe1\x23\x6b\x08\x45\xe0\ \x85\x08\x30\xb1\xbe\xb2\x46\xa6\x95\x31\xe0\x3c\xed\x05\xe4\x33\ \xf9\x6a\xd5\x4e\x09\x6a\xf7\xdf\x53\x07\x20\x1f\x51\xfe\x6b\xd5\ \xff\x3f\x7d\xfc\x6c\x61\x7a\xfa\xcd\xd2\xc6\x00\x00\x71\xf1\x6f\ \x3d\x98\xb3\x76\x0c\xbe\x73\xe7\x0e\x2f\xbf\xdb\xa0\x50\x63\x20\ \xa7\x58\xc4\x84\xab\x8f\xf8\x17\x16\x1f\xf1\xbb\x7a\x7d\xd3\xda\ \x5b\x73\x0e\x25\x8c\x58\x7f\x3f\x83\xe1\x29\x60\xa0\x08\xfe\x9e\ \x50\x52\xfc\x33\xdd\xbf\x77\x0f\x05\x57\x50\x58\x78\x07\x58\x27\ \x65\x67\xef\x22\xac\xd9\x63\x01\x53\x88\xf0\xdc\xc7\x8f\x1e\xb9\ \xd1\xd1\x91\xd2\xda\x5f\xc1\xeb\x96\x1e\xc7\x94\x2a\x5a\x0a\x78\ \x68\x4f\x01\xe7\xf0\x14\xe4\x1a\xef\xe5\x27\x44\x60\x12\x04\xbc\ \xf7\x98\x2b\x00\x10\x20\x3e\x80\x62\x7f\x5d\x38\x84\x63\xa1\xdc\ \x7d\x0e\x15\x0a\x27\xef\x45\x5e\x00\x71\x04\x8e\xeb\x02\x12\x1d\ \x81\x86\xf5\x97\xf0\xa0\x51\xf3\x66\x09\x31\xbe\x27\x4b\x6e\x49\ \x48\xbd\x51\x00\x00\x32\x72\x7d\xcc\xfc\xd0\xf8\xa7\x32\xba\xab\ \xde\x43\x21\x8f\x52\xea\xe0\xc4\xe2\xc3\x4a\x47\x59\x7d\x11\x22\ \xce\x4c\x8b\x4d\x22\x1d\x83\x69\x25\xb7\x3f\x77\x32\x3c\x60\x42\ \x55\xc8\x42\x80\x01\xf2\xcb\x70\x31\xc7\xc7\xc7\xdf\xfe\xb3\xa1\ \x14\xfb\xd1\xa3\x47\x20\x9e\xca\xc7\x13\x37\x51\x82\x04\xea\x32\ \x50\x85\x76\xef\xde\x5d\xd4\xec\x23\x4b\x03\x0f\xed\x6d\x7c\xff\ \xe4\xe9\x63\x78\x6a\x5a\x21\xa4\xc6\x7f\x6d\xf1\x12\x8d\x6c\xd3\ \x1c\x00\xef\xf3\xcf\x20\x20\xf7\xf6\xb7\x48\x56\x52\x50\x2d\xcc\ \xee\x9b\x75\xfa\x72\x4c\x67\x06\x78\x23\x91\x22\xa5\xdc\xed\x9b\ \x85\x78\xf8\x87\x9e\xcd\x82\xeb\xf2\xb0\x52\xe2\x2c\x37\xae\x8e\ \x6d\x3c\x00\xf8\x73\xf4\xd6\xdc\xbc\xd1\xb7\x7c\xed\xda\x35\x0e\ \x03\x22\xca\xcf\xca\x46\x21\xc1\x3a\x07\x85\x4a\xe9\x6e\x8b\x19\ \xaf\x74\x10\xdb\x93\x02\xaa\x8f\x6b\xbf\x5f\x2d\x3a\x43\xd0\xe2\ \x03\x0c\x10\x04\x00\xc4\x81\x23\xb2\xe9\x24\xee\xc5\xd8\x29\x78\ \x07\x78\x40\xf9\x71\x7c\x3e\x31\x81\xc2\x1d\x7c\x1f\xa8\x03\x58\ \xc5\x3d\x68\x8e\xc0\x7b\xea\xdb\xc0\x6d\xc4\x01\xf8\x42\xaf\xcb\ \xfd\x54\x76\x4c\x20\x80\x23\x4a\x9c\xd1\x4d\x28\x56\x98\x63\x7f\ \xfc\xcc\xa9\xbb\x40\x13\x80\x95\x17\x90\xac\x0b\x60\xab\x4f\x29\ \xc1\x34\x90\x58\x2d\xc0\xaa\x5f\xa0\x5e\xa5\xe6\x1f\x7a\xae\xb0\ \xff\xf0\xb2\x8c\x0e\xdb\xc5\x67\x4f\x26\x16\x37\x1c\x00\x2c\xcc\ \x2f\x84\xdb\x7f\xde\x35\xc3\x80\x91\x91\x11\x8d\x90\xa6\x42\x70\ \x05\x60\xca\x45\xa7\x48\x54\xc7\xe4\xb0\xf4\xc2\xd0\x9b\x6e\x7d\ \xba\x4f\xc1\xe5\x3f\x97\x8a\x76\xd0\x54\x63\x4b\x9e\x37\x03\x85\ \xd5\x2e\x7e\x27\x45\x55\x76\x28\xc2\x5b\xb8\xab\x73\x1e\x71\x25\ \x33\xfd\xb0\xa8\xef\x53\xac\xbf\x28\xb1\x56\x40\x01\x01\xc4\xfc\ \x52\xae\xcc\xb3\xf5\x38\x5e\x27\x0b\x9e\x56\xb2\xa2\x8d\x67\x59\ \x10\x40\x6a\xf5\xa6\xb9\x01\xdc\xda\x6b\x75\x09\xe2\x75\x9b\x35\ \x8a\xfd\x23\x02\xaf\xcc\x92\xb1\x1b\x7f\x0a\xa1\xbe\x21\x00\x80\ \xc3\x00\xf3\xc3\x9f\x3a\x75\x8a\xff\x40\x9d\x17\x09\x05\x8a\xd5\ \xf9\x9f\x5f\xb1\xde\x52\xae\x1b\xf4\x6d\xf9\x0a\x13\xb9\xc7\x06\ \x01\x76\x8b\xe1\xe2\xb6\x88\x41\x2f\xd1\x73\x47\x20\xc0\xd6\x3f\ \x7d\x9d\x95\xda\x1e\xac\xaa\x5c\x7a\x51\x74\xca\x2a\x50\x86\x45\ \x6a\x02\x68\x4a\x90\x90\x82\xf2\x1e\x31\x10\x90\xcf\x35\xf8\x51\ \xab\x68\x49\x87\x02\xb8\xc6\x4a\x18\xf7\x02\xb4\x55\x97\x23\x59\ \x73\x4e\x09\x92\x52\x46\x49\x41\x33\xb4\x28\xe4\x29\x7c\x1f\xac\ \x3f\xb2\x2b\x7a\x8d\x8d\x1c\xea\x38\xb2\xdc\xff\x91\x6b\xe3\x73\ \x1b\x15\x00\x10\x06\x94\xd9\x80\xb9\x60\x4d\x09\x42\x4c\x6a\x89\ \x39\x29\x08\x0f\x62\xfc\xe5\x51\xad\xd5\xa0\x74\x00\x80\x84\xa2\ \xa4\xe3\xfc\x5c\x02\xd0\xdb\xe4\x20\x13\x83\xaa\xb7\x3d\x4f\x38\ \x3d\x2a\xcd\x42\x39\x40\xf5\xae\x1b\xa6\x46\x86\x5b\xca\x96\x5f\ \x06\x31\x4b\x20\x40\x80\x82\xd2\x62\xfc\x2d\x58\x09\x43\xbe\x32\ \x72\x5d\x00\xef\x09\x10\xf1\x08\xd8\xdd\x4f\x91\x82\xf9\xbb\xfb\ \x2e\x29\x3e\xa0\x59\x2f\xac\x34\x21\x8a\xe1\xcc\xe2\x9f\xa7\x4f\ \x26\x16\xe0\xfe\x6f\x58\x00\x58\x5c\x58\x0c\xa3\xd7\xc7\x4d\x2f\ \xe0\xd2\xa5\x4b\x1d\xb9\xc4\x41\xce\x83\xdd\xa1\x27\x16\x5f\xc7\ \xec\x56\x5a\x4d\x03\x01\x85\x13\x94\x42\xd3\xeb\xe4\x99\xe4\x83\ \x80\x1d\x8a\x44\x21\x54\x36\xd6\x5c\xca\x07\xaa\x77\x98\x8d\xc0\ \x21\x4f\x21\x5b\x72\x2b\x45\x97\xb8\x5f\xce\x85\x37\xe0\x41\x9f\ \x90\x7a\xbd\x8a\x6e\xc6\x95\xbd\xf2\x62\x6d\xbc\xd4\xb7\xcf\xdc\ \x40\x91\xa9\xb4\xc9\xb5\x22\x0d\x2a\x9c\x0d\x60\xb2\x2f\x55\x1a\ \x5c\x29\x02\x17\xff\xac\xdb\xfd\xbf\x7a\xf1\x3a\xe9\xce\x86\x00\ \x00\x52\xee\xb3\x57\xcc\x5f\xe2\xcc\x99\x33\xd2\x0a\x69\x02\x80\ \x91\xee\x53\xae\x7e\x15\x47\xfc\x83\xb1\x02\x67\x83\x4d\xfc\x56\ \x3b\xc3\xc0\xd7\x53\x3d\xff\xba\xa9\x08\x9c\x44\x7c\xa7\xe2\xb4\ \x28\xf7\xdf\xe4\x4a\x58\x3a\xce\xa0\x28\x05\xe6\xf7\x93\x35\xcd\ \x01\xe0\xe1\x45\xf9\xc5\x6b\x28\x56\x26\x08\x83\xf0\x83\x9b\xdc\ \x61\x6e\x9f\xcf\x23\xac\x3d\x91\x7d\x72\x64\x52\x90\xb3\x01\x02\ \x7a\x46\x46\x8a\x4b\x7e\xf9\xbe\xde\x46\xdb\xbc\xbf\xe4\xfe\x91\ \x9d\x31\x39\xb4\xeb\x97\x6e\x6c\x7c\x00\x78\xfc\xe8\xe9\x02\x0a\ \x19\x78\x9d\xf3\xd8\x97\x2f\x5f\x76\x19\x62\x96\xed\x56\x3c\x94\ \xde\xc7\xd3\x78\xb6\x82\xda\xac\xbe\x4d\xf6\x51\x38\x11\xb2\xb2\ \x12\x3a\x4d\xc8\xde\x09\x03\x82\x1e\x18\x82\xfb\x42\xea\xb5\xdf\ \x81\x14\xb4\xc3\x00\xba\xae\x98\x7f\x79\x60\x4d\x01\x29\x36\x12\ \x85\xd5\x47\x6f\x81\x28\x2b\xa7\x01\xd3\xb1\xbc\xe2\x0d\x48\x52\ \x69\x3d\x06\x17\x5e\xa0\xf7\x8a\x91\x88\x06\x08\xd1\xd4\x20\xfc\ \xce\xcd\x7a\xc5\xac\x14\x44\x9a\xd5\x92\xf1\x91\x5b\x73\x6f\x66\ \x66\xc3\x86\x07\x00\xc8\x95\x0b\xd7\x4c\x24\x3b\x7a\xf4\xe8\xdb\ \xdc\xb5\x25\xda\x45\x97\xa3\xf4\xe0\xe3\x68\x2b\x2d\x29\x68\x70\ \x66\xb5\x5f\x8a\x23\x90\x47\xf6\xfb\x91\x70\x15\x22\x7e\x07\x29\ \x3d\x6e\x4b\x42\x86\x65\xf7\x3f\x84\x35\xa1\x91\xd8\x5c\x4b\x91\ \x8d\x10\xca\x2c\x40\x62\x20\x60\x40\xe0\xb2\x5c\x58\x7d\x28\x3f\ \x86\x87\x44\x25\xa2\x84\xa4\xc8\x04\x0c\xd1\x9d\x7e\xf8\xdc\x56\ \x64\x8b\x0f\x20\x69\xb7\x4f\x40\x7f\xd3\x66\xfe\xc1\xd9\xa0\x1e\ \xc3\xd6\x99\xab\xa4\x33\x1b\x18\x00\xae\x5d\x1e\x99\x9d\x33\xc8\ \x40\xe4\xa6\xc7\xc6\xc6\x3a\x26\xc4\xfc\x72\x3d\xbb\x64\x02\xe4\ \x5a\xc8\x50\xee\x90\x56\x0e\x0b\x80\xc8\x2d\x6e\x9b\xff\xef\xa8\ \xb2\x4f\x48\x4b\x00\x41\xc1\x9e\x8c\x9c\x17\x1e\xf9\x63\xda\x79\ \x08\x0f\x6f\x2a\xb2\x1d\xca\xc4\x81\x31\xdf\x93\x58\x9d\xf3\xaf\ \xd7\xaa\xd8\xe2\x0c\xd5\x7d\xcb\x0d\x45\x81\x48\xd3\xc0\xb1\xb7\ \x1c\xf3\x63\x79\x47\xfb\x01\x92\xbc\xdb\xda\x92\xf0\x01\x6d\x49\ \xc1\x4a\x61\x5b\x7f\x1c\x91\xf6\xb6\xc6\xe6\x95\x53\xb5\x16\xef\ \xdc\xbe\x3f\xbf\x69\x00\x00\x99\x80\x6b\x97\x46\x4c\x44\x3b\x72\ \xe4\x88\x49\x9e\xe8\x7c\x3e\x97\x09\x07\xd2\x13\xbe\x16\x57\x50\ \x2e\xf9\x0d\xf9\xb1\x71\xfa\xfd\xd2\x2e\x2a\xb9\xc5\x42\x8b\xf1\ \x67\xf4\x85\x07\x08\xb4\xc2\x02\xfe\x3d\x95\xfb\xcf\xef\xa7\x01\ \x21\xdf\xc3\xb1\x43\x02\x06\x9b\xe0\x56\xc0\x48\x1d\x21\xd2\x85\ \x88\x29\x49\xb0\xfa\x2d\xef\x8c\x5e\x5b\x42\xa3\xf7\xa5\xb4\x6c\ \xd5\x59\x19\x99\x73\x48\x7b\x1d\x1c\xc3\xc7\x79\x80\x3e\xc3\xfa\ \x63\x0d\xa9\xbf\xd1\xd1\x51\x67\xc9\x85\x33\x97\x88\x10\xdb\xe0\ \x00\x00\x39\x33\x7c\xfe\x0d\x0a\x56\x8c\x89\xc1\x28\x45\xcd\x56\ \x7c\xdb\xfa\xc6\xcd\x7d\x0e\x29\xc8\x8a\x5a\xb8\x54\xc1\x8c\x56\ \x5a\x3b\x35\x98\xf6\x0e\xe8\x67\xaa\x19\x68\xd4\x57\xa6\x0c\xc1\ \x8d\x14\xc9\x57\x5a\x1c\xe5\xba\x97\xeb\x11\xef\x82\xb6\x35\x97\ \x63\xb0\xc7\xaf\xc9\x18\xf4\xfe\xfe\xc1\x72\x9e\xc0\x27\xd6\x66\ \x29\xea\xa8\x94\xd6\x99\xac\xbd\x4d\x0a\xc6\xca\x7b\x79\x6e\x00\ \x49\x9a\x5f\xb0\x01\xa7\xea\x83\xeb\xa9\x57\xcc\x2c\x04\x94\xdf\ \x0a\x73\x67\xca\xc1\x1f\x57\x41\xfe\x6d\x36\x00\xc0\x34\xd3\x9b\ \xa3\xb7\xcd\x5f\x6c\xff\xfe\xfd\xe2\x22\xb1\xe2\xe3\x98\x47\x0e\ \x06\x75\x4e\xca\x6c\x11\x81\xfa\xf9\xeb\x75\xa3\xbd\xe7\xa6\x9b\ \x34\x30\xf0\x6b\xa7\x32\x01\xd5\x6a\x6d\x39\x5b\xd0\x84\x25\xe1\ \x67\x24\x01\xc1\x52\xe4\xa0\x00\xa1\x70\xbe\x2d\x70\xa4\xfe\x46\ \x50\x1d\x00\xd4\xc0\xe0\x47\x32\xb6\x5c\xee\x53\x1e\x82\x4d\x38\ \x32\x01\x68\x97\xe8\xa6\xaa\x03\x49\x92\x40\x12\x4c\xc2\x0e\xf7\ \x5a\x21\xc8\x47\xbd\x15\xf9\xb9\xad\xf5\x47\xe9\xbb\x25\x17\xcf\ \x5d\x99\x99\x9f\x5f\x08\x9b\x0e\x00\x20\x67\x4e\x9e\x9f\xc9\xd8\ \x37\x00\x5c\x80\xa1\x80\xb9\x95\x78\x96\xfb\xeb\xb2\xe3\x5d\xce\ \x22\xd8\x29\x42\x5e\x33\x2a\x0f\x8d\xe1\x25\x3c\x6e\xec\xb3\xcf\ \xbe\x78\xeb\x62\x57\x6b\x75\x51\x42\x5c\xd3\x44\x20\x3f\xd7\x06\ \x4b\x56\x50\x47\x6b\x41\x67\xe4\x91\xcb\x6f\xa5\xf3\x30\x78\xb4\ \xaf\x3c\x56\x2b\x55\x28\xbc\xae\x09\xc4\xcd\x1c\x3a\x58\x3c\x85\ \x9d\xfe\xa3\xb5\x36\xe5\xc0\xd6\xeb\x75\x5e\x10\x44\x77\x36\x2a\ \x4b\xae\x5e\xf3\x38\xb5\x98\x7f\x58\x7f\x33\xf5\x77\xe1\x14\xbb\ \xff\x9b\x08\x00\x1e\x3e\x78\xbc\x80\x59\x01\x9d\x78\x01\x39\x9c\ \x40\x10\x05\x0d\xab\x15\x94\x89\xc0\x90\xdc\xb3\xcf\x75\x9c\xee\ \x63\x00\xf2\xf9\x19\x01\xc5\x33\xc4\x8b\x9c\x98\xd1\xd7\xeb\x73\ \xf3\xf3\xe2\x11\x81\x23\xc0\xa4\x1f\x8c\xee\x02\xd1\xb6\xdc\xd1\ \x28\xd6\x57\x3c\x26\xa9\x83\x28\xac\xcf\x95\x76\xff\x85\xe8\x5a\ \x0e\x47\x64\x1b\x73\x00\x50\xa3\xd9\xb3\x42\x40\xe2\x11\x5a\xef\ \x28\x44\xbd\x28\x7d\x5b\x9e\x42\x79\x21\x21\xd8\x20\xb0\x2e\x8e\ \xa0\x88\xde\xd7\x79\x68\x41\x53\x89\x07\x7b\x2b\xe6\x7d\x48\x73\ \x83\xfc\xb3\xe4\xfa\x95\x91\xd9\xe9\x37\x33\x61\xd3\x02\x00\xe4\ \xc4\xe1\x53\xd3\xce\x10\x94\x06\xcb\xc4\xa0\x24\x08\x10\x63\xdd\ \x8e\xec\xb3\x2d\x1f\xa7\x17\x29\x87\x2f\x12\xec\x18\xbf\xe2\x63\ \x55\x83\x16\x48\xc8\xe7\x36\xd2\x6f\xa1\x55\x33\x11\x1b\x3a\x52\ \xaf\xd5\xa1\x90\x02\x08\x50\x52\x0c\x35\x01\x48\x48\x19\xf4\xb2\ \x82\xaf\x3c\xc4\xfd\x0f\x41\xcd\x29\x74\x2d\x8e\x05\x40\x82\xe7\ \xf6\xf5\xf6\xe3\xb5\xca\xd7\x6c\x6d\x61\x8e\xf8\x1e\x2e\x7e\xe1\ \x2b\xf2\x77\xd4\x04\xa0\x78\x00\x72\xd4\xca\x8f\x35\xfc\x44\xa3\ \xdd\x3c\xf7\x75\xe8\x5a\x7b\x1c\x6d\x65\xcc\x57\xda\x75\xaf\xc5\ \xa4\xaf\xd1\xda\x41\x99\x6b\xfd\x63\xc3\x6f\x2c\xeb\x8f\xaa\xd9\ \xe1\x63\x67\xdf\xe0\x7c\x53\x03\xc0\xdd\x3b\x0f\x16\xee\xde\xb2\ \x53\x1c\x7b\xf7\xee\x45\x75\xa0\xf5\x25\xa4\xdd\xf1\xa0\xae\x91\ \x87\x90\xe5\xb6\xbb\xc2\x9a\x05\x60\x84\x28\x8e\xf9\x80\x14\x30\ \x90\x92\xc7\x48\x3a\x19\x01\x16\x96\xff\x91\xa8\xe3\x91\xe2\xfd\ \x62\x19\x10\x7a\xfb\xfa\xde\xba\xe8\x1f\x2f\xef\x2a\x8c\x99\x7f\ \x78\x00\x20\xf0\x33\xc0\x02\x9e\x03\xce\xe5\x21\xd7\x06\x91\xba\ \xc3\x20\xd1\x9e\x1e\x28\xbc\x02\x0f\x51\x5a\x51\x6e\x51\xda\xf6\ \xc5\x44\xe2\x1d\x68\x6b\xcf\x80\x2d\xc7\xb8\x32\x16\xef\xae\xb4\ \xeb\xcb\x2e\x44\x37\x11\x6d\x54\x9d\x1b\xe8\xa9\x88\xd2\x6b\xde\ \x8a\x37\xfc\xc8\x4a\x6f\x5f\x3e\x7f\x6d\x16\x3c\xd9\xa6\x07\x00\ \xc8\xb1\x83\x27\xa7\x2d\xd7\x1e\x79\xee\xe1\xe1\x61\xf3\x4b\x25\ \xc9\x6e\x86\x11\xc5\xe4\x82\xa0\x94\x10\x98\xc4\x81\x21\xe4\xf3\ \x00\x38\x9a\xbf\x87\x28\x97\xa4\x53\xe7\xe6\x28\x4c\x88\xb1\xfb\ \xe4\xfe\xab\x30\x40\xd6\xbd\x47\xed\x44\x15\x56\x1e\x7b\x18\xe2\ \x1c\xf5\x14\x58\x5f\x0e\x3d\xbc\x7a\x3d\x51\x6e\x0e\x47\x64\x6d\ \xe5\x75\x71\x9f\x73\xe2\x01\x78\xf1\x02\xb0\xae\x00\x19\x6b\x8e\ \x3e\x37\x85\x1b\x86\x82\x06\x5b\x69\xdf\x81\x0f\xb0\xf9\x05\xac\ \x7d\xdc\xcb\xc0\x1f\x9f\xf7\x77\xf1\xe2\x45\x33\xef\x8f\xb9\x19\ \xa7\x8e\xb3\xf5\xdf\xc4\x00\x00\x2e\x00\xfb\x07\x38\x43\x0e\x1f\ \x3e\x8c\xba\x69\x76\xaf\xda\x2b\x57\x58\x4d\xd8\x05\x76\xdd\x63\ \x16\x9b\x95\xbb\x43\x30\xe1\xe7\x16\xed\xf6\x3d\x8c\x79\x0a\xf2\ \x2c\x51\x8a\xf8\xfb\x80\x49\x6e\x4f\x58\x12\xa1\x11\x53\x2c\xba\ \x4e\x55\x81\x44\x24\x6a\x30\x09\x94\xff\x77\x7a\x4d\x83\x11\x71\ \x00\xbc\x31\x98\x91\xa6\x54\x9f\x61\xad\x82\x86\xf4\xf8\xad\x7c\ \x8e\xc0\xba\xcf\x5e\x1b\x2c\x95\xbf\x66\x4f\xfb\x45\x28\x9b\x35\ \xf1\xf7\xd2\xf9\xab\x33\xaf\x5f\x4f\x2f\x6d\x6e\x00\x20\x39\x7e\ \x60\x78\xda\x42\x46\xd4\x0d\x0c\x0d\x0d\xd9\x08\x4f\x29\xae\x10\ \x63\xf0\x45\x02\x29\x8c\x61\xed\xe9\x18\xe3\x01\x6c\x4f\x21\x95\ \x7e\x74\x2c\x5a\x19\x3d\xbb\xff\xcb\x63\xbf\x53\xd6\x99\x94\x09\ \xd7\xf9\x75\xdc\x6a\x65\x0b\xad\xeb\xcc\x05\xc8\x75\x02\x8e\x08\ \x08\xe0\x3c\x68\xa5\x95\xd8\x5f\xbc\x02\xaf\xd7\x08\xd0\x3c\x01\ \x1f\xce\x08\x18\xc2\x5f\xa7\xb4\x7f\x15\x47\x50\xab\x04\x37\xd0\ \x2c\xcc\xfb\xf0\x5d\x5d\xb8\x70\xc1\x59\x32\x33\x33\x1b\x4e\x73\ \xec\xff\x21\x00\xc0\xe3\xc7\x4f\x17\xcb\x12\xe1\x99\x9c\xb9\x81\ \xc2\xa0\xda\x20\xe0\xda\xe6\xc7\x39\x1e\xe7\xd4\x1e\x29\x37\xfd\ \xcc\xa1\xc3\xfa\x06\x85\xd2\xfb\x26\x25\xe8\x63\x58\xed\xfe\xa7\ \x1b\x80\xf8\x77\x66\x8e\xc0\x78\x6e\xe1\x57\x7b\x21\x81\xab\xfd\ \x38\x15\x58\x88\xeb\xcf\x1c\x80\x38\x00\x91\x12\x63\x1c\x15\x88\ \x29\x32\x30\x44\x3e\x4f\xe8\x40\x69\x97\xde\x33\x29\x88\x4f\xf5\ \xd9\x40\x8b\xfc\xcc\x69\xf8\x99\x9c\x9c\x74\x96\x0c\x1f\x3d\x33\ \x8d\xa6\x9f\x0f\x0e\x00\x20\x47\x87\x8e\x4f\xcf\x64\xfc\xf2\x3b\ \x76\xec\x40\xe9\x6b\x3e\x21\x18\x9f\xdd\x67\xce\x18\xb0\x95\xda\ \xe6\x05\x8a\x18\xe3\xcf\xc5\x3f\x44\x1e\x72\x59\x70\xac\x62\x0f\ \xee\x3f\xbb\xe3\x72\x5f\x20\x45\x0d\x3a\x3e\x77\xc4\x11\x28\xab\ \x2f\x5e\xc0\xaa\xb0\x23\x10\x70\x28\x65\xa5\x35\xfa\xac\x8a\x03\ \x08\x02\x0e\x5e\x8e\x02\x12\x4a\xc9\xb5\xc2\x63\x3d\xc6\x11\xc8\ \xb1\xd0\x1b\x75\xe2\xd8\x4e\x69\xe3\xa0\x11\xde\x9d\x14\xfc\xb8\ \xaf\x70\x55\x6f\xde\x07\xe2\xcf\xec\xf8\x93\x9a\xff\xb2\x5d\x9e\ \x8d\xe0\x87\x03\x00\x40\xbe\x33\x27\xce\x99\x69\x41\x20\x29\x6a\ \x03\xd4\xd8\x71\x33\xc5\x17\xb4\xe7\xda\xae\x3f\x3e\xd8\x4a\x6d\ \x85\x01\x85\xcd\x0b\x44\xab\x11\x53\xa9\x44\x0e\x55\x16\x16\x17\ \x31\xf8\x83\xe3\x78\xe6\x33\xd2\xe3\xd1\xb5\x82\xab\xfb\x55\x28\ \x40\x69\x41\x15\x62\x68\xeb\x5c\x68\xc5\x57\xe7\x4a\xd1\xa3\xaf\ \xab\xf8\x05\x95\x82\xd4\xc0\x11\x19\xf6\x52\xf0\xf7\x44\x7b\xef\ \x51\x7b\xf4\x12\x2b\xfc\xbb\xf1\x01\xbc\xd6\xac\x05\xd7\xd7\xf0\ \xe6\x7d\xf8\xdf\x3c\x7b\xf6\x6c\x16\x69\x7d\x64\xe8\xf8\x6b\x7c\ \xb7\x1f\x2c\x00\x40\xce\x9f\xba\x38\xf3\x62\xe2\xe5\x62\xce\xd0\ \x10\x8c\xb7\x36\x42\x01\x51\x3a\xf2\xa1\x49\x01\x43\x7c\x3e\x00\ \x5b\xc0\xf4\x70\x51\x7e\x4d\x06\x04\xb3\x07\xc0\x6c\x0e\x92\xa3\ \x0c\x4f\x65\xaf\x80\xcb\x76\xc5\x0b\x48\x37\xe9\x68\x05\x24\x4b\ \x4b\xc5\x38\x0a\x04\x14\x29\xa8\xbd\x0b\x79\x4d\xaf\xc2\x84\x42\ \x83\x01\x7b\x00\x32\x4a\x44\xee\x93\xdf\x41\x2b\xbf\xf2\x70\xe2\ \x61\x49\x9a\x00\xe4\xf9\x7c\x04\x16\x06\x08\x58\x19\x87\x8a\x0f\ \xee\xd3\x81\x6a\x16\x80\xa0\x97\x65\x62\x62\x22\x6b\xd6\xff\x9f\ \xe3\xbc\xdd\xd7\x07\x08\x00\x0b\xa5\x65\x3b\xb0\xf7\xf0\x6b\x0b\ \x31\x71\x7d\xcb\x96\x2d\xd2\x08\x63\x22\xac\xf2\x90\xd3\xd6\x9e\ \x88\x42\x22\xd1\x3b\x89\xf1\x49\x99\x25\x0c\xa0\xeb\xa9\x8c\x42\ \xea\x7d\x82\x72\xff\x39\x8e\xb7\xf6\x13\xc0\x0d\x3c\x27\x40\x83\ \x40\x84\x00\xd4\xe8\xc6\xa4\x60\xd0\xf9\x7f\x0a\x09\x42\x90\xb0\ \x44\x7b\x05\x85\x3e\x92\x5b\xdf\x02\x0e\x5e\xe3\xf0\x80\x3b\x1a\ \x83\x28\x77\x66\x8f\x3e\x17\x13\x2d\x29\x64\x30\xb3\x0b\xaa\xda\ \xef\xf3\x01\xe9\x66\x4c\xdf\x27\x9e\xaa\x0c\xb6\xb1\x4a\x7e\x0f\ \xfe\x7e\x94\x3d\xdf\x0f\x13\x00\x20\xb7\x6f\xdd\x9b\xbf\x76\xd9\ \xee\x80\xc2\xcc\x80\x5d\xbb\x76\x65\x85\x02\x64\x65\x89\x60\xa2\ \x9f\x43\x1c\x10\x62\x05\x3d\x76\x36\xc0\x06\x06\x0e\x0f\xf8\xba\ \xf6\x02\xe6\x17\x16\x56\xfe\xc1\x03\x31\xfd\x81\xb9\x02\x6d\xa5\ \x79\x4e\x00\x01\x07\x65\x1b\xa2\x7c\x00\xce\x35\xd9\x27\x9f\xc1\ \xb1\xb5\x77\x4a\x39\x3d\x80\x02\xf7\xa9\xa3\xac\x09\x47\x40\x63\ \x85\xb5\xf2\xe3\x3a\x85\x11\xea\xf3\xab\x56\x5c\x9b\x88\x8b\x17\ \x13\x45\xc6\x8c\x84\xb4\x55\xff\xa4\xaf\xc2\x29\xbf\xe8\x39\x58\ \xff\xd3\xa7\x4f\x9b\x39\x7f\xc8\x89\x23\xa7\xa6\x5f\x3c\x7f\xb9\ \xd8\x05\x00\x25\x87\xf7\x1d\x2f\x77\x9d\x42\x2e\xd4\xce\x0a\xc8\ \x10\xd1\x6c\x52\x50\x14\x3c\x5e\x15\xa8\x8f\x71\x40\x08\x66\x41\ \xcf\xda\x0d\x4b\x0c\x50\x82\x14\xb6\x77\x00\x6b\xa1\x14\x99\x2d\ \x3b\x29\x35\x49\xe1\xa8\x6f\x9f\x14\x9e\xb9\x04\x06\x01\x59\x5b\ \xe5\xd2\x0b\xb9\x18\xe1\x00\x44\x12\x1e\x00\x79\x2b\xc4\x05\xb8\ \x82\x95\x7f\x35\xc7\xa1\x81\x4f\xbb\xf6\x2b\x2f\xbe\xb2\x96\x98\ \xd9\x67\x0a\x91\x8c\x48\xf7\xf5\xd4\x3d\x94\x3a\xaa\xf8\xf2\x90\ \xff\x4b\x18\x28\x4b\x9e\x94\x23\xf2\xce\xaf\x6d\xf8\xe9\x02\xc0\ \xcc\xec\x6c\x38\x3c\x74\xec\xb5\xcb\x90\x9d\x3b\x77\x22\xce\x32\ \x0a\x84\x94\x32\x29\x3d\xb6\xfa\x06\x02\x2b\x75\x3c\xb3\x60\x93\ \x81\xba\x37\xc0\x78\x4d\x9e\x32\xa4\xdd\xe0\xb9\xb9\x79\x52\x78\ \xaa\xf6\xa3\x3a\x00\xed\x05\x50\x87\xa1\xaa\x2c\x5c\xab\xdc\x21\ \x45\x0a\xb2\xb2\x72\x48\xe0\x54\x28\x80\x7b\x04\x28\xe8\xa8\xcf\ \x83\xbc\x96\x4e\x0d\xf2\xfb\xe1\x48\x1e\x09\xae\x31\xf9\xa7\x5c\ \x7b\x72\xf7\xd5\x35\xb2\xf0\xe6\x4e\x3f\xa1\x45\xf8\x0d\xf4\x54\ \x73\x6a\x10\xb0\xad\x9a\x4c\xf9\xb5\xeb\x5a\x76\x1d\x9a\x5a\x24\ \x2f\xa1\x0b\x00\x6a\x0f\xb4\x72\x27\x14\xb3\x42\x10\x0d\x31\x3f\ \xfe\xf8\x23\x8e\x59\xe8\xee\x59\x89\x89\xac\xb3\x87\x84\xf0\x75\ \xeb\x68\xd4\xfb\xb3\xe5\x57\x9f\x93\xfe\x61\x24\x46\x25\xc5\xe3\ \x02\x1d\x2a\xad\x55\x83\xb4\xa3\x21\x81\x28\x2a\x95\x09\xc7\x5c\ \xef\xa0\x09\x95\x40\x24\xa2\xca\x12\x48\x68\x60\x79\x00\x41\x67\ \x2a\xc2\x8a\xd5\x4f\x29\x7f\xb1\x86\x93\x20\x3e\x40\x29\x77\x68\ \x37\xb8\xb3\x5d\xa8\x40\x40\xd2\xa8\x15\x65\xca\xaf\x8a\xf7\x31\ \x53\x87\xe0\xa4\x40\x50\xe7\xc8\xb9\xe1\x8b\x6f\x1e\x3d\x7a\xc2\ \xae\x7f\x17\x00\xb4\xfc\xb1\xf3\xc0\xd4\xd4\xe4\x6b\x13\x22\x31\ \x56\x19\x7c\x80\x4e\xbf\x18\x42\x6e\x36\x1f\x79\x02\x50\xfe\x48\ \x30\x66\xf7\x59\x3c\xa7\xfe\x88\x57\x48\x7d\x86\xf9\xd2\xfd\x0f\ \x54\x26\x4c\xb1\x3d\x31\xfe\xe4\x0d\x44\x08\xc0\x10\xab\xbf\x27\ \x52\x90\x40\x80\x43\x02\x9d\x32\x54\x20\x21\xaf\xb3\xf2\x80\x72\ \xf3\xb9\x1c\xe5\x35\xd9\xcb\xd0\x04\x25\x13\x8e\xc4\x67\x70\x16\ \x40\x9e\x4b\x1e\x01\x4f\xff\x2a\x56\xbb\xfb\x74\x2b\x5a\xfb\x3f\ \x1d\xa8\xb1\xab\x1f\xf3\x12\x24\xee\x37\x3b\xfd\x64\x8b\xef\x93\ \x47\x4e\x5b\xc4\x5f\x17\x00\x66\x66\xe7\xc2\xef\xdb\x87\xa6\x32\ \x14\x1a\x8d\x16\xd8\x5a\x2c\x8b\x14\xf4\x71\x02\x2f\x99\x6b\x66\ \x65\xb4\xab\x07\x19\x18\xcc\xeb\xf1\x22\x21\xda\x3b\x11\xf7\x47\ \x63\x93\xc0\xd3\x7c\xa8\x08\x48\x17\x0b\xf1\xb4\x60\x2a\x08\x82\ \xd0\x9a\x52\x12\x22\x26\x71\x2e\xf1\xba\xfa\x0c\x02\x4a\xda\xe2\ \xcb\xfd\xe4\x0d\xc8\x9a\x22\x30\x35\xc3\xaf\xb3\x09\xdc\x19\x49\ \x7c\x40\x6b\x8d\xad\x3f\xf1\x01\x06\x51\x48\xfb\xf9\x7f\xd2\x5f\ \x73\x85\x95\x26\x54\x8d\x3e\x2f\x5e\xbc\x70\x10\xab\xd9\x67\xd7\ \xd6\x7d\x53\x92\xf3\xef\x02\x80\x21\x98\x88\x7a\xe1\xcc\xe5\xac\ \xfa\xe8\x3d\x7b\xf6\xa8\x3d\xd6\x6c\x52\x50\xe9\x44\xaa\x26\x80\ \x27\x05\x59\xa5\xc1\xfa\x62\x92\xe9\xaf\xd0\x7b\x78\x03\x58\xb0\ \x3f\x3f\x35\x09\x11\xe3\xcf\x69\x41\xfd\x79\xe3\xb5\x01\x85\x8b\ \x2b\xbc\x7c\x08\x5e\xe3\xec\x80\xf6\x06\x20\x0a\x08\x56\xf2\xfc\ \xfa\x3e\x1a\x44\xc2\xd7\x04\x6c\xe4\x75\x1c\x85\x10\xac\xfc\x78\ \x0d\xad\xfc\x81\x2d\x7c\x68\xcf\x07\x30\x6f\xc0\x5e\xda\xa7\xa5\ \xf2\x57\x2b\xf6\x74\x1f\xc9\xf7\xdf\xb9\x73\xc7\xe5\xc8\xa1\x92\ \xdb\x42\xd5\x9f\x5a\xea\x02\x80\x25\xc7\x0e\x9c\x98\xb6\x36\x14\ \x91\x2f\xe3\x87\x1f\x7e\xc0\x36\xd7\x99\xa4\x20\x0f\xef\xb4\x27\ \x05\xb1\xab\x9e\x1e\x0b\xce\xec\x3e\x5d\xcf\xce\x08\x48\xf1\x0f\ \x03\x10\xa7\xf1\x22\x0d\x40\xc4\xb6\x13\x1f\x80\xe7\x90\xc2\x73\ \x46\x40\x0d\x08\x51\x0a\xca\xde\x00\xae\xb1\x15\x87\x12\x33\x89\ \x18\xf4\x90\x10\x15\xbb\xcb\x7d\x5a\xf1\x71\x9d\xdf\x8f\xd3\x90\ \x5a\xf9\x75\x98\x00\xb1\xac\x7f\x08\x54\x4a\xbc\x84\xfb\xa0\xfc\ \xc8\xf5\xd7\xa1\xfc\x3a\xa4\x94\x73\x3e\x82\xf4\x93\x81\x35\xa6\ \x94\x5b\xe3\xcd\xa1\xd7\xdf\xb1\x74\x01\xc0\x2e\x10\xda\xfe\xcb\ \x9e\xc9\x37\xc6\x88\x24\x21\x05\xbf\xfd\xf6\x5b\x14\x62\x74\x0a\ \x02\x94\x26\xb4\x52\x80\x7c\x3d\xcd\xec\xd3\x91\xbc\x00\x9b\x03\ \x40\x7c\x89\xeb\x9c\xb2\x13\x85\x55\xa1\x00\x0f\xeb\x88\xf5\x05\ \xac\x3e\x0f\xb1\x29\x3d\x91\xfc\x7f\x88\x14\xe8\x04\x1a\x58\xba\ \x8a\x28\xd4\x9e\x42\x92\x03\xa0\x2c\x81\x0a\x09\xd4\x5a\x60\x6f\ \x86\xbd\x1e\x0e\x13\x60\xfd\x23\x13\xbf\xa9\x55\x98\xd6\x5a\xb5\ \xfd\x9f\xf5\xd7\x75\x1f\x08\x2b\x3c\xd7\xa2\x64\x97\xfa\xa2\xc2\ \xf5\x8f\x5d\x07\xa7\x78\xbd\x0b\x00\x99\xf2\xea\xe5\xe4\xd2\xbe\ \xed\xfb\x27\xad\x3f\xb6\x7c\x31\xf0\x04\x00\x06\x9d\x82\x40\x52\ \x69\x6d\x0e\x80\x78\x85\xb4\x17\xc0\xc0\x91\xb2\xfc\x38\x05\xa9\ \x54\x50\xf7\xa1\x0e\x05\x38\x1d\xe8\x02\xd5\x04\xc4\xf9\x00\xbd\ \xc6\xc0\xa0\x40\xc0\xeb\xf7\x53\x20\xc0\x84\x1d\x11\x85\x5c\xea\ \xcb\x96\x99\xba\x04\xf5\x7d\xda\xca\x6b\xab\xcf\x0a\x5f\xac\x2d\ \x0c\x92\xdf\x9f\xea\x03\xf0\xb9\xc9\x23\x08\x6b\x87\x77\xc0\xdb\ \xff\xb8\xaf\x26\x7b\x14\x5a\x31\x3f\x1a\xd2\x30\xa4\x26\x8b\x70\ \xc6\x46\x38\xdb\x7f\xdd\x33\x69\xec\x8e\xdd\x05\x00\x4b\x50\x2f\ \x3d\x7c\xec\x8c\xb0\xa7\xe6\x44\xe1\x9f\x7e\xfa\x49\xdc\xe7\x38\ \x00\x30\x08\xc8\xff\x39\x7b\x01\x69\xc9\x2f\x0c\x8a\xb4\x0f\x7b\ \x8b\x5c\x74\x2d\x00\xc0\xba\x4f\x0e\xef\x50\x8d\x3b\xda\x15\xa6\ \x54\x21\xf3\x01\xac\xf0\x41\x85\x14\xb2\x46\x75\x02\x12\x12\x88\ \xd6\xb2\xd2\x72\xc9\x30\xe7\xff\x79\x4a\x30\xd7\x04\xe0\x48\x84\ \x23\x55\x17\x32\xc8\xe1\x9c\xb2\x17\xfc\xbb\x8b\xeb\x8f\x03\x2b\ \x32\x0e\x90\x7a\xc5\xbb\x4f\x95\xdb\x6f\x71\x48\x28\xc7\x3e\x79\ \xf2\xa4\x18\x18\x33\x2c\x1d\xda\x73\x68\x6a\xe2\xe9\x73\x3b\xee\ \xef\x02\x40\xce\x20\xd1\xd3\x6f\x6e\x8e\xdd\x32\xeb\x03\x64\xdb\ \xe5\xdf\x7e\xfb\x0d\x2e\xb4\x9d\x1e\x94\x6d\xba\xbd\x00\x01\x29\ \xa3\x78\x01\xeb\xec\x12\xe4\xeb\xda\xc1\x26\x50\xd0\xaf\x0b\x02\ \x50\xde\x4f\xdd\x47\x0c\x3d\x59\x7d\x2e\x08\x12\xe5\x70\x04\x02\ \x22\x72\x9f\xaa\xbe\x53\x6b\x38\x27\xa6\x5e\x17\xe6\x08\x10\x30\ \x93\x1f\xd6\x76\x01\x06\x22\x52\x65\x8d\x62\xfc\x54\x48\x80\x47\ \xae\xf2\x47\xc7\xac\xb0\xf5\x0f\x6f\x95\x1f\x6c\x7f\x5d\x00\xd6\ \xaa\xf2\x13\xe5\x97\xdd\x98\x4d\x39\x77\xea\xe2\x1b\xd4\xb4\xf0\ \x7a\x17\x00\xde\x41\x76\x6d\xd9\x37\x85\x32\x4a\x97\x21\xd8\x80\ \x61\xdb\xb6\x6d\x36\x08\xf0\xa0\x0f\x7b\xb3\x8d\xf4\x75\x06\x06\ \xb9\x96\xbf\x3f\x00\x44\xdc\x7f\x26\x0a\x35\x08\x88\x72\x88\x42\ \x52\x6d\x7f\x8a\x14\xa4\x49\x3c\x9c\x1d\x50\xc0\xc1\x21\x01\x84\ \xbd\x01\x3c\x87\x38\x80\x24\xd3\x1f\x9f\x13\xc0\xf7\xb1\x77\x21\ \x5e\x4a\x54\xf9\xc5\xc3\x49\x4e\x1d\x66\xeb\x2f\x6b\xbd\xf5\x4a\ \xa9\xfc\x4d\x79\x8e\x69\xfd\xe1\x4d\x22\xd7\x2f\xfc\x52\x4e\x97\ \xdf\xb1\x03\x27\xff\xea\x7c\x7f\x17\x00\xb0\x5b\xca\xb6\x9f\xf7\ \x4c\x9a\x45\x42\xaa\x46\x60\xf7\xee\xdd\xa2\xfc\xc2\xea\x9a\x20\ \xe0\x45\x67\x98\x67\x73\xbc\x9e\x1a\xff\x95\x0e\x09\xf4\x75\xdc\ \xce\x69\x41\xb1\xfe\x7c\xdd\x33\x00\x11\x1f\xe0\xa8\xde\x3f\xa2\ \xf0\x94\x56\x5b\x3d\xc6\x9b\xfb\x06\x38\x24\x60\x6f\x20\xe8\xf7\ \x4d\x73\x00\x78\xa4\x01\x94\xee\x0b\x1a\x10\x82\xae\x5b\xe0\x2c\ \xc1\xea\xcc\x46\x41\x19\x0d\x39\x67\xeb\x8f\xf3\x8f\x7a\x6a\x6e\ \xb0\xb7\x1e\x9f\xe8\x13\x2f\xdd\x05\xe1\xa7\x72\xfd\x76\x9d\xff\ \xce\x5f\xf7\xbe\x8f\x52\xdf\x2e\x00\x40\xa6\x26\xa7\x96\xb6\xfc\ \xb8\xf3\x55\x26\xb1\x82\x12\x4d\x84\x03\xb0\xaa\x59\xc4\xa0\x28\ \x68\xc5\xa7\xd2\x77\x66\x5d\x40\xdb\x1e\x01\x3b\x2d\x18\xf0\x59\ \x99\x68\xe4\x63\x92\x0f\xd0\x8a\x10\xa2\x5d\x82\xce\x04\x01\xb1\ \xe8\x7a\xc6\x9f\x94\xed\x3a\x9e\xe8\xcb\x5e\x41\xac\x0e\x80\xf7\ \x09\x90\x07\x7b\x00\xca\xa3\x11\x45\x67\xab\x2f\xf7\xc9\x67\x6e\ \xa3\xfc\x6a\x54\x59\x40\x88\x57\x5a\xfd\x86\xeb\x6d\xd6\x94\x47\ \x98\xec\x1c\xc4\x43\x2c\xbf\xdd\xdb\xaf\xb6\xbe\xdb\xfa\xe3\xae\ \xc9\xf7\xb8\xad\x57\x17\x00\x20\xcf\x9e\x4c\x2c\xee\xd9\xba\x6f\ \x52\xdc\x7b\x4b\xd0\x9f\x8d\x39\x02\x9a\x18\xc4\xc3\xe6\x05\xd6\ \xee\x32\xc4\xee\x78\x46\xb5\x60\xf2\xc8\x56\x5e\xdc\x7f\x6d\xed\ \x0b\xed\x21\xf0\x7b\x29\x65\x64\x85\x17\xc6\x9c\x15\x9e\x53\x68\ \x50\x10\xad\x38\x38\x15\xf7\x3e\x96\x3e\xd4\xd7\xf0\x10\xd1\x64\ \x9f\xc4\xf6\x5a\xa9\xf5\x51\xce\xe5\x21\xf7\xf2\x30\x11\xad\xdc\ \x61\xe5\x39\xea\x3e\x2a\x68\x22\x8f\x43\xd6\xea\xd5\xd2\xe5\xef\ \xab\xbb\x46\xad\xca\x65\xbd\xc9\xd8\x1f\x44\x1f\x2a\x4c\x65\x22\ \x75\xce\x60\xcf\xad\x3f\xed\x7a\xf5\xbe\x26\xfb\x76\x01\x80\xe4\ \xe6\xf8\x9d\xf9\x7d\x3b\x0f\x4c\x0a\x92\xe7\xb4\x10\xff\xfc\xf3\ \xcf\x20\x73\x3a\x02\x81\x6a\x05\x8a\x67\xa4\xf3\x82\xd5\x3c\x24\ \x3f\xdb\xa1\x00\x40\x8d\xac\xbd\xc9\x07\x68\x57\x3c\xd0\x1a\x83\ \x40\xa0\x5e\x7e\xb1\xac\x41\xcf\x15\xe0\x90\x80\x26\xfe\x42\x56\ \x5c\x74\x79\xb8\x58\xb5\x9f\xb6\xfc\xd4\x14\xe4\xc9\x0b\xa0\x1a\ \x7f\xf5\x7e\xf2\x24\xed\x05\xc4\x94\x3f\xd0\x34\xe1\xc2\xfb\xe5\ \x78\xbf\x81\x5d\x91\xb2\x77\xfc\x15\xe5\xc7\x5c\x3f\x53\x24\xdd\ \xf7\xd3\xee\x57\x30\x4c\xee\xbd\x4a\x17\x00\x68\x1f\xb5\xd1\x39\ \xa4\x5a\x2c\x45\x16\xc1\x64\xe1\x2f\xbf\xfc\x12\x1b\x8e\xd8\x20\ \x40\x5b\x7d\x55\x0a\x9e\x18\x14\x1f\x31\x86\x9f\xd3\xde\x41\xfb\ \x50\x00\x60\x06\x00\x60\x6b\xcf\x59\x02\xe6\x03\x88\x14\xa4\xb9\ \x81\x4a\xe1\x71\x96\x8e\xa1\x05\x04\xb4\x37\x20\xae\x3f\xc7\xda\ \x74\x1d\x4f\x66\x57\x9f\x49\x4f\x62\xfa\x93\x7c\x80\xd7\xae\xbe\ \xb2\xec\xec\x91\xb0\xf2\x17\xab\xc6\x89\x21\xaf\xff\x71\x6f\xdd\ \x0d\xf6\x35\xb1\xcd\x59\xee\x0c\x40\xd9\x8c\xc6\x66\xfb\xd5\x64\ \x9f\x1d\xbf\xee\x9d\xbc\x7f\xef\xa1\x49\x4e\x77\x01\xe0\x3d\xc8\ \x95\x0b\xd7\x67\x0f\x0f\x1d\xb7\xbf\x2d\x55\x27\xf0\x5f\xff\xf5\ \x5f\xba\x6c\x38\x3b\x43\x50\xf5\x2d\x30\x88\x37\xf8\x24\x8e\xc6\ \x1e\x03\xca\xbd\xa7\xd8\x3f\x62\xed\x89\x14\xc4\x31\x46\x0a\xca\ \x5e\x7d\x04\x02\x38\x27\x10\xf0\x72\xce\x1e\x82\xf2\x2e\x54\x23\ \x51\x60\xe5\xf6\x51\xaf\xc0\x05\x0a\x09\xd4\x91\xd7\xd8\x13\xe0\ \xcd\x44\x68\x3f\x01\x65\xf5\xe3\x29\x40\xac\x35\xea\xd5\x32\xbf\ \xdf\xe3\x9a\x8d\x3a\x01\x10\x81\x3e\x81\x01\x62\x7d\x28\xbf\x4c\ \x9f\xce\xe9\xed\xdf\xb3\xf5\x8f\xa9\x3b\xe5\x34\x2b\xf7\x7e\xa5\ \x0b\x00\x46\xce\x75\xe6\xf8\xa1\x61\x95\x76\xb1\x2b\x06\xff\xe7\ \x7f\xfe\x47\x0f\x18\xb5\x41\x40\x85\x04\xe0\x06\x7c\x45\x59\xf9\ \x78\xc9\xb0\x49\x08\x32\x48\x84\xa5\xc5\x35\xdb\x8e\x15\x71\x3e\ \x40\x83\x80\x5c\x4f\x80\x00\xaf\xf1\x78\xaf\x58\x69\x2d\xee\xd1\ \xee\xb8\x67\x0e\x80\xc8\x40\x27\x4a\xcc\x6e\x3b\x73\x00\xf1\x35\ \xfd\x28\x08\x30\xe4\x77\xa7\x90\x20\xb6\x1b\x91\x2f\xaf\x7d\xd4\ \xdb\x70\x1f\x97\x56\xbf\xe2\x3d\x2b\x3b\xee\x4b\xb6\xf6\xde\xbb\ \x77\x0f\x6c\x3f\x40\x38\x5b\xf9\xf7\x6e\x1f\x9a\x1c\x1b\xbd\xf9\ \xfe\x73\xfd\x5d\x00\xb0\x05\xbb\xaa\xc2\x13\xc8\x0d\x07\xb0\xe9\ \xe8\xd7\x5f\x7f\x2d\x35\xdd\x94\x26\xb4\xbd\x01\x80\x40\xb5\x92\ \x4b\x04\xda\xa1\x40\x68\xbd\xb7\xf4\x0a\x44\xab\x06\x19\x04\xb8\ \x48\x28\x0e\x02\xb2\xa6\x14\x93\x76\xf6\x51\xbc\x00\xc5\xd8\x5e\ \xc2\x82\x04\x07\xa0\x14\x95\x39\x90\x88\xb5\x8f\x5b\x7e\x3a\x67\ \x6b\xaf\x38\x0a\x1d\x12\xe8\x7b\xb1\xd6\xac\x55\xdd\x67\x83\xb0\ \xfa\x35\x0d\x9a\x78\x58\x73\xfc\x10\x1a\xa2\xb1\x47\x5f\x37\x77\ \xf1\xdd\xb3\xe5\x8f\xc9\x91\x6b\xe3\x7f\x17\xe5\xef\x02\x00\xe4\ \xec\xf0\x85\x99\x3f\x76\x1d\xb0\xe7\x08\x28\x14\xdf\xbe\x7d\x3b\ \x1e\x42\x0e\x1a\x21\x01\xa7\x0a\x11\x16\x70\xa3\x50\xaa\xbc\x37\ \x0a\x02\xf2\xb3\xc4\xfe\x5c\x54\x14\x67\xff\x23\xb5\x03\x0c\x02\ \xc1\x39\x06\x01\xed\x3e\x8b\x65\x8f\x87\x04\x02\x04\x22\x34\xba\ \x5b\x03\x01\x73\x00\x44\x0a\xb2\x32\x5a\x6b\x5a\xe9\xc9\xd5\x8f\ \x87\x04\x55\xef\xdf\x16\xf5\x7c\x84\x58\x3f\xf1\x7a\x7a\x8d\xf7\ \x59\xc4\xd6\x5d\xb7\x6f\xdf\x76\xa6\xa8\xbe\x7e\xc4\xfc\xa3\x23\ \x34\xb5\xaa\x0b\x00\x7f\x0f\xb9\x72\xf1\xc6\x2c\xb2\x03\x50\xa8\ \x5c\x39\x77\xee\x9c\xfb\xdf\xff\xfd\x5f\x55\xec\x91\xef\x0d\x80\ \x6c\xaa\x57\x11\x1a\xd0\x7e\x04\x24\x94\x2d\xe0\x98\xbe\xe5\x7a\ \x86\xa0\x15\x9e\xfa\x15\xc8\xda\xab\x6b\xec\x35\xa4\xb3\x03\xb4\ \xbd\x57\x3c\x24\x20\x82\xd0\xf3\xae\x3f\xa4\x8c\xaa\x79\x28\x10\ \x20\x38\xdb\x03\xa0\x35\x19\x2f\x4e\x04\x60\x11\x0d\x09\x06\x9a\ \xf5\xd2\xea\xf7\xba\x7a\xad\x9a\x02\x93\xd4\x1a\xaa\xfa\xc0\xf4\ \x53\x8e\xdf\xec\x38\x0d\x65\x9e\xff\xd5\xcd\xbf\xef\x2c\xff\x2e\ \x00\x40\xca\xfd\x06\xe7\x76\xff\xb6\x6f\x12\x68\xed\x2c\x51\x43\ \x1d\xff\xe3\x3f\xfe\x43\x6f\xe7\x64\x67\x09\x48\x09\xeb\x35\x28\ \xa8\x33\x6a\x02\x48\x51\x9d\xb8\xa3\x61\x59\x89\x42\xd2\xb2\xf3\ \x1a\x0e\x22\x95\x08\x6f\xc0\xc3\x36\x18\x04\x8a\x48\x48\x90\x9e\ \xf8\xcb\xd9\x82\xd5\x4c\x3e\xa7\xfb\x44\x22\xf9\xff\xb6\x6b\x22\ \x9c\x11\xd0\x3b\x1c\xf5\x36\x6a\x65\xef\x7e\xaf\xeb\xeb\x69\x60\ \x5d\x62\xfb\x2c\x8f\x03\x02\x8b\x8f\x02\x1f\x84\x81\xb9\x32\x5d\ \xe6\xf7\x7f\xfd\x76\xfb\xab\x7b\x77\x1f\xfc\xdd\xd9\xfe\x2e\x00\ \x40\x40\xce\xfc\xfc\xf5\xd6\x97\x66\xd9\xb0\x12\xb0\xbf\x68\x27\ \x46\xe5\xa0\xda\x87\xd0\xf6\x06\x14\x49\x57\xab\x14\xae\x59\xf7\ \xad\x22\x22\x56\xfa\x44\x39\xf1\x12\xbb\xff\x21\xb0\x65\x57\x20\ \x10\xe5\x08\x78\xd6\x40\x7c\xb3\x0d\x47\x5b\x7e\xb5\x0d\x09\x68\ \xd7\x1f\x4e\xb5\xa9\xd0\x00\x0f\x4e\xf7\x11\x29\x48\xe7\xf2\x7a\ \x04\x1c\x54\x4c\xc4\x8a\xdc\x53\x2f\x15\xbf\x8c\xf3\xfb\x9b\x75\ \x78\x5e\x11\x32\x8f\x84\x94\x1f\xf9\x7d\xb8\xfc\xa3\xa3\xa3\xea\ \x39\xb6\x4c\x3c\x7b\xbe\xf8\xc3\x97\xbf\xbd\x7c\x8c\x3e\x94\x8d\ \x21\x5d\x00\x90\xdd\x87\x7f\xfa\x7a\xcb\x4b\x7c\x81\x74\xc9\xec\ \x21\x40\xaa\x10\x29\x43\x11\x93\x1b\x20\x37\xb3\x5e\x6d\x85\x06\ \xe0\x09\x29\x9d\xa7\xf6\xe1\x97\x70\x63\x51\xda\x86\x35\x08\x88\ \x52\xb3\x17\x61\x81\x00\xce\xa3\x20\x10\xe4\x3c\x28\xf7\x9e\x43\ \x02\x4e\x0b\x8a\xc5\x57\xd9\x02\x76\xc7\x79\x53\x50\x69\xd2\x49\ \x2b\x23\x57\xfb\xc5\xdd\x76\xa9\x52\xec\xa9\x55\x4b\x8b\xdf\xe3\ \x06\x7b\x5b\x05\x3d\x49\x2e\x81\x44\x3c\x03\x19\x20\x7b\xfc\xf8\ \x71\xf7\xf4\xe9\x53\xd7\x89\xdc\xbd\x75\x7f\xfe\xc7\x52\xf9\x31\ \x97\xc2\x6d\x0c\xe9\x02\x00\x0f\x14\xf9\xe9\xcb\x2d\x2f\xf1\x45\ \xba\x4c\x91\x9c\x30\x40\x60\x68\x68\x48\x08\xc2\x7c\x6e\x40\x29\ \x7c\xad\x5a\xb8\x46\xbd\xc5\x11\x70\xe1\x50\x21\x27\x94\xfa\xe3\ \x51\x5e\x6c\xd9\x35\x08\xe0\xc0\x20\xe0\x13\x75\x02\x90\x10\x2f\ \x13\x56\x59\x02\x5c\xe1\x14\x1b\x03\x01\x13\x72\xbc\x2d\xb8\x06\ \x04\x02\x87\x88\xfb\x2f\xd7\x70\x94\x73\xa4\xf4\xfa\x9b\x35\x30\ \xfb\x28\xe6\x11\xc5\x37\x63\x7b\xce\xf9\xe3\xbb\x03\xa0\x9f\x3f\ \x7f\x5e\x4a\xc1\xb3\xe5\xea\xa5\x1b\x33\x5b\x7e\xd8\xc1\x7d\x27\ \x5d\x00\xd8\x68\x82\x0d\x47\xf0\x45\x9e\x3a\x7a\xf6\x0d\x29\xaf\ \x59\x1e\x7a\xe4\xc8\x11\xf7\x6f\xff\xf6\x6f\x70\x1b\xb1\x64\x86\ \x05\x51\x4b\x24\xa1\x41\x0d\x75\xe9\x4e\xf3\x04\xda\xab\x88\x90\ \x79\x41\x29\x75\x81\x73\x06\x01\xae\x16\xa4\xeb\x72\x3f\x6d\xee\ \xc1\xc3\x3c\x0b\x1f\x9b\xb6\xcb\xa9\x3f\x4a\x1b\xfa\x28\x49\x17\ \x0c\xcb\x1e\x0b\x09\xf4\x7d\x55\x8f\x79\xfc\x0d\xf7\xc5\x47\xbd\ \xae\xbf\x07\xc3\x3a\x2a\xeb\xce\x26\x80\xd7\x39\x7a\xf4\xe8\xdb\ \x63\xbe\x80\x90\x5d\x0c\x47\xf6\x9f\x78\xfd\xfb\x8e\xfd\xaf\x37\ \x41\x57\x5f\x17\x00\x20\xf8\x22\x8f\x1d\x1e\x9e\xde\x5d\x36\x11\ \xcd\x75\x86\xe8\x68\x08\xc1\xbc\x41\xcc\x17\x90\x32\xe2\x14\x10\ \x98\x7b\x07\x54\x2b\xad\xad\xa6\x9a\xf5\xa2\x04\x05\xbc\xc6\x92\ \x28\x28\xb7\x12\x6b\x3e\x40\xd2\x86\x72\x1e\x5d\x83\xf8\x34\x48\ \x70\xd5\x60\x7c\xd2\x0e\xcd\xf7\xa7\x8a\x3c\xea\xdb\x27\xd6\xde\ \x45\x01\x21\xb9\x5b\xb0\x9c\xfb\x02\xc4\x5e\x99\xc7\x1f\x68\xba\ \xcf\x4b\xc5\x6f\xd6\x8d\x0d\x39\x0c\x0f\x00\x1b\x75\xa0\xa2\x0f\ \xf1\x7e\xa7\x56\x1f\x9c\xd1\xaf\xdf\x6e\x7b\x75\xe6\xe4\x79\x66\ \x08\xbb\x00\xb0\x19\x04\xc5\x1b\xdf\x7f\xf9\x6b\x36\x2f\xc0\xe9\ \xc2\x7f\xfc\xc7\x7f\x84\x57\xa0\xff\xb1\x08\x08\x6c\x10\x10\x6b\ \x0f\x00\xc0\xf6\x53\x00\x04\x78\x08\xac\xb4\x0c\x02\xde\x47\x27\ \x13\x99\x20\xc0\xc0\x01\xe1\x59\x7b\xec\x0d\x68\x45\x2e\x5c\xac\ \xfa\x8e\xbc\x02\xa9\x1e\x8c\x01\x02\x15\xfb\xc9\x07\x6d\x54\x61\ \xed\xeb\xa5\xb5\x6f\xc5\xf7\xb5\xea\x1a\x6b\x6f\x36\xef\xf0\xc8\ \x2e\x64\x71\x0e\x1d\x3a\x94\x97\xde\x23\x79\x70\xef\xd1\xfc\xf7\ \xff\xfb\xcb\xcb\x07\xf7\x1f\x6d\x56\xb2\xaf\x0b\x00\x10\xcc\x67\ \xc7\x17\x7d\xe9\xec\x95\x2c\x94\xa7\x7f\x32\xf0\x02\x08\x0b\xf0\ \xcf\x16\xdb\x29\x06\xc7\xb6\x5e\x81\xe2\x13\x56\xbc\x82\x06\x62\ \x5e\x8f\x23\xc8\x43\xb8\xf3\x0c\x02\xac\xf0\x8a\x37\x88\x34\x0f\ \x11\x48\x78\x0a\x09\x04\x04\x98\x20\x94\x1d\x7b\x62\xd6\x5e\x94\ \x5b\xb7\xe4\x72\x8a\xf0\xff\xd9\x3b\x0b\xaf\x46\x92\x2d\x8c\x17\ \x49\x4b\x04\x1d\xc5\x1d\xde\x5b\x77\x77\xfd\x0b\xc7\xdd\xdd\xdd\ \xdd\xdd\xdd\xdd\x07\x77\xd9\xfa\x65\x4e\x9d\xed\x6d\x48\x9a\x0e\ \x0e\xf5\xcd\xb9\x03\x54\x82\xf3\xdd\xba\x7e\x85\xd3\x02\x10\x4e\ \x0b\x21\x20\x82\x29\xb8\x41\x41\x91\x19\x31\xc5\x84\x8c\x90\xc8\ \xa2\x5e\xdf\x32\x54\xb3\x0e\xe8\x71\x21\x8f\xbb\xc2\x8f\x52\xde\ \x03\x07\x0e\x30\x0e\xce\x57\x84\x5f\xfd\x1e\x70\x0f\xd7\x2e\xdd\ \x38\x72\xda\x79\xb5\x02\xf0\x9e\x2e\xb4\x77\xe7\xa1\xfa\x6d\x1b\ \x76\x39\xc6\x8e\xfb\x0b\x12\x92\x32\x5c\xb8\x70\x21\x4b\x49\x9c\ \xa6\x29\x7f\x50\x4a\x12\x2a\x01\xde\x87\x33\x44\x11\x15\x4b\x00\ \xf7\x20\x3d\x12\x14\x51\x1b\xd3\x38\xa0\x02\x88\xce\x6c\x82\xf3\ \xf5\x6e\xc7\x9c\x43\x51\x55\xad\x08\xe2\xc5\x0d\x00\xc4\x77\xaf\ \x04\xeb\x3e\x23\xe0\x5e\xff\x25\x90\xb8\x31\x00\xc4\x36\xdf\x2d\ \xd8\x1c\x97\x6e\x89\x09\x99\x61\x6e\x7c\x48\xdf\x63\x3f\x3e\xd1\ \x99\xf2\xf3\x0f\x1d\x3a\x14\x0b\xf2\xa1\x9c\xfd\x82\x21\x1e\xeb\ \x97\x6f\xae\xc6\x3d\x1c\x25\xfe\xbe\x56\x00\x6e\x97\x60\xe9\x9c\ \x55\x55\x0f\xee\x3d\x6a\x11\xfe\x41\x51\x09\x2d\xc6\x08\x8a\x40\ \x91\xda\x69\x11\x20\xbc\xde\xed\xed\x9f\xe8\x96\x63\x27\x3d\x04\ \x4a\x8f\x18\x92\x38\x41\x49\xa4\x00\x2e\x03\xae\x83\x24\x76\x77\ \x41\x43\x75\xe6\xcc\x30\x70\x16\xd7\x25\x70\x2b\x82\xff\x6e\xe4\ \x71\xcf\x0e\x90\x02\xdc\xe9\x40\xf5\x3c\x1e\x0d\x19\x52\x79\x85\ \x83\xd2\x9f\x37\x45\x76\xa6\x2d\x5f\xda\x32\x98\x67\xba\xcc\xfb\ \x6e\x4c\x79\x1f\xa5\xc3\xbc\x0f\xdd\x9c\xdc\xf8\xaa\x6f\x3f\x19\ \xdc\xb8\x72\xbb\x79\xe9\xdc\x55\x55\x8f\x1e\xc6\x2b\xee\xd1\x30\ \xc4\x28\x00\x66\xdf\xfa\x15\x5b\x6a\x3f\xf9\xfc\x83\xd0\x37\x3f\ \x7d\x19\xb1\x6d\x3b\x45\xf8\x04\x9d\x85\x48\x79\x79\xb9\xf8\xf6\ \xdb\x6f\x45\x51\x51\x91\xfa\x63\x75\x13\x9e\xf3\x6e\xf3\xd5\xee\ \x8a\x36\x77\x4c\x81\x94\xa2\x21\xcf\x6c\x33\xf8\x4e\xb9\xc4\xac\ \x8c\x14\x21\x83\xd6\xa2\xb5\x4d\x88\xb6\x0e\x82\x9d\x9d\x10\x32\ \xb6\xf8\x42\xe5\x1b\x79\x35\x80\x65\xa2\x36\x06\x04\xd4\xec\x7c\ \x9e\xc7\xd9\xbf\x9f\x1b\x92\xf3\x92\x7f\xc2\x51\xde\x4b\xb0\x52\ \x15\x11\x05\x53\x3a\x29\xc4\xe1\x25\xbd\x10\x7c\x5d\x28\x24\x3e\ \x47\xc2\x5e\x7b\xf7\xf7\xe7\x3e\x73\xc3\xfd\x3c\x14\xe9\xd3\xa7\ \x4f\x69\xde\x51\x65\xdb\x49\xa1\xbe\xae\xa1\xe3\xc0\xce\xc3\xf5\ \xb1\x7a\x7e\x0d\xad\x00\x14\xce\x9f\xb9\xdc\x74\xeb\xfa\xdd\x96\ \x5f\xff\xfe\x31\x5a\x5a\x51\x6c\x89\x24\x40\xba\x10\xc9\xce\xce\ \x16\xdf\x7c\xf3\x8d\xf8\xff\xff\xff\x4f\x0e\xdb\x5d\x5e\x9c\x88\ \x10\x3d\x26\x0c\x2d\xaf\x01\x48\x18\x73\x1b\x84\x53\xd9\x48\x41\ \x21\x40\x5a\x48\xce\x96\x25\xce\x52\xde\x29\x08\x81\x9b\xa2\xf6\ \xe6\x73\xa6\x3e\x9f\x40\x54\x9a\x0f\x45\xc1\xc7\x97\x12\x53\x02\ \xbc\xae\x0a\x8d\xbc\x46\x6b\x01\xaf\xef\xcf\x53\x09\x28\x77\x8a\ \x80\xeb\xa3\x47\x8f\x20\xbe\xc7\xa0\x0e\xcf\xb4\x2e\x65\xe2\x4d\ \x07\x77\x1f\x69\x18\xb5\xb9\x7d\xad\x00\xbc\xad\x01\xd6\x91\x55\ \xbe\x57\x66\xfd\xf4\xfb\x77\xd1\x48\x34\x92\x94\x1b\x84\x6f\x4a\ \x49\xf1\xbe\x7d\xfb\xc4\x97\x5f\x7e\x29\xde\x7b\xef\x3d\x91\x9e\ \x9e\xee\xfe\xa3\xf7\x26\x8c\x0f\x25\xa1\x40\x50\x2d\x05\xe2\x3a\ \x27\xe1\x98\xc1\xee\x88\x1a\x8f\xc8\x09\xa7\xe7\xf8\x27\xb2\xfb\ \xf1\x9e\x9d\x31\xb7\x01\xab\x0a\xd7\xca\x3b\x9d\xe7\x5d\xce\xbb\ \x6f\xfb\xa1\x3a\x7f\xb5\xfc\x1a\x01\x31\x4a\xc1\x52\x87\x85\x33\ \x97\x57\x11\x1d\xa6\xff\x5b\x24\x09\xfe\x88\x77\xef\xde\x2d\x26\ \x4f\x9e\x4c\x2d\x01\xfb\x0a\x30\x65\x3d\x4b\x58\x41\x9c\xc7\xbc\ \x9e\xe7\xd5\x0c\xe3\xf5\xf9\x3c\x7c\x75\x1f\x41\x3a\x7f\xbe\xbd\ \x6a\x8b\x66\xe3\x2e\xfe\x3d\x3f\x37\x6e\xfd\x5e\x91\x9f\x9b\xfe\ \xf8\xa1\x53\x0d\x2b\xe6\xaf\xa9\xd6\xe4\xd7\x0a\xc0\x67\xca\xaf\ \xb5\x93\xe8\xf0\xd2\x79\xab\xab\xef\xde\x62\x2b\x51\xf2\x80\x40\ \xa4\xa8\x18\x4c\x3a\x75\xea\x54\xb1\x67\xcf\x1e\xcc\x5a\xce\x7b\ \x46\x18\x1f\x85\x30\xea\x79\x7d\x4e\x50\x1f\x1f\xdb\x4f\xb0\x0f\ \xd2\x63\x31\x11\xd0\xdb\xb8\x71\xa3\x38\x7e\xfc\x38\x41\x3e\xf7\ \xfb\xf8\x4e\xed\x5d\xbe\x70\xad\x69\xd1\x8c\x65\x6f\x4f\x1c\x39\ \xd3\xd8\x9a\xac\x12\xd7\x0a\x40\xe3\xed\x9b\xaa\xf6\x4d\x6b\xb6\ \xd7\xca\x40\x61\x8d\xe7\xba\x72\x6f\xd0\x8b\xce\x1f\x39\x29\x44\ \x94\x01\x6e\x02\xc1\x2d\x88\xe0\xe3\xb6\xf7\x26\xad\x6f\xab\xc1\ \xc7\xe7\xf3\xab\x38\x9c\x2e\x83\x1a\x7f\x0e\xe9\xa9\xd8\x63\x64\ \x3b\x37\x3e\xfb\xf6\x39\xef\x2d\x98\xd1\xb7\x72\xc1\xba\x2a\xb9\ \x95\xb7\xbe\x81\x14\xaf\x86\x56\x00\x7d\x01\x99\x2a\x6c\xc5\x1a\ \xd8\xb0\x72\x2b\x23\xa0\xfb\xc2\x9c\x24\x85\x45\x97\x1a\x03\x49\ \x70\x13\xb8\x01\x29\x61\xa5\xce\x60\x40\x5c\x82\xf8\x1f\xb3\xef\ \x15\x07\x2d\xd6\x90\x9c\xbc\xfd\xda\xb5\x6b\x63\x8a\xef\xf6\xed\ \xdb\x2a\x7f\xdf\x6b\x3c\x7b\xf2\xa2\x0d\x25\xbd\x6e\xf9\xe6\x1a\ \x3a\x41\x45\x3f\x40\x2b\x00\x0d\x76\xbf\xb5\x2e\x93\x8a\x60\xc7\ \xa6\x3d\xb5\x54\x15\x8a\x3e\x02\x04\x61\x36\xdd\xb6\x6d\xdb\x62\ \xc3\x49\xe6\xcd\x9b\x87\xab\x40\xdc\x80\xb4\x97\xb3\x70\xc8\x8b\ \xdc\x1e\x64\xed\x7f\x97\x80\x33\x7a\x28\x20\xf8\xd1\xa3\x47\x09\ \x88\x42\x7a\x94\x1d\x3e\xbe\xc7\x4d\xef\xbf\x84\x17\xd2\xaf\x94\ \x25\xde\x28\x69\xd1\xdf\xd0\x0a\x40\x83\x14\x1a\x7b\x09\x96\xcc\ \x59\x59\x45\x35\x21\xb7\x8f\xe8\x43\x40\x20\x7a\xd8\x99\x5c\x83\ \x55\x30\x6b\xd6\x2c\x31\x6d\xda\x34\xe5\x23\x43\x2c\xac\x04\xd5\ \x83\x90\x4c\x55\x1d\x2f\xfb\xe4\x66\xc7\x75\xe1\x6b\xe1\x76\x67\ \xc8\x2a\xc1\xbb\xe5\xcb\x97\xd3\x3c\x05\xf9\xf9\x5a\x55\x13\x55\ \x9f\xfe\x7c\xe4\x68\xae\x16\x1a\x77\x56\x2d\x5e\x5f\x33\x68\xa3\ \xb9\x75\x1a\x50\x2b\x02\xaa\x09\x91\xdc\xbc\x6c\xe3\xb3\xaf\x3f\ \x0e\x17\x97\x15\x5a\xa4\xe0\xfa\x1a\xe4\xc0\xe9\x3f\x40\x14\x0c\ \xc3\x10\x63\xc7\x8e\x15\x19\x19\x19\x31\x21\xd5\x98\x96\x96\x26\ \xa2\xd1\xa8\xb0\x6d\x5b\x58\x96\x85\xf8\xce\xd1\x03\xe7\x6a\x6c\ \xa6\xe9\xf0\x12\x97\x05\x32\x13\xc7\x40\x78\x1b\x41\x11\x0d\x04\ \xc8\xc8\xdc\xb8\x76\xbb\x99\x6e\xbd\x21\xb5\x7b\x5f\x2b\x00\x0d\ \xb6\xc3\x3c\x59\xfb\xac\x36\x33\x2b\x23\xf8\xe1\xa7\xef\xd9\xff\ \xff\xa0\xc2\x0e\x47\xc2\xfd\x6a\x45\x61\x4a\x3f\x7f\xfe\x3c\x26\ \xdd\x01\x45\x44\x21\x52\x28\x14\x12\x91\x48\x04\x85\x11\x23\x3a\ \x4a\x01\xf0\x98\xea\x66\x44\x20\xb9\x5a\x8c\xc9\xcc\x3c\xdc\x12\ \x65\x65\x0c\x26\x6a\xaa\x6a\xda\xaf\x5e\xbe\xd9\x2c\x1b\xb8\x9a\ \x1b\x1a\x1a\x87\x6e\xd1\xbe\x56\x00\x1a\x55\x6f\xab\xdb\xe5\x8e\ \x82\x06\x76\xc4\xe7\x17\xe5\x99\x1f\x7c\xf2\xff\x50\x49\x79\x91\ \xb2\x0a\x06\x14\x8a\xd8\x10\x9a\x1b\x7b\x38\x81\xc1\x1c\xf7\xe5\ \x04\xde\xcb\xe7\xaf\x35\x11\x77\x11\x1a\x3a\x06\x30\xdc\x86\x90\ \xf0\x87\xcb\x1c\x79\x59\x54\xf4\x96\xed\x45\xec\x8f\x17\x1a\x09\ \x15\xd6\xe3\x07\x4f\x5a\x0f\xec\x3a\x5c\x3f\x6f\xca\xa2\xb7\xfc\ \xec\x34\xf9\xb5\x05\x20\x46\xc2\x6c\x42\xb6\x17\x21\xd2\x45\x08\ \xc8\x52\x63\xbb\xac\xb2\xc4\x1a\x37\x61\xac\x21\x34\xe9\xc5\xf3\ \x27\x2f\x5a\x6f\x5d\xbf\xd3\x42\x05\xe6\x48\x37\xf1\xb5\x02\xd0\ \x2e\x42\x07\xd5\x69\x48\x5a\x7a\x6a\xa0\xb8\xb4\xd0\x2c\x2c\xc9\ \xb7\xf2\x0a\x73\x4c\xd5\x89\x38\xd2\xd1\x28\x49\xfe\xe0\xee\xe3\ \xd6\x07\x77\x1f\x22\x2d\xa3\xb2\x60\x47\x2b\x00\x0d\x06\x52\x5c\ \x3c\x77\xa5\x19\xa1\xbb\x2f\x37\x3f\xdb\x2c\x28\xce\x37\xb3\x73\ \x27\x18\x13\xb2\xc7\x1b\x26\xdb\x46\x46\x00\x18\xba\xf2\xfc\xe9\ \x8b\xd6\x67\x8f\x9f\xb7\xdd\xbf\xf3\xb0\xb5\x9b\x19\xfb\x1a\x5a\ \x01\xe8\x98\xc1\x43\xe9\xff\x22\xaa\xdd\x77\xac\x74\x11\xf2\x0a\ \x72\x8c\xec\x9c\x09\xc6\xd8\xf1\x63\x8c\x8c\xac\x74\x79\x1c\x18\ \xf2\xc1\x3b\x02\xa1\xaf\x9e\xbf\x6a\x7f\x26\x49\xff\xe4\xd1\x3f\ \xed\xdc\xe5\x92\xe3\x30\x10\x04\x60\x8d\x6c\x87\x96\xf1\xc1\xee\ \xfd\xff\x1f\x73\x12\x5b\x31\xcc\x8d\xee\xba\xea\x54\x5a\xe6\x40\ \x7f\x5b\x2d\x08\xf8\x9f\xc6\xb8\xf9\xd0\xd9\x93\x93\xbd\x23\x16\ \x80\x87\x61\x41\xf8\xf4\xe1\x73\x17\xe3\xa0\x2a\x0b\x39\x39\x3f\ \x2d\xce\x2f\x2d\x17\x67\xc5\xf1\xe9\x51\x61\xa7\x11\xc5\xc1\xc1\ \xbe\x7f\xed\xa3\x85\xa6\x09\xba\xf8\xbd\xe8\xe3\xf5\x8d\xf8\x44\ \xe4\x97\xcf\x5f\xbb\x2f\xb6\xd0\x7f\xd8\x98\x3f\xaf\xc5\x02\x40\ \x2f\xa0\xed\x7a\x4d\x8b\x42\x6a\x6f\x36\xf5\x87\xc7\x87\xfe\xe0\ \x68\xdf\xcf\x6c\x3c\x99\x4d\x64\x32\x1e\xfb\xf1\x74\x2a\x93\xe9\ \xc8\x4f\xa7\x13\x31\x4e\xbc\x48\x55\x55\x2e\xaa\xaa\x52\x54\xf5\ \xef\x5e\x1b\xff\x01\xa9\x0e\x3f\x65\x66\x0b\x7c\x68\x96\x41\x43\ \x13\xb4\x6e\x1a\x1b\xd7\xba\x98\xd7\xc3\xfc\xd7\xbc\xff\xf9\xe3\ \xd7\xd0\x84\xa0\x6e\x3d\x10\x0b\x00\x2d\x96\xf5\x10\x63\x3f\x6b\ \xed\x88\xf8\x1c\x00\x11\xb1\x00\x10\x11\x0b\x00\x11\xb1\x00\x10\ \x11\x0b\x00\x11\xb1\x00\x10\x11\x0b\x00\x11\xb1\x00\x10\x11\x0b\ \x00\x11\xa1\x00\x10\x11\x1f\x05\x96\xf8\x27\x85\x03\x50\xbc\x69\ \xd1\xd8\xa9\xd3\xec\x3d\xbc\xfd\xc6\x88\x48\x7c\xba\x38\x1f\x58\ \x00\x46\x07\x53\x97\xd3\x6c\xa6\x8a\x57\x8d\xda\x64\x5d\x11\x91\ \xa8\x35\xc8\xcb\x9d\x02\x68\xd2\x5b\xde\x10\x11\x29\x12\x0d\x88\ \x26\xfd\xff\x40\xa9\xe2\xde\xb9\x8c\xaa\xca\xbf\x7e\xf0\xc3\xd0\ \x97\x5d\xd7\x8e\x2d\xfb\x7d\xdf\x1e\xdb\x3c\xe6\x48\x55\xf7\x2d\ \x13\x1c\x45\x58\x21\x51\x71\x6b\x81\x88\x7b\xfe\x10\x16\x1f\xad\ \xef\x2c\x7d\x5a\x0c\x90\x3b\x4f\xdf\x05\xbd\xb7\x54\x96\x89\xe5\ \xc0\x72\x62\x39\x43\x1f\xe7\x53\x14\x80\x62\x2d\x2e\x05\x10\x91\ \x5a\x06\x2c\xfe\x60\x99\x5b\x7e\x58\xbe\x21\xbf\x2c\x4b\x4b\x6b\ \xe9\xcb\x07\x6c\xb0\xc7\x97\x1a\x6c\xc0\xe3\xb5\x02\xe3\x35\x28\ \x00\x44\x94\xac\xd7\x80\xb5\xda\x58\x56\x96\x2e\x3f\x12\x28\xef\ \x79\x4e\x31\xe4\x8b\x1f\x1b\x1b\x27\x7b\x7f\xcb\x1a\x20\xa2\x01\ \x59\x61\xcd\xce\x2d\x35\xd6\x70\x67\x51\x44\xcb\x5b\x16\xbe\x60\ \x9c\xef\xfd\x3d\xe6\x0d\x0f\xff\xd7\x1e\xf1\x34\x60\x65\xa9\x91\ \x90\x5c\x13\x30\xf7\x3f\x02\xe8\xb1\xa1\x68\xc0\xb8\x44\x04\x59\ \x0f\x44\x94\xae\xdb\x0e\x3b\xef\x90\x9f\x06\xdc\x55\x00\xd4\x22\ \xc9\x86\x00\xc5\x00\x7b\xfe\x24\xeb\x80\x88\xf2\x5b\x81\x28\x04\ \x48\x9f\x15\x80\x7b\x6f\xac\xcf\xaa\x8a\x20\x06\xfd\xba\x20\x22\ \x4d\x32\x24\x3d\xc6\xe6\x9e\xf7\xee\x25\xef\x93\xac\x37\x22\x52\ \xe4\xea\xf8\x01\x8b\x58\xee\x98\x13\xd1\xfa\xd2\x9b\xe6\x7f\x00\ \x1a\x9d\x6c\xd2\xd3\xe1\x37\x14\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x01\x0e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x00\xd5\x49\x44\x41\x54\x78\x01\x7d\xcf\x25\x54\x44\x51\ \x10\xc6\xf1\x4b\x6f\xf4\x48\x85\x1e\xc9\x48\xa6\x9f\xc7\x5c\x9c\ \x86\xf7\x42\xcf\x68\xc7\xdd\xdd\xdd\xdd\x5d\xd7\x7d\xf7\x7b\x1a\ \xe6\xec\x93\xf9\xd7\xdf\x95\x11\xdf\x77\x3f\xe0\x3d\xfa\x6e\x8b\ \x05\x1b\x1b\xb8\xc7\x51\xfa\xae\xd4\x13\x1c\xe0\x58\x27\x1c\xbc\ \xe3\x5e\xeb\xc9\x00\x4f\x38\xd3\xba\x88\xde\xe6\x33\xf0\x8d\x2f\ \xad\x6f\xfc\xb0\xbe\xca\x18\xf8\xc4\x33\xeb\xc5\x0e\xbe\xf0\xc2\ \x7a\xb3\x83\x6f\x7c\xb0\x3e\x19\x50\x72\x0d\xf0\x81\x47\xd6\x33\ \xbe\xd1\x89\xc6\x3d\x3a\xa5\x88\xbc\x35\x40\x76\x1f\x20\xbd\x98\ \xbc\xa0\x49\x6b\xcd\x3b\xd6\x83\x06\x06\xb1\x55\x25\x72\x84\xa0\ \x12\x97\x1b\xd6\xad\x3f\x58\xc0\x7e\x83\x0e\x64\x3b\x7d\xd3\xa0\ \xed\x86\x4f\x8c\x61\xd1\x04\xb7\x04\xda\xb4\x81\x7e\x90\xd6\x86\ \x06\xca\x0b\x64\x9b\x92\x27\x7e\x7a\x7f\xa6\x79\xab\xdb\xf5\xf1\ \x96\xc0\xc3\xfc\x77\xa1\x30\x46\x05\x2b\xa1\x7e\xf9\x33\x68\xcf\ \x55\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x02\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x3f\x50\x4c\x54\x45\x43\xd4\x5c\xe7\xec\xee\xe7\xed\ \xed\x85\xde\x96\xe7\xec\xed\x44\xd4\x5d\x4b\xd6\x63\x47\x70\x4c\ \xe7\xec\xed\xe7\xec\xed\xe7\xec\xec\xe7\xec\xec\x84\xde\x95\xeb\ \xeb\xeb\xbd\xe6\xc5\xbf\xe7\xc7\xeb\xeb\xeb\x75\xdc\x8a\x77\xdc\ \x89\x58\xd8\x6f\x56\xd7\x6d\x98\xb9\x78\xae\x00\x00\x00\x15\x74\ \x52\x4e\x53\xff\xb1\xb5\xd9\xf5\xff\xfe\x00\xff\xf7\xb3\xb2\xdb\ \x19\x1f\x20\x1a\xe0\xdf\xfe\xfe\x88\xcc\xa8\x2c\x00\x00\x00\x5d\ \x49\x44\x41\x54\x78\x01\xed\xd7\xb5\x01\x80\x40\x00\x43\xd1\x73\ \xc1\x6d\xff\x59\xe9\x91\x9c\x75\x90\xdf\xe7\xf5\x11\xbe\xb1\x2f\ \x02\x4b\x6f\xc2\x6b\x46\x8e\x49\x40\x05\x58\x97\x04\x22\x06\x62\ \x12\x08\x89\x92\x80\x48\xf4\x5f\x80\x00\x01\x02\x04\x08\x10\x20\ \x40\x80\x00\x01\x02\x16\xef\x6d\x12\x38\x30\xb0\x27\x81\x01\x03\ \x3a\x09\xcc\xab\x7b\x9f\xbb\x6d\xba\x03\xfc\xce\x27\xaa\xaa\x43\ \x8c\x01\x89\xac\xbf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x00\x72\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x39\x49\x44\x41\x54\x78\x01\x63\x70\x2f\xf0\xa1\x08\ \x63\x08\x3c\x7f\xf3\xf6\x01\x10\xff\xc7\x81\x1f\x10\x34\xe0\xcc\ \x99\x33\xff\xf1\xe1\x91\x62\xc0\xa8\x01\xa3\x06\x5c\xb8\x70\xf1\ \x17\x2e\xcd\xe7\x2f\x5c\xf8\x85\xcd\x00\x8a\x30\x00\x88\x40\x0f\ \xcf\x09\x23\xd5\x1f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x01\x13\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x4e\x50\x4c\x54\x45\x47\x70\x4c\xe7\xec\xec\xf5\x80\ \x81\xf3\x8c\x8d\xe7\xec\xee\xe7\xed\xed\xea\xea\xea\xeb\xeb\xeb\ \xe7\xec\xed\xe7\xec\xed\xed\xc0\xc0\xe7\xec\xec\xf5\x83\x83\xf3\ \x8c\x8e\xec\xc0\xc0\xeb\xeb\xeb\xff\x2a\x2a\xe7\xec\xed\xff\x2b\ \x2b\xfd\x3a\x3a\xfe\x2f\x2f\xff\x2e\x2e\xfb\x4d\x4e\xfa\x4f\x50\ \xfe\x32\x32\xfe\x31\x31\x9f\xb8\x3c\xb3\x00\x00\x00\x10\x74\x52\ \x4e\x53\x00\xb3\xfb\xd0\xb1\xb5\x18\x19\xf7\xf5\xc1\xb2\xfb\xcf\ \xbf\x1a\xd1\xcd\x16\x06\x00\x00\x00\x64\x49\x44\x41\x54\x78\x01\ \xed\xcc\xb7\x11\xc0\x20\x00\x04\x41\x64\x01\x79\x40\xb6\xff\x46\ \x55\x00\xc3\xff\x28\x51\xf4\x97\xdf\x1a\x95\xb7\x8e\x3e\x14\xf3\ \xad\xa5\x40\x17\x60\x15\x05\x1c\x06\x1c\x05\x02\x49\x80\x00\x01\ \x02\x04\x08\xf8\x04\x6c\x24\x01\x02\x04\x08\x10\xf0\x27\x10\xf1\ \x1f\x29\x90\x30\x90\x28\x70\x62\xe0\xa2\x40\x8d\x81\x89\x02\xc3\ \x81\xfe\x7d\xa1\x80\x6d\x9e\xf2\x7f\xcf\xbd\x51\x59\x2f\xba\x2d\ \x73\x18\x48\xbd\x29\xdc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\x43\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x01\x0a\x49\x44\x41\x54\x78\x01\x9d\x52\x25\x50\x00\x41\ \x14\x5d\xb4\x0f\xda\x1b\x9d\x8a\xfb\xed\xe2\xd2\x33\x54\xfa\x0c\ \x09\x8f\x90\x70\x97\x5e\x70\x68\xd8\x39\xd2\x33\x72\xda\x90\x65\ \x1f\x6e\xa7\x7f\x66\xe5\xcb\xfb\x4e\xc2\xc8\x37\x5b\x8b\x71\x48\ \x5a\xb2\x14\x36\x7e\x2f\x4b\x63\xa9\xc0\xee\x79\x4b\x81\x70\xe0\ \x59\x0a\xf5\x3d\xbd\xa1\x28\xb1\x83\x7b\x45\x1a\x16\x60\x8e\x63\ \x2b\x74\x28\x59\xf4\x93\x8e\x7c\x4b\xa6\x2e\xc0\xef\xc7\xf7\x14\ \xa9\x30\x10\xc0\x2f\x7b\x72\x6f\xcf\x5b\x4a\x2c\x85\xb5\x5a\x8a\ \xd4\x2f\x00\xdb\x00\xfe\x3a\xdb\xd0\xc1\x06\xb6\xc0\x10\x10\x9a\ \x24\x94\x8f\x30\x4a\x78\x1e\x81\x25\x7c\xb3\x27\x4b\x30\x8b\x49\ \x1d\xdc\xab\x74\x83\x9f\x97\xe6\x10\x10\x87\x13\x99\xce\xc5\x04\ \xa3\xa9\xab\xfc\xa0\x2a\xfb\x67\x1f\x38\xc9\xb0\x65\x3a\x19\xc3\ \xc1\x34\xe7\x03\x99\xc1\xdd\x8f\x70\x00\x9b\x90\xcd\xa3\x15\x91\ \xb5\xcb\xac\x3c\x78\x79\x54\xd6\x17\xe9\x40\x91\x7a\x03\x1d\xfc\ \xea\x81\x61\xab\xac\xc7\x56\x58\x9d\xf8\x9f\x7e\xca\x55\x3a\x11\ \x56\xc2\x91\xad\xd0\x6b\x00\xd1\xd4\xef\xba\x77\x47\x9a\x38\x87\ \xc1\x0e\x54\xda\x86\x91\x06\xe9\xa1\x83\xcd\x77\xd9\x0b\x31\xa1\ \x86\x22\xbe\x70\x88\x37\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x00\xf7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x39\x50\x4c\x54\x45\xcc\xcc\xcc\xe7\xec\xee\xe7\xed\ \xed\xe7\xec\xec\xe7\xec\xed\xcd\xcd\xce\xe7\xec\xed\xe7\xec\xed\ \x47\x70\x4c\xcd\xcd\xcd\xd4\xd5\xd5\xd2\xd4\xd5\xe7\xec\xec\xd3\ \xd5\xd5\xd3\xd5\xd5\xeb\xeb\xeb\xdb\xdb\xdb\xd9\xd9\xd9\xeb\xeb\ \xeb\x0f\xde\xce\x71\x00\x00\x00\x13\x74\x52\x4e\x53\xff\xb1\xb5\ \xb3\xf7\xff\xf5\xff\x00\xff\xe5\xe5\xb2\xe4\xe3\x19\x2a\x28\x1a\ \x6e\x03\x22\x86\x00\x00\x00\x5a\x49\x44\x41\x54\x78\x01\xed\xd7\ \xb7\x15\x80\x30\x10\xc0\xd0\x73\xb6\xc9\xb0\xff\xb0\xf4\x24\xa7\ \x8e\x27\x0d\xf0\x7b\x49\xec\xec\x8f\xc0\x31\xf9\xf0\x9a\x57\x6b\ \x16\xd0\xe1\x33\x93\x05\xec\x37\x60\xb3\x40\xc8\x04\x00\x50\x04\ \x48\x26\x00\x00\x00\x80\x26\x00\x00\x00\x00\x00\x00\xc0\xc9\x67\ \x2e\x0b\x0c\xf2\xd9\x92\x05\xb6\x31\xc9\x6b\x69\xde\xef\x00\xef\ \x7c\x02\xce\x72\x52\xef\x02\xdf\x42\xcd\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x5e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ \x00\x00\x05\x25\x49\x44\x41\x54\x78\xda\xed\x9a\x03\x74\x2c\x59\ \x10\x40\xd7\xb6\x34\x99\xb5\x6d\x7c\xdb\xb6\x6d\x23\x36\x06\xdf\ \x36\x62\xdb\xb6\x6d\xdb\x1c\xc5\x42\x6d\xa7\xce\xee\xfb\x52\x67\ \xa6\x23\xf4\x39\x35\xc6\xbd\xdd\xf5\x84\xc7\x46\x8e\xfb\x1c\xca\ \x1f\xf2\x5f\x57\xfe\x80\x77\x56\xf9\x03\xbd\x29\x42\x85\x51\xd3\ \x6a\xe4\x47\x19\x57\xa8\x8c\x7d\x7b\xc0\x83\x6b\x3f\xa6\xfd\x84\ \x12\x8b\xbb\x8e\x8a\x6a\x2a\x40\x59\x8e\x3f\xa3\x5a\x61\xcc\x8c\ \x1a\xf9\xd1\x40\x85\xa8\xfa\xf0\x98\xfd\xb0\x74\xe9\x93\x03\x12\ \x5e\x89\xcd\x19\xa7\xc4\xe2\x24\x76\x83\x63\xdc\x2d\x40\x62\x4c\ \x7a\xf7\x55\x19\x30\xe0\x8a\xec\xa3\x1f\x28\xb3\x38\xc6\x14\x70\ \x17\x82\x3f\x42\x80\xc4\xe1\x51\x2e\xe2\xc3\xa3\x3e\xea\xbf\x74\ \xf9\x4e\xfb\x19\x25\x39\xee\x7e\x0a\xb4\x8e\x40\xd3\x16\x20\xd1\ \x48\x5d\x11\xed\x02\xed\x09\xcf\xf5\x6d\xba\x7c\xc0\x99\x4b\x01\ \xe6\x11\x58\xa9\x05\x48\x14\x0b\x14\xc6\xac\xeb\x75\x70\x15\x16\ \xef\x4b\x45\x16\xc7\x8d\x40\x32\x26\x40\xc2\x4f\x24\x3f\xea\x7b\ \xe6\xd3\xe5\x6d\xed\x97\x94\xe5\xb8\xda\x14\x54\x2b\xc2\xf5\x9a\ \x00\x46\xbb\x40\x7e\xcc\x59\x91\xd2\x6f\xaf\x32\x80\x0e\x8f\xff\ \x57\x2d\x56\x12\xb0\xde\x17\xc0\xa8\x96\x1f\x2d\x90\xa9\xda\x55\ \x64\x73\x7e\x57\x64\x71\xc3\x09\x10\xc3\x02\xf4\x63\x54\x5c\x95\ \xc2\xd8\xd1\xb4\xc1\x55\x3f\xe2\xbe\x4f\x81\x5f\xa5\x00\x3a\x11\ \xa4\xdf\x05\x30\xba\x04\xf2\xa3\xad\x85\x87\xc6\xb1\x1f\x0a\x4f\ \x81\x4f\x24\xd5\x22\x8d\xd0\xfe\xf2\xe4\x1d\xcf\xcf\x4e\xbb\x08\ \x6e\x1c\x5b\x48\xf3\x08\x84\x82\xc8\x70\xf0\x39\xe5\x7c\x90\x08\ \x30\x13\x75\x35\x8a\xa3\x27\x3e\x50\x80\x2a\xa8\xdb\xe8\x80\xf3\ \x7e\xbc\x00\x26\x8b\x1d\xc1\x7d\x77\x30\x9c\x1f\x67\x08\xd7\x97\ \xdf\x80\xd2\xc4\x68\x80\xae\x9c\x3b\x22\xcc\xd0\x43\x9d\x49\x01\ \x8c\xc3\x63\xb6\x49\x2b\x80\xe0\xe6\xcb\x9c\x11\xfc\xff\xc8\xf5\ \x4c\x00\xe8\x24\xd0\x50\x1c\x1f\x05\x41\x17\x5d\xc1\xfa\x80\x19\ \xe8\xaf\xd4\x5f\x49\x57\x40\x74\x7c\x29\x34\xba\x1f\xc1\x10\x1d\ \x5d\xcc\xac\x80\xe6\x67\xc7\xc1\x7a\xb5\x07\x02\xfb\xc8\x87\x42\ \x96\x73\x3c\x94\x45\x25\x43\x65\x42\x0a\x01\xcf\xf4\x0a\x85\x53\ \x93\x2e\x48\x55\x06\xea\x4c\x0e\x01\xb4\x67\x92\xdf\x82\xf6\x0c\ \xa8\x33\x3e\xc0\x9c\xc0\x89\x3f\xaf\x11\xf8\x86\xca\x8c\x7b\x52\ \x25\xc7\x35\x01\x5c\x77\x06\x02\xff\xa7\x9e\x0b\x08\x54\x27\x42\ \x57\x63\x22\x40\x67\x36\x34\x47\xe9\x43\x4b\xac\x11\xfe\x66\x67\ \x6d\x2c\xd4\x28\x8d\x63\x46\xe0\xf2\x14\x53\x14\xc8\x74\x8c\xc3\ \x1f\xaf\xcc\x88\x07\xab\x7d\xa6\x50\x12\x87\x79\x0f\x05\x7e\x89\ \xf8\xbe\xcb\x36\x7f\x50\x91\xe3\xf5\x48\x40\x7c\x66\x0d\xfe\x46\ \x7b\x91\x17\x79\xad\xa3\x22\x08\x5f\x13\x1d\x5f\xc6\x8c\x80\xc9\ \x12\x2c\xb0\x50\x1e\x93\x8c\x3f\x6c\xb6\xc3\x18\x5f\xbf\xb6\xec\ \x06\x3e\x17\x66\xa5\xe1\xfb\x76\x1b\xbc\x7b\x7c\x05\x84\xdc\xf9\ \x78\xf6\xbb\x1a\x93\x40\x7c\x6e\x2d\x48\x2e\x6c\x80\xae\x96\x34\ \x80\x8e\x2c\x10\xea\xcc\x62\x46\xc0\x61\x93\x2f\x60\x81\xf5\x48\ \x40\xe0\xdc\xe0\x30\xb8\xb2\xe8\x1a\xa4\x79\xe0\x99\x82\x92\xb0\ \x24\x7c\xdf\x78\xa1\x83\x54\x65\xa0\x2d\xd7\xf5\x9e\xb4\x6c\x8e\ \xbc\xc9\x4c\x19\x50\xff\xe4\x18\xa9\x71\xfc\x54\x43\xa1\x59\x94\ \x75\xc7\x1f\xb5\x37\x65\x43\x90\x6e\x38\xbe\x7f\x79\xb2\x69\x8f\ \x05\x24\x17\x37\x62\xa1\xc5\xbc\x17\x47\x61\xfa\x34\x7a\x9d\x80\ \x1a\xc5\xb1\xcc\x08\x1c\xf9\xe5\xd2\x1d\xd5\x66\x80\x46\x18\x9e\ \x71\x71\x7e\x3a\x94\x46\x26\x43\xb0\x1e\xc2\x63\x1c\xfb\xfd\x4a\ \x8f\x04\x24\x97\x36\x41\x57\x13\xa6\x25\xb4\xa6\x58\x43\x8d\xc2\ \x58\xe6\xdb\x81\x0b\x13\x0c\x11\x8e\x4e\x68\x7d\x71\x92\x8e\x00\ \xd6\x2e\x0d\xee\x7c\x52\x75\xb6\x17\x78\x82\x40\x6d\x72\xef\x34\ \x64\x06\xf3\x6c\x69\xc1\x3b\x6f\xf3\x07\xe5\x47\xf4\x85\x04\x1a\ \xd3\xa0\xde\x4e\x1d\x3a\xaa\x43\x81\xa4\x60\x81\x07\x08\x54\x26\ \xf5\x5e\x4b\x6c\xb3\xd6\x83\x96\x80\xf9\x72\xe7\xfb\x76\xe6\xea\ \xac\x55\x36\x37\x47\xdc\x80\xb6\x2c\x27\xe8\x6a\xc3\x5c\xbf\x27\ \xda\xf2\xdc\xb0\xf6\x61\x5c\x40\x85\xcd\x03\xd7\x5d\x41\xb4\x04\ \xae\xcf\xb0\xbc\xaf\x40\x63\xd8\x15\xf5\xdb\x61\x3b\x25\x31\xd0\ \x14\x70\x1e\x9a\x42\x2e\x41\x5b\xbe\x3b\x56\xa1\xf8\x5e\x47\x16\ \x34\x7a\x1e\x61\x56\x80\xf3\xdd\x59\xda\xf9\x7f\x7a\xd4\x8d\xfb\ \x0a\x34\x05\x9c\x95\x6f\x2f\xf3\x87\x96\x38\x53\xec\x1e\xdc\xdd\ \xba\x8a\x8e\x2d\x81\x96\x04\x33\x22\xd8\x12\x67\x02\xcd\xe1\xd7\ \xa1\xc1\x41\x1b\x04\x6a\x93\x64\x13\x38\x3d\xea\x26\x6d\x01\xbd\ \xef\xce\xc8\x34\x1e\x68\xf4\x3e\x75\x4f\x6a\x75\x94\x07\x80\x40\ \x7d\x8a\xf4\x02\xd7\x66\x5a\xd0\x82\x77\xdb\x19\x84\xe9\x26\x8b\ \x40\x93\xff\x59\x84\x6e\x2f\xf6\x81\x7a\x7b\x4d\xd2\x9d\x68\x70\ \xe1\x48\x2f\x60\xbe\xc2\x85\x96\x80\xf5\x5a\x0f\x99\x47\x64\x6d\ \xd9\x4e\x08\x2c\xb9\xba\xb5\xfb\x39\xa6\x1b\xa6\x54\x82\xa9\x54\ \x02\x58\x25\x52\x55\x23\x2d\x01\x83\x79\x36\xb2\x0a\x60\x4f\x14\ \x81\xe3\x4d\x40\x7c\x7a\x55\x77\xc3\x86\xcf\x9b\xfc\xcf\x49\x27\ \x40\x35\x4a\x08\xe7\xba\x23\x00\xcc\x96\x3a\xc1\xc5\x89\xc6\xc0\ \xfd\xe1\x3c\x0e\x6a\xec\x37\x7a\xdf\x21\x70\x7e\xbc\xa1\xac\x02\ \xd8\xf3\xec\x6a\x4d\x85\x3b\x6a\xac\xfa\x78\x10\x72\xe6\x49\x25\ \x80\x83\x18\xfe\x4f\xe7\x41\x99\xcd\xbf\x07\x4c\xf5\xe3\xa3\xa0\ \x3f\x97\x34\x70\xd8\xdd\x60\x62\x50\x8f\x67\x3e\xd9\x8a\xca\xff\ \x40\xbc\x12\x64\x64\x26\x85\x00\xad\x38\xfe\xc7\x55\x70\xda\xea\ \x8f\x1d\x3e\x06\x04\x98\x6c\xc8\xe8\x87\xc6\xa7\x08\xdf\xa7\x02\ \x0c\x4d\xab\x90\xe8\x4b\x01\x9c\x56\x19\xf4\x13\x5b\x83\x7f\x6a\ \x71\xf0\x4f\xee\x4a\x3f\xbd\xde\xd2\x97\xd3\xeb\x23\x0b\x1c\x03\ \x7f\x89\x69\xe0\x2f\xf2\x8d\x2c\xb3\xd2\x17\x91\xe3\xfc\x49\x41\ \x47\xd1\x10\x48\xa8\x3e\x3c\x6a\xdc\x00\xdf\x6a\xc0\xab\xa2\xb7\ \xd5\x60\xf0\x6f\xf6\x18\x39\xfe\x05\xd7\x2b\x79\xd4\x87\xd1\x71\ \x25\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xb3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ \x00\x00\x03\x7a\x49\x44\x41\x54\x78\x01\xc5\x97\x03\x94\x6b\x47\ \x00\x86\xf3\x6a\xdb\x37\x35\x0e\x6a\x37\xaa\x6d\xdb\xb6\xa2\x35\ \xa3\x67\xdb\xb6\x6d\x5b\x6b\xdb\xb8\xb1\xf9\x77\x3a\xc5\xf2\x26\ \xb9\xab\xcc\x39\xff\x6e\xfc\x7d\xe3\x19\x41\xcf\x0b\x06\x25\x0a\ \x35\x0c\xfb\x87\x88\x81\x40\x30\x48\x30\x90\x45\xc9\x68\xef\x89\ \x13\x6a\xf7\xc4\x31\x5a\x0d\xab\x90\x6a\x5a\xe5\xd2\xc3\xe4\xff\ \xc3\xfd\x0e\xfe\x43\x98\x76\x49\xdc\x35\xba\xd1\x6a\x46\x1b\x20\ \xc1\xff\x02\x0a\x09\x48\x82\xad\x0a\xf1\x9c\x26\x85\xf8\x8a\x3e\ \x07\xa7\x09\xd2\x4e\x21\xc0\x4f\x49\x5a\x48\x40\xd3\x59\xa0\x2d\ \xa6\x16\xb9\xf4\x37\xa4\x3d\x7e\x5a\xdf\x34\xb7\x50\xf7\x18\x01\ \x65\xb7\x81\x23\x08\xb4\xa5\xb0\x59\x2e\x7a\xae\xc7\xe0\xbf\x07\ \x58\x1c\xa3\x99\x43\x40\x21\x12\xf0\x14\x68\x8b\x5c\xbc\xb6\x31\ \xee\x91\x1b\x78\xf4\xf3\x88\xb3\xe3\x84\x5a\x35\x01\xd8\xb9\xc0\ \xdc\x02\x9c\x71\xb5\x28\xc4\x86\x96\x1f\x1f\x3f\x2f\x2c\x5c\x7d\ \x8d\xe6\x15\xb5\x50\x5b\xc1\x01\xe4\x23\xc0\x11\x69\x2d\xab\x94\ \x7e\xda\x3d\x9c\xd1\x64\x72\x81\x92\x6f\x1e\x86\x61\x0f\x4c\xa2\ \x8f\x27\xbe\x31\x05\x87\xe6\x6c\x46\x5d\xd6\x11\x1c\x5d\xb4\x75\ \x2b\xb7\x00\x77\x58\xa5\x38\xb3\x8b\x80\x8a\xd1\x4e\xee\x0c\x4e\ \xbd\x75\x18\xa6\xbc\xb0\x10\xeb\xbe\xdf\x85\xad\xca\xbd\xa8\x3e\ \x74\x14\x08\x95\xc2\xd6\x9c\x8b\xec\xd5\x3b\xb0\x36\x6d\xd9\x22\ \x4e\x01\x95\x0c\x96\x29\xdf\xc2\x32\xee\x73\xb4\x2a\x65\x1d\xdf\ \x53\x8a\x27\x47\x14\x18\x29\x9a\x8a\xf5\x3f\xec\xc6\xc9\xe9\x47\ \xd1\x92\x9b\x0b\x67\x4b\x11\x02\x9e\x12\x6c\xce\x58\x8b\xf8\xeb\ \x75\x11\xbb\xc0\x93\xb5\x80\xca\x92\xc0\x7d\x78\x06\x7f\x81\x59\ \xaf\x2d\xc3\xc1\x11\x87\x80\x60\x29\x4a\xb6\xef\x87\xcb\x54\x80\ \x86\x23\xb9\x58\xf7\xe3\x6e\x68\xee\x18\x13\x56\xc0\xa8\x79\x85\ \x82\x6d\xb3\x7f\x83\x6d\x9e\x1c\x08\x96\xc0\x98\xfa\x1c\x3f\x81\ \x65\x9f\x6c\x42\xfe\x92\xe3\xf0\x3a\x8a\x90\x70\x83\x1e\x47\xe6\ \x6c\x85\xad\xb6\x10\x1b\x7e\xda\x13\x51\x80\x4d\x7c\x0a\x21\x6f\ \x1e\x3c\x47\x67\xc1\x73\x72\x1e\x42\xae\x1c\xb0\xf1\x4f\x46\x2f\ \x10\x7f\x9d\x9e\x36\xff\xae\xb4\x03\xf0\xbb\x4b\x60\x6d\xc8\x43\ \xd0\x5f\x82\xa2\xd5\x27\xb0\xfe\xc7\x3d\xe4\x7d\x43\x58\x01\x93\ \xfe\x0d\x04\xed\x27\xa8\x44\xa0\x79\x2f\xac\x33\x7e\xe2\xd7\x05\ \x5a\x52\x43\x52\x53\x9a\x3d\x9a\x03\x28\x59\x77\x02\xc7\x27\x1f\ \xa1\xcf\x97\x7d\xba\x29\xec\x34\x34\x0d\x7d\x07\x01\xe3\x41\x04\ \xcd\x47\x60\xcc\x78\xa9\x0d\xca\x47\x60\x94\x78\x3a\x85\x75\x17\ \x32\x36\xba\x13\x20\xb0\x17\xe1\xda\x36\x12\xf0\x17\x22\x68\x39\ \x0a\x93\xe1\xcd\x36\x20\x5f\x81\x69\x2f\x2c\xe6\x14\x18\xf7\xf8\ \x9c\x0e\x02\xae\x1d\x63\x56\xfb\x6b\xb6\x00\x81\xe2\xff\x46\x3d\ \x1d\x74\xde\xc2\x15\xa4\x35\xde\xed\x99\xc0\xa2\xf7\xd7\x71\x0a\ \x18\xee\x9d\xd0\x41\xc0\x73\x6c\xf6\x76\x7f\xcd\x56\x38\x37\x19\ \x60\x4c\x7f\x11\x6c\xca\xb3\xb0\x2d\x54\x22\xd0\xba\x1f\x21\x77\ \x2e\xec\x2b\x92\x61\x9d\xf6\x03\x5d\x17\xa2\x12\x88\x23\x59\xfb\ \xed\x0e\x4e\x81\xe4\x9b\x86\x44\xb3\x14\x13\x91\xe7\x10\x72\x65\ \xd3\xd6\x20\xad\x43\x67\x43\x54\x02\x69\xb7\x0d\xe7\x84\xaf\xfa\ \x7a\x5b\xb4\x7b\x01\x1d\x03\xa4\x3b\x68\xed\x6d\x73\x7e\xa7\x8f\ \x8d\xa9\xcf\x47\x16\x20\x6b\xfe\xff\xc0\xe5\x9f\x6f\xc1\xca\x2f\ \xb7\xfe\xff\x7c\xfe\x3b\x6b\xa2\x16\x60\x93\x9e\x46\xc8\x93\x4f\ \x57\x44\x6f\xc1\x32\x84\x1c\x27\xc1\xc6\x3d\x1e\x59\xc0\x70\xcf\ \x78\x8c\x78\x64\x1a\x52\x6e\x19\x46\x21\x09\x37\x0c\xc6\xcc\x57\ \x97\x51\x81\xc9\xcf\x2e\xe0\xb5\x1b\x5a\x26\x7d\x03\x7f\xd5\x66\ \xf8\x6b\xb7\xc1\x32\xf1\xeb\xe8\xba\x80\x2b\xc3\x1e\x9e\x82\x21\ \xf7\x4f\xe4\x23\xc0\x6f\x1a\x72\x6f\xc7\xfc\xcf\x03\xfc\xb7\xe3\ \xd8\x1f\x48\x62\x7f\x24\x8b\xfd\xa1\x34\xf6\xc7\xf2\x98\x5d\x4c\ \x78\x94\xb8\xeb\xf4\x17\xc7\xe0\x6a\xd6\xfd\xe5\x54\x7d\x8d\x76\ \x77\x87\xcb\xa9\x4a\xf4\x50\x3f\xa0\xfa\xff\x7a\xfe\x17\x2b\xf8\ \x83\x81\x17\x01\x04\xca\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x0b\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\xe8\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x55\x55\xff\x40\x40\xff\x66\x66\xff\x55\x55\xff\x49\x49\ \xff\x60\x60\xff\x55\x55\xff\x4d\x4d\xff\x5d\x5d\xff\x55\x55\xff\ \x4e\x4e\xff\x5b\x5b\xff\x55\x55\xff\x50\x50\xff\x5a\x5a\xff\x55\ \x55\xff\x51\x51\xff\x59\x59\xff\x55\x55\xff\x51\x51\xff\x59\x59\ \xff\x55\x55\xff\x52\x52\xff\x58\x58\xff\x55\x55\xff\x52\x52\xff\ \x58\x58\xff\x55\x55\xff\x52\x52\xff\x58\x58\xff\x55\x55\xff\x53\ \x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\ \xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\ \x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x57\ \x57\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\ \xff\x57\x57\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\ \x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x54\x54\ \xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x55\x55\xff\x54\x54\ \xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\ \x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x55\ \x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\ \x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\ \x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \x6f\x9a\x6b\x2f\x00\x00\x00\xf7\x74\x52\x4e\x53\x00\x01\x02\x03\ \x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\ \x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\ \x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\ \x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\ \x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\ \x54\x55\x56\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x62\x63\x64\x65\ \x66\x67\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x74\x75\x76\x77\ \x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x86\x87\x88\ \x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\ \x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\ \xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb5\xb6\xb7\xb8\xb9\ \xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xca\ \xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xdb\ \xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\ \xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\ \xfc\xfd\xfe\x72\x99\x87\x57\x00\x00\x06\xd0\x49\x44\x41\x54\x18\ \x19\x05\xc1\x09\x6c\x9d\x05\x1d\x00\xf0\xdf\xf7\xf5\x7b\xaf\xc7\ \x68\xcb\xda\x75\x2b\x65\xeb\x60\x6b\x07\x0c\xc2\x26\xec\x92\x31\ \x1c\x1a\x1d\xcc\x40\x14\x04\x0d\x90\x10\x41\x32\x90\xa0\x88\x82\ \x92\x81\x17\x04\x21\x21\x90\x48\xc0\x28\xf1\x40\x89\xc2\x06\xc8\ \x29\xa2\x1c\x0e\xe7\x18\x8c\x63\x83\xb1\xfb\x62\xeb\x8e\xb6\x5b\ \xef\xbe\xff\xda\xf7\xfa\xea\xef\x97\x00\x00\x00\xd4\x2e\x99\x3b\ \x6b\xe6\xe4\xda\xba\xf1\xc1\xbe\x43\xbb\x37\x6f\x5c\x5f\x04\x00\ \x00\x24\x00\x00\xa0\xf9\xca\xcb\xcf\xc9\x00\xc0\xd0\x9a\xe7\x5e\ \x1c\x02\x00\x80\x04\x00\x00\x4b\x6e\x5d\x56\x41\xff\x3b\x5b\x77\ \x1f\x18\x3e\x2e\xdf\x34\xf5\xcc\x45\xa7\xa7\x0c\x3e\xf9\xd8\x2e\ \x00\x00\x00\x00\x58\xf6\x56\x44\x6c\xbe\x7b\x5e\x05\x00\x9c\x78\ \xf1\xe3\x47\x23\x06\x7f\x3b\x0d\x00\x00\x00\x40\xdb\xb3\x11\xc3\ \xab\x96\x24\x00\x00\xd4\x5d\xbf\x2e\xe2\xe8\x6d\x39\x00\x00\x00\ \xe0\xcb\x7d\x51\x78\xe2\x0c\x00\x00\x40\x72\xd5\x8e\x88\xb7\x67\ \x02\x00\x09\x00\x70\xcd\xe3\x1b\x6f\x5f\x0b\x30\xf1\x8c\xe9\xcd\ \xa9\xc1\x83\x9f\xee\x03\xa8\xfe\xfe\x4f\x2a\x07\xae\x7b\x05\x00\ \x00\x00\x5a\x53\x20\xb9\xe0\xe1\x0f\x0a\x11\x11\x11\x11\x5b\x1e\ \xf8\x42\x05\x60\xc1\xf6\x18\xba\x19\x00\x00\x30\x7b\x36\x80\xba\ \x1f\x6c\x8b\x88\xe8\xf9\xf0\x1f\xaf\x3c\xb3\xbe\x2b\x22\xe2\xd3\ \xeb\xf2\xc0\xa4\x97\x22\x6e\x07\x00\x00\x5f\xe8\xed\xa9\x01\xb2\ \x5b\x0e\x45\x0c\x3c\x7b\xc3\x99\x09\xd0\xf2\x9d\x17\xfb\x23\xb6\ \x5f\x9b\x80\x8a\x3f\x46\xdc\x0c\x00\x80\x39\x47\xe2\xb5\x04\x9c\ \xbd\x21\x62\xcf\x6d\x8d\x00\x60\xf2\x7d\x47\x23\x9e\x3f\x19\x64\ \x7f\x8d\xe1\xcb\x00\x00\x4c\xd9\x13\x6b\xeb\xc0\xf5\xbd\x71\xf4\ \xc7\x55\x00\x00\x9a\x1e\x1a\x8e\xc3\x57\x80\xdc\x73\xd1\x75\x1a\ \x00\x20\x79\x2e\xf6\xb4\x40\xf2\x8b\x88\x35\x33\x00\x00\xc0\xd2\ \xad\x51\xb8\x15\x9c\xf0\x49\xbc\x9b\x07\x00\x56\xc4\xc0\x02\x70\ \x7f\xc4\x23\x19\xa0\xe5\x37\x6b\xf7\xf7\x1c\xd9\xfc\xcf\x5f\x7e\ \x35\x0f\x6a\x57\x45\x3c\x98\xc2\xb9\xfd\x71\x37\x00\x38\xf9\x58\ \xdc\x09\x7e\x14\x71\x17\x80\x5b\x22\x22\x22\x22\x62\xff\xaf\x9a\ \xa1\xe2\xe1\x88\x07\xc0\x1d\xd1\xdf\x0e\x00\xbf\x8e\xf7\x33\xb8\ \x68\x38\xee\x05\x0d\xa7\x63\xe2\x9d\x37\x7c\xe5\xdc\xf3\x2f\xfd\ \xe1\xea\xee\x88\xae\xdb\x33\x58\x19\x71\x13\xa4\xeb\xe3\x6f\x00\ \x98\x31\x10\xcb\xa0\x71\x5f\xac\x4e\x60\xe1\x9e\xa1\x59\x00\xa8\ \xfd\xf6\x27\x11\xff\x3e\x09\x1e\x89\xa1\x8b\xe1\x8b\x51\x98\x03\ \xc0\xef\xe2\x0d\xf0\xfb\xd8\x59\x0f\x5f\xeb\x8d\xad\x0d\x00\x20\ \x7f\x5b\x7f\xec\x9a\x89\xec\xf9\xd8\x33\x11\xfe\x15\x7f\x02\xd0\ \xd0\x1b\x97\xc0\xb9\x85\x58\x0e\xf3\x8e\xc5\x9a\x66\x00\x80\x85\ \xbb\x62\x5b\x2b\x1a\xf6\xc6\x63\x70\x71\xf4\xd5\x01\xdc\x14\x3b\ \x2b\xe0\xef\xf1\x12\x34\xef\x8b\x37\xab\x00\x00\x68\xdb\x1d\x6b\ \x73\xf8\x46\x14\x2e\x40\xba\x23\xae\x02\x78\x35\xee\x85\xd3\x0b\ \xb1\x00\xfe\x10\x5b\x9b\x00\xb5\x17\x5e\xfd\xcd\x85\x79\xc0\x9c\ \xde\xf8\x19\xac\x8e\x97\xe0\xbe\x78\x1a\x50\x3f\x10\x8b\xe1\xfe\ \x78\x0b\x16\x17\xe2\x22\x60\xee\xaa\xbe\x88\x88\xc3\x0f\x4e\x06\ \xbe\x1b\x7d\xad\x98\x17\x85\x33\x71\x61\xf4\x54\x01\xcb\xe2\x70\ \x05\x92\x6d\x71\x1d\x3c\x15\xcf\x80\x64\xe5\x70\xc4\xc1\xf7\xb6\ \x0e\x47\x1c\x5c\x0e\xd2\x0d\xf1\x28\xbc\x1e\x8f\x22\xdf\x13\xe7\ \x01\x77\xc5\x2b\x70\x76\x0c\x4d\xc2\x49\x03\x71\x01\x78\x20\xe2\ \xd5\xa5\x15\xd4\xac\xd8\x16\x03\x97\x80\xaf\x47\x6f\x3d\xae\x8c\ \x8e\x0a\xfc\x27\xbe\x07\x3c\x15\xf7\xc0\x8a\x58\x07\x2b\x62\x53\ \x02\x97\x47\xdc\x9d\x00\x0d\x6f\xc6\x91\x56\x48\x77\xc7\xb5\xa8\ \x1d\x88\x05\x78\x30\xfe\x82\x94\x36\x07\x60\xae\xf7\x60\x89\xd7\ \xc6\x91\xfd\xdc\x93\xf7\x8c\x03\x3d\x97\x7c\x56\xff\x53\x28\x3f\ \xef\x72\x0c\x6e\x70\x21\x3e\x32\x0f\x29\xad\x3a\x61\x86\x5d\xb0\ \xd0\x7a\x58\xda\x16\x77\x01\x18\xbe\xd3\x15\x8d\xf0\xb2\xc5\x39\ \xfc\xd7\x3c\x7c\x60\x7a\x2d\xa9\xca\x5a\x1d\xd0\xa2\x03\x59\x8b\ \x4f\xe1\x4b\xde\xe8\x04\xe0\x85\x03\xf9\xcb\x60\xfd\x68\xcd\x39\ \xd8\xec\x2c\xec\x1c\x4d\xda\x49\x4d\xe4\x30\xd4\x1a\xc0\xe4\x54\ \x17\xb4\xf9\x08\x6a\x9e\xbe\x03\xca\xab\x2d\x87\xf8\xd8\x22\x7c\ \x6c\xfa\x89\x8c\xed\x35\x8b\x54\x8e\x12\xe4\x14\x51\xcb\x00\x54\ \x1a\x82\xf6\x4b\x57\x56\xc3\x9b\x16\x67\xf0\xa1\xd3\xb0\xeb\x78\ \xd2\x86\x5d\xda\x48\x8d\x53\x09\x05\x35\x18\xe2\x04\x18\x30\x09\ \xb6\x44\x7e\x1e\xac\x1b\xa9\x9d\x0b\x7b\xb4\xa1\xdc\xa1\x15\x3b\ \xb4\x91\x2a\x52\x05\xbd\x26\x61\x90\x7a\xd8\x68\x11\x14\x37\xf9\ \x1c\xc4\x16\xb3\x61\xaf\x36\xe8\x30\x15\xfb\x4c\x23\xd5\x47\x1e\ \x3e\x73\x0a\x06\xba\x9d\x01\xef\x3a\x27\x83\xad\xda\xc1\x76\xb3\ \x60\xb7\xe6\x3c\x3a\xb4\xe0\x90\xa9\xa4\x46\x86\xd5\xc3\x36\x73\ \x60\x93\x39\xf0\xc1\xd8\x84\x59\xb0\x53\x3b\xd8\x66\x36\x74\x4a\ \x9a\xd0\x65\x12\x3a\xb4\x54\x48\xe9\x34\x03\x36\x58\x94\xe0\x43\ \xf3\xa1\xd0\xe1\x54\xd8\xad\x1d\xec\x74\x1a\xf4\x8c\x69\x42\xaf\ \x06\xec\x97\x4d\x92\xb2\xcf\xa9\xf0\xbf\xf1\xa6\xb3\xf0\xbe\xcf\ \x27\xb0\xdf\x34\xd8\xae\xa5\x0e\xb6\x38\xa5\x06\xe5\x5e\x93\xd1\ \xa7\x01\x3d\x0f\x3d\xd1\x2d\x65\xb7\x99\x70\x6c\x9b\xa5\x58\xaf\ \xf1\x14\x38\x62\x32\xec\x29\x6a\x87\xbd\xd2\x93\xa0\x47\x1d\x06\ \xd4\xc2\xca\x1b\xcb\x52\xb6\x9b\x09\xd6\x99\x8f\xee\x43\xe6\xc0\ \x31\x13\xa1\xb8\x4f\x1b\x8c\xf4\x9b\x02\xa1\x12\x23\x72\x00\x29\ \x1b\xcd\xce\xc3\xbb\xe6\xc0\x27\xce\x82\x1e\x8d\xe0\xa0\x66\xd0\ \x65\x0a\x8c\xa8\xc2\xa8\x3c\x40\xca\x47\xa5\x9a\xf9\xb0\xdd\x34\ \xd8\xe4\x6c\xe8\x35\x11\x74\x6a\x02\xdd\x26\x41\xa8\x42\x51\x0e\ \x20\xa5\xb0\xd9\xf9\xd0\xa9\xba\x1e\xdb\xb5\x43\x9f\x89\xe0\x88\ \x66\xd0\xad\x09\x42\x25\x46\xe5\x01\x52\xbc\xe5\x7c\xe8\xa6\x11\ \xfb\x4d\x83\x1e\x0d\xa0\x4b\x33\xe8\xd6\x08\x65\x29\x46\x55\x02\ \xa4\x58\xe3\xbc\x3c\x62\x5c\x35\x0e\x98\xd0\x80\x1e\x0d\xe0\x98\ \x46\x30\x64\x02\x90\xa0\x28\x07\x90\xe2\xed\xc1\x9a\x29\x18\x1f\ \x51\x83\x83\x25\xad\x18\x56\x9b\xc0\xa0\x5a\x10\x26\xc0\xb8\x14\ \xa3\xf2\x00\x29\xe2\xd2\x6b\x0e\x40\x41\x35\x4a\x87\xb5\xa2\x20\ \xad\x84\x7e\xf5\x60\xd8\x04\x18\x97\x60\x4c\x9a\x00\x32\x58\x0f\ \x8c\x49\xa1\x63\xda\xc9\x28\x50\x7d\x1c\xfd\xea\x40\xa8\x81\x71\ \x90\x53\x1a\x07\xa4\x00\x18\x97\x42\x87\x16\x14\xa8\x81\x01\xf9\ \x2a\x18\x92\x87\x4c\x11\x99\x31\x80\x0c\x00\x65\x29\x74\x69\x44\ \x81\x1a\xe8\xa7\xfe\x38\x5e\x5d\xf5\x02\xe4\x15\x91\x29\x01\x64\ \x00\x28\x4b\xa0\x5f\x3d\x8a\xa5\xac\x1a\x0a\x54\x41\xf7\xb5\x20\ \x6f\x14\x99\x12\x40\x0a\x80\x71\x29\x0c\xa8\x87\x82\x6a\x28\x92\ \x03\x40\xde\x28\x2a\x94\x00\x52\x00\x94\xa5\xd0\xaf\x1e\x42\x0d\ \x14\xc9\x00\x90\x53\x44\x66\x0c\x20\x05\x40\x59\x0a\x23\xaa\x20\ \x54\xc3\x58\x59\x0e\xae\xec\xb9\x1a\xf2\x46\x91\x29\x01\xa4\x00\ \x28\x4b\xa1\x28\x07\x63\x72\xa0\x24\x07\xf3\xab\x17\x43\x5e\x11\ \xfb\x46\x36\x03\x64\x00\x28\x4b\x60\x54\x0e\xca\x2a\x40\x29\x9f\ \x83\x92\x0a\xc8\x19\xc5\x8e\x99\xfd\x00\x29\x00\xba\x75\x43\x51\ \x0e\xc6\x54\x80\x51\x39\x28\xc9\x20\x6f\x14\x8e\x95\x00\x32\x00\ \x7c\x6b\xc6\x3b\xd0\x6d\x18\x4a\x52\x90\x28\xc3\x98\x1c\x54\x1a\ \x05\x00\x32\x00\x74\x76\x82\xf7\xaf\xd8\x09\x63\x2a\x40\x4e\x09\ \xca\x12\xc8\x1b\x05\x00\x32\x00\x00\xbc\x0c\xc6\x64\x20\x53\x84\ \xb2\x14\xc6\x0c\x02\x00\x19\x00\x00\x80\x31\x29\xc8\x94\xa0\x2c\ \x81\x1b\xa7\x6f\x06\x00\x32\x00\x00\x00\x63\x2a\x20\x4d\x95\xa0\ \x2c\x85\x17\x01\x00\x52\x00\x00\x00\x45\x29\x64\x14\xa1\x28\x01\ \x00\x00\x19\x00\x00\x80\x3f\x27\xaf\x43\x8e\x12\xbc\xb6\xfc\x29\ \x00\x00\x00\x00\x00\x00\xa0\x2e\x62\x2a\x00\x00\x00\x64\x00\x00\ \x00\x00\x43\x1b\x72\x47\x00\x00\x00\xe0\xff\x49\x80\xbf\x36\x9e\ \xd0\xbb\x13\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x3f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x75\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x99\x99\ \x99\xaa\xaa\xaa\xaa\xaa\xaa\xa2\xa2\xa2\x99\x99\x99\x9c\x9c\x9c\ \xa2\xa2\xa2\x9d\x9d\x9d\x9f\x9f\x9f\xa1\xa1\xa1\xa0\xa0\xa0\x9f\ \x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\x9f\x9f\x9f\xa1\xa1\ \xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa1\xa1\xa1\ \xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa1\xa1\xa1\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x7a\x94\x53\ \xc7\x00\x00\x00\x26\x74\x52\x4e\x53\x00\x01\x05\x06\x09\x0b\x0f\ \x12\x16\x1a\x25\x2e\x33\x40\x46\x4e\x55\x65\x7a\x8d\x94\xa3\xad\ \xb5\xbb\xc3\xc8\xd0\xd4\xdf\xe9\xef\xf2\xf7\xf9\xfb\xfc\xfe\x86\ \x3f\x58\x35\x00\x00\x00\x53\x49\x44\x41\x54\x18\x19\xad\xc1\x55\ \x0a\x80\x40\x00\x40\xc1\x67\xaf\xdd\xdd\x79\xff\x23\x2a\x22\xa2\ \xbf\xe2\x0c\xbf\x10\x99\xc5\xc5\xca\x04\x20\xba\xd6\xe4\x64\xb6\ \x9d\xe0\x60\xf7\x8d\xc1\x41\xaf\x07\x87\x93\x3b\x56\x1a\xa8\xe5\ \xe4\x71\xf1\xe7\x42\x91\xf3\x25\xe0\x16\xae\x69\xba\x86\x3c\x44\ \xdb\x16\xf1\x12\x27\xbc\x49\x12\x9f\xed\x22\xc2\x03\xe6\x73\x06\ \xe7\x5b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x1d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x66\x50\x4c\x54\x45\x00\x00\x00\x80\x80\x80\x43\x4a\ \x61\x41\x4a\x60\x42\x4a\x5f\x42\x4a\x60\x48\x4f\x65\x48\x50\x64\ \x50\x58\x6c\x52\x59\x6d\x53\x5a\x6e\x55\x5c\x6f\x62\x68\x7a\x69\ \x6f\x80\x6f\x75\x85\x70\x76\x86\x77\x7c\x8b\x81\x86\x93\x8b\x90\ \x9c\x95\x99\xa4\xa0\xa4\xad\xa4\xa8\xb0\xa6\xa9\xb2\xb1\xb4\xbb\ \xb4\xb7\xbd\xb5\xb8\xbe\xdc\xdd\xde\xdd\xde\xdf\xe3\xe3\xe3\xe6\ \xe6\xe6\xe9\xe9\xe9\xf1\xf1\xf1\xf2\xf2\xf2\xf3\xf3\xf3\xbb\xa1\ \x8f\xa8\x00\x00\x00\x05\x74\x52\x4e\x53\x00\x02\x91\x9c\xd3\x56\ \x9d\x5a\x85\x00\x00\x00\x61\x49\x44\x41\x54\x18\xd3\x8d\xce\x37\ \x12\x80\x20\x14\x00\x51\x0c\x28\x98\xc5\x1c\x40\xfe\xfd\x2f\x29\ \x0a\x02\xce\x58\xb8\xe5\xab\x16\xc5\x18\x6f\xdc\x44\xa2\x00\x21\ \x0b\x94\xae\x04\x2b\xb1\xd0\xb4\x0a\x70\xe8\xa0\xac\x2f\x88\x1d\ \x8c\xc3\xfe\x40\xbf\xa8\x3a\xc6\x58\x62\xc0\xef\x13\xf2\xca\x96\ \xde\x30\x73\x21\x84\x3e\x2b\x0c\x00\xc8\x37\x48\x80\xc3\x83\x89\ \xdb\x34\x30\x07\xd9\x1f\x38\x01\x3f\xb0\x10\xd4\x41\x66\x5a\x4e\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x85\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x8d\x50\x4c\x54\x45\x00\x00\x00\xff\xcc\x00\xff\xaa\ \x2b\xdb\xb6\x24\xed\xbc\x18\xed\xb8\x18\xee\xb9\x17\xe8\xbb\x17\ \xeb\xba\x16\xeb\xbb\x16\xec\xba\x15\xec\xba\x17\xea\xba\x17\xea\ \xba\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\ \x16\xeb\xbb\x15\xea\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\ \xeb\xbb\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\ \xba\x16\xeb\xbb\x19\xeb\xbb\x1a\xec\xbe\x25\xed\xc2\x31\xef\xc8\ \x45\xef\xc8\x46\xf6\xdf\x94\xf7\xe2\x9d\xfb\xf1\xcf\xfc\xf3\xd6\ \xfd\xf7\xe5\xfe\xfa\xef\xfe\xfc\xf5\xfe\xfd\xfa\xff\xfe\xfb\xff\ \xfe\xfc\xff\xff\xff\x68\x47\x43\x44\x00\x00\x00\x1d\x74\x52\x4e\ \x53\x00\x05\x06\x07\x2a\x2b\x2c\x2d\x8d\x8e\x90\x91\x93\x94\x96\ \x97\xbb\xbc\xbd\xbe\xd3\xd4\xd5\xf1\xf2\xf3\xf4\xfc\xfd\x64\x79\ \xba\xb6\x00\x00\x00\x8a\x49\x44\x41\x54\x18\xd3\x65\x8f\xc7\x12\ \x82\x50\x14\x43\x0f\x4d\xba\x15\x94\x16\x1b\xf6\xc2\xff\x7f\x9e\ \x8b\x87\x85\x31\xcb\x33\x37\xb9\x09\x00\x7e\x9c\x57\x55\x1e\x8d\ \x30\x72\xc6\x8d\x24\x49\x75\x6a\x03\x38\x0b\x7d\x34\xb7\x81\x89\ \xa4\xed\xbe\x27\x09\xf8\x8d\xa4\xf6\x7a\xdc\x18\x97\x47\x2c\x49\ \xed\xed\x79\x36\x47\x21\x4b\x03\xba\xee\x72\x58\x4b\xca\x28\xdf\ \xa0\xbb\x9f\x76\x52\x41\x31\x04\xab\x7f\x4b\x64\xc0\xa3\x0f\x0d\ \x18\xd5\x83\xb7\x2e\xa4\xbf\xc5\x62\xc0\x9e\x7d\xab\x4f\x2d\x00\ \x3b\xa9\xfb\x71\xb1\xd5\xef\xf5\xc2\xac\x2c\xb3\xc0\x05\x78\x01\ \xd5\x3d\x18\x0b\xd7\x07\xbc\x2c\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x0e\xde\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x10\x4b\x00\x00\x10\x4b\ \x01\xe7\x8f\x45\x7b\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0e\x5b\x49\x44\ \x41\x54\x78\x9c\xc5\x9b\x7b\x70\xdc\xd5\x75\xc7\x3f\xe7\xfe\x7e\ \xbb\x92\x56\xaf\x95\x90\xd6\xb2\x2c\x1b\x6c\x19\x0c\xd8\x50\x98\ \x92\x74\x42\x1b\x1a\x86\xd8\x66\xd2\xcc\x40\x4b\xd3\x26\x14\x12\ \x4a\x4b\xfa\x0f\x2d\x84\xd2\x29\xed\x0c\x19\x25\xff\x64\xc2\x23\ \xcd\x63\xf8\x83\x32\x25\x90\x69\xa1\x43\x33\x2d\x49\x08\xc1\x36\ \x8e\x67\x70\x67\x48\x1a\x27\x40\xb0\x1d\x0c\x46\x36\xb6\xde\x5a\ \xed\x6a\xf5\xf2\x6a\xb5\xbf\x7b\xfa\xc7\x6f\xb5\xbb\xbf\xdd\x95\ \xb4\xab\x47\xf8\xce\xec\xcc\xee\xb9\xe7\x9e\x7b\xcf\xb9\xaf\x73\ \xcf\xb9\x2b\x6c\x30\x46\x0e\x6c\x8a\x19\xec\x0d\x62\x64\x37\xaa\ \x97\x23\x72\x19\x4a\x1b\x48\x14\xb4\xc9\xe7\x92\x19\xd0\x49\x84\ \x24\xca\x29\xe0\x1d\x2b\x9c\x50\x2b\x47\xbb\xf6\x8f\x8e\x55\xd3\ \xce\x57\xf9\xea\xc7\xbe\xcc\x97\x7f\x06\x68\x2d\xfd\x93\x5a\x15\ \xaa\x06\xf1\x57\xbb\x3e\xa2\x6a\x3f\xa7\xca\x5e\x81\xdd\x6b\x68\ \x47\x15\x4e\x08\x1c\x04\xfb\x7c\xe7\xbe\xf8\xb1\x4a\x4c\x4f\xf2\ \x64\x68\x98\xe1\xdf\x00\x0f\xf4\xd1\xf7\xc3\x5a\x1a\x58\x37\x03\ \x4c\xbc\xdc\xde\x62\x43\xee\x17\x51\xbd\x1b\xe4\x8a\xf5\x92\x5b\ \x82\x93\x08\xdf\x65\xce\x3e\xd9\x79\x4b\x7c\x7a\x91\xf8\x15\xbe\ \x72\x8f\xa2\xff\x0a\xbc\x0d\x5c\xd3\x47\x9f\xad\x56\xe0\x9a\x0d\ \x90\x7a\xa5\xa7\x3d\x63\x32\xf7\x81\xfc\x2d\x68\xdb\x5a\xe5\x55\ \x07\x49\xa2\xfa\xed\xd0\xc2\xfc\xb7\xbe\xf9\xe9\x2f\xcd\x02\xef\ \x00\xdb\x73\x85\x9f\xe9\xa3\xef\xfb\x55\x4b\x5a\x6d\x17\x54\x91\ \x89\x57\x63\x77\xaa\xf2\x18\xd0\xb9\x5a\x39\x6b\x44\xe2\xf0\x63\ \x37\x1d\x79\xe7\xe0\xae\xdb\x8a\x68\x27\x81\xab\xaa\x9d\x05\x66\ \x35\xad\x8e\xbd\xd2\xb9\x73\xe2\x50\xec\x7f\x55\x79\x96\x0f\x4f\ \x79\xbc\x8c\xd3\x7e\xfe\x57\x5b\x6e\x2b\x21\x5f\x09\x7c\xb6\x5a\ \x19\x35\x1b\x20\x7e\x30\xf6\xc7\x62\xe4\x17\x0a\xd7\x2f\xc5\x23\ \x4e\x3d\xa6\xa1\x0b\x37\x7a\x39\x4e\x74\x0f\x98\x70\xad\xcd\x54\ \x85\xb7\x7f\xb4\x87\xd9\x78\x53\xa5\xa2\xbe\x3e\xfa\xdc\x6a\x64\ \x54\xc5\x04\xa0\x7d\x98\xf8\xc7\x3a\x1f\x57\xb8\xbf\x22\x83\x08\ \x26\x14\x45\x22\x5d\x88\xdb\x58\x20\xab\x22\xc6\x45\x6d\xa6\xda\ \xa6\xaa\x42\x36\x1d\xe2\x57\x2f\x5c\xbb\x54\xf1\xa5\xc0\x1d\xc0\ \x33\x2b\xc9\xa9\x6a\x0f\xd0\x17\x76\x87\xe3\xd1\xf1\x67\x80\xcf\ \x55\x14\x12\x6e\xc3\x69\xec\x06\xa7\xa1\x50\x27\x9b\x46\x17\x92\ \xe8\x7c\x12\xcd\xce\x55\xd3\xcc\xb2\x98\x4b\x44\x48\x0d\xb5\xe6\ \x3f\x23\x27\xbb\x18\x78\x73\xcb\x72\x55\x46\x80\xef\x0b\x72\x1a\ \x38\x6d\x30\xa7\x3d\xbc\x33\x7d\xf4\x05\x46\x62\x45\x03\xf8\xca\ \xc7\xff\x07\xf4\x53\x65\x85\x12\xc2\x34\x6f\xc3\x84\x17\x37\x7f\ \x45\xd3\x49\x6c\x7a\x64\x4d\x4a\xa7\x06\xa3\x9c\x7c\xe5\x72\x26\ \x87\x5a\x49\x0d\xb6\x32\x35\xdc\xca\xc2\x85\xd0\xaa\xe5\x15\xc1\ \x03\xce\x03\xa7\x81\xf7\x81\xd7\x96\x5d\x02\xaa\xc8\xf8\xc1\xf1\ \xa7\x04\xca\x94\x97\x70\x0b\x4e\x53\x2f\x18\xc7\xe7\x9d\x4f\x60\ \x67\x07\x51\x3b\xbf\xe6\x5e\xb6\x74\x4f\xe2\x2d\x38\xf4\x1f\xed\ \x5d\xb3\xac\x12\x38\xc0\x25\xb9\xcf\x4e\xe0\x31\x67\x39\xee\x7b\ \xaf\xef\xfc\x17\x11\xf9\x9b\x52\xba\xa9\xef\xc0\x69\xde\x01\x62\ \x40\x17\xf0\xa6\xcf\x62\x2f\x0c\x83\x7a\x41\x46\x31\x98\x70\x14\ \xa9\xef\x04\xcd\x82\x5d\xa8\xaa\x97\x22\xb0\xed\xba\xf3\xb8\x61\ \x8f\x81\x37\x7a\xaa\xaa\x53\x23\xde\x01\x6e\xec\xa3\xef\xec\x92\ \x06\x18\x3b\xd8\xf9\x19\x11\x79\xbc\x94\x6e\x22\x5d\x98\xc6\x6d\ \x80\xa0\xd9\x19\xbc\xc9\x53\xe0\x05\xa7\xbb\xb8\x11\x9c\xc6\xad\ \x98\xe6\xed\x98\xba\x76\x24\xd4\x04\xc6\x45\xe7\x93\x35\xf5\x72\ \xf3\x9e\x61\x1a\x9a\xe7\xf9\xe0\xd8\x56\xd6\xd1\x69\xfd\x65\x98\ \xf0\x27\x1f\xe6\xe1\x11\xf0\xa7\x44\x19\x46\x0f\xc7\x7a\x8d\xca\ \x4b\x40\x7d\x31\xdd\xd4\x77\xe4\x94\x07\x9b\x49\x62\x53\xef\xe3\ \x2f\xab\x45\x86\x10\x4e\xf3\x0e\x4c\xe3\x56\xc4\x6d\x40\x10\x50\ \x8b\x5d\x98\x44\x67\x87\xfc\x59\x50\x23\x36\x5d\x3e\x4a\x4b\xd7\ \x34\x1f\xfc\xfc\x12\x54\xd7\x6c\x84\xa3\xc0\xfe\x87\x79\x38\x3f\ \x12\x65\x06\x50\x45\xd2\xa7\x1b\x7f\x84\x7f\x94\xe4\x21\xe1\x16\ \x7f\xda\x23\xd8\xf9\x24\x76\xa6\x9f\xe2\x8b\x97\xa9\xef\xc4\x69\ \xde\x89\xb8\x11\x9f\x90\x9d\xc5\x9b\x39\x8f\xce\x9e\x45\xe7\x13\ \xab\x52\x7e\x11\x1d\xbd\x13\x44\x7b\x26\x39\xf3\xfa\x25\xa8\x5d\ \x95\xef\x46\xf7\x9e\xe1\x44\x93\xdb\xfc\xbb\x0f\x4e\xf7\xcd\x14\ \xd3\xcb\x4c\x3a\x7e\x70\xd3\x5f\x83\x3e\x15\x20\x4a\x08\xb7\x6d\ \x0f\x18\xa7\x30\xed\xf3\xca\x0b\xa6\xa9\x07\x53\xbf\x09\x00\xf5\ \xe6\xd1\x99\x73\xd8\x85\xd4\xaa\x3a\xba\x1c\x3e\xf8\xf9\x25\xbc\ \xdc\x77\x33\xd6\xab\xcd\x08\xbd\x7f\xd0\xcf\xbe\x7f\x3e\x84\xe3\ \x64\xef\xea\xd8\x3f\xfe\x6c\x71\x59\x40\x52\xea\x95\x9e\x76\xd0\ \xaf\x95\x0a\x30\xcd\xdb\xfc\xdd\xde\x66\xf0\x52\xa7\x09\x28\xdf\ \xbc\x3d\xaf\xbc\x4d\xc7\xf1\x26\x4f\x54\x56\xde\x6d\x40\xdc\xfa\ \x72\x7a\x0d\xd8\x72\xcd\x00\x6a\x6b\x5f\x06\x5d\x57\x8e\x60\x5c\ \x0f\x15\x79\x24\x79\x24\x1a\x2d\x2e\x0b\x18\x20\x63\x32\xf7\x03\ \x1d\xc5\x34\x09\xb7\xe5\xcf\x79\x6f\xe6\x5c\x60\x2a\x9b\xa6\x1e\ \x4c\x5d\x3b\x00\x76\x76\x10\x3b\x73\x16\xb4\x70\x07\x11\xe3\x62\ \x22\xdd\xb8\xed\x57\xe3\x46\x77\x63\x5a\x77\x23\x52\xb5\xf3\x59\ \x86\x89\xb3\xed\xab\xda\x07\x26\xce\xb4\x2f\x7e\x8d\x65\x17\xc2\ \x7f\x57\x5c\x96\x37\xc0\xc4\xcb\xed\x2d\x20\xf7\x06\x6a\x8a\xf8\ \x1e\x1e\xfe\x39\xaf\x99\xc9\x42\xc5\xfa\xce\xc2\xc8\xcf\x0e\xfa\ \xc7\x60\xa1\x22\xa6\x3e\x86\xd3\x76\x35\x26\xd2\x5d\xb8\x0b\x64\ \x67\x50\x4a\x8e\xca\x1a\x90\x38\x73\xd1\xaa\xea\xc5\x83\xf5\xee\ \x1b\xff\x41\x47\xf3\xe2\x8f\xfc\x70\xe4\x82\x19\x81\xfb\xbc\x09\ \x45\x73\xee\xad\x62\xe7\x06\x8b\x0b\x30\x11\xff\x7c\xb6\xe9\x78\ \x50\x79\x71\x70\x9a\x7b\x91\x70\x4b\x4e\x70\x06\x9b\x1e\xc3\xa6\ \x13\xb0\xc6\xfb\x40\x7c\x95\x06\x48\x7c\xd0\x8e\xf5\x0c\xc6\xb1\ \x00\xed\x34\x98\x7b\x80\x6f\x40\xd1\x0c\x50\xe5\x0b\xa5\x15\x25\ \xb2\xd9\x2f\x4b\x27\x51\xaf\xe0\xe1\x39\x4d\x17\xfb\x1b\xa2\x37\ \x8f\x9d\x3d\x57\x54\xc1\xc1\x69\xdd\x95\x53\x5e\xb1\x17\x86\xc9\ \x26\x8e\x63\xe7\x46\xd6\xac\x3c\x2c\x3d\x03\x9c\xb0\xc7\x15\x37\ \xff\x86\x68\xcf\x64\xc5\x72\xbb\xe0\x30\x39\xd0\x5a\x4c\xfa\xab\ \xc5\x2f\x2e\xe4\x62\x78\xd6\xee\x29\xe6\x10\xb7\x3e\x7f\xa4\xd9\ \xf4\x48\x11\x3d\x82\x84\xfd\x7d\x44\x67\xce\x15\xad\x79\xf1\x47\ \xde\x8d\x80\x5a\xbc\xe9\xfe\xc0\x92\x59\x0f\xc4\x0b\x6b\x19\x00\ \xe3\x7a\x5c\xb1\xef\x14\xd7\xdd\x71\x8c\xa6\x8e\x19\x54\x85\xfe\ \xa3\xbd\xfc\xec\x99\x8f\x32\x39\x10\xd8\xeb\x48\x9c\xbd\x88\xf6\ \x8b\xf3\xc7\xff\x95\x63\x87\x3a\xaf\x8d\xed\x1d\x7f\xc3\x05\x50\ \xb5\xe5\xb7\xbc\x50\x6e\x35\x78\xe9\xc0\xc5\xc6\x34\x74\xf9\x5f\ \xb2\xb3\x81\xdd\xde\x34\xc4\xfc\x91\x57\xc5\x9b\x3e\x53\x59\x79\ \x09\x63\xdb\xf6\xa3\xad\x37\xa1\x91\x3d\x10\xce\xc5\x52\x32\x63\ \xc8\xdc\x71\x24\xf5\x53\x4c\xf2\x00\x68\xf9\x6c\x99\x9d\x68\x24\ \x9d\x6a\xc8\x2b\x7e\xe9\x27\x4e\xf3\xd1\x3b\x8e\xd1\xd2\x5d\xe8\ \x83\x88\xd2\x7b\xc3\x69\x76\x7c\xfc\x7d\xfa\x8f\xf6\xf2\xfa\xd3\ \xbf\x47\x6a\xa8\x35\x67\xbc\x8b\xd8\xf9\x87\xa7\x0b\xbc\x56\x6e\ \x07\x7c\x03\xa0\xec\x2b\x6d\xd0\xa9\xf3\x2b\x6a\xa6\xc8\x7d\x15\ \x03\x75\xb9\x13\x61\xae\x68\x56\x18\x17\x13\xf1\xaf\xa6\x9a\x1e\ \x09\xd6\xc9\x41\xdb\x3e\x85\xdd\xf2\x20\x1a\xde\x5c\x6e\x98\xba\ \x1e\xb4\xae\x07\x6d\xbb\x19\xed\xbe\x1f\x33\xf8\x18\x92\xfc\x49\ \x80\x25\x71\xe6\xa2\xbc\xe2\x1f\xb9\xe3\x18\xad\xdd\x4b\xfb\x19\ \x8b\x86\xd8\x7e\xfd\x19\xde\x3d\xb2\x93\x5f\xfc\xc7\x75\x4c\xf4\ \x97\x2c\x1f\xe1\x93\x00\x32\x72\x60\x53\xcc\x11\x1d\xa1\xc4\x29\ \x72\xdb\x76\x83\x53\x8f\x97\x3c\x89\x7a\x17\x00\x30\x75\x6d\x98\ \xe6\x5e\x50\x4b\x76\xe2\x0d\x16\xfd\x01\x13\xe9\xf6\x77\x7b\x9b\ \x21\x9b\x38\x0e\x14\x85\xe3\xc4\xc1\xeb\x79\x08\xed\xbc\x63\xc9\ \x0e\x57\x82\x19\xfb\x1e\x66\xf0\x91\xfc\x05\x6b\xfc\xbd\x18\x75\ \x8d\xf3\x81\x11\xaf\x16\x5e\xd6\xf0\xc1\xff\x5d\xcc\x8e\xeb\xcf\ \x14\x93\xed\x42\xc8\xdd\xe4\x1a\xec\x0d\xfe\xfd\x2b\x88\x6c\xea\ \x3d\xdf\xf9\xc9\x29\x0f\x40\xc8\x0f\x3f\xd9\x4c\x8a\xa0\x1b\xec\ \xbb\x0e\x36\x3d\x46\x40\x79\x58\x95\xf2\x00\x36\xf6\x79\x5f\xf6\ \x80\xef\x97\x75\x5e\x5a\x55\x7e\xa4\x22\x1c\xd7\x96\x2a\x0f\x60\ \xc2\xd9\xec\x0d\xae\x9f\xb1\xa9\xd4\x83\x4c\xa9\x2e\x68\x7a\x02\ \x2b\x21\xec\xdc\x50\x81\xe8\x36\xe4\xcf\x79\x9b\x4e\x04\xf9\xdb\ \xfe\xa8\xa2\xf2\x02\x93\x0a\x2f\xaa\xf0\x16\x80\x28\xd7\x00\xb7\ \x02\x81\xad\xda\xc6\x3e\x8f\xcc\xbe\x59\xb6\x1c\xd6\x0b\xaa\xec\ \x76\x51\x76\x55\x5d\x21\x3b\x87\x4e\xf7\x97\x10\x7d\x49\x9a\x9d\ \x0e\x1e\x75\x12\xc6\x6e\x79\xa0\x5c\x86\xf0\x7c\xd6\x75\xef\xdd\ \xda\xda\x1a\xb0\xd6\xf9\x54\xaa\xdd\xcd\x66\x9f\x40\x83\x11\x5d\ \xaf\xfb\xef\x71\x27\x0f\x57\xdc\x18\xd7\x0c\x61\x97\x0b\x72\x59\ \x8d\xe9\xb4\x20\xbc\x0b\x64\x13\x6f\x95\x05\x43\x6c\xdb\x7e\x34\ \xdc\x1d\xa0\xa9\xf0\xfc\xe6\xf6\xf6\xbf\x10\x91\xb2\x06\xb7\xb6\ \xb6\x26\x54\xf5\xf6\x91\x44\x82\x80\x11\xea\xb6\xa0\xd1\xbd\x48\ \xf2\xc7\xab\xef\xe3\x52\x50\xbd\xcc\x80\x76\xac\xcc\xb9\x92\xa0\ \x2c\xa5\x46\xd4\xd6\x9b\x02\xbf\x05\x26\x3d\xd7\xbd\xb7\x92\xf2\ \x79\x1e\x11\xf5\x42\xa1\x7b\x81\xc0\x4e\x67\xa3\x37\x2d\x51\x63\ \xad\x90\x0e\xa3\x50\x31\xb0\xbe\x56\x68\x64\x77\xf0\x37\xbc\x58\ \x3a\xed\x2b\xa1\xa7\xa5\x65\x02\xe4\x07\x81\xba\x8d\x7b\x96\x62\ \x5f\x2b\x9a\x8d\x40\xf3\xca\x7c\xb5\x42\x20\x1c\x0b\x50\x54\xf8\ \x75\xb5\xb5\x55\xf4\xad\x00\x21\xb4\x89\x0d\x4a\x64\x37\xaf\x2e\ \xbc\xb2\x22\x94\x0a\xfb\x4a\xd5\x1a\x88\x2d\xcd\x58\x55\x94\xb7\ \x2e\x30\x0a\xd3\x2b\xb3\xad\x02\x99\xf1\xc0\x4f\x51\xae\xae\xba\ \xae\x48\x90\x77\x61\xf5\x3e\xc0\x0a\x98\x36\x02\x33\x2b\xf3\xd5\ \x0e\x99\x3b\x5e\x4a\xba\xf5\x7c\x2a\xd5\x5e\x89\xb7\x18\x43\x53\ \x53\x1d\xa0\xb7\x04\x64\xcd\x94\xc9\x5a\x2f\x4c\x1b\x90\xf8\x46\ \x48\x96\xd4\x4f\x4b\x49\xad\x6e\x36\xfb\x84\x2e\x13\xd2\x51\x55\ \x91\xf9\x85\x27\x80\x96\x62\xba\x49\x1d\x0e\xca\x16\x59\x53\x64\ \xa9\xa8\xc5\xb8\x01\x7d\x77\x1d\x24\x95\xc1\x24\x0f\xc0\xfc\x60\ \x90\xa8\x7c\x76\x24\x9e\x78\x7e\x60\x6a\xaa\xec\x62\x3f\x34\x35\ \xd5\x31\x12\x4f\xfc\x27\xc2\x9f\x05\x0a\xe6\x07\x20\x75\x30\x28\ \xbb\x75\x17\x4e\xfb\xef\xac\x39\xc6\x88\xc8\xbb\x2e\xc2\xa9\x0d\ \xd9\x5f\x34\x83\x33\xf4\x38\xde\xf6\x6f\x94\x34\xca\x9f\x3b\x99\ \x85\x9b\x87\xe3\x89\x1f\xaa\xe8\x1b\x00\xa2\x72\x2d\x99\x85\x5b\ \x90\xe0\xc8\x03\x38\x83\x8f\x22\x45\x19\x25\x71\xc2\x88\xeb\x9f\ \xdc\xc5\xdd\x16\x37\x82\x89\x74\x63\xe7\x86\xd1\xec\x6c\x95\x7d\ \xe4\x94\x6b\xe1\xf8\x06\x1d\x05\x48\xf2\x27\x48\xe3\xb5\x68\xec\ \xce\xd2\xa2\x56\xd0\x3b\x45\xb9\x73\xb1\x27\x95\x60\xc6\xbe\x8b\ \x4c\x06\x47\x9f\x3a\x7f\xf2\xa8\x97\x81\x6c\xba\xd0\x56\x64\x33\ \x12\x8e\x22\x5e\x26\x60\x00\x71\x23\xa8\xcd\x56\x8c\x48\x09\x1c\ \x37\x6a\xe5\xe8\x92\x3d\x58\x07\x38\x83\x5f\xc7\x8c\x7d\xaf\xe6\ \x7a\x66\xf4\x19\xcc\x60\x49\x66\x4e\x0c\x4e\xbd\xef\x5f\xe8\x7c\ \x61\xeb\x12\x11\x8c\xeb\x4f\x1e\xcd\x4e\x15\xe8\x6e\x23\x4e\xf4\ \x4a\xdc\xd6\x4b\xa9\x00\x9b\x09\xb9\x47\x4d\xd7\xfe\xd1\x31\x85\ \x13\x35\xf7\xb0\x5a\xa8\x87\x19\xf8\x1a\xce\x99\x07\xca\xf7\x84\ \x4a\x98\x1f\xc0\xe9\xbf\x0f\x33\xf8\xf5\xb2\xfb\x85\x89\x6c\x01\ \x13\xf2\xd3\x6d\x17\x0a\x47\xa3\x84\xa3\xb9\x2c\xb5\x45\x33\x45\ \x06\xa8\xcb\x85\xee\x6c\xc5\x48\xf4\x5b\xdd\x37\x0e\xc5\x5d\x00\ \x11\x0e\xa1\x6c\x98\xbf\x09\xfe\x72\x70\x27\x0f\xa3\xd1\xbd\xd8\ \xe8\x4d\xbe\x7b\x1b\xf2\xc3\xea\x2c\x8c\x20\xb3\x27\x30\x93\x87\ \x21\x75\x30\xb0\xe6\x17\x61\xc2\x6d\x98\xdc\xe8\x7b\xb3\x03\x81\ \xfc\x84\xd4\xfb\x61\x3a\x9d\x4f\x06\xf3\x12\xb9\xb0\x5e\xe5\xf0\ \x1c\xaf\xc2\x62\x58\x5c\xed\x73\x60\xbe\xb4\x0e\x7a\x2e\x0f\xcd\ \x20\xc9\x1f\xe3\xd4\x78\xb3\x33\xe1\x36\x4c\xcb\x76\x40\xd0\x4c\ \x0a\x9d\x2f\x38\x59\x12\x6e\x45\x42\xfe\x93\x1c\x3b\x57\x12\xbc\ \xcd\x9d\x12\x15\x43\x74\xaa\xcf\x41\x2e\x2c\xde\xb9\x2f\x7e\x4c\ \x61\xc3\xbc\x8d\x55\x43\x0c\xa6\x71\x2b\xa6\x79\x07\x60\xd0\xec\ \x2c\xde\x74\xbf\xff\x7e\x14\xfc\x30\x7c\xd3\xc5\x80\xaf\xa4\x16\ \x45\xaf\x8a\x83\xb7\xc5\x21\xfd\x1c\x4e\xc6\xf6\x8d\xbf\x09\x45\ \x79\x01\x11\x9e\x2d\xe5\xfa\xb0\x20\x4e\x18\x69\xd8\x8c\xdb\x76\ \x15\xa6\x61\x13\x88\x3f\xf2\x5e\xea\xdd\xc0\xbe\xe0\x34\x6d\xf3\ \xa3\x51\xea\xe1\xcd\x9c\x2f\xd4\x37\x75\x48\x3e\x78\x3b\x5c\x26\ \x1f\xf8\xb7\xc5\x2f\x85\x13\x70\xce\x3e\x09\x52\xdb\x0b\x86\x75\ \x86\x88\xe0\x44\x2f\xc7\x69\xbb\x1a\xa7\x31\xb7\xe1\x59\x0f\x6f\ \xe6\x1c\xde\xf4\xe9\x80\xf2\x26\xb2\x19\xc9\x1d\x89\x76\xf6\x7c\ \xe0\x98\x93\xa6\x2d\x80\xf8\x21\xfd\xf2\xf5\x9f\xe0\x82\xcd\x67\ \xbf\xf3\x06\xf0\xdf\xde\xea\x77\x36\x46\xb5\xea\xa0\x38\x88\xe3\ \x27\x63\xd4\xcb\x60\xe7\x86\xc8\x26\xdf\x46\xd3\x63\x85\x69\x8f\ \xaf\xfc\x62\x18\xde\xa6\x47\xb1\xe9\xa2\x23\xb1\x2e\x8a\x09\xfb\ \x57\x0e\x6f\x6e\xa0\x52\x33\xdf\x2c\x7e\x67\x1c\xf0\xcb\x27\x5f\ \x6a\x6d\x5b\x08\xd7\x9d\xe2\x43\x7c\xfd\x29\xa6\x0e\x35\x12\x70\ \x72\x0a\x85\x0e\x4e\xd3\xb6\xc2\xc8\x67\x12\xd8\xe9\x33\x79\xe3\ \x88\xb8\x38\x6d\xbb\xc1\x84\xfc\xb2\xa9\xfe\x52\x09\xa3\x8e\x2c\ \xec\x6a\xdf\x9b\xcc\x47\x9c\x02\x4e\x60\xf4\xd3\xa9\xa4\xaa\x3e\ \xb4\xbe\x2a\xd5\x06\xb5\xf3\x15\x95\x97\x70\x14\xb7\x6d\x77\x41\ \xf9\xf4\x68\x40\x79\x10\x4c\xcb\xce\x9c\x9f\x90\x45\x8b\xf6\x84\ \xbc\x0c\xf8\x87\x62\xe5\x73\xb4\x92\x0e\x28\x12\x3f\x14\x3b\x0a\ \xfc\xfe\x3a\xe8\xb3\x46\x08\xa6\x2e\x8a\x34\x6c\x2e\x3c\xbd\x51\ \x0f\x3b\x7b\x3e\x30\xed\x91\xdc\x43\x8d\x70\x3b\xa0\x78\xa9\xf7\ \xd0\x85\xa9\x52\x61\xaf\x75\xec\x1d\xfb\x84\x48\xd0\xeb\x2d\xbb\ \x53\x8a\xa0\xa3\x87\xf9\x82\xf1\xf8\x25\x25\x71\xfa\xdf\x16\xc4\ \x8d\x20\x0d\x9b\x31\xe1\x56\x3f\x1d\x97\x83\x66\x92\x78\xb3\xe7\ \xc1\x2b\xda\xf0\x44\x30\x4d\xdb\x91\xdc\xba\xb7\x33\xe7\x2a\x29\ \x3f\x69\x8d\xfc\x65\xa9\xf2\xb0\x4c\x98\x6a\xec\x40\xe7\x9f\x8a\ \xc8\x7f\xad\x51\x97\x55\xc1\xb4\xf4\xe6\x5f\xa5\x28\x0a\xe9\x24\ \xf6\xc2\x70\xe0\x9c\x07\x7f\xcd\x9b\x96\x9d\xfe\x33\x3c\xc0\xce\ \x0d\x04\x9c\xa1\x02\x1f\xb7\x75\xec\x1d\xfb\xef\x4a\x6d\x2d\x1b\ \xa7\x1b\x3f\x18\x7b\x1c\x28\xcf\x6e\x6c\x30\xc4\x8d\x20\xf5\x17\ \x41\x66\xc6\xcf\x40\x6b\xf9\xd3\x7f\x09\x47\x71\x1a\xb7\x81\x13\ \x06\x14\x3b\x73\x0e\x9b\x1e\x2f\x17\x06\x8f\x74\xee\x1b\xfb\xc7\ \x25\xdb\x5a\xae\x23\xaa\xc8\xc4\xa1\xd8\xd3\x0a\x77\xd5\xa8\xc3\ \x86\x41\x4c\x1d\xd2\xb4\x25\x7f\xd4\xa9\x66\xb1\x53\xfd\x95\xa6\ \x3d\x28\xcf\x75\xbc\x3e\x76\xa7\xf4\x95\x26\xf9\x8a\xe4\xad\xd4\ \xa0\x1e\x23\x14\x4f\x6c\x7a\xb1\xe2\x63\xe9\xdf\x22\xc4\x8d\x60\ \x1a\xba\x72\x1e\x9e\xdf\x6d\x3b\x9f\x40\x67\xcf\xf9\xf7\xfd\xb2\ \x0a\xfa\x52\x47\xdb\xf8\x9f\xc8\x75\x2c\xfb\x3e\xb7\xba\xe7\xf2\ \x47\x70\x27\xb2\x9b\x9e\x54\xd5\xbb\x6b\xef\xfa\xea\x21\x6e\x23\ \x52\x17\x45\xc2\x6d\x88\x53\x14\xfe\xf2\xd2\x78\xb3\x83\x15\x2f\ \x39\x39\xfc\x7b\x47\xfb\xd8\xdd\x2b\x29\x0f\x35\xc4\xea\x55\x91\ \xf8\xc1\xd8\x23\x08\x0f\x56\x5b\x67\x2d\xf0\x83\x19\xc1\x3f\x9f\ \x69\x76\xd6\xdf\x0c\x33\xa9\x80\x67\x58\xcc\x02\x3c\xda\xb1\x77\ \xec\xa1\x4a\x3b\x7e\xc5\x76\x6a\xed\x58\xfc\x40\xec\x56\x15\x79\ \x9a\x0d\xfe\x87\x98\x18\x17\xa7\x65\x17\xe0\x61\xe7\x27\xd1\xcc\ \x24\xea\x55\xf0\x0e\x0b\x98\x52\xd1\x7b\x62\x7b\xc7\x5f\xa8\xa9\ \x9d\xd5\x74\x6e\xf4\xd5\x4d\x3b\x8c\xea\x33\x28\x1f\x5f\x4d\xfd\ \x0d\xc0\x6b\x9e\xca\x5d\x5d\xfb\x47\xcb\x5e\x41\xac\x84\xf5\xf8\ \xdb\xdc\xa3\x40\x6c\xc5\x0a\x1b\x83\x04\x2a\xff\xd4\xb1\x6f\xf4\ \xa9\x6a\xa7\x7c\x29\xd6\x9c\x71\x4c\x1e\x89\x46\x73\xcf\x4f\xef\ \x03\x56\xcc\xfc\xac\x07\x14\x26\x04\xbe\xe5\xc8\xc2\xb7\x4b\x7d\ \xfb\x5a\xb1\x6e\x29\xd7\xb1\x23\x9d\x4d\xb2\x20\x5f\x04\xee\xc6\ \xff\xbf\xf0\xba\x43\xe1\xb8\xa8\x3c\xad\x61\xfb\x54\xec\xc6\xf1\ \x75\x49\xe9\x6d\x48\xce\x79\xec\x50\xe7\xb5\x62\xe5\x76\x84\xbd\ \xc0\x55\xac\xf2\x0f\x9a\xf8\xaf\x94\x7e\x8d\x70\x48\x55\x9f\x5b\ \x0c\x63\xad\x27\x36\xc4\x00\xc5\x18\x3a\xd2\xdd\x11\xce\x66\x6f\ \xb0\x56\xae\x14\xf4\x0a\x44\x2e\x03\x6d\x07\xa2\x14\x1e\x67\xcc\ \x00\x93\x20\x09\x44\x4f\xa9\x95\x77\x8c\xe8\x89\x4c\xc8\x3d\xda\ \x7d\xe3\xd0\x86\xe4\x2e\x17\xf1\xff\x2e\x18\xc7\x21\x41\x81\x1c\ \xd0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xff\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x51\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x99\x99\ \x99\xaa\xaa\xaa\xa6\xa6\xa6\x9e\x9e\x9e\xa2\xa2\xa2\xa4\xa4\xa4\ \x9f\x9f\x9f\xa0\xa0\xa0\x9e\x9e\x9e\xa1\xa1\xa1\xa1\xa1\xa1\xa1\ \xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x33\xc7\xfb\x65\x00\x00\x00\ \x1a\x74\x52\x4e\x53\x00\x01\x05\x0c\x14\x15\x16\x1c\x25\x33\x42\ \x4f\x5f\x77\x8f\xa3\xac\xbb\xc9\xd5\xdf\xe9\xf1\xf7\xfb\xfe\xa5\ \xc3\x02\x7e\x00\x00\x00\x43\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\ \x0d\xd8\x58\x51\xf9\x9c\xa2\x02\x28\x7c\x2e\x31\x11\x0e\x64\x3e\ \xb7\xb8\x30\x3b\x32\x9f\x47\x42\x88\x05\x99\xcf\x2b\x29\xc8\x8c\ \xc4\x65\xe4\x93\xe2\x67\x62\xc0\x27\x80\xa1\x05\x8b\xa1\x98\xd6\ \x62\x3a\x0c\xd3\xe9\x98\x9e\x83\x02\x00\x75\x5e\x02\xbf\x92\xdc\ \xfb\x05\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xfb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x4e\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x99\x99\ \x99\x99\x99\x99\x9f\x9f\x9f\x9e\x9e\x9e\xa2\xa2\xa2\x9f\x9f\x9f\ \x9f\x9f\x9f\xa0\xa0\xa0\x9e\x9e\x9e\xa0\xa0\xa0\xa1\xa1\xa1\x9f\ \x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\ \xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xc3\x17\x8f\xd2\x00\x00\x00\x19\x74\x52\ \x4e\x53\x00\x01\x05\x0a\x10\x15\x16\x18\x25\x33\x42\x56\x67\x88\ \x8f\xa3\xac\xb5\xc3\xd0\xdf\xe9\xf1\xf9\xfc\xef\x2a\x04\x2b\x00\ \x00\x00\x43\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\x06\x58\xd9\xd0\ \x04\x04\x44\x39\x51\x05\x38\x44\xc4\xb8\x50\x45\xd8\x85\xc5\xb9\ \x51\x45\x58\x84\x24\x78\x50\x45\x98\x05\x25\x79\x51\x45\x98\xf8\ \x25\xf9\x18\xf1\x09\xa0\x6b\x41\x37\x14\xdd\x5a\x0c\x87\x61\x38\ \x1d\xc3\x73\xc8\x00\x00\x75\xb5\x02\xbd\xd5\xb1\xbf\x0e\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xb3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x13\x00\x00\x04\x13\ \x01\xfd\x8e\xab\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x30\x49\x44\ \x41\x54\x38\x8d\x7d\x93\xcd\x4e\x13\x61\x14\x86\x9f\xf3\xcd\x30\ \x05\x0b\xb6\x74\x3a\xc0\xc2\x06\x17\x6c\x44\xc1\x8d\x46\xb7\x28\ \x86\x94\x84\x2d\x5e\x00\x24\xee\x89\xb7\x61\x34\x46\x13\x16\x7a\ \x15\x26\x14\x01\xbd\x00\x56\x10\x29\x2c\xd8\x00\x9a\x58\x40\xe8\ \x0f\xe5\xa7\x33\x9d\x39\x2e\x0a\xa4\x16\xf0\x5d\x7d\x39\x79\xcf\ \x93\x9c\xf7\xcd\x27\xb4\xa8\xb0\xd8\x3b\x64\x2b\xd3\x8a\x3e\x07\ \xee\x9e\x8f\xb7\x04\x5d\x32\x6a\x3e\xa5\xc6\x76\xd7\x9a\xfd\x72\ \xf1\xd8\x9c\x1b\x88\x25\xad\xca\x5b\x44\x5e\x89\x93\x30\x84\x27\ \x68\xe8\xb7\xf2\x43\x85\x59\xaf\xe4\xcd\xc8\x64\xde\xbf\x04\x6c\ \xce\x0d\xc4\x92\x6d\xe5\x9c\x58\xf1\x11\xe9\xe8\x41\x6b\x45\x34\ \x38\x06\xad\xb7\x02\x2e\xf4\x3d\x5d\xf2\xb2\x32\x99\xf7\x0d\x40\ \xd2\xae\xbc\x13\x2b\x3e\x22\xb1\x14\x7a\x76\x80\x38\xdd\x88\x1d\ \xbf\x69\x19\xe0\xd9\x7e\xf2\xcf\x1b\x00\x29\x2c\xf6\x0e\x59\xca\ \x8a\xe9\xec\x37\x5a\x3b\x40\x9c\xdb\x68\x50\x41\xda\x92\x44\xc7\ \x3f\xff\x07\x09\x4d\x64\x1e\xda\xb6\x32\x8d\x93\x30\xea\x97\x90\ \x98\x8b\xfa\x87\x88\xd5\x49\x58\xab\xa0\xe9\x97\x8d\xa0\x8a\x39\ \x24\xac\xb4\x02\xac\xc8\x8a\xa6\x64\x7f\xa1\x27\x8f\x71\x06\xd1\ \x08\x63\xc7\xa1\xad\x8b\xd0\x3f\x22\xbc\xf7\xe5\x4c\xec\xf8\x2a\ \x20\x1a\x54\x87\xad\x8d\x89\xf6\x56\x88\xc2\x9a\x41\xc8\x10\xf9\ \xa0\x75\xa2\xa0\x4c\x74\xf2\x0b\x4d\x66\x11\x3b\xbe\xda\xe7\x65\ \x9e\xf6\x79\x99\x27\xd8\xf1\x1f\xda\x9d\xbd\x72\x83\x08\xfd\xe6\ \xfa\xf3\x14\x9a\x2a\x16\xb9\x9c\x5d\x91\x41\xb9\x92\x94\x14\x73\ \x68\x50\x1d\xfe\xbd\xb7\xb3\x5c\xd8\xdf\x59\xd6\x7a\x75\x48\x8a\ \xf3\x98\x78\x06\x71\x12\x20\x36\x62\x39\xa8\xb2\x6d\x0b\xba\xa8\ \xc8\xe0\x3f\x80\xb0\x82\xb5\x31\xd1\xae\xdd\xd9\xc7\xa0\x58\xc5\ \x1c\x26\xd6\x85\x06\x25\xc4\x71\x9b\x7c\xfe\x82\x1c\x7e\xed\x7d\ \x10\x8a\xae\x00\xd6\xf5\xe7\x80\xb9\x75\x07\xad\x97\x11\x3b\x41\ \xe4\x97\x31\x1d\x2e\xd1\xd1\x76\x68\x8c\x0c\x9b\xd4\xd8\xee\x9a\ \xc2\xec\x4d\xcb\x00\x5a\x3f\x42\x1c\xb7\xb1\x1c\x4b\xa0\xa7\x7b\ \x08\x7c\x74\x47\x0b\xeb\x06\xc0\x2b\x79\x33\xc0\xb7\x1b\x01\xc1\ \x31\xea\x17\x31\xed\x2e\x5a\x3b\x44\x83\x93\x25\x37\xb5\xfb\xba\ \x11\x22\x20\x93\x79\x3f\x5d\xf2\xc6\x15\xf9\x00\x84\x57\x08\xd2\ \x28\x2b\xaa\x6e\x87\xd4\x4f\xdf\xa7\xdd\xbd\x71\x79\x44\x00\x4d\ \x55\x5d\xe8\x60\xbe\xef\x7e\x64\x45\x53\xaa\xbc\x90\xf3\xef\xac\ \xb0\x25\xb0\x60\x8c\xf9\xec\x8e\x16\xd6\x9b\xfd\x7f\x01\xbf\x99\ \xe7\x9b\x71\x08\xcd\x5f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\x2f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\xf6\x49\x44\x41\x54\x38\x8d\xa5\x8f\x3d\x4a\x03\x51\ \x14\x46\xcf\xf7\xe6\xe9\x98\x89\x1a\x51\x74\x08\x8a\x5b\x48\xdc\ \x82\x60\xc0\x0d\xb8\x06\x77\xe0\x36\x2c\x2d\x85\x28\x16\x62\x29\ \x82\x5d\x16\xe0\x1f\x88\x95\x82\x08\x42\x34\x56\x82\x76\x33\xd7\ \x42\x46\x03\x3a\x61\x9e\x7e\xd5\xc7\xbd\x9c\x73\xb9\xf0\xcf\x68\ \x70\xba\xb0\x29\xac\x31\x3c\xcc\xa4\xdb\x74\xed\xf9\xa8\xaa\xc0\ \x7e\x99\xe7\x90\xaf\xce\x77\x5e\x7a\x7f\x15\x00\x3c\x18\x3a\x28\ \x03\xb3\x4c\x3b\xcd\xf5\xfe\xbd\x1f\x21\x5f\x16\xb6\x55\xb6\xf4\ \x8e\x4b\xe0\x87\xe0\x15\x91\x8f\x90\x7e\x45\xf2\xe3\xfd\xab\x4e\ \xfd\xfb\x05\xf9\x0b\x3f\xd7\x5e\xa9\x02\x0f\xe5\xc9\x15\x2d\xaa\ \xa5\xef\x81\x30\x18\x27\x85\xe0\x8d\x5a\xda\x0e\xe5\x85\x75\x1d\ \x80\x1b\x4b\xce\x25\x57\x0f\xe4\x1f\x1b\x77\x93\x3d\x07\xa0\x89\ \x66\x28\x8c\xa0\xab\x8d\xc3\xcc\x61\xea\x2b\x9e\x69\x85\x0a\xf2\ \x48\xfb\x00\xce\xc5\x53\x37\xa0\x28\x90\x3f\x9b\x6d\x1d\x5f\x7f\ \x0a\x92\xc5\xa5\xd0\xeb\x98\xed\x15\xd5\x9b\x4f\xb6\x1d\x9a\xae\ \x0e\xe7\x66\x2e\xde\x0d\x3e\x5a\x96\x0f\xbc\x91\x41\x07\xb7\xa4\ \x41\x32\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x81\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x93\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\x55\xaa\ \xaa\x66\x99\xcc\x80\x80\xbf\x74\x8b\xb9\xed\xb6\x12\x78\x87\xc3\ \x6d\x86\xc2\x75\x83\xc1\x71\x82\xbe\x72\x82\xc1\x73\x82\xbe\xec\ \xbc\x18\x71\x84\xbd\x72\x84\xbf\x73\x84\xbd\xea\xb9\x15\xec\xb9\ \x17\xec\xba\x17\xec\xb8\x17\x73\x83\xbf\x72\x84\xbe\xe9\xbb\x16\ \xea\xba\x15\x72\x84\xbf\x74\x82\xbf\xec\xb9\x15\x74\x83\xc0\xeb\ \xbb\x17\xeb\xba\x16\xeb\xba\x16\x74\x83\xc0\x74\x83\xbf\xeb\xba\ \x16\xeb\xbb\x16\x73\x82\xbf\xeb\xbb\x16\xeb\xba\x16\xea\xbb\x16\ \x73\x84\xc0\x73\x84\xbf\x73\x83\xbf\x73\x82\xc0\x73\x84\xbf\x73\ \x83\xc0\x73\x83\xbf\x72\x83\xc0\x73\x83\xbf\x17\xcc\xf9\x07\x00\ \x00\x00\x30\x74\x52\x4e\x53\x00\x01\x03\x05\x08\x0b\x0e\x11\x15\ \x25\x2b\x31\x33\x35\x36\x38\x3e\x3e\x42\x43\x44\x50\x53\x53\x55\ \x57\x58\x5f\x61\x65\x67\x68\x75\x77\x7e\x7f\x83\x8a\x8c\x95\x9d\ \xba\xc7\xd5\xdf\xe5\xec\xf5\xb7\x1a\x71\x4d\x00\x00\x00\x6d\x49\ \x44\x41\x54\x18\xd3\x63\x60\xc0\x05\x98\xd1\xf8\x9c\x3a\x62\x28\ \x7c\x2e\x5d\x03\x19\x64\x3e\x9f\x9e\x01\x50\x40\x9c\x11\xcc\xe1\ \x50\x50\x54\xd1\x37\x00\x0a\xc8\x8b\xc8\x82\x05\x24\x0d\x20\x40\ \x86\x57\x4e\x1d\x2c\x20\x05\x13\x60\x50\x53\x62\x43\x11\x60\x54\ \x55\x06\x0b\x88\xc2\x04\xa4\x85\x21\x5a\x98\xb8\x79\x04\xb4\x41\ \x02\x82\x42\xb2\x70\x6b\xd9\xb5\x40\x66\x48\x30\x22\x1c\xc2\xaa\ \x89\xea\x30\x06\x06\x16\x0d\x7e\x06\x22\x01\x00\x36\x83\x0d\x4b\ \x25\xde\xd8\x74\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x02\xba\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x40\x00\x00\x04\x40\ \x01\xe6\x02\xdf\x02\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x37\x49\x44\ \x41\x54\x38\x8d\x85\x90\xcb\x4b\x94\x51\x18\xc6\x7f\xef\xf9\xa6\ \x6f\x66\xbc\x4d\xe4\x25\x28\x26\xb5\x40\x2c\xa3\x8c\x32\xa1\xa0\ \x85\x04\xe1\xa4\x5d\x16\x2d\xd2\x0a\x0a\x84\x2e\xe4\x2a\x68\x57\ \x52\xff\x82\x26\x14\xb5\xd2\x36\x5a\x08\x41\x66\x17\x08\xda\x84\ \x83\x5a\xe4\x75\xd1\xa2\xbc\x44\x8e\x9a\x3a\x32\x33\x7e\xce\x9c\ \xd3\x22\x0c\x47\x47\x7d\x76\xef\xe1\xf9\x3d\xe7\x79\x5f\x61\x13\ \x8d\x06\x5b\x03\xa2\xcc\x83\xe5\xd9\x80\xa3\x2d\x55\x97\x5f\x5a\ \x33\x00\x20\x2b\xcd\x43\x57\xce\x67\x9b\x78\xb4\x1c\x91\x22\x8c\ \x72\xbb\xf2\xf3\x0a\xed\xf2\xfd\x57\xad\x1d\xb9\x36\x96\x22\x1e\ \x8f\xe3\xc4\x1c\x3c\x69\x9e\x29\x25\xaa\xc2\x7f\xe4\xd2\x37\x31\ \x20\x43\xb5\x55\xe7\x44\x9b\x4a\x84\x90\x18\xf3\x09\x97\x35\xe2\ \x3d\x7b\xe2\x38\x5b\x33\x9e\xea\xc9\x19\x3b\x31\x11\x22\x91\x30\ \x84\x72\x32\xd0\x5e\xb7\x16\x4b\x29\x7f\xe1\xae\x90\x12\x2a\x64\ \xb8\x36\xd0\x64\x8c\x7c\x28\x2e\x2a\xeb\x90\x86\x06\x0d\x30\xd6\ \xd3\x52\x65\x30\xed\x20\xee\xe5\x76\xd3\x3f\x26\x50\x3d\x23\x61\ \xd7\xcf\x5f\xb7\x66\x4e\x1f\x7b\x96\xbd\x3d\xd7\x95\x9e\x95\xde\ \x9b\xb4\x02\xc0\x78\xcf\xf3\x6a\x8d\x6e\x07\xec\x95\xef\xf3\xb3\ \x61\xa6\x7f\x4f\xe9\xb4\x3f\xe1\xf1\x05\x9f\xd7\xef\xdf\x53\x80\ \x6d\x6f\x19\xb4\x92\x0e\xd6\xdb\x52\x69\xd0\x2f\x56\xfe\xbc\x2c\ \xb7\xc7\xc6\x72\x59\x92\x48\xf3\xf8\xb2\xf3\x72\xf0\x78\x3d\x00\ \xa1\xff\x0d\x46\x83\xad\x01\x94\x7e\x99\x0a\xde\x40\x83\x0a\x20\ \xd8\xf9\xe8\x4c\x2c\xee\xdc\x4f\x05\xeb\x70\x64\x3d\xd8\xc4\xfb\ \xbf\xbf\x52\xdd\x5d\x4d\xd5\x88\x6e\x9b\x9d\x8b\x1c\x88\x2e\x3a\ \x7d\xab\x5d\x4b\x9f\xfb\x53\xc2\x60\xea\x63\x5d\xdd\xe9\x4a\x12\ \x6a\x0c\x58\x00\x3c\x73\xf3\xd1\x7d\xd1\x98\xf3\x25\xc9\x2a\x6b\ \xee\x6c\xc0\xd4\xfb\x0f\x5f\x6e\x04\xa3\x55\x59\xe0\x46\x1f\xda\ \x3a\x09\x66\x06\x70\xcf\x85\xa3\x7b\x93\x42\xb4\x5e\x07\x06\x11\ \x5c\x0a\x20\x55\x48\x24\xe6\x7c\x05\xc0\xb6\x31\xff\xee\x60\x0c\ \xdc\x5e\x86\x47\x2e\x56\x17\x1b\xc3\x64\x52\xbf\xe0\xeb\xe6\x43\ \xa8\xc4\x7b\x90\x6d\xc0\x62\x56\xa6\x77\xd8\x8b\x39\x18\x7b\xd7\ \x8d\x5d\xb2\xfb\x61\xc1\x85\xbb\xf7\x00\x06\x6a\x02\xa5\x0a\xb9\ \x93\xb1\x94\x56\xb7\x66\xc1\xd5\x21\xbe\x4c\xef\x90\xed\x2c\xb5\ \x44\x9f\x74\xb8\x45\x64\xa7\xc1\x24\x44\xcb\x68\x22\x1e\x69\x2e\ \x69\xfb\xb8\xb0\x26\x00\xa0\xbb\xb3\xa9\x4c\x84\xb7\x80\x0f\x91\ \xeb\x65\xa7\x6e\x3e\x4e\xe5\xdb\x50\xc1\x37\xcd\x47\x83\x5d\x8d\ \xd7\x36\xf3\xfd\x05\xf3\x24\xee\x2b\xac\x1c\x56\xaa\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x1e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\xbc\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\xff\ \x80\xff\xdb\x49\xdf\xbf\x20\xe3\xc6\x55\xe6\xcc\x4d\xf2\xcc\x4d\ \xf4\xd3\x4e\xea\xca\x4a\xed\xb6\x12\xe9\xbc\x17\xf2\xd0\x4a\xf2\ \xd1\x48\xed\xd0\x47\xf0\xcd\x4b\xce\xc9\xae\xed\xcf\x4b\xea\xbb\ \x15\xee\xcd\x4b\xef\xcf\x4c\xcd\xc9\xac\xee\xcf\x48\xec\xba\x16\ \xef\xcd\x4b\xf0\xcf\x4b\xee\xce\x4b\xd2\xbe\x85\xea\xbb\x15\xf0\ \xcd\x4a\xee\xcf\x4b\xef\xce\x4b\xef\xcd\x49\xed\xc0\x26\xef\xce\ \x49\xf0\xcd\x4b\xee\xce\x49\xd1\xc0\x85\xf0\xce\x4b\xd0\xc2\x90\ \xd0\xc0\x85\xee\xcd\x4b\xef\xce\x4b\xef\xcd\x4a\xef\xce\x4a\xf0\ \xce\x4b\xe6\xc1\x3d\xed\xc1\x27\xd6\xbf\x6e\xd9\xbe\x65\xec\xbf\ \x21\xec\xc2\x2c\xdc\xc4\x70\xee\xc6\x34\xf2\xe7\xba\xd6\xcb\x95\ \xd7\xbe\x6c\xde\xcc\x7e\xe1\xc7\x67\xea\xbb\x1b\xeb\xba\x16\xd6\ \xc2\x7c\xd3\xc9\xa0\xea\xb9\x16\xf0\xce\x4a\xee\xc8\x3c\xd2\xc0\ \x85\xe3\xcb\x6f\xef\xce\x4a\xe5\xc9\x5f\xce\xc9\xae\xd1\xc1\x8a\ \xef\xce\x49\xd4\xc1\x81\xd0\xc9\xa6\xea\xbb\x18\xf3\xed\xd3\xee\ \xcc\x46\xe7\xcd\x62\xec\xbb\x19\xf4\xed\xd5\xee\xca\x40\xef\xce\ \x4a\xeb\xba\x16\xea\xba\x17\xeb\xba\x16\xef\xce\x4a\xef\xce\x4a\ \xef\xd1\x5e\xec\xcd\x51\xee\xcd\x46\xf3\xee\xd9\xef\xce\x4a\xce\ \xc9\xae\xef\xce\x4a\xeb\xba\x15\xef\xce\x4a\xef\xce\x4a\xed\xce\ \x51\xef\xce\x4a\xed\xcd\x4e\xef\xce\x4a\xef\xce\x49\xd1\xbf\x86\ \xf3\xee\xdb\xf4\xef\xdb\xf4\xef\xdc\xce\xc9\xae\xeb\xba\x16\xef\ \xce\x4a\xee\xce\x4d\xee\xce\x4b\xef\xce\x4a\xef\xce\x4a\xd1\xbe\ \x86\xef\xce\x4b\xce\xc9\xae\xce\xc9\xae\xd0\xcc\xb1\xd0\xcc\xb2\ \xd1\xbf\x86\xd3\xcf\xb5\xd6\xd1\xb7\xd6\xd1\xb8\xd8\xd3\xba\xda\ \xd6\xbd\xde\xd9\xc1\xde\xd9\xc2\xdf\xda\xc2\xe0\xdb\xc4\xe2\xdd\ \xc6\xe2\xdd\xc7\xe4\xdf\xca\xe8\xe4\xce\xe9\xe4\xce\xea\xe5\xcf\ \xea\xe5\xd0\xeb\xba\x16\xeb\xe6\xd1\xec\xe7\xd3\xef\xce\x4a\xef\ \xea\xd6\xf0\xec\xd7\xf1\xeb\xd8\xf1\xec\xd9\xf2\xee\xdb\xf3\xee\ \xdb\xf4\xef\xdc\x4b\x66\x29\xbf\x00\x00\x00\x75\x74\x52\x4e\x53\ \x00\x01\x02\x07\x08\x09\x0a\x14\x17\x18\x1c\x22\x26\x27\x2b\x33\ \x39\x3a\x3c\x3d\x40\x47\x4a\x51\x52\x55\x58\x5a\x61\x67\x6a\x6d\ \x70\x71\x81\x85\x88\x95\x96\x97\x99\x9a\x9d\xaf\xb2\xb5\xb8\xb8\ \xbb\xbb\xbb\xbb\xbf\xbf\xbf\xc0\xc1\xc2\xc3\xc4\xc4\xc5\xc6\xc6\ \xc7\xc8\xca\xca\xca\xcb\xcc\xcc\xcd\xce\xd0\xd1\xd2\xd3\xd6\xd6\ \xd6\xd7\xda\xdd\xde\xde\xe0\xe1\xe3\xe5\xe5\xe5\xe9\xeb\xed\xee\ \xee\xef\xf0\xf0\xf1\xf1\xf3\xf6\xf6\xf6\xf6\xf7\xf9\xf9\xfa\xfb\ \xfb\xfc\xfd\xfd\xfe\x4f\x80\x33\x24\x00\x00\x01\x9c\x49\x44\x41\ \x54\x58\xc3\xd5\xd6\x65\x57\x02\x41\x18\x05\x60\xb0\x15\xbb\xbb\ \xbb\xbb\x3b\xb0\x13\xbb\x3b\xb0\x63\x15\x15\x5b\xc0\x55\x0c\xe0\ \x0f\xcb\x27\xdf\xf1\x1c\x97\xb3\xdc\xf1\x18\xf7\xfb\x7d\xce\xbb\ \xb3\x33\xbb\xa3\x50\x50\xb4\x36\x99\xd1\x2a\xbe\x0e\x17\x10\xa8\ \x56\xab\x37\x78\x80\x30\x41\x10\xd6\x61\x20\x26\x33\x33\x83\x0b\ \x48\xd3\xe9\xda\xff\x12\xf0\x64\xa2\xbc\x01\xc0\xa3\xc0\xe4\x1c\ \x00\x9e\x4f\x8f\x3f\x72\x72\xfd\x1f\x16\x31\xb8\x41\xa3\x29\xe4\ \x01\x46\x44\x51\xac\xe4\x01\xc4\x6f\x07\xac\xb7\x37\x92\xb9\xb3\ \xca\x00\x8c\x82\x83\x18\x65\x00\x96\xcb\x0b\xc9\x5c\x59\x7e\x62\ \x0d\xe4\x00\x2a\x95\x0f\x1f\x60\xef\xd4\xba\x71\x02\x62\x04\x2f\ \x10\x2b\x05\xbc\xe8\xcf\x24\xa3\x7f\x95\x01\x98\x1c\xed\x83\x07\ \x19\x80\xcd\x70\x2f\x19\x83\x9c\x47\xe0\x5e\x83\x5f\x05\xa6\x06\ \xe4\xa5\xa7\xdf\x9e\xa4\x00\x7b\x7c\x3f\x01\xe5\x87\x66\xa7\x93\ \xca\x00\x47\xe3\xce\xf7\xcd\xf3\x0c\xd0\x05\xf4\xcd\x1d\x0c\x50\ \x85\x00\x89\x04\x6c\x2e\x02\xfd\x3d\x6f\x02\xea\x91\x01\xf2\x98\ \xb7\xd0\x82\x00\xd1\x04\xcc\xec\x00\xfd\x15\x0f\x02\x2a\x90\x01\ \xb2\x99\x9d\xd8\x87\x00\xa1\x04\x34\x23\xfd\x31\x17\x02\x4a\x11\ \x20\x85\x0e\xd3\xc1\x04\x02\xf8\x13\xd0\x89\xf4\x5b\x99\xe3\x5c\ \x8d\x00\x09\x04\xac\x2d\x23\xdb\xd8\x8b\x80\x3a\x64\x80\x5c\xe6\ \x8b\xd4\x86\x00\x51\x04\x14\xed\x02\xfd\x25\x77\x02\xf2\x91\x01\ \xb2\x98\x8f\xea\x20\x02\x84\x10\xd0\x8d\xf4\x47\x95\x04\x94\x20\ \x40\x32\x5d\x30\xb6\x26\x11\xc0\x8f\x80\x1a\xa4\xdf\xc8\x5c\x71\ \xca\x10\x20\x9e\x80\xb9\x55\xa0\xbf\xed\x49\x40\x31\x32\x40\x0e\ \x73\xcd\x6b\x42\x80\x48\x02\x86\xf7\x91\x3f\xa2\x2b\x01\x05\xc8\ \x00\xe9\xcc\x4d\xb5\x17\x01\x82\x18\x60\x16\xe8\x0f\x29\x19\x20\ \x6e\xc1\xe9\xfe\x74\x38\xd3\x7f\x07\x59\xc0\x54\x22\x0e\x02\xbe\ \x74\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xe6\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x66\x50\x4c\x54\x45\x00\x00\x00\x55\x55\x55\x4e\x62\ \x76\x58\x6a\x7b\x55\x69\x78\x53\x69\x79\x54\x6b\x79\x54\x6b\x79\ \x54\x69\x79\x53\x6b\x7a\x55\x6a\x79\x54\x6a\x79\x53\x6a\x79\x54\ \x6a\x79\x54\x6a\x79\x54\x6a\x79\x54\x6b\x7a\x55\x6d\x7b\x55\x6e\ \x7b\x60\x8b\x8f\x60\x8c\x8f\x62\x92\x94\x63\x95\x96\x66\x9e\x9b\ \x68\xa2\x9f\x68\xa3\x9f\x68\xa4\xa0\x6d\xb0\xa7\x6d\xb0\xa8\x6d\ \xb1\xa8\x6e\xb2\xa9\x6e\xb3\xa9\x71\xbd\xb0\x7e\xe0\xc8\xf7\xb9\ \x9a\x51\x00\x00\x00\x0f\x74\x52\x4e\x53\x00\x03\x0d\x1d\x33\x50\ \x70\x7c\x8f\x99\xaf\xcc\xe2\xf2\xfc\x3f\xa1\x3b\xf3\x00\x00\x01\ \x20\x49\x44\x41\x54\x58\xc3\xed\x97\xdb\x8e\xc2\x30\x0c\x44\xb9\ \x2f\xb0\xc0\x74\xb9\x6e\x31\xb7\xfc\xff\x4f\xc2\x2e\x08\xd1\xe0\ \xd8\x29\x23\x1e\x40\xf8\x31\xca\x9c\x2a\xc9\x64\xe2\x36\x1a\x9f\ \x7a\xc3\xfa\x1a\xd4\xac\x48\xdf\x45\xdd\xaa\xea\x5b\x23\x12\xd0\ \x07\x07\xe8\x4c\x38\x40\xf3\x1b\x1c\xa0\x07\x0e\xd0\x1e\x93\x80\ \x21\x38\x40\x17\x1c\xe0\x01\x0b\x54\x01\x7d\x70\x00\xc5\x02\xd3\ \x85\x32\xbf\x58\x16\x2a\x40\xb1\xc0\xcf\x21\x94\xf7\x7a\x09\xbb\ \x42\x03\x28\x16\x58\x85\x10\x7e\x63\xfd\xfe\x34\x38\x57\x00\x9a\ \x05\x8a\xcd\x69\x72\x19\x7f\x3f\x1e\x82\x61\x81\x3b\x82\xa6\x87\ \x65\x81\x88\xa0\xea\x61\x5a\xa0\x42\xd0\xf5\xb0\x2d\x70\x43\x48\ \xe8\xe1\xa4\xc0\x95\x90\xd2\xc3\x4b\x81\x0b\x21\xa9\x87\x9b\x02\ \x67\x42\x52\x0f\x3f\x05\xfe\x09\x49\x3d\x32\x52\xe0\x4c\x28\xf1\ \x38\x60\x6b\x02\xfc\x25\x88\xbd\x04\x77\x13\xff\xf4\x6b\x63\x13\ \xbd\x63\x14\xf7\x18\x6d\x23\x89\x6f\x24\xd3\xca\x92\x63\x65\xe3\ \x32\x49\xde\x65\x4a\x5e\x67\xc9\xbc\xce\xa9\x40\x91\xec\x40\xd1\ \x23\x4d\x6a\x44\x5a\xad\x50\x9d\x3d\x25\xd6\xe9\x87\x85\x7f\xda\ \xf8\xc7\x95\x7e\xde\xf9\x06\x83\x6f\x71\xe8\x26\x8b\x6f\xf3\xe8\ \x46\x93\x6f\x75\xf9\x66\x9b\x6e\xf7\xf9\x1f\x8e\x4f\xbd\x66\x1d\ \x01\xe7\x54\xaf\xc5\x30\x3b\xd3\xe3\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x0a\xfe\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x0a\xc5\x49\x44\x41\x54\x78\xda\xe5\x5b\x0b\x94\x4e\x55\ \x14\x9e\x52\x4a\x2f\xa5\xf4\x12\xbd\x84\x6a\x29\x95\xa6\x44\x1a\ \x15\x19\x32\xcd\xe3\xbf\x97\xc1\xd4\x2c\xa1\xa5\x27\xad\x52\xa2\ \xa2\x87\x94\x47\x2f\x7a\xe8\x61\xca\x4c\x43\x2f\x64\xb1\x3c\x2a\ \x2a\x62\x29\xd2\xd0\x6b\xcd\x4b\x42\x4c\x85\xc4\x0c\x06\xb7\x7d\ \xee\xdd\xe7\xfc\xe7\x3f\xb3\xf7\xfd\xef\x3f\x8f\x66\xe8\x5f\x6b\ \xaf\x3b\xee\xbe\xe7\xdc\x73\xbe\xb3\xcf\xde\xdf\xde\xe7\x8a\x8b\ \xab\xe1\x9f\x93\x94\x74\xbc\x63\xdb\xdd\x1c\xcb\x7a\x0c\x24\x07\ \x64\x05\xc8\xaf\x20\x5b\x41\xf6\x81\x94\xe3\xdf\x45\x20\x5f\xc2\ \xb3\x6f\x3b\xa1\xd0\x60\x90\x6b\x9d\x81\x03\x8f\x8c\x3b\x18\x7f\ \x30\x91\xd3\x61\x22\x43\xe0\xba\x0c\x27\xe8\x54\x52\xfe\x01\x99\ \x05\x60\xf4\x81\xeb\x71\x75\x7f\xe2\x62\xd5\x2c\xeb\x13\x5c\x59\ \x7d\x22\xdb\x41\xe6\x80\x7e\x2c\x00\x33\x00\xae\x5d\xe0\xda\x1e\ \xee\x5d\x81\xd2\x0e\x24\x09\xee\xdf\x03\x32\x19\xfe\x5e\x0b\xb2\ \xdf\xe8\x63\x07\xc8\xcb\x20\xcd\xeb\xde\xc4\x6d\xfb\x26\x18\xd8\ \x52\x63\xc0\x05\x20\xa3\x9c\xb4\xb4\xb6\x70\xad\x17\x73\x9f\xc9\ \xc9\x27\x02\x18\x89\x20\x59\xd0\x7e\xa7\xd6\x6f\xb9\xbb\x4d\x7a\ \xf5\x6a\x5a\x17\x4c\xbd\x39\xae\xb8\x1c\x9c\x58\xb5\x19\xae\x25\ \xc4\xc5\x1d\x56\x6d\xef\xe9\xd3\xe7\x04\xd7\x72\x2c\x6b\xa5\xf6\ \xae\x9d\xf0\x9e\xa1\xb5\xe6\x27\x60\x00\x9d\x41\x76\xe3\x60\x0e\ \xc0\x60\xde\x73\x7a\xf6\xbc\xb0\x46\xdf\x09\xa0\xa2\x3f\x58\xaf\ \x01\xb1\x1c\xde\x7b\x7e\x6d\x00\x90\x81\x03\x58\x05\xd2\x21\x50\ \x9b\xde\xbd\x4f\x82\x09\x5c\x03\xcf\xf7\x06\x79\x10\x56\xf5\x21\ \x57\x2c\x6b\x10\x48\x77\x30\xeb\x73\x02\xbe\xbb\x01\xf4\x33\x42\ \x5b\x80\xbf\x45\xfb\xda\x00\xa1\x99\x33\x72\xe4\xe1\xbe\x2b\x66\ \xdb\x1d\x61\xb0\x13\xd1\xb1\x1d\x08\xe0\xf9\x8b\xe0\xf9\x09\x70\ \xbd\x2e\x9a\xef\x00\x7d\x3c\x86\x54\xc7\x75\xbc\xb6\x7d\x6f\x4d\ \x4e\xf6\x22\x21\x81\xf7\xac\x58\x61\xcb\x5a\x47\x4c\xb0\x14\xe4\ \x07\x90\x4f\x41\x16\xba\x61\xce\xb2\xbe\x43\x2f\x6f\x3e\x5b\x08\ \x60\xf4\x87\x6b\x7d\xf6\x5d\xe9\xe9\xa7\x80\x7e\xbe\x6a\x13\x0a\ \x0d\xab\x89\xc9\x8b\xd5\x28\x73\x07\xdf\xa3\xc7\x31\xec\x73\x09\ \x09\x47\xb8\x24\xc6\x23\x36\x72\x12\x7b\x5d\x47\x19\x0a\xdd\x01\ \x11\xe1\x62\x3f\xe7\x08\x5b\xe0\x4c\x78\x76\x20\xc8\x3c\x90\x3d\ \x5a\x1f\x62\x95\x33\xb9\xb6\xc2\x52\x60\xf5\xb3\xd5\xf3\xd5\x69\ \x09\xe0\x60\x2e\xc5\x38\x2e\x3a\x5f\xc4\x0e\x22\x2d\xed\x12\xd0\ \xe7\x69\x83\xde\xe4\x7a\xe9\x94\x94\x93\x2b\xf5\xde\x94\x94\x53\ \x5d\xde\x10\x19\x02\xe7\x82\x34\x61\xc1\xb7\xac\x0f\x54\x34\x0a\ \x85\x52\xab\x3e\xf9\xf4\xf4\xd3\xdc\x89\x78\x9d\x7e\x23\x4c\x9b\ \xe1\x01\x03\xd0\x42\x1c\x1c\xf0\x70\x27\x33\xf3\xe8\x6a\xb2\xbe\ \xc6\x48\x80\x24\x31\xda\x06\x93\xb3\xc8\x67\x21\x24\x82\x7e\xb6\ \x46\x9c\x5a\x56\x2d\xe4\x84\x3b\xdb\x24\xcc\x93\x71\x72\xa3\xb5\ \x15\x5a\x06\x96\x70\x5e\x0d\xb1\xcc\x04\xe8\xbf\x58\x85\x5d\xdb\ \x7e\x80\x01\xec\x38\x90\x7c\x7c\x6e\xb5\x9f\xff\x88\xf6\xc2\x3b\ \xb5\x3d\x1c\xcf\xbc\x6c\xbc\xb6\xef\x5e\x13\x66\xe8\xdb\xa7\xb7\ \xc7\xdf\x74\xad\xc9\xb2\x4a\xd0\x21\x6e\x47\xd6\xf8\x39\xc8\x33\ \x6e\x38\x64\x06\xed\x26\x56\x82\x68\x85\x1d\xde\x8b\x54\x14\x42\ \x7a\x2d\x7d\xc8\xa8\xca\x98\x5d\x13\x90\x5d\x38\xb1\x47\x99\x67\ \x1e\xd6\x26\x3f\x32\x20\xa8\x83\x03\x26\x41\x25\xd0\xe7\x38\x91\ \x54\x91\x0e\xcf\x0b\xab\x12\x84\x09\xcc\xb6\x7c\x04\x9f\xd9\x03\ \x56\x79\x41\xac\xab\xff\x2a\x36\x5e\x43\xad\x2a\xdc\xef\xaa\xf6\ \xa4\x6d\x3f\xcb\x00\xd4\x08\x5e\xdc\xaa\x02\x11\x02\x40\xdd\x88\ \x20\x12\x22\x6f\xa5\x3a\xb8\x89\x90\x47\x88\x66\x62\x06\x18\x4e\ \x80\x20\xac\x91\x63\x08\x85\x1e\xd7\x9e\xbb\xbb\x82\x1e\x2c\x03\ \xc3\xab\xd0\x7f\x18\x7c\xf2\xb0\x87\xd1\xec\xc5\xe4\x6e\x22\xbc\ \xf3\xc9\xa0\xdb\x8c\x1d\xcf\xa4\xa2\x02\xf4\x71\x15\x3a\xcf\x7d\ \x10\x45\x5a\xc4\x5c\x3f\xb0\xac\xdb\xb5\x7d\x2c\xe4\x0b\x27\x35\ \xf5\x0c\x62\x95\x5f\x53\x24\x08\x12\x27\x62\x11\xae\x57\x3e\x03\ \xa2\x59\x50\xf3\x9f\x82\x8d\xbe\x62\xf4\xef\xa2\xfe\x37\x90\x86\ \xc4\xa0\x92\xb5\x88\x20\x9c\x56\xa3\x4a\x7a\xff\xfa\x6e\x18\x0d\ \xef\xe5\x0d\x26\xe7\xc7\xd0\x37\x57\x39\x6a\xb0\x30\xa2\x9f\xc5\ \xa8\xcf\x09\xf2\xd2\x46\x6a\xf0\xb6\xdd\x83\x71\x2e\x07\x50\xdf\ \x8d\x58\xf9\xb6\xca\x77\x78\xc5\x90\xd3\xab\xec\xfd\x3d\x6b\xda\ \x80\x7d\x0a\x66\xd9\x8c\x18\xf3\xef\x38\xa6\x37\x88\xad\x92\x88\ \x6d\x77\x73\x61\x5c\xef\xec\x6e\x6d\x75\xeb\x11\xfa\x39\xa8\x9f\ \x4f\x56\x81\xc2\x5b\x63\x49\x75\xf1\x00\x2d\xed\xde\xa8\xf8\x88\ \x91\x02\xc3\xbd\x90\x16\x1e\x3b\x12\xbe\x60\x3d\x3a\xcc\x3e\xd1\ \x5e\xf4\x19\xe7\xd8\x84\x43\xd3\x92\x99\x78\x02\xe9\xa9\x9a\xd9\ \x37\x0e\x50\x27\xec\x04\xd2\x17\xda\xf5\xc2\x55\xae\x1f\x80\x91\ \x4a\xeb\x7c\x92\x18\xfb\x4c\x76\x71\x3c\x46\x29\x74\x1f\xfb\x4d\ \xbe\xa1\xe6\xfc\xda\xfb\xc4\xfc\xa5\xc4\xbe\x6f\xaf\x81\xd3\xd5\ \xe7\x1d\x6d\x30\x8e\xef\x26\x42\xdf\x36\x37\xae\x03\x05\xf6\x89\ \x4e\xf7\x28\x73\x36\xb7\x82\xb7\xfd\x3c\x2b\x80\x9c\xc3\x18\x5f\ \x27\x95\x88\x71\x96\x89\x65\x2d\x6f\x20\x86\xf9\x23\x2b\x5c\x87\ \x66\xd4\x9f\x98\xd8\x47\xd8\x76\x96\x4f\x21\xe3\x71\xa3\xce\xf7\ \x17\xc8\xf7\x68\x31\x91\xf7\x09\xff\xa2\x99\x73\x1e\x8e\x63\x32\ \x31\x8e\x2f\x29\x9d\xeb\x50\x3d\xd2\x25\x74\xd7\x70\x00\x8c\xc4\ \x01\x2c\x64\x12\x1d\x2f\xdc\x40\xfa\x19\xa1\x83\xf0\xa4\x59\x4e\ \x47\x66\xe5\x26\x68\x13\xfc\x0c\x69\xad\x02\x59\x64\x98\xc8\x3c\ \xd7\x29\xf6\x49\x38\x61\x9c\x4c\x0a\x3e\x53\x66\x46\x21\x68\x63\ \xa3\xee\xcf\x0a\x8b\x68\x59\x5f\xe3\x18\x87\x70\xe6\xf9\x11\x22\ \x34\xc6\x87\x16\xaf\xf4\xd1\xfd\x4c\x72\x02\xdb\x4e\xd3\x26\x3f\ \xca\x37\x1d\xf6\x3c\xfa\x12\xad\x92\xdc\x8c\xb1\x02\xe9\x10\x33\ \x09\x0e\xb1\x97\xf2\x53\xee\xf6\xf2\xee\x4f\xe3\x5e\xbe\x06\x1f\ \x18\x44\xe8\xde\x44\xf4\x26\x11\x00\x4c\x47\xdd\xf3\x4c\x8a\x9a\ \x8f\xc0\x66\x05\xf2\xf8\x19\x19\xc7\x2a\x4b\xb0\xed\x77\x18\x6b\ \x7d\x09\xc7\x3a\x8f\x18\xeb\x57\xa8\x1b\x6e\xb4\xe9\x2b\x9d\x34\ \x07\xc0\x0e\x1c\xe8\x2d\x84\x6e\x11\x36\xbe\x8f\xd0\xfd\x86\xed\ \x52\x89\x81\xde\xa8\x9c\x0f\xa4\xd6\x31\x84\xbd\x14\xc5\xe3\x89\ \x7a\x82\xe6\xd4\x76\x11\x21\xf1\x29\xc9\x52\x89\x28\xe6\x39\x49\ \xb0\x94\xc8\x0e\x13\x13\x8f\xd2\xcc\xf4\x0a\x62\x40\xf9\xb8\x22\ \xc9\xc4\x0a\x4b\x07\xd6\x92\x18\xe8\x38\x6a\x30\x51\x01\x88\x8c\ \xdd\x77\x90\x45\x51\xc9\x10\x21\x84\x32\x9c\xa0\xb8\x42\x12\x25\ \xdb\xf4\xec\x79\x39\x45\x62\x3c\x00\xa8\xbc\x3f\x4c\x70\xae\x27\ \xd2\x5b\xaf\x1d\x4d\x43\x65\x6c\x7e\xac\x82\x4e\x38\x3e\x88\xcb\ \x22\x6b\x63\xac\xe0\x39\x6c\x3b\x87\xd1\xaf\x40\xfd\xfd\x06\x5f\ \x68\xa1\x56\x3a\x39\xf9\x44\xa3\xcd\x4f\xb8\x90\xe9\x66\x9e\xde\ \x54\x4d\x84\x88\xc3\x18\xb2\xc4\x6a\x5c\x6b\xdc\x6f\xa9\x59\x0e\ \xc5\x1c\xe7\x71\x9e\x17\x89\x8d\x83\xab\xd2\x80\xf0\x2d\x37\xa8\ \x8c\x90\xce\x48\x5f\xa1\xe8\x2f\x5a\x4f\x19\x5a\x47\x5b\xa3\xcd\ \x2c\x32\x7d\x87\x50\x76\x96\x66\x01\x4d\xd9\x7d\x6e\x64\x87\x58\ \x37\x90\x00\x34\x64\x1d\xa4\x65\x3d\xc3\x94\xaf\x4a\x29\x60\x35\ \x33\xdf\x4d\x4d\x04\xf5\xf7\x63\xdf\x8b\xd9\x2d\x6b\xf8\x25\x8d\ \x11\xe6\x50\xb5\x3f\x07\x5f\x76\x01\xd1\xe1\xf7\x08\x40\x5f\xa2\ \xfc\x2d\x01\x68\xe6\x53\x34\x59\xcc\x98\xf1\x52\xbf\xd8\xac\x8e\ \xc2\x6c\xfb\x36\x42\x97\x24\xb3\x40\x1f\x4a\x3f\xc4\xb8\x3f\x88\ \xcc\x74\x23\x9c\xa0\x41\x23\x23\xf6\x32\xb0\x39\x42\x57\xc2\xd6\ \x0e\xbc\xd3\x62\xaf\x50\x4a\x99\x31\x98\xaf\x2c\xa7\x31\xe1\x2e\ \xdb\x27\x37\xb9\x58\xed\x75\x23\x8f\xc0\x03\x55\xa1\x1b\x6f\xdc\ \xbf\x59\x96\xd9\x29\xb4\x77\x72\x54\x51\x90\x23\x6c\x38\x83\x68\ \x37\x1f\x07\xf9\x08\xe3\xe8\xe4\x51\xf9\x45\x44\xdb\x07\x51\xf7\ \x39\x63\x01\xc3\x51\x3f\x9b\x39\x10\x91\xd6\xd7\x84\x74\xa0\x06\ \x8f\xc0\x5c\xc4\xc1\x6f\x16\xea\x99\x2f\x2b\x44\x65\x86\x8f\xb9\ \x95\x98\x4c\x4e\xab\x0a\xcf\x64\x26\x21\xe9\x6d\x77\x9f\x7e\x37\ \x32\x14\x3a\x55\x9e\x10\x31\xa1\x52\x82\xdb\x86\xd9\x7a\xb3\x09\ \xa6\xe9\x81\x66\xf2\x12\x3c\xa6\x22\xab\xa8\x58\x06\x93\xd9\x5e\ \x6b\x03\x80\x1e\x8a\x7f\x53\x54\x58\x56\x64\x6c\xfb\x2e\x42\x17\ \x8e\x22\x44\xb1\x42\x23\x2f\xfb\xa9\x13\x29\xb8\xff\x07\x5a\x6d\ \x17\xe3\xfe\x40\x6c\xf7\x35\x19\x5e\x43\xa1\xb7\x2a\x54\x93\xb5\ \x42\x68\x0e\xb3\x92\x3f\xe0\xcb\x06\x13\x07\x17\xd2\x14\xcf\x25\ \xf6\x71\x2e\xb6\x7b\x82\x89\x04\x7b\x59\x02\xa6\xfb\x26\xe2\x08\ \xdc\xcd\x3f\x3c\x7d\x88\x49\x8a\xd6\x06\x67\x5f\xb6\x7d\x2f\x36\ \x5a\xc1\x00\xf0\x3a\xae\x64\x2e\xa1\xdb\x48\x31\x45\x04\x76\x22\ \x02\x30\x91\xe9\xf7\x17\xd4\xf7\x62\xf4\xdb\x59\xdf\x24\xab\xbe\ \x66\x74\x02\x3a\x8f\x73\xf9\x25\x16\x00\xda\x2b\x7e\x4d\x54\x67\ \xa0\xd3\x5b\x65\xd6\x47\x0c\x64\x2e\x77\x3e\xe0\x66\x80\x0c\x70\ \x11\x21\xcb\x60\x74\x89\x59\xf9\x5d\xba\x66\xe5\x0f\xc9\x1d\x36\ \xa9\xe4\xe3\xa1\x2f\x38\x23\xc6\xce\x79\x5b\xfc\x5b\x97\xa9\xc3\ \x5f\x5f\x27\x74\x4f\x8f\x99\x31\x5d\xbf\x3f\x6c\xec\xdc\xc9\xe2\ \xfe\xb4\x61\x93\xb6\x9a\x6d\x74\x49\x9c\x52\xd8\xcf\xf4\xd8\xe5\ \x3e\x15\xa1\x78\x99\xd8\x10\xe0\x8d\xf6\x89\x12\xf7\x71\xa5\x2a\ \xd4\xe7\x50\xa1\xae\x6b\x56\xc1\x14\x10\xa7\x86\xa5\xd8\x1c\xcc\ \x2a\x2a\x95\x44\xb6\x78\x36\xc7\xfa\xf0\xb3\x15\x71\xff\x47\x62\ \x82\xf2\x4b\x92\x6f\x7c\x8f\xd7\x8c\x90\x55\x3b\x00\x84\xa9\xe2\ \x7c\x26\xa6\x4b\xb2\x74\x9e\x31\x89\x0e\x92\xf0\x10\xd6\xd1\x4d\ \x7e\xf9\xc1\x84\xba\xa1\xa8\x5f\x50\xfb\x00\x84\xeb\x82\x15\xfc\ \x00\xd6\x05\x0f\x50\x6c\xd1\xb0\x8e\x46\x46\xd2\x73\xb5\xac\xf0\ \x30\x16\x90\x29\xbf\x35\xaa\x0b\x5b\xa0\x81\x2a\x8c\xd0\x49\x51\ \x19\x86\xa4\x2b\x89\xba\x40\x39\x43\x4a\x5a\xab\x58\x4e\xf1\x84\ \x30\xd9\x29\xa8\x2a\x00\xdd\xdf\x29\xac\x1a\x00\x6a\xc5\x6c\x3b\ \x8d\x59\xad\xbf\xb8\xe2\xa7\xf6\xe9\x5a\x92\xd1\xdf\xf9\xca\x3a\ \x88\x92\xb4\x96\xf6\xfe\x51\x15\x00\xb2\x57\x6f\x75\x56\x6e\xdc\ \xe5\x24\x4d\x2d\xac\x1a\x00\x51\x4a\x55\x25\x18\x93\x13\x08\xdd\ \x12\xea\xa4\x16\xab\xc6\x7c\xd1\x24\x5c\xcf\xdf\x53\x59\x00\x72\ \x60\xf2\xf2\xb7\x76\x73\x59\x2c\x20\xc4\x0c\xc0\x16\xaa\x32\x64\ \x30\xbe\x31\xc4\x81\x0b\x99\xb4\x18\x15\x9c\x08\x0b\x09\x0a\x40\ \xb6\x36\x79\xf9\x8b\xc1\x12\x62\x06\x40\x1e\x42\xde\x48\x98\xf2\ \x8b\x64\x85\xc6\xa3\xbb\x7c\xad\x41\xaf\x45\x68\x09\x4a\x10\x00\ \xa8\xc9\xcb\xdf\xb7\xc1\x40\x88\x19\x00\x59\x8f\xef\xec\xc3\xf8\ \xde\x27\x74\xe5\x08\xc0\x25\xcc\xf7\x00\x1e\x00\x10\x4d\x82\x02\ \xa0\x4f\x7e\xed\x96\x32\xf5\xf7\xa2\xa2\x7f\x62\xb1\x84\x98\x01\ \xd8\xc0\x16\x3f\xc2\x25\xaa\x05\x84\xee\x6f\xaa\x82\xeb\xea\xc0\ \xec\xb5\x2d\xd2\x3c\x08\x00\xfa\xe4\xd7\x6c\x2e\x75\xec\xdc\x22\ \xf5\xef\x11\x0b\x37\x45\xf8\x84\x28\x20\xc4\x0c\x80\x2c\x55\x27\ \x12\x3e\xa0\x1f\x97\x4c\xa9\xaa\xb2\x6d\x77\x22\xbf\xf9\x09\x6f\ \x91\x56\xd1\x00\x30\x27\x9f\x9c\x5d\xe4\x4e\x50\x07\xc0\x74\x8c\ \x3e\x20\xc4\x0c\x80\x5f\x71\xa3\x37\xea\xf2\x08\x5d\x31\xf7\x51\ \x05\xea\xf7\x9b\xb5\x06\x0a\x80\xf1\x4b\xb6\xa8\x49\x7d\xb7\xa9\ \x54\x4d\x8a\x02\x40\x48\x6e\x5e\x18\x84\x05\xf9\x3b\xaa\x05\x80\ \x22\x9f\xaf\x47\xe4\x81\xc4\x4f\x84\xae\x80\x3b\x75\x42\x7d\x85\ \x03\x0b\x0a\x80\x5b\xb2\x0b\x9d\xd5\x30\x71\xb9\xf2\xf2\x3e\x07\ \x80\xb4\x84\xad\xa5\xfb\x9c\x01\x33\xd6\x57\x0b\x00\x05\x14\xd9\ \x31\xca\x5b\x85\x3e\x39\x7f\x2a\xd3\xef\x2e\xd3\x47\x70\x5b\x40\ \x9a\xbc\x7e\xcf\x0f\x00\x21\x76\x6e\x71\xb5\xf9\x00\xf9\xdf\x62\ \xda\xf9\x7c\x8b\xb3\x9e\x68\xf7\x23\x02\x60\x31\xfd\x6e\xc3\xb6\ \x1d\x2a\x43\x84\xa2\x01\x50\x7d\x51\xc0\x8b\xd9\xed\x98\x8f\x99\ \xda\xfa\xa4\xc4\x79\xb1\x56\x7d\xea\x24\x00\x51\x01\xf2\xea\xee\ \x2d\xd9\xd2\x15\xf3\x91\x92\xf6\x65\x59\xfc\x41\x0d\x80\xcf\xd6\ \xf9\x96\x3b\xe1\x89\x70\x82\x69\x69\x97\x1d\xaa\x00\x2c\x47\x00\ \xfa\x55\x25\x0c\x1e\xcc\x00\xc8\x33\xc0\x01\xcc\x01\x87\x2c\x7d\ \x5f\x78\xa8\x02\xb0\xd8\xe7\x63\x87\xfa\xb1\x52\xe1\x83\x11\x80\ \x0c\xf7\x83\x67\xea\xe0\xc4\xfb\x26\x48\x1e\xcd\x9f\x73\x48\x02\ \xe0\x0b\x8e\x7e\xc4\x9e\x9a\x7a\xd6\xff\x0f\x00\xcf\x07\x2c\x77\ \x4b\xf2\xda\x11\xfa\x7f\x05\xc0\xbf\xab\xc0\x61\xfa\xcb\x66\xbd\ \x2e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\xf5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x10\x4b\x00\x00\x10\x4b\ \x01\xe7\x8f\x45\x7b\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0c\x72\x49\x44\ \x41\x54\x78\x9c\xcd\x9b\x7f\x6c\x5b\xd7\x75\xc7\x3f\xe7\xbe\xc7\ \x27\x89\x92\x45\x52\x11\x29\x4b\x76\xd2\xba\xc9\xe2\xd6\x4a\xb3\ \x66\xd8\xfe\xe8\x86\x66\x0b\x5c\xd9\x45\x5b\x20\x69\xbb\x1f\x4d\ \x3a\x37\x59\x8a\xe6\xaf\x6c\xc9\xba\x06\xcb\xfe\x0b\xf6\x4f\xd1\ \xa4\x31\xd6\x16\xf9\x23\x08\x96\x26\xc5\x10\x17\x1d\xd0\x66\x43\ \xd3\xd6\x72\x5c\x03\x35\xd6\xfd\x93\xa1\x4d\x6b\xa7\x75\xd2\xda\ \x85\x6d\xc9\x12\x45\x91\xa2\x24\xca\x14\xc9\x77\xcf\xfe\x78\x94\ \xc4\x47\x52\x12\x29\x91\x49\xbe\x7f\x91\xe7\xde\x73\xde\x3d\xf7\ \xdd\x7b\xee\xb9\xe7\x9c\x27\x74\x19\x33\x27\x47\x52\x06\x7b\xa7\ \x18\x19\x47\xf5\xfd\x88\xdc\x8a\x92\x00\x89\x83\x0e\x04\xbd\x64\ \x19\x74\x01\x21\x87\x72\x01\xf8\x8d\x15\xce\xab\x95\xb3\x7b\x8f\ \xce\xa6\xbb\x39\x3e\xe9\x86\xd0\xcc\xab\x7b\xff\x44\xd5\xde\xab\ \xca\x84\xc0\xf8\x2e\x9e\xa3\x0a\xe7\x05\x26\xc1\x9e\x48\x1e\xc9\ \xbc\xd6\xc9\x71\x42\x07\x27\x60\xfe\x87\x43\x83\x36\xe2\x3e\x84\ \xea\x83\x20\x1f\xe8\x94\xdc\x3a\xbc\x81\xf0\x2d\x56\xec\xb3\xc9\ \xbb\x33\x4b\x9d\x10\xb8\xeb\x09\xc8\xff\x78\xff\x50\xc9\x94\x1e\ \x01\xf9\x7b\xd0\x44\x27\x06\xb5\x3d\x24\x87\xea\x37\x22\xe5\xd5\ \xaf\xc7\x3f\x99\xcf\xed\x4a\xd2\x4e\x19\x55\x91\xf9\x57\x53\xc7\ \x54\xf9\x1a\x90\xdc\xcd\x20\x76\x81\xac\x22\xff\x9a\xfc\xd9\xec\ \x37\xe5\x09\xec\x4e\x04\xec\x68\x02\xd2\x3f\x4e\xde\x62\x8c\xbc\ \xa8\xf0\xa7\x3b\xe1\xef\x02\xfe\xc7\x3a\xdc\x3f\x72\x38\xfd\xbb\ \x76\x19\xdb\x9e\x80\xcc\x64\xea\x53\x0a\xcf\x03\xf1\x4d\x85\x3a\ \xbd\x88\x17\xc7\xf4\xc4\x51\x5c\xfc\xc5\x37\xc1\x96\xda\x7d\x54\ \x7b\x10\x96\xb0\xf2\x50\xf2\xe8\xec\x77\xda\x63\x6b\x11\xfa\x04\ \x26\xf3\xe1\xe4\xd3\x88\x3c\xda\x5c\x92\x60\x22\x71\x24\xba\x17\ \x71\xfb\x6b\x18\x15\x3f\xff\x6b\xb4\xb2\xd2\xce\xb8\x76\x83\xe3\ \xc3\x3f\x4b\x3f\xd6\xea\x96\x68\x69\x02\xf4\xbb\xe3\x5e\x26\x3e\ \xf7\x02\x70\x6f\x53\x21\x5e\x02\xa7\x7f\x0c\x9c\xbe\x0d\x9e\x4a\ \x11\x2d\xe7\xd0\xd5\xdc\xdb\xa9\x7c\xf5\xe1\xbc\x34\x7c\x43\xfa\ \x01\xf9\x63\xca\xdb\x75\xdd\x76\x02\x02\xe5\x33\xdf\x07\xfd\x78\ \x23\x77\x04\xb3\xe7\x26\x8c\xb7\x66\xfc\x15\x2d\xe6\xb0\xc5\x99\ \xb7\x5f\xe9\x06\xc8\x2b\xc3\x43\xb3\x9f\xda\x6e\x12\xcc\x56\x8d\ \xaa\xc8\x5c\x6c\xee\xb9\x66\xca\x8b\x37\x88\x9b\xb8\x6d\x5d\x79\ \x5d\xcd\xe2\x67\xcf\xe1\x2f\x5f\x7c\x17\x28\x0f\xa0\x9f\xc8\x64\ \x53\x2f\xea\x13\x5b\xeb\xe8\x6e\xd5\x98\x99\x4c\x1e\x17\xe1\xf3\ \xf5\x74\xd3\x3b\x8c\x19\x78\x0f\x20\xa0\x65\xfc\xa5\xcb\x68\xa9\ \xc9\x71\x2c\x06\x13\x89\x41\x64\x00\x5d\x9d\x7f\x27\x26\xe6\xde\ \xcc\x87\x53\x53\x90\x7e\x6c\xb3\x0e\x9b\x6e\x81\xf4\x64\xf2\xaf\ \x04\xf9\x6e\x3d\xdd\x44\xf7\x62\xa2\xfb\x01\xd0\xca\x32\x7e\xfe\ \xb7\xa0\x95\xb0\x50\x37\x8a\xe9\xdb\x0b\x3d\x09\xa4\xfa\x08\x5b\ \xca\x61\x17\xdb\x3e\xa5\x3a\x04\xb9\x2f\x79\x64\xf6\x44\xd3\x96\ \x66\xc4\xd9\xd3\xa9\x9b\x8d\xcf\xff\x01\xb1\x5a\x7a\xf0\xe6\xdf\ \x0b\xac\x29\x74\x09\x6a\x8d\xad\x89\xe0\x0c\xbc\x07\xf1\x6a\x4e\ \x48\xb5\xd8\x72\x1e\x2d\x4c\xa3\xfe\xf5\xdd\xe9\xb1\x73\xe4\xad\ \x91\x3f\x1a\xf9\xe8\xec\xc5\xfa\x86\x86\x2d\xa0\x8a\xcc\x9f\xe2\ \xdb\x5a\xa7\xbc\x78\x83\xd5\x65\x0f\x76\x35\x87\x5d\xbe\x08\xe8\ \x7a\xbb\xe9\x4d\x06\x2b\xc3\x38\x01\xa1\x52\xc0\x5f\x99\x81\xf2\ \x02\xaa\xca\x3b\x8c\x98\x51\x7d\x41\x95\x3f\x17\x21\x34\x98\x06\ \x03\x91\x39\x35\xf2\x85\x06\x0f\x4f\x22\x38\x03\x37\x03\x82\x56\ \x96\xb1\x4b\x17\x83\x7b\x5a\xd0\x88\x19\xb8\x31\x98\x1c\xe3\xa0\ \xfe\x2a\x36\xff\x16\x95\x85\x5f\xa3\xa5\xdc\xbb\x41\xf9\x00\xca\ \x47\xe6\x27\x93\x0d\xf6\x2c\xb4\x05\xaa\x17\x9b\x0b\xc0\x70\x2d\ \xdd\x0c\xde\x1c\x58\x7b\x5b\xa2\x92\x7b\xa3\x66\xcf\x0b\x66\xcf\ \x01\x4c\xcf\x10\x00\xb6\x98\xc1\x16\x2e\x83\x36\xf1\x41\xdc\x3e\ \x04\x45\x2b\xc5\x0e\x69\xb4\x23\xa4\xdd\x48\xe9\x60\xe2\xae\x85\ \x85\x35\x42\x68\x05\x94\x4c\xe9\x51\xea\x94\x17\x2f\xb1\x7e\xd4\ \xf9\xcb\x97\x43\x06\xcf\x0c\xec\xdf\x50\xbe\x30\x85\x5d\xfe\x7d\ \x48\x79\x31\x2e\x26\x3a\x86\x3b\x74\x3b\x6e\x7c\x1c\x13\x1b\x47\ \x64\xcb\x83\xa7\xdb\x48\x55\xca\xde\x3f\xd4\x12\xd6\x57\xc0\xfc\ \x0f\x87\x06\xad\x1b\xf9\x7d\xe8\x4a\x2b\x82\x1b\x3f\x04\x4e\x5f\ \x70\xce\x2f\x6d\xd8\x10\xd3\x9b\xdc\xb0\x09\x85\x29\xec\xf5\x6b\ \x21\xb1\xa6\x37\x89\xe9\xdf\x0f\xb2\x31\xc7\x5a\x5e\x0a\xee\x05\ \xef\xec\xb6\xc8\x72\xdd\xbe\x77\x2d\x9e\xb0\xfe\x3a\xaa\xc1\x8c\ \xd0\x7d\xde\x44\xe2\x55\xf7\x56\xb1\x2b\x53\xb5\x0d\xeb\x47\xa1\ \x2d\x66\xc2\xca\x8b\x83\xb3\xe7\x66\xc4\x1b\xac\x0a\x2e\x61\x8b\ \x69\x6c\x31\xdb\xfd\x0b\x51\x6b\x18\xa2\xcf\x7c\x11\x38\x0e\x35\ \x5b\x40\x95\xfb\xeb\x7b\x4a\x74\x34\x68\x2b\xe6\x50\x7f\x75\x9d\ \xee\xd4\x1a\xbc\xc2\xe5\x1a\x06\x07\x27\x76\xb0\xaa\xbc\x62\xaf\ \x5f\xa3\x92\x3d\x87\x5d\x99\x79\xb7\x28\xbf\x86\x2f\xac\xfd\x30\ \x10\xc4\xf0\x04\x6e\xab\xed\x21\x6e\x2f\xe2\x46\x01\xb0\xc5\x99\ \x1a\x7a\x74\xfd\x9c\xd7\xe5\x5a\x83\x27\xc1\x9b\x77\xa3\xa0\x16\ \x7f\xf1\x77\xd8\xc2\x14\xec\x2c\x4e\xd1\x6d\x1c\x4a\x9f\x4a\xde\ \x01\xd5\x2d\xa0\x6a\x1b\x6f\x79\x91\xea\x6e\xf0\x8b\x21\x17\xd6\ \xf4\xed\x0d\x7e\x54\x0a\xd8\x72\xbe\x86\x9e\x0a\xde\xbc\x2a\xfe\ \xd2\x25\xb4\xb4\x40\x03\xc4\xc3\x26\x8e\xa2\xb1\xc3\x68\xf4\x36\ \xf0\xaa\x81\xa4\x52\x1a\x59\x39\x87\xe4\x7f\x82\xc9\x9d\x04\xed\ \xfe\x6a\x11\x2b\xf7\x01\x3f\x0f\x6c\x80\x72\xa4\xbe\x83\xd3\x13\ \xf8\x41\x21\x1f\x5f\x0c\xf4\x54\x4f\x84\x95\x9a\x55\x61\x5c\x4c\ \x74\x5f\xd0\xbf\x38\xd3\xf4\x5e\xa0\x89\x8f\x63\xf7\x7d\x19\xf5\ \x46\x1b\x47\xd3\xb3\x1f\xed\xd9\x8f\x26\x3e\x86\x8e\x3d\x8a\x99\ \xfa\x1a\x92\xfb\xd1\x8e\x95\x6b\x09\xc2\x47\x01\xdc\x99\x93\x23\ \x29\xd0\x43\x8d\x1d\x1c\x40\x03\xe3\x55\x85\xf1\x62\x81\x6f\xaf\ \x36\xf4\x86\xa5\x37\x15\x4c\x8e\x2d\xe1\x17\xae\x35\xc8\xf1\xf7\ \x3f\x8e\x26\xff\xb6\xa5\x71\xa9\x37\x86\x7f\xe0\x38\xa6\xff\x43\ \x98\xa9\x27\x41\xfd\x1d\x68\xd7\x12\x6e\x9f\x3e\x33\x36\xec\x1a\ \xec\x9d\x20\x0d\x77\x82\x4a\xfe\xad\xc0\xad\xad\xf5\xdf\x23\x41\ \x1e\xc3\x96\xf2\x84\xdd\xe0\xc0\x75\xb0\xc5\x34\xf5\x7b\xbe\x1d\ \xe5\x6b\x61\x53\x81\xd3\x66\xae\x7e\xa5\x6d\xde\x16\x61\xbc\x4a\ \xe5\x4e\x37\xc8\xd8\x34\x1b\x41\xa9\xc1\x7e\x69\x71\x1e\x2b\x11\ \xec\xca\xf4\x06\xd1\xed\x03\xe3\x05\x2c\x35\xab\x05\x40\x13\x9f\ \x68\xaa\xbc\xc0\x82\xc2\xcb\x2a\xbc\x0e\x20\xca\x87\x80\x7b\xa8\ \xbb\x7f\xd8\xd4\xe7\x91\xc2\x2f\xba\xb6\x1d\x54\x19\x77\x51\x0e\ \xb6\xcc\x50\x59\x41\x97\xea\x2e\x54\x1a\x48\xd2\xca\x52\xf8\xa8\ \x13\x0f\xbb\xef\x4b\x8d\x32\x84\x13\x15\xd7\x7d\xf8\xc6\x58\x2c\ \x34\x5b\x57\xf2\xf9\x21\xb7\x52\x79\x06\xe5\xb3\xb5\x74\x7f\xec\ \x9f\x70\x17\x4e\x77\xc7\x30\x0a\x07\x5d\x90\x5b\x69\xba\x04\x5a\ \x84\x7f\x9d\x4a\xf6\xf5\x86\xbd\x6a\x13\x47\x51\x6f\x2c\x44\x53\ \xe1\xc4\xe8\xd0\xd0\xe7\x44\xa4\xe1\x81\x37\xc6\x62\x59\x55\xbd\ \x6f\x26\x9b\x25\x34\x09\x3d\xfb\xd0\xf8\x04\x92\x7b\x65\xe7\x63\ \xdc\x0c\xaa\xb7\x1a\xd0\xe1\xed\x7b\x6e\x27\xa8\x42\xfd\x24\x6a\ \xec\x70\xe8\xbf\xc0\x82\xef\xba\x0f\x37\x53\x7e\xbd\x8f\x88\xfa\ \x91\xc8\xc3\x40\xbe\x96\x6e\xe3\x87\x37\xe1\xd8\x2d\x64\xd8\x28\ \x0c\x74\x43\xb4\x46\xc7\xc3\xff\xe1\xe5\xfa\x65\xdf\x0c\xfb\x07\ \x07\xe7\x41\xfe\x2b\xc4\xdb\x7f\xdb\x66\xdd\x77\x8b\x3d\x46\x60\ \x4f\xe7\xe5\x0a\x78\xa9\x10\x45\x85\x5f\xb6\xca\xad\xa2\xaf\x87\ \x08\x91\x11\xba\x94\xc8\xde\xb3\x65\xc4\x74\xe7\x50\x9a\xd8\x95\ \x96\x35\x10\x5b\x1f\xa8\x69\x2a\xaf\x23\x30\x0a\x1d\x49\x33\x37\ \xa0\x34\x17\xfa\x2b\xca\xed\x2d\xf3\x8a\x84\xfb\x96\xbb\x56\x23\ \xb1\x64\x04\x96\xbb\x21\x59\x56\xce\xd5\x93\xee\xb9\x92\xcf\x0f\ \x6d\xc7\x37\xbd\xb8\x38\x0c\x7a\x77\x48\xd6\x72\x83\xac\x4e\x61\ \xc9\x80\x64\xba\x21\x59\xf2\x3f\xa9\x27\xc5\xdc\x4a\xe5\x19\x55\ \xdd\x74\x2b\xa8\xaa\xc8\x6a\xf9\x19\x60\xb0\x96\x6e\xf2\xa7\xc3\ \xb2\x45\x3a\x14\x59\xd2\x8c\x01\x7d\xb3\x03\x92\x1a\x60\x72\x27\ \x61\x75\x2a\x4c\x54\x3e\x3b\x93\xc9\x9e\xb8\xba\xb8\x78\x43\x7d\ \xff\xe9\xc5\xc5\xe1\x99\x4c\xf6\x3b\x08\x7f\x1d\x6a\x58\xbd\x0a\ \xf9\xc9\xb0\xec\xd8\x41\x9c\xa1\x3f\x44\xdc\xde\xdd\x0d\x52\xe4\ \x4d\x17\xe1\x42\x57\xec\x8b\x96\x70\xa6\x9f\xc6\x3f\x70\xbc\xee\ \xa1\xfc\x8d\x53\x2a\x7f\xec\x5a\x26\xfb\xdf\x2a\xfa\x73\x00\x51\ \xb9\x83\x52\xf9\x6e\x24\xfc\xe6\x01\x9c\xa9\xa7\x10\xbb\x91\xde\ \x13\xc7\x43\xdc\xe0\xe4\xae\x1d\xb6\xb8\x51\x4c\x74\x0c\xbb\x72\ \x0d\xad\x14\x5a\x1c\x23\x17\x5c\x0b\xe7\xba\x74\x14\x20\xb9\x1f\ \x21\xfd\x77\xa0\xa9\x63\xf5\x4d\x31\xd0\x63\xa2\x1c\x5b\x1b\x49\ \x33\x98\xf4\xb7\x90\x85\xf0\xdb\xa7\x27\x58\x3c\xea\x97\xa0\x26\ \xc2\x2c\xd1\x51\xc4\x8b\x23\x7e\x29\x34\x01\xe2\x46\x51\x5b\x69\ \x1a\x91\x12\x38\x67\xd4\xca\xd9\x4d\x47\xd0\x01\x38\x53\x5f\xc5\ \xa4\xbf\xdd\x36\x9f\x99\x7d\x01\x33\xf5\x74\x98\x28\x06\xa7\x37\ \xf0\x2f\x74\x75\xc3\x74\x89\x08\xc6\x0d\x16\x8f\x56\x16\x37\xe8\ \x6e\x3f\x4e\xfc\x10\x6e\xec\x0f\x9a\x3d\xc2\x96\x22\xee\x59\xb3\ \xf7\xe8\x6c\x5a\xe1\x7c\xdb\x23\x6c\x15\xea\x63\xae\x7e\x05\xe7\ \xd2\x97\x1a\x6d\x42\x33\xac\x5e\xc5\xb9\xf8\x08\x66\xea\xab\x0d\ \xf7\x0b\x13\xdd\x07\x26\x12\xa4\xdb\xae\x6f\x1c\x8d\xe2\xc5\xab\ \x19\x29\x8b\x96\x6a\x26\xa0\xa7\x1a\xba\xb3\x4d\x63\x0a\xaf\x8f\ \xdd\x35\x9d\x71\x01\x44\x38\x85\xd2\x35\x7f\x13\x82\xed\xe0\x2e\ \x9c\x46\xe3\x13\xd8\xf8\xe1\xc0\xbd\x8d\x8c\x04\x8d\xe5\x19\xa4\ \x70\x1e\xb3\x70\x1a\xf2\x93\xa1\x3d\xbf\x06\xe3\x25\x30\xd5\xb7\ \xef\x17\xae\x86\xf2\x13\xd2\x1b\x84\xe9\x74\x35\x17\xce\x4b\x54\ \xc3\x7a\xcd\xc3\x73\xbc\x0a\x6b\x61\x71\xb5\x2f\x81\xf9\xc7\x0e\ \xe8\xb9\x35\xb4\x84\xe4\x5e\xc1\x69\xf3\x66\x67\xbc\x04\x66\xf0\ \x00\x20\x68\x29\x8f\xae\x6e\x38\x59\xe2\xc5\x90\x48\x50\x92\x63\ \x57\xea\x82\xb7\xd5\x53\xa2\x69\x88\x4e\xf5\x25\xa8\x46\x85\x93\ \x47\x32\xaf\x29\x74\xcd\xdb\xd8\x31\xc4\x60\xfa\x6f\xc4\xec\x79\ \x1f\x60\xd0\x4a\x21\x48\xce\xac\x25\x56\xc4\x09\x42\xf4\x04\x4a\ \xd6\x66\x9f\x6b\x83\xb7\xb5\x21\xfd\x2a\xde\x48\x1d\x99\xfb\x05\ \xd4\xe4\x05\x44\x78\xb1\x6b\x8a\xb4\x09\x71\x3c\xa4\x6f\x14\x37\ \xf1\x41\x4c\xdf\x08\x48\xf0\xe6\xfd\xfc\x9b\x21\xbb\xe0\x0c\xdc\ \x14\x44\xa3\xd4\xc7\x5f\xbe\xb2\xc1\x6f\x7a\x90\xf5\xe0\xed\xb5\ \x06\xf9\xc0\xbf\xaf\xfd\xd8\x38\x01\x57\xec\xb3\x20\xbb\xaa\xba\ \xdc\x2d\x44\x04\x27\xfe\x7e\x9c\xc4\xed\x38\xfd\x55\x83\x67\x7d\ \xfc\xe5\xcb\xf8\x4b\xbf\x0d\x29\x6f\xa2\xa3\x48\xf5\x48\xb4\x85\ \x2b\xa1\x63\x4e\x06\xf6\x01\x12\x84\xf4\x1b\xf7\x7f\x96\xeb\xf6\ \xb9\x75\x39\x6b\x3f\x82\x5c\x99\x7e\xb3\x3b\xaa\xb5\x06\xc5\x41\ \x9c\x20\x19\xa3\x7e\x09\xbb\x32\x4d\x25\xf7\x2b\xb4\x98\x0e\xe5\ \x13\x4d\x74\x74\x3d\x0c\x6f\x8b\xb3\xd8\x62\xcd\x91\xd8\x13\xc7\ \x78\xc1\x95\xc3\x5f\xb9\xda\xec\x31\xff\x56\x5b\x67\x1c\xf2\xcb\ \x17\x7e\x10\x4b\x94\xbd\x9e\x0b\xbc\x73\xa5\xaf\x88\xe9\x41\x8d\ \x84\x9c\x9c\x8d\x46\x07\x67\xe0\xa6\x8d\x37\x5f\xca\x62\x97\x2e\ \xad\x4f\x8e\x88\x8b\x93\x18\x07\x13\x09\xda\x16\x1b\x0a\x42\x66\ \x1d\x29\x1f\x1c\x9a\xc8\xad\x47\x9c\x42\x4e\x60\xfc\x93\xf9\x9c\ \xaa\x3e\xde\x59\x95\xda\x83\xda\xd5\xa6\xca\x8b\x17\xc7\x4d\x8c\ \x6f\x28\x5f\x9c\x0d\x29\x0f\x82\x19\xbc\xa5\xea\x27\x54\xd0\x1a\ \x9b\xb0\x2e\x03\x1e\xab\x55\xbe\x4a\xab\x1b\x80\x22\x99\x53\xa9\ \xb3\xc0\x9f\x75\x40\x9f\x5d\x42\x30\x3d\x71\xa4\x6f\x74\x3d\x4f\ \x89\xfa\xd8\xc2\x95\xd0\xb2\x47\xaa\x85\x1a\xde\x10\xa0\xf8\xf9\ \xb7\xd0\xf2\x62\xbd\xb0\x9f\x0e\x4f\xa4\xff\xa2\xbe\x44\xa6\xe1\ \x4e\x29\x82\xce\x9e\xe6\xfe\x66\x45\x52\x6f\x17\xc4\x8d\x22\x7d\ \xa3\x18\x2f\x16\xae\x2f\x28\xe5\xf0\x0b\x57\xc0\xaf\x31\x78\x22\ \x98\x81\x03\x48\x75\xdf\xdb\xe5\xcb\xcd\x94\x5f\xb0\x46\xfe\xae\ \x5e\x79\xd8\xaa\x4c\xee\x64\xf2\x2f\x45\xe4\x3f\x77\xa9\xcb\x8e\ \xb0\x5e\x92\x03\x28\x0a\xc5\x1c\xf6\xfa\xb5\x86\x2a\x33\x11\x17\ \x33\x78\x0b\xb2\x96\xb1\x5a\xb9\x1a\x72\x86\x36\xfa\xf1\x99\xe1\ \x89\xf4\xf7\x9a\x3d\x6b\xcb\x38\xdd\xdc\x64\xea\x69\xa0\x31\xbb\ \xd1\x65\x88\x1b\x45\x7a\x6f\x80\xd2\x72\x90\x81\x6e\x52\x73\x24\ \x5e\x1c\xa7\xff\x26\x70\x3c\x40\xb1\xcb\x97\xb1\xc5\xb9\x46\x61\ \xf0\x64\xf2\x48\xfa\x9f\x37\x7d\xd6\x56\x03\x09\x4a\xe6\x52\xcf\ \x2b\x3c\xd0\xa6\x0e\x5d\x83\x98\x1e\x64\x60\xdf\xfa\x51\xa7\x5a\ \xc1\x2e\x5e\x6c\xb6\xec\x83\xa2\xe9\xff\x4d\x1f\xdb\xaa\x72\x7c\ \xfb\x62\xe9\xd7\x88\x64\xb2\x23\x2f\x37\x2d\x96\x7e\x1b\xb1\x56\ \x7d\x1a\x78\x78\xd5\xea\xd3\xd5\x2c\x5a\xb8\x1c\xdc\xf7\x1b\x18\ \xf4\x07\xc3\x89\xb9\x4f\x6f\x57\x2c\xdd\x5a\xb9\xfc\x19\xdc\xf9\ \xca\xc8\xb3\xaa\xfa\x60\xfb\x43\xdf\x39\xc4\xed\x47\x7a\xe2\x88\ \x97\x40\x9c\x9a\xf0\x97\x5f\xc4\x2f\x4c\x35\xaf\x4f\x0e\xf0\x1f\ \xc3\x43\xe9\x07\x3b\x52\x2e\xbf\x06\x55\x24\x33\x99\x7a\x12\xe1\ \xcb\xad\xf2\xec\x06\x41\x30\x23\xfc\xf1\x99\x56\x0a\x81\x31\x2c\ \xe5\x37\xab\x34\x53\xe0\xa9\xe1\x89\xf4\xe3\xcd\x2c\x7e\xd3\xe7\ \xb4\x3b\xb0\xcc\xc9\xd4\x3d\x2a\xf2\x3c\x5d\xfe\x42\x4c\x8c\x8b\ \x33\x78\x10\xf0\xb1\xab\x0b\x68\x69\x01\xf5\xb7\x2c\xb2\x5c\x54\ \xd1\x2f\xa6\x26\xe6\x1a\x0a\xbc\xb7\x7c\xce\x4e\x06\x37\xfb\xea\ \xc8\xfb\x8c\xea\x0b\x28\x1f\xd9\x09\x7f\x17\xf0\x53\x5f\xe5\x81\ \xbd\x47\x67\x2f\xb5\xcb\xd8\x89\xcf\xe6\x9e\x02\x52\xdb\x32\x74\ \x07\x59\x54\xfe\x65\xf8\xc8\xec\x73\xad\x2e\xf9\x7a\xec\x3a\xe3\ \x98\x3b\x13\x8f\x57\xcb\x4f\x1f\x01\xb6\xcd\xfc\x74\x02\x0a\xf3\ \x02\x5f\x77\xa4\xfc\x8d\x7a\xdf\xbe\x5d\x74\x2c\xe5\x9a\x3e\x93\ \x1c\x90\xb2\x3c\x04\x3c\x48\xf0\xbd\x70\xc7\xa1\x70\x4e\x54\x9e\ \x57\xcf\x3e\x97\xba\x6b\xae\x23\x29\xbd\xae\xe4\x9c\xd3\xa7\x92\ \x77\x88\x95\xfb\x10\x26\x80\x0f\xb2\xcd\xb7\x49\x5b\xc0\x02\xbf\ \x44\x38\xa5\xaa\x2f\xad\x85\xb1\x3a\x89\xae\x4c\x40\x2d\xa6\xcf\ \x8c\x0d\x7b\x95\xca\x9d\xd6\xca\x21\x41\x3f\x80\xc8\xad\xa0\x43\ \x04\x1f\x5e\xae\x15\x67\x2c\x03\x0b\x20\x59\x44\x2f\xa8\x95\xdf\ \x18\xd1\xf3\xa5\x88\x7b\x76\xec\xae\xe9\xae\xe4\x2e\xd7\xf0\xff\ \x57\xbf\x2f\xc0\x48\x97\x25\x6a\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x01\x52\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x7b\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\x55\xaa\ \xaa\xff\xaa\x00\x66\x99\xcc\x80\x80\xbf\x74\x8b\xb9\x78\x87\xc3\ \x6d\x86\xc2\x75\x83\xc1\x71\x82\xbe\x72\x82\xc1\x73\x82\xbe\xec\ \xbc\x18\x71\x84\xbd\x72\x84\xbf\x73\x84\xbd\xea\xb9\x15\xec\xba\ \x17\x73\x83\xbf\x72\x84\xbe\x72\x84\xbf\x74\x82\xbf\xec\xb9\x15\ \x74\x83\xc0\xeb\xba\x16\xeb\xba\x16\x74\x83\xc0\x74\x83\xbf\x73\ \x82\xbf\xeb\xbb\x16\xeb\xba\x16\x73\x84\xc0\x73\x84\xbf\x73\x83\ \xbf\x73\x82\xc0\x73\x84\xbf\x73\x83\xc0\x73\x83\xbf\x72\x83\xc0\ \x73\x83\xbf\xa8\x99\x67\xeb\x00\x00\x00\x28\x74\x52\x4e\x53\x00\ \x01\x03\x03\x05\x08\x0b\x11\x15\x25\x2b\x31\x33\x35\x36\x38\x3e\ \x3e\x43\x50\x53\x57\x58\x5f\x61\x67\x68\x75\x77\x83\x8a\x8c\x9d\ \xba\xc7\xd5\xdf\xe5\xec\xf5\x82\x02\xba\x21\x00\x00\x00\x5e\x49\ \x44\x41\x54\x18\xd3\x8d\xce\xc7\x0a\x80\x40\x0c\x45\xd1\xd8\x7b\ \x6f\x63\xef\x9a\xff\xff\x42\x95\x20\x3a\x03\x82\x6f\x77\xcf\x26\ \x01\xf8\x9a\x2a\xb4\xb5\xa4\x5c\xdb\x2b\xb2\x77\xfb\x1b\x3e\x60\ \xd6\x4d\xbb\xe3\x09\x95\x42\x90\x21\x8d\x79\x25\x41\x7e\x03\xf4\ \x02\x48\x1d\x41\x72\x43\x11\x13\xc8\x8e\x1b\xce\x17\x44\xaf\xb3\ \xc6\x84\xfc\x1f\xa0\x8f\x02\x80\x36\x04\xf0\x73\x07\x93\xff\x0a\ \x3b\xee\xc8\x90\xaa\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x01\x16\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x54\x50\x4c\x54\x45\x00\x00\x00\x55\x55\x55\x49\x6d\ \x6d\x58\x6a\x7b\x53\x69\x78\x53\x67\x76\x53\x6a\x78\x54\x69\x78\ \x55\x68\x7a\x54\x6a\x79\x55\x6a\x78\x54\x6a\x79\x54\x6b\x79\x55\ \x6b\x79\x54\x6a\x79\x54\x6a\x79\x54\x6a\x79\x54\x6a\x79\x54\x6a\ \x79\x55\x6d\x7b\x63\x95\x96\x65\x99\x99\x68\xa5\xa0\x69\xa5\xa1\ \x6a\xa7\xa2\x6b\xa9\xa3\x74\xc3\xb5\x74\xc4\xb6\x0a\x84\x1a\xbb\ \x00\x00\x00\x12\x74\x52\x4e\x53\x00\x03\x07\x1d\x22\x34\x7b\xa1\ \xc1\xd7\xe5\xe7\xe7\xe8\xea\xef\xf3\xfe\x8a\xbc\x0e\x40\x00\x00\ \x00\x5f\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\x02\x98\x58\x90\x00\ \x48\x80\x9d\x8f\x07\x0e\xf8\x81\x7c\x56\x5e\x21\x04\xe0\x62\x60\ \x60\xe4\x04\xd2\xc2\x60\x9e\x30\x58\x80\x4d\x00\xc8\x14\x15\x03\ \x12\x92\x22\x20\x01\x66\x6e\xb0\xa4\x84\xb8\x90\x84\x18\x58\x0b\ \x87\x20\x44\xb3\x84\xb4\x98\x10\xaa\x80\x94\x38\x44\x00\xa6\x45\ \x0c\xa4\x0b\xab\xa1\x98\xd6\x62\x38\x0c\xd3\xe9\x98\x9e\x43\x01\ \x00\x32\x75\x0b\xbb\x28\xf3\x01\xf8\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x02\xa1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xcc\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xaa\xaa\ \xaa\xbf\xbf\xbf\xaa\xaa\xaa\x9f\x9f\x9f\x9d\x9d\x9d\xa4\xa4\xa4\ \x9f\x9f\x9f\x9e\x9e\x9e\xa2\xa2\xa2\x9f\x9f\x9f\x9e\x9e\x9e\xa2\ \xa2\xa2\xa0\xa0\xa0\xa2\xa2\xa2\x9f\x9f\x9f\xa2\xa2\xa2\x9f\x9f\ \x9f\xa0\xa0\xa0\x9f\x9f\x9f\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\ \x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\ \xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\ \xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\ \xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\ \xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\x83\x56\xd9\x14\x00\x00\x00\x43\x74\x52\x4e\x53\ \x00\x01\x03\x04\x06\x08\x0d\x0e\x10\x15\x16\x18\x1d\x21\x2b\x2c\ \x30\x37\x38\x3b\x3d\x45\x4b\x51\x5a\x5b\x61\x62\x6b\x6c\x71\x73\ \x85\x86\x87\x8e\x8f\x9a\x9b\xa1\xaa\xab\xae\xb1\xb9\xba\xbf\xcc\ \xcd\xd1\xd8\xda\xdc\xe2\xe5\xed\xee\xf0\xf4\xf5\xf6\xf9\xfa\xfb\ \xfc\xfd\xfe\xc1\x97\xa0\x13\x00\x00\x01\x41\x49\x44\x41\x54\x58\ \xc3\xed\x96\xd9\x5a\xc2\x30\x10\x85\x29\x56\x51\x5c\x50\xc1\xe2\ \xca\x5a\x51\x50\x16\x45\x05\x45\xd9\xf2\xfe\xef\x84\x30\x01\x25\ \x9d\x25\x55\xef\xcc\xb9\xe9\xf7\x65\xce\x49\x9b\x64\xfe\xb6\x89\ \x84\x93\x93\x93\xd3\x1f\xcb\xaf\xf6\xfb\x55\xff\x17\xde\x50\x7d\ \xaa\x91\xb4\xc9\x27\x1b\x73\x6f\x68\x8c\xf6\xe6\x83\xaa\xe6\xc9\ \x79\xaf\xb6\xb0\xf6\xd0\x09\x54\x45\x9e\xa0\xa2\xd0\x09\x42\x18\ \x56\x05\x29\x5f\xd0\x46\x73\x09\x7e\x13\xc6\xa7\x17\x7c\xfe\x6c\ \x02\xbe\xd6\xa6\x59\x49\xb5\xa1\x32\xce\x73\xf9\x60\x04\xae\x87\ \xed\x68\x6d\xe7\x11\x6a\xef\x39\x3a\x7f\xfc\x06\x9e\xa7\x5d\xac\ \xba\xf7\x0c\xd5\xd7\x43\x2a\x9f\xd1\x5b\xfd\xb2\xff\xb3\xba\x7c\ \x87\x23\xf6\x09\x6d\xd6\x18\x0c\xe9\x3d\x4a\x75\x6c\x76\x99\x3e\ \xa5\xd5\x39\x9f\xf3\xe7\x7c\xa9\xfb\xe4\x6e\xc3\x00\xa0\xae\x0b\ \x45\xa9\xd3\xca\xda\x78\xe3\x21\x00\x28\x55\x92\x59\xb9\xd6\xd6\ \x32\x02\x80\x31\x2d\x41\xeb\x6d\xf4\x61\xaf\x88\x85\x11\xef\x8b\ \x08\x16\xf4\xd6\xe2\x32\xb1\xe0\x00\xc0\xb5\xde\x32\x3c\x00\x72\ \xd3\x4a\x0d\x8e\xeb\x60\x95\x92\x01\xc0\x95\x1d\x40\xae\xdb\x85\ \xeb\x20\x1b\xf7\x3d\x7f\xf2\xa1\xbe\x69\x18\xc4\xff\x52\x9c\x4e\ \xbe\xf2\x12\x00\x3c\x16\x36\x00\xf0\x58\xac\x77\x75\x0c\x2d\xb1\ \xb0\x01\x80\xc3\xc2\x0e\x00\x02\x8b\x7b\x7b\x00\x70\x6d\xb5\xed\ \x01\xc0\x95\x4e\xbb\x5f\x1f\x27\xa7\xff\xa2\x19\xb4\x4e\x6c\xaa\ \x29\xc9\xb5\xda\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x01\xcb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x01\x92\x49\x44\x41\x54\x38\x8d\xbd\x91\xb1\x4b\x55\x61\ \x18\x87\x9f\xdf\x77\xef\xb5\xa8\x14\x2a\xcf\x51\x6a\x69\x48\x1a\ \x04\x07\x91\x48\x28\xa2\x90\x0e\x2d\x2d\x92\x63\xb4\x14\x2d\x05\ \x0a\x17\x6c\x35\x31\xb1\xa6\x36\x1b\xfa\x03\x72\x09\x8a\xe0\x5e\ \x49\xd4\x96\xa0\xa2\xa6\x82\x10\x82\x68\xf0\x74\x8c\x86\xb8\x10\ \x7a\xbf\xef\x6d\xd0\x13\x97\xec\xde\x70\xa8\xdf\xf8\xbc\xdf\xf7\ \xe3\xe5\x79\xe1\x5f\xe7\xea\xec\xab\x52\xab\xb9\x6b\x35\x2c\xdf\ \x5a\xea\x69\xcf\xbe\x7f\x18\x9b\x5c\x18\xde\x71\xc1\xe8\xc4\x42\ \x6f\xc0\x16\x31\x8e\x38\x73\x1d\x39\x5f\xab\x74\xdd\xb3\x87\xbd\ \x6d\x2d\x0b\x46\x27\x9f\x1d\x77\xd2\x12\xd8\xa1\x46\x9e\xce\xc7\ \xc3\x0e\xee\x67\xfb\xd7\xca\x39\x2b\x02\x5c\x9f\x5a\x8e\x76\xf9\ \x70\x19\xcc\x99\xb1\xcf\x4c\x63\x60\x7b\x1a\x3f\x67\xd5\xf8\x9a\ \xbc\x56\x7c\x81\x41\x61\x07\x57\x2b\x5d\x7b\xbb\x93\xb4\x56\x04\ \x28\x05\x7f\xd6\x60\x06\x00\x81\xb0\x6d\x5b\xc9\xb9\xd7\x46\xe8\ \x37\xe8\x2b\x04\x1e\x01\x67\x80\x27\x0e\xc0\x05\xd4\xcc\x45\x9e\ \xce\xa1\xd5\x97\x40\x8f\x8c\xb4\xcd\xf9\xcf\x38\x8e\x36\x75\xf0\ \xa7\x98\x21\x44\x40\x68\x5d\x25\x99\x6d\xae\xe9\x00\x4c\xfc\xf8\ \x5b\xc1\xd7\x6a\x74\x49\xa6\x8a\x41\x8c\x0f\x87\x25\xbf\xf2\xab\ \xe0\xd3\xb1\xec\xb1\x99\xeb\xc7\x6c\x00\x85\xd3\x98\xde\xfd\x5e\ \x10\xe0\x23\x86\x09\xbd\x0d\x8e\xf3\x3e\x14\x16\x61\xeb\x0a\x73\ \x23\x23\x1e\x78\x93\x3f\x1e\xbf\xfd\xfc\xe4\x46\xbd\xfe\x14\x38\ \x91\xb3\x38\xc9\x96\xbf\x54\xa3\x8b\x45\xdc\x8b\xba\x29\xea\x4e\ \xd2\x5a\x53\x07\xd3\x37\x4f\x7d\xd3\xee\xf5\x21\xc4\x7c\x23\x8f\ \xcf\x65\x73\x21\x70\x25\x3a\x90\xde\xc9\x59\x53\x89\x77\xcb\x49\ \xad\xbd\xce\x05\xa4\x07\x41\xf6\x3e\xe7\x9d\x49\x7a\x43\x03\x6c\ \xb4\x14\xf6\x5f\xf3\x13\x92\xba\x8e\xfc\x31\x60\xb5\xe7\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\xfe\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x11\x37\x00\x00\x11\x37\ \x01\xbf\x50\xdf\xb8\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x05\x7b\x49\x44\ \x41\x54\x78\x9c\xed\x9b\x5d\x6c\x14\x55\x18\x86\x9f\xef\xcc\xb6\ \x8d\x50\x90\x9f\xee\xf2\xa3\x34\xce\x0a\x41\xc3\x05\x0a\x5e\x20\ \x7a\x41\x34\x42\x2b\x17\x68\x0c\x46\x82\x18\xbb\x0a\x8a\x89\x1a\ \x6f\xd4\xc4\xc4\x34\xa8\x11\xbd\x32\x7a\x43\x0a\x14\x04\x15\x43\ \x23\x21\x41\xdb\xa2\x92\x90\x18\x22\x89\x42\xe2\x8d\x26\x40\xb6\ \x6a\xa1\xa5\xbb\x10\x81\x2a\xb6\xdd\xdd\xf3\x79\xb1\x6d\x69\xe9\ \x52\x96\xee\x4c\x67\x2b\x7d\x92\xdd\xcc\xcc\x9e\x79\xbf\xef\xbc\ \x73\x66\xe6\x9c\x39\xb3\xc2\xff\x8c\xb3\xeb\x96\x4f\xa4\x14\xd7\ \xc1\x71\xd5\xaa\x8b\xa8\x2b\x22\xae\x2a\x2e\xe0\x82\x9c\xb8\x38\ \x91\x07\xe6\x7d\xd2\xd4\x0d\x10\x0a\x38\xdf\x1b\x46\x37\x2c\x2e\ \x49\x74\x47\x2a\x71\xac\x6b\x30\xae\xaa\xba\x08\xae\xa0\xae\x22\ \x2e\x10\x41\x41\x51\x10\x00\x41\x75\x90\xc2\xe2\x5b\x3b\x33\x95\ \xc0\x49\x28\x52\x03\x2e\x6c\x5c\x39\x35\x95\x4a\x45\x55\x4d\x14\ \x24\xaa\xaa\x51\x03\x51\x85\x68\x32\x4d\xa5\x38\x1a\x02\x19\x50\ \x49\xd0\xbe\x85\x3c\x90\x92\x92\xfe\xc2\x81\x18\xd0\xba\x7a\xf5\ \x2d\xa5\x93\x2e\xcf\x82\x74\xd4\x60\xa2\x8a\x8d\x82\xf4\x7e\x74\ \x7e\x4f\x77\xa6\x1c\x4c\x6f\xe9\x6c\xd5\x74\x38\xc1\x02\xf0\xd5\ \x80\x8e\x9a\xe5\x4b\x45\xe4\x5e\xc5\xb8\xd2\xdb\x54\x41\x5d\xe8\ \x9c\x92\x2d\xd1\x7b\x14\xfb\x8f\x9e\x5f\xd5\xbc\x36\xbe\x19\x90\ \xad\xbc\x39\x02\xd9\x6a\x5e\x69\xa1\xf9\x37\xd5\xd1\xc0\x5c\xbf\ \xc8\xc8\x10\x9c\xd9\x7e\x69\x7b\x89\x6f\x06\x8c\x15\xc6\x0d\x08\ \x3a\x81\xa0\x19\x37\x20\xe8\x04\x82\x66\xdc\x80\xa0\x13\x08\x9a\ \xa2\x1c\x0b\x78\x44\x37\xf0\x3b\xd0\x22\xa2\x2d\xaa\x92\x02\x5e\ \xb9\xba\xd0\x58\x37\xe0\x2f\x90\x38\x68\x1c\x34\x2e\x98\xb8\xc5\ \xc6\x21\x14\x8f\x74\x4e\xf8\x43\x1a\x1a\x32\x7d\x05\x3b\x62\x2b\ \x16\x0a\x32\xe6\x0c\x18\x54\x41\x84\x76\x90\x36\x11\x1b\x4f\x99\ \xb2\xdf\x66\xd7\x1d\xb8\x5c\x68\x80\xa0\x0d\xe8\x06\xce\x08\xc4\ \x2d\xc4\x45\xb2\x95\x15\xb1\x71\xc7\xd8\x53\xd3\xea\xbe\xbf\xe8\ \x77\x02\xa3\x63\x80\xca\x77\x2a\xda\x22\xd0\x82\x4a\x8b\x31\xb6\ \x25\x65\x4d\xcb\xac\x1d\x4d\xc9\x51\x89\x3f\x0c\xa3\x62\x40\x78\ \x47\xd3\x0a\x09\x62\xac\x9b\x07\x37\xfd\x6d\x70\xdc\x80\xa0\x13\ \x08\x9a\x71\x03\x82\x4e\x20\x68\xc6\x0d\x08\x3a\x81\xa0\x19\x37\ \x20\xe8\x04\x82\x66\xdc\x80\xa0\x13\x08\x9a\x9b\xde\x80\xa0\x87\ \xc3\x05\x71\x61\xe3\xca\xa9\x5d\x29\x3b\xdf\x51\xc2\xa8\x0a\x98\ \xb6\x4c\x2a\xfd\xe7\xcc\xdd\xdf\x26\xf2\xd5\x18\x73\x06\x24\x5e\ \x5a\x56\x2e\x5d\x65\x2f\x58\xe4\xc9\x9e\xee\xcc\x62\x03\xce\x95\ \x61\xa6\xc5\x94\x18\x12\xb1\xaa\xe3\xa8\xec\x53\xa7\x67\xdb\x8c\ \x6d\x87\x3a\x86\xd3\x1b\x53\x06\x24\x63\xd5\xeb\x6d\x97\x6e\x06\ \xa6\x5d\x67\x8a\x75\x11\xa2\x8b\xc4\x96\xbc\xde\x11\xab\x7a\x37\ \x12\x4a\x7e\x94\x48\xe7\x2e\x38\x26\x0c\xd0\x0d\x8b\x4b\x12\xe9\ \xf0\xa7\x8a\xae\xb9\xc1\xb9\xe5\xc9\x02\x1f\x26\xd3\xe1\x87\x50\ \xfb\x0e\x32\x74\xef\xa2\xbf\x08\x6a\x6d\xad\x49\xa6\xc3\xbb\x04\ \xd6\x14\x20\x53\x05\xce\x9e\x5c\x3f\x14\xbd\x01\xc9\xd6\x1f\x5f\ \x06\x9e\x2a\x54\x47\x44\x2b\x73\x6d\x2f\x6a\x03\xda\x6b\xaa\xc3\ \xa8\x6c\xf2\x33\x46\x51\x1b\x10\x12\xd6\x02\x93\xfd\x8c\x51\xd4\ \x06\x28\xf6\x71\xbf\x63\x14\xb5\x01\x20\x73\xfd\x8e\x50\xd4\x06\ \x28\x54\xf8\xa1\x9b\xd1\x74\xaa\x6f\xb9\xa8\x0d\x10\xf0\x63\xe2\ \x44\x53\x17\x6f\x3d\xdb\xb7\x92\x77\x47\xa8\x7d\xfd\x8a\x05\xa1\ \x8c\x79\x44\x51\x57\x21\x2c\x68\x0a\x95\x33\x22\xd2\x22\x69\xa7\ \xb1\x62\xd7\xd7\x67\xbc\x4f\x95\x93\x08\xb7\x79\xac\x7a\x7a\x4e\ \x43\xc3\xbf\x7d\x2b\xc3\x1a\xa0\xab\x57\x97\x26\x27\x75\xae\x03\ \x79\x83\x8c\xce\xd3\xde\xc9\x1d\xe9\xfb\x96\xec\x3b\xb9\x1a\x4a\ \xdb\x44\xac\xea\x28\x96\xf7\x22\x3b\x9b\x1b\x3d\x4b\x55\x64\x1f\ \xe8\x32\xcf\xf4\x00\xd0\xaf\x06\xae\x5d\xd3\x80\x73\xcf\x2e\xbf\ \x2b\x69\x3a\xbf\x04\x16\xe6\x31\xab\x65\x80\xa5\x18\xbe\x49\x3c\ \x57\xd5\xa8\x92\x8a\x91\xb9\xde\x2e\xd7\x27\x1d\x0a\xed\x09\xa5\ \x7b\x36\x81\x4c\x29\x5c\x2d\x2b\xe9\xa8\xd9\x3a\x70\x43\xce\x6b\ \x40\x22\x56\xf5\xa0\x35\xe6\x27\x60\xe1\x0d\x87\x50\x1e\x15\x5b\ \xfa\x83\x8a\xba\x23\xcb\xf1\x0a\xb3\xeb\x0e\x9c\x53\x91\xb7\x0a\ \xd5\xe9\x43\xe1\xe3\xe9\x3b\x9a\x7e\x1d\xb8\x6d\x88\x01\xed\xeb\ \x57\x2c\x00\x3d\x00\x94\x17\x10\x6a\x9e\xc0\xe6\x91\xef\x7f\x85\ \xc8\x9c\x25\x5b\x44\xf8\xac\x60\x21\xe5\xf0\x65\xdb\x35\xc4\xcc\ \x41\x06\x68\x6d\xad\x71\x32\xb2\xd5\xa3\x26\xe7\xc9\x1d\x46\x6a\ \x6b\x6d\x85\x93\x8c\x09\xec\x1e\xb1\x06\x1c\x72\x7a\x64\x95\xbb\ \xf3\x70\xd7\xd5\xbf\x0d\x4a\x32\xd9\x7a\xf4\x09\xe0\xfe\x91\x06\ \xf2\x0b\xa9\x3b\x96\x0a\xd7\x37\x3f\x03\xd4\x00\x79\x3f\xed\x01\ \x3a\x11\x79\xb3\xa2\x72\xc9\xf2\xe9\x9f\x37\x5d\xca\x55\x60\x70\ \x0b\x50\x9e\x2e\x20\x4f\xdf\x89\xd4\x37\xef\x4c\x87\x4a\x5c\x94\ \x57\x81\x23\x40\xae\xc7\x1c\x0a\x1c\x17\xf4\xed\x32\xd1\x3b\x22\ \xdb\x9b\x3e\x90\xda\x5a\x7b\x2d\x4d\x19\xb0\x97\x24\x63\x55\x7f\ \x03\x13\x3c\xce\x3b\x1d\xae\x6f\x2e\xf5\xe3\x05\x89\xf3\x6b\xab\ \x27\xdb\x52\x3b\x57\x55\x66\x8a\x23\x4e\xc6\x4a\x22\x9d\xe9\x3e\ \x75\xfb\xae\x43\xe7\xf3\xd5\xe8\x37\xa0\xbd\xa6\x3a\xec\x88\xde\ \x48\xf3\xca\x97\x7f\x22\xf5\xcd\x05\x5c\x50\xfd\xa5\xff\x14\x28\ \x75\x28\xf3\x29\x46\x71\xfd\x43\xe2\x2a\xfa\x0d\x98\x76\xb1\xbc\ \x9d\xdc\xe7\x54\xa1\xb4\xfa\xa0\xe9\x19\xfd\x06\x64\x5f\x2a\x94\ \x5f\xbc\x0e\xa0\x2a\xc7\xbc\xd6\xf4\x92\x41\x77\x01\xc1\xe6\x7c\ \x70\x58\x50\x00\x63\xbf\xf0\x5a\xd3\x4b\x06\x19\x60\xba\xcd\x56\ \xa0\xcd\x3b\x79\x39\x56\x71\x69\x72\xb3\x77\x7a\xde\x33\xc8\x80\ \x6c\x67\x41\x5f\xc3\x83\x5b\x96\x42\x8f\x20\x2f\x0e\x7c\x5f\xb7\ \x18\x19\xd2\x5d\x8d\xd4\x1f\xdc\x8b\x52\xe8\x00\xc4\x0a\xba\x2e\ \x5c\xdf\xf8\x73\x81\x3a\xbe\x93\xb3\xbf\x1e\xd9\xd1\xfc\xbe\xa2\ \x1b\x81\x21\x7d\xe7\x3c\x38\x27\x22\x8f\x45\xea\x0f\xee\x2d\x2c\ \xb5\xd1\xe1\x9a\x03\x96\x19\xf5\x07\xb7\x64\x1c\xbd\x4f\xd0\xfd\ \xe4\x71\x4a\x28\xf4\x00\xdb\x4d\x3a\x74\x4f\x78\x7b\xd3\x01\x2f\ \x93\xf4\x93\xbc\x3a\x29\xe7\x9e\x5f\x79\xb7\xb5\x99\x55\x02\x0f\ \x2b\xdc\x09\xcc\x04\x32\x40\x1b\xc8\x09\xc4\x1e\x74\xc4\xec\x9f\ \xbe\xad\xe9\xb4\xaf\xd9\xfa\xc0\x7f\xf4\x3d\xd0\x9f\x72\x7e\x73\ \x34\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\x1a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\xeb\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\x00\xff\ \x80\x80\x80\xff\x80\xbf\xbf\x66\x99\xcc\x80\xaa\xd5\x80\xaa\xd5\ \x76\xb1\xd8\x80\xa4\xdb\x77\xaa\xdd\x80\xaf\xdf\x78\xa5\xe1\x80\ \xaa\xd5\x80\xa6\xd9\x80\xae\xdc\x60\xaa\xca\x45\xa7\x9d\x52\x9b\ \xa4\x50\x9f\xa7\x7c\xaa\xd8\x80\xad\xda\x7c\xa8\xdb\x4a\x9f\x9f\ \x45\x9a\x9f\x80\xaa\xda\x7d\xac\xdb\x61\x9e\xb8\x80\xac\xd8\x7d\ \xad\xd9\x80\xac\xd9\x7e\xaa\xd9\x80\xab\xda\x7e\xac\xda\x80\xaa\ \xdb\x4e\x9c\xa5\x7e\xab\xdb\x80\xac\xdb\x80\xab\xd9\x7e\xac\xda\ \x7e\xaa\xdb\x80\xab\xd9\x7e\xac\xd9\x44\x9c\x9c\x80\xac\xdb\x80\ \xab\xd9\x80\xaa\xda\x7e\xac\xdb\x80\xaa\xd9\x80\xab\xda\x80\xab\ \xda\x7e\xab\xda\x80\xaa\xdb\x7e\xab\xdb\x80\xab\xd9\x7f\xac\xd9\ \x80\xab\xda\x7f\xab\xda\x80\xac\xda\x7f\xab\xda\x42\x9b\x9d\x42\ \x9d\x9d\x7f\xac\xdb\x80\xab\xd9\x7f\xab\xda\x4e\x9d\xa7\x7f\xab\ \xda\x7f\xac\xda\x3e\x99\x94\x7f\xab\xdb\x7f\xab\xd9\x80\xab\xda\ \x7f\xac\xda\x80\xab\xda\x7f\xab\xda\x40\x9b\x98\x7f\xab\xda\x3d\ \x9a\x96\x80\xab\xda\x7f\xaa\xda\x41\x9a\x99\x3a\x99\x93\x7f\xaa\ \xda\x3a\x9a\x92\x80\xab\xda\x3b\x9a\x92\x80\xaa\xdb\x7f\xab\xd9\ \x3c\x9a\x95\x80\xaa\xda\x7f\xab\xdb\x80\xab\xda\x38\x99\x92\x80\ \xab\xda\x7f\xab\xda\x80\xaa\xda\x7f\xaa\xda\x80\xab\xda\x7f\xab\ \xda\x7f\xab\xda\x80\xab\xda\x80\xab\xd9\x33\x97\x8b\x33\x97\x8a\ \x80\xab\xda\x7f\xab\xda\x80\xab\xda\x7f\xab\xda\x80\xab\xda\x7f\ \xab\xda\x80\xab\xda\x7d\xaa\xd9\x7f\xab\xda\x80\xab\xda\x2d\x96\ \x86\x7f\xab\xda\x80\xab\xda\x2c\x95\x83\x2d\x96\x85\x27\x94\x80\ \x80\xab\xda\x26\x94\x7e\x7f\xab\xda\x22\x93\x7a\x22\x94\x7b\x21\ \x93\x7a\x24\x93\x7c\x7f\xab\xda\x20\x93\x77\x20\x93\x78\x21\x94\ \x79\x7e\xab\xda\x1a\x91\x72\x1a\x91\x73\x1b\x91\x73\x1b\x91\x74\ \x1c\x92\x73\x1c\x92\x74\x1c\x92\x75\x1d\x91\x75\x1d\x92\x76\x1e\ \x92\x76\x1e\x92\x77\x1f\x92\x77\x1f\x93\x77\x20\x92\x78\x20\x92\ \x79\x20\x93\x79\x21\x93\x79\x21\x93\x7a\x22\x93\x7a\x22\x93\x7b\ \x23\x94\x7c\x24\x93\x7c\x25\x94\x7d\x25\x94\x7e\x26\x94\x7e\x27\ \x94\x7f\x28\x95\x80\x28\x95\x81\x29\x94\x81\x2a\x95\x83\x2b\x95\ \x83\x2c\x96\x85\x2d\x96\x86\x2f\x96\x87\x31\x97\x8a\x32\x97\x8a\ \x33\x98\x8b\x33\x98\x8d\x37\x98\x90\x38\x99\x91\x39\x99\x92\x3a\ \x9a\x92\x3b\x9a\x94\x3b\x9a\x95\x3f\x9a\x98\x3f\x9b\x98\x3f\x9b\ \x99\x41\x9b\x9a\x42\x9b\x9a\x42\x9c\x9b\x43\x9b\x9b\x45\x9c\x9e\ \x46\x9c\x9f\x47\x9c\xa0\x47\x9d\xa1\x49\x9d\xa2\x4a\x9d\xa3\x4b\ \x9d\xa5\x4b\x9e\xa5\x4c\x9e\xa6\x4d\x9f\xa6\x4e\x9f\xa7\x4f\x9f\ \xa8\x4f\x9f\xa9\x51\xa0\xaa\x53\x9f\xac\x55\xa0\xae\x56\xa0\xaf\ \x56\xa1\xaf\x58\xa1\xb2\x5a\xa1\xb3\x5a\xa1\xb4\x5b\xa2\xb5\x5c\ \xa2\xb6\x5d\xa2\xb7\x5e\xa3\xb8\x5e\xa3\xb9\x5f\xa3\xb9\x60\xa3\ \xba\x61\xa3\xba\x61\xa3\xbb\x62\xa3\xbc\x62\xa4\xbc\x63\xa4\xbd\ \x64\xa4\xbe\x66\xa5\xc0\x67\xa5\xc2\x68\xa5\xc2\x69\xa5\xc2\x6b\ \xa5\xc5\x6c\xa6\xc6\x6d\xa6\xc7\x6e\xa6\xc8\x6e\xa7\xc8\x70\xa7\ \xca\x70\xa8\xcb\x71\xa7\xcb\x72\xa8\xcc\x72\xa8\xcd\x73\xa8\xcd\ \x75\xa9\xd0\x76\xa8\xd0\x76\xa9\xd0\x77\xa9\xd2\x78\xa9\xd2\x78\ \xa9\xd3\x79\xa9\xd3\x7a\xaa\xd4\x7b\xaa\xd6\x7c\xaa\xd6\x7c\xab\ \xd7\x7d\xaa\xd7\x7d\xaa\xd8\x7d\xaa\xd9\x7e\xab\xd8\x7e\xab\xd9\ \x7f\xab\xda\xab\x09\xb7\x16\x00\x00\x00\x84\x74\x52\x4e\x53\x00\ \x01\x02\x02\x04\x05\x06\x0c\x0d\x0e\x0f\x10\x11\x12\x14\x16\x18\ \x1a\x1c\x20\x21\x22\x23\x2d\x30\x30\x31\x32\x34\x35\x50\x51\x52\ \x53\x54\x55\x55\x56\x58\x59\x5d\x5e\x5f\x62\x62\x64\x66\x71\x72\ \x74\x7c\x7d\x7e\x7f\x80\x81\x82\x89\x8a\x8b\x8c\x8c\x8d\x8e\x8f\ \x9a\x9d\x9f\xa0\xa1\xa3\xa4\xa5\xa6\xa7\xb0\xb3\xb4\xb4\xb5\xb9\ \xc0\xc1\xc2\xc2\xc3\xc4\xc5\xc8\xca\xcb\xcc\xcd\xce\xcf\xd0\xd3\ \xd4\xd5\xdd\xde\xe0\xe2\xe3\xe8\xe9\xea\xeb\xec\xed\xee\xef\xef\ \xf0\xf1\xf1\xf2\xf5\xf6\xf8\xf8\xf9\xf9\xfc\xfc\xfd\xfd\xfd\xfe\ \xfe\xfe\xfe\xf9\x2b\xfc\x1e\x00\x00\x03\x5a\x49\x44\x41\x54\x18\ \x19\x95\xc1\x79\x60\xd6\x73\x1c\x07\xf0\xf7\xcf\xe3\xa9\x29\x96\ \x6b\xa3\x1c\x9b\xdc\xf7\xda\x72\xd4\xa8\x5c\xb5\xb9\x22\x89\x8a\ \xac\x4b\x32\xcf\x18\x52\xe6\x98\xec\xb3\xab\x03\x91\xa4\x14\xc2\ \xe4\x2c\xb9\x96\xbb\x4b\x48\xb3\x50\x52\xcc\xd5\x08\x43\x8d\xb6\ \xf7\x9f\x9e\x67\xbf\xe7\xf9\x3d\xdf\xdf\xf9\x7d\x7a\xbd\xe0\xe7\ \xe0\xb3\xae\x98\x30\xe9\xae\xa9\x55\x32\xf5\xee\x49\xd7\x5f\x7e\ \xf6\x41\xd8\x2d\x27\x5e\x33\x59\x1c\x26\x5f\x7d\x24\x52\xb4\xff\ \x25\x77\x8a\xa7\x3b\x2e\xda\x0f\x7a\x07\x5c\x79\x9f\xf8\xba\xff\ \xb2\x7d\x11\x6c\x8f\xf3\xef\x91\x40\xf7\x9e\x13\x42\x80\x43\x6e\ \x95\x40\x55\x2f\x6e\xd8\x35\x2c\x13\xbe\xb2\x6e\x9e\x2f\x01\xaa\ \xde\xf8\x8d\x51\xb7\x1f\x03\x6f\xa1\x01\xe4\x6a\xf1\x57\xf7\x3d\ \xe3\xfa\x85\xe0\xa1\x53\x21\xc9\xbf\x1f\x14\x3f\xf5\xed\xb4\x14\ \x84\xe1\xd2\x69\x30\x63\xde\x16\x6f\x35\x1f\x53\x75\x69\x18\x0e\ \xc6\x05\xec\xf0\x6b\xb5\x78\xa9\x5c\x4f\xbb\xc2\x10\xec\x06\x30\ \xee\x75\xf1\xb2\x92\x4e\xf9\xb0\x39\x8a\x09\xcd\x35\xe2\xb6\x8c\ \x6e\xc7\x42\x91\x59\x4a\xcb\x32\x49\xaa\x9c\xfb\x5a\x43\xc3\xd3\ \x22\x2d\x74\x2b\xcd\x80\xc5\xb8\x8a\x49\xdb\xa6\x49\x42\x43\x2b\ \xa3\x9a\x44\x76\xd0\xc3\x50\x03\x09\x27\x53\xf5\x81\xc4\x3d\x4a\ \xd3\x6c\xf9\x85\x5e\x4e\x40\xdc\x3e\xc5\x54\xb5\x2e\x12\x53\xed\ \x9f\xec\xf0\xf2\xd2\x36\x7a\x99\xd8\x15\xa6\x33\x69\xf7\xf3\x43\ \x62\x7a\xa1\xf9\x2f\x06\xe9\x8d\x0e\x7b\x95\xd0\x61\xf3\x4c\x89\ \x7b\xf5\xb3\x4d\xff\xd1\x57\x24\x0d\x31\xbd\xe8\xf2\xdd\x7c\xb1\ \x6c\xa5\xbf\x1c\xc4\x14\xd1\x6d\xe7\xaa\x67\x2a\xc5\xb4\x91\xfe\ \xc6\x20\xea\x30\x7a\x6b\xf9\xf6\x93\x37\xe7\x8a\xc8\x9c\xd5\x6d\ \xf4\xd5\x03\x40\x7f\xfa\x6b\x5b\x37\x5d\x44\x56\xd1\x57\x3e\x80\ \xd1\x0c\xf2\x96\x88\x3c\xdc\x42\x6e\xfb\xb4\x89\x1e\x46\x01\xdd\ \x2a\x18\x64\xb3\x44\x2d\xfc\x68\x69\xb5\xc8\xf3\x8d\xff\xd2\xa9\ \x22\x1d\x3d\x19\xe8\x0f\x51\x4c\x5b\xfc\x23\x1d\xb2\x71\x3a\x83\ \xcd\x13\xd5\x93\xff\xd0\x2e\x0f\x17\x32\xd8\xc6\x47\x44\xb5\x84\ \x76\x83\x30\x92\x1a\xeb\xc4\xe6\x2b\xda\x0c\xc7\x78\x6a\x6c\x15\ \x9b\x85\x3b\xa9\x1a\x87\x08\x35\x3e\x14\xbb\xe5\x54\x15\xa3\x8c\ \x1a\x8b\xc5\xae\xea\x1b\x2a\xa6\xa0\x8c\x1a\x4f\x88\xc3\xcc\xf5\ \x4c\x9a\x82\x08\x35\x16\x88\xcb\x1a\x5a\x8a\x31\x9e\x1a\x75\xe2\ \xb2\x80\x96\x71\x18\x49\x8d\x77\xc5\x65\x0e\x2d\xc3\x51\x48\x8d\ \x1f\xc4\xe5\x39\x5a\x06\xe2\x34\xea\xbc\x24\x4e\xef\xd0\x92\x8b\ \x23\xa8\xd3\x3c\x4b\x1c\xb6\xd0\x92\x85\x6e\x15\xd4\xf9\xb2\x46\ \x6c\x1e\x6f\x67\x42\x79\x3a\x50\x44\xad\xc6\x5a\x51\x2d\xa7\xe5\ \x5a\x00\xfd\xa9\xb7\x56\x14\x95\x3f\xd1\xd2\x17\xc0\xa1\xd4\xdb\ \x35\x5b\x2c\x33\xbe\x60\x52\x77\x44\x15\x51\xef\x59\x49\xa8\xde\ \xc4\xa4\x31\x88\xe9\x45\xbd\xa7\x24\x61\x0d\x15\x39\x88\x49\x2b\ \xa1\xce\x8e\x6a\x89\x7b\xa5\x9d\x49\x91\x34\x74\x38\x83\x3a\x8d\ \x12\x37\xaf\x85\x8a\x3c\x98\xf6\xbe\x91\x1a\x4b\xc4\x54\xb3\x85\ \x8a\x1b\xba\x20\xee\x24\x06\xfb\xbd\x56\x4c\x6b\xa9\x3a\x0e\x09\ \xc6\x30\x06\xaa\x17\xd3\x0a\xaa\x86\x18\xb0\x64\x96\x32\xc0\xf6\ \xe9\x12\x33\xe3\x73\xaa\x6e\xc9\x80\xa2\x27\x03\xd4\x4b\xcc\xa2\ \x26\xda\x64\xc3\xa6\x1f\xfd\xd5\x89\xc8\x03\xef\xb7\xd2\xa6\x0f\ \xec\x8c\xf3\xe8\xeb\xeb\x59\x8f\xbd\xb7\x9d\x76\x05\x21\x38\x84\ \x07\xd3\x57\x5b\x3b\x1d\x2e\x0e\xc3\x65\xcf\x73\x99\xb2\x81\x61\ \x78\x30\xf2\x99\x9a\x8a\x3e\x06\xbc\x1d\x5e\xc2\x14\xdc\x76\x34\ \x7c\x65\x0c\xa5\xd6\x90\x03\x11\xc0\x38\x7e\x22\x03\x45\x4e\x31\ \x10\xac\x6b\xef\x08\x7d\xdd\x94\xd7\x05\x7a\x9d\x73\x46\xd3\x53\ \xd1\xa9\x9d\x91\xa2\x1e\xf9\xd7\x95\xd3\xa6\x7c\x54\xdf\xee\xd8\ \x2d\xe9\xd9\xb9\x05\x23\xc6\x46\xca\xca\x22\x63\x47\x0c\xca\xcd\ \x4a\x87\x8f\xff\x01\xc6\xcb\x80\x82\x14\x7f\x18\x33\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xf7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x13\x00\x00\x04\x13\ \x01\xfd\x8e\xab\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x74\x49\x44\ \x41\x54\x38\x8d\x75\x93\xcb\x4b\x94\x61\x14\xc6\x7f\xe7\xfd\x3e\ \xbf\x19\x9b\x6c\xd4\xcf\x71\x0c\x9c\x6a\xd1\xa2\x34\x85\x20\xbb\ \x40\x9b\xc8\x10\x83\x68\x55\xfd\x01\x5d\x24\x68\x15\xfd\x1f\x49\ \x74\x83\xf2\x1f\x68\x1b\x34\xa6\xb5\x6d\x11\x04\x8a\x97\x82\x16\ \x39\x2a\x34\x2a\x3a\x57\x4d\xbf\xdb\x69\xa1\x0e\x8d\xe6\xb3\x7b\ \x9f\xf7\x7d\x1e\xce\x73\xce\x79\x85\x3d\xc8\x8f\xa7\x7b\x6c\xe5\ \x9e\xa2\x57\x81\x13\x3b\xf4\x9c\xa0\x9f\x8c\x9a\xb7\xcf\x06\x1e\ \x5e\x3e\xca\xd1\x91\x21\x86\x7c\x00\x7b\x57\xf8\xf3\xc3\xc9\x58\ \xb3\x55\x7e\x8a\x32\x84\x93\x34\x12\x6e\xa0\xa1\xb7\x7b\xdd\xad\ \x48\xf7\x7a\x39\xfe\xc8\x72\x82\x68\x45\x17\x0d\x3e\x2f\x01\xa4\ \x26\x6e\x28\x65\xc5\x4a\x5c\x91\xc6\x76\x74\xab\x80\xfa\xeb\xa0\ \x01\x00\x4b\x3f\xd2\x7c\x79\x73\x89\xb5\xf9\x16\x36\x4b\x8d\x18\ \x3b\x8c\x34\xb4\x26\x55\x79\x67\x00\x9a\xed\xf2\xb0\x58\x89\x2b\ \x12\x6b\x45\x37\x57\x11\xa7\x05\xb1\x13\xb5\x58\xe9\x53\x4b\x1c\ \x3f\x3f\xcf\x66\xa9\x11\x80\x28\xb0\x4c\xb2\xb3\x90\x8e\x13\x7f\ \x65\xf2\xe3\xe9\x1e\x90\x07\x12\x6f\x47\xbd\x12\xe2\x1c\x41\xbd\ \x55\xc4\x39\x52\xd7\x9b\xae\xc1\xd9\xba\xf3\x99\x1b\xb3\x1d\xf7\ \x47\x87\x3b\x6d\x5b\xb9\x87\x93\x34\xea\x15\x91\x98\x8b\x7a\x6b\ \x88\x75\x98\x70\xab\x8c\xb6\xdd\x01\x40\x0a\x59\x56\x7f\x1d\xe6\ \x58\x5f\x8e\xb3\xb7\x26\x58\xf8\x96\xa1\x92\x6f\x32\x91\x15\xdd\ \x95\x95\xb1\xf6\x19\x8c\xd3\x85\x46\x18\x3b\x01\x0d\x4d\x84\x5e\ \x85\xf0\xf4\xfb\x4d\xb1\x13\x93\x80\xa8\x5f\xed\x95\xa9\x9b\x71\ \x4b\x8a\xb5\x0a\xa2\xc0\x42\xec\x70\xda\x20\x64\x88\x3c\xd0\x80\ \xc8\x2f\x11\x6d\x2c\xa2\xcd\x83\x88\x9d\x98\xec\x48\x65\x2e\x76\ \xa4\x32\x17\xb0\x13\x53\x92\x1a\xa8\x8b\x60\xec\x10\x11\x8e\x9b\ \xbd\x7b\xb0\x0d\xad\x4d\x08\x40\xa4\xc6\xed\x83\x41\x59\xd8\x4b\ \x4a\x21\x8b\xfa\xd5\xde\xdf\xcb\xf3\x5f\xf3\x2b\xf3\x5f\x35\xa8\ \xf6\x48\x61\x14\x93\xc8\x20\x4e\x12\xc4\x46\x2c\x07\x55\x72\xb6\ \xa0\xe3\x8a\x74\xd5\x19\x84\x65\xac\xef\x37\xe2\xda\x32\xd8\x07\ \x8a\x55\xc8\x62\x62\x4d\xa8\x5f\x44\x1c\xf7\x9f\x77\xde\x98\xac\ \x7d\x4c\x9f\x09\x45\x27\x00\xeb\xff\x71\xc0\x1c\xea\x44\x83\x12\ \x62\x27\x89\xbc\x12\xa6\xd1\x25\xaa\xe4\x42\x63\xa4\xd7\xb4\x0e\ \x2c\x4d\x2b\xbc\x3e\x48\x0c\xa0\x41\x05\x71\xdc\x6d\x71\x2c\x89\ \xfe\x59\x46\xe0\x85\xdb\x9f\x9f\x35\x00\xa9\x62\xea\x31\xf0\xf9\ \x40\x03\x7f\x1d\xf5\x0a\x98\xb8\x8b\x6e\xad\xa1\xfe\xc6\x27\xb7\ \x75\xe9\xc9\x76\x13\x01\xb9\x3d\xe3\xb5\x15\x53\xd7\x15\x79\x0e\ \x84\xfb\x1c\x64\x7b\x58\x51\x35\x17\x12\xfc\x79\xd6\xe6\x2e\x5f\ \x97\x73\xf8\xf0\xcf\xa8\x76\xb1\x3a\xda\xd1\x1d\x59\xd1\x5d\x55\ \xae\xc9\xce\x77\x56\x98\x13\x18\x33\xc6\x8c\xb8\xfd\xf9\xba\x9d\ \xfe\x0b\x2f\x34\x03\x89\x65\x09\x5c\x5c\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x51\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xc0\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x80\x80\ \x80\x99\x99\x99\xaa\xaa\xaa\x9f\x9f\x9f\x99\x99\x99\xa2\xa2\xa2\ \xa5\xa5\xa5\xa1\xa1\xa1\x9d\x9d\x9d\xa4\xa4\xa4\x9e\x9e\x9e\x9f\ \x9f\x9f\xa1\xa1\xa1\x9f\x9f\x9f\x9e\x9e\x9e\xa2\xa2\xa2\xa1\xa1\ \xa1\x9f\x9f\x9f\x9e\x9e\x9e\x9f\x9f\x9f\xa1\xa1\xa1\x9f\x9f\x9f\ \xa0\xa0\xa0\xa1\xa1\xa1\xa1\xa1\xa1\x9f\x9f\x9f\xa1\xa1\xa1\xa1\ \xa1\xa1\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x7c\x8c\x9d\x7a\x00\x00\x00\x3f\ \x74\x52\x4e\x53\x00\x01\x02\x05\x06\x08\x0a\x0b\x11\x13\x1a\x1c\ \x1d\x25\x26\x28\x32\x34\x36\x40\x42\x45\x51\x55\x66\x6a\x77\x80\ \x87\x8a\x8e\x92\x93\xa3\xa4\xa7\xa8\xb3\xb4\xb7\xc4\xc5\xc8\xd2\ \xd5\xd6\xde\xdf\xe1\xe5\xe8\xea\xeb\xed\xf0\xf1\xf2\xf3\xf7\xf8\ \xfc\xfd\xfe\x43\x30\x70\xc2\x00\x00\x01\x01\x49\x44\x41\x54\x58\ \xc3\xed\x97\xc9\x4e\x02\x51\x10\x45\x91\x96\x19\x99\x41\x19\x64\ \x06\x65\x46\x10\x64\x10\xea\xff\xff\x8a\x85\xb5\xb2\xba\xe3\x4d\ \x2e\x86\x00\x7d\x96\x27\x37\x3d\xbc\xae\x57\xaf\x3a\x10\xf0\xb9\ \x15\x9c\xd7\xd5\xba\x19\xc2\xbd\xa1\x26\x22\xf2\x1e\x85\xbd\xe1\ \x43\x44\x44\x46\x71\xd4\x7b\x5c\x40\xa6\x4f\xa0\x77\x7f\x54\x11\ \x59\x64\x30\x6f\x17\xab\xab\xc9\xaf\x3c\xe4\x2d\x0f\x75\x4d\xee\ \x9f\x21\xef\x42\x45\x93\xdf\x2f\x98\xb7\x94\x0f\x3f\xc9\x63\x15\ \xf3\x96\xd2\x4e\x6f\xd6\x08\x42\xde\x52\xd8\x68\xb2\xed\x40\xde\ \x92\x5d\x6a\xb2\x1f\x86\xbc\x25\x3d\xd7\xe4\x30\x06\x79\x4b\x7c\ \xa4\xc9\x71\x02\xf2\x96\xe8\x40\x93\xb3\x14\xe4\x2d\x91\x37\xf7\ \xf2\xf5\xf2\x96\xc7\x8e\x26\xb7\x45\xc8\xfb\x65\xfd\x77\x59\xb7\ \x1c\xc8\x5b\x72\x9f\x9a\xec\x85\x21\xff\x1f\x65\x9d\x9c\x68\xf2\ \x57\x57\xf6\xf2\x67\xdf\x17\xec\x2b\xb0\x8b\xc8\x7e\x46\xb6\x90\ \xd8\x52\x26\x37\x13\xbb\x9d\xd9\x86\xc2\xb6\x34\xb6\xa9\x5e\xba\ \x7c\xd9\xa3\x8d\x3d\x5c\xef\xbc\x7c\xe9\x31\x8f\x1e\x34\xe9\x51\ \x97\x1e\xb6\xe9\x71\x9f\xfe\xe1\xf0\xb9\x76\x4e\xcf\x76\xcb\x35\ \x3f\xcc\x98\x9d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x01\x03\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x4e\x50\x4c\x54\x45\x00\x00\x00\xaa\xaa\xaa\xa6\xa6\ \xa6\x9b\x9b\x9b\xa2\xa2\xa2\x9f\x9f\x9f\x9e\x9e\x9e\xa0\xa0\xa0\ \xa1\xa1\xa1\xa2\xa2\xa2\x9e\x9e\x9e\xa1\xa1\xa1\xa1\xa1\xa1\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\x36\x9b\x65\x20\x00\x00\x00\x1a\x74\x52\ \x4e\x53\x00\x09\x14\x17\x1e\x20\x22\x2b\x2e\x37\x3a\x49\x4c\x59\ \xca\xce\xd7\xda\xe4\xe6\xea\xec\xee\xf4\xf6\xf9\x6e\xe8\x3f\xcf\ \x00\x00\x00\x4a\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\x00\x6c\x8c\ \x08\x12\x0c\x44\xf8\x98\xe0\x24\x18\xf0\x48\x08\xb0\xc0\x48\x08\ \xe0\x14\x15\xe6\x80\x91\x10\xc0\x2e\x24\xc6\x05\x23\x21\x80\x55\ \x50\x9c\x1b\x46\x42\x00\x33\xbf\x24\x2f\x8c\xc4\x2a\x80\xae\x05\ \xdd\x50\x74\x6b\x31\x1c\x86\xe1\x74\x0c\xcf\xa1\x01\x00\xb5\x90\ \x05\x15\xaf\x21\x39\x54\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\x16\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x5d\x50\x4c\x54\x45\x00\x00\x00\x55\xaa\xaa\x66\x99\ \xcc\x80\x80\xbf\x74\x8b\xb9\x78\x87\xc3\x6d\x86\xc2\x75\x83\xc1\ \x71\x82\xbe\x72\x82\xc1\x73\x82\xbe\x71\x84\xbd\x72\x84\xbf\x73\ \x84\xbd\x73\x83\xbf\x72\x84\xbe\x72\x84\xbf\x74\x82\xbf\x74\x83\ \xc0\x74\x83\xc0\x74\x83\xbf\x73\x82\xbf\x73\x84\xc0\x73\x84\xbf\ \x73\x83\xbf\x73\x82\xc0\x73\x84\xbf\x73\x83\xc0\x73\x83\xbf\x72\ \x83\xc0\x73\x83\xbf\x7f\xc0\xec\x15\x00\x00\x00\x1e\x74\x52\x4e\ \x53\x00\x03\x05\x08\x0b\x11\x15\x25\x2b\x31\x33\x36\x38\x3e\x50\ \x53\x57\x58\x61\x75\x77\x83\x9d\xba\xc7\xd5\xdf\xe5\xec\xf5\x5f\ \x9c\xc5\xe0\x00\x00\x00\x4a\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\ \x05\x98\xd0\xf8\xec\x52\xfc\x28\x7c\x0e\x69\x39\x21\x64\x3e\xb7\ \x8c\x1c\x42\x80\x4d\x58\x44\x54\x56\x0e\x49\x40\x40\x0e\x02\xe0\ \x02\x82\x04\x05\xf8\xd0\x05\x18\x39\xb9\x78\x25\x91\x05\x40\x80\ \x55\x02\x4d\x80\x81\x45\x1c\x4d\x80\x81\x59\x8c\x87\x81\x48\x00\ \x00\xe0\x90\x07\x17\xe4\x20\x5c\x79\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x01\xd3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x16\x7f\x00\x00\x16\x7f\ \x01\xa4\x13\xba\xbf\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x50\x49\x44\ \x41\x54\x78\x9c\xed\xd7\x3b\x4a\x43\x41\x14\x87\xf1\xef\xcc\xc5\ \x07\xb8\x00\x2d\x23\x08\x26\x37\xb5\xae\x40\x41\x57\x21\x22\xa8\ \xc4\x15\x28\x16\x82\xee\x21\x76\x6e\xc3\x42\x17\xa0\x6d\xb8\xd7\ \x14\x41\x6e\xe5\xa3\x4f\xe1\x03\x72\xac\x14\x15\x4b\xbd\x07\xc9\ \xff\x57\xce\x4c\xf1\xcd\x34\x33\x03\x22\x22\x22\x22\x22\x22\x22\ \x22\x22\x22\x22\x32\x2e\xec\xfb\x80\x37\x1a\xd3\xcc\xcc\xac\x32\ \x1a\x2d\x61\x36\x1b\x11\xf5\xeb\xdc\x1f\xc9\xb2\x6b\x86\xc3\x0b\ \xab\xaa\xa7\xcf\x53\x5f\x0e\xc0\x5b\xad\x2d\xcc\x4e\x80\xb9\x5a\ \x03\xeb\xf3\x00\x1c\x58\x59\x9e\xbd\x0f\x18\x80\x83\x91\xe7\xa7\ \xc0\x76\x54\x59\xcd\x4e\x29\xcb\x8e\x81\x27\x00\xda\xed\x43\xc6\ \x67\xf3\x00\xbb\xe4\xf9\x3e\x80\xf9\xe2\xe2\x3c\x59\x76\x03\x4c\ \x05\x47\xd5\xed\x85\x94\xf2\x44\x96\x75\x18\xbf\xcd\x03\x4c\xe2\ \xbe\x9d\x80\xb5\xe8\x92\x40\xeb\x09\x68\x44\x57\x84\x71\x9f\x4f\ \xd1\x0d\xc1\x46\x09\xa8\xa2\x2b\xc2\xb8\x57\x09\x38\x8f\xee\x08\ \x93\xd2\xb9\x79\xb3\xd9\x20\xa5\x3e\xe3\x77\x13\xbc\x90\x65\xad\ \x64\xfd\x7e\x85\xfb\x71\x74\x4d\x80\x23\xeb\xf5\x6e\x3f\x3f\x85\ \xbb\xc0\x4e\x70\x54\x3d\xcc\xba\x14\xc5\xde\xc7\x53\xd8\xc0\xad\ \x2c\x77\x31\xdb\x04\xee\x83\xf3\xfe\xd2\x1d\xee\x1b\x56\x14\x1d\ \x03\x87\x9f\xbe\xc3\x0b\x0b\x53\x4c\x4c\xac\x60\xb6\x0c\xcc\xfe\ \xb4\xe6\x9f\x71\xe0\x11\xf7\x2b\x5e\x5f\x2f\x6d\x30\x78\x8e\x0e\ \x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91\x18\x6f\x13\x8c\ \x53\x2b\x3a\x5e\xd9\xc4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x05\x60\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x10\xb2\x00\x00\x10\xb2\ \x01\x10\x6c\x57\x5e\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x04\xdd\x49\x44\ \x41\x54\x78\x9c\xe5\x9b\xdf\x6f\x53\x65\x18\xc7\x3f\xcf\x39\xdd\ \x80\x6e\x43\x18\x6d\x37\x16\x99\x90\xc8\x95\x5e\x10\x31\x5e\xb8\ \x4d\x1c\x42\x11\x95\xa8\x31\x91\xc4\x44\xb6\x18\x41\x90\xa0\x31\ \xe1\xcf\x20\x5c\x48\x1c\x5e\x10\xc9\xf0\x82\x64\x89\x11\x83\xac\ \x6b\xe7\x20\xf1\xc2\x78\x61\x14\x2e\x50\x09\xe0\x80\xc0\x58\x7b\ \xba\xb9\x21\x20\xd0\xee\xbc\x5e\x8c\x62\x39\xeb\xfa\x63\x3d\x3d\ \xa7\x3f\xbe\x57\xeb\x79\x9f\x3e\xef\xfb\xf9\x9c\x73\x9a\xf6\x3d\ \x99\x50\x61\x19\x0f\xb7\xac\xd1\x51\x3f\x21\x0c\xfb\x83\xb1\x1d\ \xc5\xf6\xd3\xec\x58\x94\x93\x11\x4d\x3d\x87\xd0\x0a\xf2\x86\x1d\ \xfd\x2a\x4f\x80\xa9\xc4\xce\x7e\x15\x27\xc0\xee\xb8\x2e\x60\x3c\ \xdc\x12\x88\x47\x02\xef\x8f\x9d\x6c\xf3\x96\x6a\x8e\xc9\x70\xcb\ \xb3\xf1\x70\xe0\xad\x4c\x63\xae\x0b\xd0\x45\x1d\x50\x70\xac\x6e\ \x51\x32\x1c\x3b\xe3\x6f\xb4\xbb\xbf\x11\xf1\x6d\x98\x11\xf5\xb3\ \x12\xbe\x8d\x0d\xf9\xbb\xac\xe3\xae\x0b\x00\x09\x01\x0a\xe8\x94\ \x84\x84\xec\x94\x60\x44\x7c\x1b\x40\x3b\x05\x34\x08\x5c\x59\xec\ \xa9\xff\xdd\x5a\xe3\xba\x00\x7f\x30\x7a\x5c\x29\xf5\x21\x60\x02\ \x9d\x5a\x42\xc2\xc6\x77\xbe\xa6\x62\xfb\xc6\x86\xfd\x9d\xa0\x7d\ \x0f\x34\x00\xd7\x92\x4a\x36\x2e\xdd\x74\x63\xc2\x5a\xe7\xba\x00\ \x80\xc0\x16\xe3\x2b\xa5\xd4\x4e\xc0\x54\xf0\x22\x4b\xb4\x50\x31\ \x12\x62\xc3\xfe\x4e\x51\x12\x02\x1a\x81\x6b\x33\x4a\x5e\x6e\xdd\ \x12\x1d\xcd\x54\x5b\x16\x02\xe0\x71\x09\x40\xc7\x7c\x12\x94\x92\ \x8b\x40\x02\xd4\xf9\x4c\x7d\x0a\x81\x87\x32\x12\x00\xb3\x12\x40\ \x3e\xe2\x91\x04\xfd\xa4\x1a\x40\x4f\xaf\x69\x79\x35\x76\xce\xd4\ \x58\x75\xbb\xce\xbb\xd9\xfa\x7e\x23\xe2\x7b\x5e\x94\x0c\x31\x0b\ \x3f\xea\xd1\xf5\x97\xb2\xc1\x43\x99\x09\x00\xf0\x07\xa3\x47\xfe\ \x97\xa0\x3a\xc7\x1b\x5b\x9b\xad\x35\x2d\x9b\x62\xd1\x35\xdd\x57\ \xee\x59\x8f\x8b\xc8\x26\x66\xef\xf9\x51\x8f\xae\x77\x2f\x7f\xe5\ \xe6\xd5\x5c\xf3\xd9\xfa\xad\xca\xce\x18\x11\xdf\x06\x41\xf7\xf8\ \x82\xd1\x91\x7c\xdf\x33\x76\xb2\xcd\xeb\x59\x94\x78\x97\x3a\x86\ \x02\xdd\xc6\x78\x29\xd7\xe7\x6a\x3e\xf8\xe4\xf0\xdb\x9f\x1d\x1c\ \x58\x62\x47\xaf\xb2\xbb\x05\x72\xa5\x77\x4f\xdf\xee\xa5\x2b\x9e\ \xfe\xe6\x5e\x4c\xbb\xbc\x7f\xff\xb1\x86\x62\xfb\x95\xed\x2d\x90\ \x29\xbd\x7b\xfa\x76\x2f\x6b\x5d\xdb\xa7\x6b\x1e\x01\xb8\x7b\x67\ \xe2\x66\x43\xf2\xee\xda\x03\x07\x76\xdc\x59\x68\x4f\xc7\x05\xa8\ \x01\xf4\x69\xef\x13\x4b\xe7\x1b\x4f\xcc\xd4\x25\xfd\x6f\xc6\xff\ \xb1\x1e\xb7\xc2\xa7\x32\x9f\x84\x7c\xe7\x71\x54\xc0\x44\xb8\x79\ \x95\x29\x9e\x5f\x01\x5f\xb6\x3a\x05\xfd\x81\x60\xac\x37\xf5\x7a\ \x3e\xf8\x54\xac\x12\x26\x06\x9b\x9f\x34\x3d\x9e\xdf\x72\xcd\x03\ \x7c\xed\xec\x67\x80\x5e\xdf\x04\x2c\xcb\x55\x26\xa2\xda\x53\x7f\ \xf7\xec\xed\xdb\xbb\x3c\x0b\x3c\x80\xd7\xdb\xbc\x32\x7e\xff\xfe\ \xa7\xa9\xd7\x4a\x97\xc6\x7c\xe6\x01\x69\x77\xfc\x16\xf8\x7b\x64\ \xe5\x53\xc9\x64\x22\xeb\x99\x49\x3c\xa8\xff\xa3\x6d\xdb\xd8\xdd\ \x5c\x67\x1e\x00\xa5\x98\x34\x2e\x0d\x1c\x3d\xb4\x6b\x7b\xfa\xe1\ \xc9\xe1\xb6\xf6\x19\xf3\x81\x3f\xdb\x3c\x33\xe8\x7f\x96\xed\x87\ \x60\x31\xf0\x85\xa4\x2c\x05\x38\x05\x0f\x65\x28\xc0\x49\x78\x28\ \xb3\x2f\x42\xc5\xc2\x2b\x85\x18\x61\xdf\x7a\x35\xf0\x4c\x7d\xbe\ \x73\x96\x8d\x00\x3b\xce\xfc\x44\x24\xb0\x07\xd1\x7e\x89\x2f\x37\ \x7e\xc8\x77\x67\xa9\x2c\x04\x74\x6f\xed\xe9\x98\x9e\xbe\x7e\x50\ \x90\xec\xf0\xf1\xcb\x59\x2f\x7b\xa5\x99\x57\x01\x13\x45\x97\x24\ \x65\x30\x1f\x09\xae\x0b\xe8\xde\xda\xd3\x21\x22\xa1\xe9\xa9\xb1\ \x25\xa3\x17\x4e\x63\x9a\x33\x73\x8b\x52\xf0\x9f\xef\xdc\x7e\x33\ \xd4\xba\xda\x88\x04\x6e\xc4\xc2\x81\x7e\x6b\x99\x7f\x73\xfc\xd4\ \xa3\x4d\x15\x45\x97\x24\x64\x28\xd7\xce\x92\xab\x02\x52\xf0\x40\ \x13\xc0\xad\xa9\x31\xe6\x48\x48\x83\x07\xd0\x3c\xe6\x7a\xa0\x4d\ \x44\xb6\x65\xea\x99\xef\xce\x52\x2a\xae\x09\xb0\xc2\xa7\xf2\x98\ \x04\x0b\x3c\xe4\xf7\x64\xa8\x10\x09\xae\x08\x98\x0f\x3e\x95\x5b\ \x53\x63\xfc\x75\xe1\x8c\x9a\x34\x2e\x1d\x4f\x87\x2f\x24\x73\xb6\ \xd7\xbc\xda\xa9\xd1\x33\xab\x17\x5b\xeb\x1c\x17\x90\x0b\xfe\x61\ \xd4\xed\xa9\xeb\xfb\x8e\x1e\xda\xf5\x5e\x31\x73\x3d\xb6\xbd\xa6\ \xe8\x6a\x4a\xfc\xdb\x61\xad\xf1\x14\x33\x41\xa1\xc9\x17\x5e\x50\ \xfb\x46\x06\xfb\xbf\xb0\x63\x4e\x7f\x30\x7a\x24\x1e\x0e\xc4\x15\ \xac\x5b\xb1\x22\xfa\xa3\x75\xdc\x31\x01\x6e\xc0\xa7\xe2\xdb\x12\ \x3b\x01\x9c\xc8\x34\xe6\xc8\x2d\xe0\x26\x7c\xae\x94\x5c\x40\x39\ \xc3\x43\x89\x05\x94\x04\x5e\xb8\x04\x24\x41\xcd\x79\xd0\xb9\x90\ \x94\x4c\x40\xa9\xce\x7c\x20\x68\x9c\xc5\x34\xdb\xef\x35\xd6\xcf\ \x79\x32\xb4\x90\x94\xe4\xe7\x70\xb9\x5f\xf6\xe9\xb1\x5d\x40\x25\ \xc1\x83\xcd\x02\x2a\x0d\x1e\x6c\x14\x50\x89\xf0\x60\x93\x80\x4a\ \x85\x07\x1b\x04\x54\x32\x3c\x14\x29\xa0\xd2\xe1\xa1\x08\x01\xd5\ \x00\x0f\x0b\x14\x50\x2d\xf0\xb0\x00\x01\xd5\x04\x0f\x05\x0a\xa8\ \x36\x78\x28\x40\x40\x35\xc2\x43\x9e\x02\xaa\x15\x1e\xf2\x10\x50\ \xcd\xf0\x90\x43\x40\xb5\xc3\x43\x16\x01\xb5\x00\x0f\xf3\x08\xa8\ \x15\x78\xc8\x20\xa0\x96\xe0\xc1\x22\xa0\xd6\xe0\x21\x4d\x40\x2d\ \xc2\xc3\x43\x01\xb5\x0a\x0f\x20\xb5\x0c\x0f\xe0\x11\xe1\x1d\x72\ \xc0\x03\x1f\x8f\x0c\xf6\x7f\xe9\xd0\x9a\x1c\x8d\x3e\x7a\xf1\x5c\ \x64\xf5\xda\x75\x3e\x81\x17\x32\x8c\x2b\x41\xed\x3b\x3d\xd8\x7f\ \xd8\xf1\x95\x39\x14\x1d\xe0\xca\xc5\xb3\xa1\x0c\x12\xaa\xf6\xb2\ \x4f\xcf\xa3\xff\xc7\xb1\x48\xa8\x09\xf8\x4c\x91\x8d\xaf\xf7\xf4\ \x6d\x7c\xad\x77\xb7\xdb\x0b\x71\x2a\xff\x01\x09\x50\xc8\x58\xf1\ \x9f\x52\x16\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\x81\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x10\x4b\x00\x00\x10\x4b\ \x01\xe7\x8f\x45\x7b\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x09\xfe\x49\x44\ \x41\x54\x78\x9c\xed\x9b\x7b\x8c\x9c\x55\x15\xc0\x7f\xe7\x7e\xf3\ \xdc\xd9\x9d\xee\xec\xee\xec\x63\xda\x52\x11\xda\x6a\xcb\xa3\x40\ \xab\x8d\x36\x8a\x11\x6d\x25\xa5\x54\x43\xc0\x60\x82\x16\x08\x58\ \x03\x18\x8c\x0a\xd1\x28\x21\x4a\x50\xd1\x18\x88\x40\x24\x29\x35\ \x26\xc6\x28\x82\xb4\x8a\x14\x02\x0a\x0a\x04\x81\x4a\x0b\xb4\x14\ \x0a\x69\xcb\xb6\xb3\xbb\x9d\xd7\xbe\xe6\xf9\xcd\x77\xaf\x7f\xcc\ \xce\xee\x6c\x77\xb7\xbb\xdb\x9d\x69\x87\xa4\xbf\xff\xe6\xdc\x7b\ \xcf\x77\xcf\x9d\xfb\xdd\xef\x9c\x7b\xcf\x15\x66\x40\x2c\x16\x8b\ \x14\xc5\xba\xdc\xc0\x5a\x31\xe6\x4c\x84\x0e\xa0\x63\x26\x6d\x4f\ \x22\x7d\x18\xfa\x8c\xc8\x01\x0c\x3b\xdc\x38\xdb\xc3\xe1\x70\x74\ \xba\x46\x72\xbc\xc2\xc3\x47\x53\x2b\x2c\xd1\x77\x23\xac\x9d\xae\ \x6e\x1d\x62\x30\xec\x50\x96\xdc\xde\xd1\xd2\xf2\xc6\x54\x95\x26\ \x35\xaa\xb7\xb7\x37\x60\x5c\xee\xdf\x00\xd7\x00\xaa\x56\x3d\x3c\ \x49\x68\x63\xd8\x8a\x9d\xbf\x25\x12\x89\x64\x8e\x2d\x9c\x30\x00\ \xdd\xf1\xf8\x7c\x17\x6a\x1b\x98\x8b\x4e\x4e\xff\x4e\x8c\xde\x81\ \x03\xbc\x1f\xdb\xc9\x40\xe6\x28\xe9\xc2\x00\x1e\x97\x9f\xa0\xaf\ \x8d\x33\x5a\x96\xf1\x91\xb6\x73\xb1\x94\x7b\x5c\x7d\x63\xd8\x8d\ \x4b\x5d\x1e\x09\x85\x0e\x55\xca\xc7\x0d\x40\x34\x99\x3c\x43\xb4\ \x79\x19\xe8\xaa\xbd\x09\xb3\xc7\x18\xcd\x1b\x87\xff\xc5\x73\xfb\ \xfe\x40\x22\x3d\xf5\xeb\xed\x73\x07\xf8\xc4\x99\xeb\x59\xb3\xf8\ \x4a\x7c\xee\x40\x65\x51\x54\x0b\xab\xe7\xb7\xb6\x76\x97\x05\xa3\ \x03\xd0\xdd\xdd\xed\x77\xf9\x1b\xfe\x0d\xac\xac\x45\xe7\xe7\xca\ \x60\x2e\xc1\x9f\x5e\xf9\x09\xdd\xc9\x7d\xa3\x32\xaf\xd7\x8b\xc7\ \xe3\xc6\xb2\x5c\x68\xa3\xb1\x0b\x36\xb9\x5c\x0e\x63\x0c\x00\x01\ \x4f\x33\x57\xac\xba\x8d\xb3\xc2\x17\x8c\xb6\x11\x61\x17\xb6\xbd\ \xa6\xb3\xb3\x33\x0d\x15\x03\xd0\x13\x4f\x6c\x05\xbe\x71\x92\xec\ \x99\x15\x47\x07\x0f\xf1\xfb\x97\x7e\xc0\x60\x2e\x01\x02\xc1\x60\ \x90\x50\xa8\x19\x97\xcb\x35\xa1\xae\xd6\x86\xa1\xc1\x41\x52\xa9\ \x7e\x1c\xc7\x41\x29\x8b\x0d\xe7\xdf\xc2\x85\x8b\xd6\x8e\xd6\x31\ \x86\x2d\x91\x70\xeb\xf5\x30\x32\x00\x7d\x7d\xa9\xf3\xb5\xa5\xff\ \x47\x1d\x2e\x78\xd9\xc2\x10\x0f\x3d\xff\x6d\x12\xe9\x28\x96\x65\ \xd1\xd1\xd5\x81\xdf\xe7\x9b\xb6\x9d\xd6\x9a\xde\x9e\x5e\xb2\xd9\ \x1c\x4a\x14\x5f\x5b\x7d\x27\x8b\x3b\x56\x55\x14\xab\x95\xf3\xdb\ \x43\xaf\x2b\x00\xad\xf4\xcf\xa8\x43\xe3\x01\xb6\xed\xba\x97\x44\ \x3a\x8a\xb2\x14\xf3\xe7\x47\x66\x64\x3c\x80\x52\x8a\xae\x48\x17\ \x3e\xbf\x0f\x6d\x34\x8f\xed\xfc\x15\x39\x3b\x3d\x56\x6c\xe9\x9f\ \x02\xa8\x58\x2c\x16\x19\xf9\xce\xd7\x1d\xdd\xc9\x7d\xbc\x1d\x7d\ \x11\x80\xf6\xf6\x76\xdc\x1e\xf7\x34\x2d\xc6\x23\x22\x74\x76\x76\ \x60\x59\x16\xe9\x42\x3f\x2f\xee\x7f\x64\xac\xd0\xb0\x2e\x16\x8b\ \x75\xa9\xa2\x58\x1b\xa9\x53\x27\xe7\xe5\xf7\x1f\xc7\x60\xf0\xfb\ \xfd\x04\x02\x0d\x27\xa4\xc3\xb2\x2c\x42\xa1\x66\x00\xfe\x7b\xe0\ \xef\x38\xba\x58\x2e\x52\x36\xd6\x06\x05\xf5\xf9\xef\x3b\xba\xc0\ \xbb\x7d\xaf\x00\x10\x9c\xd7\x34\x27\x5d\x4d\xc1\x20\x22\x42\xce\ \x1e\xe6\x60\xe2\xcd\x51\xb9\x08\x97\x2a\x63\xcc\xa2\x39\x69\xaf\ \x11\x47\x87\x3e\x20\x5f\xcc\x80\x08\x0d\x0d\x81\xe9\x1b\x1c\x07\ \xa5\x04\xdf\xc8\xda\xf1\x41\x62\x4f\x45\x89\x5e\xae\x04\xe6\xcf\ \x49\x7b\x8d\x18\xcc\x26\x00\xb0\x94\x42\xa9\xb9\xbf\xa1\xe5\xf5\ \x63\x28\x97\xac\x90\x4a\x87\x42\xcc\xdc\xe6\x57\x8d\xc8\x17\x4b\ \x6e\xbb\xb2\xaa\xf3\x71\x52\xa2\x46\xf4\xa6\x2b\xc5\x3e\x05\xd2\ \x57\x95\x27\x54\x99\x46\x6f\x08\x00\xa7\xe8\x54\x45\x9f\xe3\x14\ \xc7\xe9\x05\x10\x18\x56\x40\x4f\x55\x9e\x50\x65\xe6\x35\xb4\x03\ \x25\x87\xa6\x58\x2c\x4e\x53\x7b\x7a\xf2\xf9\x42\x49\xaf\xbf\x7d\ \x4c\x28\x1c\x54\xc0\xde\x39\x6b\xaf\x01\xad\x81\x08\x2d\x0d\xa5\ \x98\x2c\x3d\x9c\x9e\xa6\xf6\xf1\xb1\x6d\x9b\x42\xa1\x34\x00\x67\ \xb7\x8f\x05\xb9\x5a\xb3\x53\x19\xcc\xf6\x39\x69\xaf\x21\xcb\x22\ \x6b\x00\x18\xe8\x1f\x1c\x0d\x70\x4e\x84\x54\xaa\x1f\x80\xb6\xa6\ \x85\xb4\x07\xc7\x3e\x7a\x0a\xd9\xa6\x28\x14\x9e\x06\x26\x6c\x14\ \xd4\x03\x9f\x5a\xfc\x15\x3c\x2e\x3f\x76\xd1\x26\x95\x4c\x9d\x90\ \x8e\x6c\x36\xc7\xf0\xe0\x10\x00\x17\x2f\xbd\xba\xb2\x28\x6d\xe7\ \xd2\xcf\xa8\x48\x24\x92\x41\x78\x70\xee\xdd\xad\x3e\x8d\xde\x10\ \x9f\x5d\xf2\x55\x00\xfa\x53\xfd\x0c\x8e\x18\x32\x53\xec\x42\x81\ \xbe\xbe\x3e\x0c\x70\x46\xeb\x72\xce\x5d\x70\x71\x45\xa9\xb9\x7f\ \xe1\xc2\x85\x59\x05\x50\xb0\xac\xbb\x80\xe4\x64\x4a\x4e\x35\x6b\ \x96\x5c\xc9\xb2\xc8\xa7\x31\x40\xfc\x68\x8c\x44\x22\x39\xa3\xd7\ \x21\x9d\x4e\x73\xe4\x70\x0f\x4e\xd1\x21\xe8\x6f\xe3\xaa\x55\x3f\ \x44\xc6\x3c\xfe\x54\xd1\xed\xfe\x39\x54\xc4\x00\xd1\x58\xf2\x06\ \x11\xf3\xdb\x5a\x18\x31\x57\x6c\x27\xcf\xa3\x3b\xef\x61\x6f\xf4\ \x05\x00\x5c\x6e\x17\xcd\xf3\x82\x34\x04\x1a\x71\xbb\xc7\xf6\x04\ \x8c\xd6\xa4\xd3\x19\x06\x07\x87\xc8\x66\xb3\x40\x69\x31\xbd\x7a\ \xf5\x9d\x84\x9b\x16\x8e\xd6\x13\xe1\xfa\xce\xd6\xd6\x2d\x70\x4c\ \x10\xd4\x13\x8f\x3f\x00\xb2\xb9\xf6\x26\xcd\x1e\x83\xe1\x85\xfd\ \x8f\xf0\xfc\x3b\x7f\xa4\x50\xcc\x8e\xca\x95\x92\xd2\x8e\x90\xd6\ \x38\xce\x98\xcf\x20\x08\xe7\x2c\xf8\x0c\xeb\xcf\xbb\x09\xbf\xa7\ \xd2\xd7\x93\xfb\xbb\xda\x5a\x6e\x1a\xab\x57\xf9\x10\x63\xdc\xbd\ \x89\xd4\x5f\xc0\x6c\xa8\xa1\x2d\x73\x62\x38\xdf\xcf\x4b\xfb\x1f\ \x65\x6f\xf4\x05\x92\x99\x89\x2e\x8c\xcf\xdd\xc8\x92\x8e\x55\xac\ \x3e\x6b\x23\x0b\x42\x4b\xc7\x95\x09\xf2\x78\x47\x6b\xe8\x4a\x11\ \xb1\xc7\x64\xc7\x60\x8c\x91\xde\x78\xf2\x0e\x84\x3b\x6a\x61\x40\ \x35\x49\xa4\xa3\x0c\x64\x62\x0c\xe7\x93\xf8\xdc\x01\x82\xbe\x36\ \xc2\x4d\x67\x60\xa9\x89\x5b\x65\x06\xee\xeb\x6a\x6d\xb9\x55\x44\ \x74\xa5\x7c\xca\x28\xa3\x37\x96\xbc\xcc\x88\xb9\x07\x58\x3a\x55\ \x9d\x0f\x09\x6f\x63\xe4\x7b\x5d\xe1\x96\x27\x26\x2b\x3c\x6e\x98\ \x65\x8c\x71\xf5\xc4\x53\xd7\x8a\x98\x6b\x81\x55\xd4\xe9\xb6\xd9\ \x24\x68\xe0\x15\x63\x78\xb8\xab\xad\x65\xab\x88\x4c\xe9\x4b\xcf\ \x38\xce\x8c\xc5\x62\x11\x47\xa9\x75\x46\xb3\xdc\x28\xba\xc4\x30\ \x71\x9e\x9d\x42\x8c\x50\x14\x88\x02\x7b\x5c\x5a\xef\x08\x87\xc3\ \x75\x19\xe3\x9c\xe6\x34\xa7\x39\xcd\x69\xea\x89\x19\x7f\x06\xbb\ \xe3\xf1\xf9\x6e\x91\xb5\x46\xb3\xc8\x40\x44\x84\x79\xb5\xec\xd8\ \x6c\x31\x86\x01\x81\x23\x28\x0e\x15\x8d\x79\x7a\x61\x5b\xdb\x91\ \x99\xb4\x9b\xce\x11\x72\xf7\xc4\x53\xd7\x8d\x38\x42\x2b\xa7\xab\ \x5f\x47\x18\xe0\x55\x63\xe4\xe1\xae\xb6\xd0\x96\x13\x72\x84\xa2\ \xf1\xf8\x46\x90\x5f\x08\x2c\xae\x49\x17\x4f\x1e\xef\x88\xd1\xdf\ \xef\x0c\x87\x27\xdd\xfa\x9b\x2c\x18\xb2\x7a\x13\x89\xbb\x40\x6e\ \x9b\x50\xbb\x58\xc4\xe9\x3d\x82\x1e\x48\x62\x72\x39\xa4\x29\x88\ \xd5\xdc\x8a\x6a\xef\xac\x41\xbf\xab\xcb\x48\x30\xf4\x1d\x11\x19\ \xb7\xcf\x3e\x49\x38\x9c\x78\x0c\x64\x7d\xa5\xbc\x78\xf0\x3d\x0a\ \xcf\x3d\x85\xbd\x77\x37\x26\x97\xe5\x58\x54\x6b\x3b\xee\x15\xab\ \xf0\x7e\xee\x4b\xa8\x60\x5d\x2d\x0d\xc7\x20\xdb\x3b\x5b\x43\x57\ \x4c\x19\x0e\xf7\xc4\xe3\x0f\x82\x7c\xb3\xfc\xdb\x0c\x0f\x91\xf9\ \xf3\x56\xec\xdd\xaf\x41\xc5\x36\x94\xb2\x14\x82\xa0\xb5\x1e\xb7\ \x3d\x25\x5e\x1f\xde\x2f\x6e\xc0\x77\xc9\x7a\x90\xba\x5d\x2e\x1e\ \xee\x6a\x6b\xbd\xae\xfc\xa3\x22\x45\x26\xb9\x19\xcc\x03\xe5\xdf\ \x4e\xcf\x61\xd2\x0f\xfd\x1a\x9d\x38\x0a\x80\xc7\xe3\xc1\xef\x6f\ \xc0\xe3\xf5\x20\x15\xc6\x39\x8e\x43\x21\x9f\x27\x93\xc9\x8c\xee\ \xc8\xb8\xcf\x5f\x49\xc3\x35\x9b\x11\xb7\xe7\x24\xd8\x33\x7b\x8c\ \x91\x1b\x23\xe1\x96\x87\x60\x64\x00\x0e\xf5\xf7\x87\x3c\x45\xe7\ \x7d\x20\x04\xa0\x07\xfa\x19\xfe\xe5\x8f\xd0\x03\xfd\x28\xa5\x68\ \x0a\x06\xf1\x7a\xbd\xd3\x69\x65\x38\x9d\x26\x93\x2e\x1d\x62\xb8\ \x57\xac\x22\xb0\xe9\xe6\xba\x9c\x09\x02\xfd\x45\x8f\xfb\xec\x05\ \xc1\x60\x42\x01\x78\x6d\xe7\xc7\x8c\x18\x8f\x31\x64\xb6\xdc\x3b\ \x6a\x7c\x28\xd4\x32\xbd\xf1\x00\x22\x34\x36\x36\x12\x0c\x06\x01\ \xb0\x77\xbd\x4a\xee\xd9\x49\xf7\x20\x4e\x39\x06\x9a\x2d\xdb\xbe\ \x1d\x40\x45\xa3\xd1\x06\x23\xdc\x50\x2e\xb4\x5f\x7b\x89\xe2\xc1\ \xf7\x10\x11\xe6\xcd\x6b\xc6\x72\x59\xb3\x52\xee\xf3\xfb\x09\x04\ \x4a\xe7\xf9\xf9\xa7\xb6\xa1\x87\x06\xab\xd9\xf7\xea\x61\xd8\xdc\ \xdd\xdd\xed\x57\x78\x3c\x6b\x81\xd1\xfc\x93\xdc\x8e\xbf\x02\xe0\ \xf3\xf9\x67\x9d\x93\x53\x26\x10\x08\x60\x29\x85\xc9\xe7\x28\xfc\ \xf3\xc9\xaa\xf4\xb7\x06\x04\xdc\x3e\xdf\x17\x94\x20\x97\x95\x25\ \xce\x91\x0f\x70\x62\xa5\xd3\xf2\x86\x13\xcc\xc9\x01\x40\x04\xff\ \x48\xfb\xc2\xee\x57\xe7\xd6\xcd\x1a\x62\x44\x5d\xae\x80\xe5\x65\ \x41\x71\x5f\x29\x7f\xc6\xed\x72\x61\x59\xb3\x9b\xfa\xc7\xe2\xf5\ \x96\x52\x52\x74\xbc\x0f\x1d\xaf\xcb\x14\x04\x8c\xe1\x22\x05\x8c\ \xba\x71\x3a\x35\x92\x96\x32\x49\x06\xe6\x6c\xb1\x2c\x6b\xf4\x73\ \xa9\x93\x89\x39\xeb\xab\x05\x4a\x58\xa4\xc0\x8c\x5e\x7c\x30\xc3\ \xa5\xc3\x47\xa5\xaa\x94\x96\x32\x92\xde\xa2\x87\x06\xaa\xa2\xaf\ \xda\x18\x68\x54\x20\x63\xbd\xf3\xfa\x4b\x05\x73\x38\x8b\x1f\xf7\ \x00\x5d\xd2\x23\x7e\x7f\x55\xf4\xd5\x80\x9c\x32\x66\x2c\x45\x46\ \x35\x97\xfc\xf8\xca\x33\xb6\x13\xc5\x68\x8d\xd6\xa5\x43\x18\x35\ \x2f\x34\x4d\xed\x53\x85\xe9\x53\x88\x1c\x2c\xff\x74\x9d\xb9\x04\ \x28\xa5\x94\xcc\x75\x16\xe4\x0b\xa5\x78\x43\xfc\x0d\x58\x1d\x75\ \x99\x89\x87\x41\xbd\xa5\x30\xec\x28\x0b\x5c\x67\x7f\x1c\xf1\x37\ \x60\x8c\x21\x97\x9d\x18\xf5\xcd\x86\x6c\x66\xc4\x25\x5e\xb6\x02\ \xaa\xb0\xa8\xd6\x04\xc3\x3f\x94\x1b\x67\x3b\xa5\xa3\x24\x70\xb9\ \xf0\xae\xf9\x3c\x50\x4a\x30\x28\x4f\xe1\xd9\x92\xcf\xe7\xb1\x6d\ \x1b\x44\xf0\x5e\x5c\x97\x99\xb8\x00\xda\x8d\xf3\x37\x15\x0e\x87\ \xa3\x18\x9e\x2a\x4b\xbd\x97\xac\x47\x1a\x83\x68\xad\x19\x1c\x18\ \x60\xb6\x6f\x82\x53\x74\x18\x1a\x28\xad\xab\x9e\x0b\x3e\x89\xb5\ \xe8\xa3\x55\xed\x75\xd5\x10\x9e\x0c\x87\xc3\x3d\x0a\x40\x2c\xb9\ \x8d\x91\x59\x20\xfe\x06\x1a\xbe\xfe\x2d\xc4\xb2\x28\x14\x0a\xf4\ \xa7\x92\x98\x19\xce\x04\xbb\x60\x93\x4a\x25\xd1\xc6\xa0\x5a\xc3\ \xf8\xaf\xb8\xa6\x76\x06\xcc\x0d\x47\x44\x4a\xc1\x10\x40\x67\x4b\ \xcb\x9b\xc6\xb0\xb5\x5c\xea\x5e\xba\x1c\xff\x55\x9b\x10\xcb\xc2\ \xb6\x6d\x12\x89\x04\xd9\x4c\x66\xca\x85\xd1\x29\x3a\x23\xd7\x54\ \x92\x68\xad\x91\xe6\x16\x1a\x6f\xfc\x2e\xd2\x58\x97\x59\xb8\x88\ \xb0\xa5\xb3\xa5\xe5\x2d\x98\x78\x69\xea\x79\x4a\xc7\xe0\x00\xd8\ \xef\xee\x21\xf3\xbb\x07\x30\xc3\x83\xe5\x86\xb8\xdd\x9e\x51\x2f\ \xaf\x9c\xc5\x59\x99\xc9\x69\x9d\xb5\x94\xc0\xa6\x9b\xeb\x78\x6b\ \xcc\xbc\x6e\x0a\x85\x35\xe5\x3b\x84\xe3\x76\x2b\x8e\x24\x12\x0b\ \x95\xe1\x65\x20\x32\x5a\x3d\x9b\x21\xff\xec\x13\xe4\xff\xf3\x0c\ \x26\x3b\x75\x3a\xa1\xea\xe8\xc2\xb7\xee\xcb\x78\x2e\x5c\x5d\x97\ \x9b\x20\x00\x02\x47\x8a\xc2\xea\x05\xad\xad\x87\x2b\x64\xe3\x29\ \x5d\x9c\x94\xc7\x39\xe6\xfa\x9c\x71\x8a\x14\xf7\xef\xc3\x39\xb0\ \x1f\xdd\x9f\x82\x7c\x16\x69\x0a\xa2\x5a\xc2\xb8\x3e\x76\x0e\x56\ \xd7\x82\x93\x60\xc2\x89\x23\xc2\x2e\xad\xd4\xc6\xe3\x5e\x9c\x2c\ \x13\x8d\x46\x1b\x70\x7b\xef\x13\x61\x13\x1f\x9e\xac\x90\xa9\x70\ \x44\xd8\xa2\xf3\xf9\x5b\x67\x74\x75\xb6\x92\xbe\x64\xf2\x3c\x6d\ \xcc\xdd\x18\xd6\xf1\xe1\x1b\x08\x8d\xf0\xa4\x88\xdc\x5e\x5e\xf0\ \x26\x63\x46\x2f\x6b\x2c\x16\xeb\xb2\xb1\x36\x88\x70\x29\xe8\xe5\ \x20\x1d\x40\x63\xd5\xba\x5a\x1d\x86\xc1\xf4\x81\xda\x63\x0c\x4f\ \xb8\x4c\x71\x7b\x7b\x7b\x7b\xef\x74\x8d\xfe\x0f\x0a\x1c\xce\x4f\ \x5b\x71\xbb\x23\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x04\x0c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\x4d\x50\x4c\x54\x45\x00\x00\x00\x00\xff\x00\x80\x80\ \x80\x40\xbf\x40\x33\x99\x66\x55\xaa\x55\x40\xaa\x55\x3b\xb1\x62\ \x49\xb6\x5b\x44\xaa\x55\x40\xaf\x60\x3c\xb4\x5a\x47\xaa\x55\x40\ \xb3\x59\x46\xae\x5d\x46\xb2\x5d\x44\xad\x5a\x42\xaf\x5f\x40\xb1\ \x5c\x45\xaf\x5a\x44\xb1\x5e\x45\xb1\x5d\x43\xb2\x5b\x43\xaf\x5c\ \x42\xb0\x5b\x44\xb1\x5d\x44\xaf\x5c\x43\xb0\x5b\x42\xb1\x5d\x44\ \xaf\x5c\x43\xb1\x5d\x42\xaf\x5c\x42\xaf\x5d\x44\xb0\x5c\x43\xb1\ \x5b\x44\xb1\x5b\x42\xb0\x5c\x44\xaf\x5d\x43\xb1\x5c\x44\xb0\x5d\ \x43\xb1\x5c\x42\xb0\x5c\x44\xb1\x5d\x43\xaf\x5c\x43\xb0\x5b\x42\ \xb1\x5c\x44\xaf\x5c\x43\xb0\x5d\x43\xb1\x5c\x43\xb1\x5b\x43\xb0\ \x5c\x44\xb0\x5c\x43\xaf\x5c\x42\xb0\x5c\x44\xb1\x5d\x43\xaf\x5d\ \x43\xb0\x5b\x43\xb0\x5c\x43\xaf\x5c\x43\xb0\x5c\x42\xb0\x5d\x44\ \xb1\x5c\x43\xb0\x5c\x43\xb1\x5d\x43\xb0\x5c\x44\xb0\x5c\x43\xb0\ \x5c\x43\xb0\x5c\x42\xb0\x5c\x43\xb0\x5c\x43\xaf\x5c\x43\xb0\x5c\ \x44\xb0\x5d\x43\xaf\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb1\x5c\x42\ \xb0\x5c\x43\xb0\x5b\x43\xb0\x5c\x43\xb0\x5c\x43\xb1\x5c\x43\xb0\ \x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x42\xb1\x5c\x43\xb0\x5c\ \x43\xb0\x5c\x43\xb0\x5d\x44\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\ \xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb0\ \x5c\x43\xb0\x5c\x43\xb0\x5c\x44\xb0\x5d\x4d\xb4\x64\x5d\xbb\x72\ \x6f\xc3\x82\x75\xc5\x87\x78\xc6\x8a\x9c\xd5\xa9\xd1\xec\xd7\xfb\ \xfd\xfc\xff\xff\xff\xdb\x67\x96\x6c\x00\x00\x00\x64\x74\x52\x4e\ \x53\x00\x01\x02\x04\x05\x06\x0c\x0d\x0e\x0f\x10\x11\x12\x14\x16\ \x21\x22\x23\x24\x30\x31\x34\x35\x50\x51\x52\x53\x54\x55\x56\x58\ \x59\x5d\x5e\x5f\x62\x64\x66\x6f\x71\x72\x74\x7c\x7d\x7e\x7f\x80\ \x81\x82\x89\x8a\x8b\x8d\x8e\x8f\x9d\x9f\xa1\xa3\xa4\xa5\xa6\xa7\ \xb3\xb4\xb5\xc1\xc2\xc4\xc5\xca\xcb\xcc\xcd\xce\xcf\xd0\xd3\xd4\ \xd5\xd6\xdd\xde\xe0\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\ \xf8\xf9\xfa\xfd\xfe\xdf\x19\xb5\xb1\x00\x00\x02\x0a\x49\x44\x41\ \x54\x58\xc3\xad\x97\xe7\x5f\xe2\x40\x10\x86\x37\x8a\x72\x16\x14\ \xcf\x06\x62\x39\xcb\x9d\x52\xac\x60\x07\xf5\x6c\x58\x8e\x53\xb1\ \x26\x36\x34\x63\x41\x74\xff\xff\x8f\xa2\xa2\xb2\x98\x21\xbb\x19\ \xdf\x8f\xd9\x79\x9f\x1f\x9b\xb0\xb3\xef\x30\x86\xa8\x21\x30\xbc\ \xb0\x99\x36\xae\xae\x8c\xf4\x66\x22\xd2\xd1\xc0\x94\xd4\x36\x99\ \x32\x41\x90\x99\x8a\xb5\xca\xba\x7f\x04\x77\xc1\x52\x3b\x41\xb7\ \x84\xbd\x7e\xd4\x00\x54\xc6\x48\x9d\x8d\x5d\xeb\x3d\x82\xb2\xd2\ \xff\x54\x94\xf3\xff\x5c\x03\x5b\xad\x36\xe1\x7e\xdf\x29\x48\xe8\ \xa2\x1b\xb1\x57\x4c\x81\xa4\x62\x96\xdb\xa8\x4a\x80\xb4\xe2\x2e\ \x0b\xff\x5f\x50\xd0\xd2\x17\x82\x36\x0b\x4a\x4a\x94\xee\x62\x0a\ \x14\x15\x15\xfd\x9d\xa0\xac\x9e\x62\x7f\xd3\x99\x3a\xe0\xcc\x5b\ \xf4\x02\xd6\xc0\x81\x56\xb4\x0f\xc0\x00\x5a\x74\x93\xcb\xdd\xa0\ \x8b\x7d\x1f\xe7\xe7\x18\xad\xb9\xe7\xfc\x1e\x5d\x3c\xac\x2d\x00\ \xc6\xf0\x9f\xf9\xc0\xf9\x03\xbe\x1a\x29\x9c\x7f\xc3\x29\x40\x7f\ \xeb\x0f\x41\x70\x0a\x80\xa1\x57\x40\xca\x39\x60\xe7\xb5\xff\x81\ \x73\x00\xb4\xe4\x01\x93\x14\xc0\xcb\x1f\xfa\x3f\x05\xb0\x9d\xef\ \xff\x26\x05\x60\x7a\x58\x00\x28\x00\xf0\xb3\x11\x1a\x20\xcc\x16\ \x68\x80\x79\xb6\x41\x03\xac\xb3\x7d\x1a\x20\xcd\x74\xf1\xc1\x5d\ \x56\x50\x8e\xf3\x9c\xf8\xe4\x4e\xac\x3f\x66\x19\xd1\xff\xc4\x6d\ \xf4\x24\x12\x2e\xe9\x00\xf2\x16\xc8\x2f\x91\xfc\x19\x13\x34\xc0\ \x1c\x1b\xa6\x01\x42\xac\x83\x06\xf0\x11\x8f\xf3\xb5\xa7\x7c\x4b\ \xb4\x05\x6c\x51\x5b\xda\x44\x1e\xd0\x4a\x01\x34\x7f\x47\x5b\xa7\ \x5f\x2c\x6e\xea\xd5\xc6\x46\x9d\x02\xc2\x85\xdb\xb9\xee\xc8\x19\ \xe0\xa0\xe6\x3d\x20\xf4\xa3\x35\x59\xce\xb3\xe8\xe2\xaf\xcf\x88\ \xb3\x8a\xd5\xdc\x3e\x3e\xde\x62\x6b\xcb\x1a\x2d\x64\x9d\x7a\x8b\ \x63\x5a\x40\x1d\xe0\x17\x83\x62\x4c\xd5\x3f\x5e\x1a\x75\x67\xd4\ \xfc\xf1\x2f\x81\xdd\xa5\x14\xb6\x17\x2d\xe2\x7a\xe5\xb4\xbc\x7f\ \xce\x65\x39\x2f\x45\x25\xed\xe6\xb8\x86\xcc\x2c\xed\x86\x8c\xff\ \xbc\x0b\x1f\x9a\xbc\x2b\xf6\xfe\xe5\xc6\xf2\x63\xdf\xa1\xcd\xd8\ \xf7\x5b\xb3\x99\x1c\x6b\x23\x3a\x6e\x3f\x09\xd7\x48\xcc\xae\xd5\ \x43\x48\x70\x4b\x0d\x56\xcb\x8e\xcf\x2d\xd1\x7f\xd7\x25\xfd\x7b\ \x7b\xa2\x59\x6d\x80\xf7\xf8\x43\xf1\xe4\x9e\x9e\xc9\xe8\x7b\xc9\ \xf9\x90\xcf\x83\xd5\x3d\x03\x2d\xd1\xec\x50\x59\x96\x52\xa3\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x2b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\xed\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xcc\xcc\ \xcc\xd5\xd5\xd5\xff\x55\x55\xdf\xdf\xdf\xe1\xe1\xe1\xce\xce\xce\ \xe7\xe7\xe7\xe8\xe8\xe8\xe2\xeb\xeb\xca\xd3\xd3\xc9\xd0\xd0\xe3\ \xe9\xe9\xcc\xd1\xd1\xe2\xe6\xe6\xcd\xd0\xd3\xe4\xe6\xe6\xcd\xcf\ \xd1\xe4\xe6\xe6\xcc\xd1\xd3\xcc\xd0\xd2\xcc\xd0\xd2\xcc\xd0\xd2\ \xcc\xd0\xd2\xcb\xcf\xd1\xcf\xd3\xd5\xcc\xd0\xd2\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xe3\xe7\xe7\xcb\xd0\xd2\xff\x54\x54\xff\x56\ \x56\xff\x55\x55\xe4\xe7\xe7\xfc\x5c\x5c\xfc\x5d\x5d\xcc\xd0\xd2\ \xe4\xe6\xe6\xe4\xe7\xe7\xcc\xd0\xd1\xe4\xe7\xe7\xe4\xe7\xe7\xe5\ \xe7\xe7\xcf\xd3\xd4\xe4\xe7\xe7\xe4\xe7\xe7\xde\xe0\xe0\xcc\xd0\ \xd2\xd7\xda\xdb\xff\x55\x55\xff\x55\x55\xe4\xe7\xe7\xcc\xd1\xd3\ \xfe\x59\x59\xfe\x59\x59\xfe\x5a\x5a\xcc\xd0\xd2\xe4\xe7\xe7\xfb\ \x5f\x5f\xe8\x8e\x8f\xff\x55\x55\xe4\xe7\xe7\xff\x55\x55\x9a\x9d\ \x9f\xb7\xbb\xbd\xb8\xbb\xbe\xc6\xc9\xcb\xcc\xd0\xd2\xcd\xcd\xcf\ \xd8\xdb\xdc\xd9\xdc\xdc\xe4\xe7\xe7\xe5\xe4\xe4\xe7\x8e\x8f\xf2\ \x99\x99\xfe\x55\x55\xb3\x8f\x5a\x74\x00\x00\x00\x42\x74\x52\x4e\ \x53\x00\x04\x05\x06\x06\x10\x11\x15\x15\x16\x1a\x1d\x26\x2e\x37\ \x3e\x57\x66\x70\x70\x74\x78\x7c\x7d\x7e\x80\x80\x82\x87\x88\x89\ \x8b\x94\xa3\xa4\xa5\xa8\xae\xaf\xb4\xbb\xbf\xc4\xc6\xca\xcb\xd0\ \xd2\xd3\xdd\xe3\xe4\xe5\xe6\xe8\xec\xec\xed\xee\xf1\xfb\xfb\xfc\ \xfd\xfe\xfe\x8c\x26\x5b\xf7\x00\x00\x00\xab\x49\x44\x41\x54\x18\ \xd3\x4d\x8c\xe5\x02\xc2\x30\x0c\x84\x03\x0c\x77\xd7\x02\x1d\xee\ \x56\x5c\x87\x04\x28\x8c\xf7\x7f\x1c\xd6\xad\x48\xfe\xe4\xbe\x4b\ \xee\x00\x20\x91\x07\x39\xce\x66\x50\xac\x06\x66\x2d\x76\xf5\x78\ \x54\xec\xc0\x1a\x33\xe6\xbd\xcb\x3b\x0e\xf3\x12\x41\x4c\x9b\x3c\ \xf3\xc9\x6c\x19\x31\x65\xfc\x6f\xc2\x9f\x32\x7b\x1b\x71\xc2\x79\ \x1c\xbe\xe3\x9f\x5f\x4e\xf7\xea\x8f\xc1\x33\x3a\x1f\x31\xf7\xc7\ \x03\x7e\x43\xc4\xe4\x97\x87\x9c\x1f\xfa\x86\x13\x13\xa4\x14\xa7\ \x2b\xfd\xc1\x4b\xee\xf1\xf5\xb9\x65\x44\x01\xb2\xa7\x54\xd3\x5b\ \x36\x08\xed\x5e\x75\xaa\x11\x60\x14\x40\x5d\x7a\x8d\xdf\x45\xcd\ \x50\xcc\x32\x98\x08\x4b\x45\x34\xb5\xa2\x15\x84\x21\x95\x42\x98\ \xa8\x12\xf5\xa6\x7a\x03\xdf\x01\x19\x15\xe6\xf4\xb0\xfe\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x98\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x01\x5f\x49\x44\x41\x54\x38\x8d\x95\x92\xcd\x2e\x43\x51\ \x14\x85\xbf\xbd\xef\x4f\x0f\x69\xc5\x6f\x05\x89\x41\x07\x9d\x98\ \x89\x39\x89\x78\x29\x89\x17\x10\xef\x60\xd0\x81\x89\x91\x10\xc1\ \x80\x98\x92\x30\x37\x12\xa2\x83\x2b\x84\x54\xdd\xde\xde\x7b\x8e\ \x01\x4a\xa9\xc6\x5d\xb3\x93\xac\xf5\xed\xb5\xb3\x8f\x00\x1c\x1f\ \x6f\x9a\x99\xc9\x99\xd5\xe9\xa9\xca\x1a\xff\x90\xc3\x2e\x96\x46\ \xaa\xa7\x00\x3e\xc0\x28\xf5\xdd\x66\x73\x6c\x1c\xc0\x39\x87\xb3\ \xf6\xdd\xa9\x82\x8a\xf6\x85\xf9\x00\x82\x4c\x3b\x48\x00\xe2\xb8\ \xc9\xeb\xeb\x0b\x00\x61\x68\x28\x16\x87\xfa\x03\xa2\xc3\xf2\xf5\ \x1d\x59\x8b\x0f\x40\xa1\x60\xf0\xfc\xa0\x63\x48\xda\xc9\x97\xd9\ \xf3\x50\xf5\x7e\x35\x98\x45\xb8\xea\x04\x92\x16\x71\x1c\xf7\x9c\ \x66\x8c\xc1\x98\x41\x24\x89\x4c\xd7\x0a\x5d\xc4\x20\xc0\x20\xbd\ \xeb\x06\xef\xf6\xe4\x7a\x63\x3d\x3a\x1a\x0f\x26\x56\xee\xf7\x7e\ \x01\xb2\x34\x23\xfd\x56\xfb\xbb\x54\x05\xbc\x8f\xf5\xac\x57\xea\ \x6a\x20\x2e\x73\xae\x71\x76\x12\x60\x25\xe8\x5d\x00\x12\xb0\x09\ \x38\x5a\x6d\x7f\xb8\xba\xfc\x70\x31\x5f\xe9\x00\x42\x77\xfb\x94\ \x46\xfb\x4b\x7f\x44\xbb\x9b\xf8\x00\x25\xc4\x71\xd9\x39\xf2\xb0\ \x9e\x4f\xfd\x27\xfc\x43\x35\x05\xf0\x68\x3f\x1a\x8d\xaa\x39\xc3\ \x59\x6a\xb3\x2d\x05\x28\xf9\x37\xcf\x79\x47\x0b\x1c\x4d\x2c\x1c\ \xd4\x15\x48\x8b\x85\xfa\x5c\x5e\x80\x15\x6a\x00\x2a\x1a\x5e\xa8\ \x27\x39\xf7\x97\x46\x1a\x36\x77\x00\x54\x07\x26\x7b\x7f\xbb\x7e\ \x72\x6e\xbb\x3c\x77\xd2\x00\x50\x06\xca\x95\x9c\x71\x8b\xb0\xf9\ \xf9\x78\x03\xf4\x6d\x6e\xa7\xf1\x54\xde\x87\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x01\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\xc9\x50\x4c\x54\x45\x00\x00\x00\x99\x00\x00\xaa\x00\ \x00\xb0\x06\x06\xb1\x06\x06\xae\x05\x05\xff\xd7\xd7\xfd\xd6\xd6\ \xfd\xd4\xd4\xff\xd4\xd4\xbb\x11\x11\xbb\x12\x12\xbc\x12\x12\xbc\ \x11\x11\xbc\x12\x12\xbb\x12\x12\xc4\x12\x12\xc4\x13\x13\xbc\x12\ \x12\xc6\x1a\x1a\xc6\x1c\x1c\xc6\x1b\x1b\xca\x20\x20\xc3\x12\x12\ \xc9\x20\x20\xca\x20\x20\xca\x21\x21\xc4\x11\x11\xd6\x2c\x2c\xd6\ \x2d\x2d\xd7\x2d\x2d\xd8\x26\x26\xd8\x26\x26\xd8\x22\x22\xd8\x23\ \x23\xf2\x48\x48\xff\xd5\xd5\xff\xd6\xd6\xf2\x24\x24\xf3\x25\x25\ \xf5\xca\xca\xf5\xcb\xcb\xf5\xcf\xcf\xf5\xd0\xd0\xf7\xaf\xaf\xf8\ \xa8\xa8\xf8\xaa\xaa\xf8\xab\xab\xf8\xac\xac\xf8\xd6\xd6\xf9\xd6\ \xd6\xfc\x52\x52\xfd\x69\x69\xfd\xd6\xd6\xfe\x3d\x3d\xfe\x41\x41\ \xfe\x63\x63\xff\x2a\x2a\xff\x2b\x2b\xff\x30\x30\xff\x31\x31\xff\ \x39\x39\xff\x43\x43\xff\x4f\x4f\xff\x50\x50\xff\x54\x54\xff\x55\ \x55\x01\x9e\x22\xa4\x00\x00\x00\x26\x74\x52\x4e\x53\x00\x05\x06\ \x2d\x2e\x2f\x9f\xa0\xa1\xa1\xa4\xa6\xa7\xa8\xa8\xa9\xba\xbf\xc1\ \xcc\xcc\xcd\xd9\xda\xda\xda\xda\xdc\xe7\xe8\xe9\xef\xf0\xf2\xf3\ \xfc\xfe\xfe\x6d\xc0\x5f\xbf\x00\x00\x00\xc1\x49\x44\x41\x54\x18\ \x19\x25\xc1\x8b\x62\xc1\x30\x00\x05\xd0\x2b\x55\xb4\x1e\xc3\x5a\ \xca\x86\xd1\x62\x6b\x0c\x59\x04\x31\x6c\xee\xff\x7f\x94\xd0\x73\ \xf0\xe0\xbf\xc4\xc3\x24\x6e\xfa\x28\x88\xce\x87\xa6\xa3\x47\xa1\ \x80\x23\xde\x96\xe7\x1b\x9f\xd2\xae\x00\xd0\x59\x5a\x7b\x65\x21\ \x0d\x01\x7f\x7a\xb2\xf6\xb0\x95\x72\xb5\x23\x39\x2e\xa3\xa5\xff\ \x2f\xfb\x2f\x65\x8c\xca\x8f\xa4\x6e\x20\x26\xb9\xfe\xc9\x2a\xd5\ \x4c\x6d\x48\x46\x18\x90\x94\xa6\x0a\x04\x46\x92\x4c\x30\x20\x29\ \x4d\x0d\x08\x4c\x4e\xb2\x87\x98\xe4\x4a\x65\xb5\x60\xae\xd6\x24\ \x23\x34\x35\xb9\xcb\x95\x31\xea\xf3\x70\xbd\xe9\x3a\xbc\x77\x92\ \xc7\x8d\x94\xdf\x7b\x6b\x7f\x27\x1e\x10\xa6\x2c\x5c\xac\x5d\xb4\ \x01\x88\x6e\xca\xa7\xbf\xd3\xa2\x5f\x82\x23\xc2\x91\xa6\xa3\x67\ \xed\x12\x0a\xe5\x46\x34\x4c\x5e\xeb\x1e\x9c\x3b\x1b\x12\x25\xbf\ \xcd\xcc\x1a\x0a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x04\xc5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\xb6\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\x80\ \x00\xff\xbf\x00\xff\xcc\x00\xff\xaa\x2b\xea\xbf\x15\xeb\xb1\x14\ \xed\xb6\x12\xee\xbb\x11\xef\xbf\x10\xf0\xb4\x0f\xf1\xb8\x1c\xe6\ \xbf\x1a\xe8\xb9\x17\xe8\xb9\x17\xe9\xbc\x17\xe9\xbd\x16\xea\xb8\ \x15\xea\xba\x15\xea\xbb\x15\xeb\xba\x14\xec\xbc\x18\xec\xb9\x16\ \xec\xba\x16\xec\xbb\x16\xe9\xbb\x16\xea\xb9\x15\xea\xba\x15\xea\ \xbb\x15\xeb\xb9\x17\xeb\xba\x17\xec\xba\x16\xec\xbb\x16\xec\xb9\ \x15\xea\xb9\x15\xeb\xba\x17\xeb\xb9\x17\xea\xba\x17\xeb\xb9\x17\ \xeb\xba\x16\xeb\xbb\x16\xea\xb9\x17\xeb\xba\x16\xeb\xba\x16\xeb\ \xbb\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xbb\ \x16\xeb\xb9\x16\xeb\xba\x16\xeb\xbb\x16\xeb\xb9\x15\xec\xbb\x17\ \xec\xba\x16\xea\xb9\x16\xeb\xba\x16\xeb\xbb\x16\xeb\xb9\x16\xeb\ \xba\x16\xeb\xba\x15\xeb\xbb\x15\xeb\xba\x17\xeb\xba\x17\xeb\xba\ \x16\xeb\xbb\x16\xeb\xba\x16\xec\xba\x16\xeb\xba\x15\xeb\xba\x17\ \xeb\xba\x17\xeb\xbb\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xea\ \xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x16\xeb\xba\ \x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\ \xea\xba\x16\xeb\xba\x16\xeb\xba\x17\xeb\xba\x16\xeb\xba\x16\xeb\ \xba\x16\xeb\xbb\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\ \x16\xeb\xba\x16\xeb\xba\x16\xeb\xbb\x18\xeb\xbb\x19\xeb\xbc\x1b\ \xec\xbd\x1f\xec\xbd\x20\xec\xbe\x22\xec\xbf\x27\xed\xc1\x2e\xed\ \xc2\x30\xee\xc4\x39\xef\xc7\x42\xef\xc8\x46\xf0\xcb\x50\xf0\xcc\ \x51\xf0\xcd\x56\xf1\xcf\x5c\xf1\xcf\x5d\xf2\xd0\x62\xf2\xd4\x6d\ \xf3\xd6\x73\xf4\xd9\x7f\xf4\xd9\x80\xf4\xda\x83\xf5\xdd\x8b\xf6\ \xdf\x92\xf6\xe1\x9a\xf7\xe3\xa2\xf8\xe6\xaa\xf8\xe8\xb1\xf9\xeb\ \xbc\xfa\xed\xc1\xfb\xf0\xcc\xfb\xf1\xd0\xfb\xf3\xd6\xfc\xf3\xd7\ \xfc\xf4\xda\xfc\xf6\xe2\xfd\xf9\xe9\xfd\xf9\xec\xfe\xfb\xf1\xfe\ \xfb\xf2\xfe\xfd\xf7\xff\xfe\xfb\xff\xff\xfe\xff\xff\xff\xe7\xe5\ \x51\x95\x00\x00\x00\x64\x74\x52\x4e\x53\x00\x01\x02\x04\x05\x06\ \x0c\x0d\x0e\x0f\x10\x11\x12\x14\x16\x21\x22\x23\x24\x30\x31\x34\ \x35\x50\x51\x52\x53\x54\x55\x56\x58\x59\x5d\x5e\x5f\x62\x64\x66\ \x6f\x71\x72\x74\x7c\x7d\x7e\x7f\x80\x81\x82\x89\x8a\x8b\x8d\x8e\ \x8f\x9d\x9f\xa1\xa3\xa4\xa5\xa6\xa7\xb3\xb4\xb5\xc1\xc2\xc4\xc5\ \xca\xcb\xcc\xcd\xce\xcf\xd0\xd3\xd4\xd5\xd6\xdd\xde\xe0\xe8\xe9\ \xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf8\xf9\xfa\xfd\xfe\xdf\x19\ \xb5\xb1\x00\x00\x02\x5a\x49\x44\x41\x54\x58\xc3\xad\x97\x67\x5b\ \x13\x51\x10\x85\x67\x31\x82\x80\x89\x41\x8a\x09\xb1\x57\x52\x00\ \x21\x01\x15\x12\x54\x40\x11\x31\x22\x51\xc0\x5d\x50\x03\x3b\x4a\ \xb1\xf7\xde\xbb\xa2\x38\xff\xd8\x0f\x46\xcc\xee\xde\x9a\xf5\x7c\ \xdd\x39\xef\xf3\xdc\xe4\xce\xdc\x33\x00\x1c\x85\x62\xed\x03\xa3\ \x05\x6b\x6e\xce\x2a\x8c\xe6\x52\xad\x21\xd0\x52\x4b\x4f\xde\x46\ \x87\xec\x7c\xa6\x59\xd5\xbd\x21\x7e\x0e\x99\x1a\x8f\xd7\x28\xd8\ \x37\x76\x5a\xc8\x95\xd5\x51\x2f\xb1\x1b\xbb\xa6\x50\x28\x73\x7f\ \x95\xc8\xbf\xf9\x04\x4a\x35\xdc\xc0\xf7\x47\x66\x50\x41\x97\xb7\ \x73\xec\x55\xbd\xa8\xa8\x0c\xf3\x18\xeb\x73\xa8\xac\x6c\x80\xe1\ \x3f\x8e\x1a\x3a\xe6\x21\x18\x47\x50\x4b\x39\xf7\x29\x7a\x51\x53\ \x69\xa7\x7f\x2b\x6a\x6b\x47\xb9\xbf\x61\x56\x1f\x30\x1b\x2e\xfb\ \x01\xbc\xf7\xe7\xfe\xab\x9b\x32\xc2\x90\xb1\x06\xd8\xeb\xfd\xfa\ \x91\x56\x1e\xcb\x08\xbb\xd7\xfa\x67\xda\xfb\xf1\x33\x11\xbd\xbb\ \x21\x06\x4c\xd6\x95\x00\x07\x91\x0d\xa0\xef\x8f\xc4\x84\x54\xa9\ \xff\x2d\x1e\x80\xe8\xed\x75\x61\x6b\xfe\x99\x0f\x71\xe4\x03\xe8\ \xdb\x43\x11\xa1\x0d\x00\x00\xf2\x22\x00\xd1\x9b\x65\x3e\x60\x1c\ \x00\xa0\x05\xc5\x00\xfa\x7a\x8f\x4f\x68\x02\x80\x1e\x19\x80\x7e\ \xbd\x5e\x12\x5d\xe8\xb3\x52\x00\xd1\x97\x3b\x1c\xc0\x18\x40\xc8\ \x56\x00\xd0\xea\xcb\x05\x66\x99\x1d\x84\x18\xaa\x00\x88\x3e\xdd\ \x66\xd6\x45\xa1\x43\x11\x40\xab\x2f\xae\x31\xea\x92\x30\xa0\x0a\ \x20\xfa\x70\xcb\x5b\xd7\x0f\xa7\xd4\x01\xf4\xf3\xf9\x55\x77\xdd\ \x49\x38\xaf\x01\x20\x7a\xef\x6e\xf2\x02\x98\x5a\x00\xfa\xf1\xc4\ \x59\x37\x0d\x45\x3d\x00\xd1\x33\x47\xdd\x15\x7d\xc0\x53\x17\x40\ \xf3\x08\x2b\x9e\x23\xf8\xfe\x11\x7d\xff\x8d\x39\x7f\x17\xa9\x0f\ \xda\xfd\x5d\xe5\x04\xb4\xfa\x6b\xa6\x88\xcf\x76\x9e\x0f\x72\x46\ \xa2\xea\x40\x39\xad\x38\xd2\x16\x79\x23\xad\x1b\x00\x9a\xa5\x43\ \xf5\x2e\x7f\xa8\x36\xfe\x8f\xb1\x2e\x79\x58\x1e\xc8\x1f\x96\x1a\ \xbf\x4f\x1b\x74\x56\xfa\xb8\x26\x4b\xaf\x73\xfd\x54\x65\xcf\xfb\ \x85\xda\xbf\x01\x61\x4f\x65\x01\x63\xe7\xbf\x88\x33\x5c\x49\xc4\ \x19\x34\xfc\x85\xac\x99\x70\x79\x4c\x8b\xe9\x03\xa2\xce\xa0\x98\ \xd1\xf5\x77\xb9\xa3\xee\x61\x3d\x7f\xd6\x13\xd8\x03\x5a\x61\xfb\ \x28\x23\xae\xaf\x3b\xa4\xee\xef\x0b\x30\xf7\xa5\xb4\xa2\xdd\xee\ \x32\x38\x3b\xcb\x16\x4b\xc5\x7f\x69\x1b\x7f\x69\x0a\x0f\xc9\xfd\ \x83\x9b\xc4\x6b\xdf\xa4\x64\xed\xdb\x67\x48\x36\xc7\xba\x94\xc9\ \xb7\x5f\x4c\xd6\x2a\xec\xae\xd5\x6d\xec\xe0\x86\xf9\x03\xd5\xaa\ \xeb\x73\x53\xfa\xcc\xbc\x6b\x7e\x8f\x75\x37\xea\x2d\xf0\xc1\x68\ \x22\x3b\x32\x61\x16\x8b\xe6\xc4\x48\x7f\x22\x12\xe4\xd5\xfd\x06\ \x83\x77\x3d\xae\xb2\x5e\x73\x32\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x02\x70\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x75\x00\x00\x04\x75\ \x01\x10\x84\x8b\xaa\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\xed\x49\x44\ \x41\x54\x38\x8d\x9d\x91\x4b\x68\x13\x51\x14\x86\xff\x73\x67\x68\ \x63\x0c\xae\x0a\x1a\x8a\x32\x3e\x40\x9a\xb5\x5a\xa4\x74\xda\x4e\ \x15\x24\x11\x71\xe1\x04\x8a\xb5\x83\x88\x45\x8b\xd8\x2c\xdc\x95\ \xca\x05\xab\x0b\x11\xac\x4f\x8a\xa0\x88\xdd\x48\xb3\xb0\x98\xb8\ \xe9\xc2\x59\x74\xe7\x46\xa1\x68\x02\x1a\x35\x62\x05\xad\x96\x60\ \x4c\x13\x27\x93\xb9\x2e\x24\x3a\x4e\x67\x44\x3c\xbb\xf3\xf8\xbe\ \x03\xe7\x10\xfe\x23\xfa\x67\x07\x2f\x02\x18\x21\xd0\x24\x35\x8b\ \x66\x6f\xaf\x1c\x8d\x86\x8f\xc8\xb2\xfd\x68\xdb\xf4\xdc\xa7\x40\ \x5a\x80\xfa\x67\x07\xab\x20\xb4\x02\x28\xb3\x66\x7d\x43\x7b\xb8\ \x43\x10\xee\x14\xea\xa1\xd4\xdf\xb6\x6b\x09\xa3\x1b\x45\xe4\x00\ \xd4\x04\xe8\xc6\x1f\xcd\xa7\x87\x0f\x74\xed\x8b\x0f\x4d\x6b\xfb\ \x87\x76\xf9\xc2\x71\x43\xd5\x12\xc6\x35\xce\xf9\xaf\xc5\xe4\x1d\ \xd2\x75\xbd\xe5\xf3\xb7\xb5\xb7\x48\x72\x6e\x3e\xce\xde\x7b\xe2\ \x86\x41\xd0\xd5\x9d\x9b\x47\x39\xe7\x4e\xa0\xa0\x29\xf9\xb2\xb2\ \xee\xf6\x9a\x4d\x3d\xb2\x90\x43\x31\xb2\xca\x0b\xb5\xc5\xf9\x52\ \xf7\x0e\xe5\xb4\x1b\x0e\x14\x00\x40\xe2\xd4\xfd\x31\x10\x9b\x68\ \xe6\x4c\xc2\xd1\xcc\x64\xf2\xae\x77\x8e\x79\x0b\xbf\xd5\xb4\xd1\ \x9d\x0a\x47\x28\x7e\x63\x81\x02\x6b\xf9\xd5\x82\x80\x63\xff\xa4\ \x1b\x96\xb5\x94\x7b\xf6\xcf\x02\x2d\x6e\xa8\x8d\xe5\x97\xdb\x25\ \xc6\xb6\xd6\x97\x9e\xcf\x91\x5d\xda\x52\x2f\xbd\x3d\xe8\xf7\x9d\ \x55\x02\x2d\x6e\xa8\x10\x74\x48\xed\x54\x52\x99\x2b\xc9\x77\x76\ \xb9\x58\xcc\x4e\x9d\x5c\x6c\x8b\x54\x86\x45\x83\x8d\x78\x25\x6c\ \x15\x4c\xd0\xd5\x4e\x25\xe5\xbd\x76\x3a\x9d\xb6\xda\x22\x95\xe1\ \x3d\xb1\xf7\x17\x0a\x0f\xdb\xe7\xdf\x98\x4a\x08\x00\x64\x3d\x37\ \xb3\x9b\x31\x1a\x58\x31\x5f\xe7\x2b\x99\x17\x1d\xde\x3f\x7b\x25\ \x97\xb3\xeb\x67\x04\xa4\xb3\xe1\xea\xd7\x16\x00\x35\x4a\xe6\xd3\ \x1f\x08\x88\x8a\xef\x8d\x6a\xec\x41\x3e\xe2\x86\xcf\x9c\x33\xa7\ \x1c\x21\x8e\x31\xa2\xf3\x97\xc6\xfb\xb8\xef\x11\x09\xf8\x08\x00\ \xd4\xca\x0a\x6e\x98\x73\x53\x16\x10\xc7\x89\x48\x16\xc0\x09\x3f\ \x18\x00\x18\xa3\xfa\x5e\x10\x06\x1c\x09\x9a\xbb\xc1\x79\x9f\x2d\ \x04\xbb\x0e\xa0\x0c\x12\x57\x83\x04\x3f\x00\x48\x47\xbc\x2d\xa6\ \x6b\xdb\xa2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xdc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x02\xa3\x49\x44\x41\x54\x38\x8d\x5d\x93\x4d\x68\x94\x57\ \x14\x86\x9f\x73\xef\xfd\x32\xa9\x63\x83\x46\x52\x22\xfe\x41\xb0\ \x82\x3f\x60\x8b\xab\x62\xa0\x83\x01\x25\x64\xd3\xc6\xcc\x48\xa1\ \xb6\x8b\xba\x50\x24\xd0\x55\x5d\x18\xa8\x56\x04\x85\x2e\x2c\x08\ \x05\x17\x75\xa7\x26\x1f\xcd\xae\x44\x50\xa8\x5d\xb8\xb0\x25\x9b\ \x92\x4c\xa4\xd8\x16\x51\x02\xb6\xd1\x68\xcc\x7c\x66\x7e\xee\x39\ \x2e\x4c\xc6\x24\xef\xee\x1e\xde\xf7\x9c\x77\xf1\x5c\x61\x95\xac\ \xbf\x7f\x1b\x21\x1c\x43\x35\x8f\x48\x03\xb3\x35\x38\x17\x50\xfd\ \x0f\xd5\x2b\x32\x3a\xfa\x78\xb9\x5f\x56\x84\x8f\x1c\xd9\x43\x8c\ \x9f\xd0\x68\x5c\x26\x97\x7b\x8f\x18\xf7\xe0\x9c\x62\xf6\x07\x31\ \x06\x42\x18\xc4\xec\x2f\x49\xd3\x2b\x4b\x19\xd7\x0c\x17\x8b\xa7\ \x65\x78\x78\x02\xb3\x9b\x24\xc9\x45\x54\x7b\xf0\x7e\x1a\xb3\x39\ \xcc\x8e\xe1\xfd\x49\xbc\xbf\x00\xd4\x6c\x60\x60\x70\x45\x03\x2b\ \x95\x8e\x63\x36\x81\x59\x0e\xf8\x98\xf6\xf6\x73\xd4\x6a\x9e\x2c\ \x3b\x8b\x99\x60\xf6\x37\xaa\xbf\xe0\xdc\x59\x54\x87\xf0\xfe\x33\ \xe0\x37\x49\xd3\x71\x67\xbd\xbd\x39\x54\x77\xd2\xd2\xf2\x27\xce\ \xf5\x23\x72\x89\xd9\xd9\x1f\xa9\x54\xea\x32\x32\x72\x4a\xd2\xf4\ \x1b\x44\xee\x11\xc2\xb7\xa8\x0e\x11\xc2\x77\xc0\x65\xcc\xbe\x00\ \x10\x2b\x95\x0e\x2d\x5e\xe9\xc2\xfb\x5f\x89\xf1\x73\x44\x2e\x01\ \xbb\x80\x4f\x81\x77\x50\xfd\x89\x24\x99\x46\xf5\x2b\x54\xef\x01\ \x2d\x40\x37\x95\xca\x90\x43\x75\x2f\xde\x4f\xe2\x5c\x97\x0c\x0f\ \x4f\xe1\x5c\x8e\xd6\xd6\x0c\x91\xc3\x92\xa6\x5f\xb3\x7b\xf7\x09\ \x9c\x3b\x4e\x8c\x4f\x50\x6d\x63\x66\xe6\x16\xd0\x0d\xfc\x4e\x3e\ \xbf\x2f\x20\xd2\x46\xb5\x9a\xe1\xbd\x59\xa1\x10\x80\x1a\x0b\x0b\ \x1b\x81\x09\x2b\x16\xbb\x29\x97\x1d\x22\xa3\xc0\x7e\x44\xa6\xd8\ \xb0\x61\x3b\x00\xde\x4f\x61\xb6\xcf\x61\x36\x47\x08\x09\x22\x46\ \x47\x87\xa1\x9a\x30\x3f\xff\x08\xd8\x84\xf7\x0f\x31\xfb\x10\xe7\ \xc6\x81\x0f\x30\x7b\x84\x73\x5b\x00\xc8\xb2\x7f\x80\xb5\x01\x78\ \x80\xc8\x5e\xcc\xca\x38\xb7\x93\x18\xbd\x8c\x8d\x55\xad\x54\x6a\ \xe5\xc6\x8d\xc7\x0c\x0c\x6c\x3e\x78\xe8\x7c\xfe\xe8\x83\xdb\x3d\ \xf7\xdb\xb7\xb6\xad\x5b\x78\xb9\xbe\x33\x9b\xdd\x7e\x6d\xc7\x81\ \x7e\xcc\x3d\x0b\x24\xc9\x5d\xea\xf5\x2f\x81\x32\x31\xae\x07\x6a\ \x56\x28\x04\xcc\x44\xc0\xec\x0d\x2c\x3d\xd7\xde\xef\xe9\x03\xfa\ \xde\x52\x47\x1f\x58\xd5\xc9\xf5\xeb\x4f\xa8\x54\x7e\x40\xa4\x8a\ \x73\x39\x9c\x9b\xa6\xb3\x73\x23\x22\x4d\xc8\x96\xd4\xe2\x85\xef\ \x7b\x37\x71\xa0\xeb\xdd\xe6\xcc\x01\xc8\xd8\x58\x15\x91\xea\x22\ \x48\x2f\xa8\xd7\xdb\x50\xb5\xe5\xe1\xe0\x84\xc1\x8f\x3a\xf8\x77\ \xb6\xc6\xd6\x75\x09\xfb\xb7\xe5\x57\xa2\x8c\xd9\x0c\x22\x2f\x81\ \x79\x42\x58\xf3\xf6\xb7\x88\x01\x44\x35\xae\x8e\x3f\x65\x6e\x21\ \xf2\xf3\xe4\x73\xee\xff\x5f\x7d\xb3\xb8\xe9\x4b\xd3\x32\x80\x15\ \x0a\x81\x42\x41\x99\x9c\x2c\x2e\x6f\x60\xc0\xb3\x57\xb1\xf9\x7e\ \x9a\x35\x56\x35\x58\x5a\x74\xe7\x4e\x43\xce\x9c\x51\x54\x47\x16\ \x1b\x64\xab\x3d\xcb\xf5\x1a\xa4\x95\x20\xfe\xe0\x80\x11\x90\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x9c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\xa3\x50\x4c\x54\x45\x00\x00\x00\x33\xcc\x99\x2b\xaa\ \xaa\x1a\xb3\x99\x24\xb6\x92\x5b\x5b\x6d\x55\x63\x71\x23\xb9\x97\ \x27\xba\x9d\x45\x45\x58\x40\x8e\x80\x24\xb8\x9a\x27\xb7\x9b\x27\ \xb8\x99\x26\xba\x98\x27\xb8\x9a\x26\xb9\x9a\x26\xb8\x99\x25\xb9\ \x9a\x26\xb9\x99\x26\xba\x99\x29\xb2\x97\x25\xb9\x99\x25\xba\x9a\ \x26\xb8\x99\x54\x5e\x73\x26\xba\x98\x26\xba\x99\x26\xb9\x99\x26\ \xb9\x98\x26\xb9\x9a\x54\x5e\x74\x27\xb9\x99\x40\x46\x55\x26\xb9\ \x99\x26\xb9\x99\x4b\x52\x68\x69\x76\x9c\x4e\x56\x6d\x6c\x7a\x9e\ \x70\x7d\xa6\x26\xb8\x99\x7a\x89\xb7\x77\x86\xb2\x26\xb8\x98\x7e\ \x8d\xbd\x26\xb9\x99\x26\xb9\x99\x26\xb9\x99\x81\x91\xc3\x84\x94\ \xc7\x26\xb9\x99\x27\xb7\x98\x27\xb9\x99\x28\xb6\x98\x28\xba\x9a\ \x29\xb3\x96\x29\xba\x9a\x2a\xb0\x95\x2a\xb9\x9a\x2b\xaf\x95\x2b\ \xbb\x9b\x2c\xbb\x9c\x2d\xba\x9a\x2d\xbb\x9c\x2e\xa9\x92\x2e\xbb\ \x9c\x2f\xa7\x91\x30\xa6\x91\x34\xbe\xa0\x36\xbc\x9e\x37\x98\x8b\ \x38\x95\x8a\x38\xbd\x9f\x3d\x8c\x86\x3d\xc0\xa4\x3e\x89\x85\x40\ \x46\x56\x40\xc1\xa5\x40\xc2\xa5\x45\x7c\x7f\x45\xc3\xa7\x46\x79\ \x7f\x4a\x73\x7b\x4b\xc2\xa6\x4b\xc5\xaa\x4b\xc5\xab\x4e\x69\x78\ \x4f\xc6\xac\x50\xc4\xa7\x51\xc7\xad\x52\x62\x74\x52\x63\x75\x52\ \xc4\xa8\x53\xc5\xa9\x54\x5e\x73\x57\xc9\xb0\x58\xc9\xb1\x5e\xcb\ \xb3\x61\xc8\xad\x65\xc9\xaf\x6b\xca\xb1\x70\x7d\xa3\x73\xcc\xb3\ \x73\xd2\xbd\x76\xca\xb2\x76\xd3\xbf\x78\x7f\x8c\x7a\xd4\xc1\x7d\ \x8e\xbc\x7d\xce\xb7\x7e\xc6\xac\x7f\x8b\xae\x7f\x90\xbe\x82\x92\ \xbf\x86\x94\xba\x86\x97\xcb\x86\xbe\xb0\x87\xd1\xba\x87\xd8\xc7\ \x88\x8d\x97\x8b\xda\xc9\x8c\x92\x9a\x8f\x9a\xb9\x91\xd3\xbd\x92\ \xd4\xbe\x99\xa2\xba\x99\xde\xcf\x9a\xc4\xb8\x9a\xd5\xc1\x9a\xde\ \xcf\x9e\xe0\xd1\x9f\xa2\xa7\xa2\xd8\xc4\xa3\xd9\xc4\xac\xdb\xc7\ \xae\xda\xc8\xb0\xe5\xda\xb2\xe6\xdb\xb6\xdd\xca\xbd\xdf\xcd\xc0\ \xc0\xbd\xc0\xeb\xe1\xc3\xce\xb8\xc7\xed\xe5\xc9\xe2\xd1\xca\xc9\ \xc5\xcb\xee\xe7\xd5\xd0\xbb\xd5\xd0\xbc\xd5\xd1\xbc\xd5\xf2\xeb\ \xd7\xd2\xbe\xd8\xd2\xbe\xd8\xd3\xc0\xd8\xd4\xbf\xd9\xd3\xc0\xd9\ \xd4\xc0\xd9\xd4\xc1\xd9\xd5\xc1\xda\xd5\xc2\xda\xf3\xed\xdb\xd6\ \xc3\xdb\xe6\xd7\xdc\xe7\xd8\xdd\xd8\xc5\xdd\xd8\xc6\xde\xd9\xc7\ \xde\xda\xc8\xdf\xda\xc9\xdf\xdb\xc9\xdf\xdb\xca\xe0\xdb\xc9\xe0\ \xdb\xca\xe1\xdc\xca\xe1\xdd\xcb\xe1\xdd\xcc\xe2\xdd\xcc\xe2\xde\ \xcc\xe2\xe8\xda\xe4\xe0\xd0\xe5\xe0\xcf\xe5\xe8\xdb\xe5\xf6\xf3\ \xe6\xe1\xd1\xe6\xe1\xd2\xe6\xe2\xd2\xe6\xe3\xd3\xe6\xe9\xdb\xe7\ \xe2\xd3\xe7\xe3\xd3\xe7\xf7\xf4\xe8\xe3\xd5\xe8\xe4\xd4\xe8\xe4\ \xd5\xe9\xf8\xf5\xea\xe6\xd7\xea\xe7\xd8\xeb\xe6\xd8\xeb\xe7\xd9\ \xeb\xe8\xda\xeb\xf8\xf5\xec\xe8\xda\xec\xe9\xdb\xec\xea\xdd\xed\ \xe8\xda\xed\xe9\xdb\xed\xe9\xdc\xed\xea\xdd\xee\xe9\xdc\xee\xea\ \xdc\xee\xea\xde\xee\xeb\xdd\xee\xeb\xde\xef\xeb\xdd\xef\xeb\xde\ \xf1\xfa\xf8\xf5\xfc\xfa\xf6\xfc\xfb\xf8\xfd\xfc\xfa\xfd\xfd\xfc\ \xfe\xfe\xfd\xfe\xfe\xfe\xff\xff\xff\xff\xff\x35\x30\x4e\x09\x00\ \x00\x00\x33\x74\x52\x4e\x53\x00\x05\x06\x0a\x0e\x0e\x12\x16\x1a\ \x1a\x24\x2b\x2e\x41\x4a\x56\x6a\x6c\x74\x78\x7a\x8e\x8f\x97\x9b\ \xa0\xa9\xad\xb6\xc2\xc4\xcb\xcd\xd4\xdd\xdf\xdf\xdf\xe1\xe2\xe4\ \xeb\xec\xed\xf1\xf4\xf9\xfa\xfc\xfd\xfe\x35\x81\xb1\xfd\x00\x00\ \x02\x75\x49\x44\x41\x54\x58\xc3\x63\x60\xc0\x0e\x14\x7d\x61\x80\ \x93\x81\x2c\x40\x8a\x01\x92\xf2\x48\x40\x5d\x17\x02\x54\xe0\x06\ \x68\x41\x04\xb4\x91\x55\xc9\xb3\x22\x1b\x20\x1f\x8f\x04\xd2\x4a\ \x20\x40\x0d\x6e\x80\x21\x44\x20\x17\x59\x55\x3c\x1b\xb5\x0d\xc8\ \x6e\x81\x81\x02\xa8\x01\x1a\xaa\x30\x60\x04\x11\x28\x84\x2b\xa9\ \xc2\x62\x40\xcb\x75\x18\xa8\x2e\xc1\x01\x8a\xe0\x4a\x26\xd1\xd6\ \x80\xba\x22\x1c\xa0\x98\x48\x03\x88\x00\xa3\x06\xd0\xd4\x80\x83\ \x1b\x51\xc0\x86\xb3\xa4\x1a\x30\x73\x0a\x2a\x58\x4f\xaa\x01\x3b\ \x96\xa3\x80\x15\xc7\x47\xa3\x91\x74\x03\x56\xce\x20\x00\x16\x9c\ \xc7\x6f\xc0\xdc\x29\x04\xc0\xb4\xe3\xf8\x0d\x38\x7d\x80\x00\x38\ \x36\xfc\x63\xe1\xd4\xee\x5d\x28\x60\xdf\xa5\xeb\xd7\x8f\x03\xc3\ \xed\xd2\x3e\xa8\xc0\x11\x02\x06\xcc\x42\x0f\xf5\xd5\xd7\x2f\x4d\ \x9b\x76\xe9\xfa\x1a\x18\x7f\x2a\x81\x58\x58\x35\x07\x15\xcc\xdd\ \x79\xfd\xda\xd2\x65\xd7\xae\xef\x9c\x0b\x15\x58\x74\x71\x34\x33\ \x11\x32\x60\xeb\x72\x02\x60\xed\x65\xd2\xca\x44\x4c\x70\x14\xbf\ \x01\x87\xd6\x6f\xc4\x0f\xb6\x2c\xee\x6e\xab\x6d\x6d\x08\x27\x33\ \x0c\xb6\xd5\x46\x9a\x1a\x83\x81\xa3\x17\x17\xe9\x06\x5c\x68\xf4\ \x34\x46\x00\x1d\x61\x46\x12\x0d\xd8\x93\x62\x8c\x0a\xe4\xd8\x49\ \x32\x60\x73\x88\x31\x3a\x50\xe2\x20\xc1\x80\x33\xc9\xc6\x98\x40\ \x81\x19\xdd\x80\xe5\x38\x4b\xd3\x7c\x63\x6c\x40\x1c\xdd\x80\x79\ \xb8\xa2\xbf\xdf\x1e\x5d\x6f\xf3\x64\x57\x63\x63\x03\x6e\x34\x03\ \xce\x1d\xc2\x51\x98\x66\xa2\xeb\xcf\x78\xf0\x20\x02\x48\x49\x13\ \x19\x06\x67\xdc\xd0\xf4\x7b\xdf\x78\xd0\x09\xa2\xf5\x58\x88\x33\ \xa0\x07\x4d\xbf\xf9\x84\x07\xfb\x5d\xc1\x2c\x7e\xe2\x0c\xa8\x41\ \x33\xa0\xfc\xc1\xbd\x24\x08\x4b\x0c\xd5\x80\x13\xa8\x65\xea\xde\ \x2b\x50\x03\xf2\x20\xaa\xc3\xa2\x20\x74\xe8\xed\x07\xcd\x50\xa3\ \xa4\x50\x0d\x98\x8d\x16\xf8\x9b\xa0\x06\xa4\x82\x15\xdb\xdd\xba\ \x57\x09\xa2\x6d\xa7\x3f\x58\xe8\x00\x35\x40\x16\xd5\x80\x75\xa8\ \x65\xea\xfc\x43\x50\x03\xd2\x21\xaa\xfb\x1e\x3c\xe8\x02\xea\xac\ \x7f\x70\x27\x02\xe6\x19\x19\xe2\xc2\xa0\x0c\xa2\xda\xb2\xe9\xc1\ \x83\xe9\x7e\x89\x77\x1f\x54\xc2\x43\x43\x82\x38\x03\x5a\x61\xea\ \x73\xee\x3c\x38\xbc\xfd\xc1\x64\x4b\xb8\x01\x22\xc4\x19\xb0\xc4\ \x1c\xa6\x21\xe1\xe4\x83\x07\x37\x03\x11\xf1\xc1\x43\x64\x66\x8a\ \x85\xeb\xf0\x9b\x7e\x3f\x0b\xa1\x5f\x99\xd8\xdc\xd8\x8e\x94\x88\ \xfc\x91\x12\x84\x20\xb1\x06\x5c\x8d\xc3\x9a\x1b\x95\x98\x88\x2e\ \x0f\x26\x3a\x61\xd1\xaf\xcf\x4b\x42\x89\xd4\x61\x8a\x69\x80\x00\ \x52\x89\x54\xd1\x4b\x08\x94\x5a\xa3\x69\x37\x10\xc2\xde\xf1\xc4\ \x09\x82\x6d\x50\xf4\x6b\xf2\x31\x90\x68\x40\x7c\xb4\x8f\x05\x5c\ \xbb\x99\x28\x0b\x03\xc9\x06\x00\x8d\x08\xf2\x70\xb1\x31\xb1\x72\ \x76\x0f\x88\x41\xd4\x4c\x00\x34\x50\xf9\xa8\x0c\xf8\x86\x86\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0b\x35\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x11\x01\x00\x00\x11\x01\ \x01\xe4\x6f\xaa\x7d\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0a\xb2\x49\x44\ \x41\x54\x78\x9c\xdd\x9b\x69\x6c\x5c\xd5\x15\xc7\x7f\xe7\xbe\x19\ \xcf\xd8\xe3\x25\x36\x71\x9c\xc5\x4e\x80\x6c\x38\x88\x14\xb0\x83\ \xc3\x22\xaa\x10\xc5\xce\x02\xa8\xfd\xc0\xe6\x84\xb4\x12\x2d\xa1\ \x2c\x2d\x45\x55\x4b\x45\x2b\xf9\x5b\x41\x62\x69\xa0\x84\x02\x62\ \x6b\x71\x9a\xa2\xb6\xac\x21\x50\x4a\x80\x14\x01\x69\xec\xa4\x49\ \x14\xb2\x11\x28\x38\x21\x06\x9b\x78\x9f\xc5\x33\xf3\x4e\x3f\xcc\ \x8c\xf1\x32\x63\xcf\x8c\x67\x8c\xc5\x5f\xb2\x34\x7e\xef\xde\x73\ \xce\xff\x7f\xef\xbb\xfb\x15\x26\x19\x3e\xdd\xd7\x58\x9c\x6e\xde\ \xb6\xfe\xde\xde\xea\xea\x0d\xc1\x54\xf2\x48\xba\xce\xb2\x81\x96\ \xdd\xcf\xfe\x0e\xe5\xce\x71\x98\x78\xcf\x1f\x64\xd5\xfc\xa5\xeb\ \xba\x93\xcd\x30\x69\x04\xc8\x00\xf9\x18\x52\x12\x61\x52\x08\xd0\ \xd2\xf4\xe7\xbb\x11\xf9\x55\x06\x4d\x26\x2d\xc2\x37\x2a\x80\xaa\ \xca\xf1\xdd\x9b\x1f\x00\xfd\x59\x16\xcc\xbf\xef\x0f\xb2\x72\x2c\ \x11\x4c\x16\x1c\x27\x84\x5e\x75\x95\x35\xf0\x3b\xbb\xe4\x01\x2e\ \x74\x3b\x79\xed\xe8\x07\xcf\x16\x8e\x96\x68\xdc\x35\x40\x41\x0e\ \x5d\xb3\x7a\xbe\x5a\x72\xbe\x51\x3d\xcf\x36\x9c\x2e\xca\x2c\xa0\ \x02\x98\x0e\xe4\x0c\x73\xd8\x69\x0b\x27\xad\xe2\xc2\x42\x33\xad\ \x64\x96\x35\xad\x18\x33\xe3\x34\x4c\x59\x09\xe2\x74\xa4\xe4\xdb\ \x0e\xdb\xf4\x07\x02\x84\x42\x61\x1c\x0e\x07\xce\x1c\x27\x96\xc3\ \x1a\x9e\x6c\xd4\x9a\x90\x96\x00\x47\xae\x59\x53\x69\x5b\x5a\x0b\ \x52\xab\xe8\x25\xc0\xa8\x2a\x27\x05\x01\x73\xda\x14\xac\x33\x66\ \xe0\x5c\x38\x07\x53\x56\x92\x30\xa9\xdf\xef\xe7\xd4\x97\xa7\xf0\ \xf6\x79\x41\x87\x98\xc0\x9d\x97\x4b\xc9\xb4\x12\x72\xf3\x72\x07\ \x3f\x6f\x0e\x3b\x65\xc5\x9c\xc5\x6b\x3b\xe2\xb8\x4d\x0e\x07\xd7\ \xae\x3e\x07\x95\x6b\x41\xaf\x05\xce\x8c\x93\xc4\x07\xec\x15\x38\ \xaa\x48\x8b\x8a\x7e\x2e\x2a\x27\x15\x06\x94\x37\xc6\x72\x38\x6b\ \x2a\xef\x90\x1c\xe7\x0a\xbb\xd7\x87\xf6\xf4\x62\xb7\x9e\xc2\xee\ \xee\x1b\x61\xcc\x14\x17\x60\x2d\x9c\x83\xb3\xf2\x0c\x4c\x49\x41\ \xf4\xa9\xd2\xd1\xde\xc9\x57\x6d\x5f\x0d\x21\x1e\x0f\x45\xc5\x45\ \x94\x4e\x2f\x1d\x60\x98\x48\x84\x51\x05\xd8\x7b\x7d\xad\x27\xc7\ \xb6\xea\x51\xf9\x09\x70\xde\xb0\xd7\xed\xa0\xff\x12\xe1\x0d\x45\ \x76\xb5\x9e\xf0\x1e\x5c\xf6\xf6\xdb\xa1\x44\xb6\x54\x55\x8e\x37\ \x37\x6e\x44\xb8\x6d\xc4\x3b\xaf\x9f\x70\xeb\x29\xc2\xc7\xbf\x20\ \x74\xa4\x05\xed\xea\x1d\x12\xa1\xe3\xcc\x72\x9c\x4b\x2a\xe9\x72\ \x1a\x4e\xb5\x8f\x28\xc4\x84\x28\x98\x52\x40\xd9\xcc\xb2\xc1\xa6\ \x46\x88\x10\x57\x80\xfd\xd7\x5d\x59\xe6\x94\xe0\xcf\x15\xb9\x09\ \x28\x1a\x94\xb8\x45\xd1\xbf\x1a\xd1\xe7\x16\xcc\x5f\xda\x2c\x0d\ \x0d\x76\x32\x81\x8c\x46\x3e\x4e\x62\xc2\xad\x5f\x11\x3e\xf4\x29\ \xc1\xc3\x9f\xa1\x7d\xbe\x81\x57\x81\xd2\x22\x7a\x16\x94\x13\x2a\ \xf4\x24\xe3\x16\x80\xe9\xe5\x33\xc8\x1f\x94\x5e\xa0\x59\x03\x39\ \xb5\x15\x17\x5d\x7d\x2a\xfa\xff\xd7\xd8\x57\xbf\xa6\xd8\xa9\xdc\ \x85\xe8\xcd\x40\xec\x23\xb2\x51\x7d\x45\x60\xe3\xc2\x85\x35\x6f\ \x27\x4b\xfa\x6b\x3e\x2a\x27\x76\x37\xfe\x41\xe1\xe6\x54\xf2\x01\ \x10\xb6\x09\x1e\xfe\x94\x60\xd3\x21\xec\xb6\x48\xa1\x29\xe0\x9b\ \x33\x8d\x9e\x05\x15\x18\x97\x53\xf3\x3c\x79\x6f\x19\xcb\xda\xa5\ \xb6\x2e\xf6\xf6\x79\x6b\x43\xa1\xd0\x90\x56\x30\xc7\xe5\x64\xf6\ \xdc\xd9\xc3\xa9\xee\xec\xd7\x9c\xba\xb9\xd5\x57\x77\x09\xc0\x81\ \xab\xae\xca\x11\x67\xdf\x2d\x02\xbf\x01\xa2\xad\x8f\xf4\x82\x3e\ \x63\x9b\xf0\xef\xcf\x7e\xf6\xf5\x8f\x52\x0e\x9e\x28\xf9\x3d\xcf\ \x3e\xac\x91\x4f\x28\x6d\x04\xfb\x43\x7c\xb9\xa3\x19\xcf\xd1\x13\ \x38\xbc\x7e\x00\x6c\x97\x13\x99\x56\x7c\xfb\xa2\x7b\x9e\xde\x18\ \x4b\xd7\xf4\xea\x83\x73\xfd\xdd\xdd\x07\x83\xc1\x90\x73\x70\xfe\ \xf2\x33\x2b\x70\xbb\x5d\xc3\xcd\xee\xec\xd7\x9c\x3a\x39\x70\xed\ \xea\x1a\x63\x78\x1a\x38\x2b\xfa\xc2\xab\x70\x7f\x08\xb9\x7f\xf1\ \xe6\xad\xc9\x7f\x70\xc3\xa0\xaa\xd2\xd2\xdc\xb8\x49\x84\x9b\xd2\ \xb5\x11\x43\x6f\x77\x2f\xad\xc7\x5b\x11\xdb\xc6\xf3\xf1\x49\x3c\ \xc7\x4e\x22\x76\xb4\x22\x0a\x8f\xf6\x79\xac\x3b\xaa\x1f\x7b\xd9\ \x0b\xd0\xfc\xca\x7d\x0f\x74\x77\xf4\xdc\x3e\x38\xff\xb4\x19\xa5\ \x14\x16\x17\x8d\xb0\xab\xa2\xf5\xc6\x18\x5e\x25\x42\xde\x06\x9e\ \x32\x0e\xb3\x60\xd1\xe6\x57\x7f\x3b\x59\xc8\x03\x84\x43\xe1\x88\ \x5d\x63\xe8\x9d\x37\x8b\xaf\x2e\x39\x1b\xcd\xcd\xf9\x24\xf2\x90\ \x0d\x9e\xde\xf0\x8e\xc3\xeb\x2f\x9f\x05\x20\xc6\xf9\xc2\xf0\xfc\ \xa1\x68\xfe\x78\x70\x80\x6c\x06\x3d\x0f\x5b\x7e\x59\xb9\x65\xeb\ \x7b\xe3\x0d\x56\x55\xa5\x65\x77\xe3\x23\x22\x6c\x18\xaf\xad\x18\ \x8c\x35\x74\xc0\x1a\xf2\xe4\x12\xf8\xfe\x45\x2f\xb8\x37\xbf\xe3\ \x03\xfd\x35\x50\x65\x87\xec\x5d\x87\xeb\x2f\xff\x9e\x4f\xec\xf3\ \x47\xe4\x37\x89\x07\xbc\x19\x9d\x0b\x8c\xab\xc1\x1b\x05\x01\x5f\ \x80\x96\x4f\x5a\x86\x3c\x73\xb9\x5d\x3d\x45\x3a\x77\xaa\xf5\xe2\ \x53\x57\xaa\xca\x33\x40\x1e\xe0\xed\x5e\x75\x81\xd7\x0b\x53\x07\ \xa7\x9d\x39\x7b\x26\x79\xf9\x79\x23\xe3\x15\xad\xcf\xd8\x5c\x20\ \x32\xb6\x6f\x7c\x34\xd3\xe4\x01\x5c\xb9\x39\x38\x1c\x43\x87\xc9\ \x01\x7f\xa0\xa0\xc7\xfa\xf8\x44\xa0\x7e\x95\x33\x30\xa5\xa8\x8e\ \x5c\xd7\x01\xef\x05\x95\xbe\xe1\xe4\x8d\x31\x43\x46\x85\xc3\x91\ \x91\x1a\x90\xad\x92\x1f\x8c\xae\x8e\x2e\xda\x4e\xb6\xa5\x9c\xef\ \xb4\xd2\x12\x8a\x4b\xe3\x0f\xab\x33\x52\x03\x06\xba\xba\x2c\x92\ \x07\x28\x2c\x2e\x24\xcf\x93\xb8\x24\xe3\xc1\x95\xeb\x62\xca\xd4\ \xd1\x57\xd8\xc6\x25\x40\xa6\xfa\xf9\x64\x20\x08\x65\x15\xd3\xc9\ \xcd\x75\x27\x95\xde\xe5\x76\x31\xa3\x62\x06\x22\xa3\x57\xf2\x11\ \x73\xc7\x64\x31\x91\xe4\x63\x30\x62\x28\x98\x52\x80\x18\x21\xe0\ \x0b\xa0\x3a\x72\x46\x24\x22\x14\x4f\x2d\x66\xda\xcc\x32\x2c\x6b\ \x0c\x7a\xc2\xdf\xd3\x6a\x03\x32\xdd\xcf\xa7\x03\xdb\x56\xbc\xbd\ \x7d\x04\xfc\x01\xc2\xa1\x30\x96\xc3\x22\xc7\x9d\x83\xc7\xe3\x19\ \xd1\x6d\x26\x82\x8a\xd6\xa7\xb6\x02\xc1\xe4\x20\x0f\x60\x8c\x90\ \x5f\x98\x4f\x7e\x61\xfe\xb8\xec\xa4\x24\x80\x6a\x83\x39\xb1\xbb\ \xf1\x09\x11\x7e\x38\x2e\xaf\x93\x08\x49\x0b\xa0\xda\x60\x5a\xf6\ \xcc\x7b\x52\xe0\x07\xd9\x0c\x68\xa2\x91\xd4\xc7\x32\x40\x5e\xbf\ \x5d\xe4\x21\x09\x01\xbe\xcd\xe4\x61\x8c\x91\xa0\x3e\xf7\x9c\xd5\ \x72\x66\xf0\x49\x11\x5d\x3f\x51\x01\x4d\x20\x7a\x50\x2e\x4e\x58\ \x03\x54\x55\x9a\x0a\xdb\xfe\xd0\xd3\xd3\xb7\x60\x22\xa3\x9a\x10\ \xa8\xf6\x21\xe6\x8a\x8a\xea\x75\xfb\xe3\x36\x82\xaa\x2a\x4d\xff\ \xdc\xf4\x08\xb0\xc1\x1b\x08\x42\xb7\xf7\x83\xc2\xc2\xbc\xa5\x59\ \x8d\xa9\xd7\x87\xe4\xa7\x36\xd4\x4d\xcb\x8f\xbf\xdf\xeb\x7d\xe2\ \xe5\x63\xb6\x3f\xf8\x39\xc4\x19\x09\x6a\x43\x83\xd9\xe5\x3f\xf0\ \x94\x20\x37\xc4\x9e\x05\xc3\x76\x79\x38\x6c\xef\x74\xbb\x9c\xe5\ \xd9\x08\x2a\xb8\xe7\x08\xbe\xbf\x6d\x47\xd5\xc6\x31\x7b\x7a\x36\ \x5c\xc4\xd0\xed\x7d\xfc\xc5\xbd\xea\x0b\x2c\x11\xb1\x79\x78\xff\ \x47\xdb\x86\x7c\x02\xda\xd0\x60\x76\xd5\x4c\x7d\x52\x44\x46\x34\ \x78\xbe\x40\xb0\xa6\xab\xdb\xbb\x33\x1b\x51\x85\x3f\x3a\x1e\xf1\ \xdf\xeb\xcf\x86\xf9\x18\xba\x05\xea\xd4\xeb\x7f\x23\xe2\x4c\xd6\ \x37\xdd\x58\xe5\x1c\x10\x60\x34\xf2\x31\x64\x45\x04\x55\xc2\x27\ \xdb\x01\xb0\x46\xd9\x0d\x1a\x27\xba\x04\xea\xca\xab\xd6\x7d\x20\ \xb6\xe3\x71\x20\x0c\x14\xe5\xf6\x95\x5e\x6a\x20\x39\xf2\x31\x64\ \x5a\x04\xbb\xa3\x07\x0d\x46\xf6\x53\xac\xe9\x59\x11\xa0\x4b\x60\ \x65\x79\xd5\xba\x0f\x00\xce\xda\xf2\xd2\xe7\xa0\x7b\x01\x8c\x6d\ \x96\x1b\x80\xa6\x9a\xd2\x7b\x93\x21\x1f\x83\x2f\x10\xac\xe9\xe9\ \xf5\xbd\x9f\x89\xe8\xb4\xa3\x27\xf2\x43\xc0\x4c\x9d\x92\x09\x93\ \x83\xd1\x85\xda\x75\x31\xf2\x31\x88\xb2\x03\x40\x85\x45\x06\x20\ \x6c\x59\x8f\x00\x9f\xa7\x62\xb9\xcf\xd7\x7f\x61\x77\x06\x6a\x42\ \xb8\x33\x22\x80\xe4\xba\x61\xe4\xce\xee\x78\xd0\x85\xda\x75\x15\ \xd5\xeb\x47\xc4\xa8\xc2\x31\x00\x81\xb3\x0c\xc0\xd2\xda\x9b\x8e\ \xda\x61\x5d\x46\x8a\x22\x78\x03\xc1\x9a\x71\x8b\xe0\x0b\x00\x20\ \x9e\xe4\x16\x3a\x92\x44\x42\xf2\x00\x82\x44\x57\x58\x65\xd6\x40\ \x23\x58\xb3\xe6\xd6\x23\xdf\x84\x08\xb6\x3f\x72\xa8\xcb\x24\xb9\ \xd2\x93\x04\x46\x25\x0f\x60\xdb\x12\xdd\xc4\x55\xd7\x90\x6e\x70\ \x3c\x22\x74\xf5\x78\xff\x93\x46\xb0\x03\x88\xb7\xba\x93\x06\xba\ \xb0\xa5\x76\x34\xf2\x00\x62\x69\x6c\x9b\xc8\x3b\x62\x28\x9c\xae\ \x08\x3e\x7f\xf0\x82\x74\x44\x10\x13\x99\x8e\xc4\x7a\x82\x71\xa0\ \x13\x5b\x6a\x2b\x96\xac\x1d\x3b\x06\xd5\x12\x00\x85\xf6\xb8\x73\ \x81\x89\x14\xc1\xe4\x45\xaa\xbe\xfa\xfb\x53\xc9\x36\x1c\x9d\xd8\ \x52\x97\x14\x79\x00\x35\x8b\x01\x44\x38\x94\x70\x32\x34\x51\x22\ \x48\x74\xef\x5e\xbb\x7a\xd0\xfe\x94\x0e\x79\xc6\xd0\xa9\x86\xe4\ \x4a\x7e\xc0\x29\xcb\x00\x54\x75\xe7\xa8\xeb\x01\x35\x6b\x6e\x3d\ \x82\xca\x65\x64\x51\x04\x53\x16\x5d\xb7\x57\xb0\xdb\x3b\x53\x71\ \x03\x51\xf2\xb3\xcf\x5b\xb7\x2b\xd9\x0c\x07\xea\x57\x9f\x0b\x3a\ \x0f\x00\xe1\x8d\x31\x17\x44\x96\xac\xba\xf9\x70\xba\x22\x74\x27\ \x21\x82\x29\x29\x44\x8a\x22\x0b\x9b\xa1\xe8\x9c\x20\x49\xa4\x4c\ \x1e\xc0\xc0\x4f\x01\x14\x8e\x55\x36\x6e\x1b\xbd\x06\xc4\x30\x48\ \x84\x93\xa9\x38\xf3\x26\x23\x82\x08\x8e\x79\x15\x00\x84\x3e\xfc\ \x1f\x24\xd7\x1b\xa4\x45\xfe\xc3\xfa\xcb\xe7\x03\x6b\x01\x44\xd9\ \x24\xa0\x49\xef\x0c\x45\x45\x58\x46\x16\x44\x70\x2c\x3a\x1d\x44\ \xd0\x3e\x1f\xc1\x7d\xc7\xc6\x32\xd9\xa9\x62\xaf\x48\x95\xbc\x82\ \x80\xbd\x11\xc8\x41\x39\xd1\x57\x60\xfd\x11\x52\xdc\x1a\xcb\x96\ \x08\xd6\xb4\x62\x1c\xf3\x23\xb5\xa0\xff\xdd\xbd\xa8\x37\xe1\xb4\ \xb8\x43\xc5\x5e\x31\xfb\xfc\xf5\x4d\xa9\xf8\x07\x38\x54\xbf\xea\ \x16\x81\x55\x00\x18\xb9\x2b\x76\xa2\x24\xe5\xbd\xc1\xf1\x88\xd0\ \xd5\xed\x4d\x58\x6a\xae\x4b\xcf\x05\xcb\x42\xfd\x01\xfc\x2f\xfd\ \x1b\x1d\x79\xaa\xa3\x43\xc5\xae\x4d\x8f\xfc\x9a\x65\x20\xf7\x02\ \xa0\xfa\x7c\x65\xe3\xd6\x67\x62\xef\xd2\xda\x1c\x4d\x57\x04\x5f\ \x20\xb8\x24\x91\x08\x52\x94\x8f\xab\xf6\x02\x00\xc2\x27\xda\xf0\ \xbf\xb4\x63\xf0\xe0\xa8\xc3\x46\xd2\x2a\xf9\xc3\x6b\x57\x2e\x51\ \xf4\x79\xc0\xa5\x70\x0c\xa7\xfb\xc7\x43\xfc\xa6\x6a\x70\x30\x9a\ \x5e\x7f\xe8\x2c\x55\xb3\x1d\x98\x91\x4a\xbe\x5c\x97\x73\x57\x51\ \x61\xde\x92\x78\xef\xfa\xdf\xdd\x4b\xff\xce\x03\x91\xe0\x8a\xf2\ \x71\xaf\x5c\xda\x23\xe5\x65\xcb\xe6\x54\xad\x6d\x4e\xc5\x87\x36\ \x34\x98\x43\x47\x77\xde\x80\xca\x83\x80\x1b\x68\x53\xcc\xc5\x8b\ \x36\xbf\x72\x74\x70\xba\x71\x1f\x90\x48\x5b\x04\xb7\x73\x57\x51\ \x41\x7c\x11\x82\x4d\x87\x08\xec\xd8\x1d\x3b\x0e\x6b\x03\x5b\x51\ \xbd\xaf\xf2\x2f\xdb\xde\x19\xcb\xee\xde\xeb\x6b\x3d\xce\xb0\xf3\ \x0a\x51\xbd\x13\xe1\x3b\xd1\xc7\x27\x6d\x5b\xd7\x9c\xbd\x65\xdb\ \x9e\xe1\xe9\x33\x72\x42\x24\x1b\x22\x84\x3e\xfb\xa2\xd3\xff\x8f\ \xb7\xba\x09\xdb\xb3\x07\x1e\x0a\xad\x28\xdb\x51\x9a\x31\xb4\xaa\ \xca\x97\x06\xf5\xa8\xe0\x51\x74\x91\x20\xe7\xa2\x2c\x23\x72\x5e\ \x28\x0a\x7d\xdd\x38\xac\x1b\x16\xfe\xe9\x95\x13\xf1\xfc\x64\xec\ \x90\x54\x54\x84\xb7\x88\x1c\x91\x4f\x1a\xf1\x45\xd0\x36\x54\x96\ \x77\xdf\xf3\xe2\x61\x2b\xa7\x77\x9d\x8d\xfc\x42\x94\xca\x94\x02\ \x12\x5e\xc3\xd6\xbb\xc7\xaa\x35\x19\x3d\x25\x96\xae\x08\x79\xee\ \x9c\x3d\x85\x05\xb9\xd1\xc3\xd8\x11\xf2\x15\xd5\xeb\xf6\x0f\x4e\ \x73\xe8\xba\x95\x8b\x11\x73\xa5\x0d\xd5\x02\x8b\x81\x32\x22\x25\ \x6d\x03\xed\xd1\xbf\xff\xaa\xf2\x96\x43\x64\xfb\x82\xcd\x5b\x3f\ \x4e\xc6\x77\xc6\xaf\xcc\x8c\x4f\x04\x77\x79\x3c\xf2\x09\x7d\xdd\ \x58\xe5\xac\x7a\xac\x39\x24\x63\x1e\x9e\x4f\x8c\xac\xdc\x19\x6a\ \xda\xfa\xd0\x39\x6a\x99\x37\x81\xd2\x14\xb2\xb5\x97\x16\xba\x6a\ \x4f\xbf\xe8\x47\x23\x1a\xaa\x6c\x22\x2b\x77\x86\xaa\xd7\xdc\xb6\ \xdf\x58\x7c\x17\x68\x4d\x32\x4b\x9b\x51\x59\x3e\xd1\xe4\x21\x8b\ \x97\xa6\xaa\x56\xdc\x72\xd0\x58\x5c\xc6\xd8\x22\xb4\x49\xd8\x5e\ \x5e\xb5\xea\xe6\x7d\xd9\x8a\x65\x34\x64\xfd\xda\x5c\xf3\x1b\x0f\ \x57\xda\x61\xb6\x13\xbf\x4d\x68\x93\xb0\xbd\xbc\x7a\xcd\x6d\x49\ \x7d\xf3\xd9\x40\xd6\xaf\xcd\x55\xad\xb8\xe5\xa0\x51\xa9\x23\xd2\ \x4a\x0f\xc6\x37\x4e\x1e\x26\xf0\xe2\x64\xf3\xb6\x4d\x8b\x6d\xd1\ \x37\x89\x9c\xe5\x9d\x14\xe4\x61\x82\x6f\x8e\x46\x45\xd8\x22\x61\ \xfb\x9a\xc9\x40\xfe\x1b\x81\x36\x34\x4c\xe8\x6d\xd5\xb1\xf0\x7f\ \xba\x59\x0f\xc3\x28\xc8\xec\x47\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x01\x65\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x75\x50\x4c\x54\x45\x00\x00\x00\xcc\xcc\xcc\xd5\xd5\ \xd5\xb6\xdb\xb6\xc8\xc8\xc8\xca\xca\xca\xc5\xcb\xc5\xc6\xcc\xc6\ \xc7\xcb\xc7\xc7\xc9\xc7\xc6\xca\xc6\xc7\xca\xc7\xc7\xc9\xc7\xc6\ \xca\xc6\xc7\xca\xc7\xc7\xcb\xc7\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\ \xc6\xc7\xcb\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xca\xc7\xc7\xca\xc7\ \xc7\xca\xc7\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\ \xca\xc7\xc8\xcb\xc8\xc9\xcc\xc9\xcb\xce\xcb\xd1\xd3\xd1\xe2\xe3\ \xe2\xe2\xe4\xe2\xf9\xf9\xf9\xfa\xfa\xfa\xfc\xfc\xfc\xa9\x24\x99\ \x16\x00\x00\x00\x1d\x74\x52\x4e\x53\x00\x05\x06\x07\x2a\x2b\x2c\ \x2d\x8d\x8e\x90\x91\x93\x94\x96\x97\xbb\xbc\xbd\xbe\xd3\xd4\xd5\ \xf1\xf2\xf3\xf4\xfc\xfd\x64\x79\xba\xb6\x00\x00\x00\x82\x49\x44\ \x41\x54\x18\xd3\x65\x8f\x47\x0e\xc2\x40\x00\x03\x27\xbd\x53\x13\ \x48\x73\x36\xfd\xff\x4f\xe4\x40\x04\xac\xf0\x71\x24\xcb\x1e\x00\ \xa2\xac\x6a\xdb\x2a\x0d\x79\xc7\x3b\xf5\x92\x24\x75\x85\x0b\xe0\ \xdd\xf5\xc9\xcd\x05\xce\xd2\x30\x2f\xe3\xb8\xcc\x83\x94\x43\xd4\ \x4b\x66\xdb\xa7\x69\xdf\x8c\xd4\x05\x64\x92\xcc\xba\x4f\xd3\xbe\ \x1a\x49\x09\x0f\x1b\x94\x34\x36\xa8\xa9\x6d\xf0\xfc\xaf\xa4\x36\ \x88\x09\x3b\x6b\xd6\x87\xe2\xf7\x58\x06\xb8\xd7\xef\xf5\x8b\x03\ \xe0\xe6\xdd\x21\x97\x39\x87\x6f\x90\x94\x4d\x53\xc6\x3e\xc0\x0b\ \xa3\xa6\x17\xae\xbb\x09\x28\x00\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x01\xdc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\xba\x50\x4c\x54\x45\x00\x00\x00\x80\x80\x80\xaa\xaa\ \xaa\xcc\xcc\xcc\xbf\xd5\xbf\x8a\x92\xa0\xc8\xc8\xc8\xc4\xcb\xc4\ \xc6\xcc\xc6\xca\xca\xca\xc5\xc9\xc5\xc7\xcb\xc7\xc6\xc9\xc6\xc7\ \xca\xc7\xc6\xcb\xc6\xc6\xcb\xc6\xc7\xcb\xc7\xc7\xcb\xc7\xc6\xca\ \xc6\xc6\xca\xc6\xc7\xcb\xc7\xc7\xcb\xc7\xc6\xca\xc6\xc7\xca\xc7\ \xc7\xcb\xc7\xc6\xcb\xc6\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\ \xca\xc7\xc7\xcb\xc7\x78\x81\x96\xc6\xca\xc6\xc7\xca\xc7\x6f\x78\ \x90\xc7\xcb\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\ \xc7\xca\xc7\x63\x6c\x89\x5d\x67\x85\xc7\xca\xc7\x55\x60\x80\x57\ \x61\x81\x57\x62\x81\x58\x62\x81\x58\x63\x82\x5c\x66\x84\x77\x80\ \x95\x78\x81\x96\x79\x82\x96\x7e\x86\x99\x8e\x95\xa3\x9b\xa2\xac\ \x9c\xa1\xac\xae\xb3\xb8\xbe\xc2\xc1\xc4\xc7\xc5\xc6\xc9\xc6\xc7\ \xca\xc7\x7e\xea\xb5\xa4\x00\x00\x00\x2c\x74\x52\x4e\x53\x00\x02\ \x03\x0a\x0c\x23\x25\x27\x28\x2b\x39\x44\x4c\x65\x67\x70\x71\x7f\ \x82\x87\x88\x89\x94\x96\x97\xb4\xc3\xc5\xc7\xc9\xcc\xce\xdd\xde\ \xe7\xee\xef\xf5\xf6\xf7\xf9\xfa\xfe\xfe\x91\x41\x01\x38\x00\x00\ \x00\xa5\x49\x44\x41\x54\x18\x19\x3d\xc1\x0b\x5b\xc1\x00\x18\x86\ \xe1\xd7\xb6\x6c\x56\x21\x24\xc6\x58\xb4\x1c\x72\x48\xce\xec\xf9\ \xff\x7f\xab\x6f\x2e\x76\xdf\xba\xfb\xc4\xd7\x83\xeb\x48\xe5\x1f\ \xea\x92\xe3\xca\x78\x51\xef\xe5\x79\x00\x93\x46\x35\x8e\x3c\x49\ \x41\x4a\x21\x0d\x64\x3a\x14\x3e\x94\x7b\x07\xce\xfb\xed\x29\x83\ \x96\x4c\xf8\x05\xe7\xe5\x7c\xb6\x38\xc0\x38\x94\x12\xcc\x7e\xfe\ \x54\x1a\x6d\x32\x20\x11\xb9\xbf\x59\x49\xc3\xdf\x2b\x46\x7e\x7d\ \x02\xc7\xc5\x68\xb8\xde\xc1\x77\xcd\x97\xd4\x80\xec\xb0\x59\xed\ \x2e\xf0\xa6\x5c\x15\x93\x5d\x31\xaf\x32\x4e\x4c\x21\x76\x24\xb9\ \x51\xda\x69\x8e\x81\x7e\x77\x1a\xb9\x32\x5e\x20\x85\xd0\x96\x02\ \x4f\x85\x84\x8a\x6e\xfe\x01\x6a\x2f\x1f\x26\x5b\xe5\xab\x07\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x1d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xb4\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xaa\xaa\ \xaa\xbf\xbf\xbf\xaa\xaa\xaa\x92\x92\x92\x9f\x9f\x9f\xaa\xaa\xaa\ \xaa\xaa\xaa\xa4\xa4\xa4\x99\x99\x99\xa2\xa2\xa2\x9b\x9b\x9b\x9d\ \x9d\x9d\x9f\x9f\x9f\xa2\xa2\xa2\xa3\xa3\xa3\x9e\x9e\x9e\x9f\x9f\ \x9f\x9f\x9f\x9f\xa1\xa1\xa1\xa0\xa0\xa0\xa2\xa2\xa2\xa0\xa0\xa0\ \x9f\x9f\x9f\xa0\xa0\xa0\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\ \x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x22\x91\x5f\xe8\ \x00\x00\x00\x3b\x74\x52\x4e\x53\x00\x01\x03\x04\x06\x07\x08\x09\ \x0c\x0e\x0f\x16\x17\x1a\x20\x21\x24\x2a\x2d\x30\x36\x3b\x3c\x4b\ \x52\x5b\x62\x6d\x75\x80\x8e\x8f\x91\x99\xa1\xaa\xae\xb1\xba\xbf\ \xc0\xcd\xd3\xd9\xda\xde\xe3\xe5\xe7\xec\xed\xee\xef\xf5\xf8\xfa\ \xfc\xfd\xfe\xa4\x4f\x42\xc1\x00\x00\x00\xdd\x49\x44\x41\x54\x58\ \xc3\xed\xd7\x67\x12\x82\x30\x10\x05\x60\x50\xb1\x2b\x36\xec\x62\ \xc3\x8e\x35\xf6\xdc\xff\x5e\xea\xb0\x5e\xe0\x3d\x46\x9d\x91\xfd\ \xff\x25\x13\x78\x59\x16\xc3\x88\xea\xaf\xca\x72\x95\x72\x13\xb8\ \xcf\xcc\xf4\xb3\xfa\xb0\xcf\x2f\x5e\x5e\x1f\x50\x6f\xfb\x9a\x5a\ \xa0\xb2\x0d\x3c\x7a\x04\x47\x89\xf7\x2c\xc8\x37\x4e\xe2\x47\x71\ \xc8\xb7\x2e\xe2\x07\x26\xe4\x3b\xb7\x80\xdf\xbb\x10\x37\x7b\xb2\ \xfd\xb5\x0d\xf9\xd8\x50\xfc\xb9\x89\xc5\x77\x2c\xfe\x58\x87\x7c\ \x7a\x2a\x7e\x57\x65\xe2\xab\xf5\xba\x04\xf9\xe2\x4a\xfc\xb2\x00\ \xf9\xf2\x46\xfc\x3c\x0b\xf9\xda\x5e\xfc\x24\x15\xc5\xf7\xf3\xf1\ \x4d\x7a\xe2\x95\xf3\x95\xf8\xe6\xde\xf1\xf5\x6d\x83\x5b\x00\xcc\ \x3f\x7f\x04\xfe\x21\xf2\xaf\x91\x0f\x12\x1f\xe5\x10\x2e\x13\x7f\ \x9d\xf9\x86\xc2\xb7\x34\xbe\xa9\xf2\x6d\x3d\x8c\x58\xb3\x9f\xb6\ \x28\xd6\x21\xc6\x9a\x1d\xf3\xf8\x41\x93\x1f\x75\xf9\x61\x9b\x1f\ \xf7\xf9\x1f\x8e\xa8\x7e\xb9\x1e\x39\xd8\x60\xa7\x5a\x9b\x0a\x79\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x03\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x4e\x50\x4c\x54\x45\x00\x00\x00\xaa\xaa\xaa\xa6\xa6\ \xa6\x9b\x9b\x9b\xa2\xa2\xa2\x9e\x9e\x9e\xa3\xa3\xa3\xa2\xa2\xa2\ \x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9e\x9e\x9e\xa1\xa1\xa1\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xdc\xca\xb7\xd0\x00\x00\x00\x1a\x74\x52\ \x4e\x53\x00\x09\x14\x17\x1e\x22\x24\x29\x30\x35\x3d\x42\x4c\x59\ \xca\xce\xd7\xde\xe2\xe7\xea\xeb\xef\xf2\xf6\xf9\x89\xe1\xb1\xb3\ \x00\x00\x00\x4a\x49\x44\x41\x54\x18\xd3\x63\x60\xc0\x01\x18\x59\ \x11\x24\x08\x30\xf1\x89\xc0\x49\x10\x60\x11\x90\xe0\x81\x91\x20\ \xc0\x2e\x24\xc6\x05\x23\x41\x80\x53\x54\x98\x03\x46\x82\x00\xb7\ \xb8\x20\x1b\x8c\x04\x01\x5e\x49\x7e\x66\x18\x89\x5d\x00\x43\x0b\ \xa6\xa1\x98\xd6\x62\x3a\x0c\xd3\xe9\x98\x9e\x43\x00\x00\xb1\xf8\ \x05\x15\x26\xf7\xf3\xef\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\xac\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x04\x00\x00\x00\xb5\xfa\x37\xea\ \x00\x00\x01\x73\x49\x44\x41\x54\x28\xcf\x65\x51\x59\x4b\x82\x51\ \x10\xbd\xa5\x65\x14\x44\xb4\x50\x56\x12\x44\x44\x8b\x0f\x41\x45\ \x25\x2d\xb4\x48\x45\x2b\x46\xcf\xf5\xd2\x4e\x45\x3d\xf8\x52\x90\ \xad\xd4\xf7\x89\xa4\x14\x24\xda\x9d\x33\x57\xe9\xc1\x3f\xe1\x4f\ \xab\xf9\xd4\xa2\x68\x60\x18\xee\x9c\x33\x33\x67\xe6\x2a\x55\xb2\ \x74\x07\x6e\x11\x63\x0b\x2f\xf4\xc6\x37\xd9\x76\xf5\xd7\x8c\x1f\ \x97\x54\xc7\xdd\x14\xa2\x75\x6e\x13\x72\x14\xbb\xbf\x60\x5c\x08\ \x65\x08\x49\x1c\xd0\xa8\x9e\xe1\x2b\xb6\x3e\x1a\x69\x9b\x8e\x4b\ \x30\xed\x9b\x71\xcc\xf2\x4d\xb2\x82\xaa\xf0\xc4\x16\xef\x65\xdb\ \xf9\x3d\xe3\xe5\x73\x0c\x0a\x9c\xf0\x20\x9e\xad\xa5\xd7\x74\x3d\ \xd2\x39\x57\xa1\x60\x00\xa9\x8c\x17\xa9\x5c\x25\xe2\xce\xf4\x79\ \x5a\xe0\x43\xd3\x4b\xf7\xba\xc9\x4c\xd1\x33\x92\x66\x44\xfb\x28\ \xc2\x8b\xbc\x06\x3b\xe1\x51\x08\x6b\x1f\xa2\xa2\x23\x6a\x6a\x38\ \xa1\x54\xa4\x1c\x24\xb5\xb1\xbc\x1b\x36\x6d\xea\x80\xc2\x1d\x37\ \xc0\x96\xe7\x43\xa6\x0b\xbb\xa2\x66\x92\x56\x78\x9a\x76\xa8\x07\ \xb6\xf1\xf3\x96\x74\xa0\x16\xb6\x72\x2e\xa7\x1d\xae\xb5\x8f\x4f\ \xdf\x5b\x71\x46\x0b\x14\x84\x9d\xac\xc6\x91\xa2\x90\xa8\xd8\x96\ \x3b\xc4\x64\xcc\xd3\x67\x19\x6c\x27\x9a\x11\x0a\xb1\x55\x58\x32\ \xd5\x8c\x30\x2f\xd3\x04\x3d\xe6\xdd\x4e\xca\x21\xc8\xaa\x63\x72\ \x30\xab\x74\x87\x84\x87\x82\x3c\x87\x93\x92\x58\xa7\x43\x58\x07\ \x78\xed\x87\x20\x89\x49\x2c\xf1\x16\xfa\x0b\xa0\x78\xc6\x2b\x62\ \x57\x7f\x11\x74\x9f\x50\x36\x68\xb8\xd8\xde\x71\x19\xb9\xa2\x7d\ \x7f\xbe\x2b\xef\x8e\x94\x17\x41\xc7\x75\xa7\xf1\xab\xff\x66\x86\ \xe4\xd0\x91\x62\xfc\xb6\x2f\x85\xb8\xae\xee\x1e\xa2\xf5\xb5\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x08\xeb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\xa5\x00\x00\x03\xa5\ \x01\x43\x6a\x7a\x91\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x08\x68\x49\x44\ \x41\x54\x78\x9c\xed\x9b\x7b\x70\x54\xd5\x1d\xc7\x3f\xbf\xb3\x4b\ \x12\x60\x05\x2b\x45\x53\xb1\xda\xd1\x51\xb4\xb6\x9d\x51\xa9\x0c\ \x9a\x84\x20\xe0\x03\x76\x01\x99\x66\xc7\x76\x10\xd8\x8d\x42\x1d\ \xa9\xd3\x62\xeb\x38\x58\x6b\xb4\x95\x96\xa1\x45\xa9\x8f\x36\x0a\ \x59\x64\x50\xda\xe8\xa0\x90\x10\x8a\x4a\x0d\xbb\x01\x9f\x58\xa7\ \x1d\x11\xec\xd8\xe9\x48\xad\x6f\xad\x12\xc8\x63\xf7\xde\x5f\xff\ \xe0\x31\x82\xd9\xdc\x73\x77\xef\xc6\xce\x94\xcf\x5f\xbb\x7b\x7e\ \x8f\xef\xfd\xed\xbd\x77\xcf\xfe\xce\xb9\x70\x8c\x63\xfc\x5f\x23\ \x25\x8b\xdc\xd0\x60\x6a\xc6\x8c\x1a\x0d\xe1\x73\x50\xf7\x2c\x45\ \x46\x01\x43\x05\x22\x00\xae\xc8\xa7\x46\x75\x1f\xa2\x6f\x2a\xba\ \xcb\x31\xe1\x5d\xdb\xa7\xcc\x7d\xa3\x64\x7a\xf2\x10\x68\x01\x6a\ \x5b\x1a\xbf\xec\xc8\xa0\x3a\x51\x26\x2b\x8c\x07\x4e\xf0\x29\xe7\ \x6d\xe0\xcf\xaa\x6c\x56\x75\x9f\xd8\x36\xbd\x7e\x6f\x90\xfa\xfa\ \xcc\x18\x44\x90\x9a\x96\x95\x97\x2a\x5c\x07\x32\x05\x28\x0b\x22\ \x26\xb0\x0f\x74\x1d\xe8\xbd\x99\xd8\x35\x2f\x04\x14\xf3\x73\x14\ \x55\x80\xaa\x96\x54\x4c\xd0\x5b\x81\x6f\x07\xa4\x27\x0f\xf2\x24\ \xae\xdc\x91\x99\x3e\x77\x5b\xe0\x91\x0b\x71\xaa\x6a\x6d\x3a\x5d\ \x94\x7b\x80\x29\x01\xeb\xe9\x17\x81\x47\x73\xd9\xf0\x82\xed\x33\ \x67\xbf\x17\x60\x4c\x7f\xd4\xb4\xac\xbc\x5e\x91\xa5\xc0\xe0\xa0\ \x44\xf8\xe4\x23\x90\xfa\x4c\x2c\xf1\x44\x10\xc1\xac\x0b\x30\xb6\ \x6d\xcd\xb0\x72\xa7\x77\x85\x42\x5d\x10\x89\x8b\x44\x51\x59\xbe\ \xff\xe4\xde\x9b\x76\x8c\x99\x9f\x2d\x26\x90\x55\x01\x2e\x5a\xb7\ \xfa\xc4\xd0\xa0\xdc\x26\xe0\xfc\x62\x92\x05\x8f\x6e\x71\x5d\xae\ \x2c\xe6\xd7\xc2\xb3\x00\x55\x2d\xab\x4f\x15\x72\x4f\x03\x67\x16\ \x9a\xa4\xc4\x3c\x5b\x5e\x91\xbd\xe2\xe9\xc9\xf3\x3f\x29\xc4\xb9\ \xdf\x02\xd4\x6e\x4c\x55\x3a\xae\xa6\x29\xfc\xe0\x3f\x00\xd9\xaa\ \xc2\x8b\xa2\xec\x36\xca\x5b\x6a\x72\x9d\x9a\x0b\x89\x86\xcd\x60\ \x51\xfd\xaa\x0a\xa3\x71\xf5\x42\x11\x6a\xf1\x3d\x6f\x38\xcc\xd6\ \x50\x44\x2e\x6f\x9f\x90\xe8\xf6\xeb\x18\xce\x37\x50\xfb\x78\xea\ \x78\xc7\x75\x37\x83\xf8\x3d\xf8\x5e\xd0\x3f\x8a\xca\xaa\xf4\xcb\ \x6f\xb6\xd3\xd0\xe0\xf6\x63\xbb\xe3\xd0\x8b\xba\xe6\xe6\xd0\xbb\ \x83\xf7\x4e\x54\x48\x80\x7c\xa7\x3f\x6d\x7d\x30\xde\xe9\x64\x0d\ \xaa\x75\x88\xa8\x1f\xb1\x7d\x9f\x01\xaa\x52\xd3\x9a\x5a\xaf\x10\ \xf3\x11\xcb\x55\xe1\x41\x93\xe3\xce\xf4\x8c\xe4\x1e\x3f\x22\x8e\ \xe6\xa2\xb6\x55\x67\x84\x1c\xbd\x1d\xf4\x7b\x79\x35\xf6\x81\x8a\ \xdc\xdc\x11\x4d\x2c\xf1\x93\xab\xcf\xe0\xd5\xad\xa9\x45\xa8\xde\ \xe9\x23\xca\x4e\xd7\xd1\x39\xdb\xa6\xd7\xbf\xe4\x27\xb9\x17\x35\ \x1b\x9a\x2e\x51\x21\x05\x9c\x6a\xe9\x92\x13\x61\x7c\x3a\x9a\xdc\ \x6e\x9b\xe3\x73\x05\xa8\x59\xbf\xe2\x3c\x35\xe6\x05\x2c\x4f\x41\ \x85\x47\x86\x94\x85\xe7\x3d\x79\xd9\xec\x7d\xb6\x49\xfd\x30\x71\ \xdd\x43\x23\x7a\xca\x9c\xb5\xa2\x4c\xb6\x74\xd9\xfd\x51\x57\xe4\ \x5b\xaf\xc6\xe3\xbd\x36\xc6\xe6\xb3\x6f\x6a\x9f\x69\x08\xab\x31\ \x0f\x62\x7d\xfd\xe9\xb2\x8e\x68\x62\x56\xa9\x0e\x1e\x60\xcb\xcc\ \x39\x1f\x76\x55\x66\xa7\x82\xfe\xc1\xd2\x65\xf4\x09\x43\xf6\xfd\ \xd8\x36\xfe\x11\x05\xc8\xed\x3d\x6d\x1e\x70\x81\x8d\xa3\xc2\x6f\ \x32\xb1\xfa\x1b\xfd\xde\x74\x0a\x61\xc7\x98\xf9\xd9\xca\xae\xe3\ \x66\x21\xac\xb7\x72\x50\x5d\x34\x76\xfd\x83\x27\xd9\x98\x1e\x2e\ \x40\xed\x33\xa9\x0a\x11\xbd\xc5\x52\xd3\x43\x1d\xd1\xc4\x4f\x2c\ \x6d\x03\xe1\xd1\x78\xdc\xc9\xed\x8f\x7c\x17\xf8\x8b\x85\xf9\xd0\ \x72\x09\xfd\xc8\x26\xee\xe1\x02\xe4\x3a\x75\x1e\x70\xb2\x85\xcf\ \x8e\x50\x44\xbe\x3f\x10\xdf\xfc\xd1\x3c\x1b\x8f\x77\xa9\x09\x5d\ \x05\x74\x7a\xd9\xaa\x70\x5d\xed\xe3\xa9\xe3\xbd\xec\x0e\x14\x40\ \x55\x04\x16\x58\x68\xe8\xc1\x61\x76\x21\x13\x8e\xa0\xe8\x98\x3a\ \xe7\x75\xd0\x3b\x2c\x4c\x87\x39\x61\xf7\x2a\x2f\x23\x03\x50\xdd\ \x92\xaa\xc1\x66\xb6\xa7\x2c\xce\xcc\x48\xee\xb4\x48\x5e\x52\xf6\ \x7f\x25\x77\x37\xe8\xeb\xde\x96\x72\xb5\x97\x85\x01\x10\x61\xb6\ \x45\xde\xf7\x42\xdd\x5d\xcb\x2c\xec\x4a\xce\x8e\x31\xf3\xb3\x2a\ \xc6\x66\xc2\x33\xee\xa2\x8d\x2b\x4e\xeb\xcf\xc0\xa0\x2a\x0a\x97\ \x7b\x86\x12\x59\xde\x1e\xbf\xde\xf3\xda\x1b\x28\x3e\xde\x3f\x74\ \x0d\xf0\x81\x87\x99\x18\x0d\x4d\xec\xcf\xc0\xd4\xb4\xad\xfa\x06\ \xde\x37\xbf\x9c\xeb\xb8\xab\x7c\xe8\x2b\x39\xaf\xc6\xe3\xbd\x22\ \xda\xec\x65\x27\xae\x4e\xe8\x6f\xdc\xa8\xeb\x5e\x6c\x91\xaf\x7d\ \xdb\xf4\xfa\x7f\x5b\xab\x1b\x20\xc4\x31\xde\x5d\x21\x61\x5c\x7f\ \xc3\x06\xe4\x5c\xcf\x18\xca\x66\x1f\xba\x06\x8c\xf2\x8a\xd0\x76\ \xc0\x6b\xca\xfb\xb5\x2b\xda\x7e\x5b\x9e\x6f\xd0\x28\x78\x16\xc0\ \x15\x7d\xce\xaf\xb8\x81\xe0\xe0\x14\x7c\xb7\x87\x59\xa8\xb3\x37\ \x72\x46\xbe\x41\x23\x70\x8a\x57\xa2\xf2\x6c\xf8\x35\xbf\xe2\x06\ \x10\xaf\x02\x60\x44\x46\xe5\x1d\x03\x86\x7b\xf8\x77\x6f\x99\x39\ \xe7\x43\xbf\xaa\x06\x0a\x11\xf5\x6c\x91\x6b\x88\xe3\xf2\x8d\x85\ \x81\x61\x1e\xfe\xff\x33\x3f\x7d\x00\x93\x9e\x6a\x1c\xde\xdd\x13\ \x39\x3c\x85\x77\xb5\x27\xeb\xd5\x31\x71\x5d\x2a\xab\x5a\x1f\xfe\ \xd2\xa1\xf7\x59\xa3\xce\xf3\x53\x66\x7d\x0a\x07\x0a\xe0\xe9\x5f\ \xb0\xda\x00\xa9\xda\x90\xba\x5a\x44\x7f\xdd\xd3\xcd\x89\x42\x8f\ \x2f\x5f\x11\xbd\x0f\xed\xb9\xef\xd0\xfb\x32\x07\xaa\x5b\x9a\xfe\ \x85\xb2\xc0\x00\x5e\xdd\xd4\x48\x01\x7a\x03\xe5\xdc\xe6\xe6\x32\ \x11\x6d\x04\x4e\x0c\x30\xec\x29\x08\x0f\x18\xe0\x53\x0f\xc3\x21\ \x63\xdb\xd6\x78\x5d\x26\x25\x65\xe4\xc8\x9d\x2e\x50\xd4\x02\x48\ \x1e\xba\x0d\x2a\x9e\x13\x9c\x70\xb6\xe7\xac\x12\x24\xb7\xa6\x7d\ \x42\x43\x4e\xd0\x5f\x06\x1d\x57\x94\xc5\x46\xd0\x5d\x5e\x86\x21\ \x11\xab\x2e\x51\x29\x49\xc7\xea\x7f\x85\x60\xf3\x37\xd8\x0e\x91\ \x5b\xd2\xd3\x92\x8d\x46\xc1\xb3\x00\x2a\x5a\x1b\x58\xe2\x22\xc8\ \x44\x93\xb7\x81\xfc\xbc\xe8\x40\xca\xc2\x4c\x34\xb1\x18\xc0\x18\ \xab\x59\x9e\x4c\x19\xd7\xdc\xfc\x45\xad\x06\x1f\x41\x26\x96\xf8\ \x99\x8a\xdc\x5c\xa0\xbb\x0a\xf2\xc3\xcc\xb4\xe4\x5d\x87\x3e\x30\ \x12\xd9\xf3\x22\xe0\xb5\xb8\x38\x2c\x34\x64\x5f\xb4\xc0\xa4\x81\ \xd3\x11\x4d\x2c\x11\xb8\xd5\xa7\x9b\x02\x37\xa4\x63\x89\xe5\x9f\ \xfd\xd0\x1c\xb8\xc1\xd0\xee\xe5\x2d\xaa\x56\x4d\xc6\x81\x22\x1d\ \x4b\xfe\x02\x11\xdb\x26\xae\xaa\xca\x82\x4c\x2c\x79\xef\xd1\x03\ \x06\x40\x45\x1e\xb1\x08\x32\xae\xaa\xb5\x69\x92\x1f\x91\xa5\x26\ \x13\x4d\x2c\xb6\xb8\x1c\x54\x94\xeb\x3a\xa6\x25\xee\xef\x6b\xd0\ \x00\x84\x86\xf2\x04\xf0\x1f\xaf\x84\x02\xcb\x2f\x78\xa9\x71\x90\ \x7f\xa9\xa5\xa3\x23\x9a\x58\xa2\xc8\x8d\x79\x86\x55\x55\x16\xa4\ \xa7\x25\x1b\xf3\xf9\x1b\x80\x83\x5d\xde\x35\x9e\xd9\x94\xaf\x0f\ \x7d\x3b\x6c\x7b\xda\x0d\x18\x1d\xb1\xc4\x32\x94\x85\x1c\xb8\xce\ \x0f\xe1\xa8\xc8\x35\xf9\xbe\xf9\x43\x1c\xfe\x53\xa1\x84\x97\x62\ \x31\xdb\x52\xe4\xa7\xe3\x5b\x57\xf6\xdb\x66\xfa\x22\xc8\x4c\x4b\ \xde\x25\xe8\xd5\xc0\x7e\xe0\x13\x45\xae\xec\x88\x26\x9a\xbc\xfc\ \x8e\xf8\x23\x54\xd5\x9a\x5a\x21\xaa\xf5\x16\xf9\x3e\x76\xd5\x54\ \x6f\x9b\x36\xf7\xd5\x02\xf5\x96\x8c\x49\x4f\x35\x0e\xcf\x7d\x9c\ \x73\x6c\x1b\xb8\x47\x14\xe0\xe0\x8e\x90\x5d\x78\xf7\x08\x00\xde\ \xc1\x75\x2e\xcb\x4c\xbf\xf6\xaf\x85\x08\xf5\x43\x75\xcb\xaa\x89\ \xe0\x5e\x9a\x89\x26\x6e\x0e\x7a\x45\xea\x88\xc5\xd1\xf6\xa9\x89\ \x77\x10\xb1\xfd\x7d\xad\xc4\x84\xda\x2f\xde\xb0\xf2\x8a\x20\x05\ \x1d\x4d\x55\x6b\x2a\x09\xee\x46\xe0\xa6\x9a\x96\xd4\xef\x69\x68\ \x30\x9e\x4e\x3e\xf8\x5c\x2f\xa0\xae\xb9\x39\xf4\xce\xe0\xce\x2d\ \x1c\xd8\xeb\x6b\x83\x2b\xca\xd2\x6c\x77\xe4\xf6\x67\xe3\xf1\xae\ \xa0\x84\x4d\x5c\xf7\xd0\x88\xde\xb0\x73\x37\xc2\xac\xcf\x7e\x2e\ \xb0\xfa\xa4\xae\x48\xf2\xd1\x78\xdc\x09\x22\x4f\x9f\xcd\x90\x8b\ \xd7\xaf\x3c\xd9\x18\x79\x05\x18\xe9\x23\xd6\x1b\xa2\xba\x28\xfd\ \xf2\x9e\xc7\x3c\xf6\x05\xf5\xcb\xb8\xe6\xe6\xc1\xe1\x21\xfb\xae\ \x41\xf5\x36\x60\x44\x5f\x36\x2a\x34\x77\x55\x66\x67\x15\xbb\x47\ \x10\xfa\xe9\x06\x1d\xdc\x9e\xb2\x09\xff\x9b\x9f\x5f\x43\xf4\x81\ \x5e\xc7\x5d\xfb\xfc\xf4\x6b\xdf\xb5\x75\xaa\x6d\x49\x9d\xed\x8a\ \xce\x52\xa5\x1e\xa8\xb4\x70\xd9\x10\x09\x75\xc6\x37\x4d\xb9\xc1\ \x5f\x7b\xe8\x28\xfa\x6d\x87\x55\xb7\xa6\xae\x42\xf5\x61\x8e\xba\ \x57\x58\xe2\x02\xaf\x20\x6c\x45\xe5\x35\xe3\xf2\x4f\x27\x24\x1f\ \x85\xc9\xf5\xe4\xc4\x0c\x35\xae\x8c\x00\xce\x74\x85\x6f\x8a\xea\ \x04\xe0\xf4\x02\x72\x6c\xce\x75\x45\xae\x2c\xe6\xd2\xf3\xde\x28\ \xd9\xda\x34\x4f\x94\xdf\x51\x58\x11\x4a\x4d\x56\xd0\x68\x3a\x56\ \xff\x64\xa1\x01\xac\xb6\xa0\x55\xb7\xa4\x66\x80\xae\x05\x2a\x0a\ \x4d\x54\x02\xf6\x0b\x52\x97\x8e\x25\xda\x8a\x09\x62\xbd\x07\x6f\ \x7c\x6b\xaa\x5a\x55\xd7\x2a\xe4\x5d\x64\x18\x40\xfe\x01\xd4\x65\ \x62\xc9\x97\x8b\x0d\x64\x7d\x5a\x6f\x8d\x26\x32\x1a\xe2\x3c\x54\ \xff\x54\x6c\xd2\x22\x79\xac\xbc\x22\x7b\x7e\x10\x07\x0f\x85\x3e\ \x30\x71\xe0\x49\x91\xfb\xb1\x58\x56\x0b\x0a\x81\xb7\x5c\x74\x51\ \x47\xac\x7e\x75\xc0\x71\x0b\xa3\xf6\xf1\xd4\xf1\x4e\x98\x85\xa0\ \x3f\x00\x3c\x37\x23\x15\xc1\xfb\x82\x2e\xab\x28\x1b\x74\x4f\x29\ \xf6\x23\x16\xfd\xd0\xd4\xa4\xa7\x1a\x87\xf7\x74\x0f\x9a\x0f\xcc\ \x05\xce\x29\x5a\xd1\x41\x04\x5e\x51\x91\xa6\xc1\x83\x42\x4d\xa5\ \xdc\x88\x19\xe8\x63\x73\xd5\x2d\x2b\x2e\x04\x33\x03\xb8\x04\x18\ \x03\x84\x7c\xb8\x67\x15\x9e\x03\xd9\x62\x0c\xeb\xd2\x53\x13\x7f\ \x0b\x52\x5b\x3e\x4a\xf6\xe0\xe4\xd8\xb6\x35\xc3\x2a\x9c\x9e\x73\ \x1d\xe4\x6c\xe0\x74\x84\x91\xa2\x12\x11\xb4\x4c\xd1\x6e\x90\x4e\ \x84\xf7\x81\xbf\x1b\x57\x76\x97\x97\x87\x76\x96\xf2\x9b\x3e\xc6\ \x31\x8e\xd1\x27\xff\x05\x2a\x98\xf0\xb0\xfe\x83\x66\x4f\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x53\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\x56\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xbf\x40\x40\xcc\x66\x33\xd5\x55\x55\xd5\x55\x40\xd8\x62\x4e\ \xdb\x5b\x49\xdd\x55\x44\xcf\x60\x50\xd2\x5a\x4b\xd5\x55\x47\xd9\ \x59\x4d\xdc\x5d\x46\xd8\x5d\x4d\xda\x5a\x4b\xdb\x57\x49\xd5\x5c\ \x47\xd5\x5a\x4a\xd5\x58\x49\xd8\x58\x4a\xd9\x5b\x48\xd6\x59\x49\ \xd6\x5b\x4c\xd7\x5a\x4b\xd7\x59\x4a\xd8\x5b\x49\xd8\x5a\x4b\xd8\ \x59\x4a\xd6\x5a\x4b\xd7\x59\x4a\xd6\x5a\x4a\xd6\x5a\x49\xd7\x5b\ \x4b\xd8\x5b\x49\xd6\x59\x4a\xd7\x5a\x4b\xd8\x5a\x4a\xd6\x5a\x4a\ \xd7\x59\x4a\xd7\x5a\x4b\xd8\x5a\x4a\xd6\x5a\x49\xd7\x59\x4b\xd7\ \x5a\x4a\xd7\x5a\x4a\xd7\x5b\x49\xd8\x5a\x4b\xd8\x59\x4a\xd6\x5b\ \x4a\xd7\x5a\x49\xd7\x5a\x4a\xd7\x5a\x4a\xd8\x59\x49\xd6\x59\x4b\ \xd7\x5a\x4a\xd7\x5a\x4a\xd6\x5b\x4a\xd7\x5a\x4b\xd7\x5a\x4a\xd7\ \x5b\x4a\xd7\x5a\x49\xd7\x5a\x4a\xd7\x5b\x4a\xd8\x5a\x4b\xd7\x5a\ \x4a\xd8\x59\x4a\xd7\x5a\x4a\xd7\x5b\x4a\xd7\x5a\x4a\xd7\x5a\x4a\ \xd7\x5a\x4a\xd7\x5a\x49\xd7\x5a\x4a\xd8\x5a\x4a\xd7\x59\x4a\xd7\ \x59\x4a\xd7\x5a\x4b\xd7\x5a\x4a\xd6\x5b\x4a\xd7\x5a\x4a\xd7\x5a\ \x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\ \xd7\x5a\x49\xd7\x5a\x4a\xd7\x5a\x4a\xd8\x5a\x4a\xd7\x5a\x4a\xd7\ \x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\ \x4a\xd7\x5a\x4a\xd7\x5a\x4a\xe3\x8c\x81\xe4\x90\x85\xe4\x90\x86\ \xe5\x94\x89\xe5\x94\x8a\xf5\xd6\xd2\xfe\xfc\xfb\xfe\xfc\xfc\xfe\ \xfd\xfc\xfe\xfd\xfd\xff\xfd\xfd\xff\xfe\xfe\xff\xff\xff\x65\xd4\ \xe8\x75\x00\x00\x00\x64\x74\x52\x4e\x53\x00\x01\x02\x04\x05\x06\ \x0c\x0d\x0e\x0f\x10\x11\x12\x14\x16\x21\x22\x23\x24\x30\x31\x34\ \x35\x50\x51\x52\x53\x54\x55\x56\x58\x59\x5d\x5e\x5f\x62\x64\x66\ \x6f\x71\x72\x74\x7c\x7d\x7e\x7f\x80\x81\x82\x89\x8a\x8b\x8d\x8e\ \x8f\x9d\x9f\xa1\xa3\xa4\xa5\xa6\xa7\xb3\xb4\xb5\xc1\xc2\xc4\xc5\ \xca\xcb\xcc\xcd\xce\xcf\xd0\xd3\xd4\xd5\xd6\xdd\xde\xe0\xe8\xe9\ \xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf8\xf9\xfa\xfd\xfe\xdf\x19\ \xb5\xb1\x00\x00\x02\x48\x49\x44\x41\x54\x58\xc3\xad\x97\x69\x5f\ \xd3\x40\x10\x87\x37\x50\x6e\x8a\x45\x40\x5a\x2a\x78\x2b\x3d\x38\ \x5b\x50\xa1\x05\x95\x22\x22\x16\xa5\x0a\x98\x70\x58\xc8\x00\xa1\ \x94\x23\xdf\xff\x8d\x11\x0a\x34\xd9\xdd\xd9\xa3\xfe\x5f\xee\xaf\ \xcf\x93\x6e\x92\x99\xcc\x12\xc2\x49\x4f\x7c\x6c\x61\xb5\x64\x1d\ \x1c\x58\xa5\xd5\x7c\x7a\xa8\x87\x28\xe5\xd1\x4c\xd1\x06\x5f\xec\ \x62\x76\x40\x96\x6e\x4f\xfc\x00\x66\xbe\x27\xda\x24\xf0\xee\x09\ \x0b\xb8\xb1\xc6\xbb\x04\xb8\xf1\x6c\x0b\xd0\x98\xaf\x9b\x30\xfe\ \xe1\x32\x08\x53\xe8\xe5\xf3\xd1\x1d\x90\xc8\xfe\x08\x07\x6f\x9a\ \x05\xc9\x64\x99\xdb\x68\xc9\x83\x74\x72\x21\x06\xff\x11\x14\xf2\ \x81\x32\x18\xef\x41\x29\xf9\xe0\x2e\x66\x41\x31\x19\x3f\xff\x18\ \x94\xf3\xa4\x9e\xef\xdd\x55\x17\xec\x46\xea\x6e\xc0\x32\x68\x64\ \xc9\xb8\x13\xbc\x04\xad\x3c\xbf\xab\x9f\x6d\x3d\xc1\x66\x67\x4d\ \x30\x09\x9a\x49\xd7\xea\xdf\xd2\x15\x98\x37\xfd\x21\x11\x5c\x3f\ \xaa\x1c\xb1\x7e\xce\x58\x1e\xbd\x16\x14\x83\xcb\x15\xb7\x7a\x42\ \xf3\x27\x55\xb7\x42\xf5\xa8\xeb\xfe\x47\x5f\xaa\xca\x30\x78\x7c\ \x95\xfe\x63\xfd\x9e\x60\x86\xbe\xd8\xf1\x99\x7b\x79\x4a\x2f\x39\ \xec\x17\x7a\x1d\x24\x0c\x1c\x1e\xd6\xbc\xfe\x6f\x83\xd8\xc0\xe3\ \xc1\x0e\x93\x38\xfb\x09\xf9\x0c\x5c\x1e\x20\x46\xc6\x41\x68\x40\ \x78\x48\x91\x05\x10\x19\x30\x1e\xe6\xc9\x17\x10\x18\x50\x1e\x3e\ \x93\x9f\x80\x1b\x70\x1e\x4a\xc4\x04\xd4\x70\x75\x8e\xf2\xb0\x4d\ \xca\x58\xb5\x1c\x5f\xb8\xee\x15\xc6\xc3\x1f\x81\xe0\xdc\x13\x9c\ \xe2\x02\xd1\x16\x2e\xa8\xb7\x3a\xb0\x05\xc1\x4d\x74\x18\x75\xe1\ \xbf\x89\xf8\x63\x74\x98\x95\xe5\x7b\x8c\x79\x01\x2f\x30\xcc\x91\ \x31\x11\x8f\x1b\x92\x64\x48\xc8\xa3\x86\x28\x52\xce\x0e\xda\x61\ \x6e\x72\x18\x66\xb4\x44\x56\xfd\xf0\x0c\x5f\xf9\x2d\xcd\x11\x76\ \xb9\x7f\x99\xf6\x04\x03\x8d\x34\xd5\xbe\xff\xd1\xd6\x1b\xff\xb0\ \xb4\x35\xfa\x69\x23\x13\xba\x82\x54\xed\xeb\xdc\xb5\xa5\xc7\xff\ \xea\xb8\x1d\x10\x5e\xe8\x09\x9e\xde\x8f\x38\x05\x1d\xfe\x93\xd1\ \xd8\x90\xb5\x13\xa9\x1f\xd3\xe2\xea\x82\x98\x7f\x50\xcc\xaa\xf2\ \x53\xc1\x51\xf7\x9d\x1a\x9f\xa3\x06\xf6\x90\xd2\xb0\xbd\xc8\x18\ \xd7\x9b\xdf\xca\xf3\x73\x21\xe6\x79\x29\x23\x89\xdb\x53\x06\xe7\ \xcc\x32\x28\x55\x15\x7b\xc3\xfc\x43\x53\x64\x49\xe2\xfd\x79\x80\ \x1f\xfb\x36\x05\x05\xf8\xca\x10\x9c\x1c\x3b\xd3\xc8\xc7\xee\x77\ \xaa\x43\xe2\xec\xda\x3a\xba\xce\xc6\x8b\x6f\x5a\x65\x8f\xcf\xfd\ \x99\x6f\x87\x81\xfe\xbd\x36\xdd\xa7\x76\x80\x0f\xc7\x92\xb9\x95\ \x0d\xb3\x5c\x36\x37\x56\xe6\x93\xd1\x30\xef\x77\x7f\x01\x3c\xc2\ \xeb\x42\x5a\xb6\xf4\x95\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\x30\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x60\x50\x4c\x54\x45\x00\x00\x00\x00\x00\x00\x00\x80\ \x80\x00\xaa\xaa\x00\x80\x80\x00\x99\x99\x00\x80\x80\x00\x92\x92\ \x00\x80\x80\x00\x84\x84\x00\x81\x81\x00\x80\x80\x00\x80\x80\x00\ \x81\x81\x00\x81\x81\x00\x80\x80\x00\x81\x81\x00\x80\x80\x00\x80\ \x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\ \x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\ \x80\x80\x00\x80\x80\x00\x80\x80\x66\x24\xc3\x57\x00\x00\x00\x1f\ \x74\x52\x4e\x53\x00\x01\x02\x03\x04\x05\x06\x07\x1e\x1f\x4b\x4c\ \x62\x63\x75\x76\x77\x80\x9a\xa1\xa4\xa6\xa7\xab\xad\xb1\xb6\xbb\ \xc2\xc3\xf8\x12\xff\xdd\x55\x00\x00\x00\x60\x49\x44\x41\x54\x18\ \xd3\xa5\x8d\x49\x12\x80\x20\x0c\x04\xa3\xe0\x06\x2e\xa8\xb8\xa2\ \xe4\xff\xbf\x54\xa0\x10\x39\x78\xb2\x6f\xdd\x55\xc9\x00\x18\xb8\ \x46\xd4\x0c\x02\x3d\xde\xf4\x3f\x42\xd5\x09\x65\x82\x12\x6d\x69\ \x43\x83\x0f\xb5\x0d\xc9\xe0\x7d\x4c\xdd\x0d\x91\xce\x17\xea\xbf\ \x90\xd9\xf8\x4a\xc3\x4a\xb6\x21\xee\xc5\x6b\x16\x8a\x49\xe6\xf0\ \x01\x17\x11\x0c\x34\x46\x68\x38\xe3\x70\x5c\x48\x7e\x0d\x95\xc4\ \xee\xc7\xf8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xd7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xf3\x50\x4c\x54\x45\x00\x00\x00\x00\x80\x80\x00\x99\ \x99\x00\x80\x80\x00\x84\x84\x00\x84\x84\x00\x83\x83\x00\x83\x83\ \x00\x83\x83\x00\x83\x83\x00\x82\x82\x00\x82\x82\x00\x82\x82\x00\ \x82\x82\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\ \x80\x00\x82\x82\x00\x80\x80\x00\x80\x80\x00\x81\x81\x00\x81\x81\ \x00\x81\x81\x00\x81\x81\x00\x80\x80\x00\x80\x80\x00\x81\x81\x00\ \x80\x80\x00\x81\x81\x00\x80\x80\x00\x81\x81\x00\x81\x81\x00\x80\ \x80\x00\x80\x80\x00\x81\x81\x00\x81\x81\x00\x81\x81\x00\x80\x80\ \x00\x81\x81\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\ \x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\ \x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\ \x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\ \x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\ \x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\ \x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x00\ \x80\x80\x00\x80\x80\x00\x80\x80\x00\x80\x80\x07\xbd\x0c\xca\x00\ \x00\x00\x50\x74\x52\x4e\x53\x00\x04\x05\x1c\x1d\x1f\x23\x25\x27\ \x29\x2b\x2d\x2f\x31\x34\x36\x38\x3a\x3c\x3d\x40\x42\x45\x47\x4b\ \x4d\x50\x52\x55\x56\x59\x5c\x5d\x5f\x62\x64\x65\x69\x6b\x70\x77\ \x78\x8f\x90\x91\x92\x9a\x9c\xa9\xaa\xac\xae\xaf\xd7\xe0\xe3\xe5\ \xe7\xe8\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\ \xf8\xf9\xfa\xfb\xfc\xfd\xfe\x52\x57\x4b\x28\x00\x00\x01\x43\x49\ \x44\x41\x54\x58\xc3\xed\x97\x69\x4f\xc2\x40\x10\x40\x47\x5b\xa5\ \x80\xf7\x7d\xe1\xad\x78\x6b\x8b\xa0\x08\x16\xda\x15\xac\x28\x76\ \xfe\xff\xaf\xf1\x8b\xf1\x28\xd3\x76\xa6\x9b\x98\x98\xf4\x7d\x7f\ \x2f\x21\x3b\x3b\x65\x01\x68\x4c\x47\xe1\x0f\x54\xcd\x02\x11\xa6\ \x8b\x11\x5c\x43\x14\x70\x70\x04\x5b\x14\x50\xa3\x01\x5f\x14\x40\ \x82\x3c\x90\x07\xf2\x40\x1e\xf8\xbb\xc0\xf8\x69\xfd\x05\x19\x04\ \xf5\x93\x31\x32\x70\x81\x6c\xce\xc8\x80\xc7\x0f\xb8\x64\xa0\xc5\ \x0f\x34\xc9\xc0\x35\x3f\x70\x45\x06\x8c\x06\xd7\x6f\xc4\x7c\xa5\ \x26\x98\x85\xbb\xc9\xb8\x83\x2c\xdc\x73\xfc\x87\x62\xfc\x28\x58\ \xcd\x74\xbf\x55\x4a\x1a\xa6\x72\x3b\xcd\x6f\x97\x93\xc7\x71\xea\ \x31\xd9\xef\xce\xa4\x0d\xf4\x74\x27\xc9\xf7\x66\xd3\xef\xd1\x9c\ \x8a\xf7\x7b\x8b\x9c\x9b\x38\xff\x14\xe7\xf7\x97\x78\x77\x79\xa1\ \x47\xfb\xcf\xcb\xdc\x6d\xb0\x12\x50\xfe\x60\x8d\xbf\x4f\x56\x89\ \xc5\x30\x58\x97\x6c\xa4\x8d\xd7\xa8\x3f\xac\xc8\xfe\xe7\x6d\xbe\ \x45\xfc\x6d\x10\xb2\xf5\xab\x30\xdc\x01\x31\x7b\xef\xdf\x7e\x78\ \x08\x19\xd8\xff\x2a\x84\x47\x90\x89\x83\xf0\xd3\x3f\x86\x8c\x54\ \x43\x44\xc4\xb0\x0a\x99\xa9\xf4\x11\x83\x5d\xd0\xa0\x74\x79\x5e\ \x84\x9c\x7f\x40\xe4\x7d\x26\x41\xd5\x2c\xea\x7d\x26\xc1\x35\xa8\ \xf7\x99\x04\x1b\x94\x5e\xc0\x07\xd4\x44\x3f\xa0\xf9\x13\x3c\xb8\ \xd5\x0b\x38\x60\x75\xb4\x8e\xb1\x00\x60\xda\x7e\xe6\x23\xb8\x31\ \xe0\x03\xd5\x2d\x1e\x41\xf9\x4f\x2e\x99\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xe7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\x41\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xff\ \xff\xbf\xbf\xbf\xcc\xcc\xcc\xd5\xd5\xd5\xbf\xd5\xbf\xc4\xc4\xc4\ \xc8\xc8\xc8\xcc\xcc\xcc\xbf\xcf\xbf\xc3\xc3\xc3\xc6\xc6\xc6\xcc\ \xcc\xcc\xc5\xc5\xc5\xc9\xc9\xc9\xcb\xcb\xcb\xc5\xcc\xc5\xc6\xcd\ \xc6\xc5\xca\xc5\xc6\xcb\xc6\xc9\xc9\xc9\xc5\xca\xc5\xc6\xc9\xc6\ \xc6\xc9\xc6\xc7\xca\xc7\xc8\xcb\xc8\xc8\xcb\xc8\xc6\xc9\xc6\xc7\ \xca\xc7\xc8\xcb\xc8\xc6\xc9\xc6\xc8\xcb\xc8\xc6\xc9\xc6\xc7\xc9\ \xc7\xc6\xcb\xc6\xc7\xc9\xc7\xc8\xcb\xc8\xc8\xca\xc8\xc7\xcb\xc7\ \xc7\xc9\xc7\xc8\xca\xc8\xc7\xca\xc7\xc8\xca\xc8\xc6\xca\xc6\xc7\ \xcb\xc7\xc7\xc9\xc7\xc8\xca\xc8\xc6\xca\xc6\xc7\xcb\xc7\xc8\xc9\ \xc8\xc6\xca\xc6\xc7\xcb\xc7\xc7\xc9\xc7\xc8\xca\xc8\xc8\xc9\xc8\ \xc7\xca\xc7\xc8\xcb\xc8\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\ \xc9\xc8\xc7\xca\xc7\xc7\xca\xc7\xc6\xcb\xc6\xc7\xc9\xc7\xc8\xca\ \xc8\xc6\xca\xc6\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\ \xc7\xcb\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\ \xca\xc7\xc6\xca\xc6\xc7\xca\xc7\xc7\xcb\xc7\xc6\xca\xc6\xc7\xca\ \xc7\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\ \xc7\xca\xc7\xc7\xca\xc7\xc7\xcb\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\ \xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\ \xc7\xc7\xca\xc7\xc7\xca\xc7\xcc\xcf\xcc\xcf\xd1\xcf\xe0\xe2\xe0\ \xec\xed\xec\xee\xef\xee\xff\xff\xff\x10\x9f\x5d\x20\x00\x00\x00\ \x64\x74\x52\x4e\x53\x00\x01\x02\x04\x05\x06\x0c\x0d\x0e\x0f\x10\ \x11\x12\x14\x16\x21\x22\x23\x24\x30\x31\x34\x35\x50\x51\x52\x53\ \x54\x55\x56\x58\x59\x5d\x5e\x5f\x62\x64\x66\x6f\x71\x72\x74\x7c\ \x7d\x7e\x7f\x80\x81\x82\x89\x8a\x8b\x8d\x8e\x8f\x9d\x9f\xa1\xa3\ \xa4\xa5\xa6\xa7\xb3\xb4\xb5\xc1\xc2\xc4\xc5\xca\xcb\xcc\xcd\xce\ \xcf\xd0\xd3\xd4\xd5\xd6\xdd\xde\xe0\xe8\xe9\xea\xeb\xec\xed\xee\ \xef\xf0\xf1\xf2\xf8\xf9\xfa\xfd\xfe\xdf\x19\xb5\xb1\x00\x00\x01\ \xf1\x49\x44\x41\x54\x58\xc3\xad\x97\xe9\x56\xc2\x30\x10\x85\x53\ \x45\x51\x11\x04\x11\x05\x71\xdf\x59\x14\x11\xdc\x10\x50\x71\x41\ \x54\x44\x71\x6d\x71\x01\x3a\xb8\xbd\xff\x03\x88\x52\x90\x62\x4b\ \x93\x8c\xf7\xdf\x9c\x93\xfb\x9d\x93\x36\x99\xdc\x21\x44\x47\x36\ \xef\x72\x32\x93\x97\x4a\x25\x29\x9f\x49\x04\x47\x6d\x84\x49\xc3\ \xeb\x59\x19\x54\x92\xb3\x51\x17\xad\xbb\xc7\x77\x09\x9a\xca\xf9\ \xcc\x14\xf6\xfe\x90\x04\xba\x92\x56\x2c\x06\x76\x61\xfa\x0e\xda\ \x4a\x5c\xe8\x68\xe7\x1f\x3c\x02\x43\x1d\x3a\xf4\xfd\xee\x02\x50\ \xe8\x79\x42\xc7\xde\xb1\x01\x94\x8a\x6a\x6e\xa3\x2b\x01\xd4\x8a\ \x9b\x34\xfc\xfb\xc0\xa0\xbd\x3f\x04\x61\x1b\x98\x94\x68\xdd\xc5\ \x06\x30\x2a\xa2\xf6\x8f\x01\xb3\x26\x9b\xfd\x8e\x47\x76\xc0\xa3\ \xbd\xe9\x03\xa8\xcf\x4f\xe5\x5d\xd1\x5b\xad\x7e\xab\xd7\x15\xd5\ \xb2\x03\xa1\x01\x98\x53\xb3\x5f\x3f\x15\x7d\xd4\xea\x8f\x7a\xfd\ \xaa\x5e\x37\xd3\xb8\x3f\xf7\x7c\x80\xdb\x3e\x05\xb0\x0a\x7c\x00\ \x08\x2a\xf7\x5f\xe2\x05\x88\xb5\xfe\xe0\x03\x5e\x00\x2c\xfd\x00\ \xb2\xfc\x80\xdc\x4f\xff\x03\x7e\x00\x0c\x55\x01\xeb\x18\xc0\xf7\ \x81\xbe\xc0\x00\xce\xaa\xfd\x5f\xc6\x00\x64\x2b\xf1\x02\x06\x00\ \x1e\xb2\x82\x03\x04\x48\x12\x07\xd8\x21\x27\x38\xc0\x31\xb9\xc6\ \x01\xf2\x44\xc4\x01\xee\x49\x11\x07\x78\xc1\x03\xd0\x5b\x40\x7f\ \x44\xf4\x6f\x4c\xe0\x00\x31\xb2\x8c\x03\xf8\xc9\x28\x0e\xe0\x46\ \x5e\xe7\xb2\x55\xa3\x25\xb2\x00\x4e\xb1\x2d\x6d\xad\x0a\x70\x61\ \x00\xce\xff\x68\xeb\xf8\x87\xc5\x8c\x7d\xda\x48\x88\x17\x10\x50\ \x5e\x67\xcb\x1d\x1f\xe0\xa6\xb7\x1e\x10\x66\xf9\x00\x53\xbf\x11\ \xe7\x90\x27\xe2\xa4\x04\x5c\xc8\x2a\xd8\x9b\x63\x9a\x97\x1d\xe0\ \x51\x07\xc5\x28\xab\x3f\xdc\x1a\x75\xb7\xd8\xfc\xf1\x3f\x81\xdd\ \xc4\x14\xb6\x77\x35\xe2\x7a\xe7\x26\xbd\x3f\x66\xd2\x9c\x97\x22\ \x94\x76\x39\x2c\xe8\xcc\x2c\x23\x12\x8d\xff\x69\x5c\x7f\x68\xb2\ \x1f\x18\xfb\x53\x03\xed\xc7\xbe\x5b\x83\xb1\x6f\x5e\x30\x98\x1c\ \xfb\x82\xa2\xbe\xfd\x21\xd0\x4b\x31\xbb\x76\x2f\x5d\x68\xdb\xb3\ \x8b\xdd\xb4\xe3\xf3\x50\xe4\xbc\xdc\xd2\xbf\xcf\xd6\x9c\x6c\x03\ \xbc\xd5\xe3\x8f\xa7\xaf\xc4\x62\x51\xbc\x4a\xef\xf8\xdd\x56\xbd\ \x75\x5f\x6f\x58\xf3\xa6\xea\xd2\x78\xb1\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x0f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x2c\x00\x00\x04\x2c\ \x01\x50\x7c\x34\x88\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x8c\x49\x44\ \x41\x54\x38\x8d\xa5\xd2\xbf\x4b\x02\x61\x18\x07\xf0\xef\x7b\xa7\ \x5e\x78\x97\x94\xc7\x65\x39\x84\x83\x44\xd0\x7f\xd0\x5c\x4b\x54\ \x54\x70\x43\xb8\xd8\x1e\x49\x2d\x41\x05\x59\xd4\x56\x53\x50\x41\ \x61\x06\x05\x91\xb4\x54\x28\x99\x83\x43\x7f\x44\x51\xd0\x12\x62\ \x7a\x0a\x7a\x7a\x99\x9c\xbe\x0d\x56\x44\x71\xa9\xf5\x6c\xef\x8f\ \xcf\xf3\x3c\x3c\xef\x0b\x34\x11\x4a\x54\x5a\xff\xbe\xc7\xd4\x45\ \x57\xd2\x5a\x26\x6c\xb7\xbd\x2f\x79\x00\x78\x8e\x75\x38\x52\xd7\ \x8e\xc5\x86\x12\x90\x4a\x65\xb7\xc2\x9a\xb6\x28\x05\x01\x65\xce\ \x13\x17\x4e\x2b\x43\xb1\xc9\x55\xcc\x3b\x0d\xb7\x7e\x1f\x76\x73\ \x5e\xef\x41\xcb\x94\x6f\x7f\x9b\x52\x10\x7a\xda\x67\xf9\x38\x33\ \x19\x21\x7a\x0a\x36\xd3\x26\xad\x56\xc1\xb0\x6a\x81\xbb\xe4\xa4\ \x96\x63\xc1\xd6\xd9\x3d\xe5\xdb\xb3\x6c\x8c\x2e\x9d\xa4\xa2\x8e\ \x01\x00\x79\x52\xaf\xba\xec\xf7\x5b\xda\xd5\x9e\xbb\xd6\xb6\x2e\ \x57\x51\x4d\xa7\xd5\x97\xa4\xfb\x48\x9c\x29\x10\x3f\xaa\xbf\x76\ \x00\x00\xb2\x2c\xb3\xa5\xdb\xd2\x19\xdf\x2b\xb9\x8a\x6a\x3a\x35\ \xd7\xbf\xec\x11\xd8\x9c\xae\x70\x1d\xc1\x4c\x58\x9f\x16\x87\xb2\ \x79\xc3\x21\xca\xb2\xcc\x2a\x1a\x7f\x58\xcc\x27\x87\x1f\x6e\x63\ \x37\x65\xe5\xd1\x6d\xb7\x2a\xc3\xce\x91\x84\xc6\xe8\xfa\x42\xd5\ \x6c\x9a\x05\x0c\x5e\xe1\x03\x13\x0a\x0f\x40\x22\x7a\x4e\x1b\x08\ \x04\xe6\x55\x4a\x48\x19\x00\xc4\xa1\xec\x93\x34\x98\x5a\x01\x80\ \x1f\x33\xf8\x8e\x39\x2a\x8c\x47\x22\x5b\xaf\x00\x40\x29\x08\x21\ \xa0\x5f\xef\x93\x46\xb1\x51\x10\x23\x5c\xd5\xe8\x44\x3c\x1e\x2c\ \xfd\x86\x3f\x13\xfc\x15\x03\x00\xf9\x0f\x06\x00\x26\x5b\x14\x02\ \x35\x4c\x2f\x45\xbe\x30\xd6\x0c\x06\x6a\x1f\x29\x04\x40\x10\x79\ \x6d\x32\x14\x0a\x95\x9b\xc1\x00\xf0\x06\x2d\x61\xbf\x82\x10\x98\ \xd3\x18\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x54\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x01\x0b\x50\x4c\x54\x45\x00\x00\x00\x66\x99\xcc\x80\x80\ \xaa\x89\x00\x89\x80\x00\x80\x77\x88\xc1\x7d\x8e\xc1\x74\x8b\xc2\ \x77\x8d\xc3\x80\x00\x80\x80\x00\x80\xe9\xed\xef\xe9\xed\xef\x80\ \x02\x82\xe9\xee\xee\x84\x95\xc7\x86\x97\xc8\x85\x97\xc8\x86\x96\ \xc8\x85\x97\xc7\x89\x9a\xcc\x8a\x9a\xcc\x87\x97\xc9\x8f\xa0\xcc\ \x8f\xa0\xcc\x93\xa7\xcf\x89\x99\xcd\x93\xa5\xce\x93\xa5\xcf\x93\ \xa6\xce\x93\xa6\xcf\x89\x9a\xcd\xa0\xb4\xd5\xa0\xb2\xd5\xa0\xb4\ \xd5\x81\x18\x8b\x80\x00\x80\x9e\xb0\xd6\x9d\xb0\xd5\x80\x10\x87\ \x9e\xaf\xd7\x9c\xae\xd7\x8d\x43\xa0\xbd\xd3\xe2\xe7\xec\xed\x80\ \x00\x80\x81\x04\x82\x82\x08\x83\x86\x14\x89\x8c\x23\x90\x94\x3c\ \x9c\x9f\x5a\xaa\xa1\x69\xb0\xab\xbb\xe7\xac\xba\xe7\xad\xbb\xe7\ \xb5\xc4\xee\xb6\xc4\xed\xb8\xc9\xed\xb8\xc9\xee\xb9\xae\xd0\xbc\ \xce\xec\xbd\xca\xf0\xbd\xcb\xf0\xbd\xce\xec\xbf\xbf\xd8\xbf\xcc\ \xf0\xbf\xcd\xef\xc1\xc4\xdb\xc1\xd4\xeb\xc1\xd5\xeb\xc6\xd5\xe2\ \xc7\xdd\xe6\xc7\xdd\xe9\xc7\xde\xe7\xca\xe1\xe8\xd0\xe4\xeb\xd2\ \xe6\xec\xeb\xf3\xf8\xec\xf0\xf1\xec\xf3\xf8\xed\xf5\xf7\xed\xf5\ \xf8\xee\xf6\xf8\xf5\xf7\xf8\xf8\xf7\xfa\xfa\xfb\xfe\xfb\xfd\xfd\ \xfc\xfd\xfe\xbb\xa4\x0e\xc8\x00\x00\x00\x2d\x74\x52\x4e\x53\x00\ \x05\x06\x0d\x22\x2d\x2d\x2e\x2f\x54\x94\x9f\xa0\xa1\xa1\xa4\xa6\ \xa7\xa8\xa9\xba\xbf\xc1\xcc\xcd\xd9\xda\xda\xda\xda\xda\xdc\xe7\ \xe8\xe8\xea\xee\xef\xf0\xf1\xf2\xf3\xf6\xfc\xfe\x7b\x29\x26\xfb\ \x00\x00\x00\xcb\x49\x44\x41\x54\x18\x19\x05\xc1\xd1\x4e\xc2\x30\ \x14\x80\xe1\xff\x9c\xb5\xeb\x32\x12\x98\xce\x18\x6e\x5c\x8c\x7a\ \xc1\xfb\x3f\x8d\x5e\x69\x50\x30\x22\x89\x26\x08\x5b\xdb\xb5\xf5\ \xfb\x04\xa0\x59\xd8\x9a\x10\x2e\x12\x67\x04\xb4\xbf\x7a\x12\x20\ \xbd\xd4\xfb\x13\x82\xde\xad\x4d\x07\xcc\xdf\x29\x33\xee\x95\x7e\ \x2d\x29\x00\x66\x25\x50\xbc\x69\x7a\x2d\x24\x57\x13\xf5\x57\x8a\ \x33\xa6\x7d\x28\x63\xb9\xc9\x23\xb6\xd1\x7e\x9a\x5a\x53\x8b\x2c\ \x6c\x7e\x7e\x95\xfb\xcd\x10\xdc\xea\x5d\x2d\xd0\xc4\xb7\xf3\xdf\ \x36\x3a\xc0\x28\x00\x28\x00\x40\xd6\x08\x44\x3b\x2c\x97\x83\xf5\ \x40\x36\x21\x55\x84\x76\xf3\x88\xd5\x9f\xca\x26\x5f\xcd\xe1\x96\ \x12\xa5\xb1\xd3\x71\xf2\xfe\xe3\x58\xe5\x92\x3b\x48\x21\x14\x9f\ \x49\x9f\xa7\x8a\x48\xec\x00\xb0\x3e\xed\x0e\x54\x94\xd1\x9f\xaf\ \x15\xc8\x5f\xbb\x43\x41\x00\x5c\x5b\xbb\x1c\xfd\x25\x00\xff\x90\ \x65\x60\x2a\xd5\xca\xcf\xc8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x02\x6f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xba\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xaa\xaa\ \xaa\xbf\xbf\xbf\xaa\xaa\xaa\x9f\x9f\x9f\xa4\xa4\xa4\x9f\x9f\x9f\ \x9e\x9e\x9e\xa2\xa2\xa2\x9f\x9f\x9f\x9e\x9e\x9e\xa2\xa2\xa2\xa2\ \xa2\xa2\x9f\x9f\x9f\xa2\xa2\xa2\x9f\x9f\x9f\xa0\xa0\xa0\x9f\x9f\ \x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\ \xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\ \xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\ \xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa1\ \xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\x68\x67\xcb\x9e\x00\x00\x00\x3d\x74\x52\x4e\x53\x00\x01\ \x03\x04\x06\x08\x0e\x10\x15\x16\x18\x1d\x21\x2c\x30\x37\x38\x3b\ \x3d\x4b\x51\x5b\x61\x62\x6b\x6c\x71\x73\x85\x86\x87\x8e\x8f\x9a\ \x9b\xa1\xaa\xab\xae\xb1\xba\xbf\xcc\xcd\xd1\xd8\xda\xdc\xe2\xe5\ \xed\xee\xf0\xf4\xf5\xf6\xfa\xfb\xfc\xfd\xfe\x22\xc6\x9f\x28\x00\ \x00\x01\x27\x49\x44\x41\x54\x58\xc3\xed\x94\x6b\x43\x82\x30\x14\ \x86\x81\x10\xa3\xac\x44\xbb\x69\x81\x84\x4a\xd9\x05\x0d\x4a\xed\ \x72\xfe\xff\xdf\x2a\xdb\xb8\xc3\x76\x36\x3f\xb6\xf7\x0b\x6c\xec\ \x3d\x6c\xe7\x9c\x67\x9a\xa6\xa4\xa4\xf4\x4f\x64\xdb\xfb\xf9\xad\ \xa7\xe7\xee\x3e\x7e\xf3\x01\x60\xd1\x91\xf7\x1b\x73\xf8\xd5\xfd\ \x81\xac\x5f\x0f\xe0\x4f\x53\x5d\x32\x80\x07\x54\xae\x9c\x7f\x04\ \x99\x6e\x64\xfc\x17\x5f\x79\x80\xef\x4b\x71\xff\x70\x0b\x05\x7d\ \x9e\x8b\xfa\x9d\x35\x71\x46\x11\x79\xae\x1d\x31\xff\x49\x4c\x7c\ \xaf\xbd\xe3\x15\x79\x7b\x3b\x15\xf1\x17\x5d\x79\x2c\xbc\xff\xf0\ \x85\x78\x36\x83\xdd\xe8\xec\x9d\x8c\x96\x47\x78\x00\xca\x99\x4b\ \xf3\x89\xc5\x62\x07\x40\xb9\x76\x69\x45\x71\x58\x10\x00\xca\xdd\ \x73\x4d\xa7\x30\x58\xa4\x00\xc0\x6d\x71\xd6\x05\x34\x16\x5e\xe3\ \x52\xfd\x0e\x8b\xc5\xa8\x65\xb3\xc6\x0c\x87\x45\x7b\xba\xb2\xd4\ \x5e\x31\x01\xf8\x68\x2f\x98\xf5\xc8\xc7\xa2\xcf\x6c\x99\x72\x7b\ \xb1\x01\xe0\x37\xb8\xcc\x77\xde\x1f\xf8\x3b\x64\x63\x51\x05\x80\ \x7d\xcd\xd4\xb3\x5c\x07\x40\xb0\xce\x3e\xed\x93\x31\xaf\xd3\xc6\ \x74\xa1\x5f\x99\xa7\xe9\xf1\xd0\x97\x7d\xdc\x18\x20\xd0\xd1\xb4\ \xc5\x4d\x47\x08\x0d\x14\xef\x61\xd3\x11\xcc\x49\x92\x4c\x4c\xe4\ \x8d\x23\xb0\x56\x49\x49\x49\x09\xaf\x1f\x6e\x9e\x62\xae\x84\xc1\ \x5c\xd4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x09\x26\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x08\xed\x49\x44\x41\x54\x78\xda\xe5\x5b\x69\x6c\x15\x55\ \x14\xbe\x80\xec\x35\x56\x04\x03\x01\x44\x29\x24\xec\xbb\x2c\xb2\ \xef\xfb\xd2\x05\x13\x96\x10\xca\x1f\xf8\x43\x14\xff\xb9\xb2\x18\ \x25\x68\xf0\x2f\x31\xc4\x04\x28\x9b\x50\x15\x04\x64\x6d\x10\x01\ \x05\xdb\x42\xda\xf7\xda\x22\x3b\xfc\x50\xd6\x2a\xd8\x57\x5a\xda\ \xbe\xe3\xf9\xa6\x73\x5f\x87\xe9\xcc\x7b\x33\x77\xde\x52\x62\x93\ \x2f\x7d\xcb\xcc\x7d\xf7\x9c\x39\xf7\x2c\xdf\x3d\x57\x88\x18\xff\ \x7d\x2f\xc4\xab\xdf\x0a\x91\xbe\x57\x88\xd5\xfc\x7f\xd7\x1e\x21\ \xf2\x19\xd7\x19\xa5\x8c\xa7\x3a\x4a\xf5\xcf\xf2\xf9\xba\x9d\xfc\ \xff\x13\xdc\xc3\xff\xdb\x89\xe7\xf1\x2f\x5b\x88\x21\x2c\xc8\x57\ \x2c\x80\x8f\x11\x64\x90\x22\x70\x6f\x21\x63\xe3\x6e\x21\x06\x35\ \x68\xa1\xf7\x0b\xf1\x22\x4f\xf4\x3d\x46\x91\x59\x90\x9f\x92\x92\ \xe8\xb7\xce\x9d\xc9\xdf\xab\x17\xdd\x1a\x36\x8c\xee\x8c\x19\x43\ \xa5\x93\x26\xd1\xe3\x69\xd3\x34\xe0\x35\x3e\xc3\x77\xb8\x06\xd7\ \x1e\x6a\xdd\xda\x4a\x21\x7e\xb6\x8c\x55\xfc\x3f\xa9\xc1\x08\xbe\ \x43\x88\x97\x79\x52\x6b\x78\x52\x0f\xe5\x44\xf7\x36\x6a\x44\xa7\ \x3b\x74\xa0\x1b\x6f\xbe\x49\x81\x99\x33\x89\xe6\xcf\x57\x02\xee\ \xc5\x18\x18\x0b\x63\x1a\x14\xf1\x00\xcb\xe4\x07\x21\x92\x13\x26\ \x38\x09\xd1\x88\xcd\x3c\x93\x27\x72\x4f\x4e\xec\x60\xab\x56\xf4\ \x47\xff\xfe\x54\x31\x67\x8e\xb2\xd0\x76\x78\x32\x7b\xb6\x36\x36\ \x7e\xc3\xa0\x88\x3b\x3c\x87\x25\x98\x4b\x5c\x85\xe7\xf5\x98\xc2\ \x3f\x7e\x5a\x4e\x04\xe6\x8a\x27\x55\x93\x9e\x1e\x75\xc1\xcd\xc0\ \x6f\x5c\x1f\x32\xc4\xbc\x44\x4e\x31\xde\x88\x8b\xf0\x6c\xee\xf3\ \x74\xaf\x4d\xd9\x6c\x96\x17\xdb\xb4\xa1\xaa\xb7\xde\x8a\xb9\xe0\ \x66\x54\xa7\xa5\x69\xfe\xe2\xbb\x26\x4d\xa4\x12\x1e\xf1\xdc\xde\ \x8e\xb5\xc9\x7f\x29\xb5\x7e\xac\x45\x0b\x7a\xdc\xad\x1b\x11\x4f\ \x82\x7a\xf7\x26\x9a\x3b\x37\xee\x4a\x00\xe0\x44\x8f\x25\x27\x1b\ \xa3\xc6\xfa\xa8\x2f\x89\xaf\x85\x68\xca\xc2\x67\x49\xe1\x2f\xf0\ \x53\xaf\xe9\xd9\xb3\x56\x78\x89\x11\x23\x12\xa2\x00\x69\x0d\xf9\ \x29\x29\xa1\x25\xc1\x73\xdd\x72\x52\x88\x17\xa2\x26\x3c\x0f\xfa\ \xa3\x3e\x30\x5d\x65\x8f\xfc\x8c\xe0\x46\xcc\x9a\x95\x30\x25\x00\ \x57\x06\x0e\x34\x46\x8b\xfd\x9e\x95\xa0\x9b\x7d\x96\x5c\xef\xb7\ \x3b\x75\xb2\x17\x1e\x60\x47\x98\x48\x05\x00\xb7\x87\x0f\xa7\xec\ \xc6\x8d\x43\x96\xe0\x69\x39\xc8\x35\x8f\x27\x1f\x51\x78\x09\x5e\ \x93\x0d\x41\x09\x06\x4b\x58\xaf\x24\x3c\xdf\x98\x21\xd7\xd4\xe5\ \xf6\xed\x9d\x09\x0f\xb0\x19\x52\x46\x46\xc2\x95\x70\x75\xd0\x20\ \xa3\x63\x4c\x55\x89\xf3\xff\x48\x87\xe7\x58\x78\x09\x4e\x6d\x13\ \xad\x00\x20\xaf\x6b\x57\xa9\x84\xbf\x1d\xe7\x09\x58\x33\x32\xc9\ \x41\xa8\xab\xe7\xed\x9d\xa0\x5f\x3f\xa2\x38\x24\x45\x4e\xa2\x83\ \x21\x44\x9e\x74\xe4\x0f\xf4\xf4\x56\x73\x7a\xa1\x38\xaf\x82\x71\ \xe3\x1a\x84\x15\x3c\x9a\x3a\x35\xe4\x14\x39\x51\x5a\x1c\xb1\xb0\ \x91\xb9\xbd\xbf\x5d\x3b\x75\xe1\x81\x3e\x7d\x88\x52\x53\x43\x13\ \x09\x2e\x5e\x4c\x55\xeb\xd6\x51\xc5\xf6\xed\x54\x7e\xe2\x04\x05\ \xf2\xf2\xa8\xac\xa8\x48\x03\x5e\xe3\x33\x7c\x87\x6b\x70\x6d\x34\ \x95\xe0\x63\x2b\x96\xb5\x03\xe3\xa5\x70\x69\xee\x1a\x2d\xb7\x6f\ \xd6\x8c\xaa\x55\x4c\xdf\x8c\x51\xa3\xa8\x66\xc5\x0a\xaa\xd8\xb1\ \x83\xca\x0a\x0b\xa9\xac\xa4\xc4\x19\xf8\x5a\xdc\x83\x7b\xa3\xb5\ \x14\x0c\x45\xd4\x87\x96\xc2\x6f\x13\xa2\x35\x7f\x79\x1f\x17\xdd\ \x18\x3c\x98\x68\xfc\xf8\xda\xa7\xa8\x2a\x3c\x47\x83\xca\x0d\x1b\ \x6a\x9f\xb2\x53\xc1\xcd\xe0\x7b\x2b\x37\x6f\x26\x5a\xb0\xc0\xb3\ \x12\xae\xb1\x4c\x86\x52\x3a\xc9\x2a\xec\xbd\x27\x4b\xda\x50\x55\ \x37\x6f\x1e\xd1\xc8\x91\xb5\xb9\xbe\x0b\xe1\x6b\x26\x4e\xa4\xf2\ \xa3\x47\xd5\x05\x37\xa1\xfc\xf8\x71\x0a\x2e\x5b\xe6\xb9\x8a\x3c\ \xd0\xb2\xa5\x4c\x90\xde\xb5\x52\x80\xc6\xe4\xa0\xe6\xae\x37\x00\ \xea\x7b\x4e\x2e\x1c\x09\x3f\x73\x26\x05\xce\x9d\x0b\x2b\xd0\x93\ \xe2\x62\xaa\x60\x3c\xd5\x81\xd7\xf8\x2c\xdc\x3d\x18\xb3\x66\xe5\ \x4a\x4f\x4a\xb8\xc4\xd1\x49\xb7\x82\xc2\x7a\x1c\x9e\x64\x72\x40\ \x3c\xd8\x0e\x32\x63\x06\x11\x96\x47\x98\x27\x6f\x27\x7c\x39\x0b\ \x58\xc5\x08\xb2\x59\x93\x0d\xf0\x1d\xae\x09\x84\x51\x42\x30\x33\ \xd3\x13\xa9\x62\xc8\x10\x07\x18\x43\x1f\x08\x4c\x8d\x7a\x72\x34\ \xd8\x94\x29\x44\x03\x06\x3c\xab\x00\x7e\x5f\x7e\xf8\xb0\xe5\xc4\ \xf1\x94\x29\x8c\xe0\x56\x78\x6a\x63\x11\xe5\x39\x39\x44\x0b\x17\ \x2a\x2b\xe1\x17\xce\x6a\x75\x05\x7c\x61\x34\x7f\x9f\xe6\xfc\xdc\ \x14\x33\x48\x77\x27\x4c\x20\xea\xdb\x57\x53\x80\xe6\xf0\xcc\x4f\ \x8c\x51\xad\x20\xbc\x44\xb5\x8d\x35\x54\x6e\xda\xa4\xac\x00\xb0\ \x49\xba\x02\x2e\x86\x78\x7b\x49\x5d\x2b\x11\x98\xec\x5c\x6a\xf8\ \xbf\x95\xb7\xf7\x22\xbc\x51\x09\xf5\x14\x5b\x50\xa0\xbc\x14\x20\ \xa3\xac\x11\x76\x0a\xd1\x56\xe8\x1b\x10\x1a\x75\xad\xaa\x55\x2d\ \xce\xbb\x37\xfb\x7f\x19\x3e\x86\x5f\x7f\xed\x6a\x39\x54\x6e\xdd\ \xaa\x3c\x5f\x03\x9f\x98\x8a\xf5\xbf\x1a\x6f\xc0\xc5\xab\x0c\x86\ \xac\xcd\x9c\xe4\x04\xc2\x0b\x5f\x4c\x3e\x5f\x1a\x5d\xb9\xd2\x3c\ \x54\x7f\xf0\x6b\xf2\xfb\xd3\xf9\xbb\x12\xbb\xfb\x02\x16\xc9\x52\ \x70\xd1\x22\xa5\x39\xff\xca\xa5\xbd\x1e\x0e\x3f\x12\xfa\x56\x94\ \x46\x30\xaa\x0c\x86\xd4\xd5\xfc\x74\xaa\xec\x14\x50\x5c\x7c\x80\ \xf2\xf2\x5a\xd9\x16\x62\x05\x05\xad\xf9\xba\x83\x56\xf7\x56\x59\ \x58\x41\xd5\xda\xb5\x9e\x52\x63\x90\x3d\x70\x80\x79\x78\x83\x5d\ \x19\x25\xf3\xe7\xfc\xdd\x3c\x31\x9b\x50\x57\x14\x4e\x78\x93\x12\ \x4a\xac\x42\xa4\xf9\x77\x2a\xb2\xb2\x94\xe6\x7c\x73\xe8\x50\xb9\ \x04\x7e\x87\x02\x6e\xe2\xcd\xdd\xb1\x63\x95\x06\x43\x11\xf3\x4c\ \x92\xc3\xb0\x7c\xfa\x6c\xf6\x8e\xa9\xb8\xa2\xa2\x0c\xab\x31\xcc\ \xc9\x12\x32\x44\x95\x39\x63\x1b\x4e\x57\xc0\x75\x21\xb7\xb4\x4a\ \x15\x49\x8c\x40\x7e\xfe\xb3\x4f\xc5\xda\xfc\xcb\x8c\x6b\x3e\xa2\ \x02\x6e\xdc\x68\xc1\xf7\x04\xcc\xe3\x54\x98\x14\x10\xc8\xcd\x55\ \x9a\xf3\x43\x4e\xd8\x74\x05\xdc\x87\x02\x2a\xf1\xe6\xb1\x22\x97\ \x57\xe6\xf7\x3b\xf1\xfe\x85\xae\x09\xd9\xda\xe8\x10\x3e\x1a\xf8\ \x7c\xca\x1c\x81\xae\x80\x8a\x78\x29\xc0\xa7\xa0\x80\xa2\x78\x29\ \xe0\x7f\xbf\x04\xa2\xeb\x04\xed\x42\x20\xc7\x79\x17\x4f\x7f\x7e\ \x3c\x9d\x60\xbc\xc2\x60\x09\x42\x9c\x03\xe1\x93\x18\x97\x1c\x85\ \xc1\x6d\xdb\xbc\x87\xc1\xb8\x26\x42\x48\x72\xc2\x28\x41\x17\xfe\ \x90\x65\x22\x64\xa1\x80\xa8\x24\x42\x31\x49\x85\xed\x72\x01\x69\ \x09\x88\xf3\xbc\xce\x4d\x6b\x7e\xbe\xd5\x93\x8f\x79\x2a\x2c\x8b\ \x21\x14\x08\x71\x2e\x86\x02\x7a\xa8\xf3\x5b\x39\xbc\x48\xc5\x10\ \x96\x5e\x54\x8a\x21\xb4\xa2\xc9\x72\xb8\x0c\x8c\x8f\x0a\xdf\xb6\ \x62\x45\x5c\xcb\x61\x84\xde\xe0\xf2\xe5\x6a\x61\x9b\x65\xd4\x85\ \xaf\xd1\xca\x61\x9d\x10\x29\x74\x4d\x88\x98\x00\xf6\x36\xea\x84\ \x88\x95\xe9\xa3\x14\xfe\xfc\xf3\x5a\x8e\x12\xa4\xad\x3a\x21\x72\ \xc1\xc8\x08\x6d\x74\x45\x89\x59\x61\xc1\x02\x2d\x2c\xc5\x9c\x12\ \xdb\xb7\x8f\x08\xc4\xad\xec\x4c\x41\xf8\x4e\x4b\x73\x4d\x89\xf1\ \xd2\xdf\x60\x54\xc0\x60\x47\xa4\x68\x24\x87\x98\x99\x49\x81\xf3\ \xe7\xad\x09\x4d\x3d\x3a\x44\x24\x45\x6d\x9e\xba\x36\xc6\xd9\xb3\ \x14\x1c\x3d\xda\x7a\x2f\x92\x93\x9b\x48\xbb\xd2\x46\x52\x34\x5b\ \x88\x7e\x66\x5a\xdc\x67\x4b\x8b\xbb\xf1\x07\x2b\x57\xc6\x86\x16\ \x3f\x73\x86\x6a\xa6\x4f\x0f\x4f\xcb\x83\xa8\xe5\x34\xd7\x01\x2d\ \x5e\x60\xb5\x2d\xb6\xaa\xde\xc6\x88\xaa\x25\x2c\x5d\x4a\x4f\x8e\ \x1c\x89\xde\xc6\x08\x9b\x7d\x10\x9d\x68\x4e\x37\x67\x40\xdd\x9b\ \x1c\xba\x71\x63\x84\xf1\x4e\xd8\xad\x31\x38\x0a\xcf\x7b\x72\xec\ \x13\xc0\xde\xba\xda\x13\x34\x83\x8b\x9d\xca\xcf\x3e\xab\x5b\xf3\ \x6e\xc1\x19\x1f\xe9\x4b\xda\xd0\x30\xf1\xc0\xb6\xd5\x96\xad\xe0\ \x63\x99\x13\x54\xbb\x70\x2c\x91\xfc\x02\x08\x4c\xd7\x9b\xa3\x59\ \x59\x14\xc4\x1c\xbc\x6e\xd0\xb2\xa3\xac\xe2\x34\x5f\x6e\x8e\x72\ \xf2\xf3\xbe\x6d\x1e\x8e\xde\x5b\xbe\xe8\x2e\x2e\x44\xba\x18\xcd\ \x2d\x6a\x64\x6d\x48\x5d\x91\xbf\x23\x5a\xa0\x92\xd3\x4a\x69\x06\ \x5e\xe3\x33\x7c\x87\x6b\x42\x19\x1e\xb6\xd7\xf5\x7d\x07\x2f\x28\ \x6c\xdb\x56\x3e\xfd\x3f\xd1\xd4\x1d\xa9\x41\x62\x89\xe6\x25\x1b\ \x37\x56\xe6\x08\xa2\x0a\xec\x52\x7b\x10\xfe\x51\x4a\x8a\xd6\xec\ \xa1\x2b\x60\xa1\xd3\x16\x99\x53\x5a\x8b\x4c\x72\x72\xd4\x96\x82\ \x32\xe0\x90\x11\xe6\x14\x84\x47\x8f\xc3\xd1\xe6\xcd\xa5\xf0\x39\ \x6e\x3a\xc4\x5e\x93\x44\x09\x3a\x30\x13\x6e\x05\x93\x27\x2b\x29\ \x20\xb7\xae\x3f\xa8\x74\x97\x10\xaf\xbb\xed\x11\x9c\x25\x6b\x84\ \xcb\x88\xaf\x89\x54\x00\x12\x1c\xf6\xe2\x6e\x84\xbf\x52\xb7\x09\ \x1a\x44\x83\xb7\x6a\xaf\xe0\x7a\x99\x21\xa2\xf9\x30\xa1\x4a\x88\ \x94\x04\x19\x70\xab\x63\x47\xad\xb9\x53\x4f\x79\x3f\xf5\xda\x2a\ \xbb\x45\x3a\xc5\x84\x2b\x01\x71\xdd\x81\xf0\xd2\xe9\xf1\xdc\xbf\ \xf1\xdc\x39\x8e\x86\x63\x1e\x6c\x9f\xb4\x04\x34\x24\x27\x4c\x01\ \x68\xc6\x0e\xd3\xae\x83\x8e\xd6\xbd\x75\x87\x28\x7e\x88\x5a\xc7\ \x38\x0f\xd6\x84\x4d\x69\xb3\x6c\x9d\x3d\xdf\xa5\x4b\xe2\xa2\x03\ \xda\xf2\x2d\xbc\x3d\x0e\x6e\xec\xa9\x33\xfb\xad\xe8\x72\x8f\xfa\ \x81\x09\xdd\x27\x04\x65\x88\x7c\x14\xa6\xf0\x88\x19\x70\x30\xc3\ \x60\x05\x88\xf3\x86\x50\x07\x87\xf7\x69\x4c\xcf\x10\xf1\x8f\xcc\ \x91\x21\x12\x7e\xe1\x62\xf7\xee\x54\x65\x68\x88\x8c\x0b\xb8\x24\ \xae\xee\xd1\x43\x6b\xe6\x34\x24\x39\xe8\x6d\xce\x88\xcb\xb9\x21\ \xc4\x54\xfe\xb1\x9f\x8d\xa7\xc5\xd0\x87\x17\xaf\x43\x53\xd7\xd8\ \x0f\x1d\x6c\xda\xd4\x78\x68\x2a\x07\xb9\x4b\xdc\x8f\xcd\xa1\xf7\ \x96\x7f\xf8\x2f\x39\x11\x94\x9b\xa8\xb9\xbd\x90\x2a\xe1\xc8\x0c\ \x8c\x6d\x28\x69\xb5\xdc\xde\x51\x7a\x1b\xcb\x3f\xf4\xde\x82\x5e\ \x96\xa5\xb4\xf1\xe0\x24\xca\x6a\x55\xa2\x55\x12\x98\x18\x03\x34\ \x96\xe9\xe0\xe4\x3d\x56\xfe\x07\x11\x0b\x9b\x38\x2b\x22\x09\x1d\ \x98\x92\x60\x35\x02\xe5\x35\xb8\x78\x54\x98\xd8\x95\x31\x1f\x9d\ \xc5\x5e\x1d\x3e\xc3\x77\xb8\x06\xd7\xda\x1c\x9d\x2d\x00\x99\x01\ \xee\xa2\x41\x9f\x23\x46\x13\x22\xfa\xf0\xd0\x8a\x06\xfa\xd9\xc3\ \xe1\x69\xdc\x7b\x01\x04\xe6\x6e\x21\xfa\x3f\x97\x27\xc9\xc1\xbd\ \x63\x03\x42\x5f\x26\x3b\x18\xb9\x8c\x6b\x7a\x24\xa9\xd4\xf1\x50\ \xff\x2c\x97\x85\xdd\xae\x5f\x9b\xfa\xbd\x10\xaf\xc4\x7a\x7e\xff\ \x01\xc7\xfc\x2c\x0f\xa3\xd5\x0b\x13\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x02\x76\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\xe9\x00\x00\x00\xe9\ \x01\x54\x92\x14\x4b\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\xf3\x49\x44\ \x41\x54\x38\x8d\x85\x92\x3b\x68\x53\x61\x14\xc7\x7f\xe7\xbb\x89\ \xb5\x25\xa2\xb4\x43\x9d\x8a\x45\x84\x8a\xe0\xe2\x54\x31\xb5\x99\ \x1c\x4c\x1a\x5f\xad\xe0\x20\xbd\x0d\xa2\x45\xa1\x93\x2e\x5d\x3a\ \x0a\x22\x88\x96\x22\x6a\x93\xea\x20\x7a\xdd\x9a\x28\x3e\x90\xc4\ \xb4\x92\xd5\x5d\x51\x50\x90\xba\x88\xd0\x47\x6a\x7a\xf3\x1d\x87\ \xde\x68\xc4\x24\x9e\xe9\x3b\x7f\xbe\xff\xe3\x1c\x8e\xd0\xa0\x86\ \x3d\xcf\xf9\xda\xb6\xdc\xad\x61\xa7\x3d\xe2\x98\xa5\x97\x47\xce\ \xae\x36\xfa\x07\x20\xf5\xcd\xa1\xec\x83\x1e\xa3\xfe\xa4\x0a\x27\ \x81\xae\x00\xb6\x88\x96\x44\xe5\x56\x31\xee\x7a\x88\x68\x43\x81\ \x68\x36\x7d\x0a\xb8\x0f\x74\x34\x73\x03\x72\xd6\xea\x99\xb7\xc9\ \xd4\x72\x0d\x30\x9b\xce\x99\x04\xf0\x28\x20\x7f\x50\x18\x93\x2a\ \x3d\x7e\xd8\x76\x19\xf4\xa0\x40\x1a\x50\x20\x6e\x8c\x3c\x19\xf6\ \x3c\xe7\x77\x82\xfe\xe7\xf7\x3a\x43\x1b\xe6\x3d\xd0\xa9\x90\x57\ \xab\xc9\x7a\x87\x5a\x0d\x64\xd3\xa7\x15\x1e\x6e\x9a\xea\xf8\x42\ \x22\x75\x1b\xc0\x84\x2a\xe6\x52\x40\xfe\x16\xf2\xe5\x44\x23\x32\ \x40\x31\x31\xf6\x58\x60\x3a\x08\x7e\xe5\xcf\x08\x42\x12\x40\x94\ \x99\xc2\x71\xf7\x47\x8b\xf9\x41\xab\x37\x82\x47\xef\x40\xee\xee\ \xde\xda\x0e\xf6\x00\x18\x95\x52\x4b\x32\x50\x1c\x3a\xf7\x09\xf8\ \x0e\x60\xad\xb3\x1b\x20\x14\x2c\xe7\xbf\x15\xcd\xa5\xc7\x51\x66\ \x6a\xbd\x08\xd9\x68\x36\xfd\xc5\x08\x7c\x04\x50\x63\x0f\xb4\x12\ \xf0\xd7\x22\x73\xc0\x8b\x3a\xa8\x6c\xac\xa4\x0c\xc2\x53\x00\x15\ \x39\xdf\xef\x79\xed\xcd\x04\x4a\x23\x23\x65\x27\x22\xc7\x80\x67\ \xc0\x1a\x98\xc4\x9b\xa4\xfb\xca\x18\x91\x69\x60\x15\x65\x97\xd3\ \xb1\x32\xb7\xcf\xf3\xb6\x34\x1c\x61\x3e\x7d\xb8\x10\x73\xd7\x77\ \x96\x23\x43\x52\xa5\x6f\x21\x31\xfa\x1a\x82\x4b\x8c\xce\xcf\x8e\ \x22\x92\x09\x80\x77\xc0\xd5\x0d\x9c\x45\x6b\x2b\xfe\x56\x42\xfb\ \xad\x61\x02\xf4\xa8\xc2\xf5\xc5\xb8\x7b\xb9\xfe\x9c\xeb\x4e\x79\ \xf6\x02\xc8\x4d\x20\xdc\x6c\x0c\x51\xee\x98\x6d\x9f\x2f\x16\x62\ \x53\xfe\x3f\x02\x00\x83\xd9\x4c\x5f\x55\x75\x12\x21\x01\x6c\x0f\ \xe0\x0a\x90\x07\x73\xad\x16\xfb\x2f\xd1\x46\x4e\x83\xf9\xa9\xd0\ \xcf\x95\xde\xee\x36\xdf\x86\xd9\xc1\x52\x21\xe6\xae\x37\x4b\xf5\ \x0b\x96\x5d\xae\xa8\x34\x95\x4f\xe3\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x02\x0f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\xea\x50\x4c\x54\x45\x00\x00\x00\x66\x99\xcc\x80\xaa\ \xd5\x6d\xb6\xdb\x80\xaa\xdb\x7d\xac\xdb\x80\xae\xdc\x7d\xaa\xd7\ \x47\x9d\xa0\x46\x9b\x9e\x7f\xac\xdb\x80\xab\xd9\x80\xac\xda\x7f\ \xab\xda\x7f\xac\xdb\x80\xab\xdb\x7e\xaa\xd8\x7f\xab\xda\x50\x9f\ \xa9\x7f\xaa\xda\x80\xab\xda\x7f\xab\xdb\x80\xaa\xd9\x37\x99\x90\ \x37\x99\x91\x7f\xaa\xda\x7f\xab\xda\x7f\xab\xda\x80\xab\xda\x7f\ \xab\xda\x27\x95\x81\x28\x94\x80\x80\xab\xda\x7f\xab\xda\x4a\x9e\ \xa3\x1a\x91\x72\x1a\x91\x73\x1b\x91\x73\x1d\x91\x75\x1d\x92\x75\ \x1d\x92\x76\x1e\x92\x76\x1e\x92\x77\x20\x92\x78\x20\x93\x79\x24\ \x93\x7c\x2c\x96\x84\x2e\x97\x87\x2f\x96\x88\x38\x99\x91\x3a\x99\ \x93\x3b\x9a\x95\x41\x9b\x9b\x42\x9b\x9a\x44\x9c\x9e\x45\x9c\x9e\ \x46\x9d\xa0\x4a\x9d\xa3\x4b\x9e\xa3\x4c\x9d\xa6\x58\xa1\xb2\x5f\ \xa2\xba\x60\xa3\xb9\x60\xa3\xba\x63\xa3\xbd\x6f\xa7\xc9\x72\xa8\ \xcc\x73\xa8\xcd\x76\xa8\xd0\x76\xa9\xd0\x79\xaa\xd3\x7a\xa9\xd5\ \x7a\xaa\xd5\x7b\xaa\xd5\x7c\xab\xd7\x7d\xaa\xd8\x7e\xab\xd8\x7f\ \xab\xda\xf1\x94\x5a\xb3\x00\x00\x00\x23\x74\x52\x4e\x53\x00\x05\ \x06\x07\x2a\x2b\x2c\x2d\x53\x54\x8d\x8e\x90\x91\x93\x94\x96\x97\ \xba\xbb\xbc\xbd\xbe\xd1\xd1\xd3\xd5\xf1\xf2\xf3\xf8\xf8\xfc\xfd\ \xfe\xde\x17\xc3\x6f\x00\x00\x00\xb1\x49\x44\x41\x54\x18\x19\x2d\ \xc1\x07\x42\xc2\x40\x14\x45\xd1\x47\x00\x41\x30\x88\x58\x83\x44\ \x06\xbe\x58\xc0\x2e\xf6\x5e\xb0\x44\xef\xfe\xb7\xe3\x24\xe3\x39\ \xca\xcd\x6f\x6c\xed\xee\xf4\xd7\xeb\x0a\xca\x9d\x91\xe5\x26\xc3\ \x76\x24\xaf\xbc\x36\xdb\x33\xef\xf0\x05\x56\x23\x49\x4b\x70\x65\ \x76\x77\xfd\x84\xd7\x92\x6a\x03\xf8\x3c\xb6\x9b\xd7\x0c\xcf\x55\ \x15\xe3\xfd\x3c\x5f\x9c\xfe\x66\x78\x4d\x75\x29\x64\x93\xf1\xfe\ \x2d\x90\x28\x25\x98\x9a\xd9\x23\xf4\xd4\x23\x38\x33\xb3\xf1\x1b\ \x9b\xea\x12\x3c\x6c\x9b\x8d\x66\x24\x5a\xe0\xdf\xd4\xec\x1c\x1a\ \x9a\x73\x04\x97\x76\xf2\x8d\xab\x48\x8b\x14\xbe\x0e\x8e\xde\x21\ \x96\x14\xad\x90\xfb\xb8\xcf\x60\xb9\x24\x2f\x6a\x39\x0a\x2e\x2e\ \x29\xa8\x36\x93\x34\x4d\x1a\x15\x79\x7f\x11\x2d\x2e\x60\x1e\x70\ \xa4\xe2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xd2\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x05\xa0\x00\x00\x05\xa0\ \x01\x09\x8d\x56\xef\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\x4f\x49\x44\ \x41\x54\x38\x8d\xed\xce\x51\x11\x80\x20\x14\x44\xd1\xbb\x8c\x31\ \xb4\xc0\xab\x61\x12\x1b\xd0\x84\x8e\x68\x0e\x96\x0c\xa0\x33\xfe\ \x70\xfe\xef\xec\xc2\xf2\x3f\x39\xe2\x44\x2a\xd8\xfb\x58\xa9\x07\ \xc8\x72\x44\x05\x8e\xc9\x03\x35\x01\x9e\x8c\x01\xbc\x21\x5d\xb4\ \x56\x90\xc6\x5e\xd8\x37\x29\xe5\x17\xe3\xcb\x67\x3a\x30\x64\x11\ \x34\x5e\xf5\x37\x1f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x02\x05\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x4e\x00\x00\x04\x4e\ \x01\x42\x8b\x93\xfc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x82\x49\x44\ \x41\x54\x38\x8d\xa5\x92\xb1\x6b\x53\x01\x10\xc6\x7f\x77\x79\xb6\ \xa1\x62\x28\x05\x35\x71\x10\x1f\x98\x41\x4a\x1d\xbb\x09\x0e\x45\ \x2d\x26\x20\x68\x5c\x1c\x8c\x20\xfd\x3b\x5c\x14\x77\x07\xa1\x94\ \x3a\x38\x75\x2e\x12\xb4\x19\x9c\x1c\x32\xa8\x08\xba\xe9\x53\x87\ \x40\x7d\xa8\x51\x12\xa1\xf4\xe5\xce\x41\x23\x8f\xc7\xe3\x19\xf1\ \xdb\xee\xb8\xfb\xee\xfb\x3e\x4e\x28\x40\xd4\x3e\x5b\x3e\x14\x1c\ \x0c\x2d\x19\x87\xa8\x87\x8e\x86\xe2\x1e\x22\x84\xe0\xa1\x89\x5c\ \x09\xf2\x16\x3f\xb5\xcf\x9f\x41\x65\x0b\xa8\x99\x8d\x41\x01\x04\ \xc1\x41\x26\x53\x82\x8e\x99\xd5\xdc\xd3\x25\xa9\x02\xb5\x22\x75\ \x13\xe4\x2a\x28\x80\x01\x7d\x84\x08\xc7\x0a\x09\x04\xba\x88\x3c\ \x37\xb7\x08\x97\x48\x03\x8d\x06\x65\xff\x50\xbf\xd7\xd9\x03\x88\ \x6f\x9c\x6b\x38\x5a\xa0\x40\xb9\x7d\x78\xa3\xf3\xf4\x6f\x92\xf2\ \x33\xf8\x07\xfc\x37\xc1\xd4\x21\x7e\x59\x5b\x39\x9e\x24\x07\x6e\ \x39\xbe\x28\xc8\x6b\xc3\x7a\xe2\x7c\x9c\x8a\xc0\x5b\xad\x99\x38\ \x19\x76\xc1\xeb\xbf\xde\xc0\x97\x05\xb9\x0e\x34\xa7\xb2\x10\x57\ \x86\x8b\xe0\xf5\x4c\x5b\x5d\x25\x09\x00\x76\x6f\x5e\x38\x2d\xe6\ \x77\x41\x4e\x09\xfe\xd2\x8d\x1e\x25\xe2\xc9\x64\x50\xda\x7f\x97\ \x24\xc1\x77\xa0\x92\x22\x18\x99\xf3\x42\x3f\x5f\x5b\xad\x88\xb1\ \x03\xb2\x0a\x9c\x70\xe4\x12\xc2\x9d\xf4\xa9\x85\xf5\xee\x37\xc7\ \x2f\x23\xbc\xfd\xdd\x7a\x8f\x71\xb5\xf6\xa0\x13\x07\x49\x99\x25\ \x71\x8e\x64\x65\x9b\xb1\x97\xae\x8f\x6e\x3e\xee\x02\x27\xfb\x6b\ \xcd\xb9\x63\xeb\xdb\x3f\xfe\xf8\x98\x9d\xd1\x37\xe0\x83\xac\x6d\ \xdf\xb7\x57\x79\x79\xa4\x97\x01\x74\xfe\xfe\xa3\xaf\x2e\xda\x70\ \xe8\x01\x23\xe0\x99\x1a\x17\xab\x0f\x9f\x8c\xf2\x08\xb2\xf8\x09\ \x03\x38\x87\x7a\x26\x0c\x5d\xc9\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x03\xc9\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\x3e\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x40\x40\xff\x66\x66\xff\x55\x55\xff\x55\x55\xff\x4e\x4e\ \xff\x5b\x5b\xff\x55\x55\xff\x50\x50\xff\x5a\x5a\xff\x55\x55\xff\ \x59\x59\xff\x51\x51\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\ \x55\xff\x55\x55\xff\x53\x53\xff\x53\x53\xff\x57\x57\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\ \x56\xff\x56\x56\xff\x54\x54\xff\x55\x55\xff\x55\x55\xff\x56\x56\ \xff\x55\x55\xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\ \x55\xff\x54\x54\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x54\x54\ \xff\x55\x55\xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x5e\x5e\xff\x81\x81\xff\x82\x82\ \xff\xd6\xd6\xff\xff\xff\x5c\x47\x98\x8c\x00\x00\x00\x64\x74\x52\ \x4e\x53\x00\x01\x02\x04\x05\x06\x0c\x0d\x0e\x0f\x10\x11\x12\x14\ \x16\x21\x22\x23\x24\x30\x31\x34\x35\x50\x51\x52\x53\x54\x55\x56\ \x58\x59\x5d\x5e\x5f\x62\x64\x66\x6f\x71\x72\x74\x7c\x7d\x7e\x7f\ \x80\x81\x82\x89\x8a\x8b\x8d\x8e\x8f\x9d\x9f\xa1\xa3\xa4\xa5\xa6\ \xa7\xb3\xb4\xb5\xc1\xc2\xc4\xc5\xca\xcb\xcc\xcd\xce\xcf\xd0\xd3\ \xd4\xd5\xd6\xdd\xde\xe0\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\ \xf2\xf8\xf9\xfa\xfd\xfe\xdf\x19\xb5\xb1\x00\x00\x01\xd6\x49\x44\ \x41\x54\x18\x19\xa5\xc1\x89\x5a\x12\x51\x00\x06\xd0\x7f\x08\xc5\ \x0d\x82\x5c\x02\x69\xb3\x95\x4d\x4d\x41\x2b\x05\xcd\x5d\xb3\x91\ \xc4\x94\x66\xa4\x44\xe6\x07\xf1\xfd\x5f\x20\x71\xfb\x66\x74\xd6\ \x7b\xcf\x81\x93\x58\x7a\x7a\x65\xaf\xa6\x9f\x9f\xeb\xb5\xbd\x4a\ \x61\x32\x86\x40\x26\x16\x54\x83\x16\x86\x5a\x1a\x87\x4f\x03\xd9\ \x5f\xb4\x55\xcd\x46\xe0\x6d\x64\x56\xa7\x23\x7d\x66\x18\xee\x94\ \xa9\x13\xba\xd2\x3e\x86\xe0\xe2\xd9\x16\x3d\x6d\x26\xe0\x28\x79\ \x4a\x1f\xfe\xbd\x82\xbd\xd0\x22\x7d\x2a\x85\x60\xa3\xaf\x42\xdf\ \xca\x61\x3c\xd2\xb7\xc6\x00\xbe\x87\xf1\x80\xf2\x8d\x81\x54\x42\ \xb0\x5a\x64\x40\x45\x58\xbc\x60\x60\xaf\x61\x92\x68\x30\xb0\x46\ \x1c\xf7\x94\x2d\x0a\xd8\x50\x70\xe7\x3d\x85\xbc\xc5\xad\x91\x3a\ \x85\x1c\x0f\xe1\xc6\x67\x0a\x2a\xe0\xda\x80\x4e\x41\x5a\x04\x3d\ \x59\x0a\xcb\xa0\x47\xa5\xb0\x2a\xae\x4c\x50\xc2\x18\x80\x05\x4a\ \x28\x02\x38\xa0\x84\x7d\x20\x66\x50\x82\x11\x45\x9a\x52\x52\x98\ \xa1\x94\x3c\x56\x28\x65\x19\xbb\x94\xb2\x8d\x23\x4a\xa9\x41\xa3\ \x59\xbb\x73\xe1\xa1\xd3\xa6\x59\x1d\x4d\x9a\x75\x2f\x3d\x75\x69\ \x76\x86\x26\xcd\xba\x97\x9e\xba\x34\x3b\x83\x46\xb3\x76\xe7\xc2\ \x43\xa7\x4d\xb3\x3a\x8e\x28\xa5\x86\x5d\x4a\xd9\x46\x85\x52\x96\ \x30\x4d\x29\x39\x4c\x52\x4a\x12\x31\x83\x12\x5a\x51\x40\xa5\x84\ \x1f\x00\x16\x28\x61\x1e\xc0\x38\x25\x8c\xe2\x8a\x4a\x61\x55\xf4\ \x64\x29\x2c\x83\x9e\x88\x4e\x41\x5a\x04\xd7\x66\x29\x28\x8f\x1b\ \xc3\x27\x14\xf2\x7b\x10\xb7\xde\x51\xc8\x1b\xdc\x51\x36\x29\x60\ \x5d\xc1\xbd\x44\x83\x81\x9d\xc6\x61\x92\x66\x60\x29\x58\x94\x18\ \xd0\x1c\xac\x94\xaf\x0c\xa4\x1c\xc2\x03\xe1\x35\x06\xb0\x1a\xc6\ \x23\x4f\xbe\xd0\xb7\xa5\x30\x6c\x28\x45\xfa\x63\xcc\x29\xb0\xf7\ \x5c\xa7\x0f\x7f\x5f\xc2\x51\x7c\x83\x9e\xd6\x9f\xc2\x85\x32\x75\ \x4c\x57\xda\x07\x05\xee\x86\x0a\x1a\x1d\xfd\xc9\x0f\xc2\x5b\x7f\ \xe6\x80\xb6\xd4\x4f\xfd\xf0\x69\xac\xf8\xb3\x45\x8b\xd6\xfe\xfc\ \x28\x02\x89\xa6\x72\xe5\x9d\x43\xad\xd9\xd4\x0e\x77\x96\x73\xc9\ \x28\x1c\xfc\x07\xe9\xa2\xe6\xaa\x50\xc2\xdb\xac\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x00\xd5\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x9c\x49\x44\x41\x54\x78\x01\x63\xc0\x07\xca\xa5\x3b\ \xf4\x5f\x16\xd9\xe8\x33\x90\x0a\x2a\xa5\xda\x34\xca\xa5\x5a\x77\ \x94\x4b\xb7\xed\x7e\x5d\x62\x0d\xc2\xfb\x5f\x96\xd8\xea\x11\xd4\ \x58\x21\xd7\x2e\x58\x21\xd5\x36\xb1\x5c\xba\xf5\x37\x10\xff\x47\ \x32\xe0\x3f\x10\xff\x7d\x5d\x62\xb5\xe8\x79\xa5\xad\x28\x86\xc6\ \x06\x86\x06\x26\xa0\x86\x38\x20\x7e\x05\xd2\x88\xc0\x08\x03\x90\ \xf0\xbb\x57\xc5\x36\xf9\xff\x1b\x1c\x58\xe0\x06\x94\x49\xb5\xce\ \x86\x69\x22\x60\x00\x02\x97\x5a\xcf\x46\x0a\xac\xb6\x55\xa4\x1a\ \xf0\xa6\xc4\x7a\x15\x15\x0c\x18\x35\x80\xe2\x68\xa4\x38\x21\x51\ \x92\x94\x09\x67\xa6\x32\xa9\x96\xed\xc4\x64\x26\x8a\xb3\x33\x00\ \x5f\x17\x7b\xf1\x44\x05\x23\x70\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x01\x3d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x60\x50\x4c\x54\x45\x00\x00\x00\xff\x66\x66\xff\x55\ \x55\xff\x49\x49\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\ \xff\x55\x55\xff\x54\x54\xff\x55\x55\xff\x54\x54\xff\x55\x55\xff\ \x54\x54\xff\x55\x55\xff\x54\x54\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x6a\x6a\xff\x8e\x8e\x5a\xe5\x25\xcd\x00\x00\x00\x1d\ \x74\x52\x4e\x53\x00\x05\x06\x07\x2a\x2b\x2c\x2d\x8d\x8e\x90\x91\ \x93\x94\x96\x97\xbb\xbc\xbd\xbe\xd3\xd4\xd5\xf1\xf2\xf3\xf4\xfc\ \xfd\x64\x79\xba\xb6\x00\x00\x00\x6f\x49\x44\x41\x54\x18\x19\x55\ \xc1\x89\x12\x44\x30\x14\x04\xc0\x11\xb7\x60\x77\x89\x23\x9e\x89\ \xff\xff\x4b\x59\x94\x4a\xba\xf1\x57\xea\x69\xdb\xa6\xa6\xc0\x2d\ \xed\x77\x5e\xa4\x53\xf0\xd2\x91\xaf\x41\x01\xf8\x30\xd0\x02\xe5\ \xce\x80\xe4\xd0\x8c\xd4\x98\x19\x31\xb0\xa4\x3b\x1e\x8e\x5c\xb1\ \x92\xee\x78\x38\x72\xc1\xcc\x88\x41\xc3\x48\x85\x42\x18\x90\x0c\ \xe8\x18\xd0\x00\xd4\x8f\xaf\x6f\x02\x4f\xb5\xc2\x8b\xe8\x04\xb7\ \xbc\x36\xd6\x9a\x2a\x83\x77\x02\xd9\xb7\x16\x32\x54\xbd\xde\x1f\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x99\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x02\x60\x49\x44\x41\x54\x38\x8d\x65\x92\x3f\x48\x95\x71\ \x14\x86\x9f\x73\x7e\xbf\xeb\x35\x2d\x21\xc5\x30\x2a\x82\x68\xa9\ \x04\x0b\xdb\x12\xba\xd0\x10\x6d\xa5\xdd\x1b\x41\xb4\xe4\x60\x44\ \x50\x4b\x0d\x09\x65\x2d\xb5\x19\x19\x41\x43\x4b\x43\x57\x3f\x70\ \x89\x28\x68\x88\x86\x06\x8b\x96\xf0\x0f\x44\x05\xa1\x09\x86\x20\ \x95\xf7\xd2\xbd\xfa\x9d\xd3\xa2\xe6\x9f\x77\x3b\xe7\x3c\xef\x39\ \x67\x78\x85\x75\xf2\xce\xce\xdd\xc4\xd8\x8d\x59\x3d\x22\x8b\xb8\ \xd7\xa1\x1a\x31\xfb\x89\xd9\x63\x19\x1e\x9e\x5a\xcd\xcb\x1a\xf3\ \x99\x33\xad\xa4\xe9\x49\x16\x17\x07\xc8\x66\xb7\x91\xa6\xad\xa8\ \x1a\xee\x1f\x48\xd3\x48\x8c\x97\x71\xff\x2c\x49\xf2\x78\xd9\xa3\ \x2b\xe6\x7c\xfe\x86\x0c\x0e\x8e\xe2\xfe\x8a\x4c\xe6\x1e\x66\xc7\ \x08\x61\x1a\xf7\xdf\xb8\x77\x13\xc2\x25\x42\xb8\x0b\x54\xfd\xf4\ \xe9\xcb\x6b\x3e\xf0\x42\xa1\x07\xf7\x51\xdc\xb3\xc0\x51\x1a\x1b\ \xef\x50\xad\x06\xca\xe5\x3e\xdc\x05\xf7\xaf\x98\xbd\x40\xb5\x0f\ \xb3\x5e\x42\x38\x0b\xbc\x95\x24\xf9\xa8\x7e\xe2\x44\x16\xb3\x7d\ \xd4\xd4\x7c\x42\xb5\x13\x91\x7e\xe6\xe6\x1e\x51\x2a\x2d\xc8\xd0\ \xd0\x75\x49\x92\x6b\x88\x8c\x10\xe3\x4d\xcc\x7a\x89\xf1\x36\x30\ \x80\xfb\x79\x00\xf1\x42\xe1\xf8\xd2\x95\x3d\x84\xf0\x86\x34\x3d\ \x87\x48\x3f\xb0\x1f\x38\x05\x6c\xc2\xec\x09\x99\xcc\x34\x66\x17\ \x30\x1b\x01\x6a\x80\x0e\x4a\xa5\x5e\xc5\xac\x8d\x10\xc6\x50\xdd\ \x23\x83\x83\x13\xa8\x66\xa9\xad\x2d\x23\xd2\x25\x49\x72\x85\x03\ \x07\x2e\xa2\xda\x43\x9a\xce\x60\xd6\xc0\xec\xec\x6b\xa0\x03\x78\ \x4f\x7d\x7d\x7b\x44\xa4\x81\x4a\xa5\x4c\x08\xee\xb9\x5c\x04\xaa\ \xfc\xfd\xbb\x1d\x18\xf5\x7c\xbe\x83\xf1\x71\x45\x64\x18\x38\x82\ \xc8\x04\x4d\x4d\x7b\x01\x08\x61\x02\xf7\x76\xc5\xfd\x37\x31\x66\ \x10\x71\x9a\x9b\x1d\xb3\x0c\xf3\xf3\x93\xc0\x0e\x42\xf8\x8e\xfb\ \x21\x54\x3f\x02\x07\x71\x9f\x44\x75\x17\x00\xe5\xf2\x37\x60\xb3\ \x02\x5f\x10\x69\x03\xc6\x51\xdd\x07\x04\x79\xf9\xb2\x82\x48\x2d\ \xc5\xe2\x14\xee\x3b\xa5\x58\x9c\x06\x5a\x30\x9b\xc3\x7d\x0b\x22\ \x2e\xcf\x9f\x97\x65\x68\xe8\xa1\x92\xc9\xbc\xc3\xac\x0d\xf7\x59\ \xd2\x74\x2b\x50\xf5\x5c\x2e\xe2\x2e\x02\xfe\x3f\x65\x2e\xa8\x2a\ \xaa\xb6\x3a\x7c\x2a\xcf\x9e\xcd\x50\x2a\xdd\x47\xa4\x82\x6a\x16\ \xd5\x69\x5a\x5a\xb6\x23\xa2\xab\x41\xdc\x67\x71\x17\xcc\x7c\xcd\ \x02\x80\xa5\x97\x2b\x4b\x41\xfa\xc5\xc2\x42\xc3\x7a\x10\xb3\xa7\ \x88\x28\x22\x1b\x17\xac\x5c\x10\xf9\x03\xcc\x13\x63\xdd\x4a\x7f\ \xd9\x10\xc2\x55\xdc\x05\x11\x27\x84\x07\xcb\xe3\xb8\xc2\x25\xc9\ \x38\x80\xe7\x72\x91\x5c\xce\x18\x1b\xcb\xb3\x5e\xee\x3f\x10\x99\ \x93\x62\x71\x72\xc3\x6c\x03\xdb\xd5\x75\x18\xc0\x0b\x85\x5b\xab\ \xeb\xf5\xfa\x07\x93\x47\x15\xc8\xec\x3c\xc6\x23\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x3f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x75\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x99\x99\ \x99\xaa\xaa\xaa\xaa\xaa\xaa\xa2\xa2\xa2\x99\x99\x99\x9c\x9c\x9c\ \xa2\xa2\xa2\x9d\x9d\x9d\x9f\x9f\x9f\x9d\x9d\x9d\xa0\xa0\xa0\xa1\ \xa1\xa1\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\x9f\x9f\x9f\xa1\xa1\ \xa1\x9f\x9f\x9f\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xd2\x53\xef\ \x7f\x00\x00\x00\x26\x74\x52\x4e\x53\x00\x01\x05\x06\x09\x0b\x0f\ \x12\x16\x1a\x25\x2f\x33\x41\x46\x4f\x55\x65\x7a\x8d\x95\xa3\xad\ \xb4\xba\xc2\xc8\xcf\xd4\xdf\xe9\xef\xf2\xf7\xf9\xfb\xfd\xfe\xe4\ \x6e\x6d\x18\x00\x00\x00\x53\x49\x44\x41\x54\x18\x19\xad\xc1\x55\ \x0a\x80\x40\x00\x40\xc1\x67\xaf\xdd\xdd\x79\xff\x23\x2a\x22\xa2\ \xbf\xe2\x0c\xdf\x49\x12\x6f\x71\xc2\x4b\xb4\x6d\x11\x0f\xe1\x9a\ \xa6\x6b\xc8\xcd\x9f\x0b\x45\xce\x97\x80\x8b\x3b\x56\x1a\xa8\xe5\ \xe4\x71\xb2\xfb\xc6\xe0\xa0\xd7\x83\xc3\x41\x74\xad\xc9\xc9\x6c\ \x3b\x01\x88\xcc\xe2\x62\x65\x82\x3f\xec\x02\xd1\x03\xe6\xf2\x18\ \x5a\xba\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x96\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\x7a\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\xff\xff\ \x00\xff\x80\x00\x55\xaa\xaa\x80\x80\xbf\x66\x99\xcc\xff\xcc\x00\ \x80\x80\xaa\xff\xaa\x2b\x6d\x92\xb6\xdb\xb6\x24\xe3\xc6\x1c\x80\ \x80\xb3\x74\x8b\xb9\xea\xbf\x15\xeb\xb1\x14\x6d\x80\xb6\xed\xb6\ \x12\x70\x80\xbf\xef\xbf\x10\x78\x87\xc3\xf2\xbc\x1b\x6f\x85\xbc\ \xe9\xbc\x16\xea\xbf\x15\x70\x85\xc2\x71\x84\xbd\x73\x84\xbd\x70\ \x80\xbf\x74\x83\xc1\x71\x80\xbf\x73\x86\xbf\x70\x83\xc1\x71\x82\ \xbe\x73\x82\xbe\x71\x84\xbd\x72\x84\xbd\x71\x82\xbe\xeb\xb8\x18\ \x74\x83\xbd\x75\x83\xbd\xea\xba\x15\x72\x83\xbf\xec\xbb\x16\x74\ \x82\xbe\x73\x84\xbf\x73\x84\xc0\x72\x82\xbe\x74\x83\xc0\xea\xbb\ \x15\x72\x82\xbe\xea\xb9\x17\xeb\xba\x16\x73\x82\xbe\x73\x83\xbf\ \xeb\xbb\x17\x72\x84\xbf\x73\x84\xbf\xea\xbb\x17\xeb\xbb\x16\x74\ \x83\xbf\xeb\xba\x16\x73\x82\xbf\xec\xbb\x15\x73\x82\xc0\xeb\xba\ \x16\x74\x82\xc0\xea\xba\x17\xeb\xba\x16\x72\x83\xbe\xeb\xba\x15\ \x73\x84\xc0\x73\x83\xc0\x73\x83\xc0\xeb\xb9\x16\xeb\xba\x16\xeb\ \xbb\x15\x74\x83\xc0\xeb\xba\x17\x74\x83\xbf\xec\xba\x16\x73\x84\ \xbf\x73\x83\xbf\xeb\xba\x16\x72\x83\xbf\xea\xb9\x16\x73\x83\xbf\ \x73\x83\xbf\xeb\xba\x17\xeb\xbb\x16\x73\x83\xbf\x73\x83\xbf\xeb\ \xb9\x16\x73\x83\xbf\x73\x82\xbf\x73\x83\xbf\x73\x83\xbf\xeb\xba\ \x16\xec\xba\x16\x73\x83\xbf\xeb\xba\x15\x73\x83\xbf\x73\x83\xc0\ \xeb\xba\x16\x74\x83\xbf\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\ \xba\x16\x73\x83\xc0\xeb\xbb\x16\x73\x83\xbf\xeb\xba\x16\xeb\xba\ \x16\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xc0\xeb\xba\x16\ \x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\ \xba\x16\xf4\xe1\xe3\x07\x00\x00\x00\x7c\x74\x52\x4e\x53\x00\x01\ \x01\x02\x03\x04\x05\x05\x06\x06\x07\x07\x09\x0a\x0b\x0c\x0d\x0e\ \x0e\x10\x10\x11\x13\x17\x17\x18\x19\x1b\x1f\x20\x21\x24\x28\x29\ \x2b\x33\x36\x3a\x3f\x41\x42\x46\x4a\x4c\x52\x5a\x5b\x5d\x5e\x61\ \x61\x62\x63\x67\x6a\x6f\x70\x74\x78\x7b\x7f\x80\x82\x83\x83\x89\ \x8c\x8d\x93\x98\x9a\x9c\x9d\xa9\xad\xb0\xb1\xb3\xb5\xb5\xb7\xb8\ \xba\xbb\xbc\xc4\xc6\xc7\xcc\xcc\xcd\xce\xcf\xd1\xd2\xd7\xda\xdc\ \xde\xdf\xe2\xe2\xe3\xe5\xe8\xea\xec\xed\xee\xf0\xf1\xf2\xf3\xf4\ \xf5\xf6\xf7\xf8\xf9\xf9\xfa\xfc\xfe\xfe\x8d\xa8\xca\x36\x00\x00\ \x01\x4f\x49\x44\x41\x54\x58\xc3\xed\xd7\x45\x57\x82\x51\x18\x04\ \xe0\x17\xc5\x42\x54\xb0\xbb\x5b\x6c\xb1\x15\xbb\xbb\xbb\xbb\x45\ \x11\xc5\x79\xff\xbb\x2b\x56\xf0\xc1\x77\x98\xa5\xcc\x7e\x9e\x73\ \xef\x66\xce\xbd\x22\xf1\xfc\x8f\x54\xd4\x25\x51\xfd\xc1\x00\x0e\ \x9d\xb1\xd7\x2d\xe3\x00\xd0\x1b\x73\xdf\x3a\x03\x00\xf0\xc4\xda\ \x4f\x9d\x07\x05\x64\xac\x81\x02\x72\xb6\x41\x01\x05\x47\xa0\x80\ \xd2\x33\x50\x40\xd5\x0d\x28\xa0\xe6\x1e\x14\x50\xff\x02\x0a\x68\ \xf9\x00\x05\xb4\x7d\x23\x14\x48\x30\x5d\x4f\x1e\x08\x20\x14\x70\ \x5c\xee\x3b\x22\xb5\xda\x4f\x9f\x82\xf1\x01\x61\x80\xfc\x57\x5d\ \x4c\x34\xee\x57\xfe\x20\x52\x3c\x22\xe2\xfa\xd5\xa1\x08\x07\x40\ \x54\x40\x46\xf5\xbd\xc8\x10\xe8\x34\x01\xa4\x5d\xe8\x14\x05\x48\ \x97\x7a\xed\x14\x60\xf7\x6a\x33\x05\xc8\xb2\xf1\x1d\xcc\x01\x43\ \xba\xce\x01\x3d\x7a\xcc\x01\x2e\xbd\xe6\x00\xb7\x1e\x70\xc0\xb0\ \xae\x72\xc0\x96\x4e\x50\x40\xb6\x5f\x1b\x28\xa0\x5f\x9f\x53\x18\ \x20\xeb\x4e\xc7\x8c\x37\xc8\x04\x30\xad\x8f\xb9\x86\x40\x99\x2f\ \x2a\xe0\x56\x75\x47\x58\xa4\xa6\xcd\xbd\x60\xae\xc2\x02\x85\x7e\ \x9d\x35\x3b\x8a\xad\x5f\x61\x00\xfb\xce\x52\xba\xe9\x59\x6d\x7c\ \x03\x37\xeb\x52\xfb\x40\x02\x52\x7d\x4b\x02\x52\x7e\x4e\x02\x52\ \x7c\x42\x02\x92\xb7\x4b\x02\x92\xb9\x41\x02\x62\x5b\x20\x01\xb1\ \xce\x91\x80\x58\x26\x49\x40\x64\x84\x05\xa4\x2f\x00\xa0\x9b\x79\ \xad\x77\x7c\x62\xc5\x46\xbd\xf7\x9d\x25\xf1\x3f\x53\x3c\xd1\xf2\ \x07\x36\xc2\xc4\x58\x84\xef\x6d\x8d\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x06\x5a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\x4f\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x80\x80\ \x80\xff\xff\xff\xaa\xaa\xaa\xbf\xbf\xbf\xcc\xcc\xcc\xbf\xbf\xbf\ \xc6\xc6\xc6\x99\x99\xb3\xcc\xcc\xcc\xd1\xd1\xd1\xc4\xc4\xc4\x80\ \xa4\xa4\xc8\xc8\xc8\xcc\xcc\xcc\xc6\xc6\xc6\xc9\xc9\xc9\x97\x97\ \xae\xc6\xc6\xc6\xc8\xc8\xc8\xc7\xc7\xc7\xc5\xcb\xc5\xc6\xcc\xc6\ \xc8\xc8\xc8\xc9\xc9\xc9\xc5\xca\xc5\x8d\x97\xa1\xc8\xc8\xc8\xc6\ \xcb\xc6\x89\x92\x9f\xc5\xc9\xc5\xc7\xcb\xc7\xc8\xc8\xc8\xc9\xc9\ \xc9\xc6\xc9\xc6\xc7\xcb\xc7\x88\x8e\xa1\x89\x93\x9f\xc6\xc9\xc6\ \xc6\xc9\xc6\xc7\xca\xc7\xc8\xcb\xc8\xc8\xcb\xc8\xc6\xc9\xc6\xc8\ \xcb\xc8\xc6\xc9\xc6\x86\x8e\x9e\xc7\xc9\xc7\xc7\xca\xc7\x86\x8e\ \x9e\xc6\xcb\xc6\xc6\xc9\xc6\xc7\xc9\xc7\xc7\xca\xc7\xc6\xcb\xc6\ \xc7\xc9\xc7\xc7\xc9\xc7\xc7\xc9\xc7\xc7\xca\xc7\xc8\xca\xc8\xc7\ \xcb\xc7\x85\x8b\x9f\xc7\xc9\xc7\xc6\xca\xc6\xc7\xcb\xc7\xc7\xcb\ \xc7\xc8\xc9\xc8\xc6\xca\xc6\xc7\xca\xc7\xc7\xcb\xc7\xc7\xc9\xc7\ \xc6\xca\xc6\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\xc9\xc8\xc7\ \xca\xc7\xc7\xca\xc7\xc8\xcb\xc8\xc6\xc9\xc6\xc7\xca\xc7\xc7\xca\ \xc7\xc7\xca\xc7\xc8\xcb\xc8\x7f\x85\x99\xc6\xc9\xc6\xc7\xca\xc7\ \xc6\xcb\xc6\xc7\xc9\xc7\xc7\xca\xc7\xc6\xcb\xc6\xc7\xca\xc7\xc7\ \xca\xc7\x7b\x84\x98\xc7\xca\xc7\xc8\xca\xc8\xc7\xc9\xc7\x7a\x83\ \x97\xc7\xca\xc7\xc7\xca\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\xc9\xc7\ \xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xcb\xc7\xc7\xca\xc7\xc8\ \xca\xc8\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xca\xc7\xc7\xcb\ \xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xca\xc7\ \xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\x70\x7a\x91\x6f\x79\x90\xc7\ \xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\x67\x71\ \x8b\xc7\xca\xc7\xc7\xca\xc7\x66\x6f\x8a\xc7\xca\xc7\xc7\xca\xc7\ \xc7\xca\xc7\x62\x6c\x87\x62\x6c\x88\xc7\xca\xc7\xc7\xca\xc7\xc7\ \xca\xc7\x5a\x65\x84\x5b\x65\x84\x55\x60\x80\x56\x61\x80\x57\x61\ \x81\x58\x63\x82\x59\x64\x82\x5e\x68\x86\x60\x6a\x87\x60\x6b\x87\ \x61\x6b\x87\x63\x6d\x88\x64\x6f\x89\x65\x6e\x8a\x66\x70\x8a\x68\ \x71\x8c\x6b\x75\x8d\x6c\x76\x8e\x6e\x78\x8f\x6f\x78\x90\x73\x7b\ \x93\x79\x82\x96\x7c\x84\x98\x80\x89\x9b\x81\x89\x9b\x83\x8b\x9c\ \x83\x8b\x9d\x8a\x91\xa1\x8b\x92\xa1\x95\x9b\xa8\x9d\xa3\xad\xa2\ \xa8\xb0\xa5\xaa\xb2\xa7\xac\xb3\xa8\xad\xb4\xab\xb0\xb6\xae\xb2\ \xb8\xae\xb3\xb7\xaf\xb5\xb8\xb1\xb5\xb9\xba\xbd\xbf\xba\xbe\xbf\ \xba\xbf\xbf\xbb\xbf\xc0\xbc\xbf\xc0\xbc\xc0\xc0\xbd\xc1\xc1\xc1\ \xc4\xc3\xc1\xc5\xc4\xc2\xc6\xc4\xc3\xc6\xc5\xc4\xc7\xc5\xc5\xc9\ \xc6\xc6\xc9\xc6\xc7\xca\xc7\xc9\x64\x5a\x65\x00\x00\x00\x90\x74\ \x52\x4e\x53\x00\x01\x02\x02\x03\x04\x05\x08\x09\x0a\x0a\x0b\x0d\ \x0e\x0e\x0f\x12\x13\x16\x1b\x1c\x29\x2c\x2d\x2e\x2f\x30\x31\x33\ \x36\x38\x39\x40\x41\x4b\x4c\x4e\x4f\x50\x50\x51\x52\x54\x58\x59\ \x5d\x5e\x5f\x5f\x60\x61\x62\x63\x64\x65\x6c\x76\x77\x7b\x7c\x7d\ \x7f\x80\x80\x82\x88\x89\x8a\x8b\x8c\x8d\x8e\x90\x93\x95\x96\x9d\ \x9e\x9f\xa1\xa2\xa3\xa5\xa8\xaa\xad\xb0\xb1\xb4\xb5\xb7\xb9\xba\ \xbc\xbe\xbf\xc1\xc3\xc4\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\ \xcf\xd0\xd2\xd4\xd5\xd6\xd8\xd9\xda\xdd\xde\xe1\xe2\xe4\xe6\xe8\ \xec\xed\xf0\xf1\xf4\xf6\xf6\xf7\xf8\xf8\xf9\xfa\xfb\xfb\xfb\xfc\ \xfd\xfe\xfe\x52\xc0\x91\x07\x00\x00\x03\x2a\x49\x44\x41\x54\x18\ \x19\x9d\xc1\x89\x43\x14\x55\x00\x06\xf0\x6f\x25\x7a\xe8\xaa\x80\ \x16\x61\x96\xa5\x6e\x37\x87\x26\x81\x50\x59\x91\x45\x79\x64\x97\ \x74\x8c\x45\x89\x56\x64\x27\x99\x95\x4a\x87\xd9\xae\x07\xab\x4f\ \x57\x52\xf3\xe8\xd0\xcc\xbb\x32\x8d\x34\xa8\x90\xef\x0f\x8b\x99\ \xd9\xd9\x7d\x6f\xde\x2b\x77\xe6\xf7\xc3\xff\xb9\x8e\xbe\x79\x88\ \x69\x0e\x7d\xed\x88\xe9\x31\xfa\x3a\x11\xd3\x2b\xf4\x7d\x80\x78\ \x12\x9f\xd1\xd7\x5f\x8d\x58\x6e\x64\xa0\x0e\xb1\x3c\xcc\xc0\xea\ \x04\x4a\x20\x16\xd7\x42\x75\xcd\xe7\x2c\x68\x86\x62\xda\x62\x01\ \x0b\xe1\x30\xd3\x56\x8e\x82\xab\x5f\x64\x51\xe6\x0e\x04\xca\xdb\ \x32\x74\x04\x0c\xc2\xe1\x98\x37\xae\x45\x5e\xf2\x05\xaa\xb6\x3f\ \x32\x19\x9e\x99\x6f\x72\x8c\x23\x10\x22\x1c\x7a\xd2\x8f\x4f\xc5\ \x98\x09\x73\xd7\x33\xe4\xd3\x27\x1b\x52\xa9\xfb\x57\xd1\xe7\x08\ \x68\x84\xc3\x40\xb6\xf7\x99\x67\x5f\xda\xcc\x2b\x71\x04\x54\xad\ \x8c\xac\x15\xaa\x64\x2f\x23\xfa\x70\x22\x34\x35\x5f\x32\x92\xf4\ \xf5\x08\x69\x61\x24\x2d\x08\x2b\x7b\x8b\x11\xbc\x53\x06\x43\x8a\ \x11\xcc\x86\x69\x42\x9a\x25\x4b\x57\xc0\x62\x0d\x4b\xd6\x03\x9b\ \xd7\x69\x33\x3c\x4a\x53\x37\x6c\xde\x67\xc8\xe5\xb3\xc7\x0e\xe4\ \xe4\xee\x7d\x47\x4e\x0f\x53\xf7\x2e\x2c\xaa\xb3\xd4\x9d\x39\x28\ \x03\x03\xa7\x46\xa8\xca\x56\xc1\xd4\x4c\xcd\xc8\x8f\x52\xf5\xdd\ \x9f\x54\x35\xc1\x50\xf1\x09\x55\x23\x3f\x48\xdd\xfe\x3f\xa8\x58\ \x5f\x81\x90\xc4\x32\x6a\x8e\xcb\xb0\xc3\x7f\x53\xf1\x74\x19\x34\ \xc9\xa5\xd4\x9c\x91\xa6\x13\x54\x2d\x49\xa2\xa8\x72\xce\x47\xd4\ \x5c\x3e\x28\x3d\x3b\x56\x36\x4e\xbf\x75\xf9\x56\xe9\xc9\x0d\x52\ \xb5\xae\xa1\x12\xae\x9a\xfa\x8e\xae\x34\x43\xce\x4a\xcf\x57\x33\ \xe0\x9a\xb2\x41\x7a\x4e\x52\x97\xee\xea\xa8\xaf\x01\x6d\x8e\x49\ \xd7\x8e\x19\xf0\x4d\xda\x24\x5d\x87\x68\x01\xda\x7c\x23\x5d\x2b\ \x11\x58\x20\x3d\x43\x34\x81\x36\x39\xe9\xba\x1b\x81\xf1\x7b\xa4\ \xeb\x02\x4d\xa0\xc5\x5f\xd2\x33\x1d\x05\xdb\xa4\xeb\x67\x9a\x40\ \x8b\xd1\xdd\xd2\x75\x0b\x02\xe3\x76\x4a\xd7\x6f\x34\x81\x36\xfb\ \xa4\x6b\x39\x02\x8d\xd2\xf3\x3b\x4d\xa0\xcd\x11\xe9\xda\x3a\x05\ \x79\x1b\xa5\x6b\xef\x28\x4d\x68\x6a\xef\x5c\xdb\xcf\x90\xd3\xd2\ \xb3\x61\x12\x3c\x2f\x4b\xcf\x71\xea\xfa\xd7\x76\xb6\x37\xc1\x55\ \x5d\xb7\x9a\x9a\xe1\x01\xe9\xd9\xb4\x60\x3c\xc6\x35\x6e\x94\x9e\ \x5d\xe7\xa9\x5a\x75\x57\x35\x8a\x12\xcd\x19\xaa\x4e\xc9\xbc\x3d\ \xdb\x76\xca\xbc\xa3\x54\x64\xee\x49\x40\x77\xfb\x76\x2a\x46\xbe\ \x97\x61\x5f\x5f\x64\xd1\x96\xdb\x60\x58\x48\xd5\xd0\x7e\xa9\xcb\ \x9d\xa3\xe2\x21\x98\x26\xf7\x51\x75\xe9\x5b\xa9\x1a\xf8\x95\x8a\ \xbe\x89\xb0\x58\x46\xcd\x3f\x27\x72\x32\xb0\xeb\xe8\x45\xaa\x96\ \xc2\x66\x2e\x43\x06\x4f\x1e\x92\xae\xbd\x3f\x9d\xa7\xae\x1e\x36\ \x29\x9a\x86\x2e\xfc\x72\x6e\x70\x94\x61\xb3\x60\x93\x62\xc9\x66\ \xc3\xe6\x01\x96\xec\x3e\xd8\x74\xb3\x64\xaf\xc2\x62\x26\x23\xb8\ \x19\x86\xf2\x1e\x46\xd0\x53\x8e\xb0\x7b\x19\x49\x1b\x42\xa6\x65\ \x18\xc9\x96\x1b\xa0\x5b\xc4\x88\x16\x41\x27\x1c\x06\xd2\xaf\xad\ \x79\x2f\xcb\x2b\x70\x04\x42\x84\x43\xcf\xdb\xb3\x04\x80\xaa\xa6\ \x8f\x19\xd2\xdf\xbd\xb0\xf5\xc1\x15\x5f\xd0\xe3\x08\x18\x84\x43\ \x72\x73\x4b\x19\x7c\xe2\x29\xaa\xb2\x4f\x4c\x85\xab\xea\xd1\x34\ \x49\x47\xc0\x42\x38\xec\xad\x45\x41\x62\x09\x8b\x32\x77\x22\x50\ \xdb\x4b\x47\xc0\x4a\xcc\x4f\x42\x91\x5c\xc7\x82\x3a\x14\x25\xe7\ \x0b\x94\xa6\x81\x81\xe7\x11\x4b\x65\x9a\x79\x37\x21\x9e\x2e\xfa\ \xfa\xae\x42\x3c\x1d\xf4\x3d\x87\x98\xea\xe9\x6b\x47\x4c\x35\xf4\ \xcd\xc3\x7f\xfb\x17\x0b\x7b\xa1\x81\x71\xfb\xf7\x00\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x5e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x6f\x50\x4c\x54\x45\x00\x00\x00\x33\x99\x66\x55\xaa\ \x55\x49\xb6\x6d\x43\xb0\x5b\x41\xb2\x5f\x46\xae\x5d\x44\xb0\x5b\ \x43\xaf\x5c\x42\xb0\x5c\x43\xaf\x5c\x43\xb0\x5b\x44\xaf\x5c\x43\ \xb0\x5b\x42\xb1\x5c\x44\xb0\x5b\x43\xb0\x5b\x42\xb0\x5c\x43\xaf\ \x5c\x43\xb0\x5d\x42\xb0\x5c\x43\xb0\x5b\x43\xb0\x5c\x43\xb0\x5c\ \x43\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\xb0\x5c\x43\ \xb0\x5c\x48\xb2\x60\x51\xb6\x68\x5b\xba\x70\x7e\xc9\x8f\x7f\xc9\ \x90\x82\xca\x92\xaa\xdb\xb5\x4a\x94\xf7\x11\x00\x00\x00\x1d\x74\ \x52\x4e\x53\x00\x05\x06\x07\x2a\x2b\x2c\x2d\x8d\x8e\x90\x91\x93\ \x94\x96\x97\xbb\xbc\xbd\xbe\xd3\xd4\xd5\xf1\xf2\xf3\xf4\xfc\xfd\ \x64\x79\xba\xb6\x00\x00\x00\x81\x49\x44\x41\x54\x18\x19\x05\xc1\ \x51\x72\x82\x30\x14\x00\xc0\x7d\x79\x01\x9c\x52\xad\xf7\xbf\xa4\ \x33\x6d\xfc\x10\x42\xd2\xdd\x80\xad\x7e\x2d\xce\x77\x3f\x10\xe4\ \xfe\x08\x30\x7e\xdf\x43\xca\xe7\x3d\x80\xb8\xe5\x67\xa6\xc7\x37\ \x44\xc0\x7a\x1d\x65\xbb\x83\x4c\xf0\xb3\xd4\x1a\x20\x80\x52\xcb\ \x0e\x00\xec\x35\x29\x95\xb0\xd2\x87\x5a\x26\x00\x30\xeb\x60\x1c\ \x2c\x4e\x70\x95\x06\x00\xb4\xd2\x07\x00\x8c\x9e\x97\x1b\xc4\x9c\ \xf0\xfa\xa4\x5e\x56\xcc\x09\x7f\x4d\x9a\xc7\xb5\x05\x18\xaf\x36\ \x05\x2c\x75\x5f\x9c\xad\x77\xfc\x03\x8c\xd7\x30\x45\x68\x3e\xe7\ \x84\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xba\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\x8d\x50\x4c\x54\x45\x00\x00\x00\x46\x46\x5d\x3d\x47\ \x5c\x41\x4b\x60\x42\x4a\x60\x42\x4a\x60\x42\x4a\x60\x48\x50\x65\ \x4d\x54\x69\x50\x57\x6b\x52\x5a\x6d\x53\x5a\x6e\x55\x5c\x6f\x59\ \x60\x73\x61\x68\x7a\x63\x69\x7b\x6d\x73\x83\x78\x7d\x8c\x79\x7f\ \x8d\x88\x8c\x99\x8b\x90\x9d\x99\x9d\xa7\xa8\xab\xb3\xb0\xb2\xba\ \xb8\xba\xc0\xbb\xbd\xc3\xbf\xc1\xc6\xc4\xc5\xca\xc7\xc9\xcd\xc9\ \xca\xce\xcc\xcd\xd0\xd9\xd9\xdb\xdf\xdf\xe0\xe6\xe6\xe6\xe7\xe7\ \xe7\xe8\xe8\xe8\xea\xea\xea\xeb\xeb\xeb\xec\xec\xec\xef\xef\xef\ \xf2\xf2\xf2\xf3\xf3\xf3\xf7\xf7\xf7\xf9\xf9\xf9\xfa\xfa\xfa\xfe\ \xfe\xfe\xff\xff\xff\xdf\x6d\x44\x19\x00\x00\x00\x06\x74\x52\x4e\ \x53\x00\x16\x19\x52\xd5\xd8\xb7\x68\xec\xc4\x00\x00\x00\xd6\x49\ \x44\x41\x54\x58\xc3\xed\xd3\xd9\x12\x82\x20\x14\x80\x61\xcb\xb2\ \x3d\x6d\x5f\x6c\x91\xd4\x32\xad\xde\xff\xf1\x72\xd2\x04\x8c\xa9\ \xe3\x61\xa6\xac\xf8\x6f\x81\x6f\x86\xe1\xa0\xe9\x06\xad\x4b\x5e\ \x37\x8c\xf7\xd5\xab\x1a\x0d\x03\x70\x02\x0a\x60\x05\x1c\xc0\x08\ \x10\xa0\xd7\x4c\x5a\x52\x80\x0a\x10\xa0\x95\xae\x2f\x18\x20\x13\ \x60\x40\xc3\x34\x3b\x39\xe0\x2e\xc0\x80\x3e\x21\x93\x3c\x90\x0a\ \x12\x40\x22\xc8\x00\x37\x41\x0a\x30\x6a\x15\x49\xc0\xd0\xff\x07\ \x10\x4c\xe2\x5b\x81\x81\x95\xb4\xc2\x02\x82\xef\x5c\x56\xa0\xed\ \x08\x5a\xdb\x5c\xd6\x33\x00\x91\x02\x14\xa0\x80\x47\x60\xbe\x81\ \x36\x16\x03\x0e\x81\x36\x2b\x37\x70\x38\x66\x79\x18\x60\x7f\xa1\ \x9d\x30\x80\x77\xa6\x40\x88\xba\x82\xeb\x67\x7d\xea\x15\x5c\xb6\ \x5d\x61\xc0\x0d\x23\xae\xa0\x28\xe0\xf3\xe7\xa3\x50\x66\x0e\xe2\ \x02\xff\x0b\x47\x59\x02\xd8\x82\x81\xa9\x18\xb0\xc1\xc0\x48\x01\ \x0a\xf8\x3d\xe0\x0a\x14\x5b\x2b\x31\x4d\x10\x23\x57\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x4e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x13\x00\x00\x04\x13\ \x01\xfd\x8e\xab\xcc\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\xcb\x49\x44\ \x41\x54\x38\x8d\x85\x92\x3d\x6b\x53\x61\x14\x80\x9f\xf3\xde\x8f\ \x24\x35\x6d\xfa\x71\x6f\x25\x5a\xb0\x12\x11\x87\x0a\x7e\xe1\xac\ \xa2\xe0\x20\xe8\x28\x08\xe2\xe0\xa6\x93\x4e\x92\x6e\x2d\x2e\xba\ \x8a\x8b\xe0\x8f\x10\x11\xcc\xa0\x22\xdd\x4c\x41\x71\x10\x15\x8a\ \x12\x53\xb5\x37\x84\x24\x9a\xdc\x26\xf7\xde\xe3\x60\x2d\x04\x6c\ \xee\x19\xcf\xe1\x79\xce\xc7\xfb\x0a\xc0\xf7\x20\x38\xa3\xc8\x32\ \x70\x14\xc8\xb2\x43\xc4\x49\x44\x27\x6c\x84\x85\xb1\xd9\x55\x51\ \x5d\x2c\xfa\xfe\x0b\xd9\x82\x2b\x80\xd9\x09\x04\xa8\x7e\x7d\x46\ \xb5\xf6\x14\x31\x31\xc4\x36\xe7\x0e\x5d\x4f\xe6\xa7\x0f\x9f\x35\ \x5b\x9d\x47\xc2\xed\xb0\xc1\x9b\xfa\x13\x32\x13\x09\x6e\x5e\x70\ \x0b\x31\x95\x0f\x8f\x8c\xc0\x92\x01\x16\x46\xc1\x00\xf5\xe6\x47\ \xd4\xda\x1c\xca\xa9\x15\xd1\xe8\xfd\x3c\x62\x50\xd6\xd2\x04\xfe\ \xc4\x3e\x24\x72\x86\x93\x89\x45\x21\x3b\xf3\xc9\xa8\xe8\xfd\x34\ \xc1\xcc\xae\x3d\x94\xa6\x4e\x12\xfe\x8a\xe9\x75\x43\x36\x3b\x70\ \x62\xee\x02\xb6\xb8\xf7\x04\x60\x3d\x08\x6e\x08\xb2\xac\x30\x39\ \x4a\xd4\xf8\x5d\x27\xe8\x7c\x61\x6f\xe1\x60\x2b\x9f\xf3\xee\x14\ \xbd\xe9\x87\xb2\xbd\x93\xaa\xf9\x16\x04\x07\x0c\x8c\x8f\x92\xd8\ \xaa\x6d\xdf\xf7\x3f\x8b\x88\x42\xca\xf5\xff\x17\x7d\x11\x01\xb6\ \x1b\xff\x5b\xe1\x66\xd2\x6c\xde\x4d\x6a\x6b\xe3\x52\x9c\xc3\xf2\ \x76\xa7\x79\x5a\xa0\xe5\xa2\xe7\x3d\x90\xf5\x20\xb8\x16\xad\xbc\ \x7c\x9c\xbc\x7e\x4e\x26\xec\x32\x70\x32\xc4\x0b\xc7\xc8\x5c\xbc\ \x9c\x3a\x8d\xa2\x57\x0d\x83\xe8\x76\xb4\x52\x21\x1f\x0f\x70\x1c\ \x87\x31\x12\xac\xf7\x55\xe2\xe0\x47\xaa\xc0\x88\xdc\x32\x49\xab\ \xb9\xdf\x8e\xe2\xa1\x82\xd3\xef\xa3\xf5\x5a\xfa\x04\x4a\xc9\x58\ \xde\xec\xdb\xc8\x71\x87\x0a\x61\x2e\x87\x99\x2f\xa5\x0a\x44\x79\ \x67\x54\x93\x45\xe7\xd2\x95\xa4\xed\xe6\xe8\x8a\x45\xc7\x76\xb1\ \x4e\x9d\xc7\x4c\x8c\xfc\x12\x00\x89\x62\xca\x7f\x5f\x61\x63\xe3\ \xb4\xc1\x2c\x45\xcd\xe0\xb8\x14\x26\xb3\x62\xd9\xa3\xc0\x9e\x28\ \xab\x8a\x29\x17\xfd\xa9\x57\x7f\x00\xd9\xe9\xb0\x28\xfe\xa5\xad\ \xb6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0f\xf1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0f\xbf\x00\x00\x0f\xbf\ \x01\x9f\xb0\x32\xa7\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0f\x6e\x49\x44\ \x41\x54\x78\x9c\xc5\x9b\x7b\x70\xdc\xd5\x75\xc7\x3f\xf7\xf7\xd8\ \xf7\xae\x5e\x2b\x59\x92\x1d\x5b\xb2\x2d\x09\x6c\x19\xe2\xd6\x4d\ \x62\x02\x04\xd3\x38\x4c\x12\x4c\x32\x3c\x4a\x27\x69\x92\x36\xb8\ \xa1\x93\x26\x4d\x83\x4d\x48\x42\xec\xd9\xc1\xd0\xd4\x31\xa6\x0c\ \x74\x98\x26\x6d\x4c\xda\x0c\x74\x92\x96\x0e\xb4\x4e\xa7\x8c\x27\ \x18\x9c\x74\x92\x82\x09\xc5\xb1\xfc\x04\x1b\xf9\xa1\xb7\xb4\xab\ \x7d\xef\xfe\x1e\xb7\x7f\xac\x56\xd6\xbe\xa4\xdd\x95\xa0\xdf\x19\ \xcd\x68\xef\xef\xde\x73\xcf\x39\xbf\x7b\xcf\x39\xf7\x9c\xfb\x13\ \xbc\xcb\xd8\x19\x7a\xb1\xcd\xd6\xf4\x1b\x90\xa2\x5f\xc0\x55\x12\ \xd1\x2b\x90\x4d\x40\x23\xe0\x9b\xe9\x16\x07\x22\x12\x11\x16\xd8\ \xa7\x11\x9c\x92\x30\x60\x28\xda\x91\x27\xbf\x7d\xe3\x78\xb5\x73\ \x85\x08\xdd\x19\x22\xf4\xaf\xb5\xf0\x27\x6a\xe9\x5c\x2d\xbe\xfe\ \xf0\xe1\x4d\x8a\x94\x9f\x01\xb1\x15\x58\xbf\x88\x79\x24\x70\x5c\ \x48\x71\x48\xa8\xd6\x33\xfb\x1e\xfc\xfd\xdf\x54\xea\xb8\x87\x3d\ \x3d\x16\xd6\x09\x05\xe5\xba\xdd\xec\x7e\xad\xda\x09\x96\x4c\x01\ \xdf\xd8\xfb\x4b\xbf\x69\x64\xff\x54\xd8\xca\x3d\x08\xb9\x6e\xee\ \x33\x9f\xdf\x41\x73\x8b\x0b\x7f\xc0\x81\xbf\xc1\x89\xcb\xa5\xe2\ \x70\xa8\x68\xba\x82\x04\x2c\xc3\x26\x9b\xb5\xc8\xa4\x4d\xa2\xd3\ \x59\xa2\xd1\x2c\xe1\xc9\x34\xf1\x58\xb6\x78\x9a\x01\x10\x3f\x4c\ \x59\xf2\xef\x9f\x0a\x6d\x89\xcf\x7d\x10\x22\xf4\xcf\xc0\x1f\x02\ \x07\x43\x84\xb6\x55\xcb\xf7\xa2\x15\xf0\xcd\xef\xfe\xa2\xc9\x34\ \xcd\xaf\x49\xc4\x57\x41\x36\x03\x08\x21\xe8\x58\xee\x65\xc5\xca\ \x00\xcb\x3a\x3c\x78\xbc\x7a\x5d\xb4\x13\x09\x83\xb1\xe1\x24\x17\ \x07\xa3\x8c\x0c\x25\x90\x52\xe6\x1f\x4d\x22\xe4\x13\x96\x29\x9e\ \x78\x3c\xb4\x25\xf2\x10\x0f\xad\xb7\xb1\x8f\x01\xca\xcc\xf3\xcd\ \x21\x42\xbf\xae\x66\x8e\xfa\x15\x20\xa5\xd8\xf9\xf0\x2b\x7f\x0c\ \x72\xaf\x84\x56\x00\x8f\x57\xa7\xf7\xea\x26\xba\x56\x37\xe0\x74\ \x69\x75\x93\x2e\x87\x74\xda\x64\xf0\xdc\x34\x67\x4e\x4e\x91\x4c\ \x98\xf9\xe6\x51\x29\xe5\x37\x02\xbb\x8f\x7c\x0a\xb8\x7d\x4e\xf7\ \x43\x21\x42\x1f\xab\x86\x6e\x5d\x0a\xb8\x7f\xcf\xcf\xd7\xd8\x28\ \x3f\x02\xae\x87\xdc\x12\x5f\xb7\x21\xc8\xaa\x35\x01\x14\xf1\xae\ \x98\x95\x59\xd8\xb6\x64\xf0\xdc\x34\x03\xc7\x26\x48\xc4\x0d\xd4\ \xe1\x38\xee\xa7\x5e\x2f\x11\x44\x41\xb9\x69\x37\xbb\x5f\x59\x88\ \x5e\xcd\xaf\x69\xc7\x9e\xc3\x9f\xb6\xe1\x00\xd0\xa4\x08\x41\xe7\ \xf2\x20\xfd\xd7\xb4\xd2\x10\x94\x0b\x8e\x5d\x0a\x28\x8a\xa0\x7b\ \x6d\x23\x2b\xbb\x1b\x38\x75\x7c\x92\x73\xcf\x1c\x2f\xfb\x16\x6d\ \xec\x87\x81\x1b\x16\xa2\xa7\x56\x3d\xb3\x94\x62\xa7\x7a\xd3\x3e\ \x04\x4f\x00\x6e\xbf\xdf\xcd\xc6\x8d\x6b\x68\x5f\xd6\x84\x6d\x2a\ \x38\xbd\x12\x45\x59\x90\xca\x92\x41\x51\x04\xda\xc5\x69\x86\x9e\ \x7a\xa3\x52\x97\x95\x5b\xd8\xf2\xea\xcb\xbc\xfc\xd6\x7c\x74\xaa\ \x5a\xaf\x5f\xfa\xfe\x51\x3d\x30\x16\x3b\x20\xe1\x8f\x00\x56\x2c\ \x0f\xb2\xb6\xa7\x03\x45\x5c\x91\xd8\xe9\xb1\x09\xb4\x98\x15\x69\ \xd4\x0b\x73\x3a\x4b\xf2\x42\xb4\xe2\x5f\x15\x88\x00\x6f\x03\xe7\ \xca\xfc\xbd\xb3\xa0\x02\xbe\xf4\xfd\xa3\xba\x7f\x34\xf6\x1c\x82\ \x6d\x08\xe8\xeb\x59\xce\xf2\xe5\xc1\xb2\x7d\x1b\x97\x19\xe8\x8e\ \xa5\xd9\x0a\x56\xd2\xe4\xd5\xcf\x1d\x24\x7c\x74\x64\x49\xe8\x55\ \xc0\xeb\xf3\x2f\x5a\x29\x45\x60\x2c\x76\x00\xc1\x36\xa1\x28\xf4\ \xaf\x5b\x55\x51\x78\x80\xc4\x74\xf5\x3b\x6a\x21\xa8\x1e\x8d\x4d\ \x4f\x7f\x9c\xa6\xdf\x6d\x5f\x32\x9a\x45\x18\x00\x6e\x9b\x97\xe3\ \x9d\xea\x4d\xfb\xa4\xe0\xcf\x10\xd0\xbf\x6e\x25\x6d\x6d\x8d\xf3\ \x52\xb4\x4d\x81\xee\x90\xa8\xfa\xd2\xac\x02\xd5\xa9\xd1\xb9\x6d\ \x2d\xd3\xbf\x1d\x27\x39\x58\xd5\x72\xaf\x16\xaf\x39\x70\x7c\x74\ \x17\xbb\xc6\x2a\x2a\x60\xc7\x9e\xc3\x77\x22\x78\x1c\xa0\xa7\xa7\ \x93\xce\x8e\x96\xaa\x28\x9b\x86\xc0\xed\xb5\x97\x2c\xc6\x54\x74\ \x85\x8e\x6d\x6b\x89\x9f\x09\x13\x7f\x2b\xbc\x14\x24\x0f\xbb\x71\ \x7f\xfc\x5b\x7c\x2b\x02\x15\xbc\xc0\xfd\x7b\x7e\xbe\x46\x22\x7e\ \x06\xb8\x56\x2c\x0f\xb2\xba\xbb\xfa\x65\x28\x6d\x81\xaa\x49\xb4\ \x25\xb2\x05\x00\x42\x15\x74\x7c\x62\x35\xa9\xa1\x38\xd1\x13\x93\ \x8b\x21\xf5\x1f\xc0\xa7\xbf\xc3\x77\x92\xf9\x86\x52\x05\x48\x29\ \x36\x1f\x19\x7c\x01\xe8\xf5\xfb\xdd\xf4\xf7\xaf\x42\xd4\x18\xdc\ \x98\x59\x05\xb7\xd7\x62\x49\x63\x22\x45\xd0\xb6\xb5\x0b\x2b\x66\ \x10\x79\x63\xb4\xe6\xe1\x66\x6f\xf3\xe8\x48\x57\xe3\x87\xf6\x0f\ \xef\x2c\x38\x60\x94\x18\xc1\x5c\x78\xcb\xf5\x8a\x50\x58\xbf\x6e\ \x55\x81\xab\xab\x16\xb6\x05\xa9\xf8\xd2\x19\xc4\x3c\x84\x10\x5c\ \xb5\x6b\x33\x6a\x8d\x67\x0b\xa9\x0a\xd2\x9f\xe9\x5f\xe6\xfb\x54\ \xef\xdd\x25\x34\xe7\xfe\x98\x39\xd8\x9c\x96\xd0\xda\xd5\xd5\xce\ \xea\xee\x65\xf5\x33\xab\x40\x73\x7b\x16\x65\x46\x0f\xaa\x22\x68\ \x70\x39\x09\xb8\x1c\x78\x1c\x1a\x4e\x4d\x45\x9d\x51\xae\x25\x6d\ \x32\xa6\x45\x32\x6b\x12\x4d\x67\x99\x4e\x67\xb0\xec\xf2\x5b\x28\ \x3d\x94\xe0\xa5\xcd\x3f\xae\x99\x9f\xe4\x5f\xfc\x1e\x56\xab\x67\ \x54\xd3\xcd\xbe\xbd\xdf\xdc\x3a\x9d\x6f\x2f\x08\x85\x73\xa7\x3a\ \x5a\xdd\x1e\x27\x5d\xab\xda\x6a\x9e\x64\x2e\xa4\x0d\xc9\xa8\x4a\ \xb0\x15\x3a\x02\x5e\x9a\xbd\xae\x8a\xe7\x04\x4d\x28\x68\x0e\x05\ \xaf\x43\xa7\xd5\xe7\xc6\x96\x92\xc9\x44\x9a\x91\x68\x82\xb4\x69\ \x15\xf4\x8d\x9d\xaa\xcf\x06\xb8\x23\x69\xe2\xad\x9e\x65\x86\xa1\ \x7d\x05\x78\x24\xdf\x3e\xbb\xbe\x77\xee\x7b\xd1\x2b\xe1\xcf\x01\ \x36\x5c\xdb\x82\xbf\xc9\x5e\xd4\x1e\x56\x15\x41\x57\xab\x8f\xfe\ \x8e\x20\x41\x9f\xbb\xa6\x43\x92\x22\x04\xad\x3e\x37\xfd\x1d\x41\ \xde\xd7\xe8\x2b\x18\x1b\xad\x53\x01\xc1\x19\x45\x0a\xf8\xfa\x97\ \x43\x87\xf3\x99\xa8\x2b\x0a\xb0\x33\xfa\xbd\x40\xd0\xe3\xd5\x59\ \xb5\x36\x80\x27\x60\xd1\xdc\x91\xc5\xed\xab\xdd\xa5\x79\xdd\x0a\ \xd7\x5d\xeb\xa7\xbb\xd3\xb5\x28\x25\x0a\x01\xed\x01\x2f\x7d\x6d\ \x4d\xe8\x6a\x8e\xd5\xd8\xe9\xa9\x0a\x9d\xa1\x71\x63\x1b\xa8\xe5\ \x27\x54\xc7\x92\xb8\xbd\x1a\x40\x8b\x47\x63\x7b\xbe\x7d\x56\x01\ \xc2\x56\xee\x01\xe8\xbd\xba\x69\x56\xe3\x8a\x0a\xbe\x26\x93\xe6\ \x76\x03\xa7\xc7\xae\x8a\xe9\x80\x57\x65\xf3\x86\x00\x7e\x4f\x79\ \x23\x28\x81\xac\x61\x90\x4c\x67\x88\x27\x53\xc4\x93\x29\x92\xe9\ \x0c\x59\xc3\xa8\x48\xd3\xe7\xd4\x59\xd7\xde\x8c\x47\xd7\x88\x9d\ \x2c\x5d\x01\xc1\xeb\x57\xf0\xe1\x83\x77\x72\xdd\xf3\xb7\x73\xe3\ \xa1\xbb\x59\x7e\x7b\x6f\x89\x22\x62\xa7\x26\xe9\xbd\xba\x39\xc7\ \x83\xe4\x8b\xb3\x72\x43\x3e\x87\xc7\x6b\x42\x08\x6e\xbb\x6b\x2d\ \xae\x0a\xc9\x0c\x23\xa3\x10\x8f\x28\x98\xd9\xf2\x9e\xc1\xeb\x56\ \xd8\xbc\x21\x80\x43\x2f\x7d\x0b\x96\x65\x13\x4f\xa5\x48\x67\xb3\ \x73\x33\x3b\x05\x50\x84\xc0\xe9\x70\xe0\xf3\xb8\x51\xcb\x1c\x2d\ \x53\xa9\x2c\x8f\x36\x7c\x0f\xdb\xb0\x66\x05\xef\x7b\xe0\x83\x34\ \x5c\xd3\x5a\xd2\x37\x7e\x36\xcc\xdb\x4f\xbd\xc1\xe5\x17\xce\x82\ \x25\x41\xc0\x8d\xaf\x7e\x9e\xff\x7c\xf1\x02\x52\x4a\x14\x85\x8d\ \xfb\x1e\xdc\xf2\xbf\x0a\x40\x2e\x81\x09\x1d\xcb\xbd\x15\x85\x07\ \xd0\x9d\x36\x4d\xcb\x4c\xfc\xcd\x26\xaa\x56\x28\x84\xa2\x08\x36\ \xf6\xf9\xca\x0a\x1f\x4b\x26\x99\x88\x44\x48\x65\x32\x15\x85\x07\ \xb0\xa5\x24\x95\xc9\x30\x11\x8e\x10\x4b\xa6\x4a\x9e\x47\xcf\x84\ \xb1\x0d\x2b\xf7\xc6\xff\xfd\x0e\x3e\xf0\xcc\xad\x65\x85\x07\xf0\ \xf5\x34\x71\xed\xdf\xdc\xcc\x8d\xff\xf5\x07\xb4\x7f\x72\x35\x00\ \xc6\x85\x28\xed\x1d\x9e\xdc\x5c\x76\x4e\xe6\x19\x69\xc5\x56\x80\ \x15\x2b\x03\x15\x99\x9b\x0b\x97\xd7\xc6\xe9\x91\xa4\xe2\x82\x54\ \x54\xc5\xb6\x05\x7d\x2b\x5d\x04\xbc\x85\xcb\x5e\x4a\x49\x24\x16\ \x27\x33\xcf\xf2\x2e\x07\x09\x24\x52\x29\x4c\xd3\xa4\xd1\xef\xbb\ \x12\x88\x09\xd8\xfe\xeb\xed\x88\xab\x1a\xb9\x3c\x1d\x9f\x97\x46\ \x1e\xbe\xde\x26\x7e\xe7\xa9\x8f\x11\x1d\x98\x40\x5a\x92\xf7\x75\ \x05\x18\x1e\x4a\x90\x97\x59\xec\x0c\xbd\xd8\x26\x55\xc7\x08\x20\ \x6e\xbd\x63\x2d\xde\x1a\x83\x0c\xdb\x06\x32\x0e\x3e\xd0\xdb\x54\ \x62\xf0\xc2\xb1\x18\x99\x6c\x6d\xc2\x17\xc3\xa9\xeb\x34\x05\xfc\ \x85\x73\x4a\xc9\xb1\xa1\x09\x0c\xab\x3a\xbb\x34\x17\x89\x84\xc1\ \xc1\xe7\xde\x02\x90\x58\xb4\x29\xb6\xa6\xdf\x00\x08\x9f\xdf\x51\ \xb3\xf0\x00\x8a\x02\x6b\x96\x97\x5a\xfb\x58\x32\xb9\x90\xf0\x71\ \xe0\x38\xb9\x63\x69\xc5\xd7\x99\x31\x8c\x92\xed\xa0\x08\x41\x67\ \x83\xaf\xc2\x88\xf9\xe1\xf5\xea\x78\x7d\x3a\x80\x10\x9a\xb8\x41\ \x41\x8a\x7e\x80\xe6\x16\x57\x5d\x04\x55\x45\xd0\xec\x2d\x1c\x6b\ \x59\x36\xc9\x54\xba\xd2\x90\x93\x12\x79\x47\x3c\xdc\x1c\xec\x08\ \xb6\x6c\xe8\x08\xb6\xf4\xc7\xc3\xcd\x41\x29\xb8\x13\x38\x55\x6e\ \x40\x32\x9d\xc2\xb2\x0b\xdf\x76\x70\x9e\xc0\x6a\x21\xe4\x65\x95\ \xc8\xf5\x8a\x40\xf6\x01\xf8\x03\xce\xba\x88\x35\xb8\x9c\x25\x8c\ \xc4\x53\x29\xca\x9b\x3a\x79\x50\x66\x33\x9b\x3a\x83\xc1\x7f\xeb\ \xe9\x11\x99\x7c\x6b\x4f\x8f\xc8\x74\xb6\xb4\x3c\x27\x4c\x63\x13\ \x82\x9f\x95\x8c\x92\x10\x2f\xb3\x0a\x1a\xdd\xf5\xf1\xec\x6f\xc8\ \x8d\x13\x92\x3e\x05\x44\x2f\x40\xa0\xa1\xbe\xe2\x45\xc0\xe5\x28\ \xf8\x2d\x81\x74\xb6\xa4\xa2\x03\x70\x42\x66\xb3\x77\x77\x76\x76\ \x26\xcb\x3d\x04\x68\x6f\x6f\x4f\x08\xc3\xb8\x9b\x32\x2b\x21\x53\ \x86\x66\xf1\xdc\xd5\xc2\x1f\x70\xe4\x79\xed\x53\x80\x20\x80\xcb\ \x5d\x9f\x02\x3c\x8e\x42\xb7\x69\x18\x46\x59\x57\x27\x91\xbb\xe6\ \x13\x3e\x8f\xf6\xf6\xf6\x04\x82\x5d\xc5\xed\xb6\x94\x25\xc1\x92\ \x5b\xaf\xaf\xf8\xe2\x76\xcf\x8e\x0b\x2a\x20\xfc\x00\x9a\x5e\x5f\ \x4e\xdb\xa9\x15\xba\x3e\xb3\xbc\x65\x4e\x24\xc2\x2d\x25\x4b\xbb\ \x12\xd2\xd1\xe8\x41\xa0\x44\x59\xc5\xb4\x8b\xe7\xae\x16\x73\x64\ \xf5\x2b\xcc\x94\xa8\xeb\x55\x80\x5a\xb4\xff\x6d\xbb\xac\x02\xce\ \xcd\xdd\xf3\x0b\xa1\xbb\xbb\x3b\x0d\x9c\x2f\x6e\x2f\xa6\xad\x29\ \xf5\x19\x41\x5d\x9f\x55\x9c\xff\xbd\x2a\x65\xd4\xc3\xe9\xbb\x5b\ \x63\x9b\x81\xc2\x8c\x0f\x36\x8d\xda\x83\x0a\x00\x4b\x16\x87\xc4\ \x65\x75\xda\x7d\xf6\xac\xac\xda\x64\x9f\x3f\x7f\xde\x05\x74\x15\ \xb7\x17\xd3\x36\x2b\x24\x4d\x16\x82\x61\xcc\xe6\x18\x62\x0a\xc8\ \x18\xd4\xaf\x80\x4c\x51\xc2\x42\x53\xcb\x2a\xc0\xeb\x6d\x9e\xba\ \xb5\x5a\x9a\xae\x40\x60\x1b\xe0\x29\x6e\x2f\xa6\x5d\x3c\x77\xb5\ \x98\x23\x6b\x4c\x01\x26\x00\x52\xa9\xfa\x42\xd6\x64\xb6\xb0\x1c\ \xe6\xd0\xf5\xb2\x01\x8a\x90\x3c\x3c\x32\x32\xe2\x5d\x88\xde\xd8\ \xd8\x98\x0f\xc9\x9e\xe2\x76\x45\x08\x1c\x7a\xa1\xa7\x4a\x19\xf5\ \x95\xe2\x52\xa9\xd9\x71\x13\x0a\xc8\x33\x00\xb1\xe9\xfa\x14\x10\ \x4d\x97\xfa\x67\xa7\xa3\xac\x7f\xbe\x4a\xea\xfa\x4f\xe6\x53\xc2\ \xd8\xd8\x98\xcf\x52\xd5\x9f\x00\x7d\xd5\xd0\x2c\x37\x77\x35\x88\ \x45\x73\xe3\x04\x9c\x56\x24\xe2\x74\xae\xb1\x6a\x23\x5d\x80\xe9\ \x74\x06\xbb\xc8\x0e\xf8\x3c\xee\xf2\x16\x4c\xf2\x49\xa9\xe9\x47\ \x87\x27\x27\xef\x9c\xd9\xe7\x40\x6e\xcf\x0f\x4f\x4e\xde\x65\x29\ \xea\x51\x24\x9f\x28\x1e\x26\x44\x8e\xe6\x5c\xd8\x52\x12\x49\xd5\ \xc7\x73\x6c\x3a\x37\x4e\x0a\x4e\x6b\x08\x79\x1c\x29\x98\x9a\xac\ \x18\xbb\xcf\x0b\xcb\xce\x25\x30\x5b\x7d\x57\x18\x54\x15\x05\x8f\ \xdb\x4d\x22\x55\x7a\xa6\x07\xae\x42\xf2\x2f\x2e\x7f\x20\x39\x3c\ \x31\x99\x77\x75\xdd\xc8\xd2\x3d\x9f\x87\xd7\x55\x9a\x20\x99\x4c\ \xa4\x4b\x14\x5f\x2d\xf2\xb2\x0a\xc4\x80\x62\x28\xda\x11\x40\xc6\ \x63\x59\x12\xf1\xfa\xb6\xc1\x48\x34\x41\x31\x2f\x7e\x8f\x1b\xa7\ \x63\xde\xe8\xd2\x43\xee\x06\xd9\x7a\xca\x18\xbc\x3c\x9c\xba\x5e\ \xf2\xf6\xa5\x94\x0c\x47\x13\x75\xf1\x7a\x45\x4e\x69\x4b\x53\xfe\ \x42\x99\xb9\x87\x77\x1c\x60\x6c\x64\xc1\x48\xb5\x2c\xd2\xa6\xc5\ \x68\xac\x94\xa1\x46\x9f\x0f\xa7\x5e\x5f\x88\x0d\xe0\x74\xe8\x34\ \xfa\x4b\x8f\xbd\xe7\x2f\x67\x18\x1f\x15\x58\x56\xed\xa1\xc2\x15\ \x19\xc5\x9b\xfb\x43\x5b\x26\x14\x00\x21\xc5\x21\x80\x8b\x8b\xa8\ \xc0\x5e\x9e\x4e\x10\xcf\x14\xae\x20\x21\x04\x4d\x01\x3f\x5e\x77\ \x05\x9b\x50\x01\x42\x80\xcf\xed\xa6\xc9\xef\x2f\x29\xcb\x85\x63\ \x26\x67\x2e\xa6\xc8\x24\x15\xc2\xc3\x3a\x89\x69\xb5\x64\xf5\xcd\ \x87\x4b\x17\x62\xb9\x7f\x66\x64\x56\x00\x24\xf6\xb3\x00\x23\x43\ \x09\xd2\xa9\xfa\x5c\x8b\x2d\x25\x6f\x4d\x44\xc8\x5a\xa5\xbe\xd9\ \xef\x71\x13\x6c\x6a\xc4\xed\x2c\x3d\x3a\xcf\x85\x22\x04\x6e\xa7\ \x93\x60\x63\x63\xc9\xb2\x07\x48\x67\x6d\xde\x38\x95\x20\x1f\x11\ \x4b\x99\x2b\xbe\x4c\x0d\xeb\x55\x95\xe2\xd2\x69\x93\x91\xa1\xdc\ \x4a\x15\xaa\xf9\x0c\xcc\x09\x37\x77\xec\x39\xfc\x5b\xa0\xff\xfd\ \x9b\xda\xe8\x5b\x57\x5d\x29\xbc\x1c\x3c\xba\x46\x4f\x5b\x23\x0e\ \xb5\x32\x43\x59\xc3\xc0\xb4\xec\xd9\xd8\x5e\x51\x14\x34\x55\x29\ \xf1\xf3\x05\xcc\x67\x6c\x5e\x3b\x11\x27\x96\xac\x1c\xfc\xa8\xba\ \xc4\xdb\x60\xe1\x74\x97\x0f\xea\x4e\x0d\x4c\xf1\xe6\xeb\xa3\x80\ \x38\xb6\x7f\xd7\x4d\xd7\x42\x41\x71\x54\x1c\x00\x38\x73\x72\x0a\ \xbb\xce\x10\x13\x20\x69\x98\x0c\x0c\x4f\x11\xcb\x54\xf6\xd1\x0e\ \x5d\xc7\xe3\x72\xe2\xf3\xb8\xf1\x79\xdc\x78\x5c\xce\x79\x85\x0f\ \xc7\x4c\xfe\xfb\x58\x6c\x5e\xe1\x01\x2c\x43\x10\x9d\xd0\x08\x8f\ \xea\x18\xe9\x42\xaf\x61\xd9\x92\x33\x27\xf3\x45\x15\x79\x20\xdf\ \x7e\xa5\x30\xe2\xca\xfc\x00\x98\x48\x26\x72\x17\x12\x17\x03\xd3\ \xb6\x39\x3d\x16\x61\x68\x3a\x51\xb7\xab\x02\xb0\x25\xbc\x7d\x29\ \xcd\xff\x1c\x8f\x91\xc9\x56\x1f\xaa\x9b\x59\x41\x64\x5c\x63\x7a\ \x5c\xc7\x34\x72\x8b\xfc\x9d\xb3\x11\x52\x49\x03\x60\x32\x65\xf1\ \xc3\x7c\xdf\x59\x05\x3c\x7a\xff\x2d\x09\x89\x78\x02\x60\xe0\xd8\ \x04\x96\xb5\xb8\x0b\x0e\x52\x4a\x2e\x4f\xc7\x39\x36\x34\xc1\x58\ \x3c\x55\x93\x22\x6c\x29\x19\x8f\xa7\x78\xf5\x74\x98\xd3\x83\x29\ \xca\x9f\xb0\x17\x46\x36\x2d\x88\x8c\xe8\x44\xc6\x15\x4e\x1c\xcf\ \x55\x94\x04\x62\xff\xdc\x7b\xc6\x05\x29\x15\xdb\x92\x4f\xaa\xaa\ \xf8\x4a\x22\x6e\xb4\x9d\x38\x36\xc1\x86\x8d\xe5\x8b\x0e\xb5\xc0\ \xb0\x6c\x06\xa7\xa2\x5c\x0c\xc7\x68\x74\x5f\x29\x8f\x3b\x54\x75\ \xf6\x3c\x6f\xda\x92\xac\x65\x91\xc8\x9a\xc4\xd2\x59\x22\xa9\x5c\ \x74\x29\x9c\x02\x21\xf4\x9a\xac\x7c\x31\x24\x70\x6a\x60\x9c\x64\ \xc2\x00\x18\x56\x1c\xda\xdf\xce\x7d\x5e\x62\x92\xef\x7b\xe8\xa5\ \xcf\x0b\x21\xfe\x51\x51\x04\xb7\xdc\xb6\x9a\x40\xa0\xbe\xbc\xdb\ \x52\x21\x19\x55\x17\x75\xfb\x2c\x91\x4c\xf3\xea\x6b\x67\x91\xb6\ \x8d\x90\xf2\xb3\x8f\xee\xbe\xf9\xd9\xb9\xcf\x4b\xce\xae\x8f\xed\ \xda\xf2\x63\x10\x47\x6c\x5b\xf2\xab\x57\x2e\x63\x2f\x72\x2b\x2c\ \x16\x6e\xbf\x85\xa2\xd6\xc7\x83\x6d\x4b\x06\x06\x06\x91\xb6\x0d\ \x88\x97\x8a\x85\x87\x32\x0a\x40\x08\xa9\x59\xc6\xe7\x40\x4c\x45\ \xc2\x69\x7e\x73\xb4\xf6\xfb\x38\x4b\x09\x21\xc0\xdb\x50\x9f\x11\ \x38\x73\xf6\x12\xf1\x78\x1a\x20\x6c\x59\xf2\x9e\x72\x7d\xca\x66\ \x2f\xf6\x86\xb6\x5e\x90\xc8\x2f\x00\xf2\xed\xd3\xe1\x39\xee\xe3\ \xff\x07\x4e\xaf\x85\x56\xe3\xdd\xc3\x4b\x97\x27\x18\x1a\x9a\x82\ \x9c\x19\xf8\xe2\xe3\xa1\x2d\xef\x94\xeb\x57\x31\x27\xf8\xd8\xae\ \x2d\x07\x91\xec\x05\x78\xe3\xe8\x28\x17\xce\x2f\xe9\x45\xc5\x9a\ \x20\x00\x6f\x63\xf5\xd9\x9f\xd1\xd1\x30\x67\xce\x5e\xce\xfd\x90\ \x3c\xb2\x7f\xd7\x96\xe7\xe7\xa3\x5d\x19\x52\x8a\x1d\x0f\xbf\xfc\ \x34\xf0\x05\x45\x11\x7c\xf0\xc3\x9d\xac\xec\xae\xae\x82\xfc\x6e\ \x60\x7a\x5c\x27\x9b\x9e\x9f\xe5\xd1\xd1\x30\x27\x4f\x5e\xcc\xb9\ \x5d\x21\x0e\xec\x7f\xf0\x23\xdb\x11\xa2\xe2\xf2\x99\x3f\x2b\x2c\ \x84\xf4\x5b\x6c\x97\x92\x17\x6c\x5b\xf2\xab\x5f\x5e\xe6\xec\xa9\ \x25\xb9\xad\x59\x17\xbc\x0d\xd6\xbc\x6f\xec\xe2\xa5\x71\x06\x4e\ \x5e\xc8\xc7\x1c\xcf\xfb\x4d\x79\xef\x7c\xc2\x43\x95\xa9\xe7\xbb\ \x7e\xfa\x53\x75\xe5\x99\xd6\xbf\x43\xe6\xee\xd6\x74\xad\x6e\x60\ \xd3\x87\xda\x51\xb5\xf7\xf0\x03\x81\x19\x44\x27\x35\x32\xc9\xc2\ \x79\x6d\x5b\xf2\xd6\xdb\xc3\x5c\xba\x94\xfb\xc2\x4e\x20\xfe\x29\ \xda\xe6\xdb\xfe\x83\x7b\x37\x2d\x98\xe0\xa8\xfe\x94\x2a\xa5\xd8\ \xb1\xe7\xe5\xbf\x42\xf0\x00\x20\x1a\x9b\x5c\x6c\xbe\x71\x39\x81\ \x86\xf7\x36\x4e\xb0\x2d\xc1\xd4\xb0\x86\x94\x39\xd6\x13\xc9\x34\ \x03\x03\x83\x79\x6b\x2f\x73\x7b\xfe\xa6\xdd\x0b\xbd\xf9\x3c\x6a\ \xce\x28\xdc\xb7\xe7\xa5\xdb\x04\xca\xd3\x20\x9b\x15\x01\x6b\xfa\ \x9a\xd9\xb0\xb1\x15\xbd\xce\xca\x52\x3d\x88\x47\x34\x12\x11\x18\ \xbc\x38\xce\xe0\x3b\x63\xd8\xd2\x06\x98\x06\xb6\xef\xdf\xb5\xe5\ \xdd\xff\x70\xf2\x2f\x43\x87\xbb\x34\x95\x1f\x49\xf8\x08\xe4\x2e\ \x1d\xac\xbb\x26\x48\xd7\x9a\x06\x94\x3a\xcb\x55\xd5\xc2\xb2\x25\ \xe7\xcf\x4e\x73\xfc\xcd\x49\x32\xb3\x59\x61\xf1\x92\x66\x19\x7f\ \xb2\x37\xb4\xf5\x42\xad\xf4\x16\xf5\xd9\xdc\x7d\x7b\x5e\xfe\xac\ \x10\xec\x03\xda\x01\xdc\x5e\x8d\xde\xab\x9b\xe9\xea\x6e\xc0\xe5\ \x5e\xda\xcf\xe6\x52\x29\x93\xc1\x73\x51\xce\x9c\x9c\xca\x9f\xea\ \x00\x86\x85\x94\x3b\xcb\x45\x78\xd5\x62\xd1\xaf\xeb\x81\xbf\x3e\ \xd4\x60\x9a\xda\x57\x91\x7c\x8d\x99\x52\xbb\x10\x82\x8e\x4e\x2f\ \x2b\x56\xf9\x69\x6b\xf7\xe6\xaf\xa4\xd4\x8c\x78\x2c\xcb\xd8\x48\ \x92\x4b\x83\x51\x46\x86\x93\xb3\x65\x77\x01\xe3\x52\xc8\xc7\x55\ \xdd\xf1\xe4\xf7\x1e\xb8\x3e\xb6\x18\xfe\x97\x6c\xbd\x7e\x39\x74\ \xd8\xe7\xd1\xd8\x3e\x73\x09\x71\xc3\xdc\x67\x5e\x9f\x9e\xfb\x74\ \xb6\xc1\x89\x3f\xe0\xc0\xed\xd6\xd0\x67\x3e\x9d\x05\x30\xb3\x36\ \x86\x61\x91\x4a\x99\xc4\xa2\x59\x62\xd3\x19\xa6\x26\xd3\x65\xb2\ \xd4\xe2\x18\xc8\x03\xc2\x95\xfd\x87\x47\xef\xbf\xa5\xbe\xb4\x70\ \x31\xc5\xa5\x20\x52\x8c\xfb\x1f\x39\xfc\xfe\xdc\x3d\x3c\xb1\x15\ \xe4\x35\xb9\xbb\xe3\xf5\x40\xda\x20\xde\x44\x8a\x43\x12\xfb\xd9\ \xc7\x76\xdf\xfc\xe6\xd2\x72\xfa\x1e\x94\xa0\x77\x84\x0e\x07\x85\ \x26\x6e\x90\xc8\xf5\x52\x8a\xab\x15\x64\xaf\x14\xa2\x19\x59\xf4\ \xf9\xbc\x20\x22\xa4\x9c\x92\x70\x1a\xc1\x29\x81\x18\xd0\x15\xf3\ \xc8\x77\xbf\xfd\xd1\x45\x7d\x22\xb2\x10\xfe\x0f\xdb\xc6\x52\x4d\ \x0a\x3d\xdc\xc1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x05\x09\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\x13\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\xff\xff\ \x00\xff\x80\x00\x55\xaa\xaa\x80\x80\xbf\x66\x99\xcc\xff\xcc\x00\ \x80\x80\xaa\xff\xaa\x2b\x6d\x92\xb6\xdb\xb6\x24\xdf\xbf\x20\xe3\ \xc6\x1c\x80\x80\xb3\x74\x8b\xb9\xea\xbf\x15\xeb\xb1\x14\x6d\x80\ \xb6\xed\xb6\x12\xee\xbb\x11\x70\x80\xbf\xef\xbf\x10\x78\x87\xc3\ \xf0\xb4\x0f\xf2\xbc\x1b\xe8\xb9\x17\x6f\x85\xbc\xe9\xbc\x16\xea\ \xbf\x15\x70\x85\xc2\xeb\xb8\x14\xeb\xba\x14\x71\x84\xbd\xec\xbd\ \x13\x73\x84\xbd\x70\x80\xbf\xe7\xb7\x18\x74\x83\xc1\xe9\xbc\x17\ \x71\x80\xbf\xea\xb8\x15\xea\xba\x15\xeb\xb7\x14\x73\x86\xbf\x70\ \x83\xc1\xed\xbc\x18\x71\x82\xbe\xe9\xbc\x16\xe9\xb8\x16\xea\xba\ \x15\x73\x82\xbe\x71\x84\xbd\x72\x84\xbd\xea\xbb\x15\xea\xb9\x15\ \x71\x82\xbe\xeb\xba\x14\xeb\xb8\x18\x74\x83\xbd\xec\xb9\x17\x75\ \x83\xbd\xe9\xbb\x16\xea\xbc\x15\xea\xba\x15\x72\x83\xbf\xeb\xba\ \x17\xec\xba\x16\xec\xbb\x16\xeb\xba\x17\x74\x82\xbe\xeb\xbb\x17\ \x73\x84\xbf\x73\x84\xc0\x72\x82\xbe\x74\x83\xc0\xea\xbb\x15\x72\ \x82\xbe\xea\xb9\x17\xeb\xb9\x17\xeb\xba\x16\x73\x82\xbe\xec\xba\ \x15\x73\x83\xbf\xeb\xbb\x17\x72\x84\xbf\xec\xba\x16\x73\x84\xbf\ \xea\xba\x17\xea\xbb\x17\xeb\xba\x16\xeb\xbb\x16\x74\x83\xbf\xeb\ \xb9\x16\xeb\xba\x16\x73\x82\xbf\xec\xbb\x15\x73\x82\xc0\xeb\xba\ \x16\x74\x82\xc0\xeb\xba\x16\xea\xba\x17\xeb\xba\x16\x72\x83\xbe\ \xeb\xba\x15\x73\x84\xc0\xeb\xba\x16\xeb\xbb\x16\x73\x83\xc0\xec\ \xba\x16\x73\x83\xc0\xea\xba\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xbb\ \x15\x74\x83\xc0\xeb\xba\x17\x74\x83\xbf\xec\xba\x16\x73\x84\xbf\ \x73\x83\xbf\xeb\xba\x16\xeb\xba\x16\x72\x83\xbf\xea\xb9\x16\x73\ \x83\xbf\x73\x83\xbf\xeb\xba\x17\xeb\xbb\x16\x73\x83\xbf\xeb\xba\ \x16\x73\x83\xbf\xeb\xb9\x16\x73\x83\xbf\x73\x82\xbf\xeb\xba\x16\ \x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\xec\xba\x16\xeb\ \xba\x16\x73\x83\xbf\xeb\xba\x15\x73\x83\xbf\xeb\xba\x16\x73\x83\ \xc0\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\x74\x83\xbf\xeb\xba\x16\ \xeb\xba\x16\x73\x83\xbf\xea\xba\x16\xeb\xba\x16\x73\x83\xbf\xeb\ \xba\x16\x73\x83\xc0\xeb\xbb\x16\x73\x83\xbf\xeb\xba\x16\xeb\xba\ \x16\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\ \x73\x83\xc0\xeb\xba\x16\x73\x83\xbf\x73\x83\xbf\xeb\xba\x16\x73\ \x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\xc8\x2c\x4e\xba\x00\ \x00\x00\xaf\x74\x52\x4e\x53\x00\x01\x01\x02\x03\x04\x05\x05\x06\ \x06\x07\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0e\x0f\x10\x10\x11\x11\ \x13\x16\x17\x17\x18\x19\x19\x1a\x1b\x1b\x1f\x20\x20\x21\x22\x24\ \x24\x25\x27\x28\x29\x2a\x2b\x2e\x2f\x30\x33\x36\x3a\x3c\x3e\x3f\ \x3f\x41\x42\x42\x46\x47\x48\x4a\x4c\x4e\x51\x52\x59\x5a\x5a\x5b\ \x5d\x5e\x61\x61\x62\x63\x66\x67\x6a\x6b\x6f\x70\x74\x76\x78\x7a\ \x7b\x7d\x7f\x80\x80\x82\x83\x83\x89\x8c\x8d\x8d\x93\x98\x9a\x9c\ \x9d\xa2\xa4\xa9\xab\xad\xad\xb0\xb1\xb3\xb5\xb5\xb7\xb8\xba\xbb\ \xbc\xbd\xc4\xc6\xc7\xcc\xcc\xcd\xce\xce\xcf\xd1\xd2\xd7\xd9\xda\ \xdb\xdc\xde\xdf\xe1\xe2\xe2\xe3\xe3\xe5\xe5\xe6\xe8\xea\xea\xeb\ \xec\xec\xed\xee\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf6\xf7\xf7\xf8\xf9\ \xf9\xfa\xfc\xfd\xfe\xfe\xc7\xcb\xf5\xf5\x00\x00\x01\xf6\x49\x44\ \x41\x54\x58\xc3\xed\xd7\x57\x57\x53\x41\x14\x05\xe0\x8d\x17\x45\ \xd0\x28\x01\x89\x60\x17\x3b\xc5\xde\x7b\x41\xb1\x20\x46\x05\xa5\ \x63\x8b\xbd\x17\xec\xbd\xa2\x88\x88\x46\xd0\x88\x05\x35\x88\x1a\ \xce\xfe\x89\x3c\xf1\xc4\x59\xde\x71\xe6\xd1\xec\xf7\xfd\xad\xb9\ \x6b\xcd\x3a\x67\x2e\x90\xcc\xff\x91\xd9\x4b\x86\x3a\xf5\xf7\x27\ \xe4\x7e\x96\x7d\x3d\xe5\xa0\x88\xc8\x6e\xeb\x7e\xea\x31\x11\x11\ \x69\xb4\xed\x0f\x3f\x2d\x4e\xc0\xa8\x2b\xe2\x04\xe4\xdc\x14\x27\ \x60\xfc\x43\x71\x02\xa6\x3d\x13\x27\xa0\xb8\x4d\x9c\x80\x45\xef\ \x44\x01\x96\xce\x30\xed\x2f\xff\x24\x0a\x30\x9f\xb1\xb9\x66\xfd\ \x0d\xdf\x44\x03\x42\x2d\x7c\x39\xce\xa4\xbf\xf5\x97\x0c\x06\x86\ \x00\x28\xec\x64\x93\xe7\x5b\x1f\x56\x99\x90\xc1\x40\xb0\xe5\x6e\ \x10\x58\xd7\xc7\x5d\x7a\x6b\xdb\x93\x8f\x03\xe9\x11\x51\x80\xbc\ \xcf\x3c\xef\x01\x11\x76\xe6\x6a\xfd\xa2\xdf\xf2\xb7\x34\x02\x28\ \xe9\x63\x35\x10\xea\x60\x8d\x7a\x00\xf1\x05\xd0\xc0\xaf\x13\x81\ \x2a\x76\xa4\x2b\xc0\x0e\x03\x20\xfd\x05\x23\x40\x6e\x9c\x1b\x2d\ \x01\x94\xb1\x3b\x00\x9c\xe3\x49\x5b\x20\xd0\xcd\xf5\x40\x39\x5f\ \xdb\x02\xb8\xc8\x08\x50\x40\x4e\xb1\x05\xaa\xd9\x04\x78\x71\x2e\ \xb3\x05\xca\xf9\x08\x40\x33\x37\xdb\x02\x25\x7c\x05\xe0\x81\x76\ \x19\xcd\x80\x30\xef\xb9\x01\xb5\xbc\x0c\xa0\x99\xa5\xb6\xc0\x75\ \x1e\x02\xbc\x38\x57\x58\x02\xd9\xbd\x5c\x09\xcc\x21\xf3\x2d\x81\ \x0a\x76\xa5\x01\x65\x7c\x6b\x79\x91\x32\xa3\x3c\x00\xe0\x0c\x4f\ \x69\x33\xc8\x00\x38\xca\x58\x08\x18\xf3\x9d\x9b\x14\x60\x7a\x8f\ \x2f\x10\x26\xc3\x00\xf6\xf1\xc3\x48\x6d\x20\xac\xb9\x76\x67\x20\ \xad\x2a\x30\xa1\x97\xc7\x01\x64\x47\x59\xef\x3b\x14\xb7\xfc\x54\ \x80\xc0\xad\x0b\x23\x00\x1c\x61\x2c\xcf\x7f\x2a\xaf\xfa\xa2\xdf\ \x03\x60\xf5\x1f\xee\x31\x99\xeb\x8b\xdf\xeb\xc0\xac\x28\x6f\x78\ \x46\x9b\x65\x5e\xbb\x06\x04\x9f\xf2\xcd\x64\xc3\xdd\x36\xf3\xb9\ \x02\x2c\x64\xd7\x02\xe3\xed\x3a\xe9\xb1\xf2\x09\x6b\x0b\xff\x61\ \x3f\x8f\xbd\xed\xf6\x3e\x00\x46\x5f\x75\x04\x90\x71\xd6\x11\x40\ \xea\x09\x47\x00\x29\x87\x1d\x01\xa0\xce\x15\xc0\xde\x84\x88\xec\ \x74\x79\xad\x6f\xff\x21\x97\x32\x9c\xde\xfb\x59\x53\x93\xff\x4c\ \xc9\xf8\xa5\x1f\xa6\xc2\xb0\x89\x8c\xa0\xcb\x35\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x27\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x03\xf0\x00\x00\x03\xf0\ \x01\xd8\xe5\x4a\xc4\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\xa4\x49\x44\ \x41\x54\x38\x8d\x75\x93\xcf\x4f\x13\x41\x1c\xc5\xdf\xcc\x6c\xf7\ \x57\xdb\x2d\x6d\x85\x42\x0d\x07\x28\x28\x78\xa0\x31\x41\x13\x83\ \xe8\x09\x2e\x9e\xbc\x10\x2f\x90\xa8\x89\xde\xd5\x84\xe0\xa9\x89\ \x26\xc4\x18\x8e\x5e\x3c\x18\x35\xc6\x03\xfe\x05\x44\x0f\x28\x10\ \x13\x3c\x29\x06\x04\x52\x90\x80\x10\x04\x6a\xd9\xa5\xdd\xce\x76\ \x76\xd7\x03\x52\x0b\x49\xdf\x69\xf2\x9d\x37\x9f\x7c\xbf\x6f\x66\ \x08\x4e\x68\x78\x6c\x2a\x6d\xe8\xd2\x43\x5d\x0b\xb4\x49\x32\x0b\ \x03\x80\x70\x5c\xcb\x2e\x8a\xe5\x7d\xbb\x3c\xfa\xe4\x7e\xef\xd7\ \x6a\x3f\x39\x5a\x64\x32\xe3\xb2\x9e\x6c\x9d\x88\x37\x68\xe7\xcf\ \x75\xc5\x22\x8c\x91\x63\x60\x57\x78\x58\x5c\xf8\xb3\xbd\xb1\x66\ \x7e\x10\x3b\xeb\xb7\x32\x99\x01\xa7\x02\xc8\x64\xc6\x65\x2d\x99\ \x9a\x6f\x6b\x49\xa6\x82\x86\x82\x58\xa3\x73\xb2\xb1\x8a\x2c\xd3\ \x71\x67\xa7\xb7\x66\xf8\xf6\x5a\x5f\x26\x33\xe0\x50\x00\xd0\x93\ \xad\x13\x6d\x2d\xc9\x94\xaa\x29\x70\xcb\x80\x6d\xb1\x9a\x80\xb0\ \x21\xb3\x8b\x97\x9b\x7a\xa4\xfa\xe6\x17\x00\x40\x86\xc7\xa6\xd2\ \x67\x5b\x4f\x4d\x35\xd6\x37\x84\xfd\x7f\x13\xe9\x2a\x45\x57\xa7\ \x8a\x88\x2a\x03\x00\x4c\xee\x60\x23\x7f\x80\x52\x59\x54\x40\x0b\ \xdf\x77\x7f\xcf\xcd\xe7\xfa\x68\x44\x0b\x8c\x74\xa6\xeb\xc2\xd1\ \x26\x01\x55\xf7\xa0\x2a\x14\x3d\x69\x03\x2a\x05\xf2\x96\x85\xbc\ \x65\x41\x21\x40\x67\x22\x0a\x99\xfd\xef\xec\x4c\x47\xac\x21\x1a\ \x92\x47\xa8\xa6\x4b\xed\x8c\x11\x30\xc9\x47\x38\x2e\x90\xee\x50\ \x51\x16\x0e\xcc\x42\xc1\x77\x5d\xef\xa5\xeb\x7a\xaf\xcc\x42\xc1\ \x77\x9c\x32\x9a\xa3\xa1\x0a\x80\x49\x14\xba\x26\xb5\x4b\x92\x4c\ \xc3\xd5\x33\xd6\xe9\x32\xf2\x96\x05\x4a\xe8\xeb\x44\x3c\x7a\x13\ \x00\xb6\x73\x39\x62\x73\x3e\x54\x17\x3e\x66\x85\x14\xa0\x06\xad\ \x99\x16\xf1\x49\xcd\xbd\x23\x51\xe2\x4b\xc2\xf1\xac\xea\x9a\xc9\ \x1d\x68\x8a\x02\xb3\x50\x18\xdc\xce\xe5\x00\x00\x9e\xe7\x0f\x86\ \x34\x05\xfb\x25\x7e\xec\xbc\xe0\xae\x45\xed\xa2\x58\x76\x85\x57\ \x29\x6e\xe4\x0f\x20\xcb\x01\x18\xc1\x20\x61\x94\x0d\x31\xca\x86\ \x8c\x60\x90\x04\x24\x19\xdf\x7e\x94\x60\x1f\x1c\x06\xe9\x0a\x0f\ \xb6\x2d\x96\x58\x77\xef\xe0\x22\xa1\xf4\x7a\x7d\x42\x0f\x01\x80\ \xf0\x3c\xe4\x0a\x1c\x41\x55\x46\x5d\x50\x87\xaa\x28\xb0\xb8\x8b\ \x2f\x73\x05\xd8\xdc\x87\x53\xa2\xe0\x36\xc5\x6a\x76\x2f\xbf\xb3\ \x63\xde\x26\x00\xf0\xf8\xd9\xe7\x37\x97\xae\x9c\xbe\x11\x36\xe4\ \x9a\x2f\xc8\xdc\x93\xc0\x8b\x87\x91\xd9\x45\x8e\xec\xcf\x5f\xef\ \x87\xef\x74\xf7\x53\x00\x10\x3b\xeb\xb7\x66\xa7\xb7\x66\x2c\xd3\ \x71\x6b\x01\x82\x11\x17\x04\x3e\x8a\x36\x47\x76\x75\x73\x39\xeb\ \xe3\x1a\x00\x30\x00\x98\x9c\x7c\xe7\xf6\x5e\xe8\x7f\xbb\xb9\x4b\ \x52\x9c\x7b\x89\x58\x5c\x0d\x51\x7a\xfc\x12\x7c\xcf\xc3\xca\x4a\ \xee\x60\x73\x73\xef\x63\x16\xe8\x79\x7e\xb7\xbb\x0c\x54\xfd\xc6\ \x23\x3d\x78\xfa\xa9\x2b\x1a\x92\x47\x74\x4d\x6a\x97\x64\x66\xc0\ \x07\x44\xd9\x35\x6d\x5b\x2c\xd9\x36\x1f\x7d\x74\xef\xea\x5c\xb5\ \xff\x2f\x80\xbf\x13\x9c\x14\x7a\x5f\xc8\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x59\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xe4\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\x55\xaa\ \xaa\x80\x80\xbf\x66\x99\xcc\x80\x80\xaa\x6d\x92\xb6\x80\x80\xb3\ \x74\x8b\xb9\x6d\x80\xb6\x70\x80\xbf\x78\x87\xc3\x6f\x85\xbc\x70\ \x85\xc2\x71\x84\xbd\x73\x84\xbd\x70\x80\xbf\x74\x83\xc1\x71\x80\ \xbf\x73\x86\xbf\x70\x83\xc1\x71\x82\xbe\x73\x82\xbe\x71\x84\xbd\ \x72\x84\xbd\x71\x82\xbe\x74\x83\xbd\x75\x83\xbd\x72\x83\xbf\x74\ \x82\xbe\x73\x84\xbf\x73\x84\xc0\x72\x82\xbe\x74\x83\xc0\x72\x82\ \xbe\x73\x82\xbe\x73\x83\xbf\x72\x84\xbf\x73\x84\xbf\x74\x83\xbf\ \x73\x82\xbf\x73\x82\xc0\x74\x82\xc0\x72\x83\xbe\x73\x84\xc0\x73\ \x83\xc0\x73\x83\xc0\x74\x83\xc0\x74\x83\xbf\x73\x84\xbf\x73\x83\ \xbf\x72\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\ \x73\x83\xbf\x73\x82\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\ \x83\xbf\x73\x83\xc0\x74\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\ \xc0\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xc0\ \x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\xee\xa8\x47\x5c\ \x00\x00\x00\x4b\x74\x52\x4e\x53\x00\x01\x03\x04\x05\x06\x07\x0a\ \x0b\x0e\x10\x11\x17\x19\x1b\x1f\x20\x21\x24\x28\x29\x2b\x33\x36\ \x3a\x3f\x42\x46\x4c\x5a\x5b\x5d\x5e\x61\x62\x6a\x6f\x74\x78\x80\ \x83\x89\x8d\x9a\x9d\xa9\xad\xb5\xb7\xba\xbb\xc4\xc7\xcc\xce\xcf\ \xd2\xd7\xda\xdc\xe2\xe3\xe5\xea\xec\xee\xf1\xf3\xf6\xf7\xf8\xf9\ \xfa\xfc\xfe\x10\x0a\x39\xf8\x00\x00\x00\xd9\x49\x44\x41\x54\x58\ \xc3\xed\xd7\x4b\x57\x41\x71\x18\xc5\xe1\x7d\x8e\x5c\x43\x94\x4b\ \xc4\x51\x21\x22\x97\x24\x44\xe4\x12\xe9\xec\xef\xff\x7d\x1a\x59\ \xcb\x88\xe5\xec\x66\xfe\xbf\xf9\x7e\xc6\xef\x0b\x98\xce\xa3\xeb\ \x5b\x9f\xb4\x7f\x72\x39\x08\x7b\x9f\x5b\xcf\x24\x59\xf6\xbc\xb7\ \x9b\x24\xc9\xba\xd7\xbd\xbf\x45\x09\x08\x76\x29\x01\x91\x37\x4a\ \x40\x74\x48\x09\xb8\x1a\x53\x02\x52\x53\x4a\x40\xe6\x8b\x12\x90\ \x5b\x52\x02\x0a\xdf\x94\x00\x67\x4b\x05\xb8\xa8\xba\x3c\x1d\x28\ \x7d\x2c\x76\x6d\xc8\xd3\x81\x9b\x5f\x1e\xea\x38\x50\xa2\x08\x3c\ \x18\xc0\x00\x06\xf8\x1f\xc0\x51\x81\xc4\x46\x04\x70\xd7\x7b\xdf\ \xf5\xe9\x09\xd8\xaf\xf8\x23\x02\xc8\xaf\x44\x00\xd9\xb9\x08\x20\ \x3d\x13\x01\x24\x27\x22\x80\xd8\x48\x04\x70\xd9\x17\x01\x84\x5e\ \x45\x00\x81\xb6\x08\xc0\x7e\x11\x01\x58\x0d\x11\x00\x6a\x2a\x80\ \x8a\x4b\xf2\x51\xb9\xd6\xef\xd7\xec\x04\xa4\x7b\x3f\x1c\x37\x3f\ \x93\xe9\x58\x7f\xf1\x2e\x03\xb3\xf1\xfd\xb0\x96\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x24\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xb7\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xaa\xaa\ \xaa\xbf\xbf\xbf\xaa\xaa\xaa\x92\x92\x92\x9f\x9f\x9f\xaa\xaa\xaa\ \xaa\xaa\xaa\xa4\xa4\xa4\x99\x99\x99\xa2\xa2\xa2\x9b\x9b\x9b\x9d\ \x9d\x9d\x9f\x9f\x9f\xa2\xa2\xa2\xa3\xa3\xa3\x9e\x9e\x9e\x9f\x9f\ \x9f\x9d\x9d\x9d\xa2\xa2\xa2\xa0\xa0\xa0\xa2\xa2\xa2\xa0\xa0\xa0\ \x9f\x9f\x9f\xa0\xa0\xa0\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\x9f\ \x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\ \x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xe0\ \xf6\xeb\x67\x00\x00\x00\x3c\x74\x52\x4e\x53\x00\x01\x03\x04\x06\ \x07\x08\x09\x0c\x0e\x0f\x16\x17\x1a\x20\x21\x24\x2a\x2d\x2f\x37\ \x3b\x3c\x4b\x52\x5b\x62\x6d\x75\x80\x8e\x8f\x91\x99\xa0\xa1\xaa\ \xae\xb1\xba\xbf\xc0\xcd\xd2\xd9\xda\xde\xe3\xe5\xe7\xec\xed\xee\ \xef\xf5\xf8\xfa\xfc\xfd\xfe\x62\xeb\x7e\x2e\x00\x00\x00\xe0\x49\ \x44\x41\x54\x58\xc3\xed\xd7\x07\x12\x82\x30\x10\x05\x50\x50\xb1\ \xa2\xd8\xb0\x8b\x15\x0b\x8a\x35\x76\xee\x7f\x2e\x71\xdc\x13\xfc\ \xef\x0c\xa3\xb2\x07\x78\x43\xc2\xdf\x64\xa3\x69\x71\xfd\x64\xa5\ \x1c\xa5\x1c\x83\x00\x06\x41\x58\x8b\x1c\x0e\x1c\x5f\x40\xe0\x99\ \x24\x10\xf8\x16\xb5\x84\xb0\x76\x55\x10\x30\x5c\x11\x94\x0d\x0a\ \x89\x91\x08\x97\x16\x28\xe8\x7d\x11\x6e\x1d\x74\x1f\xba\xf7\xb7\ \xf0\xe8\xa1\x42\xfb\x2a\x1f\x31\xd4\x41\xa1\x79\x16\x61\x92\x04\ \x85\xfa\x41\x84\x59\x06\x14\x2a\x5b\x11\x96\x79\x50\x28\xad\x45\ \x58\x15\x41\xc1\xf4\x44\xd8\x94\x41\x21\x3b\x17\x61\x5f\x43\x63\ \x3d\x15\xe1\xd4\x88\x63\xfd\xa1\x58\x8f\xd1\x58\xdb\x4a\x04\x37\ \x1d\x59\xac\x2d\x5f\x04\xaf\x10\x4d\x5f\xb0\x4b\x60\x37\x91\xfd\ \x8d\x6c\x90\xc8\x28\xb3\xcd\xc4\xb6\x33\x7b\xa0\xb0\x47\x1a\x7b\ \xa8\x46\x1d\x5f\xf6\x6a\x63\x2f\xd7\x7f\x8f\x2f\x3b\xe6\xd1\x83\ \x26\x3d\xea\xd2\xc3\x36\x3d\xee\xd3\x0f\x8e\xb8\xbe\xb0\x9e\x84\ \x24\x62\x38\x20\x81\x2a\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x03\x70\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x04\x01\x00\x00\x04\x01\ \x01\xcb\x64\x78\x8f\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\xed\x49\x44\ \x41\x54\x38\x8d\x5d\x93\x4d\x68\x9c\x55\x14\x86\x9f\x73\xef\x9d\ \x9f\x74\xc6\x48\x53\xd3\x24\x5a\x15\x4a\xb0\x8c\x1d\x88\x10\x41\ \x2d\x23\x06\x5d\x48\x77\x9a\x34\x29\x05\xb1\x8b\x76\x11\xd1\x82\ \x82\x28\x68\x50\xab\x94\x9a\x85\x50\xa1\xa5\xd0\xa0\x2e\x43\x66\ \xa4\xd0\x85\x44\xac\x28\xd6\x8a\xc6\x26\x54\x6c\x4c\x51\x1a\xaa\ \x56\x62\xf3\x67\x4c\xf0\x9b\x64\x66\xbe\x7b\x8f\x8b\x26\x69\xd3\ \x77\x77\xe0\x3c\xe7\xbc\x8b\xf7\x15\x6e\x93\x76\x76\xde\x8f\x73\ \x07\x09\x21\x83\x48\x8c\xea\x26\x8c\x71\x84\x30\x43\x08\xa7\xe4\ \xf4\xe9\xbf\x6e\xdd\x97\x0d\xf0\xde\xbd\x79\xbc\x7f\x86\x38\x3e\ \x4e\x2a\xb5\x15\xef\xf3\x18\x13\x50\xbd\x80\xf7\x0e\xe7\x0e\xa1\ \xfa\x9b\x94\x4a\xa7\xd6\x18\xb3\x0e\x77\x77\xbf\x29\x43\x43\xe3\ \xa8\x7e\x4e\x22\xd1\x4f\x08\x4f\x61\xed\x14\xaa\x4b\xa8\x1e\xc4\ \xda\x17\xb1\xf6\x7d\xa0\xaa\x7b\xf6\x1c\xda\xe0\x40\x7b\x7a\x7a\ \x51\x1d\x47\x35\x05\x3c\x41\x43\xc3\x7b\x54\xab\x96\x72\xf9\x30\ \xaa\x82\xea\x24\x21\x7c\x86\x31\x87\x09\xa1\x0f\x6b\xf7\x01\xdf\ \x48\xa9\x34\x66\x74\xf7\xee\x14\x21\xe4\x48\x26\x7f\xc6\x98\x4e\ \x44\x8e\xb1\xb0\x70\x92\x28\xaa\x49\xb1\xf8\xba\x94\x4a\xaf\x21\ \x32\x82\x73\x6f\x13\x42\x1f\xce\xbd\x0b\x1c\x47\xf5\x79\x00\xd1\ \x9e\x9e\xa7\x57\xbf\x6c\xc7\xda\xaf\xf1\xfe\x39\x44\x8e\x01\x0f\ \x02\xcf\x02\x75\x84\xf0\x31\x89\xc4\x14\x21\x1c\x20\x84\x11\x20\ \x09\x14\x88\xa2\x3e\x43\x08\x6d\x58\xfb\x0b\xc6\x6c\x97\xa1\xa1\ \xcb\x18\x93\x22\x9d\x2e\x23\xd2\x25\xa5\xd2\xcb\xec\xdc\xf9\x02\ \xc6\xf4\xe2\xfd\x34\x21\xd4\x33\x37\x77\x16\x28\x00\x3f\x92\xc9\ \xb4\x3b\x44\xea\xa9\x54\xca\x58\xab\xda\xd1\xe1\x80\x2a\x2b\x2b\ \x2d\xc0\xb8\x76\x77\x17\x98\x98\x30\x67\xda\x7b\xa2\xbf\xb7\xdc\ \x7b\x21\x81\xcf\x6a\x1c\x9a\xf6\x7d\xfb\xd1\x6c\xc6\x2f\x5f\x46\ \xb5\xdd\xa1\xba\x84\x73\x09\x40\x69\x6c\x54\x42\x48\x10\x45\xd7\ \xc8\x66\xef\xc1\xda\xe1\xc1\xc7\xf6\x7f\x9a\xcc\xe7\x1a\x0a\xdb\ \xea\xd2\x24\x93\xcb\xb3\xb3\x51\x61\xd0\x1c\xa8\xdb\xf1\xfb\xc5\ \x23\x8f\x4f\x9e\xcf\x1a\xe0\x0a\x22\x6d\xc0\x04\xc6\xe4\x00\x2b\ \xc3\xc3\x15\x44\xd2\xfd\xbb\x5e\x69\xb0\x2d\xcd\xad\xad\xf9\x96\ \x45\x13\xbc\x53\x63\x7c\xe3\x96\x74\xed\x81\xfc\x36\x33\xba\xa3\ \xf0\x96\x14\x8b\x27\x0c\x89\xc4\x77\x84\xd0\x86\xea\x1c\xde\x6f\ \x06\xaa\xda\xd1\xe1\x50\x15\x97\x4d\x3d\xb9\xf5\xee\x3b\x6f\x84\ \x4d\x75\x3d\x74\x77\x6d\x4e\xc6\x22\xf6\x51\x00\x23\x83\x83\xd3\ \x44\xd1\x87\x88\x54\x30\x26\x85\x31\x53\x34\x37\xb7\x20\x62\x82\ \xaf\x5d\xaf\xd6\xe2\x1b\x94\xb5\xf1\xda\x11\xef\x55\x40\x97\xd6\ \x93\xb8\x6a\xb9\xb2\x1a\xa4\x45\x6a\xb5\x7a\x42\xd0\xb8\x12\xbe\ \xb8\x76\x75\x5e\xbd\x57\x89\xb3\x77\xcc\xaf\x39\xb8\x32\xf9\x8f\ \xd3\x10\x06\x00\xdc\xcd\x22\xe8\x1c\x22\x00\x69\x9c\xdb\x84\xf7\ \xbc\xf1\xd2\x23\xf3\x17\x5f\xed\xff\xea\x7c\x2a\x93\x6f\x6d\x4a\ \x36\x49\x26\x13\x4d\xff\xb9\x20\xd7\xff\x5d\x29\x6b\x8d\x4b\x1b\ \xba\x20\xa5\xd2\x84\x14\x8b\xe7\x98\x99\x39\x43\x2e\x37\x86\x88\ \x02\x3c\xf4\xc7\xe8\xd5\xff\x16\xd9\x55\xf7\xe5\xd9\xef\xa7\x46\ \x7e\x1d\xb8\xef\xa7\x73\xbd\xcb\x36\x6e\x0b\x96\x0f\x8e\x9e\x18\ \x6b\xbd\xbd\xcd\x37\x0d\x75\x75\x3d\xbc\xda\x93\x77\x6e\x9d\xd7\ \x74\x64\xe0\x87\xa6\xa3\x27\x47\x3f\xf9\x1f\xa4\x70\x52\x4e\x89\ \xc8\x9f\xc9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x6b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\x75\x50\x4c\x54\x45\x00\x00\x00\xcc\x66\x33\xd5\x55\ \x55\xdb\x49\x49\xd5\x5b\x49\xd5\x59\x47\xd6\x5d\x4b\xd7\x5b\x4a\ \xd7\x5a\x4a\xd7\x5a\x4a\xd6\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4b\xd7\ \x5a\x4a\xd6\x5a\x4b\xd6\x5a\x4a\xd7\x5a\x4a\xd8\x5a\x4b\xd7\x5a\ \x4a\xd7\x5a\x4a\xd7\x59\x4a\xd7\x5a\x4b\xd7\x5a\x4a\xd7\x5a\x4a\ \xd7\x5a\x4a\xd7\x5a\x4b\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\ \x5a\x4a\xd8\x5d\x4d\xda\x64\x55\xdb\x69\x5a\xdb\x6b\x5c\xdb\x6b\ \x5d\xf3\xcc\xc7\xf3\xce\xc9\xf4\xd1\xcc\xf4\xd1\xcd\x2a\xf8\xf6\ \x24\x00\x00\x00\x1d\x74\x52\x4e\x53\x00\x05\x06\x07\x2a\x2b\x2c\ \x2d\x8d\x8e\x90\x91\x93\x94\x96\x97\xbb\xbc\xbd\xbe\xd3\xd4\xd5\ \xf1\xf2\xf3\xf4\xfc\xfd\x64\x79\xba\xb6\x00\x00\x00\x88\x49\x44\ \x41\x54\x18\xd3\x65\x8f\xd9\x12\xc1\x50\x10\x05\x5b\x90\xe0\xda\ \xc5\x12\x57\xe7\x26\xb1\xfc\xff\x27\x7a\xa0\x90\xd2\x6f\x33\x55\ \xe7\xcc\x34\x00\x45\xd8\x9f\xcf\xfb\x59\xce\x8b\xe1\xf2\xa2\xaa\ \x71\x91\x01\x0c\x77\x7e\xd8\x66\xc0\xca\x1f\xe6\x50\x5c\xb4\x4e\ \xaa\xa9\xd6\x38\x26\xa8\xe9\xd6\x6a\x7b\x4b\xea\x94\x83\x6a\x73\ \xed\x9a\x6b\xa7\x5a\x52\xa9\xda\xdc\x1f\x9d\xaa\x27\x4e\xfd\xc5\ \xf1\x3f\x32\xeb\x97\x4e\xc8\x63\xef\xec\x08\x16\xbf\x8f\x05\x20\ \xdb\x7c\xe7\xf5\x00\x20\x9b\xc7\xb7\x5c\x18\xbc\x7d\xc7\xd3\xb2\ \xaa\xca\xc9\x08\xe0\x09\x20\xe7\x16\xb8\x91\x5e\xe9\x07\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\xd0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x11\xd4\x00\x00\x11\xd4\ \x01\x5a\xd3\x16\xbb\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x07\x4d\x49\x44\ \x41\x54\x78\x9c\xdd\x5b\x6d\x70\x54\xd5\x19\x7e\xde\x73\x37\x4b\ \x02\x89\x82\x49\x58\xc4\x2f\xc0\x4c\x24\x60\x67\x9c\xe2\xe0\x40\ \xab\x12\x8a\xd4\x90\x84\x6a\xe3\x82\x04\x1c\xa0\x5a\x2a\x33\x32\ \x4a\xa1\x74\x32\xfd\x70\xa5\x15\xdb\x8e\x4a\x6d\xc7\x19\x8d\x48\ \xac\x38\xa8\xbb\xa8\xa5\x69\x18\x03\x21\x85\xa9\x4e\xdb\x21\xdb\ \x61\x3a\x0d\x92\x38\x0d\x7e\x20\x10\x02\x2c\x01\x36\x9b\xdd\xec\ \x3d\x6f\x7f\xc4\xc4\x24\x5e\x76\xef\xdd\x7b\xcf\x85\xe1\xf9\x79\ \xcf\xfb\xf5\x3c\x73\xef\xd9\x73\xde\x73\x96\x70\x85\xa2\xb2\x7e\ \xd5\xe8\x9e\x64\x74\x35\x91\x58\xc2\xe0\x12\x00\x12\xc0\x7f\x88\ \xf1\xc6\xb8\xbe\xf8\xab\xa1\x45\xa1\x04\x00\xd0\xa5\x2d\x53\x0d\ \xe6\xbd\x53\x3d\x45\x6a\x5a\x03\x81\xa7\x1a\x8d\x13\x28\xac\xe9\ \x5c\xd9\x58\xf5\xc6\xf1\x2b\x4e\x80\x6f\xed\xfc\x41\x5e\x36\x27\ \x5a\x00\x14\xa7\xb2\x23\x50\x38\xd2\x99\x33\x4b\xb8\x54\x97\x6b\ \xc8\xe6\xf8\x5a\xa4\x21\x0f\x00\x0c\x9e\x31\x6e\x7c\xcf\x23\x57\ \x9c\x00\x60\x5a\x66\xde\x14\xcb\xae\xa8\x4f\xa0\x6c\xd7\x9a\x51\ \x89\x44\x24\x06\xf3\x73\xdb\x39\x8f\xd5\x24\x87\xaa\xef\x5d\x00\ \x68\x35\x44\x5c\x04\x46\x3b\x40\x9b\x4a\xb6\x37\x34\x5a\x8d\xa3\ \x02\xb1\x9c\xf3\xa4\x25\x2c\x4d\xec\xc2\xd2\x1b\x70\xa8\xba\xfc\ \x41\x02\xbf\x39\xe2\x31\x03\xf4\x40\xc9\xf6\x86\x77\xad\xc4\x52\ \x85\xef\xfc\x79\x59\x07\x80\xc9\xa6\x8c\x19\x07\x2c\xcd\x01\x02\ \xfc\x3b\x83\xc7\xc4\xc6\xcf\x2f\x0d\x8e\x52\xbb\x59\x53\x22\x7a\ \xd3\xf4\x1b\xd0\xb6\xa4\xb2\x40\x92\xde\x75\xb1\x71\x6f\x5f\x62\ \xec\xcd\xa1\xa6\x6e\xb3\xf1\x54\xa0\xb4\x7c\xf9\x2a\xf2\xd2\x4b\ \x54\x95\x24\xe4\xa6\x35\x3f\xa4\x5f\xed\x99\x61\xfa\x0d\x28\xbe\ \x65\xc6\x19\x00\xe7\x8d\xc6\x98\xe8\xfc\x94\x50\xd3\x39\xf3\xa5\ \x3a\x8f\xd2\xf2\xe5\xab\x88\xe9\x25\xc4\x41\x68\xd4\x8e\x43\xe2\ \xd8\xc5\x6c\x19\x74\x58\x13\x54\xb1\xaf\xf4\xb5\x5e\xd3\x02\x50\ \x20\x20\x01\x6c\x31\x1a\xdb\xdf\x9b\x8d\xf9\x15\x2b\x8a\x32\xa8\ \xdb\x11\x0c\x92\xef\x9f\xfd\x3f\xa3\x33\xda\xb7\xe3\x5e\x79\x2b\ \x80\x4d\x20\x74\x0c\xd8\x31\xe8\x30\x83\x7f\xee\xc9\xc1\xed\xbb\ \x17\x6e\x3b\x02\x58\x5c\x0a\x7f\xee\xf7\xe7\x44\xb3\xa2\x7f\x60\ \xe0\xe1\x2f\x7d\xf9\x83\x78\x0e\x42\xb1\x5c\x4a\x82\x4e\x08\xd2\ \xe7\x36\x35\x6c\xfb\xc8\x41\x6e\x69\x31\x92\xbc\x20\x51\xda\xd4\ \xb0\xb5\x63\xa8\x4d\xd9\xae\x35\xa3\x72\x2f\x9c\xe0\x81\xf5\xff\ \x50\x64\xb4\x0e\xf8\xd8\x5f\x56\xa8\x7b\x51\x4c\xd2\xd3\xb6\xba\ \xbb\xa0\x12\xe0\x2d\x00\x04\x00\x57\x45\x30\x43\x3e\x1d\x1c\x59\ \x08\xcd\x5d\xb0\x72\xa5\xdb\x22\x38\x41\x1e\x70\x70\x37\xe8\xa6\ \x08\x73\xcb\x56\xfc\x10\x84\x97\x61\x93\x3c\xe0\xf0\x76\xd8\x0d\ \x11\x9c\x24\x0f\x28\xe8\x07\xa8\x14\xc1\x69\xf2\x80\xa2\x86\x88\ \x0a\x11\x54\x90\x07\x14\x76\x84\x9c\x14\x41\x15\x79\x40\x71\x4b\ \x2c\x9d\x08\x95\x8f\x07\x6f\x94\x4c\xb3\xc1\x98\x40\x2c\x7b\xa5\ \xa0\x4f\xc6\x68\xd8\x1f\xda\xbc\x28\x36\x18\x43\x21\x79\xc0\x85\ \x9e\xa0\x91\x08\xd9\x37\x2f\x9c\xc8\xcc\x1b\x01\xcc\x36\x70\xe9\ \x61\xa2\xd7\x75\x21\x36\xf6\xb5\xd5\x57\xa8\x24\x0f\xb8\xd4\x14\ \xfd\x4a\x04\x12\x59\xf9\x25\x51\xcf\xd8\x49\x63\xd2\x3a\xb1\x8c\ \x26\x4e\xb4\x8c\xd6\x7b\x4e\x29\x23\x0f\x00\x9a\xd3\x01\x8d\x70\ \xe4\xe3\x83\x07\x27\x15\xdd\x76\xd4\x5b\x78\xeb\x42\xcf\xd8\x9b\ \xbc\xa6\x9c\x88\xbc\x5a\xee\x44\x92\xb1\x48\x27\xe9\xf1\xbb\x54\ \x90\x07\x00\xcb\x1d\xa1\x4c\x31\xa6\x68\xc1\x39\xb6\xfa\xc6\x11\ \x61\xd4\x75\x33\x31\x5a\xa7\x93\xc0\x56\x25\x75\xb9\xd2\x14\x0d\ \x04\x02\x82\x81\x67\x32\xf3\x26\x5f\x54\xa3\x27\x9c\xad\xe8\x2b\ \xb8\x22\x40\x38\x32\x6d\x36\x80\x8c\xb7\xcb\x04\x5e\xee\x60\x39\ \xc3\xe0\x8a\x00\xba\xa4\x39\x36\x43\x14\x55\xac\x0d\x5e\xe7\x44\ \x2d\x23\xe1\x8a\x00\x04\x79\xbd\xdd\x18\x52\x0a\xdb\x31\x8c\xe0\ \xd2\xc1\x08\x49\xbb\x11\x34\x24\x6d\xc7\x30\x82\x4b\x02\xf0\x51\ \xbb\x11\x12\x94\x65\x3b\x86\x11\x5c\x11\x80\x85\xb6\xd7\x66\x88\ \xd6\xc6\xdf\x57\x1d\x77\xa4\x98\x11\x70\x45\x80\x99\xe3\xfe\x7b\ \x00\x8c\x8c\x77\x83\xc4\xf4\xba\x93\xf5\x0c\x85\x5b\xeb\x00\xc9\ \x4c\x1b\x32\x72\x66\x79\x2c\x27\x8b\xff\xe8\x70\x49\x83\x70\xed\ \x74\xb8\xb7\xa3\xe1\xda\xe4\x59\x8b\xab\x59\xd6\x11\xff\xe2\x1f\ \xa3\x22\xed\xf5\x93\x94\x14\x05\x97\x04\x18\xd8\xd2\xf6\x9d\x6e\ \x43\x5f\xa4\xfd\x2c\xfa\xaf\xab\xa4\x04\x4b\xbd\x3b\x7e\xec\x5f\ \x52\xc6\xbb\xf3\x25\x6b\xcd\xf3\xca\x1f\x2a\x51\x51\x9b\x72\x01\ \x86\xef\xe7\xf9\x33\x19\xe9\x98\xc1\x42\xcc\x06\x61\x0f\x00\xdd\ \xc0\x25\x02\xa6\x67\x75\xaf\x36\x45\xf6\x76\x3f\x82\x7e\xb1\x26\ \xa8\x12\x41\x6d\x43\x24\x4d\x33\xa3\x6c\x4d\xb0\x30\x79\xfa\x7f\ \xbf\x84\xde\xf3\x18\x20\xe1\xb9\x66\xfa\x9c\x98\xef\xda\x0f\xf7\ \x05\x4a\x93\x83\x31\x14\x37\x5a\xd5\xb5\xc4\x4c\x76\x72\xbe\xb4\ \xab\x05\x80\xee\x4e\xaf\x37\x1c\xae\xed\xfb\x9a\x8d\x42\x11\x94\ \x7c\x02\x4e\xb7\xb1\x9a\x77\xd5\xd5\x01\xa4\xe4\x73\x70\x5c\x00\ \x55\x3d\x3c\x55\x22\x38\x2a\x80\xea\x06\xa6\x0a\x11\x1c\x13\xa0\ \xb4\x7c\xf9\x2a\xd5\x0d\x4c\xc0\x79\x11\x1c\x11\xc0\xa9\x83\x4a\ \xb3\x70\x52\x04\xdb\x02\xb8\x4d\x7e\x00\x46\x22\x2c\x5d\xea\xff\ \x46\xd7\xfb\x05\xdf\x3c\xd9\x58\x78\x57\xd7\xce\x82\x3c\x33\x71\ \x6c\x09\x30\x92\xbc\x47\xd3\xe7\xb8\x41\x7e\x00\x43\x45\x98\x5c\ \xd8\x3d\xa1\xe6\xbe\x96\x7f\x43\x88\x30\x11\xed\x47\x8e\x38\x7a\ \x6a\xf7\xf8\x87\xd2\xc5\xc8\x58\x00\x23\xf2\xbb\xeb\xfb\xaf\x9d\ \xb8\x89\xe6\x5d\x75\x75\xbe\xbc\xd8\x9a\xf5\x0b\xc3\xf0\x5d\x1d\ \x1d\xda\xe5\xbe\x8a\x81\xba\x53\x8d\xbe\x3b\x52\xf9\x67\x24\xc0\ \xe5\x42\x7e\x00\x2f\x3c\xdc\xdc\x55\x90\xd7\x6b\x34\xa4\x31\xf1\ \x8a\x54\xbe\x96\x05\xb8\xdc\xc8\xf7\x43\x4c\x4c\x31\x98\x6a\x6c\ \xf8\xc1\x88\xbf\x35\xe8\x15\x82\xe6\x80\x30\x8d\x88\x08\x24\xdb\ \xb3\xb3\xa2\x7b\x5f\x9b\xbc\xb2\x17\xb8\x5c\xc9\x03\x0c\x6e\x49\ \xb1\xa6\x6f\x49\xe5\x3b\x28\xc0\xa2\x8f\x76\x54\x11\x61\x33\xc0\ \x37\x00\x00\x33\x03\x4c\x88\x25\x72\x3b\x17\xb7\x85\x36\x9c\xfc\ \xf1\x5f\xb3\x2f\x47\xf2\x00\xe0\x9b\x7f\xf2\xc3\x53\xbb\x7d\x21\ \x06\xfb\x87\x3e\x27\xe0\x13\x4a\x26\x5f\x48\xe5\x2b\x00\x60\xf1\ \xe1\xe0\x6a\x22\x0e\x0d\x90\x1f\x06\x86\x0f\x8c\x3f\x8d\x99\x57\ \xac\x8c\xbc\x10\x1a\x88\xec\xed\xcb\xf2\xb3\x3a\xab\x89\xb8\x06\ \xa0\x16\x00\xed\x20\xd4\xf6\x25\xc5\xcc\xfc\x05\x67\x52\x5e\xe0\ \xa4\x25\xad\x3b\xa6\x4b\x8d\x0f\x22\xdd\x39\x21\x33\x22\x2f\xfe\ \xb3\x13\x9f\x76\xcd\x72\x82\xfc\x4f\x03\x7b\x6e\x4c\x7a\x3c\x35\ \x52\xd7\x97\x0a\xa1\xe5\x81\x19\x20\x1c\x64\x88\xda\x0b\xe3\x73\ \xb7\xd4\xfe\xe8\xf6\xaf\xed\x0a\x55\x80\x16\x1f\x0e\x6d\x05\xb0\ \xd2\x8c\x31\xf7\x26\xf7\x04\x6f\x5b\x32\xdf\x6e\xd2\x75\x4f\xed\ \xbb\x07\x02\x3b\x00\xbe\xca\x30\x0f\xf0\x77\xaf\xc7\xf3\xbd\xdf\ \xd4\xdc\x19\xb1\x9b\x2b\x1d\x04\x03\xf7\x98\x35\xa6\x6c\xcf\x2c\ \xbb\x09\xd7\x6d\xfa\xdb\x54\x08\x7e\xf7\x62\xe4\x01\x80\x80\x3b\ \x93\xc9\xe4\x76\xbb\xb9\xcc\x40\x10\x30\xde\x82\x7d\xae\xbf\x35\ \x98\xfe\x1e\x76\x2a\xe8\xf4\x34\x90\xfe\x2e\x37\x03\xf7\xae\x7f\ \xba\xb9\xdc\x56\x2e\x13\x10\x0c\x9c\xb6\x60\x1f\x0b\x4d\xf3\x47\ \x33\x4d\xb6\xe1\xb7\x1f\xe4\x01\xa8\x30\xed\x20\xe9\xc1\x4c\x73\ \x99\x85\x10\x84\x7d\x66\x8d\x19\xd8\x0f\x22\xce\x34\x59\x32\x9e\ \x98\x02\xb0\xb9\x1b\x22\xfd\xf9\x94\x74\x82\x87\x42\x30\xc4\xe6\ \xfe\x5c\x66\xac\xc5\x73\xb6\x92\x69\x64\xd4\x05\x4e\x01\xab\xf6\ \xd6\x21\xde\xbe\xa5\xea\x00\x01\x4f\xa6\x33\x64\xc6\xe6\x60\x71\ \x55\x93\x9d\x64\xb9\x7d\x17\x3a\x00\xc4\xd2\x1a\x0e\x42\xb6\xda\ \xc9\x67\x06\x02\x00\xde\x9a\xea\xff\x15\x18\x8f\x02\x38\x6b\x60\ \x73\x81\x19\xeb\x83\x53\x1f\x58\x67\x37\x59\x20\x50\xd9\x43\xc0\ \x3b\x66\xed\x59\x8a\x6d\x76\x73\xa6\xc3\xb0\xe5\xd7\x7d\x47\xde\ \x1b\xeb\x8d\xeb\x15\xc4\x98\x0e\x82\x46\x2c\x0f\xc5\xe1\xa9\x7f\ \xaf\xe4\xfb\x56\x26\xca\x94\x58\xf7\xeb\xbd\x37\x81\x45\x18\x40\ \x7e\x1a\xd3\xb7\x9f\xfb\x45\xa9\xf2\x49\xf0\x92\xfc\x71\x72\xfd\ \xc6\xe6\x3b\x98\x68\x27\x00\x9f\xb1\x05\xfd\x85\xb2\xe3\xd5\xcf\ \xfe\xe4\xbb\x19\xff\xe2\x98\xc5\x25\xfb\xe7\xe8\xda\xc0\xfb\xd7\ \x68\x9a\xf7\x09\x06\xdd\x0f\xa0\x08\xa0\x1e\x10\x87\x19\xf4\xca\ \xf3\x3f\xbb\x7b\x87\x9d\x5f\x1b\x2b\xf8\x3f\xea\x55\x6d\x3f\xdb\ \x28\xf6\xb3\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x66\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x01\x5c\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\xaa\ \x55\xff\xcc\x00\xff\xcc\x33\xff\xd5\x55\xff\xdb\x49\xea\xbf\x15\ \xef\xcf\x50\xf1\xb8\x1c\xf2\xc9\x51\xf2\xcc\x4d\xf0\xd1\x4d\xea\ \xb8\x15\xf2\xd0\x4a\xe8\xbb\x17\xeb\xb9\x14\xf0\xce\x4a\xf1\xd0\ \x4c\xed\xcd\x49\xed\xcf\x4b\xef\xce\x49\xeb\xb8\x18\xf0\xce\x4b\ \xea\xbc\x15\xee\xcf\x4b\xef\xcf\x4a\xef\xcd\x4b\xea\xb9\x15\xee\ \xce\x4a\xec\xb9\x15\xea\xbb\x15\xf0\xce\x4b\xf0\xcd\x4a\xee\xcf\ \x4b\xeb\xb9\x17\xec\xc4\x2b\xef\xce\x4a\xef\xcf\x4a\xec\xb9\x15\ \xef\xcd\x4a\xef\xce\x4b\xf0\xcd\x4a\xf0\xce\x4a\xee\xce\x4a\xec\ \xb9\x16\xef\xce\x4a\xef\xcd\x4a\xed\xc1\x28\xec\xbf\x22\xec\xc0\ \x28\xec\xc3\x2f\xeb\xc0\x26\xec\xbf\x20\xec\xc3\x2b\xec\xbf\x24\ \xef\xce\x4a\xeb\xbd\x1d\xed\xbd\x20\xed\xc6\x36\xee\xc6\x33\xed\ \xc4\x31\xef\xce\x4a\xec\xbc\x1c\xf0\xce\x4a\xeb\xba\x17\xeb\xbc\ \x1a\xee\xc7\x3a\xee\xc8\x3b\xee\xc9\x3d\xeb\xbc\x1a\xec\xbc\x1a\ \xec\xba\x16\xeb\xba\x18\xef\xce\x4b\xf0\xce\x49\xeb\xba\x17\xf0\ \xce\x4a\xec\xbb\x18\xef\xca\x3f\xef\xca\x42\xeb\xba\x16\xef\xce\ \x4a\xef\xce\x4a\xef\xcf\x4a\xec\xba\x17\xeb\xba\x16\xeb\xba\x16\ \xeb\xb9\x17\xee\xcb\x43\xef\xcc\x45\xef\xcd\x46\xeb\xba\x16\xef\ \xce\x4a\xef\xce\x4a\xeb\xba\x17\xef\xce\x4a\xeb\xbb\x16\xef\xce\ \x4a\xeb\xbb\x16\xef\xce\x49\xeb\xba\x16\xee\xcd\x48\xef\xce\x49\ \xeb\xba\x16\xee\xce\x4a\xef\xce\x4a\xeb\xba\x16\xef\xce\x49\xef\ \xce\x4a\xeb\xba\x16\xef\xce\x4a\xeb\xba\x16\xef\xce\x4a\xeb\xba\ \x16\xef\xce\x4a\x18\x90\x9c\x70\x00\x00\x00\x72\x74\x52\x4e\x53\ \x00\x01\x03\x05\x05\x06\x07\x0c\x10\x12\x13\x14\x21\x24\x26\x2d\ \x33\x34\x36\x38\x3a\x3f\x41\x44\x48\x4b\x4f\x52\x54\x59\x5f\x61\ \x63\x67\x6a\x71\x78\x7c\x7f\x84\x90\x93\x95\x97\xa8\xac\xac\xaf\ \xb8\xba\xbb\xbc\xbe\xbe\xbe\xc0\xc0\xc2\xc2\xc2\xc2\xc4\xc4\xc6\ \xc7\xcb\xcc\xcc\xcc\xcc\xcd\xcd\xd2\xd4\xd4\xd6\xd7\xd7\xd9\xd9\ \xd9\xda\xda\xdc\xdd\xdf\xe3\xe4\xe7\xe7\xe8\xe9\xea\xea\xed\xee\ \xee\xef\xf1\xf2\xf3\xf4\xf4\xf5\xf7\xf7\xf9\xfa\xfc\xfc\xfd\xfd\ \xfe\xfe\xdf\x50\xef\x67\x00\x00\x01\x47\x49\x44\x41\x54\x58\xc3\ \xed\xd7\x47\x53\x02\x41\x14\x04\x60\x10\x73\xce\x6b\x4e\x28\x82\ \x39\xe7\x1c\x01\x15\x10\x31\x8b\x62\xce\xa8\xc3\xff\xaf\xf2\xd8\ \xef\xb0\x5a\xbb\x3d\x97\x3d\x6c\xdf\xfb\xab\x57\xb5\x33\x53\x6f\ \x3d\x1e\x37\x0e\x48\xd3\xfe\x8d\x49\x3a\xac\x03\xa7\xca\x2c\xf7\ \x15\x96\x01\x65\x9e\x75\x9f\x26\xa0\xfa\x75\x81\x6c\xa3\x26\xa0\ \x4e\x4a\x34\x01\x35\xac\x0b\x28\x7f\xf5\xdf\xa9\xf2\x59\x00\xfe\ \x4d\xb8\x48\x13\x50\x6d\xba\x40\xa7\x0b\x38\x14\x88\xed\xd8\x48\ \xaf\x61\x18\x46\x5d\x9e\x04\x66\x73\xf6\x33\x20\x80\xec\x39\x01\ \xdc\x09\x60\x83\xe8\xe7\xd6\x04\xb0\xcc\x00\x3d\x00\x1e\x9f\x88\ \xfe\x5b\x19\x80\x05\x66\x80\x51\xf1\x19\x37\x19\xa0\x15\xc0\xd9\ \x07\xd1\xcf\x14\x02\x98\x62\x06\x18\x14\x27\x31\xce\x00\xf5\x00\ \x22\x4c\xff\xc8\x0b\x60\x86\x01\x02\xb8\x4c\xef\x17\x0c\x50\x09\ \x60\x95\xe9\xaf\x88\xeb\xbc\xc4\x00\xdd\x00\x6e\x1f\x98\x63\x5c\ \x0a\x60\x9a\x19\x60\x44\xbc\x48\x5b\x0c\xd0\x02\xe0\xf8\x93\xe8\ \x5f\x17\x00\x98\x60\x06\x08\xe1\x51\xfd\x4e\x30\x40\x2d\x80\x5d\ \xa6\x9f\xf4\x02\x98\x64\x80\x3e\x2c\x18\x2f\x97\x44\xff\xa7\x1c\ \xc0\x3c\x33\xc0\x9c\xd8\x91\x16\x19\xa0\x0b\xc0\xd5\x33\xd1\x7f\ \x2d\x06\x30\xce\x0c\x30\x24\xd6\xbc\x6d\x06\x68\x06\x70\xf8\x45\ \xf4\xd3\xf9\x00\xc6\x98\x01\x82\x62\x53\xdd\x63\x80\x1a\x01\xa4\ \x89\x7e\x54\xee\xca\xed\xa9\x8c\xdd\x1c\x34\xb8\x7f\x8a\x0e\xcb\ \x2f\x9c\xb7\xbf\x51\x8f\x7e\x89\x7a\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x0f\x0c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0f\xbf\x00\x00\x0f\xbf\ \x01\x9f\xb0\x32\xa7\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0e\x89\x49\x44\ \x41\x54\x78\x9c\xc5\x9b\x7b\x70\xdc\xd5\x75\xc7\x3f\xe7\xb7\xfb\ \xdb\xf7\xae\x9e\x96\x25\x99\xd8\x12\xb6\x2c\xf0\x83\x40\xc7\x4d\ \x43\x0a\x09\xa2\xf5\x30\xd3\x06\xa6\x33\xc0\x64\xa6\x69\x9b\x07\ \x4e\xe8\x74\xc2\xa4\xc5\x26\x64\xa0\x66\x34\x15\x34\x75\xb0\x19\ \x06\x3a\x9d\x26\x25\x4e\x68\x26\xcc\x04\x4a\x9b\x66\xe8\x1f\x0c\ \x03\xc6\x24\x1d\x9a\xe0\x40\x70\x2c\xdb\xf2\x03\x5b\xf8\xa1\xb7\ \x56\xda\xf7\xeb\xf7\x3b\xfd\x63\xb5\x42\xd2\xee\x4a\xab\x9f\x64\ \xf3\xfd\x6b\xf7\xfe\xee\x3d\xf7\x9c\xf3\xbb\xf7\xdc\x73\xcf\x39\ \x3f\xe1\x0a\x63\x4f\xef\xab\x2d\xb6\xdb\xbc\x15\x95\x6d\x02\xd7\ \x29\xb2\x59\xd0\x06\xa0\x1e\x08\xcd\x74\x4b\x00\x53\x8a\x44\x05\ \x7b\x00\xe1\xa4\x42\x7f\xde\x70\xbf\xf5\xec\x23\x9f\x1d\xbb\x92\ \xfc\xc9\x95\x20\xfa\x77\x8f\x1f\xda\x61\xa8\xfe\x39\xc8\x4e\x60\ \xeb\x0a\xe6\x51\xe0\x98\xa8\xbc\x26\x2e\xeb\x27\x4f\x3e\xfa\x47\ \xef\xae\x1e\x97\x45\xac\x9a\x02\xbe\xb5\xef\x97\xe1\x42\x3e\xf7\ \x35\xb1\x8d\xfb\x10\xdd\x32\xf7\x59\x28\xec\xa1\xb1\xc9\x47\x38\ \xe2\x21\x5c\xe7\xc5\xe7\x73\xe1\xf1\xb8\x70\x9b\x06\x0a\x58\x79\ \x9b\x5c\xce\x22\x9b\x29\x10\x9b\xce\x11\x8b\xe5\x88\x4e\x64\x48\ \xc4\x73\x0b\xa7\xe9\x07\xf9\x41\xda\xd2\x7f\xfb\x97\xde\x9e\xc4\ \x6a\xf0\xbd\x62\x05\x7c\xfb\x3b\xbf\x68\x28\x14\x0a\xdf\x54\xe4\ \x01\xd0\x46\x00\x11\xa1\x6d\x5d\x90\x6b\xd6\x47\x58\xdb\x16\x20\ \x10\x34\x1d\xd1\x4e\x26\xf3\x8c\x0e\xa5\xb8\x30\x18\x63\xf8\x72\ \x12\x55\x2d\x3d\x9a\x40\xf4\x19\xab\x20\xcf\x3c\xdd\xdb\x33\xb5\ \x12\xfe\x9d\x2b\x40\x55\xf6\x3c\x7e\xf8\xcb\xa0\xfb\x14\xd6\x00\ \x04\x82\x26\x9b\xaf\x6f\xa0\xe3\xda\x3a\xbc\x3e\xf7\x4a\xf8\x2a\ \x43\x26\x53\x60\xf0\x83\x69\x4e\x9d\x98\x24\x95\x2c\x94\x9a\x47\ \x54\xf5\x5b\x4f\xed\xed\xf9\x31\x22\xba\xd8\xf8\x6a\x70\xa4\x80\ \x87\xfa\x5e\xdf\x68\x63\xfc\x08\xb8\x05\x8a\x4b\x7c\xcb\xf6\x66\ \x36\x6c\x8c\x60\xc8\x15\x31\x2b\xb3\xb0\x6d\x65\xf0\x83\x69\xfa\ \x8f\x8e\x93\x4c\xe4\x67\x5a\xe5\x2d\x41\xbe\xbc\x7f\xef\xe7\xce\ \x2d\x97\xde\xb2\xb9\xdd\xdd\x77\xe8\xcf\x80\x83\x40\x83\x21\x42\ \xfb\xba\x66\xb6\xdd\xb0\x86\xba\x66\x47\x2f\xc0\x31\x2c\x4b\x39\ \x79\x6c\x82\xe3\xc7\xc6\xb1\x2d\x05\x24\x26\x6a\x7f\x6d\xff\x63\ \xb7\xbf\xb8\x1c\x3a\xb5\x2b\x40\x55\xf6\xf4\xbd\xf9\x5d\x15\xf6\ \x00\x84\xc3\x7e\xb6\x6e\xdd\x40\xc0\xef\x45\x50\x1a\xda\x0a\xb8\ \xdc\x57\x57\x09\x00\xb1\x58\x8e\xb7\x0f\x5f\x62\x2a\x9a\x01\x50\ \x94\x7d\x07\xf6\xde\xf6\x48\xad\x5b\xa2\x26\x05\x7c\xfd\x7b\x47\ \xcc\xc8\x68\xfc\xa0\xc2\x5f\x00\x5c\xb3\xae\x99\x4d\x5d\x6d\x18\ \x62\xcc\xf6\xf1\x06\x6c\x22\x4d\x85\xaa\x34\xae\x24\x6c\x4b\x79\ \xf7\xc8\x08\x67\x07\xa2\xa5\xa6\xe7\xc3\x16\xbb\x7a\x7b\x7b\x96\ \x64\x68\x49\x05\x7c\xfd\x7b\x47\xcc\xf0\x48\xfc\x65\x84\x3b\x11\ \xe8\xee\x5a\xc7\xba\x75\xcd\x15\xfb\xd6\xaf\xcd\x63\x7a\xae\xfe\ \x2a\x28\xe1\xf4\xc9\x28\xef\xbd\x33\x4c\xf1\xb0\x90\x9f\x87\x2d\ \xbd\x7b\x29\x25\x18\x8b\x3d\x44\x55\x22\xa3\xf1\x83\x08\x77\x8a\ \x61\xb0\x6d\xcb\x86\xaa\xc2\x03\x24\xa7\x5d\x4e\xf8\x5e\x35\x74\ \x5d\xd7\xc0\xa7\x6f\x59\x87\x61\x08\xa0\x77\xc5\x5d\x3c\x87\xea\ \xa2\x2f\x79\x51\x8e\xf7\xb8\x6e\x7b\x52\x85\xbf\x46\x60\xdb\x96\ \xf5\xb4\xb4\xd4\x2f\xca\x80\x5d\x10\x4c\x8f\xe2\x32\x3f\xbe\x55\ \x50\xd7\xe0\x25\x1c\xf6\x70\xf1\x42\x1c\xe0\xc6\xcf\x1c\x3e\xef\ \x7d\xfb\xd0\xf3\xaf\x57\xeb\x5f\x55\x3b\xbb\xfb\x0e\xdd\x03\xbc\ \x04\xd0\xd5\xd5\xce\x27\xae\x59\x53\x13\x03\x2e\x53\x69\x5c\x9b\ \xbf\x42\x4e\x76\xed\x38\x33\x10\xe5\x37\xbf\x1a\x06\x50\x11\xb9\ \x7b\xff\xdf\xdf\xf6\x5f\x95\xfa\x55\xdc\x02\x0f\xf5\xbd\xbe\x11\ \x78\x0e\x8a\x06\xaf\x56\xe1\x01\xac\xbc\x90\x49\x2d\xbe\xb3\xae\ \x06\x36\x75\x37\xb0\x71\x73\x03\x80\xa8\xea\xc1\x3d\x7d\x87\x3b\ \x2b\xf5\x2b\xe7\x54\x55\x66\x9c\x9c\xba\x70\xd8\xcf\xa6\xae\xb6\ \x65\x4f\x9e\x9c\x76\xa3\xf6\xb2\x87\xad\x3a\x7e\xef\xf7\xd7\x52\ \xdf\xe0\x03\xa8\x57\xec\x83\x95\xec\x41\x99\x0d\xd8\xe3\xee\xf9\ \x0a\xf0\x80\x21\x06\x37\xdd\xb8\x11\x8f\x67\xf9\x7e\xbc\x2a\x88\ \x01\xa6\xf7\xe3\xb3\x05\x00\x62\x08\x2d\xad\x41\x3e\x38\x3d\x85\ \x2a\x1d\x37\x1f\x3e\x7f\xe6\xed\x43\xcf\x1f\x9d\xd7\x67\xee\x9f\ \x99\x8b\xcd\x80\xc2\x9a\x8e\x8e\x56\xae\xed\x5c\xbb\x82\xc9\xa1\ \xb1\x35\x87\x31\xa3\x62\x97\x21\xd4\xf9\xbc\x44\x7c\x1e\x02\x1e\ \x37\x5e\xb7\x0b\xd7\x8c\x1f\x61\xa9\x4d\xb6\x60\x91\xca\x15\x88\ \x65\x72\x4c\x67\xb2\x58\xf6\xea\x29\xef\x77\xbf\x1d\xe3\xf8\xd1\ \x71\x80\x11\xb7\x59\xe8\xde\xf7\xed\x9d\xd3\xa5\x67\xf3\x6e\x2c\ \xc5\x5b\x1d\x6b\xfc\x01\x2f\x1d\x1b\x5a\x56\x34\xa9\xda\x90\x8a\ \xb9\x68\x5e\x03\x6d\x91\x20\x8d\x41\x5f\xd5\x7b\x82\x5b\x0c\xdc\ \x1e\x83\xa0\xc7\x64\x4d\xc8\x8f\xad\xca\x44\x32\xc3\x70\x2c\x49\ \xa6\x60\xad\x88\x0f\x80\x2d\xdb\x9a\x18\x3c\x3b\x4d\x32\x99\x5f\ \x9b\xcf\xbb\xbf\x01\x3c\x51\x7a\x36\xcb\xd1\x9e\x27\x5f\x0d\x6a\ \xc6\x73\x1e\x68\xfe\xd4\xcd\xed\xac\x5d\xdb\x48\x2a\xe6\x42\x1d\ \xbe\x08\x97\x21\x6c\xde\xe0\xa3\xa3\xcd\x87\xd3\xfb\x91\x2a\x8c\ \xc4\x93\x5c\x9a\x4e\x62\x3b\x65\x64\x06\x67\x4f\x45\x39\xf2\x7f\ \xc3\x00\x13\x69\x8b\x8e\x52\x3c\x61\xd6\x08\xda\x59\xf3\x7e\xa0\ \x39\x10\x34\xd9\xb0\x29\x42\x20\x62\xd1\xd8\x96\xc3\x1f\xb2\x97\ \x7d\xa4\x05\xfd\x06\x9f\xf9\x64\x98\xce\x76\xe7\xc2\x03\x88\x40\ \x6b\x24\x48\x77\x4b\x03\xa6\x6b\x65\x27\x4b\xe7\xa6\x7a\xfc\x41\ \x37\x40\x53\xc0\xcd\xae\x52\xfb\x2c\x55\xb1\x8d\xfb\x00\x36\x5f\ \xdf\x30\xbb\x54\x0d\x17\x84\x1a\x0a\x34\xb6\xe6\xf1\x06\x6a\x33\ \xeb\x91\xa0\x8b\x9b\xb7\x47\x08\x07\x2a\xfb\x58\x0a\xe4\xf2\x79\ \x52\x99\x2c\x89\x54\x9a\x44\x2a\x4d\x2a\x93\x25\x97\xcf\x57\xec\ \x0f\x10\xf2\x9a\x6c\x69\x6d\x24\x60\x3a\x8f\x31\x18\x86\xb0\xf9\ \xfa\xc6\x22\x0f\xca\x57\x4b\xed\x02\xa5\x18\x1e\xef\x88\x08\x77\ \xdd\xbb\x09\x5f\x95\x60\x46\x3e\x6b\x90\x98\x32\x28\xe4\x2a\xbf\ \x8d\xa0\xdf\xe0\xe6\xed\x11\x3c\x66\xf9\x6b\xb7\x2c\x9b\x44\x3a\ \x4d\x26\x97\x9b\x1b\xd9\x99\xcf\xa4\x08\x5e\x8f\x87\x50\xc0\x8f\ \xcb\x28\x9f\x23\x67\x59\x1c\x1f\x9e\x24\x6f\x39\x3b\x63\x33\x99\ \x02\x3f\x7f\xe9\x0c\xaa\x8a\x61\x70\xd3\x93\x8f\xf6\xfc\xd6\x00\ \x28\x06\x30\xa1\x6d\x5d\xb0\xaa\xf0\x00\xa6\xd7\xa6\x61\x6d\x81\ \x70\x63\xf9\xd5\xd7\x30\x84\x9b\xba\x43\x15\x85\x8f\xa7\x52\x8c\ \x4f\x4d\x91\xce\x66\xab\x0a\x0f\x60\xab\x92\xce\x66\x19\x8f\x4e\ \x11\x4f\xa5\xcb\x9e\x7b\x5c\x2e\xba\xd6\xd4\x3b\x0e\xba\xf8\x7c\ \x6e\x5a\xdb\x02\xc5\xb9\xec\xa2\xcc\x33\x6a\x96\x9d\x00\xd7\xac\ \x8f\xd4\x46\x28\x68\xd3\xd0\x5a\x20\x58\x5f\xc0\x30\x8a\x02\x75\ \xaf\xf7\x11\x09\xce\x5f\xf6\xaa\x4a\x34\x16\x27\x99\xce\xb0\x1c\ \x13\xa6\x40\x32\x9d\x26\x1a\x8b\x97\x29\x2c\xe8\x31\x69\x8b\x04\ \x97\x41\x6d\x3e\x3e\xd1\x51\x92\xb1\x28\xb3\xec\xe9\x7d\xb5\x45\ \x5d\x9e\x61\x40\x3e\x7f\xf7\x26\x82\xcb\x0c\x60\xda\x36\x90\xf5\ \xf0\xa9\xcd\x0d\x65\x06\x2f\x1a\x8f\x93\xcd\x55\xdf\xdb\xb5\xc0\ \x6b\x9a\x34\x44\xc2\xf3\xe7\x54\xe5\xe8\xe5\x71\x47\x5b\x21\x99\ \xcc\xf3\xca\xcb\x67\x00\x14\x8b\x16\xc3\x76\x9b\xb7\x02\x12\x0a\ \x7b\x96\x2d\x3c\x80\x61\xc0\xc6\x75\xe5\xd6\x3e\x9e\x4a\x2d\x25\ \x7c\x02\x38\x06\xf4\xcf\xfc\xae\x88\x6c\x3e\x5f\xb6\x1d\x0c\x11\ \xda\xeb\x42\x55\x46\x2c\x8e\x60\xd0\x24\x18\x32\x01\x44\xdc\x72\ \xab\x81\xca\x36\x80\xc6\x26\x9f\x23\x82\x2e\x43\x68\x0c\xce\x1f\ \x6b\x59\x36\xa9\x74\xa6\xda\x90\x13\x8a\xde\x9d\x88\x36\x36\xb7\ \x35\x37\x6d\x6f\x6b\x6e\xda\x96\x88\x36\x36\xab\x70\x0f\x70\xb2\ \xd2\x80\x54\x26\x8d\x65\xcf\x7f\xdb\xcd\x8b\x38\x56\x4b\xa1\x24\ \xab\xa2\x5b\x0d\x41\xbb\x01\xc2\x11\xaf\x23\x62\x75\x3e\x6f\x19\ \x23\x89\x74\xba\xca\x9e\xd7\x57\x34\x97\xdd\xd1\xde\xdc\xfc\x9f\ \x5d\x5d\x92\x2d\xb5\x76\x75\x49\xb6\xbd\xa9\xe9\x65\x29\xe4\x77\ \x20\xfc\x4f\xd9\x28\x85\x44\x85\x55\x50\xef\x77\xc6\x73\xb8\xae\ \x38\x4e\x94\x6e\x03\x64\x33\x40\xa4\xce\x59\xf2\x22\xe2\xf3\xcc\ \xfb\xaf\x40\x26\x57\x96\xd1\x01\x38\xae\xb9\xdc\x17\xda\xdb\xdb\ \x53\xd5\x68\xb5\xb6\xb6\x26\x25\x9f\xff\x02\x15\x56\x42\xb6\x02\ \xcd\x85\x73\xd7\x8a\x70\xc4\x53\xe2\xb5\xdb\x00\x9a\x01\x7c\x7e\ \x67\x0a\x08\x78\xe6\x1f\x9b\xf9\x7c\xbe\xe2\x51\xa7\xe8\xde\xc5\ \x84\x2f\xa1\xb5\xb5\x35\x89\xb0\x77\x61\xbb\xad\x5a\xe6\x2c\xf9\ \x1d\x3a\x46\x7e\xff\xec\xb8\x66\x03\x24\x0c\xe0\x36\x9d\xb9\x9a\ \x5e\xf7\xfc\xa3\xaf\x50\xd9\x32\x27\x93\xd1\xa6\xb2\xa5\x5d\x0d\ \x99\x58\xec\x15\xa0\x4c\x59\x0b\x69\x2f\x9c\xbb\x56\xcc\x91\x35\ \x6c\x30\x93\xa2\x76\xaa\x00\xd7\x82\xfd\x6f\xdb\x15\x15\xf0\xc1\ \xdc\x3d\xbf\x14\x3a\x3b\x3b\x33\x40\x59\x96\x67\x21\x6d\xb7\xe1\ \xcc\x08\x9a\xe6\xac\xe2\xc2\x57\x2b\x76\xe5\x84\xd3\xab\x12\x55\ \x34\x98\x39\x83\x0b\x79\x67\xfe\xb5\xa5\x0b\x5d\xe2\x8a\x3a\xed\ \x3c\x7d\x5a\x6b\x36\xd9\xe7\xce\x9d\xf3\x01\x1d\x0b\xdb\x17\xd2\ \x2e\x38\x0c\x9a\xe4\xf3\xb3\x31\x86\xb8\x01\x1a\x07\xe7\x0a\xc8\ \x2e\x08\x58\xb8\x2b\x5f\x5b\x83\xc1\xc6\xc9\xcf\xd7\x4a\xd3\x17\ \x89\xdc\x09\x04\x16\xb6\x2f\xa4\xbd\x70\xee\x5a\x31\x47\xd6\xb8\ \x01\x8c\x03\xa4\xd3\xce\x5c\xd6\x54\x6e\x7e\xe2\xc5\x63\x9a\x15\ \x1d\x14\x51\x1e\x1f\x1e\x1e\x5e\xd2\x89\x1f\x1d\x1d\x0d\xa1\xf4\ \x2d\x6c\x37\x44\xf0\x98\xf3\x4f\xaa\x74\xde\x59\x2a\x2e\x9d\x9e\ \x1d\x37\x6e\x80\x9e\x02\x88\x4f\x3b\x53\x40\x2c\x53\x7e\x3e\x7b\ \x3d\x15\xcf\xe7\xeb\xd4\x34\x7f\xba\x98\x12\x46\x47\x47\x43\x96\ \xcb\xf5\x53\xa0\xbb\x16\x9a\x95\xe6\xae\x05\xf1\x58\x71\x9c\xc0\ \x80\xa1\xc8\x40\xb1\xb1\x66\x23\x3d\x0f\xd3\x99\x6c\x59\xb8\x2a\ \x14\xf0\x57\xb6\x60\xca\x9f\xaa\xdb\x3c\x32\x34\x31\x71\xcf\xcc\ \x3e\x07\x8a\x7b\x7e\x68\x62\xe2\x5e\xcb\x70\x1d\x41\xf9\x93\x85\ \xc3\x44\x8a\x34\xe7\xc2\x56\x65\x2a\xed\x8c\xe7\xf8\x74\x71\x9c\ \x0a\x03\x6e\x44\x8f\xa1\xc2\xe4\x44\x55\xdf\x7d\x51\x58\x76\x31\ \x80\xb9\x26\xf4\x11\x83\x2e\xc3\x20\xe0\xf7\x93\x4c\x97\xdf\xe9\ \x81\xeb\x50\x5e\xf2\x85\x23\xa9\xa1\xf1\x89\xd2\x51\xd7\x89\x96\ \xef\xf9\x12\x82\xbe\xf2\x00\xc9\x44\x32\xe3\x38\x4e\x58\x92\x55\ \x90\x7e\x23\x6f\xb8\xdf\x02\x34\x11\xcf\xcd\xa9\xb8\x58\x1e\x86\ \x63\xc9\xb2\xe0\x69\x38\xe0\xc7\xbb\x78\x4e\x21\x40\xb1\x82\x6c\ \x2b\x15\x0c\x5e\x09\x5e\xd3\x2c\x7b\xfb\xaa\xca\x50\x2c\xe9\x88\ \xd7\x8f\xe4\x54\x5b\x0b\xfa\x0b\x63\xa6\x0e\xef\x18\xc0\xe8\xf0\ \x92\x9e\x6a\x45\x64\x0a\x16\x23\xf1\x72\x86\xea\x43\x21\xbc\xa6\ \x33\x17\x1b\xc0\xeb\x31\xa9\x0f\x97\x5f\x7b\xcf\x5d\xca\x32\x36\ \x22\x58\xd6\xf2\x5d\x85\x8f\x64\x94\xf7\x0f\xf4\xf6\x8c\x1b\x00\ \xa2\xf2\x1a\xc0\x85\xc1\x98\x63\x66\x2f\x4d\x27\x49\x64\xe7\xaf\ \x20\x11\xa1\x21\x12\x26\xe8\xaf\x62\x13\xaa\x40\x04\x42\x7e\x3f\ \x0d\xe1\x30\xb2\xe0\x44\x89\xc6\x0b\x9c\xba\x90\x26\x9b\x32\x88\ \x0e\x99\x24\xa7\x97\x17\xba\xbf\xf8\x61\xbc\xf8\x63\x46\x66\x03\ \x40\xb1\x5f\x00\x18\xbe\x9c\x24\x93\x76\x76\xb4\xd8\xaa\x9c\x19\ \x9f\x22\x67\x95\x9f\xcd\xe1\x80\x9f\xe6\x86\x7a\xfc\xde\xf2\xab\ \xf3\x5c\x18\x22\xf8\xbd\x5e\x9a\xeb\xeb\xcb\x96\x3d\x40\x26\x67\ \xf3\xde\xc9\x24\x25\x8f\x58\xb5\x98\x7c\x99\x1c\x32\x49\x27\x96\ \xbe\x17\x64\x32\x05\x86\x2f\x17\x57\xaa\xb8\x0a\x3f\x81\x39\xee\ \xe6\xee\xbe\x43\xbf\x03\xb6\xdd\xb8\xa3\x85\xee\x2d\x4d\x4b\x12\ \xab\x86\x80\xe9\xa6\xab\xa5\x1e\x8f\xab\x3a\x43\xb9\x7c\x9e\x82\ \x65\xcf\xfa\xf6\x86\x61\xe0\x76\x19\x65\xe7\xfc\x3c\xe6\xb3\x36\ \xef\x1c\x4f\x10\x4f\x55\x77\x7e\x5c\xa6\x12\xac\xb3\xf0\xfa\x2b\ \x3b\x75\x27\xfb\x27\x79\xff\x37\x23\x80\x1c\x3d\xb0\xf7\xb6\x4f\ \xc2\xbc\xec\xb0\x1c\x04\x38\x75\x62\x12\x7b\x05\x79\xb9\x54\xbe\ \x40\xff\xd0\x24\xf1\x6c\xf5\x33\xda\x63\x9a\x04\x7c\x5e\x42\x01\ \x3f\xa1\x80\x9f\x80\xcf\xbb\xa8\xf0\xd1\x78\x81\xff\x3d\x1a\x5f\ \x54\x78\x28\xa6\xe6\x63\xe3\x6e\xa2\x23\x26\xf9\xcc\xfc\x53\xc3\ \xb2\x95\x53\x27\x26\x67\xfe\xe9\xc1\x52\xfb\x47\x89\x11\x5f\xf6\ \xfb\xc0\x78\x2a\x59\x2c\x48\x5c\x09\x0a\xb6\xcd\xc0\xe8\x14\x97\ \x57\x98\xd2\xb2\x15\xce\x5e\xcc\xf0\xab\x63\x71\xb2\xb9\xda\x5d\ \xf5\x42\x4e\x98\x1a\x73\x33\x3d\x66\x52\xc8\x17\x17\xf9\xf9\xd3\ \x53\xa4\x53\x79\x28\xa6\xc6\x7e\x50\xea\x3b\xab\x80\xfd\x0f\xdd\ \x91\x54\xe4\x19\x80\xfe\xa3\xe3\x58\xd6\xca\x72\x71\xaa\xca\xa5\ \xe9\x04\x47\x2f\x8f\x33\x9a\x48\x2f\x4b\x11\xb6\x2a\x63\x89\x34\ \xbf\x1e\x88\x32\x30\x98\xa6\xf2\x0d\x7b\x69\xe4\x32\xc2\xd4\xb0\ \xc9\xd4\x98\xc1\xf1\x63\x13\x00\x08\x72\x60\x6e\x9d\xf1\xbc\x90\ \x8a\x6d\xe9\xb3\x2e\x97\x7c\x23\x99\xc8\xb7\x1c\x3f\x3a\xce\xf6\ \x9b\x6a\xaf\x0c\xa9\x86\xbc\x65\x33\x38\x19\xe3\x42\x34\x4e\xbd\ \xff\xa3\xf4\xb8\xc7\xe5\x9a\xbd\xcf\x17\x6c\x25\x67\x59\x24\x73\ \x05\xe2\x99\x1c\x53\xe9\xa2\x77\x29\x5e\x41\xc4\x74\x9c\xa0\x85\ \x62\x88\xee\x64\xff\x18\xa9\x64\x1e\x60\xc8\xf0\xb8\xff\x79\xee\ \xf3\x32\x93\xfc\xe0\x3f\xbc\xf1\x57\x22\xf2\xbc\x61\x08\x77\xdc\ \x75\x2d\x91\x88\xb3\xb8\xdb\x6a\x21\x15\x73\xad\xa8\xfa\x2c\x99\ \xca\xf0\xeb\x77\x4e\xa3\xb6\x8d\xa8\x7e\x71\xff\x63\xb7\xbf\x30\ \xf7\x79\xd9\xdd\xf5\xa9\xbd\x3d\x3f\x06\x79\xcb\xb6\x95\xb7\x0f\ \x5f\x9a\x29\x43\xfd\xf8\xe0\x0f\x5b\x18\x2e\x67\x3c\xd8\xb6\xd2\ \xdf\x3f\x88\xda\x36\x20\x6f\x2c\x14\x1e\x2a\xd5\x08\x89\xa8\xdb\ \xca\xff\x25\xc8\xe4\x54\x34\xc3\xbb\x47\x46\x1c\x4d\xbe\x5a\x10\ \x81\x60\x9d\x33\x23\x70\xea\xf4\x45\x12\x89\x0c\x40\xd4\xb2\xf4\ \xbe\x4a\x7d\x2a\x46\x2f\xf6\xf5\xee\xfc\x50\xd1\x2f\x01\x7a\x76\ \x20\x3a\xe7\xf8\xf8\x78\xe0\x0d\x5a\xb8\x97\x59\x7b\x78\xf1\xd2\ \x38\x97\x2f\x4f\x42\xd1\x0c\x7c\xf5\xe9\xde\x9e\xf3\x95\xfa\x55\ \x8d\x09\x3e\xb5\xb7\xe7\x15\x94\x7d\x00\xef\x1d\x19\xe1\xc3\x73\ \xce\xdd\xe4\x95\x42\x80\x60\x7d\xed\xd1\x9f\x91\x91\x28\xa7\x4e\ \x5f\x2a\xfe\x51\x9e\x38\xb0\xb7\xe7\x67\x8b\xd1\xae\x0e\x55\xd9\ \xfd\xf8\x9b\x3f\x04\xbe\x64\x18\xc2\x1f\xfc\x61\x3b\xeb\x3b\x6b\ \xcb\x20\x5f\x09\x4c\x8f\x99\xe4\x32\x8b\xb3\x3c\x32\x12\xe5\xc4\ \x89\x0b\xc5\x63\x57\xe4\xe0\x81\x47\x3f\xb7\x6b\xb1\xca\xf1\xc5\ \xa3\xc2\x22\x1a\xb6\xd8\xa5\xca\x7f\xdb\xb6\xf2\xf6\x2f\x2f\x71\ \xfa\x64\x74\xd1\x21\x57\x12\xc1\x3a\x6b\xd1\x37\x76\xe1\xe2\x18\ \xfd\x27\x3e\x2c\xf9\x1c\x3f\x0b\x17\xf4\xfe\xa5\xca\xe6\x6b\xba\ \xa4\xdd\xfb\xe2\x8b\xae\xf5\xa7\xd6\xfc\x2b\x5a\xac\xad\xe9\xb8\ \xb6\x8e\x1d\x9f\x6e\xc5\xe5\xbe\xfa\x15\xa1\xb1\x09\x37\xd9\x05\ \x95\xa8\xb6\xad\x9c\x39\x3b\xc4\xc5\x8b\xc5\x2f\xec\x04\xf9\xf7\ \x58\x4b\x68\xd7\xf7\xef\xdf\xb1\x64\x80\x63\x59\x1f\x4c\xec\xee\ \x7b\xf3\x1f\x11\x1e\x06\xa4\xbe\xc1\xc7\xcd\x9f\x5d\x47\xa4\xee\ \xea\xfa\x09\xb6\x25\x4c\x0e\xb9\x67\x8b\x3e\x93\xa9\x0c\xfd\xfd\ \x83\x25\x6b\xaf\xc5\x3d\x7f\xdb\x63\xab\xfa\xc1\xc4\x5c\x3c\xd8\ \xf7\xc6\x5d\x82\xf1\x43\xd0\x46\x43\x60\x63\x77\x23\xdb\x6f\x5a\ \x83\xe9\x30\xb3\xe4\x04\x89\x29\x37\xc9\x29\x18\xbc\x30\xc6\xe0\ \xf9\x51\xec\x62\x5d\xee\x34\xb0\xeb\xc0\xde\x9e\xff\x58\x0e\x2d\ \x47\xd9\x97\xbf\xed\x3d\xd4\xe1\x76\xf1\x23\x85\xcf\x41\xb1\xe8\ \x60\xcb\x0d\xcd\x74\x6c\xac\x9b\xa9\xd5\xbf\x72\xb0\x6c\xe5\xdc\ \xe9\x69\x8e\xbd\x3f\x41\x76\x36\x2a\x2c\x6f\xb8\xad\xfc\x57\xf6\ \xf5\xee\xfc\x70\xb9\xf4\x56\xf4\xd9\xdc\x83\x7d\x6f\x7e\x51\x84\ \x27\x81\x56\x00\x7f\xd0\xcd\xe6\xeb\x1b\xe9\xe8\xac\xc3\xe7\x5f\ \xdd\xcf\xe6\xd2\xe9\x02\x83\x1f\xc4\x38\x75\x62\xb2\x74\xab\x03\ \x18\x12\xd5\x3d\x95\x3c\xbc\x5a\xb1\xe2\xd7\xf5\xf0\x3f\xbd\x56\ \x57\x28\xb8\x1f\x40\xf9\x26\x33\xa9\x76\x11\xa1\xad\x3d\xc8\x35\ \x1b\xc2\xb4\xb4\x06\x4b\x25\x29\xcb\x46\x22\x9e\x63\x74\x38\xc5\ \xc5\xc1\x18\xc3\x43\xa9\xd9\xb4\xbb\xc0\x98\x8a\x3e\xed\x32\x3d\ \xcf\x7e\xf7\xe1\x5b\xe2\x2b\xe1\x7f\xd5\xd6\xeb\xdf\xf4\x1e\x0a\ \x05\xdc\xec\x9a\x29\x42\xdc\x3e\xf7\x59\x30\x64\x16\x3f\x9d\xad\ \xf3\x12\x8e\x78\xf0\xfb\xdd\x98\x33\x9f\xce\x02\x14\x72\x36\xf9\ \xbc\x45\x3a\x5d\x20\x1e\xcb\x11\x9f\xce\x32\x39\x91\xa9\x10\xa5\ \x96\xa3\xa0\x07\xc5\x97\x7b\x6e\xff\x43\x77\x38\x0b\x0b\x2f\xa4\ \xb8\x1a\x44\x16\xe2\xa1\x27\x0e\xdd\x58\xac\xc3\x93\x9d\xa0\x37\ \x14\x6b\xc7\x9d\x40\x6d\x90\xf7\x51\x79\x4d\xb1\x5f\x78\xea\xb1\ \xdb\xdf\x5f\x5d\x4e\xaf\x42\x0a\x7a\x77\xef\xa1\x66\x71\xcb\xad\ \x8a\x6e\x55\x95\xeb\x0d\x74\xb3\x8a\x34\xa2\x0b\x3e\x9f\x17\xa6\ \x44\x75\x52\x61\x00\xe1\xa4\x20\xfd\xa6\x51\x78\xeb\x3b\x8f\xfc\ \xf1\xc4\x95\xe4\xef\xff\x01\x50\x26\x14\x94\xa4\xec\x62\x0b\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x59\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x00\xc3\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x80\x80\ \x80\xaa\xaa\xaa\x99\x99\x99\x92\x92\x92\x9f\x9f\x9f\x99\x99\x99\ \x9d\x9d\x9d\x9f\x9f\x9f\xa5\xa5\xa5\x9e\x9e\x9e\x9f\x9f\x9f\x9d\ \x9d\x9d\x9e\x9e\x9e\xa2\xa2\xa2\xa2\xa2\xa2\x9f\x9f\x9f\xa2\xa2\ \xa2\x9f\x9f\x9f\x9e\x9e\x9e\xa1\xa1\xa1\x9e\x9e\x9e\xa2\xa2\xa2\ \x9f\x9f\x9f\x9f\x9f\x9f\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\ \xa1\xa1\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa1\xa1\xa1\xa0\xa0\ \xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa1\xa1\xa1\ \xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\x36\x82\x62\x12\x00\ \x00\x00\x40\x74\x52\x4e\x53\x00\x01\x02\x03\x05\x07\x08\x0a\x0d\ \x10\x11\x15\x18\x1a\x1d\x1e\x21\x25\x2c\x2d\x32\x36\x3a\x3f\x40\ \x48\x4e\x58\x5e\x6f\x71\x87\x88\x8a\x93\x95\x9c\x9d\xa8\xad\xae\ \xb3\xbd\xc3\xc4\xcb\xcf\xd2\xd6\xd7\xdb\xde\xe5\xe8\xeb\xed\xee\ \xf0\xf1\xf4\xf6\xf9\xfb\xfe\x3e\xfa\xd4\x5c\x00\x00\x01\x05\x49\ \x44\x41\x54\x58\xc3\xed\x97\xc9\x4e\x02\x51\x10\x45\x99\x07\x41\ \x44\x10\x91\x41\xa1\x01\x19\x64\x86\x66\x54\xa0\xfe\xff\xab\x5c\ \x74\x6d\xbc\xa1\x93\x9b\x54\x2f\xc0\xf4\x59\x9e\xdc\xa4\xa7\xfb\ \xde\xab\x8e\x44\x42\xfe\x3f\xa9\xce\x61\xe7\x24\x78\x8f\x3c\x4c\ \x44\x44\x5a\xb4\x47\x1e\xe7\x22\x22\xe2\xb2\x1e\x79\x5e\xcb\xd5\ \xa0\x9f\x47\x5e\x36\x5e\x0e\x6f\xd5\xcf\x23\x6f\x47\xcd\xf5\x13\ \x94\x47\xea\x3f\x9a\xeb\xc6\x28\x8f\x34\xcf\x9a\x6b\x73\x1e\x79\ \xbf\x78\xb1\xcb\x07\xe7\x81\xa8\xa3\x97\x39\x35\x28\x8f\xc4\x3f\ \x35\xf7\x5d\xa3\x3c\x92\x1c\x68\x6e\xff\x4a\x79\x24\x3b\xd6\x9c\ \x5b\xa6\x3c\x92\x9f\x69\x6e\xf9\x44\x79\xa4\xb8\xd2\xdc\x34\x47\ \x79\xa4\xe4\x6a\xee\x2b\x43\x79\xa4\x7a\xd0\xdc\x30\x45\xf9\xb0\ \xbe\x7f\x6b\xda\xf3\xa9\x6f\x8f\xab\x6f\x7a\xa4\xb9\x6d\x85\xf2\ \x41\xd7\x57\x77\x59\x91\x45\x81\xf2\x81\xf7\xdf\xfe\x08\xf6\x97\ \x68\xff\x8c\xf6\x22\xd9\xab\x1c\xc0\x62\xb2\x2f\x67\xfb\x86\x62\ \xdf\xd2\xec\x9b\xea\x6d\xd4\xda\x7a\xb4\xd9\x0f\xd7\xb0\xd6\x81\ \x8d\x79\xf6\x41\xd3\x3e\xea\xda\x87\x6d\xfb\xb8\x6f\xff\xe1\x08\ \xb9\x13\x7e\x01\xc4\x85\xd1\xd1\xb9\x43\x4f\xd3\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x14\x74\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x10\x04\x00\x00\x10\x04\ \x01\x6e\x60\xae\x08\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x13\xf1\x49\x44\ \x41\x54\x78\x9c\xbd\x9b\x79\x98\x14\xd5\xb5\xc0\x7f\xa7\x7a\x99\ \x85\x19\x96\x61\x5f\x14\x17\x16\x11\x88\x0b\x88\x71\xc1\x0c\xc6\ \x2d\x26\x10\x71\xa6\x5a\x14\xf3\xc5\xf7\xe5\xb9\xfb\x34\x9a\xcf\ \x35\x89\x4c\x5c\x82\x26\x51\x8c\x46\xe3\xcb\x17\x5f\xa2\x3e\x03\ \x4c\xf5\xa0\xc2\x4b\x30\x89\x31\x2e\x80\x0b\x20\x62\x04\x95\xa0\ \xa0\x2c\xb2\x0e\xc3\x3a\x4b\x77\xd7\x79\x7f\xdc\xaa\x9e\xae\xae\ \x1a\x76\x3d\xff\x54\xf5\x3d\x77\x39\xe7\xd4\xd9\xee\xb9\xb7\x85\ \x2f\x19\x74\xc2\x84\x4a\x4a\x4b\xc7\xa2\x3a\x1a\x18\x0a\x0c\x06\ \x7a\x03\x95\x40\x67\x40\x81\x9d\x40\x13\xb0\x16\x91\x95\xb8\xee\ \xfb\xc0\x62\xaa\xaa\xde\x92\xdf\xfd\x2e\xf3\x65\xd2\x27\x5f\xc6\ \xa4\x6a\xdb\x7d\x10\xb9\x14\xd5\x14\x30\x1a\x88\x1f\xe4\x54\xbb\ \x80\x57\x50\xad\x47\xe4\x45\x71\x9c\x5d\x87\x8f\x4a\x03\x87\x55\ \x00\x5a\x5b\x3b\x16\x91\x5b\x81\x0b\x81\x58\x01\x6a\x3b\x30\x1f\ \xd5\xe5\x58\xd6\x0a\x5c\xf7\x33\x2c\x6b\x37\xaa\x2d\x1e\x3e\x09\ \xf4\x44\x75\x20\x30\x12\x91\xd3\x81\x61\x80\x55\x30\xc7\x4e\xe0\ \x69\xe0\xd7\xe2\x38\x2b\x0f\x17\xcd\x87\x45\x00\x9a\x4a\x9d\x8f\ \xea\xdd\xc0\xe9\x05\xcd\x9f\x00\xcf\xe1\xba\x73\xb0\xac\x25\xe2\ \x38\xb9\x03\x9a\xf3\xa2\x8b\xba\x12\x8f\x9f\x06\x5c\x82\x48\x2d\ \xd0\xc9\x43\x65\x11\x79\x16\xcb\x9a\x22\x33\x66\xac\x39\x54\xda\ \x0f\x49\x00\x6a\xdb\x83\x80\x87\x81\xf1\x5e\x93\x0b\xcc\x46\xf5\ \x61\xd2\xe9\x79\x62\xec\xfb\x90\x41\x27\x4f\xee\x4c\x26\x73\x09\ \xaa\xd7\x00\x27\x7b\xcd\xbb\x51\xbd\x87\xaa\xaa\x69\x87\xe2\x27\ \x0e\x5a\x00\x6a\xdb\xe7\x02\x73\x80\x12\x40\x51\x9d\x41\x2c\x76\ \xaf\xcc\x9c\xf9\xe1\xc1\xce\xb9\xcf\x35\x41\xa8\xad\xbd\x0c\x91\ \xa9\xc0\x11\x5e\xf3\xdb\x58\xd6\x64\x99\x39\xf3\x93\x83\x99\xf3\ \x50\x04\xf0\x3d\xe0\x19\x60\x09\x70\xa3\x38\xce\xbc\x7d\x8e\xb9\ \xec\xb2\x6e\xb4\xb5\x0d\x43\xe4\x28\xa0\x3f\x22\xc6\xc6\x55\x77\ \x00\x9f\x13\x8b\x2d\x93\x19\x33\x56\xef\xc7\xda\x65\xa8\xfe\x08\ \x91\x9f\x60\x3e\xc0\x0e\xe0\x32\x71\x9c\x3f\x1f\x28\x1f\x87\x6a\ \x02\x47\x32\x7c\xf8\x5a\xa9\xab\x73\x23\xf1\x20\xa4\x52\x63\x71\ \xdd\x14\x22\xd5\xc0\xf1\xfb\xb1\xe6\x2a\x54\x5f\x40\xe4\x45\x60\ \xde\xde\x7c\x87\xda\xf6\x18\xc0\x01\x8e\x04\x72\x88\xdc\x22\xf5\ \xf5\x8f\x1e\x08\x0f\xfb\x2d\x00\xb5\xed\xe3\x01\xc4\x71\x96\xef\ \xb3\xef\xe4\xc9\x9d\x69\x6b\xbb\x1a\xb8\x1e\x18\x58\x84\x6e\x06\ \x56\x01\x5f\x60\x7c\xc4\x1e\x0c\x03\xc7\x62\x72\x83\x42\xf8\x14\ \xd5\xa9\x88\x3c\x23\x8e\xd3\x16\xb9\xd6\xa5\x97\xf6\x20\x9b\x7d\ \x0e\x38\xcf\x34\xe8\x5d\x92\x4e\x4f\xdd\x5f\xbe\xf6\x4b\x00\x6a\ \xdb\xdf\x00\x5e\x02\x94\x96\x96\x1e\x32\x67\xce\x9e\xc8\x7e\xd5\ \xd5\x71\x7a\xf4\xb8\x01\x91\xbb\x81\x6e\x5e\x73\x06\x78\x09\xd5\ \x3f\xa3\x3a\x8f\x86\x86\xe5\x1d\x39\x47\x9d\x34\xa9\x1f\xb9\xdc\ \x77\x80\x8b\x81\x71\x98\xf0\x08\xf0\x39\x30\x05\xc7\x79\x3a\x6a\ \xac\xda\x76\x0c\x91\xa7\x51\x9d\x6c\xb8\x92\x9b\xf6\x57\x13\xf6\ \x29\x00\xbd\xe4\x92\x13\x70\xdd\xd7\x80\x2e\xc0\xab\x38\xce\xd9\ \x91\x44\xd4\xd4\x7c\x0d\xcb\xfa\x5f\x60\xa4\xd7\xf4\x05\xaa\x8f\ \x90\xcb\x3d\x25\xcf\x3f\xbf\x75\x7f\x88\x09\xcc\x37\x71\x62\x2f\ \x62\xb1\x5b\x11\xb9\x96\xf6\x10\x38\x17\xb8\x52\x1c\x67\x5d\xa8\ \x7f\x75\x75\x9c\x9e\x3d\xa7\x03\xb5\x80\x8b\xaa\x2d\xe9\xf4\xac\ \x7d\xad\xb3\x57\x01\xe8\xa5\x97\xf6\x26\x9b\x5d\x02\xf4\x05\x16\ \x91\x4c\x7e\x53\x9e\x7b\x6e\x47\xa8\x5f\x2a\x75\x25\xaa\x8f\x02\ \xa5\xc0\x6e\x60\x2a\x9d\x3a\x3d\x24\x7f\xfc\x63\x4b\x71\xdf\x03\ \x05\xb5\xed\x9e\xc0\xdd\xc0\x75\x98\xc4\xa8\x09\xd5\xab\x24\x9d\ \x76\x42\x7d\xaf\xba\x2a\xc1\xb6\x6d\xb3\x80\xef\x60\x12\xa7\x53\ \xc4\x71\x3e\xde\xdb\xfc\x1d\x0a\x40\x41\xb0\xed\xd9\xde\x64\x5f\ \x10\x8b\x8d\x96\x19\x33\xd6\x87\xfa\xa4\x52\xf7\xa3\x7a\xa7\xd7\ \xf4\x16\xae\x3b\x59\x1a\x1a\x3e\x3d\x10\x26\xf7\x07\xb4\xb6\xb6\ \x1a\x91\x3f\x00\x47\x01\x8a\xc8\x6d\x52\x5f\xff\xab\x50\x3f\xdb\ \xae\xc0\x44\xa6\x41\xc0\x52\x60\x4c\x47\xfe\x03\xf6\x26\x80\xda\ \xda\xeb\x10\x79\x1c\x63\xc3\x67\x8a\xe3\xbc\x13\xb1\xd8\x43\xc0\ \x2d\x66\x26\xf9\x6f\x36\x6d\xba\x41\x5e\x7d\x35\xdb\xe1\x9c\xc6\ \xc6\xef\x01\x4e\xc0\x38\xc7\x0a\xa0\x0d\xd8\x82\xb1\xf3\xb7\x81\ \x79\xc0\xdf\xa3\x88\xd6\x09\x13\x2a\x29\x29\x79\x06\xb8\xc8\x34\ \xe8\xa3\x8c\x18\x71\x73\x71\x14\x52\xdb\x1e\x05\x2c\xc0\xf8\x90\ \x7b\xc4\x71\xa6\x1c\x90\x00\xd4\xb6\xfb\x03\x2b\x80\x72\x44\xee\ \x96\xfa\xfa\x7b\x23\xfa\xdc\x01\x4c\xf5\x98\xff\x99\xd4\xd7\xd7\ \x75\xb4\x48\x7e\x4c\x6d\xed\x0f\x11\x99\xb6\xaf\x7e\xc0\x66\x44\ \x9e\x41\xf5\x57\xe2\x38\x1b\x8a\xd6\x8d\xa1\xfa\x6b\x44\xae\x37\ \x0d\x3a\x4d\xd2\xe9\x5b\x42\x6b\xa5\x52\x77\xa1\x7a\x3f\xd0\x86\ \xeb\x8e\x90\x86\x86\x7f\x47\x2d\x64\x45\x35\xa2\xfa\x13\xa0\x1c\ \xf8\x80\x4d\x9b\x42\x21\x45\x6d\xfb\x02\xe0\x7e\x00\x44\x7e\x11\ \xc5\xbc\xda\x76\x95\xd6\xd4\x1c\x17\x68\x4c\x26\x9f\x46\xe4\x6e\ \x54\xaf\x41\xf5\x7c\xcc\x4e\x71\x2c\xf0\x5d\x44\xee\x00\x5e\xc4\ \xec\x00\x7b\xa2\xfa\x23\x60\x85\xd6\xd6\xde\xa9\xd5\xd5\xf9\xdd\ \xa4\x38\x4e\x4e\xd2\xe9\x1b\x50\xad\xf3\xd6\xbf\x59\x6d\xfb\x86\ \x10\x0f\xc7\x1f\xff\x00\xf0\x1e\x90\xc4\xb2\x3a\x0c\x8b\x21\x0d\ \xd0\x9a\x9a\x63\xb0\xac\x8f\x80\x04\x22\x17\x48\x7d\xfd\x5f\x03\ \xf8\x89\x13\xbb\x13\x8f\x2f\xc3\xec\xe9\x5f\xc4\x71\x26\x16\x47\ \x05\xad\xa9\x39\x15\xcb\x7a\x1e\xe8\x85\x65\x1d\x2f\x33\x67\xae\ \xe8\x88\x80\xd0\xfa\x46\xcd\x53\xc0\x1d\x18\x3b\x06\x78\x9d\x5c\ \x6e\x92\xcc\x9a\xf5\x45\xa0\x6f\x2a\xf5\x24\xaa\x57\x03\x39\x54\ \xc7\x4b\x3a\x3d\x37\x80\xb7\xed\xb3\x81\x7f\x00\x8a\x65\x9d\x24\ \x33\x67\x2e\x2d\x5e\x2f\xac\x01\x96\xf5\x53\x20\x01\xcc\x2b\x66\ \x1e\x80\x78\x7c\x9a\xc7\xfc\x5a\xe0\xfb\x21\xe6\x53\xa9\x8b\xb0\ \xac\x57\x31\x91\x63\x0d\xae\xbb\x65\xff\x58\x37\x20\xb3\x67\xef\ \x14\xc7\x79\x0a\x18\x8e\xea\xed\x18\x1f\x71\x16\xb1\xd8\x42\xbd\ \xe4\x92\x63\x03\x9d\x37\x6d\xba\x01\x13\x1a\x63\x88\x3c\xa5\x97\ \x5d\xd6\x2d\x30\x97\xe3\xbc\x02\xbc\x06\x08\xae\x7b\x5b\xd4\x7a\ \x01\x01\xa8\x6d\x57\x01\x93\xcc\x68\xf9\x45\x71\x67\xcf\xb9\x5c\ \xee\xe1\xaf\x16\xc7\xd9\x1e\xc0\xd7\xd4\x8c\x46\xf5\x39\x4c\x38\ \x7c\x0b\x38\x4d\x1c\xa7\x71\x3f\x79\x0f\x80\x38\x4e\x9b\xa4\xd3\ \xbf\xc0\x75\xcf\x02\xd6\x01\xfd\x71\xdd\x7f\xa8\x6d\x1f\x99\xef\ \x63\x1c\xee\xe5\xc0\x06\xa0\x2f\xd9\x6c\x88\x66\x54\x1f\xf4\xde\ \x6a\x74\xf2\xe4\xce\xc5\xe8\x62\x0d\xb8\xcc\x23\x7e\x2d\xaa\x7f\ \x89\xa0\xeb\x1e\x8c\xd9\xfc\x4d\xea\xeb\x03\x78\xb5\xed\x3e\x58\ \xd6\xff\x61\x7c\xc7\x7c\x3a\x75\x1a\x57\xec\xc0\x0e\x06\xa4\xa1\ \xe1\x6d\xa0\x1a\x58\x8f\x89\x1c\x0d\x7a\xd5\x55\x89\x3c\xde\x08\ \xf8\xbf\x0c\x11\xfa\x03\x4d\xa5\xce\x0a\x4c\x30\x62\xc4\x5f\x81\ \x35\x40\x09\xad\xad\xe3\x29\x82\x62\x01\x4c\x34\xb3\xca\x9f\x8a\ \x37\x21\x9e\x43\xfb\x96\xf7\xf3\xa7\x21\x4a\x55\x7f\x89\x31\x8d\ \xd5\xc0\xc4\xbd\x25\x41\x3a\x61\x42\xa5\xa6\x52\xe3\x34\x95\xba\ \x5c\x6b\x6b\x27\x69\x4d\xcd\xa9\x6a\xdb\xc9\x8e\xfa\x8b\xe3\xac\ \xc4\xb2\x2e\x04\x5a\x80\xd1\x34\x35\xdd\x5d\x84\x4f\x63\x1c\xa8\ \xa0\xfa\xe3\x00\xae\xae\xce\x45\x75\xa6\xc7\x57\x4d\xf1\xdc\x79\ \x01\xa8\x6d\x77\xc1\x78\x64\x80\xd9\x21\x2a\x2c\xeb\x4a\xcc\xd7\ \x5f\x50\x9c\x13\x68\x2a\x75\x06\x22\x93\xbd\x9f\xd7\x8a\xe3\x6c\ \x8e\x64\xdc\xb6\x4f\x54\xdb\x7e\x9e\x92\x92\xcd\xa8\xbe\x82\xea\ \xb3\x88\x4c\xc7\xb2\xde\x02\x36\x6a\x6d\xed\xaf\x75\xe2\xc4\x5e\ \x91\x42\x98\x39\x73\x29\xaa\xc6\x8e\x55\x6f\x2d\x34\x05\x00\x5c\ \xf7\x3e\xef\xed\x5c\xad\xa9\x19\x5e\x44\xbb\xaf\xad\x17\xe8\x15\ \x57\x94\x46\x0a\x00\x91\xaf\x63\x9c\x5f\x13\xaa\x6f\x05\x08\x37\ \x8c\xd7\x78\x8b\xff\x21\xcc\x99\xde\x82\xe9\x33\x5b\x1c\xe7\xa5\ \x10\x1a\x44\x6b\x6b\xa7\x00\x8b\x31\x49\x4c\x09\xd0\x08\xbc\x8f\ \xd1\x18\x17\xe8\x8a\xc8\x8d\xc4\xe3\x1f\x6a\x2a\x75\x61\x94\x10\ \x18\x31\xe2\x71\xe0\x5f\x40\x89\x17\xaa\xdb\xc9\x6f\x68\x58\x04\ \xbc\x01\x08\x22\x37\x15\xd1\x37\x1f\xb3\x0b\x2d\x63\xd7\xae\x93\ \x0b\x51\x85\x26\x70\x9a\xf7\x5c\x14\xda\x83\xd7\xd4\x8c\xc4\xd8\ \x5f\x8e\x44\xe2\x85\xc0\xdc\x17\x5f\xdc\x17\xbf\x24\x26\xf2\x50\ \x24\xe1\xb5\xb5\x0f\x21\x52\xe7\xad\xf7\x0a\xaa\xe3\x80\x5e\xe2\ \x38\x27\x88\xe3\x1c\x4d\x4b\x4b\x25\xaa\xd7\x03\x9f\x01\x55\xa8\ \xbe\xa0\xa9\x54\xc8\x5e\xbd\x8c\x6f\x8a\xb7\xd6\xf7\x3c\xad\x2d\ \xe8\x20\xbf\xf1\x9e\x17\xab\x6d\xe7\x8b\xb2\x5e\x56\xf9\x9e\xe1\ \xd8\x3a\x35\x5a\x00\xaa\x23\xbd\xe7\xe2\x10\x03\x22\x67\x7a\x6f\ \x4b\x65\xfa\xf4\x60\x58\xb3\xac\x89\x18\xcd\xf9\x98\xfa\xfa\x37\ \x8a\x87\x6a\x2a\x55\x83\xc8\xcd\xde\xcf\x7b\x70\x9c\x73\x24\x9d\ \x7e\xb5\x50\xc8\x32\x67\xce\x1e\x49\xa7\x9f\xc0\xd4\xfb\xe6\x03\ \x09\x54\x9f\x0d\xa9\x39\xc0\xf0\xe1\x2f\x62\x1c\x62\x29\xbe\xcf\ \xf2\xa1\xa5\x65\x2e\x26\x75\xef\x0e\x8c\x0a\x12\xa2\x0b\xbd\x67\ \x07\x02\x80\x21\x1e\xb3\x9f\x85\x16\x15\x39\xd9\x7b\xbe\x15\xc2\ \xc1\x37\x3c\xdc\xdc\x50\x4e\x50\x5d\x1d\x47\xf5\x01\x6f\xe1\xa7\ \xc5\x71\xa6\xec\xad\x50\x2a\x8e\xd3\x48\x69\xe9\xf9\x18\x4d\xe8\ \x82\x48\x28\x05\x97\xba\x3a\x17\x91\x06\xef\xe7\xa4\x00\x6e\xf6\ \xec\x9d\x98\xfd\x04\xc0\xb9\x81\x81\x96\xb5\xd0\x7b\xeb\x50\x00\ \x03\x3d\x42\x03\x3b\x3e\x0f\x8e\xf5\x70\xe1\x8c\xce\xd4\xf0\xc1\ \x75\x43\x5f\x9f\x5e\xbd\xaa\x31\xd9\x5c\x33\x89\xc4\xed\x11\xf3\ \x86\xa7\x7b\xf6\xd9\xdd\xc0\xcd\xde\x7a\x93\x74\xe2\xc4\xee\x11\ \xdd\x9e\xf7\x9e\x63\x0b\x43\xa2\x07\xaf\x79\xcf\x53\x02\xad\xb9\ \xdc\x22\xef\x6d\xa0\x4e\x98\x90\xaf\x3c\x59\x00\xfa\xad\x6f\x95\ \xe0\x97\xa3\x44\xd6\x46\x2c\x38\xc0\xc3\x05\xb4\xc3\xcb\xd1\xfb\ \x79\xb8\x65\x11\xe3\x2e\xf0\x9e\x7f\x93\xe9\xd3\x37\x46\xe0\xa3\ \xc1\xa8\xf9\x1a\x20\x49\x2c\x56\x1b\xc2\x1b\x27\xdd\x06\x94\xb3\ \x75\xeb\xc9\x45\xd8\xf7\xbc\xe7\x09\x81\x56\xcb\xfa\xb7\x37\x46\ \x28\x2b\x1b\x9c\x6f\x06\xa0\xa2\xa2\x3d\x85\x8c\xc5\x02\xf9\xb6\ \x07\x95\xde\xc2\xc1\x62\x48\x9f\x3e\xbd\xf2\x73\x24\x12\x9b\x22\ \x08\xf5\x73\xf9\x77\x43\xa8\xf1\xe3\xcb\xd5\xb6\x67\x69\x2a\x75\ \x57\x31\xce\x73\x76\x33\xcc\x0f\x99\x50\x5f\x5f\x1f\x7b\xf0\xb1\ \x77\xfb\xdd\xf7\xe4\xdb\xa3\xef\x7b\xf2\x9d\xf1\x0f\x8c\xbb\xed\ \x8c\xb5\x5d\xfa\xff\x3b\x13\x4b\x80\x65\x9d\x51\xc4\xe8\xfb\xde\ \xdb\x40\xbd\xe8\xa2\xae\xf9\x39\x8d\xcf\xf9\xd4\xa3\x6b\xa8\xdf\ \x1e\xf7\x98\x4e\x90\xf3\x7c\x52\x6b\x6b\xd4\x7e\x3e\xe1\x0d\x0c\ \x1e\x40\xe4\x72\xed\x45\xcc\x4c\x26\x54\x29\xc2\x38\x2a\x10\xd9\ \x19\xc2\x94\x97\x0f\xc6\x75\x27\xa2\xfa\x6d\xb5\xed\x69\xe2\x38\ \xcd\x85\xe8\x1d\xc9\xb2\x7f\xae\xef\x3a\xf0\xd6\x8f\x7a\x0f\x39\ \x77\x65\xe3\xd1\x5b\x88\xe7\xba\x5a\xea\x55\xd1\x05\x9e\x1d\x35\ \x19\x4b\x5d\xba\xef\xd9\x7a\xcb\xd4\xb3\x6f\x6b\x8b\xb9\x9a\xbe\ \xed\xfa\x31\x1b\x18\x36\x6c\x25\xcb\x96\xb5\x00\xa5\xc4\x62\x83\ \x80\x45\x05\xd3\xae\x00\x8e\xc3\x1c\xd2\x16\x08\xa0\xad\x4d\x89\ \x79\x51\xa3\xa4\xa4\x24\x82\x91\x3d\x40\x15\x96\x55\x5e\xd4\x5e\ \x78\x58\x59\x81\x39\x03\x6c\x07\xd5\xed\x88\x80\x6a\x38\xb9\xe9\ \xd2\x65\x39\xdb\xb6\x99\xd8\x6c\x4e\x8e\xdf\x00\xa8\xab\x53\xab\ \xa4\xd7\xe2\x9a\xc7\x71\x1f\x44\x04\x20\x81\xd2\x35\x34\x1e\x70\ \xc5\x62\x73\xa7\x9e\xfd\x81\xc7\xb2\x96\x3c\x78\xff\x93\x0b\x1f\ \xfb\x59\x73\xfc\x81\x29\x2c\x5b\x0b\x0c\x42\xe4\xc8\x80\x00\x54\ \x57\x78\xf4\x14\x99\x40\x49\x49\xfb\x97\xcd\x64\x02\x99\x92\x07\ \xfe\x86\xa6\x67\xa0\x35\x99\x2c\xfc\xb2\xc1\x98\x0c\x20\xb2\xc4\ \x7b\x3b\x2d\x84\x32\xc7\x59\x06\x6f\x59\xa3\x01\x1e\x7c\xec\xdd\ \x7e\x25\xbd\x17\xce\x57\xd1\x7a\x44\x8e\xf6\xfb\x76\x2a\x4b\x64\ \xfa\x0c\xe8\xba\xe5\xe8\xc1\x3d\xd7\x0f\x1d\xd1\xf7\xf3\x63\x87\ \xf6\x5a\x37\x70\x40\xe7\xed\x3d\x2a\x63\x14\xec\xe8\xcb\x45\xb9\ \x3d\x59\x9a\x5d\xb1\xa2\xc7\x90\x9d\xde\xbc\xc1\x92\xbc\x88\x5f\ \xaa\xcb\x87\x57\xa3\x01\x4d\x4d\x4d\x54\x54\xe4\xd9\x0a\xf3\xcf\ \x2a\xe0\x6b\xb8\x6e\x60\x3b\x2a\xcf\x3d\xb7\x43\x6d\x7b\x33\xd0\ \x13\x91\x61\x98\xb2\x56\x3b\xa8\xce\xf7\xbe\xe2\x68\xad\xae\x8e\ \x87\xca\x65\x22\xcb\x51\x3d\x1d\x18\x7a\xdf\x93\x6f\x8f\xce\xa9\ \xfb\x02\x48\x7f\x43\xbb\xe8\x11\xbd\x4a\xdb\x86\xf4\x90\x92\xf2\ \x1e\xdd\xb6\x66\xaa\xba\x07\x2a\xc1\x56\x6b\x6b\x59\xc9\xc6\xf5\ \x5d\x5a\x33\xca\xc7\x6d\x9d\xd6\xae\x5a\xb9\xa5\x4f\x36\x93\x8b\ \x03\x3d\x67\x8d\xfc\x6e\xf7\xf3\x56\xbc\xcc\xc9\xeb\x96\x0c\x28\ \xa2\x67\x8d\x47\x4f\x5e\x00\x16\x80\xcc\x9d\xdb\x8a\xa9\xe6\x82\ \x48\xf8\x4b\xaa\x7e\xe4\xe1\x4e\x8c\x10\x8e\xff\x95\x47\x85\x30\ \xad\xad\x8b\x81\x1c\xd0\x89\x9e\x3d\x87\x44\xcc\xbb\x02\x60\x43\ \x45\x9f\x13\x2d\xb5\x5e\x06\xed\x0f\x50\x59\x59\xba\xe7\xf4\x71\ \x83\x97\x9f\x38\xac\xfb\xd6\xce\xa5\x31\xac\x4c\x5b\x59\xf1\x50\ \x37\x16\xcb\x00\x94\x24\x84\x21\x83\xbb\x37\x56\x9f\x3f\xf4\x83\ \x7e\x03\xba\x6e\x01\x50\x11\xeb\xaf\x43\xcf\xe5\x8d\xa3\xc7\x06\ \x35\xaf\x3d\xc2\xf5\xf3\x33\xc5\xc2\x3c\x60\xa3\xd7\x29\x58\x74\ \x30\x6d\x0b\xbc\xb7\x33\xb4\xb8\x8a\x24\xb2\xd8\x63\x66\x4c\x68\ \x98\x39\x40\xf1\x17\x3d\xba\x18\x0f\x7c\xdc\x9c\x28\x65\xd6\xc8\ \x09\xa3\xf0\x4c\xa8\x67\x9f\xca\x6d\xa7\x55\x1f\xfb\x71\xe7\x2e\ \xa5\x2d\x6e\x22\xd1\x0c\x20\xb9\x6c\xd8\x2c\xe3\xf1\x2c\x22\x0a\ \x20\xd9\x6c\x22\x99\x8c\xe7\x4e\x1c\x73\xe4\x67\x43\x47\xf4\xc9\ \x6b\xe1\x82\x81\xa7\x9e\xfa\xf3\x27\x16\x8f\x2d\x18\xe5\xe3\xe2\ \xc4\xe3\x3d\x8a\x05\xe0\xdb\xc7\x20\x8a\x21\x9b\x9d\x8f\xc9\xe0\ \x7a\x62\xdb\x23\x8a\xb0\x6f\x7a\xcf\x33\x43\xc2\x31\xb0\x1a\xc0\ \x3b\x10\x2d\x86\x8f\x5f\x1e\x72\x0e\xdb\x4b\xbb\xc4\x01\xba\x75\ \xef\xb4\x63\xd4\xd7\x8f\x5a\x15\x4f\xc4\x5c\x00\x37\x59\xd2\xe2\ \x31\x58\x82\xab\xa1\xea\x95\x8a\xe4\x00\xc4\x75\xf3\x35\xc3\x63\ \x87\xf4\xda\x3c\x6c\x70\xd7\x46\x00\xd7\xb2\x2c\xc4\xfd\xd3\xc3\ \x0f\x2f\x28\x83\x7c\xed\xe0\x97\xa8\xfe\x0f\x43\x87\x6e\x0e\x0a\ \x40\xd5\xbf\x75\x11\x12\x80\x77\xb2\xf3\xa1\xd7\xef\x9b\x41\x2a\ \xf2\x3b\xc7\xee\xd8\x76\x98\x49\x11\x93\x57\xb8\x6e\xef\x62\xd4\ \xb4\xb3\x6e\xaa\x5c\xd6\x7b\x18\x00\x65\x65\x89\xb6\x51\xa7\x0d\ \xfc\xd4\xb2\x24\x9f\x2a\x6b\x3c\xd1\x9a\x9f\x26\x9b\x29\xce\xf8\ \x40\x2c\xe3\x53\xd4\x2d\xbc\x8d\xc2\xa0\x63\xaa\x9a\x06\x76\xcf\ \x77\x1f\xd0\x52\x96\xcc\xef\x0e\xc5\x71\x6e\x93\x74\xfa\x07\x7e\ \x29\xbd\x5d\x00\x96\xe5\x9f\xeb\xe7\x43\x44\x11\xcc\xf3\xfa\x05\ \x72\x69\x6f\xef\xbf\xde\x63\xf6\x84\xd0\x28\xd7\xf5\x8f\xc5\xaa\ \x8a\x51\x2d\xf1\xe4\x14\xf5\x94\xe6\xb8\x41\x5d\x9a\x92\xc9\x78\ \x70\x17\x6a\x89\x22\x96\xf9\xca\xb9\x5c\x48\x00\x6a\x59\xe6\x3c\ \x40\xdd\xa0\xe6\xa9\xea\xc8\x01\x25\xc4\x2d\xbf\x59\xef\xa8\x7b\ \xf4\xad\x50\x39\x0c\x82\x26\xe0\xef\x02\x87\x47\x56\x67\xcc\x9e\ \x1a\x54\x4f\x8a\x98\xc7\xaf\xb6\x86\x9d\xa4\x88\x11\x80\x65\x05\ \x72\xfa\xba\xdf\x2f\xa8\x02\xb9\x00\xa0\x6b\x27\x8b\x23\x7a\x95\ \x47\x9f\xfe\x5a\x56\x06\x40\x72\xd9\xa8\x8b\x56\xc6\x07\x68\x51\ \x65\x4b\x2c\x2d\x49\x08\xc7\xf6\x4d\xfa\x02\xed\x92\x48\xc4\x22\ \x6b\x0c\xed\x03\x9b\x9b\x97\x00\x59\xcc\x61\xc8\x29\xa1\x9e\x22\ \x1f\x79\x6f\xe1\x2d\xaa\x88\xc9\xbf\x55\xc3\x1a\xe0\xe7\x10\xaa\ \x01\x0d\x48\x64\x13\xdf\xc1\x0b\xc3\x47\x56\x25\x90\x5c\x2e\xf2\ \x26\x99\xc6\x8c\x9a\x8b\x1b\xd6\x00\x2c\x31\x1a\xe0\xe6\x8a\x04\ \x60\xcc\xe8\xc8\xee\x89\xbc\x39\x09\x7c\x37\x6a\xfe\xfc\x40\xcf\ \x63\xff\xcb\x23\xb6\x3a\xd4\x33\x97\xf3\x37\x33\x65\xa1\x42\x84\ \xeb\xfa\x1b\xa1\xa1\x84\xc1\x4f\xa2\x02\x02\x10\xd5\xb3\xfd\xf7\ \xbe\x5d\xe3\xd1\x0c\x02\x6a\xc5\x8c\x00\x72\x6e\x84\x80\x8c\x00\ \x8a\x35\x40\xc5\xb4\x57\x96\xc6\x28\x2f\x4f\xfa\xb5\xc9\xf3\xa2\ \xe6\x0f\x4a\x4e\xf5\x1f\xde\xdb\x59\xa1\x9e\x99\x4c\x7b\x9d\xcf\ \x75\x83\x5b\xd4\xf6\x5d\x62\x94\x76\xf8\x3e\xa0\x68\x5b\x2b\x03\ \x00\x62\x31\xd1\x8a\x12\x0b\xc9\x65\x23\x05\x80\x17\xef\xd1\x28\ \x01\x74\x00\x7e\x78\x54\xa4\xbc\x73\xd2\xdf\x63\x54\xfd\xf2\xb7\ \x4b\x43\x29\x79\x50\x00\x96\xf5\xb2\xf7\x76\x66\xc8\x0f\xcc\x99\ \xd3\x4c\x7b\x31\x23\x98\x98\xe4\x72\xfe\x75\xb5\x4e\xde\xd9\x42\ \x21\x31\x91\x1a\xa0\xde\x36\xba\x24\x69\xbe\x30\xae\x46\x9b\x80\ \xff\x95\x5d\x37\xfa\x18\x2f\x1a\x3c\x3a\x55\x4a\x4b\x92\xf9\x34\ \x3f\x23\xcd\x3d\x8a\x3b\x16\x6b\xc0\xeb\x98\x73\xf5\x72\x62\xb1\ \x40\xd8\xf2\x2a\x39\x26\x2c\xc5\xe3\xc1\x4d\x51\x63\xe3\x3a\x8c\ \xff\x80\x62\x2d\x70\xdd\xdd\xde\x5b\x65\x61\x9e\x20\xe6\xfc\x00\ \x3f\xec\x49\x51\x28\x6b\xa7\xd0\xf3\xf4\x6e\x18\xaf\xde\x97\x46\ \xb5\x38\x39\xf3\xdb\x2d\x2b\x26\xf9\x93\x63\x4b\xe2\xa1\x39\x02\ \x02\x10\xc7\x69\xc6\xb2\xce\x43\xa4\xb6\x83\x4b\x88\x7b\xbc\x89\ \x03\x1a\xe0\xe5\xf8\x7e\x1d\x21\x28\x00\xcb\xf2\xaf\xd3\x58\x5c\ \x71\x45\xfb\x4e\x53\xd9\x00\xd0\xda\x96\x8b\x75\xc4\xa0\xc7\x8c\ \x67\xe7\xe1\x44\xa8\x23\xc8\x0b\x06\x68\x6b\x6d\x37\x2d\xb7\xd5\ \x0a\x1d\xd4\x84\xd4\x4e\x66\xce\x8c\xaa\xfb\xf9\x90\xf3\x88\x8d\ \x22\xe6\x73\xcc\xdd\xbd\xa0\x00\x32\x99\x3d\xf9\xad\x76\x5b\x5b\ \x19\xe6\x70\x03\x15\x59\x2f\x28\x99\x8c\x1b\xcb\xb9\x4a\x4c\x34\ \x52\x00\x2a\x78\x5f\x70\xff\x05\x20\xbe\x46\x88\x68\x6b\x73\xc6\ \x37\xe5\x4c\x5b\xe3\x49\xa1\xab\x3a\x07\x62\x57\xe0\xdb\x96\x7f\ \xbf\x2f\xb0\xaa\x18\x8d\x51\x0d\xee\xc0\x62\xb1\xf6\x0b\x55\x99\ \x4c\x81\xe9\xb8\x1f\xf8\x6f\x9b\x76\xe4\x8c\x1a\x47\xa4\xbb\x58\ \x26\x11\x0a\xa9\x39\x41\x46\x83\x54\x9a\xf6\x9c\x0b\xdb\xb7\xb7\ \xf8\xf7\x8b\xde\xab\xab\x6b\x37\x87\xfc\xf4\xa1\x05\xf7\x0e\xae\ \xb7\x60\x78\x9c\xeb\x6e\xf2\x08\x0e\x7a\xfb\x6e\xdd\xf6\x14\xf4\ \xc9\x0b\xc0\xd2\xd8\x8b\xfe\xfb\xfa\x26\xe3\x3e\xc4\xcd\x85\xb4\ \x20\x5b\xd6\x69\x7b\xae\xac\xbc\x31\x5b\xd1\x39\xa2\xa6\x68\x18\ \xd5\x62\x01\x78\xbe\x66\xe3\xf6\x0c\x6e\xce\x68\xab\x42\xd4\x59\ \xe7\x41\x0a\x20\xe2\x6b\x20\xd2\xe4\xbd\x05\x72\x04\xaf\xf0\xe1\ \x3b\xc8\xbc\xef\xb8\xe3\xda\x93\xdf\xc5\x14\x3e\x59\xd3\x98\xa5\ \x39\xe3\x46\xcf\x1b\x8f\x67\xdb\x7a\xf6\x5e\x95\xab\xa8\x6c\x0a\ \xe1\x7c\xa7\x9a\x37\x13\x0f\xbc\x79\x56\x6c\x28\xa8\xe0\xb9\x1a\ \x38\xd0\xf1\xe1\xf0\x99\x80\x5f\x0e\x53\x8d\x2a\x5f\xf9\x5a\x90\ \x17\x80\x88\x28\xca\xc3\x00\x39\x57\x59\xbe\xae\x2d\x5a\x00\x7b\ \x03\xdf\x64\xc4\x0a\x9d\x35\xac\xdb\x96\x65\xeb\xae\xac\x00\x08\ \xcc\xfd\xf1\xf5\x63\xde\x2b\xee\x03\x07\xab\x01\x51\x4e\xb0\x5d\ \x03\xa2\x04\x60\x92\x91\x58\x2c\x10\x3e\x2b\xb2\x5d\x7f\x8b\xb2\ \x0a\x60\xf5\x96\x0c\x6b\xd6\x34\x45\xd6\xfe\xf6\x02\x9e\xc0\x34\ \x20\x80\xdd\xbb\x5b\x93\xef\x7e\x96\x3f\x9c\x56\x5c\xed\xf0\x92\ \xd4\xe1\xf3\x01\xed\x7f\x7e\x88\xaa\x29\xfa\xd9\x58\x20\x7c\xde\ \x78\xe3\xe0\x56\xe0\x87\x3e\xfd\x1f\x7c\xb0\xb1\xff\x96\x8d\x3b\ \x2b\x0a\xfb\xc4\x76\xef\xea\x56\xb6\x66\xf5\x49\xb1\x5d\x3b\x42\ \xbb\x49\xdf\x09\x16\xfa\x80\xd6\xe6\x4c\x7c\xe1\xe2\x0d\xfd\xda\ \xb2\x7e\x2e\xc4\xb4\x3b\xaf\x1f\xb3\xb0\x78\xac\x0f\x87\x4f\x00\ \xe6\xd0\x01\xfc\x12\x7a\x10\xfc\xf0\x19\xc2\xdd\x75\xdd\x29\xb3\ \xcf\x5c\xfd\x66\x0e\xc0\xcd\xa9\x2c\x7a\x73\xd5\x90\xd5\x9f\x6c\ \xcd\x3b\x52\xab\xb5\xa5\x02\x55\x2b\xd6\xd2\x52\x7c\x8f\xb8\xc0\ \x64\x8c\x77\xdf\xb1\xbd\xa5\xf4\xcd\xd7\x3e\x19\xba\x6b\x77\x5b\ \x09\x40\x8f\xdd\x5b\xb7\xb7\xf5\x28\xbf\x33\x34\xae\x00\x0e\xf4\ \xbf\x3c\x1d\x3b\xc1\x76\x01\x44\x15\x55\xfd\x6d\x69\x64\xac\x1f\ \xbb\x7a\x7e\xeb\x8e\xd2\xce\xe5\xef\xf7\x1d\x81\xeb\x22\xcb\x97\ \xae\x3b\x6a\xf3\x86\x1d\x5d\x8e\x1b\xd9\x67\x5d\x95\xe6\xd3\xef\ \x08\xc7\x6b\xda\xb2\x39\x95\x0f\x97\xae\xef\xb7\x66\x55\x63\xef\ \x5c\x81\x79\x6e\x2d\xaf\xfa\x94\x75\x6d\xe5\x05\xb4\x85\xe0\x40\ \x35\xc0\x0f\x45\xe1\x0b\x10\xed\x87\x26\x1d\x6b\x40\x07\x02\x40\ \xb5\xed\xdb\x1f\xcd\xa5\xdf\xce\x2f\x7e\x87\x27\xe4\xcd\x1b\x77\ \x76\x9b\xf7\xca\xca\xe1\x6f\xfe\x6b\x6b\xd7\xd5\x5b\x32\xec\x69\ \xc9\x59\x39\xb7\x5d\xf0\xcd\xbb\xdb\x12\x1b\xb6\xb5\xc5\xde\xfd\ \xac\x85\x97\x5f\xff\x7c\xe0\xea\x4f\xb6\xf4\x2d\x60\xde\x4f\xb6\ \x4e\x4a\x96\x66\xff\x52\xf7\xf8\xb2\x8a\xf0\xa2\x06\x0e\x4c\x03\ \xe2\xf1\x8b\xc9\x66\x8f\x11\xc7\x79\x33\x84\x53\xdd\xec\x95\x9c\ \xa3\xfe\xd9\xe5\x87\xc1\x68\x01\x98\xab\x2d\x7c\xff\x9d\x67\x9e\ \xfe\xf9\x39\xb7\xa7\x05\xa6\xa1\x0c\x57\x57\x65\x53\x63\x6b\xc9\ \xa6\x46\x60\x75\x4b\x37\xd8\xdc\x2d\x11\x8f\x65\xb3\xae\x1b\x53\ \x37\xa0\x85\xfe\xbc\x3b\x05\xee\xca\x91\x79\x3e\x46\xf2\x9f\x8a\ \x0e\x06\x4e\x4b\xc6\xf6\xcc\x7e\xf8\xe1\x05\xdf\xbe\xe5\x96\xd3\ \x9b\x8b\x17\x3e\x20\x0d\x90\xe9\xd3\x37\x46\x32\x8f\x77\x43\x43\ \x75\x3c\xc5\x67\xf6\x06\xf6\xae\x01\xbe\xd6\x88\x64\x7f\x7c\xcd\ \x29\x7f\x1f\x54\xb5\xea\x04\x84\xff\x44\x08\x85\xae\x4c\x36\x17\ \x2f\x62\x1e\x4b\x73\xdb\x14\x7e\xa6\xf1\xdc\xe0\x3b\xaf\x3d\xe5\ \x37\x3f\xb9\xf6\xf4\x75\x62\x71\x0e\xe6\x98\x1d\x94\x71\x2d\x65\ \x89\x74\x5d\xfd\xb2\x90\x79\x7e\x29\xff\x1b\x2c\x06\xb5\xed\x45\ \xc0\x28\x44\xae\x90\xfa\xfa\xa7\x23\xf0\xad\x40\x12\xd7\x3d\x59\ \x1a\x1a\x96\x14\xe2\xd6\x5e\xf9\xc3\x47\xbe\xa8\xec\x73\xd3\xa7\ \xdd\x8f\x5e\xfd\x49\xd5\x31\x2b\x81\x6e\x08\x5b\x05\x36\x9d\xf9\ \xe9\xfc\x9a\xa3\x1a\x57\x97\x75\xdb\xd3\x74\x52\xc5\x9f\xfe\x18\ \x12\xd6\xd4\xc7\x17\x0f\x52\xcb\x7d\x1d\x73\x67\x11\x85\x86\xcc\ \xc6\x5d\x93\xea\xea\xc6\xe5\x0f\x68\x0e\xf6\x0f\x8d\x07\x0a\xfb\ \x32\x01\x43\x87\x65\x85\x0e\x66\xfb\x37\xad\x6b\xec\xdf\xb4\x8e\ \xd1\x6b\x16\x2f\x12\xc7\xb1\x0b\x71\x6a\xdb\x0e\xaa\xc7\x90\x4e\ \x87\x6e\x80\x02\xdc\x79\xfd\xa8\x95\xf7\x3e\xb1\x70\x5c\x4c\x78\ \x0d\xe8\x2d\x50\x53\xd2\xa7\xe2\x0f\x75\x75\xfa\x7d\x7f\x5f\x70\ \xa0\x4e\xf0\x60\xa1\x43\x13\xd0\xba\x3a\x2b\x4f\x47\x84\x00\x50\ \xf5\xd3\xdc\x10\xad\xe2\x38\xb3\x25\x9d\x7e\x64\x6f\xb7\x4e\x7e\ \x7a\xdd\x29\x1f\x5b\xe2\x9e\x8f\x57\x9a\x53\xe5\xf2\x64\x9f\x45\ \xbf\x57\x2f\x92\x7d\x55\x02\x30\x11\x22\x2a\x83\x5c\xb6\xac\x5d\ \x0b\x5d\x37\xfc\xff\x3f\xaf\x2a\xcc\x21\x98\xeb\x1d\xd7\x9c\xba\ \x14\x4b\x2e\xc4\x14\x7b\x40\xf9\x8f\xa9\x4f\x2e\x7c\x04\xbe\x3a\ \x01\x3c\x05\xbc\x8e\xc8\xdf\x42\x98\xd2\xd2\xf6\xb0\x19\x8b\x85\ \x35\x40\xe4\xcf\x98\x33\x89\x67\x0f\x85\x80\xbb\xae\x1e\xfd\xb6\ \xc0\x04\xf2\x59\xa9\xdc\x78\xff\x13\x0b\x6f\xfd\x4a\x9c\xe0\xde\ \xc0\xfb\x87\x99\xd9\x48\xe5\x72\x47\xc8\xac\x59\x51\x57\x74\x0e\ \x1b\x4c\x7d\xf2\x9d\x0b\x54\xe5\x45\x20\x29\xb0\xe0\xab\xd2\x80\ \x8e\x61\xf0\xe0\x5d\x98\x9b\x5d\x4b\x68\x6c\x3c\xe4\xbb\xc5\xfb\ \x82\x3b\xaf\x19\xf3\x92\xb8\x32\x1e\x48\x8b\x25\xb7\xff\x3f\x48\ \x6d\xcb\x26\x4a\x1a\x6a\xf0\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x02\x01\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\ \x00\x00\x00\xf6\x50\x4c\x54\x45\x00\x00\x00\x2b\xaa\xaa\x21\xbc\ \x9b\x28\xbb\x99\x55\x5f\x73\x52\x5f\x75\x27\xb8\x98\x26\xba\x99\ \x54\x5d\x73\x5b\x66\x7e\x5e\x68\x81\x53\x5f\x74\x26\xb9\x99\x3f\ \x85\x83\x67\x73\x95\x6b\x79\x9b\x74\x82\xad\x26\xb9\x99\x2f\xa4\ \x90\x73\x81\xab\x81\x91\xc2\x29\xba\x9a\x82\x93\xc4\x26\xb9\x99\ \x28\xba\x9a\x2a\xba\x9a\x2b\xb3\x97\x2c\xba\x9b\x2e\xbb\x9d\x2f\ \xb0\x96\x39\xbd\x9e\x40\x46\x56\x43\xc2\xa7\x4b\x98\x8f\x5b\xca\ \xb2\x64\x6d\x7f\x68\xce\xb8\x6c\xbc\xa9\x6e\x79\x85\x6f\x77\x85\ \x76\xd3\xbf\x7d\xce\xb7\x86\x97\xcb\x8b\xd1\xbb\x90\x94\x9c\x96\ \x9a\xa1\x9b\xa1\xaf\x9c\xdf\xd1\x9f\xe0\xd2\xa2\xa7\xb0\xa4\xe2\ \xd4\xaf\xd6\xc3\xb5\xb6\xb5\xc0\xc0\xbd\xc0\xc2\xc8\xc6\xda\xc7\ \xd8\xe5\xd6\xe1\xdd\xcb\xe2\xdd\xcc\xe2\xde\xcd\xe4\xdf\xce\xe4\ \xe0\xd0\xe5\xe2\xd2\xe5\xe3\xd9\xe6\xe2\xd2\xe8\xe3\xd5\xe8\xe6\ \xdb\xe9\xea\xdc\xea\xe6\xd7\xeb\xe8\xd9\xec\xe6\xd9\xec\xe7\xda\ \xec\xe8\xd9\xec\xe9\xdb\xed\xe8\xda\xed\xe8\xdb\xed\xe9\xdb\xee\ \xea\xdd\xee\xea\xde\xef\xea\xdd\xef\xeb\xdd\xef\xeb\xde\x58\xc2\ \xad\x9f\x00\x00\x00\x17\x74\x52\x4e\x53\x00\x06\x17\x2d\x33\x3b\ \x48\x64\x73\x7b\x80\x84\x87\xa5\xab\xab\xb2\xd0\xd3\xe9\xfd\xfe\ \xfe\x53\x38\x8a\xc8\x00\x00\x00\xa3\x49\x44\x41\x54\x18\x19\x05\ \xc1\xc1\x4e\xc2\x40\x14\x00\xc0\x69\xfb\xb4\x4b\x8b\x48\x4c\x24\ \xf1\xe0\xcd\xff\xff\x24\x4f\x1a\x8c\x1a\x09\x82\x09\x2d\xdd\x5d\ \x67\x9a\x08\x4d\x5f\xb7\x0e\xed\x5c\xe4\xab\x26\xbd\xa4\x3c\x7d\ \x67\xcd\x2e\x6e\xa7\xd7\x3f\x21\x3d\x1f\xcf\x6b\x58\x3d\xbc\x21\ \xc8\xdd\xbd\x9b\x1e\x20\xc8\x17\xae\x3d\x40\x50\x0a\xe5\x13\x6b\ \x08\x52\x07\x08\x08\x2e\x47\xea\x9d\x53\xb3\x81\x20\x06\x14\xa3\ \x1e\x82\x3a\x01\xf3\x7e\x6e\x09\xba\x00\xbf\x1f\x8b\xa1\x9e\x5b\ \x4a\xad\xb5\xd6\xfc\xb5\xf0\xb4\xea\x82\x65\xa6\x7d\xdc\x4f\x63\ \x49\xe7\x36\x82\x94\x60\x6c\xe7\x5d\x3e\xa8\x01\xb0\xd9\xfe\xbc\ \x37\xe6\x6b\x38\x9c\x80\x3a\x2c\xf9\x72\xac\xff\xab\xa9\x45\xe8\ \xe6\xd0\x34\xcb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x0b\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\xe8\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\x80\x80\ \x80\xaa\xaa\xaa\xbf\xbf\xbf\x99\x99\x99\xaa\xaa\xaa\x92\x92\x92\ \x9f\x9f\x9f\xaa\xaa\xaa\x99\x99\x99\xa2\xa2\xa2\xaa\xaa\xaa\x9d\ \x9d\x9d\xa4\xa4\xa4\x99\x99\x99\x9f\x9f\x9f\xa5\xa5\xa5\x9c\x9c\ \x9c\xa1\xa1\xa1\xa6\xa6\xa6\x9e\x9e\x9e\xa2\xa2\xa2\x9b\x9b\x9b\ \x9f\x9f\x9f\xa3\xa3\xa3\x9d\x9d\x9d\xa1\xa1\xa1\xa4\xa4\xa4\x9e\ \x9e\x9e\xa2\xa2\xa2\x9c\x9c\x9c\x9f\x9f\x9f\xa2\xa2\xa2\x9e\x9e\ \x9e\xa0\xa0\xa0\xa3\xa3\xa3\x9f\x9f\x9f\xa1\xa1\xa1\x9d\x9d\x9d\ \x9f\x9f\x9f\xa2\xa2\xa2\x9e\x9e\x9e\xa0\xa0\xa0\xa2\xa2\xa2\x9f\ \x9f\x9f\xa1\xa1\xa1\x9d\x9d\x9d\x9f\x9f\x9f\xa1\xa1\xa1\x9e\x9e\ \x9e\xa0\xa0\xa0\xa2\xa2\xa2\x9f\x9f\x9f\xa1\xa1\xa1\xa2\xa2\xa2\ \x9f\x9f\x9f\xa1\xa1\xa1\x9e\x9e\x9e\xa0\xa0\xa0\xa2\xa2\xa2\x9f\ \x9f\x9f\xa0\xa0\xa0\xa2\xa2\xa2\x9f\x9f\x9f\xa1\xa1\xa1\x9e\x9e\ \x9e\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa2\xa2\xa2\ \x9f\x9f\x9f\xa1\xa1\xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\ \x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa1\xa1\xa1\x9f\x9f\ \x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\xa0\xa0\x9f\x9f\x9f\ \xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\ \xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\ \xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa1\xa1\xa1\ \xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\ \x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\ \xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\ \xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\x9f\x9f\x9f\xa0\ \xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\ \xa1\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\ \x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\ \xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\ \xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\ \xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\ \xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\ \xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\ \xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\ \x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\ \xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\x9f\x9f\ \x9f\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa1\xa1\xa1\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa1\xa1\xa1\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\ \x96\x72\x57\x2e\x00\x00\x00\xf7\x74\x52\x4e\x53\x00\x01\x02\x03\ \x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\ \x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\ \x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\ \x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\ \x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\ \x54\x55\x56\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x62\x63\x64\x65\ \x66\x67\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x74\x75\x76\x77\ \x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x86\x87\x88\ \x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\ \x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\ \xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb5\xb6\xb7\xb8\xb9\ \xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xca\ \xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xdb\ \xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\ \xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\ \xfc\xfd\xfe\x72\x99\x87\x57\x00\x00\x06\xd0\x49\x44\x41\x54\x18\ \x19\x05\xc1\x09\x6c\x9d\x05\x1d\x00\xf0\xdf\xf7\xf5\x7b\xaf\xc7\ \x68\xcb\xda\x75\x2b\x65\xeb\x60\x6b\x07\x0c\xc2\x26\xec\x92\x31\ \x1c\x1a\x1d\xcc\x40\x14\x04\x0d\x90\x10\x41\x32\x90\xa0\x88\x82\ \x92\x81\x17\x04\x21\x21\x90\x48\xc0\x28\xf1\x40\x89\xc2\x06\xc8\ \x29\xa2\x1c\x0e\xe7\x18\x8c\x63\x83\xb1\xfb\x62\xeb\x8e\xb6\x5b\ \xef\xbe\xff\xda\xf7\xfa\xea\xef\x97\x00\x00\x00\xd4\x2e\x99\x3b\ \x6b\xe6\xe4\xda\xba\xf1\xc1\xbe\x43\xbb\x37\x6f\x5c\x5f\x04\x00\ \x00\x24\x00\x00\xa0\xf9\xca\xcb\xcf\xc9\x00\xc0\xd0\x9a\xe7\x5e\ \x1c\x02\x00\x80\x04\x00\x00\x4b\x6e\x5d\x56\x41\xff\x3b\x5b\x77\ \x1f\x18\x3e\x2e\xdf\x34\xf5\xcc\x45\xa7\xa7\x0c\x3e\xf9\xd8\x2e\ \x00\x00\x00\x00\x58\xf6\x56\x44\x6c\xbe\x7b\x5e\x05\x00\x9c\x78\ \xf1\xe3\x47\x23\x06\x7f\x3b\x0d\x00\x00\x00\x40\xdb\xb3\x11\xc3\ \xab\x96\x24\x00\x00\xd4\x5d\xbf\x2e\xe2\xe8\x6d\x39\x00\x00\x00\ \xe0\xcb\x7d\x51\x78\xe2\x0c\x00\x00\x40\x72\xd5\x8e\x88\xb7\x67\ \x02\x00\x09\x00\x70\xcd\xe3\x1b\x6f\x5f\x0b\x30\xf1\x8c\xe9\xcd\ \xa9\xc1\x83\x9f\xee\x03\xa8\xfe\xfe\x4f\x2a\x07\xae\x7b\x05\x00\ \x00\x00\x5a\x53\x20\xb9\xe0\xe1\x0f\x0a\x11\x11\x11\x11\x5b\x1e\ \xf8\x42\x05\x60\xc1\xf6\x18\xba\x19\x00\x00\x30\x7b\x36\x80\xba\ \x1f\x6c\x8b\x88\xe8\xf9\xf0\x1f\xaf\x3c\xb3\xbe\x2b\x22\xe2\xd3\ \xeb\xf2\xc0\xa4\x97\x22\x6e\x07\x00\x00\x5f\xe8\xed\xa9\x01\xb2\ \x5b\x0e\x45\x0c\x3c\x7b\xc3\x99\x09\xd0\xf2\x9d\x17\xfb\x23\xb6\ \x5f\x9b\x80\x8a\x3f\x46\xdc\x0c\x00\x80\x39\x47\xe2\xb5\x04\x9c\ \xbd\x21\x62\xcf\x6d\x8d\x00\x60\xf2\x7d\x47\x23\x9e\x3f\x19\x64\ \x7f\x8d\xe1\xcb\x00\x00\x4c\xd9\x13\x6b\xeb\xc0\xf5\xbd\x71\xf4\ \xc7\x55\x00\x00\x9a\x1e\x1a\x8e\xc3\x57\x80\xdc\x73\xd1\x75\x1a\ \x00\x20\x79\x2e\xf6\xb4\x40\xf2\x8b\x88\x35\x33\x00\x00\xc0\xd2\ \xad\x51\xb8\x15\x9c\xf0\x49\xbc\x9b\x07\x00\x56\xc4\xc0\x02\x70\ \x7f\xc4\x23\x19\xa0\xe5\x37\x6b\xf7\xf7\x1c\xd9\xfc\xcf\x5f\x7e\ \x35\x0f\x6a\x57\x45\x3c\x98\xc2\xb9\xfd\x71\x37\x00\x38\xf9\x58\ \xdc\x09\x7e\x14\x71\x17\x80\x5b\x22\x22\x22\x22\x62\xff\xaf\x9a\ \xa1\xe2\xe1\x88\x07\xc0\x1d\xd1\xdf\x0e\x00\xbf\x8e\xf7\x33\xb8\ \x68\x38\xee\x05\x0d\xa7\x63\xe2\x9d\x37\x7c\xe5\xdc\xf3\x2f\xfd\ \xe1\xea\xee\x88\xae\xdb\x33\x58\x19\x71\x13\xa4\xeb\xe3\x6f\x00\ \x98\x31\x10\xcb\xa0\x71\x5f\xac\x4e\x60\xe1\x9e\xa1\x59\x00\xa8\ \xfd\xf6\x27\x11\xff\x3e\x09\x1e\x89\xa1\x8b\xe1\x8b\x51\x98\x03\ \xc0\xef\xe2\x0d\xf0\xfb\xd8\x59\x0f\x5f\xeb\x8d\xad\x0d\x00\x20\ \x7f\x5b\x7f\xec\x9a\x89\xec\xf9\xd8\x33\x11\xfe\x15\x7f\x02\xd0\ \xd0\x1b\x97\xc0\xb9\x85\x58\x0e\xf3\x8e\xc5\x9a\x66\x00\x80\x85\ \xbb\x62\x5b\x2b\x1a\xf6\xc6\x63\x70\x71\xf4\xd5\x01\xdc\x14\x3b\ \x2b\xe0\xef\xf1\x12\x34\xef\x8b\x37\xab\x00\x00\x68\xdb\x1d\x6b\ \x73\xf8\x46\x14\x2e\x40\xba\x23\xae\x02\x78\x35\xee\x85\xd3\x0b\ \xb1\x00\xfe\x10\x5b\x9b\x00\xb5\x17\x5e\xfd\xcd\x85\x79\xc0\x9c\ \xde\xf8\x19\xac\x8e\x97\xe0\xbe\x78\x1a\x50\x3f\x10\x8b\xe1\xfe\ \x78\x0b\x16\x17\xe2\x22\x60\xee\xaa\xbe\x88\x88\xc3\x0f\x4e\x06\ \xbe\x1b\x7d\xad\x98\x17\x85\x33\x71\x61\xf4\x54\x01\xcb\xe2\x70\ \x05\x92\x6d\x71\x1d\x3c\x15\xcf\x80\x64\xe5\x70\xc4\xc1\xf7\xb6\ \x0e\x47\x1c\x5c\x0e\xd2\x0d\xf1\x28\xbc\x1e\x8f\x22\xdf\x13\xe7\ \x01\x77\xc5\x2b\x70\x76\x0c\x4d\xc2\x49\x03\x71\x01\x78\x20\xe2\ \xd5\xa5\x15\xd4\xac\xd8\x16\x03\x97\x80\xaf\x47\x6f\x3d\xae\x8c\ \x8e\x0a\xfc\x27\xbe\x07\x3c\x15\xf7\xc0\x8a\x58\x07\x2b\x62\x53\ \x02\x97\x47\xdc\x9d\x00\x0d\x6f\xc6\x91\x56\x48\x77\xc7\xb5\xa8\ \x1d\x88\x05\x78\x30\xfe\x82\x94\x36\x07\x60\xae\xf7\x60\x89\xd7\ \xc6\x91\xfd\xdc\x93\xf7\x8c\x03\x3d\x97\x7c\x56\xff\x53\x28\x3f\ \xef\x72\x0c\x6e\x70\x21\x3e\x32\x0f\x29\xad\x3a\x61\x86\x5d\xb0\ \xd0\x7a\x58\xda\x16\x77\x01\x18\xbe\xd3\x15\x8d\xf0\xb2\xc5\x39\ \xfc\xd7\x3c\x7c\x60\x7a\x2d\xa9\xca\x5a\x1d\xd0\xa2\x03\x59\x8b\ \x4f\xe1\x4b\xde\xe8\x04\xe0\x85\x03\xf9\xcb\x60\xfd\x68\xcd\x39\ \xd8\xec\x2c\xec\x1c\x4d\xda\x49\x4d\xe4\x30\xd4\x1a\xc0\xe4\x54\ \x17\xb4\xf9\x08\x6a\x9e\xbe\x03\xca\xab\x2d\x87\xf8\xd8\x22\x7c\ \x6c\xfa\x89\x8c\xed\x35\x8b\x54\x8e\x12\xe4\x14\x51\xcb\x00\x54\ \x1a\x82\xf6\x4b\x57\x56\xc3\x9b\x16\x67\xf0\xa1\xd3\xb0\xeb\x78\ \xd2\x86\x5d\xda\x48\x8d\x53\x09\x05\x35\x18\xe2\x04\x18\x30\x09\ \xb6\x44\x7e\x1e\xac\x1b\xa9\x9d\x0b\x7b\xb4\xa1\xdc\xa1\x15\x3b\ \xb4\x91\x2a\x52\x05\xbd\x26\x61\x90\x7a\xd8\x68\x11\x14\x37\xf9\ \x1c\xc4\x16\xb3\x61\xaf\x36\xe8\x30\x15\xfb\x4c\x23\xd5\x47\x1e\ \x3e\x73\x0a\x06\xba\x9d\x01\xef\x3a\x27\x83\xad\xda\xc1\x76\xb3\ \x60\xb7\xe6\x3c\x3a\xb4\xe0\x90\xa9\xa4\x46\x86\xd5\xc3\x36\x73\ \x60\x93\x39\xf0\xc1\xd8\x84\x59\xb0\x53\x3b\xd8\x66\x36\x74\x4a\ \x9a\xd0\x65\x12\x3a\xb4\x54\x48\xe9\x34\x03\x36\x58\x94\xe0\x43\ \xf3\xa1\xd0\xe1\x54\xd8\xad\x1d\xec\x74\x1a\xf4\x8c\x69\x42\xaf\ \x06\xec\x97\x4d\x92\xb2\xcf\xa9\xf0\xbf\xf1\xa6\xb3\xf0\xbe\xcf\ \x27\xb0\xdf\x34\xd8\xae\xa5\x0e\xb6\x38\xa5\x06\xe5\x5e\x93\xd1\ \xa7\x01\x3d\x0f\x3d\xd1\x2d\x65\xb7\x99\x70\x6c\x9b\xa5\x58\xaf\ \xf1\x14\x38\x62\x32\xec\x29\x6a\x87\xbd\xd2\x93\xa0\x47\x1d\x06\ \xd4\xc2\xca\x1b\xcb\x52\xb6\x9b\x09\xd6\x99\x8f\xee\x43\xe6\xc0\ \x31\x13\xa1\xb8\x4f\x1b\x8c\xf4\x9b\x02\xa1\x12\x23\x72\x00\x29\ \x1b\xcd\xce\xc3\xbb\xe6\xc0\x27\xce\x82\x1e\x8d\xe0\xa0\x66\xd0\ \x65\x0a\x8c\xa8\xc2\xa8\x3c\x40\xca\x47\xa5\x9a\xf9\xb0\xdd\x34\ \xd8\xe4\x6c\xe8\x35\x11\x74\x6a\x02\xdd\x26\x41\xa8\x42\x51\x0e\ \x20\xa5\xb0\xd9\xf9\xd0\xa9\xba\x1e\xdb\xb5\x43\x9f\x89\xe0\x88\ \x66\xd0\xad\x09\x42\x25\x46\xe5\x01\x52\xbc\xe5\x7c\xe8\xa6\x11\ \xfb\x4d\x83\x1e\x0d\xa0\x4b\x33\xe8\xd6\x08\x65\x29\x46\x55\x02\ \xa4\x58\xe3\xbc\x3c\x62\x5c\x35\x0e\x98\xd0\x80\x1e\x0d\xe0\x98\ \x46\x30\x64\x02\x90\xa0\x28\x07\x90\xe2\xed\xc1\x9a\x29\x18\x1f\ \x51\x83\x83\x25\xad\x18\x56\x9b\xc0\xa0\x5a\x10\x26\xc0\xb8\x14\ \xa3\xf2\x00\x29\xe2\xd2\x6b\x0e\x40\x41\x35\x4a\x87\xb5\xa2\x20\ \xad\x84\x7e\xf5\x60\xd8\x04\x18\x97\x60\x4c\x9a\x00\x32\x58\x0f\ \x8c\x49\xa1\x63\xda\xc9\x28\x50\x7d\x1c\xfd\xea\x40\xa8\x81\x71\ \x90\x53\x1a\x07\xa4\x00\x18\x97\x42\x87\x16\x14\xa8\x81\x01\xf9\ \x2a\x18\x92\x87\x4c\x11\x99\x31\x80\x0c\x00\x65\x29\x74\x69\x44\ \x81\x1a\xe8\xa7\xfe\x38\x5e\x5d\xf5\x02\xe4\x15\x91\x29\x01\x64\ \x00\x28\x4b\xa0\x5f\x3d\x8a\xa5\xac\x1a\x0a\x54\x41\xf7\xb5\x20\ \x6f\x14\x99\x12\x40\x0a\x80\x71\x29\x0c\xa8\x87\x82\x6a\x28\x92\ \x03\x40\xde\x28\x2a\x94\x00\x52\x00\x94\xa5\xd0\xaf\x1e\x42\x0d\ \x14\xc9\x00\x90\x53\x44\x66\x0c\x20\x05\x40\x59\x0a\x23\xaa\x20\ \x54\xc3\x58\x59\x0e\xae\xec\xb9\x1a\xf2\x46\x91\x29\x01\xa4\x00\ \x28\x4b\xa1\x28\x07\x63\x72\xa0\x24\x07\xf3\xab\x17\x43\x5e\x11\ \xfb\x46\x36\x03\x64\x00\x28\x4b\x60\x54\x0e\xca\x2a\x40\x29\x9f\ \x83\x92\x0a\xc8\x19\xc5\x8e\x99\xfd\x00\x29\x00\xba\x75\x43\x51\ \x0e\xc6\x54\x80\x51\x39\x28\xc9\x20\x6f\x14\x8e\x95\x00\x32\x00\ \x7c\x6b\xc6\x3b\xd0\x6d\x18\x4a\x52\x90\x28\xc3\x98\x1c\x54\x1a\ \x05\x00\x32\x00\x74\x76\x82\xf7\xaf\xd8\x09\x63\x2a\x40\x4e\x09\ \xca\x12\xc8\x1b\x05\x00\x32\x00\x00\xbc\x0c\xc6\x64\x20\x53\x84\ \xb2\x14\xc6\x0c\x02\x00\x19\x00\x00\x80\x31\x29\xc8\x94\xa0\x2c\ \x81\x1b\xa7\x6f\x06\x00\x32\x00\x00\x00\x63\x2a\x20\x4d\x95\xa0\ \x2c\x85\x17\x01\x00\x52\x00\x00\x00\x45\x29\x64\x14\xa1\x28\x01\ \x00\x00\x19\x00\x00\x80\x3f\x27\xaf\x43\x8e\x12\xbc\xb6\xfc\x29\ \x00\x00\x00\x00\x00\x00\xa0\x2e\x62\x2a\x00\x00\x00\x64\x00\x00\ \x00\x00\x43\x1b\x72\x47\x00\x00\x00\xe0\xff\x49\x80\xbf\x36\x9e\ \xd0\xbb\x13\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x82\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\ \x00\x00\x02\xa3\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\xff\xff\ \x00\xff\x80\x00\x55\xaa\xaa\xff\xaa\x00\x80\x80\xbf\x66\x99\xcc\ \xff\xcc\x00\x80\x80\xaa\xff\xaa\x2b\x6d\x92\xb6\xdb\xb6\x24\xdf\ \xbf\x20\xe3\xc6\x1c\x80\x80\xb3\xe6\xb3\x1a\x74\x8b\xb9\xea\xbf\ \x15\xeb\xb1\x14\x6d\x80\xb6\xed\xb6\x12\xee\xbb\x11\x70\x80\xbf\ \xef\xbf\x10\x78\x87\xc3\xf0\xb4\x0f\xf2\xbc\x1b\xe8\xb9\x17\x6f\ \x85\xbc\xe9\xbc\x16\xea\xbf\x15\x70\x85\xc2\xeb\xb8\x14\xeb\xba\ \x14\x71\x84\xbd\xec\xbd\x13\xed\xb6\x12\xed\xb9\x12\xee\xbb\x1a\ \x73\x84\xbd\x70\x80\xbf\xe7\xb7\x18\x74\x83\xc1\xe9\xbc\x17\x71\ \x80\xbf\xea\xb8\x15\xea\xba\x15\xeb\xb7\x14\x73\x86\xbf\xec\xb9\ \x13\x70\x83\xc1\xed\xbc\x18\x71\x82\xbe\xed\xb8\x18\xe9\xbc\x16\ \xe9\xb8\x16\xea\xba\x15\x73\x82\xbe\xeb\xba\x14\xec\xbc\x18\x71\ \x84\xbd\x72\x84\xbd\xea\xbb\x15\xea\xb9\x15\x71\x82\xbe\xeb\xba\ \x14\xeb\xbb\x18\xeb\xb8\x18\x74\x83\xbd\xec\xb9\x17\x75\x83\xbd\ \xe9\xbb\x16\xea\xbc\x15\xea\xba\x15\x72\x83\xbf\xeb\xba\x17\xec\ \xba\x16\xec\xbb\x16\xea\xb9\x15\xeb\xba\x17\x74\x82\xbe\xeb\xbb\ \x17\x73\x84\xbf\x73\x84\xc0\xec\xba\x16\x72\x82\xbe\xec\xb9\x15\ \x74\x83\xc0\xea\xbb\x15\x72\x82\xbe\xea\xb9\x17\xeb\xba\x17\xeb\ \xbb\x17\xeb\xb9\x17\xeb\xba\x16\xeb\xba\x16\x73\x82\xbe\xec\xb9\ \x16\xec\xba\x15\xec\xbb\x15\xea\xbb\x15\x73\x83\xbf\xeb\xbb\x17\ \xeb\xb9\x17\xeb\xba\x16\x72\x84\xbf\xec\xba\x16\x73\x84\xbf\xea\ \xba\x17\xea\xbb\x17\xeb\xba\x16\xeb\xbb\x16\x74\x83\xbf\xeb\xb9\ \x16\xeb\xba\x16\x73\x82\xbf\xec\xbb\x15\xec\xba\x15\xea\xba\x17\ \x73\x82\xc0\xeb\xbb\x16\xeb\xba\x16\x74\x82\xc0\xeb\xba\x16\xeb\ \xbb\x16\xeb\xb9\x15\xec\xba\x15\xea\xba\x17\xeb\xba\x16\x72\x83\ \xbe\xeb\xb9\x16\xeb\xba\x15\xeb\xba\x15\x73\x84\xc0\xeb\xba\x16\ \xeb\xbb\x16\x73\x83\xc0\xec\xba\x16\xec\xb9\x16\x73\x83\xc0\xea\ \xba\x16\xea\xba\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xbb\x15\xeb\xba\ \x17\x74\x83\xc0\xeb\xba\x17\xeb\xba\x16\x74\x83\xbf\xeb\xb9\x16\ \xec\xba\x16\x73\x84\xbf\x73\x83\xbf\xeb\xba\x16\xeb\xba\x16\xeb\ \xbb\x16\xeb\xba\x16\x72\x83\xbf\xea\xb9\x16\x73\x83\xbf\xeb\xba\ \x15\xeb\xba\x17\x73\x83\xbf\xeb\xba\x17\xeb\xbb\x16\x73\x83\xbf\ \xeb\xba\x16\x73\x83\xbf\xeb\xb9\x16\x73\x83\xbf\xea\xba\x16\xeb\ \xba\x16\x73\x82\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\ \xbf\xeb\xba\x16\xeb\xba\x16\xec\xba\x16\xeb\xba\x16\x73\x83\xbf\ \xeb\xba\x15\x73\x83\xbf\xeb\xba\x16\x73\x83\xc0\xeb\xba\x16\xeb\ \xba\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\x16\x74\x83\xbf\xeb\xba\ \x16\xeb\xba\x16\x73\x83\xbf\xea\xba\x16\xeb\xba\x16\x73\x83\xbf\ \xeb\xba\x17\xeb\xba\x16\xeb\xba\x16\x73\x83\xc0\xeb\xbb\x16\x73\ \x83\xbf\xeb\xba\x16\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\ \xbf\xeb\xba\x16\x73\x83\xbf\x73\x83\xc0\xeb\xba\x16\x73\x83\xbf\ \xeb\xba\x16\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\xeb\xba\x16\x73\ \x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x26\x1c\x4a\x81\x00\ \x00\x00\xdf\x74\x52\x4e\x53\x00\x01\x01\x02\x03\x03\x04\x05\x05\ \x06\x06\x07\x07\x08\x09\x0a\x0a\x0b\x0c\x0d\x0e\x0e\x0f\x10\x10\ \x11\x11\x13\x16\x17\x17\x18\x19\x19\x1a\x1b\x1b\x1c\x1d\x1e\x1f\ \x20\x20\x21\x22\x24\x24\x25\x27\x28\x28\x29\x2a\x2b\x2b\x2e\x2f\ \x30\x33\x34\x35\x36\x3a\x3c\x3e\x3f\x3f\x40\x41\x42\x42\x46\x47\ \x48\x4a\x4c\x4e\x51\x52\x54\x59\x5a\x5a\x5b\x5d\x5d\x5e\x5f\x61\ \x61\x62\x63\x64\x65\x66\x67\x68\x6a\x6a\x6b\x6c\x6d\x6f\x70\x71\ \x73\x74\x76\x78\x7a\x7b\x7d\x7f\x80\x80\x82\x83\x83\x85\x86\x89\ \x8a\x8c\x8d\x8d\x8e\x8f\x90\x93\x98\x9a\x9a\x9b\x9c\x9d\xa2\xa4\ \xa9\xab\xac\xad\xad\xae\xb0\xb1\xb3\xb4\xb5\xb5\xb6\xb7\xb7\xb8\ \xba\xbb\xbc\xbd\xc2\xc3\xc4\xc6\xc7\xca\xcb\xcc\xcc\xcd\xce\xce\ \xcf\xd1\xd2\xd3\xd4\xd7\xd9\xda\xdb\xdc\xdd\xde\xdf\xe1\xe2\xe2\ \xe3\xe3\xe5\xe5\xe6\xe7\xe8\xe9\xea\xea\xeb\xec\xec\xed\xee\xee\ \xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf6\xf7\xf7\xf8\xf9\xf9\xfa\xfa\ \xfb\xfc\xfc\xfd\xfe\xfe\x98\x6d\x2b\x14\x00\x00\x02\xaf\x49\x44\ \x41\x54\x58\xc3\xed\xd7\xe9\x5b\x4c\x61\x18\x06\xf0\xdb\x4c\x59\ \x26\x8d\xa5\xc5\x98\xec\xb2\x6f\xd9\xf7\x2d\x5b\x42\xf6\x25\x43\ \xd9\x77\xd9\xb2\x8b\x90\x2d\xfb\x1e\xd9\x89\xec\xa2\xb2\xa6\x14\ \x49\x22\x94\x84\x9a\xf7\xfe\x53\x7c\x70\xf5\x61\x3a\xaf\x39\x67\ \xce\x7c\xd4\xf3\xfd\xfe\x5d\xe7\x5c\xe7\xbd\xde\xe7\x3e\x40\xd5\ \xfc\x1f\xd3\x69\x50\x75\xb7\xf2\x2b\xca\xc5\x2d\x5f\xfd\xf1\x6a\ \x9b\x84\x10\x62\xae\xee\xbc\xc7\x2e\x21\x84\x10\xd1\x7a\xf3\xb5\ \x0e\x08\xb7\x80\x3a\x67\x84\x02\x88\x3b\x6b\xd5\x9c\x6f\x70\x59\ \x28\x00\x43\x1e\x2f\x99\x35\xe6\x1b\xdf\x16\x4a\x00\xa1\xa5\x3c\ \x62\xd0\x94\x6f\xfb\x48\xc8\x00\x4c\xb5\x73\xa9\x96\x7c\xf7\xe7\ \x42\x0e\x20\x86\xa5\x03\xd4\xf3\xfd\xde\x08\x09\x30\xb8\x3d\x00\ \xd3\x35\x26\x7b\xaa\xe5\x87\x7e\x14\x12\xa0\x37\x73\x7b\x00\xe8\ \x55\xca\x79\x2a\xf9\x31\x5f\x84\x0c\xb0\xa4\x31\xbd\x11\x80\x18\ \x66\xd5\x75\x9a\x9f\xfc\x43\x28\x01\x03\x80\xa0\x1c\x26\x18\x01\ \xff\x7c\x2e\x74\x12\xaf\xb1\xac\x5c\x28\x01\x9f\xb4\x24\x1f\x60\ \xb4\x9d\x11\x00\x36\x33\xcd\x58\x29\x35\xe5\xc1\xfb\x8a\x29\x16\ \x42\x02\x04\x14\xf0\xa8\x11\x88\x65\x8e\x15\x08\xfc\xcd\x61\x8e\ \xf9\xae\xbf\x84\xb3\x89\x06\x10\x66\x67\x14\x60\xc9\xe6\x2a\x00\ \x89\x8c\xab\xf4\x00\x42\x15\xc0\x3a\x7e\x6e\x0a\xac\x64\xb6\x09\ \xb0\xf1\xb5\xe3\x71\x9c\xa1\x01\x30\xa5\x32\x16\xb0\x16\x71\x2c\ \xd0\x9a\xec\xe6\x32\x80\x70\x16\x9a\x81\xc3\xdc\x07\xe0\x09\x23\ \x5c\x07\xcc\x85\x0c\x05\x6c\x7c\x01\x20\x9e\xdb\x5d\x07\x70\x9c\ \xb1\x40\x17\xb2\x05\xb0\x81\x27\x74\x00\x51\x4c\x00\x8c\x45\x1c\ \x02\xd8\x78\x5f\x07\x60\xe3\x1d\x00\x29\x9c\x00\x8c\x67\xba\x0e\ \x20\x8c\xcf\x00\x24\x33\x02\x08\x61\x9e\x0e\x20\x92\x37\xdd\x03\ \x56\xf3\x14\x80\x14\x4e\xd2\xfb\x0a\x89\xdc\x02\x18\x8b\x18\x0c\ \xd8\x78\xcf\x75\xc0\xaf\x84\xc3\x81\xce\x64\x20\xb0\x51\xcf\x67\ \x5c\xcc\xfc\x9a\x40\x38\x33\x74\x1e\xa4\xfa\x99\x5c\x0f\x20\x9e\ \xfb\x01\xa4\x72\xb6\xe3\x1d\xa4\x01\xd8\xc9\x5c\x0b\xe0\xff\x95\ \xe3\x80\x36\x64\x90\x03\xd0\xae\x58\x15\x88\x24\x23\x01\x2c\xe7\ \x3b\x6f\x60\x16\x33\x2a\xdd\x48\xa3\xce\xdf\xa8\x98\xa7\x52\xa0\ \x49\x09\xf7\x00\xf0\xcb\xe4\x5a\x00\x89\xdc\xed\xe4\x52\x9c\xf8\ \x5d\x02\x98\xaf\x1c\xab\x0d\x60\x1b\x73\x03\x80\x56\x65\x0c\x76\ \x76\x2b\x8f\xf8\x24\x3f\x07\xc0\xc8\x32\xce\x97\x5f\xaa\x8e\x33\ \xf0\xad\x1c\xe8\x98\xc9\x0b\x46\xc0\x5a\xc0\x05\x2a\x9b\xa5\xe7\ \x4b\x19\xe0\xf3\x90\xaf\x9a\x03\xd8\xce\x2c\xd5\x15\xdf\xe1\xb1\ \x04\xe8\xcb\xfc\x3e\x7f\x57\xdb\x1c\xf5\xed\xda\xec\xae\xe4\x15\ \x42\x82\x00\x98\xae\x33\xc9\x53\xc3\x7e\x6f\x78\xf5\x1f\xeb\x7d\ \x07\x4b\xfa\x6b\x6a\x18\xf5\xce\x49\x81\xe9\x76\x2e\xd1\xd8\x71\ \xbc\x0e\xc9\x2a\xce\x4f\x1e\x34\x68\x6d\x59\x1e\x7b\x95\x25\xeb\ \x03\x2f\x7a\xbb\xd0\x53\xb7\x2a\x6b\xde\x69\x8b\x4b\x55\x71\x8d\ \x7b\x4d\x15\xc0\xa2\x72\x21\xc4\x4c\x77\xda\xfa\xb4\x6f\xe2\xa4\ \x97\x5b\x7d\xdf\xb7\x65\xd5\x3f\x53\xd5\xa8\xcd\x1f\x24\x0f\xbd\ \x6f\xe9\x21\x0b\x98\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x06\xdb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x06\xa2\x49\x44\x41\x54\x78\xda\xed\x9a\x6b\x6c\x14\x55\ \x14\xc7\x57\x34\x2a\x4a\xd0\xf8\x42\x9e\x6a\x22\x1f\x8c\x26\xc5\ \x47\x44\xbe\xe9\x07\x03\xc4\x07\x06\xe8\x03\x9b\x26\xea\x07\x43\ \x78\xf4\x8b\xc4\x86\x8a\x1a\x8d\x56\x13\x23\x84\x97\x58\xc1\x68\ \xfc\x04\x45\x11\x63\x50\xd3\x44\x1a\x45\x9a\x4a\x77\x3b\x3b\x3b\ \x1d\xba\xdd\x3e\xb6\x76\x1f\x77\x96\x05\xda\xd2\x86\x52\xdb\xed\ \xf5\x9c\x7d\xb5\x5d\x76\x66\xef\x9d\xc7\x76\x26\x71\x92\x93\x6c\ \x76\x66\xef\x9c\xdf\x7f\xce\x3d\xe7\xdc\x3b\xeb\x72\x71\x1c\x6e\ \x51\xda\xd1\x2a\xfa\xf6\xb8\x6c\x7e\x28\x8a\x72\x5f\x98\x90\xd3\ \xe1\x70\x78\x85\x69\x83\xba\xbd\xbe\x1a\x30\x8a\xe6\xf1\xfa\x76\ \xdb\x15\x3e\x16\x8b\x2d\x88\x10\xd2\x0e\x02\xd0\xb0\xa2\x0c\x84\ \x63\xb1\x55\x86\x07\x6d\x15\xc5\x4d\x19\xf8\x69\xf6\xb9\xad\xe1\ \xa7\x2c\xde\x17\x8f\x2f\xd4\x3d\x68\x4b\x4b\xd7\x7c\x80\xbd\x94\ \x47\x00\xb4\x4f\xed\x02\xdf\x1f\x8f\x2f\x02\x58\x7f\x0e\x7c\xc6\ \x1a\xf4\x87\xbe\x20\xbd\xa0\x02\x9f\x32\x41\xac\xb3\x09\x7c\xa7\ \x0a\x3c\xda\x28\xa5\xf4\x06\x5d\x83\x7b\xbc\xde\xd5\x9a\x02\x60\ \x4e\x10\xa5\x8f\x66\x0b\x3e\x14\x0a\x2d\x2e\x00\x8f\x36\xac\x5b\ \x00\xb7\xdb\x7d\x1b\x40\xc6\x0a\x89\x00\xf6\x61\xb1\xe1\x21\xcb\ \x2f\x09\x47\xa3\x81\x02\xf0\x68\xdf\x1a\x4b\x82\x82\x6f\x1d\x83\ \x00\x18\x09\xef\x17\x15\x9e\x90\x2e\x06\xf8\x38\x96\x45\xc3\x37\ \x84\xd2\xf7\x35\x8b\x08\x60\xef\x59\x0d\x1f\x89\x44\x96\x32\xc2\ \x27\x42\x84\xac\x35\xe5\xa6\x4d\xc1\xe0\xad\x00\xe7\x61\x14\xe1\ \x5d\x8b\xe1\xbb\x19\xe0\x29\x94\x44\x73\x23\xd2\xe3\x91\x1f\x06\ \xb8\x01\x46\x11\x76\xcd\x26\x3c\xe4\x86\x46\x48\x7c\x37\x9a\xfe\ \x04\x3c\xa2\xf8\x12\xc0\x4d\xb2\x88\xd0\x2a\x88\xef\x98\x75\xdf\ \x68\x34\xba\x8c\x19\x9e\x90\x3e\xb8\xfe\x1e\xcb\xe6\x20\xd4\xfe\ \xcf\x18\xa3\x00\x12\xa3\x58\x6b\x12\x7c\x0f\x23\xfc\x28\x5c\xff\ \xa4\xa5\x49\xa8\xa9\xa9\xe9\x26\xa8\x0c\x7f\xb0\x8a\x00\x8b\xa8\ \x9d\x45\x82\xa7\x11\x45\x79\xa3\x28\x65\xa8\x45\x92\x16\x00\x5c\ \x94\x59\x04\x58\x4c\xe9\x80\x7f\x00\xb2\x78\x2f\x2b\x3c\x2c\x7e\ \xea\x8b\xda\x88\xb4\x0a\xd2\xb3\x00\x36\xce\x2a\x02\x44\xcd\xdb\ \x16\xc2\x0b\xd0\x15\xce\x2d\x7a\x2b\x8a\xe1\xcd\x11\x05\x90\x3c\ \xa5\xed\x2c\xf0\x00\x15\x64\x86\x27\xe4\x12\x34\x3b\x0f\xcd\x4a\ \x2f\x8e\x3d\x36\x80\x9d\xe0\x11\xa1\xd5\xeb\xdb\xa6\x36\x1e\x21\ \xe4\x41\x4e\xf8\x44\x28\x1a\x5d\x33\xab\xab\x31\x41\x10\xee\x04\ \xb0\x1e\x1e\x11\x3c\x82\x6f\xeb\x75\x0b\x9b\x0b\x17\x96\x03\x50\ \x88\x03\x1e\xeb\xfd\x2e\x97\x1d\x8e\xb6\xb6\xf6\x12\x00\xbb\xca\ \x35\x1d\x04\x71\xcb\x0c\x78\x45\x09\x73\xc1\x13\xf2\x33\x44\xe0\ \x1c\xdb\xec\xc8\xc0\x7a\xe1\x4d\x0e\x01\xb2\x22\xe8\x84\xef\x83\ \x05\xd1\xdd\xb6\xdb\x93\x03\xa8\x6f\x78\x45\x08\xf4\x06\x07\x38\ \xe1\xb1\xd9\x79\xc2\x96\x9b\x92\xcd\xcd\xcd\x73\x01\xaa\x8d\x53\ \x04\x0a\x22\x30\x0b\x00\x8b\x9c\xd7\x6d\xbd\x2d\x0d\x49\x71\x39\ \x40\x0d\xf2\x8a\xd0\xc5\x26\xc2\x17\x2e\x27\x1c\xe9\x4d\x94\x49\ \x6e\x11\x82\x9a\x22\xfc\xdd\xd5\xd5\x75\x8b\xcb\x29\x07\xbe\x44\ \xe1\x15\xc0\x23\x4a\x20\x42\x5f\xde\x66\x07\x7b\x04\x97\x93\x0e\ \x5c\x34\x41\xe7\x77\x26\x1f\xe8\xb9\x36\x2f\x6d\x38\x71\x92\x1e\ \x38\xf4\x15\x3d\x78\xa8\x9e\x1e\x87\xcf\xf8\x5d\x46\x84\xee\x99\ \x22\x24\xfa\xa3\xd1\xd5\x2e\x27\x1e\xe7\x64\xf9\x7e\x80\x22\xb9\ \x02\x20\xf0\xee\xbd\xfb\x67\x18\x7e\x37\x3d\x12\xb2\x22\x28\xca\ \x4e\x97\x93\x0f\xb9\x23\xf0\x5a\xae\x00\xf8\xe4\x73\x05\x38\x00\ \x91\x90\x3b\x1d\x02\xdd\x3d\x1e\xdd\x5b\xda\x76\x38\xa0\x5e\x3f\ \x02\x65\x8b\xf8\xbb\x7b\x66\xc0\x61\xd8\xe7\x0a\x70\xf0\xcb\xfa\ \x7c\x79\x61\x02\x5f\xcd\x39\x12\x3e\x1c\x8b\x95\xe0\xb6\x74\x66\ \x2e\x4b\xe7\xfd\xda\x53\xe0\xc7\x9f\xd4\x92\x23\x8a\x50\xe1\x68\ \x78\x34\x58\xb5\x51\xaf\x24\x67\x93\x20\x8a\x80\x91\x90\x9b\x04\ \x1d\x2f\x02\xbe\x97\xcf\x85\xcf\x58\xb0\x3f\x44\x79\x4b\xe3\x34\ \xfb\xd7\x2d\xf8\x5e\x71\x02\xfc\x45\xad\x6e\x2e\xd0\xd3\x6b\x48\ \x04\x6c\xb2\x1c\x0b\x9f\x31\xd9\x1f\x30\x22\xc2\x18\x4c\x87\x97\ \x6d\x05\x1f\x89\x44\x1e\x67\x85\xcf\xe6\x83\xf6\xf3\x86\x44\xc0\ \x77\x14\x8e\x84\xcf\x18\x2c\xe8\x69\x9b\x4f\x72\xb6\x08\xb8\x2e\ \xc7\x3e\x9d\x17\x3e\x63\xd8\xed\x19\x10\x20\x25\x82\x57\x7a\xd1\ \x91\xf0\xe9\x3d\xbd\x80\xe0\x6b\xaf\x37\x28\xc2\x35\xfc\x27\x4b\ \x51\xe1\x61\x71\xf2\x14\x00\x0c\x1a\x82\x27\x64\xa4\x5f\x51\x1e\ \x93\x65\xf9\x66\x80\x68\x31\x28\xc2\x55\xb7\xb7\xfd\x39\x73\xb7\ \xbc\x2b\x2a\x96\xd2\x8d\x1b\xb7\xd3\xd2\xd2\xdf\xc0\xfc\x60\x23\ \x69\xf3\x8f\xd5\xd4\x5c\x19\x38\x76\x8c\x92\x8e\x0e\xdd\x02\x84\ \x14\xe5\xd5\xec\x56\x9a\x5b\x5e\x06\x2b\xc7\x38\x0f\xb4\xef\xcf\ \xbf\x68\xff\xe1\x23\x74\xa8\xa6\x86\x8e\x6e\xde\x4c\x13\x9b\x36\ \x4d\x66\xfc\x4b\xfb\xbc\x0d\x19\xf8\xc1\x4b\x4b\x17\x83\xd5\x83\ \x8d\x83\x51\x4d\x2b\x2b\xa3\x57\xeb\xea\x28\x91\x65\x2e\x78\x58\ \x1f\xec\xbb\x6e\x53\x55\x14\xd7\x00\x58\xa2\x10\xb8\x78\xe6\x2c\ \x8d\xd7\x7d\x42\x27\xcb\xcb\x69\x41\xff\x4a\x4b\x13\xe0\x63\x03\ \x08\xc1\xb6\x97\x00\x4f\x7c\x1d\xfc\x68\x98\x61\xe0\x19\x36\x59\ \x55\x45\x2f\x36\x36\xb2\xce\xfb\xb3\x18\xf6\x2a\x9b\xaa\x1f\x68\ \xc1\x77\x37\x1c\xa7\x89\xca\x4a\xca\xeb\x1f\xd8\x15\x30\xed\xde\ \x01\x94\xaa\x4e\x2a\xc6\x3f\x78\x36\x1a\x06\x8f\x1e\x2d\x24\x80\ \x82\xff\xec\xd2\x78\xd3\x34\xa7\xd5\xeb\xfb\x35\x1f\x3c\x86\x3b\ \xde\x43\xb7\x7f\xa9\x68\xa8\x56\x7b\xf2\x6b\xe1\x82\x09\x03\x83\ \x67\x45\xd0\x88\x84\x89\x48\x2c\xf6\x7c\xc1\x9d\x65\x59\xbe\x0b\ \x80\x83\x33\xf6\x0a\xbf\x3f\x41\x27\x8d\xc1\x4f\x89\x90\x1b\x09\ \xe9\x39\x3f\x6c\xc2\xe0\xd9\xe9\x40\xfc\xfe\x7c\xf3\x7e\x07\xfb\ \x4b\x57\x71\x25\xd6\xf8\xcc\x9c\xd7\x19\xf6\xea\xd3\xa1\xa2\x62\ \xd1\x74\x01\x8e\x68\x5c\x7c\x0d\xa2\x63\x2f\xdd\xb0\x61\x25\xad\ \xaa\xba\x3d\x69\xf8\xb9\xac\x6c\x5f\xf2\x9c\xca\xef\x46\xf6\xec\ \xc9\x6d\x7d\x4f\xf2\xee\xec\xb8\x45\xa9\x1a\x05\x88\x7f\x5c\x47\ \xcd\xf6\x0f\xce\x1f\x9e\x2a\x75\xea\xa1\x1f\xa6\xe5\xe5\x25\x1a\ \xd5\x62\x45\xf2\x9a\x7c\xbf\x85\x0c\x3d\xad\x44\x76\xf6\x5c\xbe\ \x7c\x87\x9e\x52\xdc\xfe\xfb\xe9\x1f\x34\x42\x5f\xbf\x7f\xc8\xbc\ \x7e\xfd\x12\x57\xb2\x56\xaa\x29\xab\x31\x78\xce\x4d\xf2\x2a\x3d\ \xd0\xd0\x90\xfc\x9b\xea\x3f\x84\x3c\xaa\xb7\x17\x49\x54\x55\xbd\ \x65\x95\x7f\x10\x05\x5b\xf1\x82\x5f\xf2\x9e\x84\xb0\xe2\xe8\x1b\ \xf6\xe7\x1b\x63\xac\xb6\x76\xc4\xe8\xbb\x7b\x2b\xfd\x03\x3b\x85\ \x27\x3b\x55\x4e\x3e\xcd\x7c\x83\xf2\xf2\x67\x54\xc6\xf0\x1b\xee\ \x46\xad\xf6\x4f\x23\xfb\xcf\xe3\x70\x72\x9e\xca\x18\xc3\x26\x08\ \x60\xad\x7f\xe9\x0e\xc9\xd8\x0d\x2a\x2b\xe7\xab\x8c\x31\x64\x82\ \x00\xd6\xfa\xf7\xff\x14\x50\x4b\x32\x50\x47\x4d\x49\x32\xc6\x05\ \xb0\xd6\x3f\x2c\x05\xaa\x65\x06\x4a\x08\x63\x99\x19\x53\xc9\xd4\ \x5b\x0c\x0b\x60\xb5\x7f\xd8\x0c\x68\x36\x42\x1a\x37\x29\xd0\x68\ \x8c\x27\x1b\x0d\xa3\x02\x14\xc3\x3f\x6c\x0b\x35\x5a\xcd\xb1\x64\ \x08\xa5\xe6\xd1\xbc\xb4\xad\x4a\x87\xd5\x98\xc6\xef\x4c\xfb\xdb\ \xaa\xe5\xfe\xe1\xc2\x40\x23\xdb\xea\xb1\x21\x50\x77\xa1\x69\x02\ \x14\xc3\x3f\xd3\x96\xc3\xa9\x35\xb7\xe9\x5b\xd5\x45\xf1\x2f\xbd\ \xff\x97\x30\x34\x38\x8c\x61\xd5\x46\x6c\x51\xfc\x43\x75\x74\x86\ \xdb\x10\x0c\x6e\xf9\xfe\x7c\x51\xfc\x83\x8b\xef\x4d\xae\xb1\x59\ \x36\x45\x53\x4f\xe4\x3b\x33\xe7\xbc\x6d\xfc\x4b\x96\xa0\x54\x1d\ \xc6\x66\xa4\x23\xdd\x97\x0f\xa7\x3f\x9f\xc2\x3a\x6a\x46\xa9\x33\ \x54\x22\x0d\xfa\xf7\x1f\xc6\xaa\x39\x63\x11\x77\xd8\x50\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x33\x35\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5c\x72\xa8\x66\ \x00\x00\x32\xfc\x49\x44\x41\x54\x78\xda\xec\xdd\x03\x8c\x25\x59\ \x18\x05\xe0\x7f\x6c\xbb\x6e\xad\x6d\xab\x5e\xf5\xda\x66\xbc\x88\ \x3a\x1c\xbe\xd2\xb8\x92\x57\xd5\x58\x23\xea\x68\x19\xad\x6d\xdb\ \xb6\xa5\x27\x8c\x5a\xba\x7b\x1b\x77\xa5\x16\x4a\xe7\x4b\x4e\x8c\ \xc5\x9c\x93\xf9\xef\xa0\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x62\xc0\x66\x75\x07\x58\xcc\x5f\x4f\x7d\xc8\x1b\xa9\xf5\xd9\ \x55\xfa\x01\x04\x00\xd1\xb7\x52\x75\xe7\x3a\x4a\xcd\x75\x36\xf3\ \xdb\x6d\x56\xf3\x44\x3f\x06\xe0\x09\x91\x8e\xbc\xa1\xdd\x92\x5d\ \x7e\xc4\x22\x02\x80\xe8\xa9\x3e\xa4\x61\x82\xad\xfa\xcb\x45\xf1\ \xcb\x22\xbc\x2b\x03\x18\x00\xde\x9b\x2d\x79\x43\x77\xbf\x58\x7a\ \xda\x24\x02\x80\x68\x70\x94\xcc\x89\xa2\xfc\x1f\xc9\xe2\x0f\x61\ \x00\x64\xbe\xc8\x99\xfa\x45\x04\x00\xe1\x65\x29\x99\x3d\x2c\xe6\ \x3d\x24\x0b\x3f\x8c\x03\x20\xf3\x54\xd6\xa8\xda\x9f\x00\x20\x94\ \x77\x7e\x9b\x08\x1f\xc1\x01\xe0\xf2\x7d\xe0\x57\x43\x5b\x48\x00\ \x10\x1c\x97\xdc\xf1\x8e\xea\x57\x8b\x72\xe7\x64\xc9\x47\x61\x00\ \x64\x4a\x05\x43\xb7\xb9\xbb\xcf\x44\x02\x80\xd1\xbf\xf3\x2d\xe6\ \x7f\x20\xcb\x1d\xc0\x00\xc8\x7c\x86\xf7\x01\x80\x51\xb2\x9a\xd5\ \xec\xee\x30\xef\x01\x59\xea\x10\x0c\x80\xcc\x13\x25\x43\xdb\x97\ \x00\x60\xf8\x39\xdb\xd7\xce\xb1\x14\xbf\x4e\x14\xb9\x45\x84\x87\ \x6c\x00\x64\xda\xf2\xa6\xd6\xf0\xcb\xea\xaa\x05\x04\x00\xc3\x72\ \xe7\x8f\x15\xe5\xbd\x44\x94\x37\x2b\x8b\x1c\xe2\x01\x90\x29\xe6\ \xd2\xfa\x72\xee\x1e\x3b\x9e\x00\x60\x70\x1c\x96\x39\xde\x61\xfe\ \x7b\xb2\xc0\x11\x1a\x00\x99\x4f\x73\x66\xea\x74\x02\x80\xfe\x33\ \xd5\xcc\x6e\xa2\xac\xb7\xcb\xe2\x46\x78\x00\x64\x9e\x28\xda\xa9\ \x7d\x08\x00\xfe\x9b\xbb\xc0\x9d\xee\xa8\xbe\x2b\xca\xda\x2c\xc2\ \x63\x32\x00\x32\xad\x05\x43\xbf\xae\xbc\xe2\xd8\xd9\x04\x00\xff\ \x76\xe7\xfb\xbf\xca\xb2\x46\x7c\x00\xfa\x7e\x1f\xb8\xe8\xa2\x71\ \x04\x90\x74\x8e\x9a\x39\xd6\x66\xde\xbb\xb2\xa4\xf1\x1f\x00\x19\ \xfd\xe3\x9c\xa9\x9f\x4a\x00\x49\xb4\x56\xf1\xb6\x73\x98\x77\x8b\ \x2c\x67\xe2\x06\x40\x26\xad\x3d\x90\x35\xb5\x5d\x08\x20\x09\x8c\ \x45\x57\x4c\xeb\xbd\xf3\x9b\x44\x78\x72\x06\xa0\xef\xf7\x81\x92\ \x7d\xc8\x2c\x02\x88\x27\x3e\xa6\xfb\xce\x57\xbc\x5f\x64\x21\x31\ \x00\x7f\x4d\xce\x48\x15\xf0\x3e\x00\xb1\xb3\x5a\xad\x39\x42\x14\ \xf0\x15\x59\x44\x0c\x40\x9f\x79\x3b\x97\xd6\x8e\x26\x80\x28\xb3\ \x58\xbd\xda\x7b\xe7\x77\x8a\x70\x0c\xc0\xc0\xdf\x07\x7e\x35\x8e\ \xde\x89\x00\xa2\xc4\x55\xdc\xa9\xbd\x77\x7e\xa3\x2c\x1f\x06\x60\ \xd0\x69\xe9\x7a\x1f\x28\x2e\x3d\x62\x26\x01\x84\xfd\xce\x77\x98\ \x77\x91\x28\xdb\x77\xb2\x74\x18\x80\x61\xcb\x4f\xf9\xb4\x5e\xcd\ \x5d\x1a\x4b\x00\x61\xe3\x6c\x57\x7b\x98\x28\xd9\x4b\xb2\x6c\x18\ \x80\x11\xcb\x9b\xb9\xb4\xae\x13\x40\x18\xac\x55\x3d\x36\xaa\x77\ \x3e\x06\x80\xcb\xf7\x81\x5f\x9c\x23\x77\x24\x80\x00\xef\x7c\x5b\ \x14\x6b\x8b\x2c\x18\x06\x60\xd4\xd3\x98\x33\xb4\xba\xbc\x95\x9a\ \x41\x00\xa3\x7c\xe7\x7f\x23\x8b\x85\x01\x08\x3c\x3f\xe2\x7d\x00\ \x46\x9c\xb3\xa4\xf6\x10\x51\xa4\x17\x64\xa1\x30\x00\xa1\xcb\xeb\ \xd9\x55\x47\x69\x04\x30\x9c\xac\xed\xea\x15\x8b\xf9\x0d\xa2\x44\ \x1d\x22\x1c\x03\x10\xea\x74\x16\x8c\xd4\xed\xe5\xb4\xb6\x03\x01\ \x0c\x85\xbb\x8f\x3b\xb1\xf7\xf3\x5a\x9b\x65\x89\x30\x00\x91\xc9\ \xb6\xbc\xa1\xbb\x3f\xac\x3c\x6a\x0a\x01\x0c\x94\xad\x78\x67\x89\ \xf2\x7f\x2d\xcb\x83\x01\x88\x6a\xf4\x1f\x0a\xa6\x7e\x09\x27\x1a\ \x43\x00\x7d\x31\x15\xff\x60\x5b\xf1\x9f\x93\xa5\xc1\x00\xc4\x24\ \x69\xfd\xb5\xa2\xa1\x1d\x45\x00\xff\x26\xad\xb8\xf3\xe5\x67\xb4\ \x45\x38\x06\x20\x96\xe9\xec\xfa\xac\x59\xce\x3c\x76\x31\x01\xfc\ \xf9\x33\xda\x22\x9b\x02\x28\x25\x06\x20\x98\x6c\xed\x7a\x1f\xf8\ \xc6\x3d\x76\x32\x41\xc2\xef\x7c\xe6\x7f\x19\x50\x21\x31\x00\xc1\ \xe7\xfb\xae\xf7\x01\x82\x64\xb1\x96\x64\xf6\xb2\x14\xef\x91\x3e\ \x0a\x83\x01\x48\x4e\x9e\xc9\x99\xda\x81\x04\xb1\xff\xae\xde\xbc\ \x00\xee\x7c\x0c\x40\x04\x22\x3f\x7b\x9e\x5d\x7e\xc4\x22\x82\x98\ \xde\xf9\xcc\xaf\x04\x50\x3c\x0c\x40\xb4\xb2\xa5\xeb\x7d\xe0\x8b\ \xa5\xa7\x4d\x22\x88\xc7\x67\xb4\x45\xf9\x3f\x1a\x60\x59\x30\x00\ \xc8\x17\x11\xfe\xec\x39\xac\x56\x6a\xf6\xb4\x98\xf7\xd0\x10\x4b\ \x83\x01\x40\x9e\xca\x1a\x55\xfb\x13\x44\xc3\x4a\xd5\x9d\xdb\x7b\ \xe7\xb7\xa1\xf0\x18\x80\xe1\x7c\x1f\xf8\xd5\xd0\x16\x12\x84\xf7\ \xce\x77\x54\xbf\xda\x66\x7e\x7e\x84\x0a\x84\x01\x40\xca\x05\x43\ \xb7\xf1\x3e\x10\xc2\x3b\xdf\x62\xfe\x07\xa3\x54\x24\x0c\x00\xf2\ \x19\xde\x07\xc2\xf1\xcb\x7a\xbb\x3b\xcc\x7b\x20\x21\x05\xc6\x00\ \x58\x55\xbc\x70\xdd\xc5\xbc\x7c\xfb\x1a\xbe\xe9\xc1\x1a\x5e\xb9\ \xdf\xe3\xa5\xdb\x0c\x5e\xa8\xbf\x20\xa8\x7f\xa6\x27\x4a\x86\xb6\ \x2f\xc1\xe8\x72\xb6\xaf\x9d\x63\x29\x7e\x9d\xcd\xfc\x96\xf8\x97\ \x16\x03\x50\xd8\x78\x0a\xdf\xfc\xc4\x35\xbc\x7d\xf3\xdb\x9c\x77\ \x7e\xf1\xaf\x69\xfd\xf9\x59\x5e\xb9\x63\x2d\xcf\xdb\x47\x8f\xf6\ \x3f\x5f\x5b\xde\xd4\x1a\x7e\x59\x5d\xb5\x80\x60\x64\xb9\xe4\x8e\ \xef\xb9\xf3\x6b\xb2\xc9\x28\x2c\x06\xa0\x74\xe3\x52\xde\xbe\x45\ \x16\xbf\xef\xb4\xfc\xf8\x34\x2f\xd4\x9e\x1f\xc4\x3f\x6b\xa9\xeb\ \x7d\x80\xbb\xfb\x4c\x24\x18\x7e\x16\xf3\x4f\x70\x98\xff\x5e\x72\ \xca\x8a\x01\xa8\xdc\xbd\x81\xf3\x8e\xcf\x65\xb9\xfb\x9d\x8e\x6d\ \xef\xf1\xe2\x0d\x97\x05\xf5\xcf\xfd\x69\xde\xd0\xce\x20\x18\x1e\ \xa6\x9a\xd9\xcd\x66\x35\xb7\x27\xab\xa8\x18\x80\xd2\x8d\xcb\x64\ \xf9\x07\x95\xf6\x2d\xef\xc8\x9f\x09\x04\x95\x27\x8a\x76\x6a\x1f\ \x82\xc1\x71\x17\xb8\xd3\x7b\x3f\xaf\xd5\x8c\xe2\xfe\xc6\xde\x57\ \x40\x37\x95\x7d\xdd\xf3\xc9\xb2\xbf\xcb\x40\xa1\x30\xee\x6b\x06\ \xad\xe2\x0c\xe3\xee\x83\x4b\xdb\xd4\xdd\x0c\xad\x51\xc7\xb5\xb8\ \x9b\x15\x29\xc5\xdd\x65\x18\x24\x95\x54\xa8\x7b\x52\x37\x83\xf3\ \xdd\x9e\x1f\xab\x21\x6d\xee\xcb\x6b\xa4\x49\x5f\x6e\xd6\xda\x63\ \x8d\xbc\x32\xd9\xfb\x9d\x7b\x64\x1f\x23\x13\x80\x45\x5f\x21\x81\ \x91\xcc\x1a\xa0\x29\x33\x49\xdf\x42\x86\x6b\xcf\xab\xbc\x26\xfd\ \x1f\xc6\x68\xfe\xe7\xfc\x7f\xef\x58\xa3\x4d\x50\x6a\x9c\x24\x65\ \x02\x50\x7b\x61\x25\x12\x58\x0b\xc0\x48\xc2\x00\x22\x1a\x19\xbf\ \xb5\xe7\xec\x9c\xff\x59\xe0\xe0\x88\x47\x46\x4c\x52\x26\x00\x81\ \x13\xb9\xef\xfe\xcf\x25\x50\x75\x6d\x0b\x14\xae\xf7\x84\xe2\xad\ \x01\x50\x9f\x72\x9c\x53\x00\x1a\xc5\x87\x0c\xc9\x9f\x30\x95\xf4\ \x0f\x7c\xc3\x98\xde\xcd\x98\x23\xfa\x8d\x8e\xf5\x5a\x8c\xa0\x4c\ \x00\x64\x6b\x6d\xa9\x64\x7e\xd1\x2e\x81\xdc\xe8\xb9\xf0\xf4\xaf\ \x4f\xe5\x98\x32\x14\x2a\x4e\xc4\xd3\x5f\xd3\x9a\x06\x15\xf3\x27\ \x1b\xdc\x5a\xb3\x32\xff\x31\xef\x1a\x3d\xf1\xfd\x4c\xe2\xfe\xfb\ \xcb\x73\x7e\x13\x01\x30\x30\x01\xa8\x4e\x0c\xa5\x92\xb9\xfa\xc6\ \x56\x24\x7d\x57\x88\xa7\x0e\x83\x96\xd2\x9b\xd4\xd7\x49\x97\x4e\ \xd5\x33\xe9\xe9\xf9\x81\xca\x40\xb3\xff\x6d\xbc\xe7\x7c\xd3\x88\ \x12\x46\xca\x57\xc1\x04\xa0\xf6\xdc\x32\x2a\x91\x0b\x56\xbb\x22\ \xe1\x95\x41\x76\x66\x35\x3d\x0f\xb0\xc5\xc5\x60\xdb\x8a\xcb\xfd\ \xc6\x4a\x8d\x2a\x3f\x10\x3c\x24\xd2\x8a\x7c\x19\x6f\x33\x32\xf6\ \x14\x4c\x00\x0a\xd7\xb9\xd3\x05\xe0\xdc\x5a\xea\xeb\x64\x09\x8e\ \x7d\x61\xbe\xe0\x61\xb9\xef\x98\x09\x02\x4e\xf0\xc5\x0c\x51\xb9\ \x46\x9b\x81\x1d\x01\x8e\x2c\xa2\x12\xb9\xf6\xc1\x3e\x24\x7b\xca\ \x8c\xe1\x90\x66\x33\x12\xd2\xe6\x8e\x04\xf1\xb4\xa1\x20\x9e\x3e\ \x02\xda\x2a\xef\xd1\x05\x60\xd9\x74\x43\x24\x3c\x3d\x3f\xe0\x3d\ \xee\x1d\x81\xad\xd1\xc6\x73\x7e\x23\x23\xa0\x2a\x30\x01\x28\x8d\ \x9b\xc6\x99\xd5\x2f\x3b\xb0\x08\x32\xdd\xac\x3a\x91\xe5\x35\x16\ \x6a\xee\xee\xe2\xe8\x0a\x7c\x02\x15\x01\x38\x1f\xd0\x97\xd0\xd2\ \x91\x1f\x90\xb9\x5b\xfd\x2f\x21\xac\xd1\xce\x63\xc4\xe3\x0b\x26\ \x00\xb9\xce\x56\xd0\x26\xbb\xcb\xdd\xe0\x93\x9d\x0c\x95\xe7\x57\ \x40\xf5\x95\x75\xd0\x5e\x7d\x9f\xf3\xb9\x35\x77\x76\x41\x89\xe7\ \xe8\xbe\x3a\x76\x5c\x8c\x6b\xcf\xfb\x5a\x7e\x20\xe8\xf5\x28\x0b\ \xf2\x85\xbb\xc9\x08\xd7\x53\x30\x01\x78\x66\x6f\x46\xee\xf2\x58\ \x09\xd0\x0a\xb2\x17\xfe\x09\x85\xae\x56\x7d\xdd\x7f\xe0\x41\xb9\ \xff\xd8\xf1\x86\xdf\xb7\xff\x56\xec\xc0\x80\x21\x91\x7b\xd5\x3d\ \xe7\x33\x30\x01\xc8\x11\x99\x41\xca\x2c\x33\x68\x95\xde\xd5\x90\ \xfc\xf2\x9c\x41\xa1\x9b\x95\x30\xd6\x9a\xf9\x8f\xd9\x6b\xd0\x6b\ \xcd\xc8\xb4\xde\x5c\x46\x32\x4d\xc0\x04\x20\xcf\xd1\x1c\xf2\x57\ \x38\xc1\x8b\xb6\x74\x4d\xc8\x8f\xc7\x88\x34\x87\xf1\x28\x00\xc5\ \x1e\xd6\x82\x71\x23\x22\x0b\x4c\xe6\x0a\x5c\x00\x18\xe6\xbd\x15\ \x05\x6b\x7f\xda\x00\xc7\x17\x1c\x84\x9b\x5b\x92\x21\xfd\xe2\x35\ \x28\x7a\x72\x1f\x64\xb9\x8f\xa0\xbe\x42\x0c\x8d\x55\x29\xf8\xcf\ \x15\xd9\x0f\x21\xf7\xde\x6d\x48\x39\x7d\x05\xae\x27\x9c\x82\x23\ \xfe\xfb\x60\xfd\xaf\x1b\x21\xf4\x93\xb8\x3e\x2b\x00\xd2\x9d\x7e\ \xd8\xf1\xa7\x29\xf9\x33\x7c\xbe\xeb\xec\x14\x2c\xf7\x31\x70\x62\ \x33\x01\x60\x08\x1b\x1a\x0f\x47\x83\xf6\x43\xd6\xf5\x1b\xd0\xda\ \x88\x77\x3f\x8d\x50\x57\xf6\x14\x52\xcf\x5e\x85\x33\xd1\x47\x21\ \xe1\x8f\x4d\xb0\xf0\x83\x18\x43\x16\x00\xb4\xfb\xaa\x39\x13\x8f\ \xbd\xfe\x1a\xfd\xde\x8f\x0e\x43\xba\xd3\x84\xce\xfe\x00\xc9\xec\ \x11\x86\x4b\x68\x26\x00\x0c\x6b\x7e\x58\x0f\xe2\xe4\xcb\xf0\xbc\ \x15\x67\xdf\x75\x05\x7c\xff\x8c\x2b\x37\x4a\xfb\xa9\x78\xd4\x5e\ \xdb\x90\x53\x7f\x67\x2b\x36\xe4\x54\x27\x86\x40\xe5\x56\x77\x9c\ \xab\x27\x04\xd5\xdd\x17\x3b\xfa\x37\x68\xce\x3d\xab\xea\x77\xa0\ \x46\x06\x2f\xda\x24\x84\xf8\x87\x70\x4e\x80\xdc\xf1\x15\x1a\x84\ \x0c\x32\x01\xc8\x04\x80\x61\xed\x8f\x1b\x20\xeb\x06\xf6\xaf\xf7\ \x1a\xca\x33\x1f\xd6\xf4\x53\xf1\x68\xce\x39\x53\xa9\x94\x64\x2d\ \x29\xd0\x92\x7f\x1e\xea\x6f\x6d\x82\xca\x5d\x3e\x50\x11\xf2\x9d\ \xe6\x5f\xe8\xd0\xef\xa1\xf6\xca\x3a\xf2\xde\xa9\xaa\xae\x1d\x23\ \x83\x82\x55\xce\x90\x6a\x37\x06\x72\xc2\xa7\x93\x7f\x76\x21\xb9\ \x02\x67\x78\xb6\xf8\x2f\x48\x99\x63\xa9\xb4\x3b\x50\x32\x6b\xb8\ \x61\x11\x98\x09\x00\x43\xc8\xc7\x71\x70\x63\x73\x32\x3c\x6f\xc3\ \x3b\xbe\x61\x0b\x00\x1d\xe8\xd6\xd3\x52\x74\x19\x6a\x2f\xaf\x01\ \xe9\x8a\x99\xfc\xbf\xc4\xfe\xe3\xd0\xae\xab\xfe\xe6\x26\x14\x15\ \xbe\x9f\x55\xb4\x25\x00\x49\xcd\x17\x62\x12\x09\x94\x7a\x1a\x50\ \xf2\x8f\x09\x00\xc3\xa6\x29\x9b\xa1\xb6\xec\xa9\x06\x24\x36\x00\ \x01\xa0\xa0\xb5\xe4\x2a\xd4\x9c\x8c\x80\x8a\xb0\x1f\xba\xcc\xf7\ \x4f\x00\x29\x09\xf1\x2b\x77\xfb\x42\xdd\x8d\x8d\xd0\x26\xbd\xdd\ \x93\xf7\xc5\xb0\xbf\x70\x9d\x47\x8f\xc9\x5f\x64\x28\xa5\x3f\x26\ \x00\x0c\xa4\x15\x1a\x92\x97\x1c\xd1\xf4\xae\x4f\x5e\x2f\x81\xfa\ \xca\xa7\x88\x76\x35\x72\x06\x05\xe2\x3b\x2d\x5a\x12\x00\x3a\x08\ \x61\x5b\x0a\x2e\x12\x41\xb8\x06\x6d\x55\xf7\x34\x2a\xe7\xb5\xd7\ \xfe\x03\xb9\x91\xb3\x7b\x44\xfe\xb4\x19\xc3\x75\xdf\xf9\xb7\xf0\ \x4b\xa8\xda\x17\x08\xf5\x77\xb7\x01\xf9\xf3\x82\xd6\xd2\xeb\x98\ \xc3\x68\xf8\x7b\x17\x54\x1f\x5d\x8c\xc7\x23\x26\x00\x46\x86\x79\ \x6f\x46\x43\xac\xf9\x06\xa5\x25\xbd\x27\x27\x2e\xf5\xf8\xcb\x5f\ \x9c\x71\x17\x2e\x6c\x3b\x04\xeb\xdd\x56\xc0\xfc\x2f\x16\x80\xc3\ \x07\x6e\x30\xed\x35\x3b\x05\xd8\xbc\xe9\x04\x6e\xc3\xbd\x21\x68\ \x52\x30\xac\xb4\x23\x55\x84\xb8\x1d\x70\xf7\x44\x12\x14\x67\xde\ \x85\x17\x4a\x0c\x35\xf3\x1e\xdf\x6c\xef\xa7\xe2\xd1\x98\x7e\xb2\ \x01\x9f\xaf\x67\x34\x48\x4e\x81\xc4\xfd\x73\xde\xc4\x4f\x25\xc4\ \xcf\x73\xb4\xe8\x18\xa6\xd1\x1d\xf1\x83\x27\x93\xe4\xe8\x52\x78\ \xde\x24\x56\x15\xb5\xe0\x11\x47\x1a\xf2\x2d\x13\x00\xe1\xd7\xec\ \x63\x60\xcd\xa4\x9d\x70\xdc\xfe\x22\x24\xbb\x5e\x83\xb5\x93\x77\ \x76\xfe\x6c\xfe\xdb\x51\x90\x7a\xee\x1a\xdf\x2f\x3d\xde\xd9\x4f\ \xac\xd8\x05\x81\x13\x82\x91\xe0\x9a\x40\xf4\x9e\x2b\xc4\x4c\x8d\ \x44\x51\x78\x7a\xe5\x3c\x34\xd5\xa6\xf0\x12\x80\x86\x94\xc4\x56\ \x3d\x12\x1f\x2d\xbd\x4b\x76\x2f\x40\x93\x8f\xae\x24\xcf\x71\x30\ \xc7\xa6\x9e\x7c\x27\x0b\xc8\x75\x30\xc3\x7f\xcf\x77\xb6\x80\x12\ \xdd\x37\xfa\xe0\x31\xa6\xb5\xf4\x5a\xcf\x22\x98\xaa\xfb\x98\xef\ \x60\x02\x20\x40\x2c\x78\x27\x16\xd6\x7d\xbe\x0b\x4e\x38\x5c\x42\ \xe2\xbf\x8a\xd5\x13\x77\xc0\xfc\x77\xa2\xb1\x81\x87\x2f\xf1\x77\ \x2d\x4c\xc0\x3b\x3a\x12\x58\x07\x98\x61\x62\x0f\xbe\x96\xc1\x75\ \xfd\x54\x3c\xb2\x5c\x27\x56\x65\xcd\xfb\x15\x72\x63\x6c\xa0\x68\ \xb3\x1f\x48\x93\x57\x42\xbd\xf8\x18\xfa\xf4\xe9\x94\xf8\xcd\x29\ \x68\xed\x95\x6a\x37\x5a\xe9\x1d\xfe\x99\xc8\x4c\x5f\xe7\x6e\x24\ \x7f\x7b\xcd\xdf\xea\xfc\x5e\x68\x49\x26\x5b\x63\xc3\x04\x40\x30\ \xc4\x7f\x37\x16\x12\xbe\xda\x03\x49\x4e\x97\x91\xec\x4a\xe1\x76\ \x0d\xb2\xae\xf0\x4b\x76\x5d\xdb\x77\x14\x1c\x3f\x72\x47\x92\xea\ \x1a\xb3\xfa\x3b\xab\x4c\x02\xa6\xcf\x1a\x26\xa3\x85\xd9\x12\xcf\ \xaf\x88\x28\xf8\x43\xcd\xbd\x3d\x38\x66\xab\x0d\xe2\xb7\xc9\xee\ \x41\xc5\xb1\x58\x48\x77\x9e\x48\x0d\xef\x73\xec\x91\xfc\xfa\x41\ \xf0\x67\xb8\x76\x0c\xaf\x57\x93\x1d\x05\x11\x3f\x33\x01\xe8\xcb\ \x58\xfc\x7e\x3c\x6c\xfc\x76\x1f\x24\x39\x5f\x41\x92\x73\x21\x33\ \x59\xf5\xdd\xb2\xa9\x2e\x15\x56\x89\xe2\xa9\x64\x9d\xde\xdf\x1e\ \x6c\x07\xb8\x83\xd3\x40\x3f\xf0\x18\x34\x0f\xbc\x4d\x17\x81\xff\ \xe0\x70\xf0\x37\x0d\x87\x80\xc1\x11\xe0\x37\x38\x0c\x7c\x4c\x43\ \xc0\x6b\xd0\x42\xf2\xf3\xf9\xe0\x3c\x30\x00\x44\x03\xbc\x61\xee\ \x00\x57\x98\xfe\x9a\xbd\x96\x04\x80\x0e\xf1\xb4\xe1\x98\xa0\x23\ \xe3\xb6\x98\xe8\x53\xa7\x5d\x37\x37\x6a\x4e\xf7\x50\x5f\xd1\xf0\ \x13\xc3\x7d\x7d\x66\xdd\x6b\x4e\xc7\x68\x27\xa7\xf1\xf7\x6e\x26\ \x00\x7d\x11\x21\x1f\x2c\x83\x2d\xdf\x1f\x80\x53\xce\x57\x91\xdc\ \xaa\xf0\xcf\x96\xfb\x00\xcf\xb9\xbf\x0c\xa5\xd9\xf7\xc0\x77\xb4\ \xbf\x12\xd2\x8b\x40\x64\xe2\x89\x84\x26\x7e\x89\x1a\x5d\xb7\xcf\ \xa0\x10\x70\x1d\x18\x44\x44\xc1\x0b\x66\xf7\xef\x38\x5a\x88\x34\ \x14\x00\x3a\xd2\xec\xc7\xe1\xb9\xbd\xa5\xe4\x46\xcf\x3c\xfb\x2f\ \x6e\x40\x37\x1f\xa5\x49\xbd\xe9\xc3\xc8\x79\x5f\xcf\xa5\xbc\x05\ \x5f\x62\x4e\x42\x0b\x02\x80\xbd\x0c\xd2\xf8\xa9\x4c\x00\xfa\x0a\ \xc2\x3f\x5e\x01\xdb\x7e\x3a\x0c\xa7\x5c\x90\xd8\xbc\x70\x2d\xfc\ \x16\xb4\x37\x73\x97\xe7\x0a\xd3\xef\x80\xcb\xa7\x9e\x8a\xc4\x27\ \xe4\x74\x30\xf1\x01\x3f\xd3\x50\x5d\xfd\x3e\x18\x39\x78\x0c\x5a\ \x70\x4f\x53\x01\xe0\x8e\x0a\x86\x41\xc1\x1a\x77\x68\x29\xba\xca\ \xff\xce\x98\x7a\x1c\xbb\xfb\x3a\xdf\x83\x20\xdb\x6e\x14\x94\xfb\ \x8c\xd1\xff\x7a\xb2\x5d\xbe\xdc\x66\x23\x77\x77\x43\xa6\xdf\x0f\ \x18\x0d\x49\x3c\xbe\xe4\xf0\x25\x44\x60\x05\x81\x09\x80\x81\x63\ \xc9\xd0\xd5\xb0\xeb\xf7\x63\x70\x0a\x49\xcd\x1f\xa7\xdd\xaf\x41\ \x75\x4e\x0a\x77\x1d\x3e\xf5\x76\xb7\xf3\xbe\xcd\x00\x37\xf0\x35\ \x0d\x31\x98\x71\x60\x32\x3b\x7f\xa7\xc0\xc5\xb2\xa3\xa4\x86\xb3\ \xf9\x19\x73\x46\xe2\xdd\xb8\x67\x42\x30\x1c\x8a\x36\xfa\xf0\x4e\ \x9c\x35\x17\x5c\x81\x34\xc7\x09\x90\x31\x77\xa4\x41\xb9\xf7\x90\ \x99\x08\x4e\xaf\x01\xc5\xb9\x03\x04\xe7\x8e\x82\xe6\xbc\x73\x4c\ \x00\x0c\x15\x91\xc3\xd6\x20\xf1\x91\xd0\x6a\x40\x72\x92\x7b\x85\ \x75\x4b\xad\x04\x16\x4e\x5a\x2c\xbf\xeb\x13\x38\x9b\xf8\x93\xcf\ \x8e\xe8\x13\x7e\x00\x65\x3e\x63\xd0\x58\x83\x64\xe3\xb1\xd9\x86\ \xe7\xd1\x00\x73\x04\x3c\x44\x00\x4b\x6c\x15\x61\x3f\x1a\x54\xd7\ \x5d\x73\xd6\x29\xba\xd3\xd0\x82\xdf\x95\x1f\x5d\x6c\xac\xb1\xa2\ \xa1\xb4\xd2\x51\xff\x88\x09\x80\xa1\x21\x7a\xe4\x3a\xd8\x3f\x2d\ \xa9\x67\x77\x7b\x8f\x6b\x70\x71\xde\x0d\xb8\xbc\xe8\x26\x9c\xf5\ \xbe\x0e\xd7\x97\xdc\x86\xe7\x6d\x1c\x25\xae\x96\x0c\xb8\x15\x7f\ \x07\x0e\xdb\x9c\x01\xd1\x9b\x9e\x30\xf3\x35\x07\xf0\x32\x5d\xd8\ \xa7\x0d\x41\xca\xbc\x47\x43\x9e\x93\x39\xa4\xcf\x54\x2d\x06\x05\ \x6b\x3d\x54\x34\xcf\x20\xb0\x7b\x50\xba\xe8\x6b\x83\x11\x80\xd6\ \x12\xfa\x51\x26\x65\xb6\x39\xf5\xf7\x6d\x29\xbb\x45\x7b\x1d\x4e\ \x55\x32\x01\xd0\x37\x86\x44\x42\xac\xd9\x06\x38\x30\xe3\x14\x6f\ \xd2\xdf\x59\x71\x07\x72\xaf\x3c\x82\xfa\xd2\xb4\xee\xb5\x5e\x15\ \x49\xbf\xa7\xfb\x1e\x74\xbe\xcf\x81\xd9\xa7\x20\xe8\x9d\x48\x21\ \x39\x02\x61\x73\x4e\xb6\xad\x19\xf6\xe0\x53\x48\x81\x06\x1d\xcd\ \x3c\x72\x03\xcd\xd9\xc9\x58\x7a\x33\x00\x01\xe0\x1c\x51\xce\xf0\ \xfa\x4a\xe9\xef\x99\x32\x73\x14\x2d\x71\x48\x44\xf0\x29\x8b\x00\ \xf4\x4d\xfc\x78\xcb\x8d\x70\x78\xf6\x19\xde\xc4\xbf\xbb\xea\x2e\ \xc7\xd9\x5e\x35\xca\x9f\x3e\x85\x64\x37\xc5\xf7\x3c\x38\xeb\x34\ \xcc\x7f\x2b\x46\x20\x02\xa0\x78\x4c\xc8\xb1\x37\x87\x94\xa9\xca\ \x85\x20\xd5\xd6\x1a\xea\x53\x4f\xa8\x4e\x0c\x3e\xda\x87\x53\x83\ \xfa\x16\x80\xba\x7b\x3b\x68\xd7\x88\x09\x3f\x31\x39\x0a\x49\xec\ \xcd\x20\xc3\xd9\x02\xd2\x49\xce\x24\x95\x44\x43\xc5\x5b\x03\xe9\ \xc7\xc0\xa2\x2b\x4c\x00\xf4\x01\xe2\x52\x0c\xcb\xac\x37\xc3\x91\ \x39\x67\x79\x13\xff\x0c\x09\xf3\x73\x2e\x3e\x52\x55\xd2\x53\x79\ \xee\xbf\x18\x7c\x53\xd9\xfb\xe3\xb1\x83\xcc\x0f\x08\x40\x00\x28\ \x42\x20\xea\x88\x08\x94\x24\x08\x67\x8c\xc4\x46\x22\x55\x7f\x76\ \xd5\x27\x22\xf4\x3f\x79\xb7\x7b\x1e\x77\x19\xf3\xdc\x72\xc8\xf6\ \x99\x00\xb8\x9f\x80\xfc\xbd\xe2\x48\x08\x0e\x43\x51\x9f\x7f\x76\ \x15\x13\x80\xde\x1d\xd0\x89\x82\xd5\x13\xb6\x43\xa2\xdd\x05\x24\ \x5d\x4f\xc8\x5f\xf6\x58\xe3\xb1\x5d\x2c\x09\x92\xa3\x03\xf5\x73\ \xf6\xfc\x79\x02\xc5\x49\xa0\xa6\xa0\x98\xd1\x57\x92\x23\xc0\xda\ \x3f\x29\xa1\xa9\x1a\xa8\xc1\x4d\xc1\x18\x09\x84\x7e\x8f\x13\x76\ \xbd\x7d\x34\xc8\x72\x9d\xa0\xca\xac\x04\x7f\xde\x26\xbb\xcd\xcb\ \xd4\x24\x27\x94\xf5\x01\xf4\x0a\xe6\x93\x3b\xeb\xba\xc9\xbb\x3a\ \x07\x74\x7a\x00\x0c\xd7\x4b\x1f\x69\x6f\x66\xbf\xad\x31\x03\xae\ \x86\xdd\xa2\x7e\xde\xce\x5f\x8f\x42\xd0\x10\xe1\xba\x02\x97\xfb\ \x8e\xc5\x56\x5e\xb1\x12\x11\xa8\x7f\x72\x84\x9b\x5c\xcd\x62\xec\ \xa5\xef\xea\x3b\x50\x77\x75\x1d\x48\xe3\xfe\xd4\xb9\x00\xa4\xcd\ \x18\x26\xaf\xed\x6b\x88\xfa\x94\xe3\xf8\x7b\x97\x33\x01\xd0\x75\ \xe7\xde\x52\x38\xe1\x88\x7d\xfa\x6a\x21\xe5\x20\xd6\xae\xb5\x8a\ \xba\xe2\x34\x38\xe3\x79\x9d\xfa\x99\x5b\x7f\x3c\x04\x41\xc2\xb6\ \x05\xc7\x12\x62\xca\x34\xc5\xdc\x40\xea\x5c\x4b\x68\xca\xbb\xa8\ \x66\x67\x9d\x04\x1a\x1e\xec\x84\x8a\x45\x5f\xe9\x4c\x00\x48\xf4\ \x82\x79\x8b\xb6\xaa\x07\x9a\xfc\xff\x47\x11\xcb\x0a\xfa\x19\xc4\ \x53\x3f\x65\x11\x80\xae\x11\x6f\x99\xa0\x2e\xf9\xf1\xbc\xde\xde\ \x92\xa1\x7a\xe1\x84\xf4\x09\x3c\xbe\x78\x0e\x1e\x24\x27\x43\x9e\ \x98\x9f\xaf\x9f\xe4\xf8\x43\xce\xcf\xde\xf4\xcd\x7e\xc1\xef\x05\ \x28\xf5\x1a\x8d\x77\xd5\x57\x44\x00\x67\xfe\x35\x99\x34\x6c\xab\ \xb8\x05\xd2\xf8\x29\x3a\xb9\xde\xcc\x39\x23\xf1\x1a\x49\xcd\x1f\ \xcb\x98\xea\xb6\x00\x17\x26\xf8\x74\xb6\x37\x33\x01\xd0\x31\x36\ \x7c\xb9\x47\x6d\x01\xc8\x3e\xf7\x88\xf3\x7f\x66\x45\xfe\xdf\xb0\ \x6c\x6e\x0c\x4c\x1f\x20\x52\xe8\xe6\xf3\x32\xf7\x85\x5b\x47\xb9\ \xb3\xdb\xad\xf5\x12\xec\x19\xe0\xf8\x7c\x1c\x2f\x16\xfa\x62\x90\ \x32\xef\x31\xe4\xce\xaa\xd8\xff\x9f\xb7\xcc\x41\xb3\x5c\x4b\xd5\ \x7d\x9d\x34\x11\xe5\x3a\xc8\x6b\xfd\xa5\xfb\x7b\xbc\xae\x0c\x87\ \xa4\x8a\x36\x22\xf9\x11\x59\x36\xa3\x98\x00\xe8\x1a\xbb\xff\x50\ \xab\x9b\x0f\x5b\x79\x5b\xeb\xe9\x19\xdc\xdc\x27\x37\xe5\xae\x3c\ \x14\xec\x8f\xd8\xc2\xf9\x85\x78\xb2\xfb\x81\xca\xeb\x58\x33\x69\ \xbb\xe0\x37\x03\x91\x3d\xf8\x20\x79\x25\x39\x58\x79\x5e\xf3\x73\ \x76\xf3\xb3\xd3\x98\x30\xd4\x72\xc4\xd2\x99\xbb\xa8\xbe\xbe\xb5\ \x47\xd7\xd3\x98\x99\x8c\x61\x3f\xc5\xa2\x9c\x09\x80\xae\x90\x68\ \x77\x5e\x2d\x01\xb8\xbd\xf4\x0e\xfd\xcb\xd5\x90\x0a\x9e\x66\xbe\ \x7c\x66\xee\xd1\x92\x8b\xf2\x3e\x98\x5c\x54\x75\x1d\xa7\x08\x56\ \x8c\xdd\x2c\xf8\xd5\x60\x65\x3e\x98\x64\x83\x0c\xef\x6f\xe4\xcb\ \x40\x34\x03\x0e\xef\x68\xfd\x18\x30\x17\x8f\x01\x38\xbe\xac\xaa\ \x1a\xd0\x9c\x7f\x09\xc5\xec\x59\xd8\xf4\xee\x6d\xd1\x44\xf0\xd8\ \x38\xb0\xee\x5d\x7a\xd4\x0e\xff\xd3\x8f\xd3\x7b\xf9\xcf\x6d\x3e\ \xa0\x38\xbd\x47\x30\x7b\x80\x13\xcc\xe9\xef\x02\x33\xfa\x3b\x28\ \xfc\xcc\xc7\xda\x9f\x2e\x24\x35\xe9\x7c\xae\x05\x27\x10\x49\xc3\ \x92\xe0\x77\x03\x96\x7a\x8d\x81\xea\xab\x9b\x54\x12\xab\x8e\x54\ \x0b\x6a\x1f\xec\x47\x93\x50\xce\xbe\x8b\xfc\x0b\xda\xbf\x46\xd2\ \xf2\x9c\xe1\xf1\x39\xa7\xaf\x81\x7c\x28\x88\x8e\x42\x77\x2b\x26\ \x00\xba\xef\xeb\x5f\xab\xb6\x00\xe4\x5e\xa6\x9f\xff\x63\xa6\x44\ \x76\x9a\x74\xb8\x0c\x0c\x40\x63\x8e\x57\x3f\x97\xf4\xf5\xa3\x11\ \xc7\x4b\x11\x40\x43\x4f\xaa\x98\xf8\xdd\xe0\x75\x3d\x49\x2e\x57\ \x21\x66\xd4\x3a\x61\x2f\x07\xf5\x1f\xcf\x99\x00\xac\x7f\x7a\xb4\ \x73\xc1\x27\x01\x6e\x0d\xae\xba\xc6\x1d\x8a\x4b\x23\x7f\xd5\xfe\ \x91\x65\x9d\x23\xbd\x61\xe9\xe6\x76\x55\xe4\xc7\xee\x48\x66\x09\ \xa6\x7b\xe0\xf9\x59\x5d\x01\x28\x7e\x40\xb7\xb8\xf2\x1b\x13\x40\ \x06\x78\x1c\xc1\x6f\x30\xf7\xbc\xbe\xbd\x89\x37\x0a\x00\xa9\x10\ \x50\xdf\xeb\xd2\x7c\x14\x00\x3e\x40\xdb\xb1\xa8\xe1\xab\x85\x2a\ \x00\x98\xbd\xa7\x26\xf6\xea\x1f\x63\x99\xb0\xbb\x4b\xd0\x30\x68\ \x7a\x76\x96\x7e\x0c\xd8\xad\xfd\x63\x40\xf5\x89\x70\xea\xe7\x95\ \xec\x5e\xc8\x49\xfe\x67\xf6\x66\xcc\x14\xb4\xb7\xb0\xed\xe7\xc3\ \x6a\x0b\x40\xd1\x5d\xba\x00\xcc\xfb\x62\x01\x5a\x72\xf1\xb8\x06\ \x9c\xef\x4f\xbb\x75\x99\xf6\x5e\x38\x45\xd8\x93\xeb\x3a\xe9\x70\ \x09\xc2\x3f\x59\x29\x48\x01\x90\x25\x38\xd0\x89\x7c\x29\x81\x46\ \x2a\xce\x7e\xfb\x9a\x53\xd1\xda\xf7\x05\xb8\xb5\x99\xfa\x79\x79\ \xf1\x22\x8a\xa3\xd1\x50\x28\x74\xb5\x64\xb6\xe0\xbd\x89\x43\xb3\ \x4e\xab\x5f\x02\x3c\x43\x0f\x45\x77\x07\xf2\x4f\xca\xf9\xbf\x15\ \x8a\x7e\x7f\xca\xcb\x42\x99\xa4\xda\x70\xbd\xc7\xd7\x76\x5c\x74\ \x11\x42\x3f\x5a\x26\x38\x01\xa8\xdc\xe6\x4e\x0f\xe5\x93\x96\xd1\ \x04\x00\xf7\x02\x52\x05\xe0\x74\xac\xd6\xaf\xb3\x51\x7c\x88\xfa\ \x79\x99\x7e\xdf\xcb\xbb\x1b\xc9\x10\x54\x06\xd9\x46\x9c\xef\x6c\ \x49\xd9\x4f\xc0\x04\x40\x67\x08\x7e\x3d\x92\xc3\xb0\x53\x35\x9e\ \xec\xbe\x4f\x77\xf2\x79\x72\x97\xf4\xec\xf3\x1b\xe1\x3d\xec\xb7\ \x97\xfe\xe5\xcc\x4f\x53\xfb\xfa\xf6\x4f\x4d\x12\xde\x11\x60\xd5\ \x6c\xfa\x44\x60\x7a\x92\x82\xd5\x98\xb8\xc3\x95\xe8\xe5\x70\x51\ \xc5\xf1\x38\xfa\x99\x3c\x71\xb1\x0e\xc6\x82\xe9\x47\xba\x34\x7b\ \x2c\x17\xa2\x3f\x82\x1e\x57\x83\x31\x01\x88\xf8\x64\x25\x12\x45\ \x83\x2e\x40\xce\xb9\xfe\x53\x11\x87\x55\x27\x21\xad\x97\x43\x7d\ \x05\xb5\x63\x0c\xa3\x0c\x75\xaf\x6f\xfb\xcf\x47\x84\x27\x00\x8b\ \xbf\xc1\x4e\x39\xaa\x7f\xe2\x1a\x17\xc8\x70\x32\xef\x98\xb6\x43\ \x64\xb8\x58\x42\x56\xe0\x8f\x9c\x96\xe4\xd2\xb5\x76\xda\xbe\x4e\ \xda\x3e\x43\x2c\x5f\x66\xd9\x8e\x32\x80\xdd\x80\x4c\x00\xb0\x76\ \x8e\x64\xd1\x00\x95\x59\x29\x1c\xd3\x69\x19\xb8\xdf\x8f\x16\x09\ \xac\xfc\x7a\x2d\x54\xe6\x71\x3b\xc8\xde\x8c\xb9\xad\xf6\xb5\xad\ \x99\xb4\x43\x60\x02\x80\xd3\x82\xb8\x02\x8c\x6b\xcf\x60\xd5\xf9\ \x15\x50\x10\x3f\x03\xf2\xa3\xff\x82\x8a\xc4\x30\x34\xdb\xe0\x5a\ \x2e\x52\xe0\xa1\xfd\xeb\x6c\xaf\x55\x5a\x22\x46\x21\xca\xa5\x64\ \xf8\x99\x00\xf4\x2e\xd0\xb3\x5f\x53\x01\xb8\xbf\x1e\xcb\x77\x9c\ \x28\x49\xbd\x0f\x27\x17\x1f\x82\x75\xbf\x24\xc0\xea\xef\xd6\xc3\ \x1e\xa7\x9d\xf0\x28\xf1\xa2\xca\xc5\x9f\xd2\xb4\x14\x8d\xae\x6d\ \xc9\x88\xd5\x02\x13\x00\x1c\x10\xc2\xb5\xdf\x5a\x1a\xba\xc2\xc9\ \xbd\x1c\x07\xad\x13\x12\x89\x4e\x5b\x5e\x4a\x0c\x54\x0d\x41\x00\ \x98\x00\xec\x9b\x72\x12\x89\xa2\x29\xa4\xe9\x18\xc2\x6b\x15\x2f\ \xda\x33\xe1\x56\xdc\x6d\x8d\xae\xcb\xe9\x0d\x1f\xc1\x09\x40\x81\ \xab\x25\x8e\x05\xb7\x94\x5c\xc7\x3f\x27\x4d\x27\xee\x24\xae\x9f\ \xe9\x64\x8b\xd0\x0b\x8a\xc9\x67\x5b\xf5\xdf\x24\x8a\xb1\xd6\xb7\ \x00\x30\x01\x08\x22\x90\xef\xe8\xd3\x0c\x57\x16\xdf\x84\xd6\x3a\ \x89\x56\x05\x20\x23\xe9\xa1\x46\xd7\x74\xc4\xee\x2c\xd8\x0d\xf0\ \x14\x9c\x00\x14\xb9\x5b\x03\xd6\xca\xc3\xa6\x6b\xb2\x46\x1c\x51\ \xb2\x73\x3e\xbe\x57\xae\x83\x85\xf6\x23\x80\xc6\xa7\x14\x8f\x3f\ \x31\xba\x1f\xe9\x55\x00\x98\x00\xa0\x07\x80\x7a\xe4\xa2\x1b\x80\ \xca\x5d\x7e\x35\x03\x36\x18\x71\x97\xfe\x54\x63\xf3\xef\xfb\xd0\ \x42\x5c\x60\x02\x80\x99\xf3\xce\x56\xd9\x0d\xde\x98\x10\x54\x33\ \xf4\xef\x6c\xc7\xd5\x45\xed\xbd\xbd\x9a\xee\x11\x51\x1e\x38\x41\ \xdf\x02\xc0\x04\x20\xce\x62\x83\x06\x04\xa3\x9b\x81\xb6\xd4\x6a\ \x16\x09\x14\xde\xee\x20\xbf\xe6\xd7\x12\x3b\x79\x1d\xae\x0b\x13\ \x96\x00\x20\x14\xfc\x01\xc8\x46\x62\xec\x00\xe4\x3f\x6e\x2b\x81\ \xb2\x03\xa1\x9d\xe4\x17\x13\xe8\x62\xa3\x50\x6b\x39\xdd\xe6\x5b\ \xba\xf8\x6b\x3d\x0b\x00\x13\x00\x9c\xa3\x47\xb2\x68\x17\xe8\xfb\ \x2f\x93\xf4\xdc\x11\xb8\xb5\x41\x02\x8f\x77\xdc\xd7\xda\x75\x04\ \x8f\x0a\x07\x5f\xd3\x50\x41\x0a\x40\xae\xbd\xa2\xbf\x7e\xba\xf3\ \x24\xec\x02\xe4\xf0\xd8\xc3\x48\xa1\xf6\xe1\x01\xc8\x0a\xfc\xe9\ \xd5\xd7\xe2\xe4\x9e\x2e\xae\xb1\x29\xf7\x3c\x5d\x00\xa2\x7e\xd3\ \xb7\x00\x30\x01\xd8\xf5\x5b\x22\x12\x45\x57\xb8\xb7\xe6\x2e\x0a\ \xc1\x8b\x76\x0c\x51\xb9\xa6\xfd\xf0\xbc\x7f\xde\xff\xba\x56\x3f\ \xdf\xe5\x6d\x3f\x01\xb6\x02\xcb\xbd\x01\x52\xa6\x0d\x53\x6a\x21\ \x5e\xb0\xc6\x0d\xa4\x49\xcb\xa1\xe6\xd6\x8e\x8e\x0d\x43\x18\xea\ \x17\x6d\xf6\x83\x74\xd7\xc9\xca\x3a\x04\x75\x96\x90\xab\xfb\xe7\ \x20\xfd\xf8\xb1\x62\x86\xbe\x05\x80\x09\xc0\x51\x9b\x73\x48\x14\ \x5d\xe3\x7c\xc0\x0d\xf8\x67\xdb\x3d\xc8\x3c\xf5\x0f\xe4\xdf\x78\ \xdc\x31\x3f\x80\xd6\xe1\xa9\x87\xff\x86\x1b\xd1\xb7\xe1\xb4\x9b\ \xf6\x3f\xf3\x84\xd3\x25\xb0\x35\x71\x17\xaa\x00\x20\x0a\x9c\x71\ \xe8\x47\x13\xe0\xca\x32\x5d\x5d\x5f\xd5\xa5\x04\xfa\xcc\xc2\x0e\ \x2f\x3d\x0a\x00\x13\x00\x5c\xb0\x71\xca\x15\x57\x77\x0b\x12\x3b\ \xa7\x1c\x01\x47\x13\x1f\x01\x0b\x00\x02\xcb\x77\x6a\x92\x1f\x17\ \x98\x96\xeb\x92\x74\x87\x96\xd0\xdb\xbb\x93\x63\xf5\x29\x00\x4c\ \x00\xa2\x86\xad\x41\xa2\x08\x15\x2b\xbe\xd9\x0c\xee\x03\x83\x85\ \x2e\x00\x88\x5c\x47\x0b\x10\xf7\x90\xfc\xd8\x8a\xeb\xab\xdb\x52\ \x5c\xe1\x6a\x17\xfa\xcc\xc2\xdf\xbb\xf5\x29\x00\x4c\x00\x56\x4d\ \xd8\x26\x68\x01\x58\x6c\x1d\x0b\x3e\x83\x42\x04\x28\x00\xf4\x3d\ \x83\x92\xd9\x23\x54\x11\x1f\x37\x14\x17\x50\x3c\xf6\xb4\x8d\x67\ \xc1\x3f\x71\xac\xfb\xba\xac\x4f\x01\x60\x02\xb0\xf5\x87\x43\x82\ \x16\x00\xcf\x8f\xc8\xdd\xdf\x34\x42\xa8\x02\x40\x17\x02\xcf\xd1\ \xe8\xa4\x43\xc2\x7b\xf4\xe7\x4f\x23\x20\xa3\xb6\x78\xd6\x2f\x72\ \x43\xe2\xf7\x1a\x32\x6d\x2d\xe8\x55\x89\x76\x09\xee\xfd\x6f\xca\ \x38\x09\xf5\xb7\xb7\x40\xd5\xfe\x40\xa8\x58\xf8\x15\x13\x80\xde\ \xc2\x81\x19\xc9\xc2\x15\x00\x97\xab\x20\x32\xf5\xd0\xaf\x23\x10\ \x03\xda\x79\x37\xa4\x1e\x57\x26\x00\x74\x1f\xc3\xcb\xab\x51\x08\ \x98\x00\xe8\x10\x41\x72\x0f\x00\x41\x62\xff\xec\x24\x10\x0d\xf0\ \xd6\xaf\x00\x30\x60\xd4\x51\x9e\x18\xab\xd6\xd2\x12\xd9\xb2\xe9\ \x4c\x00\x74\x85\xb0\x8f\x57\x08\x3a\xfc\x5f\xff\xd3\x4e\x34\x21\ \xd5\xaf\x00\x30\x14\x06\x7f\x0d\x2d\x25\x37\x38\xc8\xce\xbd\xdf\ \x50\xba\x62\x26\x13\x00\x5d\x60\x99\xf5\x26\x41\x0b\x40\xe4\x84\ \x95\xe8\x38\xdc\x9b\x02\xd0\x98\x72\xb4\xac\x39\xe7\x2c\xc9\x6e\ \xef\xc2\x12\x97\x6c\x8d\x0d\x54\x04\x4e\x34\x56\xf2\xe3\xef\xde\ \xfc\xec\x8c\x66\x9b\x8b\x6a\x1e\x40\x45\xd8\x0f\x4c\x00\xb4\x8d\ \x8d\x5f\xef\x13\xb4\x00\xf8\x0f\x0d\x01\x7f\xd3\xf0\x5e\x15\x80\ \xe6\x9c\x33\x95\xdd\x8d\x36\xc4\xd0\xf0\x60\x17\x8a\x81\xb1\x09\ \x40\x4d\x52\xa4\x76\xb6\x03\xdf\xdd\xc6\x04\x40\xdb\xd8\xf3\xd7\ \x09\x41\x0b\x80\x03\xd5\x03\x40\xf7\x02\x40\x01\x66\xbc\x71\x6f\ \xbf\x31\x08\xc0\xbc\xcf\xe0\x79\xc3\x23\x6d\x08\x00\xce\x2f\x48\ \x63\xff\x60\x02\xa0\x4d\x1c\xb7\xbf\x28\x58\xf2\x27\x8a\xce\x83\ \x9d\x89\x87\x81\x09\x80\x1c\xb8\x9a\x7b\xe1\x97\x82\x26\x7f\xf5\ \xb1\x30\xae\x3f\x03\x9c\x11\xc8\x5e\xf8\x27\xa4\xda\x58\x43\xa6\ \xff\x0f\x50\x75\x8d\x7b\x37\x64\xcd\xe9\x38\x26\x00\xda\xc2\xc2\ \x77\xe3\x05\x7d\xf7\xdf\xf2\xfb\x7e\x70\x1a\xe8\x67\xa0\x02\x80\ \x40\xb3\x4c\xe9\xf2\x99\x42\x21\x3c\xee\x16\xac\xbf\xb5\x09\x5a\ \x0a\x2f\x62\x7d\x9f\x93\xfc\x8f\x0e\xe1\x92\x92\xae\x0d\x4a\xb2\ \xd3\x2b\xe9\xd1\x53\xee\x59\x26\x00\xda\x42\xec\xa8\xf5\x82\x16\ \x80\xf8\x2f\x36\xa0\x07\x40\x6f\x0b\x00\xa9\x77\x37\xf3\x13\x00\ \x79\x7e\x40\xb6\xc9\xb9\xaf\x12\x1f\xad\xc9\xeb\xef\x6c\x85\xe7\ \x4d\xe8\xfa\xc3\x1b\xcf\x16\xfd\xa9\x7c\x21\x88\xdd\x18\x78\xd1\ \xa2\x74\x84\x1c\xd7\xa0\x31\x01\xd0\x12\xd6\x4d\xde\x25\x68\x01\ \x98\x6f\x1e\x09\x7e\xa6\xa1\xbd\x2e\x00\xb5\x0f\xf6\xb6\xf6\x7c\ \x0f\x7e\x1a\xc8\x36\x3a\xf5\x25\xe2\x63\x7d\xbe\x31\xe5\xb0\xda\ \x67\xfa\x94\xd9\xe6\xd4\x36\xe5\x96\x32\xba\x81\x48\x45\xc0\x78\ \x26\x00\xda\xc0\x8e\x5f\x8e\x08\x5a\x00\x5c\xde\xeb\xb0\x00\x8b\ \xe8\x75\x01\x48\x9f\x35\x4c\x96\x32\xc7\x12\xb2\x17\xfd\x05\xe5\ \x87\x23\xa1\xa5\xf8\x1a\xef\x7a\xb7\x6c\xcd\x5c\x43\x27\x3e\x76\ \xe7\xd5\xdf\xdc\x44\xb1\x1f\xe3\x0f\x89\xc7\x97\x4a\xc9\x2f\x9e\ \x31\x12\x5d\x8d\x28\x1e\x82\x2c\x02\xd0\x16\x0e\xcf\x39\x2b\x58\ \xf2\x9f\x74\xbe\x02\x76\x03\xd1\x03\x40\x2f\x02\xd0\x75\x19\x67\ \x5e\x9c\x1d\xb4\x14\x5d\x55\x45\x0a\xf4\xec\x97\x77\xbe\x19\x1e\ \x2a\x77\xf9\x40\x7b\x35\x6e\x80\xd2\x18\xd2\xe4\x15\x68\x64\x92\ \x2e\x32\x87\x0c\x27\x0b\x90\xd8\x9b\x41\xca\x8c\xe1\x50\x98\xe0\ \x43\x7b\x0d\x8a\x29\x13\x00\x2d\x60\xde\x9b\x51\xd8\x27\x2f\x54\ \x01\xd8\x35\x3d\x11\x1c\x4c\x7c\x0c\x42\x00\xe4\x77\xb6\x51\x50\ \x75\x65\x13\x9f\xa6\x17\xb9\x4d\x96\x81\x40\x1a\xfd\x1b\x34\xa5\ \x1f\xd3\xba\xdd\xbb\x34\x29\x1a\xb2\xbc\xc6\xe2\xd6\xa2\x2c\xcf\ \xb1\x50\xb6\x37\x18\xed\xc9\xa9\xe6\x21\xe7\xd7\x30\x01\xd0\x06\ \x96\x0c\x5d\x25\xe8\xf0\x7f\xd5\x77\x5b\xc0\x6d\x50\x90\xe1\x08\ \x80\x1c\xb8\x0e\x1b\x9e\x73\x67\xc8\x5b\x2b\x6e\x82\x74\xc9\xcf\ \xfa\x27\x7e\xe4\xaf\x50\x77\x63\x23\xe6\x28\x7a\xdc\xbd\x57\xf7\ \x08\xea\x1e\x1e\x40\xe3\x51\xce\xa8\xa7\xf1\x09\xb4\x96\xdd\x80\ \xe7\xf5\xaa\xfb\x05\x72\x97\xcc\x60\x02\xa0\x0d\xac\x1c\xb7\x55\ \xd0\x02\x10\x36\x3a\x1e\xd7\x91\x1b\xa0\x00\x20\x8a\x36\xfa\xa8\ \x26\x50\xd5\x7d\x90\xae\x9c\xd5\xfb\xc4\x0f\xff\x11\xaa\x0e\x04\ \xe3\x1d\x9f\x22\x54\x54\xb4\x55\xde\x83\x8a\x63\xb1\x58\xd3\x7f\ \x59\xe2\xa3\x46\x3d\x74\x70\x2f\x3b\x2d\x67\x02\xa0\x39\x36\x7f\ \x7f\x50\xd0\x02\xe0\xfd\xf1\x7c\x08\x18\x1c\xa1\x17\x01\x20\xee\ \x3a\x17\x3b\x76\xf6\xe5\xbb\x58\xe2\x18\x6c\xca\x54\xe5\x22\x50\ \xba\x2f\x84\x4f\xf7\x1b\xce\x14\x54\xed\x0b\xc4\x04\xa1\x6c\xf9\ \x74\x84\x74\xe9\x14\x90\x46\xfe\x02\xd2\xf8\x29\x1d\xff\x8e\xc6\ \x9a\xb2\x0d\xf6\x9d\xa8\xdc\xee\xd5\x01\x2c\x2f\xca\x56\xcf\x05\ \x69\xdc\x9f\xd8\x4b\x8f\xe3\xb5\x21\xdf\x75\xbc\x16\x73\x0d\xb2\ \x04\xc7\x8e\xf9\x7b\x6c\xb0\x69\x78\xb4\x0f\xa7\xef\xd4\x21\x67\ \x5b\xd5\x03\x28\xde\x1a\x80\x5b\x8a\xba\x19\x8f\x38\x4e\xc0\x15\ \x60\x1a\x90\x1f\xa3\x88\xec\x05\xbf\x83\x78\xca\xa7\x2c\x02\xd0\ \x06\xf6\x4f\x4b\x12\x2a\xf9\xd1\xdf\x50\x34\x98\xb2\x05\xa8\xf7\ \xa7\x01\xd1\xb5\x37\xcf\xd1\x9c\x08\xc1\xd0\x6e\xe4\xa8\x38\xb9\ \x14\xbf\xe0\x7d\x14\x18\x21\xc8\xce\xac\x86\xd4\xb9\xdc\xa6\xa4\ \x39\x11\x33\x39\xce\xf6\xaa\x51\xbc\x3d\x08\xdf\x27\x75\xfa\x30\ \x26\x00\x1a\x63\x48\x24\x9c\x70\xbc\x2c\x58\x01\x38\x68\x93\x0c\ \x22\x13\x2f\x03\x11\x00\x39\xca\x7d\x46\xa3\x3b\x8f\x62\x85\x60\ \x28\x25\x44\x36\x7c\x34\xe5\x9c\x27\x77\xe5\x3f\x78\x7b\x0f\xe6\ \x46\xcf\xc1\x2a\x47\xcf\x76\x42\x4a\xa0\x78\x47\xf0\x2b\xfe\x85\ \x23\x99\x00\x68\x8a\xd0\x0f\x97\x0b\x3a\xfc\x4f\xf8\x79\x37\x38\ \x0f\x0c\x30\x30\x01\x90\x23\x47\x64\xa6\x58\x1d\x98\x36\x1c\xaa\ \x6f\x6c\xed\x23\xc4\xc7\x95\xde\x48\x4a\xf1\xb4\x61\x3c\x7c\x07\ \x15\x9f\x93\xe1\xf9\x95\x7c\x47\x80\x0a\x34\xe7\x5f\xea\xda\x2d\ \x88\xcb\x50\x99\x00\x68\x88\x78\xab\x8d\x82\x16\x80\xa8\x49\xab\ \xc0\x73\xd0\x02\x43\x15\x00\xc4\x33\x91\x79\xb7\x48\xa0\xfc\x68\ \x8c\x61\x13\xbf\x39\x05\xa4\x49\xcb\x20\xcd\x61\x3c\x8d\xf0\xf8\ \x7b\x64\xda\x8c\xc4\xfd\x82\x2f\x97\x7e\x76\x8d\x7a\x10\xd9\xf3\ \x7f\x03\xd9\xd9\x35\xd0\x5c\x70\xe5\xd5\x86\x22\x5c\x21\x56\x7d\ \x7d\x2b\xe4\xc6\xda\x62\x12\xb1\x8b\x89\x29\x1b\x07\xd6\x06\x36\ \x7c\xb9\x47\xd0\x02\x10\x38\x22\x0c\xfc\x07\x87\x1b\xb2\x00\x20\ \xb2\x6d\xbb\xfb\xf8\x17\xac\x72\x81\xf6\x9a\x87\x06\x45\xfc\xd6\ \xb2\x9b\xb8\x39\x98\xf4\xe8\x73\x12\x1f\x6d\xbf\x7c\x46\x77\xfb\ \x3d\x3b\x12\xa2\xe2\xa9\xd4\x28\x01\x89\x4e\xa6\x01\x31\x12\xe2\ \x8a\x26\x0a\xb5\xe3\x60\xcc\x04\x60\xf7\x1f\xc7\x04\x2d\x00\x4e\ \x6f\xf9\xe2\xef\x69\xd8\x02\x80\xc0\x5d\x7c\x4a\x86\x61\xb0\x85\ \x98\xec\xce\x37\x04\x01\xc0\xb6\xdc\xbc\x58\x5b\x8e\xa5\x22\x23\ \xa0\xd4\x0b\x89\x4f\x45\xbe\xb3\x85\xa1\x6c\x2d\x62\x02\x90\x68\ \x77\x5e\xb0\xe4\x3f\xee\x70\x01\x6c\x07\x78\xf4\x19\x01\x28\xf7\ \x25\x21\x32\xc5\xc3\x5f\x3c\x75\x18\x86\xca\x45\x5b\x02\xa0\xe2\ \xc4\x52\xdc\xeb\x57\x79\x61\x1d\x54\xdf\xda\xa1\x88\x9b\xdb\xf1\ \x67\x04\xb8\x07\x90\x98\x6f\x2a\x80\x54\x1a\x70\xce\xbe\x3e\xf5\ \x04\xfa\xf2\xbd\x68\x4b\x57\xcb\x8c\xa3\xfc\x48\x14\x5e\xd3\xcb\ \xeb\xc3\x36\xde\x02\x67\xfe\x67\xf2\x7c\xa7\x1e\x2f\x2d\x41\x64\ \xdb\x69\x8d\xfc\x4c\x00\x16\xbc\x13\x2b\xe8\xbb\xff\xf6\xbf\x0e\ \x81\xa3\x89\xa1\x46\x00\xf4\xe5\x9e\x92\x59\x28\x02\xbd\x00\x6c\ \x49\xc6\x9a\x7a\xf1\xd6\x40\xac\x40\xb4\xc9\xee\xf1\x15\x02\xec\ \xec\x23\x25\x3f\x24\x65\xb9\x1a\xdb\x84\x8a\xdd\xad\xf0\x2c\xaf\ \xf2\x3a\x51\x60\x86\x42\x81\x8b\x05\xb3\x05\xd7\x26\xa2\x47\xae\ \x15\xb4\x00\x2c\xfd\x2a\x01\xdc\x07\xcd\xeb\x53\x02\x80\x20\x64\ \xca\x92\x1f\x07\x7a\x13\x78\x57\x2f\x58\xeb\x41\x84\xe0\x2e\x2f\ \x11\x68\x29\xbc\x84\xdd\x82\x6a\x13\x90\xa0\xc0\xc5\x12\x8f\x0e\ \x62\xc5\xde\x08\x6c\xf4\x49\x9f\x35\x02\x57\x9c\x51\x04\x46\x13\ \x30\x01\x58\x33\x69\x87\xa0\x05\x60\xa1\x45\x34\xf8\x9a\x86\x18\ \xba\x00\x70\xef\xfa\x9f\x82\xa4\xe8\x75\xa4\xda\x8d\x86\x9a\xdb\ \x3b\x91\xe4\x7c\xda\x94\x35\x9f\x5a\x44\x31\xc0\xfc\x01\x59\x4b\ \x8e\x7f\x2f\xf7\xd5\x69\x9b\x33\x13\x80\x6d\x3f\x1f\x16\xb4\x00\ \xb8\xbd\x8f\x03\x40\x7d\x54\x00\xe4\x59\xf3\x2c\x9b\x91\x94\xf3\ \xb2\xee\x51\xb8\xde\x13\x9e\x37\xaa\x74\xf7\x41\x07\x20\xd9\x3a\ \x51\x5f\x32\x31\x61\x02\x70\x68\xd6\x19\xc1\x92\x3f\xc9\xf9\x2a\ \xd8\x99\xb8\xf7\x6d\x01\x90\x03\xeb\xe8\x24\x54\xc6\x0c\x78\xc6\ \xdc\x91\x98\x2c\x24\xc0\x10\x99\xec\xfa\x93\x83\xfc\xfb\xcb\x9f\ \xe1\xf3\x32\x09\xb2\x6c\x09\x6c\xf0\x9f\xf1\xbf\x91\xe7\x60\x1b\ \x2d\x5f\x51\xc9\xf4\xfd\x0e\x5a\x4a\x6f\xaa\x12\x01\x6c\xef\x95\ \x6d\xf3\xe8\x0b\xc4\x67\x02\x10\x2c\xf0\x35\x60\x7b\x67\x9e\x00\ \x7b\x13\x6f\x01\x08\x80\x4e\x81\xa1\x36\x0a\x8b\x9d\x19\x48\x66\ \x0d\xa7\x1e\x39\xd2\x44\x63\xb0\x72\xc0\xa7\x5d\xb7\x72\x8f\xbf\ \xa1\x13\x9f\x09\x40\xf8\x27\x2b\x05\x1d\xfe\xaf\xf9\x7e\x3b\xb8\ \x0e\x0c\x64\x02\xd0\xf3\x48\x03\xb7\x08\x8b\xbb\x0b\x01\x4e\xf7\ \x55\x5e\x4a\xe0\x33\x14\x84\x53\x85\x4c\x00\x0c\x58\x00\x56\x8c\ \xdd\x2c\x68\x01\x88\x18\xb7\x0c\xbc\x06\x2d\x64\x02\xa0\x76\x64\ \x30\x06\xd2\x29\xe5\xc8\xd2\x3d\x0b\x79\xf5\x0a\x54\x1f\x9a\xcf\ \x04\xc0\x50\x05\x60\xd3\xb7\xfb\x05\x2d\x00\x3e\x9f\x2e\x80\x00\ \x4a\x0b\x30\x13\x00\xfe\x8d\x49\x39\xf6\x66\x58\x8e\xeb\x66\x62\ \xb2\x25\x00\xef\xf4\x7d\x54\x04\x98\x00\xec\x9b\x72\x52\xd8\x6b\ \xc0\x86\x68\x6b\x04\x98\x6d\x07\x2e\x74\xb7\x52\xea\x5f\x50\xb0\ \xda\x55\x75\x27\xe1\x73\x09\x9a\x87\x32\x01\x30\x20\x01\x08\x22\ \x38\xe1\x70\x49\xb0\xe4\x3f\x6c\x7b\x06\x44\x03\x3c\x98\x00\x68\ \x37\x59\xd8\x75\x9c\x17\x91\x1b\x63\x03\x2f\x5a\x52\x55\x38\xf8\ \xa4\x1b\xd2\x9e\x03\x26\x00\x21\x1f\x2c\x15\xf4\xdd\x7f\xd3\x6f\ \xfb\xc0\xd9\xc4\x9f\x09\x80\xf6\x13\x84\x4a\x67\x15\x72\x22\x67\ \x77\x6e\xef\xa1\x00\x7f\x6e\x20\x7b\x0e\x98\x00\xc4\x99\x27\x08\ \x5a\x00\x62\x27\xaf\xa1\xae\x01\x63\x02\xa0\x79\xb7\x5e\x96\xed\ \x28\x25\x0e\x3f\x73\x55\xd9\x7c\xe1\x66\x60\xf9\x46\x5f\xbd\x81\ \x09\xc0\xba\xcf\x85\xbd\x06\x2c\x68\x64\x38\xf8\x99\x86\x19\xa5\ \x00\x48\x17\x7f\x0d\xd5\x89\x21\xd0\x94\x96\x08\xed\xb5\xe8\x25\ \x80\x8b\x39\xdb\x64\x77\xd0\xe8\x13\x6b\xf4\xc1\x9f\x69\xfa\x39\ \xd8\x90\xd4\x4d\x04\x30\x12\x48\x55\xb5\x00\x15\x8d\x48\xf5\x48\ \x7a\x26\x00\x3b\x7f\x4d\x14\xf6\x1a\xb0\xb7\x71\x0b\xb0\x71\x09\ \x40\xe0\x44\xa8\x39\x1d\x8b\xeb\xb2\xf8\xf4\xee\x57\xee\xf6\xd3\ \xf8\x33\x73\x1c\xba\xef\xf3\xcb\x8b\x17\x61\x33\x10\xa7\xbd\xd7\ \xb3\xd3\x74\x11\xd2\x3d\x98\x00\x1c\xb1\x39\x27\x58\xf2\x9f\x70\ \xbc\x04\xb6\x26\x1e\xc6\x25\x00\x21\xdf\xe1\xaa\xec\x1e\xce\xf5\ \xe3\x16\x5f\x22\x1c\x1a\x7d\x76\x9e\x93\x45\xf7\xf9\x81\x0d\xde\ \x2a\x77\x05\x36\x3c\xd8\xa9\x0f\xc2\x33\x01\x98\xff\x56\x0c\x5a\ \x65\x0b\x55\x00\x76\x4e\x39\x82\x1e\x00\x46\x23\x00\x8b\xbe\x82\ \xd6\xe2\x2b\x6a\x3b\xfc\xd4\xdf\x27\x44\xf4\x1f\xa7\xc1\x35\xa0\ \xb9\x87\x5a\x7b\x0e\xaa\x13\x43\x7b\x9b\xf0\x4c\x00\xa2\x86\xad\ \x11\x74\xf8\xbf\xe2\xeb\x4d\xe0\x3e\x30\xd8\x68\x04\xa0\xe1\xf1\ \x7e\x8d\x6d\xbe\xaa\x4f\x84\xe3\x7b\x69\x35\x12\x50\xbd\xe7\x00\ \x8f\x0a\xbd\x5c\x19\x60\x02\xb0\x6a\xc2\x36\x41\x0b\xc0\x62\xeb\ \x58\xf0\x19\x14\x62\x0c\x02\x80\xb5\x75\x0d\xc9\x2f\x5f\xb3\x1d\ \xf6\x03\xbe\xa7\x16\x23\x01\x34\xf8\xac\xb9\xb3\x4b\xf5\xca\xb3\ \xc5\xdf\xf4\x16\xe1\x99\x00\x6c\xfd\xe1\x90\xa0\x05\xc0\xe3\xc3\ \x60\x08\xc0\xdf\x55\xf8\x02\xd0\x94\x99\xa4\xaa\x0b\x0f\x7d\xff\ \xf8\xd8\x7c\xd5\x9e\x5f\xae\x8d\x6b\xc2\xad\x47\x0a\x56\x5e\xb3\ \xcd\xa1\x29\xf7\x02\xd7\x67\x63\x14\xd3\x4b\x84\x67\x02\x70\x60\ \x46\xb2\x50\xc9\x8f\x2b\xce\x45\xa6\x98\x00\x14\xbe\x00\x84\xfd\ \xc0\xed\xd7\xf7\xf8\x08\x48\xdc\x26\xcb\xcd\x34\x17\xfd\x05\xad\ \xd2\xbb\x5c\xe5\x39\x79\x2e\x40\x43\xe4\xd8\x2b\x96\x08\x25\xae\ \x9f\x41\x7b\x0d\xb7\xab\x71\xe5\x4e\x9d\xb7\x0b\x33\x01\x08\x12\ \xb8\x07\xc0\xfe\xd9\x27\x41\x34\xc0\xdb\x28\x04\xa0\x72\xb7\x2f\ \xbd\xcc\x56\x74\x15\x52\x66\x62\xb3\x4e\xb7\x4d\x3c\x5c\xbd\xfb\ \x72\x6f\x3f\xcd\x91\x6d\xa7\x28\x02\x39\xe1\xd3\x39\xcb\x83\xed\ \x75\xff\x40\xe3\x93\x03\xd0\x5a\x7a\x0d\xc5\xa2\xb5\xfc\x26\x34\ \xa6\x1e\x25\xa5\xcd\x18\x90\x46\xfd\xc6\x04\x40\x1b\x08\xfb\x78\ \x85\xa0\xc3\xff\xf5\x3f\xed\x04\x97\x81\x01\x46\x21\x00\x35\xc9\ \x51\x54\x32\x95\xec\x5e\x48\x73\xf7\xe1\x3c\x93\xcb\xd6\xdb\x6b\ \x78\x5d\xdc\x7b\x0e\xca\x8f\x50\xaf\x59\xf5\x56\xe4\x87\x7b\x40\ \x1a\xf1\x33\x13\x00\x4d\xb0\xcc\x7a\x93\xa0\x05\x60\xc9\xf8\x95\ \xe0\x65\xba\xd0\x18\x04\x00\xcf\xec\x34\xc2\x14\xac\x72\xa6\x0a\ \x80\x34\x89\xfa\x3a\x5c\x1f\xae\xd5\xeb\xf4\x55\xf4\x14\x10\xcf\ \x18\xc9\x99\x0f\xe0\x06\x46\x09\x9a\x0c\x15\x31\x01\xd8\xf8\xf5\ \x3e\x41\x0b\x80\xdf\xd0\xc5\xe0\x6f\x1a\x6e\x14\x02\x50\x7d\x22\ \x82\x4a\x94\xb2\x43\x91\x72\xd2\x77\x99\xe5\xaf\x7f\x72\x84\x2e\ \x00\x6b\x6d\x75\x32\x40\x94\xfa\xca\xe2\xd0\xcc\x80\x1f\xb9\x8e\ \x21\xaa\xd1\x61\x39\xb6\xc5\x85\x09\x80\x3a\xd8\xf3\xe7\x71\x61\ \x7b\x00\xbc\xe1\x83\xbf\xa7\x31\x08\x80\x74\xb3\x2b\x8d\x24\x78\ \x86\x96\xb8\x4c\x00\x89\xa3\x05\x64\xba\x59\x41\xa6\xab\x25\xa4\ \x8b\xcc\x70\x01\x08\x9e\xc3\x29\x61\xb6\x34\xe4\x5b\x9d\x9c\xb3\ \x4b\x3c\xac\x3b\xf7\x01\xa6\xcc\xb1\xc4\x64\xa4\x66\x65\xcb\xa7\ \xea\xe4\x05\x98\x00\x1c\x13\x5d\x10\x2c\xf9\x13\x45\xe7\xb1\x05\ \xd8\x58\x04\xa0\x28\xe0\x73\xce\x3b\x69\x6b\xc5\x6d\x28\x5a\xef\ \x08\x59\x5e\x24\x21\xe7\x3b\x11\xca\xf6\x06\xe2\x34\x1e\xe5\xf9\ \xb8\x99\xb7\xcc\x1b\x77\xfa\xe9\x04\xf9\xce\x96\x94\x3c\x80\x7a\ \x68\x7c\x7a\x90\x09\x40\x4f\xb0\xf0\xdd\x78\x41\xdf\xfd\xb7\xfc\ \xbe\x1f\x9c\x06\xfa\x19\x8b\x00\xe0\xd2\x90\xda\x07\x9a\x77\x01\ \xca\x13\x87\x0b\xa0\xc8\x0d\x37\xee\xea\x0c\x39\x1e\x13\x78\xee\ \x18\x10\xf3\xba\x66\xd9\xf2\xe9\x4c\x00\xf8\x22\x76\xd4\x7a\x41\ \x0b\x40\xdc\xe7\xeb\xd1\x03\xc0\x58\x04\x20\x47\x64\x06\x59\x41\ \xbf\x70\x0f\xdd\xf0\x4f\xae\x61\x68\xce\xbd\x72\x5b\x73\x54\xee\ \x09\xe0\xbc\x8e\xaa\xcb\x09\x90\xee\x3a\x59\xbe\x15\x39\x31\x96\ \xbb\x79\xe9\xc2\x0a\x26\x00\x7c\xb1\xf6\xb3\x9d\x82\x16\x80\xf9\ \xe6\x4b\xc0\xcf\x34\xd4\xa8\x22\x00\xcc\xea\x27\xaf\xd0\x58\x00\ \x0a\xd6\xb8\xe1\x7b\xe9\x3a\x02\xa8\xbf\xb7\x9d\x76\x0d\xb8\xd5\ \x58\x59\xd5\xa2\xec\x20\x3d\xd9\xd9\x92\x7f\x81\x09\x00\x5f\xec\ \xf8\xe5\xa8\xa0\x05\xc0\xf9\xdd\x0e\x0b\xb0\x08\xa3\x11\x80\x42\ \x17\x3c\x53\x83\x78\xda\x70\xa8\xa3\x66\xf6\x55\xa3\xe2\x58\xac\ \x7c\x82\x4f\x77\x39\x00\x44\x73\xd6\x29\xea\x75\x64\x05\xfe\xa4\ \x4c\x00\x30\x32\xa1\x1c\x09\x30\xa7\xc1\x04\x80\x27\x0e\xcf\x39\ \x2b\x58\xf2\x9f\x74\xbe\x02\x76\x03\x71\x0d\x98\xd1\x08\x40\xa9\ \xf7\x18\x85\xfa\x3a\xad\xc1\x87\x6e\xd4\x29\x81\xd2\xbd\x8b\xe4\ \xcb\x40\xa7\x0f\xd3\x79\xdb\x6d\x6b\xc9\x35\xda\xf5\xe0\xcc\x00\ \xa5\x77\x81\xb6\x96\x0c\x8f\x3f\x15\x01\xe3\x99\x00\xa8\xc2\xbc\ \x37\xa3\xb0\x4f\x5e\xa8\x02\xb0\x7b\x7a\x22\x38\x98\xf8\x18\x93\ \x00\x20\x24\x72\x83\x4e\xdc\xed\xcf\xdb\x03\x40\x7c\x0c\xb2\x82\ \x7f\x55\x20\xd9\x33\x91\xb9\xce\x05\xa0\x39\x3b\x99\x76\x4d\xb8\ \x7f\x50\x09\xf9\x51\x18\x68\x89\xc3\xe7\x8d\x4f\x58\x04\xc0\x07\ \x4b\x86\xae\x12\x74\xf8\xbf\xea\xbb\x2d\xe0\x36\x28\xc8\xe8\x04\ \xa0\xd0\xcd\x0a\x49\x22\xf1\xf8\x12\xef\xe8\xd4\xb3\x72\xd1\x55\ \xa8\x7d\xb0\x8f\x9c\xa7\xc3\x20\xd3\xef\x7b\x7c\x4d\xd7\x3d\xfc\ \x65\xde\x63\x74\x2e\x00\x75\xf7\x76\xd0\x13\x80\xd7\xb6\x40\xea\ \xcc\xe1\x80\xbd\x0b\xae\x96\xf8\xf7\xd4\x59\x23\x30\x4a\xa1\x96\ \x2e\x59\x0e\x80\x1f\x56\x8e\xdd\xd2\x2b\x44\xdc\x37\xeb\x24\x2c\ \xff\x7a\x23\x84\x8d\x8e\x87\xa3\x76\xbd\x77\xe4\x08\x1d\x13\x0f\ \xde\xa6\x8b\x04\x2e\x00\xf4\x7e\xfb\xca\x8b\x1b\xe8\x19\xfe\xda\ \x7f\xb8\xc2\x6b\x44\xae\x83\x45\xef\xd8\x8a\x6f\xf3\xe3\x36\x26\ \xb9\x9e\x00\xcf\x82\xbf\xc4\xe6\xa5\x67\x81\x9f\x83\xec\x54\x2c\ \x57\x95\x83\xfc\x7c\x19\x13\x00\x3e\xd8\xfc\xfd\x41\x9d\x10\xef\ \xe0\xdc\x53\x64\x09\xe7\x36\x58\x64\x15\x03\xa2\x37\x3c\x60\xda\ \x6b\x76\x9d\xb0\x19\xec\x0a\x09\xbf\xec\xe9\x15\x01\xf0\xfa\x78\ \x1e\x04\x0c\x8e\x30\x46\x01\xc0\x09\x3e\xb4\xe3\xe6\x6e\x0b\xa6\ \x22\x8b\x08\x48\x6f\x8d\xde\x66\xb9\x4d\xc4\xfd\x00\x2a\x3c\x0c\ \x30\xb4\xe7\x71\x94\xc1\xce\x46\x26\x00\x3c\xb0\x7f\x5a\x92\x56\ \x88\x76\xc4\xee\x2c\x4e\xdc\x21\xe1\xdf\xf4\x44\xa2\xab\xc2\x7c\ \xf3\x28\x34\xea\xd4\x11\xf9\xd1\xdf\xd0\x6e\x30\x76\x00\x1a\xa5\ \x00\xd4\xdd\xd8\xc8\xb9\x8c\x23\xcd\x61\x3c\x95\xfc\xd9\x76\xa3\ \x70\xff\x5f\x2f\x09\x00\x6e\x16\x92\x26\x2d\xd3\x4a\xe3\x52\xdd\ \xc3\x03\x80\x9d\x85\x4c\x00\x54\x60\x48\x24\x21\xe0\x65\x8d\x09\ \x6f\xcf\x49\x78\x6e\x38\xbd\xe3\x0d\xbb\xa6\x27\xea\x28\x0a\x49\ \x06\x91\x89\x97\x51\x0a\x80\x34\xf2\x57\xce\xbb\xbf\xec\xcc\x6a\ \x65\xc4\xc7\x8c\x7f\x81\xab\x65\xaf\x9b\x6f\xa4\xcf\x1a\x0e\xa9\ \xb6\xd6\xd0\x5a\x76\x53\x63\x0b\xb3\x0c\x9f\x6f\x71\x85\x39\x8b\ \x00\x54\x20\xf4\xc3\xe5\xbc\xc9\x74\xf4\x15\xc2\x3b\xbf\xeb\xdb\ \x63\xa2\xcf\xe8\x6f\x0f\xb6\x03\x3c\xd0\x95\x77\xfa\x6b\xf6\x8a\ \x3f\x1b\x20\x82\xa8\x49\xab\xe0\x94\x96\xab\x11\x09\x3f\xef\x06\ \xe7\x81\x01\x46\x29\x00\x8d\x4f\x0f\x71\xde\xfd\xd3\x9d\x27\x21\ \xe1\x09\x51\x3a\xee\xbe\xb8\xd1\xa7\xd0\xd5\x92\x72\xd7\xd7\x3d\ \x32\xfe\xe5\x0f\x80\x1d\x8c\xdc\x2d\xc1\xdc\x47\x84\xfc\xe5\x8e\ \xf8\x3e\xe4\x77\x62\x02\xa0\x0a\xf1\x56\x1b\xe9\x84\x17\x9d\xeb\ \x20\x3c\x26\xd1\x5c\xdf\x0f\x20\xa4\x15\xf5\x84\xf0\x48\x72\x9b\ \x01\x6e\xb8\x87\x0f\xe7\xf0\x4d\xe5\xe7\x70\xbf\xc1\xa1\x30\xb7\ \xbf\x6b\xb7\xd7\x78\x7c\x18\x84\x77\x6d\x2d\x09\x00\x8a\x8a\xe7\ \xa0\x05\x46\x27\x00\xb2\x04\x47\x2e\xa2\x60\xa8\xfd\x92\xfc\x5a\ \xcb\xf0\x6b\xee\x17\x68\xf1\xca\x58\xf0\x4f\x38\x15\xd8\xd3\x3b\ \xff\x4b\xf2\x23\xb2\x6d\xcd\x98\x00\xa8\xc2\x86\x2f\xe5\x89\xb8\ \x44\xfb\xf3\xb0\xe9\xd7\xbd\x10\x31\x7e\x85\x5a\x84\x9f\xf1\x9a\ \x08\x09\xef\x64\xe2\x87\xa4\x0b\x78\x49\x78\x1a\x02\x08\x3a\x9e\ \x3b\xad\xcb\xe7\xcc\x19\xe4\x04\x6b\x7f\xd8\xae\x15\x01\x08\x18\ \x11\x0a\xfe\x83\xc3\x8d\x4b\x00\x82\x26\xa1\x65\x16\x17\x51\xd2\ \xec\xc7\xbd\x3c\xe7\x9b\x19\xd4\x86\x61\xb1\xdc\x9f\x00\xaf\x91\ \x54\x30\x54\x6d\x12\x42\xd4\x3d\x3a\x84\x96\x66\x0a\x0b\x48\x54\ \xb7\x2e\x33\x01\x58\x3d\x61\x3b\x84\x8f\x5e\x4a\x42\x7a\x3f\x75\ \xee\xf0\x78\x17\x77\x1c\xe8\x8b\x84\x57\x37\xd3\xee\x3d\x68\x11\ \xcc\xea\xef\xa8\x34\x41\x78\xdc\x41\xb3\x11\x65\xa7\xb7\x70\x09\ \x88\x51\x09\x40\x4d\x72\x34\x27\x59\x4a\xf7\x87\x02\xde\xfd\x09\ \x08\xe9\x0c\x6a\x19\x67\x96\x2d\x1e\x03\x14\x40\x06\x80\x70\x91\ \x48\xdd\xa3\xc3\xd0\x5a\x71\x07\xda\xeb\x1e\x41\x5b\xe5\x3d\x68\ \x48\x3b\x81\xad\xca\x24\x5a\xe8\xf6\x1a\xc9\xcc\xe1\x6c\x1c\x98\ \x0f\x7c\x4d\x43\xf9\x13\x9e\x60\x4e\x7f\x17\x0a\xe1\x35\x02\xde\ \xa5\xed\x4d\xbc\xba\x7e\x26\x56\x13\xb6\xfd\x75\x58\x2d\xf2\x1f\ \xb7\xbf\x80\x39\x07\x63\x12\x00\x69\xdc\x9f\x9c\xa5\xb4\xd6\xf2\ \x5b\x90\x32\xcb\x0c\xf0\xac\x6d\x83\x25\x3e\x43\x02\xce\x1b\xa4\ \x4c\x1b\x8a\xd7\xa7\x26\x30\x8a\x28\x72\xb7\x66\x02\xc0\x07\xee\ \x83\xe6\xf1\x27\xbc\xce\x43\x69\xbc\x1e\x4c\x16\x2a\x5c\x47\x7f\ \x11\x1e\x4b\x7a\xe8\x58\x4c\x84\xe3\x20\x26\x1c\x8d\x44\x00\x30\ \xf4\x6f\x29\xbc\xc8\x75\xf7\xc7\xe5\x9c\x48\x12\x82\x12\x4f\x03\ \xb8\xfb\x53\x3a\x18\xe5\x47\x81\x1e\x03\x77\x0f\x30\x4b\x30\x7e\ \x40\x82\xc8\xc9\x26\xea\x24\x3c\x99\x9d\xd7\xd7\xd9\x19\xa3\x92\ \xb9\x03\xdc\xba\x09\x92\xfb\x87\x81\x70\x60\x36\xff\x9e\x85\xa5\ \x5f\x25\xa0\xa0\x08\x5e\x00\x54\xd7\xfc\x11\xb5\x2f\x6b\xe3\x04\ \x18\x6a\xe3\xeb\x0c\x14\x45\x28\x02\x3d\x8b\x04\xc4\x3d\xed\x5a\ \x64\x02\x80\x49\x38\x14\x01\x24\xbc\x3c\xa4\x37\x00\x44\x60\xf5\ \x60\x5a\x7f\xc5\xbc\xc4\x2c\x13\x47\x24\x36\x1f\x01\x58\x68\x11\ \x0d\x3e\xa6\x21\x46\x21\x00\x95\xdb\x3c\xb8\x33\xe4\x0d\x4f\x20\ \xdd\xe5\x33\xca\xd9\xdf\x20\x81\x11\x4a\x86\x7c\xa0\x89\x13\x69\ \x33\x86\xcb\xc3\x7e\x26\x00\xc2\x80\x3c\x41\xe8\xd4\x2d\x1a\x08\ \x1c\x11\x8a\x3e\x7f\x5c\x02\xe0\xf6\x7e\x20\xbe\x87\xd0\x05\x40\ \x1a\x3f\x85\x10\xfc\x31\xa7\x00\x14\x6d\xf6\x43\xa2\x68\x29\xf3\ \x8f\x1e\xfc\x95\x5b\xdd\xa1\xfa\xd0\x7c\xa8\xda\x1f\x08\x68\xc7\ \x1d\xfa\xbd\x4e\x84\xa0\xd8\xc3\x1a\xb2\x6d\x47\x61\x5d\xff\x15\ \xd2\xa3\x9b\x30\x99\x75\xc0\xde\x05\xb6\x18\x44\xb8\xc0\xdc\x83\ \x83\x89\x77\xb7\x72\xa1\xed\x10\x37\xd8\xf4\xdb\x5e\xa5\xe4\x4f\ \x72\xbe\x0a\x76\x26\xee\x42\x17\x00\x24\x5d\x9b\xec\x0e\x77\xe8\ \xff\xf7\x7e\x78\xfa\x32\x9c\x26\x09\x36\xb4\xe2\x56\x8b\xf4\x41\ \x13\x91\xf0\xb8\x6e\x9c\xd2\x84\xd3\x94\x95\x04\x55\x7b\x02\xa0\ \xc2\x7f\xbc\x6e\x08\x49\x40\xae\x9f\xd2\xac\xc4\x04\x40\xc8\xc0\ \x44\xe4\xcc\x2e\xe5\x42\x52\xba\xc4\x46\xa5\x93\x5d\x12\x84\x7b\ \x67\x1e\x07\x7b\x13\x6f\x61\x0b\xc0\xfc\xc9\xd0\x92\x7f\x9e\x8b\ \xfc\xb8\xf8\x33\x4d\x24\x37\x07\xc9\x77\x56\xef\x8c\x2c\x5b\x36\ \x1d\x5a\x4b\xaf\xf3\x6e\xca\x69\xce\x39\x03\xd2\xd8\x3f\x7a\x83\ \xa4\x4c\x00\x8c\x08\x98\x98\xb4\x19\xe0\xde\xf5\x48\x80\xad\xc9\ \x7b\x66\x76\xee\x35\xc0\x29\x44\xd7\x81\x41\xc2\x15\x80\xe0\xc9\ \xd0\x94\x96\xa8\xd2\xd5\xe7\x59\xe8\x34\x8d\x6b\xe3\x95\x5b\x5c\ \x29\x33\x05\xdc\x78\x5e\xff\x08\xa4\x2b\x66\x32\x01\x60\x02\xa0\ \x6d\x44\x20\xb9\x67\x74\x39\x12\xcc\x1c\xe0\x00\x71\x93\xd7\xa2\ \xbb\x51\xf8\xd8\xa5\xe0\x35\x68\xa1\x30\x05\x60\xc1\x17\xaa\x56\ \x7f\x23\x8a\xb7\x07\xbf\x5a\x1b\xc7\x05\x1c\x3d\x0e\xfb\x57\xce\ \xe2\x4b\x7e\x9a\x2b\x8f\x0e\x97\x77\x22\x98\x00\x18\x2b\x7c\x4c\ \x17\x63\xd9\xb2\x6b\x34\xe0\x37\x74\x11\x29\x19\x06\x61\x55\x43\ \x68\x02\x20\x5d\xf4\x35\x34\xe7\x9e\x55\x49\xbc\xca\x4b\x1b\x15\ \xb7\xef\xda\x9b\xab\x11\x65\x7c\x06\xad\x15\xd8\x52\xac\x11\x9a\ \x9f\x9d\x46\x6f\x3e\x26\x00\x4c\x00\x74\x90\x20\x8c\xc0\xbe\x85\ \xae\x22\x30\xbb\xbf\x13\xfe\x5c\x48\x02\x20\x8d\x9f\x8a\x3d\xfe\ \x7c\xfa\xe2\xc5\xd3\xe5\xe5\xb3\xf4\x99\x23\xd4\x9a\x8b\xaf\x3e\ \x16\xa6\xb5\xc5\x22\x95\x3b\xbc\x98\x00\x30\x01\xd0\x69\x82\x50\ \x61\x9e\xc0\x6e\x80\xa7\xa0\x04\xa0\x72\xa7\x0f\x3c\x6f\x16\xab\ \x5e\x89\x95\x99\xac\x60\xf1\x95\x32\x55\xed\x9a\xbf\x4a\xb1\xa9\ \xfb\xe7\x60\xc7\xaa\x71\xdc\x1a\xd4\x90\xce\x79\x24\x41\xcb\x6f\ \x9d\x92\x95\x09\x00\x43\x80\x69\x38\x88\x06\xa0\xf5\x18\x36\x11\ \x09\x42\x00\x16\x7e\x05\xf5\x77\xb6\xf2\xdb\x87\x97\x7d\x16\x0d\ \x35\x5e\x0d\xfd\x0b\x5c\x2c\xd5\x9d\x29\xe0\x5e\x15\xb6\x73\xbe\ \x92\x25\x1d\x4b\x38\xe7\xf4\x2b\x16\x7c\xc9\x04\x40\x9b\x0f\xff\ \xb7\x62\x07\x06\x0c\x89\xdc\x4b\xbe\x6c\x2f\x98\x00\xc8\xe1\x36\ \x28\x90\x44\x04\x0b\xfb\xbc\x00\x54\x6e\xf7\x84\xf6\xea\xfb\xbc\ \xc8\xdf\x56\xf5\x00\x0d\x3e\x14\xad\xbc\xd5\x6f\xf8\xa9\xdc\xed\ \x47\xbf\xf3\x3f\x3e\xa2\xbc\x15\x77\xea\x30\xce\xfd\xfe\xb2\x0d\ \xf6\x7d\x89\xfc\x2f\x2a\xfc\xc7\xec\x2d\xf7\x9f\x34\xb0\x9f\xa1\ \x3f\x82\x5e\x8f\xb2\x20\x5f\xb8\x9b\x8c\xfc\x14\xf4\x31\x01\x90\ \xad\xb1\xc1\xc4\x59\x0f\xcf\xd9\xb8\x0d\xb8\x3e\xe5\x38\x14\x6e\ \xf0\x82\x2c\x7b\x2b\x8d\xfc\xf0\xaa\x8f\x87\x73\x54\x17\x82\xa8\ \x2d\xb9\x15\xc7\xe2\x38\xf2\x00\xde\x7d\x85\xfc\x0f\xca\x7d\xc7\ \x8d\xeb\xd7\xb7\x1e\xf0\x6f\x41\x83\x23\xfe\x24\x5f\xbc\xbc\x3e\ \x47\x14\x26\x00\x18\xea\x57\x1d\x9c\x27\x27\xbe\xe6\x0b\x3d\x31\ \x89\x47\xba\xf7\xb4\x2e\x00\x25\x3b\xe7\x51\x04\x80\x73\xbd\x37\ \x46\x15\x06\x4e\xfc\xe2\x0a\xdf\x71\x0e\x10\xd2\xef\xdf\xfb\xf5\ \xd5\x47\x88\x69\xc8\x7f\x0b\x1a\xb2\x24\x84\x7c\x01\x1b\x0d\x9f\ \x20\x4c\x00\x2a\x4f\x44\xa4\x35\xa5\x1f\xa3\xd4\xda\x35\x06\x76\ \xef\xc9\xd6\xcc\xed\x51\x99\xb1\x6a\x6f\x00\xa7\x10\xd5\x3f\x39\ \xf2\x72\xef\xe0\x30\x48\x9d\x33\x12\x21\xee\x98\xe1\x9f\x42\x8e\ \x00\xcf\xce\xd1\x8f\x00\x6b\x6d\x0d\x95\xf8\x2d\x52\xbf\x71\x2b\ \x65\xee\x56\xff\xab\x9f\x50\x1e\x01\x83\x63\x86\x90\x88\x60\xa7\ \x61\xe7\x07\x98\x00\x90\x96\xd9\x4a\x2d\x12\x9e\xba\x23\xaf\xfe\ \xf6\x16\x90\x2e\xfe\x5a\x39\xe9\x97\xfc\x0c\xd5\x47\x17\x03\x0a\ \x91\x6a\xfb\x2d\x44\xc9\xf6\x00\x5c\xd0\x21\x87\x35\x48\x4f\xc4\ \x71\x5e\x43\xc5\x42\x03\x4c\x02\xfa\x8e\x39\x59\xea\x37\xe1\xed\ \x7e\x42\x7d\x04\x0f\x89\xb4\x22\x5f\xc6\xdb\x46\x4c\x44\x26\x00\ \xf2\x6d\xb9\x28\x04\x35\x49\x91\x50\x7b\x61\x25\x34\xfc\xb3\x17\ \xda\xaa\xee\xa9\xfd\x7e\x0d\xa9\x89\x50\x71\x34\x84\x10\x7f\x09\ \x34\x65\x9d\x52\xb5\x6f\x50\x3e\xae\x6b\x18\x78\x58\xee\x3b\x66\ \x42\x3f\xe3\x78\xc0\xbf\x91\x2f\xe4\x6c\xe2\xca\x5b\x62\x98\x44\ \x61\x02\x20\x74\x14\xac\x72\x51\xaf\x24\xa9\xfd\x69\x42\x29\x49\ \xf0\x79\xc2\x9f\x7f\xfe\x47\x3f\x63\x7b\xf8\x99\xc4\xfd\xf7\x97\ \xf9\x81\xa6\xbe\x43\x22\x26\x00\x6d\x55\xf7\xa1\xf6\xfe\x5e\xcc\ \xb0\x17\x6d\xf4\x81\xdc\xa8\x39\x90\x13\x3e\x1d\x51\xb0\xca\x19\ \xeb\xef\xf2\x46\x1c\xc3\x43\x43\xfa\x49\xcc\x0f\xe4\x3b\xeb\x55\ \x00\x5a\x3b\xce\xf9\x95\x81\x66\xff\xbb\x9f\xb1\x3f\xe6\x9b\x46\ \xbc\x8e\xf9\x01\xbd\x13\x84\x09\x40\x63\x46\x52\x9d\xd2\x33\xbb\ \x38\x11\x0a\xd7\xb9\x83\xc4\xfd\x73\xbe\x96\x58\xb8\x42\x9b\xb4\ \x01\x1b\x12\xf9\xb1\x1a\x91\xe1\xfd\xb5\xdc\xa6\x5b\x4f\xe7\xfc\ \x32\xff\x31\xef\xf6\x63\x0f\xc5\x47\xd0\x90\xf0\x49\x64\xb2\xee\ \x91\xfe\x08\xc2\x04\xa0\x21\x25\xb1\x15\x6b\xf8\xed\x12\xbc\x8b\ \x93\x15\xdd\xb8\xce\x5b\x13\x57\xdc\xfc\x15\x4e\x68\x9b\xad\x0d\ \x02\xb7\x94\xdc\x00\xd9\x99\x55\xb8\x4b\xa0\xe7\x39\x87\x27\x90\ \x3d\xff\x37\x79\xa7\xa0\x77\x6f\xdb\x90\x8d\x4b\x2d\xf7\x1f\xf7\ \x0d\x63\x3a\xc7\x23\xa4\x5f\xc8\xbf\x77\xe4\x07\x08\x4a\x7b\x9f\ \x20\x4c\x00\xf2\x96\xcc\xa8\xc9\x0a\xfc\x49\xde\xbf\xaf\x1d\x60\ \x4b\xb0\xec\xdc\x5a\xf4\x04\x50\x87\xf4\x15\x27\x97\x42\xf6\x82\ \x3f\x3a\x9d\x84\x32\xfd\x7f\x80\xe6\xc2\xab\xbc\xdf\xa3\x31\xeb\ \x0c\xde\xf9\xe5\x03\x49\xc3\x7b\x93\xfc\xb2\x9e\x9e\xf3\x99\x10\ \xf4\x0f\xf9\x1f\x2f\xf3\x03\xcd\xbd\x47\x10\x26\x00\xe9\xb3\x86\ \xc9\x90\x24\x3a\x42\x86\xd7\x57\x20\x4d\x5a\xce\x15\x11\xe0\xcf\ \x6a\xee\xec\xc2\x06\x1f\x72\x8c\xa0\xbb\xee\x4e\x1b\x8e\x39\x88\ \xa6\x9c\xf3\xb4\x52\x1f\x12\xbf\x60\xb5\x2b\xf6\x08\x28\x58\x75\ \x3b\x59\xf4\xda\x39\xbf\xca\x6b\xd2\xff\x51\x93\x06\xec\xe1\x3f\ \x24\xfc\x7d\xf2\xc5\x3d\x68\x38\x24\x62\x02\x20\xfe\x97\xeb\x2d\ \x1a\x60\x92\xfe\x7e\x24\x53\xbe\x33\x02\x72\x1d\xcc\xd1\xe2\x3b\ \x55\x4e\x38\x6a\x9f\xbe\xc4\xfd\x0b\xc8\x8d\x9c\x8d\x24\xce\x8b\ \xb3\xc3\xfd\xf9\xe9\xce\x13\xd5\x11\x16\x74\x18\xce\x8d\xb1\xc1\ \xf7\xc2\xc4\x64\xac\x2d\x6d\xd5\x38\x5e\x3b\x39\x87\xeb\x9a\xfc\ \xe7\x65\x81\x63\x3f\x61\x0c\xd6\xda\xa4\x61\xf8\x64\x32\x6d\xf8\ \x58\x2f\xc4\x61\x02\x80\x2b\xba\x73\xec\xcd\xa0\xc8\xdd\x0a\xca\ \x79\x92\xa7\xd0\xd5\x0a\xd2\x67\xa0\x10\x18\x0a\xf0\x08\x51\xec\ \xa1\xd3\xe4\x5f\x7a\xb9\xff\xd8\xef\x74\x4a\x06\x96\x1f\x88\x2c\ \xd3\x3d\x59\x98\x00\xa4\x4e\x1b\x8a\x2b\xba\xc9\x52\x0c\x4d\xea\ \xdc\x18\x15\x88\xa7\x6a\x87\xc0\xe2\xa9\x43\x21\x63\xce\x08\x10\ \xab\xf3\x5a\x02\xb4\xec\xd6\xe5\x39\x3f\x64\xd2\x7f\xea\x98\x06\ \xec\x11\xf4\x46\xd4\xff\x0d\x30\x5d\x12\x4d\xbe\xd4\x2d\xda\x25\ \x08\x13\x80\x7c\x27\xf3\xc7\x05\xae\x96\xb8\x04\x43\xdb\x9b\x76\ \x25\xb4\xa5\x1a\xdc\xc0\x8d\x3c\x99\xa4\xbf\xbf\xc0\xc5\x02\xca\ \x7d\x5e\x59\xd7\x35\x95\x6f\x74\x81\x11\x8c\xae\x3a\xff\xda\xc8\ \x98\x6e\x42\x49\xf0\xf8\xfe\xbd\x4c\x03\xf6\x08\x1e\x1c\xf9\x01\ \xe9\x1f\x38\xc9\x88\x6d\x80\xab\xc1\xe8\x2b\xb6\x90\xcc\x98\xcd\ \xa7\x12\x1e\xb3\xf4\x90\x6d\x37\x0a\x8f\x11\xb4\xf3\x7a\x19\x11\ \x83\x67\xf6\x66\x5c\x42\x80\x7b\x07\x72\xed\xcd\x29\xc7\x16\x8d\ \x71\xbe\xd2\x6f\xcc\xa7\x7a\xa6\x01\x7b\x04\x99\x86\x7f\x41\x76\ \xfb\x3f\x35\x7c\x02\x32\x01\x90\x93\x77\x4c\x87\x18\x60\x02\x11\ \x13\x89\x8e\xe6\xd8\x9a\x5b\x4c\xcb\x31\x70\x1f\x33\xf0\x75\xb9\ \x8e\x1d\xef\x65\xde\x01\xfc\xe7\x62\x72\xc7\x2f\xd7\xcd\xf5\x4b\ \xfe\xab\xbd\x7b\x80\xb5\x1d\x8b\x02\x30\xbc\xc6\xb6\xbb\x3b\xb6\ \xad\x9e\x3e\x46\xc3\xf8\x46\x98\xf8\x59\x68\xbb\x3b\x6e\x72\xba\ \xc7\x8c\x6f\x84\x89\x5f\x8c\xb1\x6d\xdb\x46\x7b\xf0\x6c\xf7\xa5\ \x77\xec\xa3\xb6\xe7\xff\x92\x15\x4b\xfd\x93\xbd\x2e\x56\xea\xbb\ \x23\x82\x42\xed\x07\x76\x0c\x6d\x33\x45\x2b\x93\xf6\xe8\x03\x22\ \x00\x4c\xbb\xe9\xb9\xfa\xd3\xd9\x97\xee\x22\x28\xa6\xf9\x76\xb4\ \x7f\x68\xdd\x74\xaf\x56\x66\x7d\x97\x3e\x1c\x02\xc0\x6c\x6c\x78\ \xce\x7d\x3f\x79\xce\xc1\x82\x72\x08\xac\xfa\x89\x81\x8a\xef\xef\ \xf0\xa3\x21\x00\xcc\xe3\x89\x37\xee\x0c\x41\x79\xf7\x03\xda\x36\ \xef\xff\xc7\x8f\x85\x00\x30\x9f\xf2\xce\xaf\x88\x29\xe7\x8e\xee\ \xa4\x6d\x33\x57\x2b\xb3\x84\x00\x10\x80\x7f\x98\xe5\x0d\xcf\x8d\ \x78\xe7\x57\xf3\xc7\x86\x07\xe4\xfb\x81\x0d\x04\x80\x00\xfc\xd9\ \x3b\x3f\x99\x7b\xe1\x21\x82\x6a\x0b\x0e\xab\x9f\x1c\x58\xf1\x83\ \x04\x20\x47\x00\x9e\x4c\x16\xb8\x67\x0a\x86\x8b\xb6\xe2\x2b\xb5\ \x32\x9f\x0d\x6d\x00\x08\xc0\x37\x4d\xdf\xbd\x4a\xc0\x7e\x60\xeb\ \x2c\x1d\x9a\x00\x10\x80\x15\xd9\x3b\xff\xcb\x68\xe2\xae\x02\x64\ \x16\x5a\xd1\x81\x95\xdf\x0f\x10\x80\x4d\xd9\x3b\xff\x2f\xcf\x6b\ \x01\xbe\x65\xce\xd1\x96\x79\x9a\x00\x54\x6e\x5e\x6a\x2d\xa8\x5d\ \x24\xc0\xbf\xde\x0f\xd8\xe6\x0b\x02\x50\xf6\x71\xbf\xcd\xde\xf9\ \x9b\x45\xb6\x13\xe0\xbf\x88\x4e\x8d\x76\x2e\xed\x7e\x80\x00\xac\ \xcc\xde\xf9\xdf\xce\xbf\x78\x37\x01\x3a\x11\x1c\x7e\xab\x15\x28\ \x33\xaa\x95\xd9\x48\x00\x0a\x3f\x9b\x9a\x5e\x6d\x51\x5b\xbb\x47\ \x08\xd0\x4d\xe1\x61\x37\x9f\xab\x95\x79\x96\x00\x14\x76\x5e\x49\ \x16\x5c\xec\x08\xd0\x87\xdf\x1f\xf8\x92\x00\x14\x66\xbe\xe3\x9d\ \x8f\xbe\x9a\x6f\xdf\xb5\x5b\x68\x1b\xad\x95\x59\x46\x00\x06\x36\ \x2b\x53\xcf\xb9\x25\x9d\x31\x71\x4f\x01\x06\xe1\x5a\x3b\x56\x03\ \x38\x7b\x4e\x00\xb6\x9e\xd7\xfa\x31\xbc\xe8\x28\x01\x8a\x20\x3c\ \xfc\xe6\xf3\xb5\x32\xcf\x13\x80\x9e\xcf\x6b\xe9\x42\xd7\x15\xa0\ \x88\x67\xcf\x43\x15\x8f\x84\xca\x7c\x45\x00\xba\x3e\xdf\x37\x16\ \xba\x53\x36\x47\xb2\xbd\x00\x45\x16\x59\xd1\xee\xf9\x59\xb3\x55\ \x04\xa0\xe3\x59\x9b\x9d\xd7\x6a\x04\xb5\xbd\x04\x28\x93\x40\xdd\ \x6a\x77\xb0\x1f\x20\x00\x5b\xdf\xf9\x3f\x79\xe3\x8f\x16\xa0\xcc\ \x02\x3b\xbe\x40\x2b\xf3\x22\x01\xf8\xb7\xe3\xbc\x9e\x2e\x74\xc6\ \x0b\x50\xa5\xfd\xc0\xb6\xb3\x66\x56\xfc\x23\x01\xf8\xcb\x69\x54\ \xfa\x8c\x36\xe0\x1d\x72\xfb\x1e\xf9\x7e\x60\x35\x01\xf8\xed\x19\ \xed\xd6\xec\x0b\xf7\x16\x60\x18\x5c\x6b\xc5\x87\x67\xfb\x81\x61\ \x0f\x40\xf6\xce\x4f\x7c\xe7\x58\x01\x86\x51\x68\xd7\x27\x6a\x65\ \xde\x1c\xbe\x00\xb8\x1f\xa4\xbe\x7b\x89\x00\x63\x38\x7b\x6e\x7e\ \xaa\x7a\x00\x52\xaf\xd6\xe4\x9d\x0f\xfc\x89\xe8\xa0\x68\xcf\x7c\ \x3f\xb0\xa6\x72\x01\xc8\xdf\xf9\x6d\x7d\xee\x3e\x02\xe0\xaf\x85\ \xf6\xcd\xc7\x69\x75\xd3\xa2\x0a\x05\xe0\xd1\xd6\xc2\x71\xa7\x08\ \x80\x7f\x2f\x54\xf5\xc9\xa1\x32\x6f\x97\x38\x00\x1f\xa6\x7e\xed\ \x32\x01\xd0\xe9\x7e\xe0\xa6\xa4\x44\x01\x68\x6d\x7b\xe7\x47\x13\ \x77\x14\x00\x9d\x9b\x77\x54\xb4\x6f\x60\x99\x5b\xb2\xfd\x40\x81\ \x03\xb0\xbe\xe1\x3b\xa3\x3f\x2c\x9c\x78\xa0\x00\xe8\xc9\x7d\xc3\ \x13\xb2\xfd\x40\x01\x03\xf0\x68\xdb\x73\x4e\x13\x00\xfd\x39\x7b\ \x1e\x28\xf3\x6e\x01\x02\xf0\x71\xc3\x77\xaf\x10\x00\x7d\xdf\x0f\ \xec\x18\xda\x66\x8a\x56\x26\x1d\x40\x00\xda\x4d\xcf\xd5\x9b\xa3\ \x53\x77\x16\x00\x83\x13\x1e\x71\xf3\x7e\xf9\x7e\x60\x6d\xcf\x03\ \x90\xbf\xf3\x7f\xf2\x9c\x83\x05\x40\x71\x04\x56\xfd\xc4\x40\xc5\ \xf7\xf7\x30\x00\x8f\x27\xde\xb8\x33\x04\x40\xb1\xf7\x03\xda\xba\ \xe9\xbd\xee\x05\xc0\xf9\x24\xf5\xdd\x11\x01\x50\xb2\xb3\xe7\xca\ \x2c\xee\x20\x00\xcb\xb3\xf3\x5a\x9f\xce\xbe\x74\x17\x01\x50\x3e\ \xf3\xed\x68\xff\xb1\xb3\xe7\xff\x21\x00\x1b\xb3\x33\xda\xc9\xdc\ \x0b\x0f\x11\x00\xe5\xa7\xd5\x2d\x67\x06\xca\x5c\xff\x2f\x02\x70\ \x7d\xb2\xc0\x3d\x53\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xb7\x05\ \x7a\xfa\x1a\x6e\x64\x07\x33\xb6\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x02\xcd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x47\x50\x4c\x54\x45\x00\x00\x00\x6d\xb6\xdb\x80\x9f\ \xdf\x71\xaa\xe3\x80\xaf\xdf\x4b\xa5\xb4\x78\xa5\xe1\x80\xaa\xd5\ \x80\xa7\xd8\x7b\xaa\xd9\x80\xad\xdb\x80\xaa\xdd\x50\x9f\xa7\x44\ \x96\xa5\x80\xab\xd9\x7e\xac\xd9\x80\xaa\xda\x7e\xab\xda\x7e\xaa\ \xdb\x80\xab\xda\x80\xaa\xdb\x80\xab\xd9\x7e\xab\xda\x51\x9e\xa9\ \x3d\x9a\x97\x3f\x9b\x96\x7f\xab\xda\x80\xab\xda\x7f\xaa\xdb\x80\ \xab\xd9\x3c\x99\x94\x7f\xab\xda\x7f\xab\xdb\x7f\xaa\xda\x77\xa7\ \xd1\x80\xab\xda\x7f\xab\xda\x7f\xab\xda\x80\xab\xda\x7f\xac\xdb\ \x7f\xab\xda\x80\xac\xda\x7f\xab\xda\x80\xab\xda\x33\x98\x8b\x32\ \x97\x8a\x7f\xab\xda\x80\xab\xda\x7f\xab\xda\x7f\xab\xda\x25\x94\ \x7d\x24\x93\x7c\x1e\x93\x76\x1f\x93\x77\x1a\x91\x72\x1a\x91\x73\ \x1b\x91\x73\x1c\x92\x74\x1d\x91\x75\x1d\x92\x75\x1f\x92\x77\x1f\ \x93\x77\x20\x92\x78\x20\x93\x79\x27\x94\x7f\x29\x94\x81\x29\x95\ \x82\x2b\x95\x84\x2f\x97\x87\x30\x97\x8a\x33\x97\x8c\x33\x98\x8d\ \x35\x98\x8e\x36\x99\x8f\x37\x98\x8f\x37\x98\x90\x37\x99\x90\x39\ \x99\x92\x3b\x9a\x94\x3c\x9a\x95\x3f\x9a\x98\x3f\x9b\x98\x44\x9c\ \x9e\x46\x9d\xa0\x49\x9d\xa2\x4d\x9e\xa6\x4d\x9f\xa6\x4f\x9f\xa9\ \x55\xa0\xaf\x58\xa1\xb1\x59\xa2\xb3\x5a\xa1\xb4\x5d\xa2\xb7\x66\ \xa4\xbf\x66\xa4\xc0\x67\xa5\xc1\x6e\xa7\xc8\x70\xa7\xca\x73\xa8\ \xcd\x74\xa8\xce\x76\xa8\xd0\x76\xa9\xd0\x78\xa9\xd3\x7a\xa9\xd5\ \x7b\xaa\xd5\x7d\xaa\xd9\x7e\xab\xd8\x7e\xab\xd9\x7f\xab\xda\x73\ \xe1\x1d\x24\x00\x00\x00\x36\x74\x52\x4e\x53\x00\x07\x08\x09\x10\ \x11\x11\x12\x1a\x1b\x1c\x1e\x20\x22\x5e\x5f\x60\x61\x63\x76\x78\ \x7a\x7d\xa1\xa2\xa3\xad\xae\xaf\xb0\xbc\xc9\xcb\xcd\xce\xce\xcf\ \xd7\xd8\xd9\xdb\xe2\xe3\xe4\xe6\xe7\xef\xf0\xf1\xf3\xfa\xfb\xfe\ \xfe\x5a\x85\x2c\x91\x00\x00\x00\xff\x49\x44\x41\x54\x18\x19\x4d\ \xc1\x65\x43\xc2\x50\x18\x05\xe0\xe3\x40\x42\x0c\x14\x4c\x50\x30\ \x66\xa0\x02\x33\x5e\x03\x3b\x31\xb1\x0b\x13\x13\x39\xff\xff\xb3\ \x97\xed\x32\x7c\x1e\x38\x9a\x7b\xa7\x66\x72\xb9\xd9\xe9\x9e\x16\ \xd4\x35\x0e\xcc\x89\x36\xdf\xed\x81\x16\x18\x5a\x11\x6d\xef\x95\ \x23\x21\xd8\x9a\x26\x79\x29\x8e\xf3\x32\xc9\x54\x10\x8a\x67\x90\ \x7c\x5f\x12\x59\xde\x3d\xdd\xfc\x65\x55\xd2\x00\xd0\x45\xe5\x5a\ \xa4\x40\x5e\xd1\x11\x05\xfc\x59\x2a\xe5\x82\x2c\x1e\xbc\x50\xcb\ \xf8\xd0\x41\xc7\xdb\xfd\xfe\xf6\x07\xb5\x30\xfa\x59\xf3\x29\x3b\ \xf9\xa3\x47\x56\xc5\x30\x4e\xd7\x89\x28\x45\x2a\xa3\xb0\xe8\xba\ \x15\x65\xbd\x44\xd2\x82\x45\xd7\x85\x54\x6d\x7c\x91\x59\x8c\xd1\ \x55\x14\x5b\x89\x34\x11\xa7\xab\x9c\x17\x65\x8b\x64\x1f\xda\x59\ \xf7\xbd\x2a\xb2\xf0\x40\xb2\x15\xfe\x0c\x5d\x95\x35\x91\x1b\x92\ \x69\x2f\xd0\x49\xd7\x93\xc8\x61\x85\x64\x04\x80\x91\x64\xcd\xb1\ \x9c\xfd\x90\x4c\x18\x50\x82\x29\x6a\x77\xcf\x54\x26\x02\xb0\x05\ \x12\xfc\x67\x38\x04\xcd\x88\x66\xa8\xa5\x23\x0d\xa8\xf3\x85\xe3\ \xa6\x65\x99\xb1\x36\x2f\x6c\x7f\x97\x79\x82\xc2\x2b\xcd\xac\x13\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x79\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x01\x40\x49\x44\x41\x54\x38\x8d\xd5\xd3\xbd\x4a\x03\x41\ \x14\x86\xe1\xf7\xcc\x4e\xb2\xf9\x91\x90\xa8\xc4\x98\x56\xfc\xe9\ \xb4\x48\x2b\xe2\x05\x08\x5e\x86\x95\x97\x62\xe1\x1d\x48\x2a\xed\ \x44\xa2\x90\x1b\xb0\x10\xb4\x11\x62\xa3\x76\xa2\x89\x10\x41\x14\ \x35\xd9\x19\x8b\x35\x09\x0b\x4a\x12\x77\x40\xfc\xaa\x81\x39\x3c\ \x67\xe6\x30\x03\xff\x2d\xd2\xaa\xcf\x9c\x01\x73\xdf\xef\xda\xdb\ \xce\x9b\x5e\x2d\x6f\xdc\xbd\x8e\x0b\x6b\xb0\x95\x1f\x77\x2d\x85\ \x84\xdf\xdd\x01\xb6\xc6\x85\xa5\x55\x2f\xda\x61\x45\x56\xec\xb6\ \x12\xd5\x18\x56\x67\x3c\x73\x59\x5c\x6f\xdd\x03\xe8\x91\xba\x5b\ \xd9\xb5\x76\x68\x7f\x24\x90\x43\x60\x13\x40\x8d\x02\x8f\x1a\x11\ \x52\xbd\xb5\x53\x38\xd2\x24\x3a\x63\x69\xea\xc2\xd2\x93\x41\xa5\ \x7f\x83\x29\xf1\x0c\x5e\x32\xc0\x72\x13\x9d\xb1\x9f\x6b\xe0\x65\ \xd7\x62\x5d\xc3\x82\x40\x33\x62\xe8\x4c\x79\x36\x8e\xd9\x8b\x11\ \xa9\xf6\x61\xc1\xbb\xc2\xcb\x2e\x38\x70\x3f\x74\xa0\x0e\x06\x27\ \xf6\xa7\x1e\x1c\xa0\x60\x39\xce\x55\x8e\x1e\x7b\x70\x57\x65\x4b\ \x8b\x4e\x60\xa4\x0a\x5f\xcf\x4d\x54\xf2\x5c\x54\xb2\xe4\x40\x6d\ \xe7\x73\xa6\x36\x80\x53\xa5\x8e\x03\x14\x81\x7d\x99\x3f\x79\x0f\ \x61\xcb\xb3\x4a\x4f\x2f\xbb\x80\x03\x09\xc7\x10\xc2\x89\xcc\x05\ \xa2\x26\x1c\xb8\xd7\x93\x2b\xb5\xd3\x3e\xec\xa5\xcb\x2e\x50\x10\ \xaa\x22\xf4\x7f\xb1\x16\x3f\x6f\x80\x76\x4c\xf6\x05\xcc\x5e\x4c\ \xe3\x8f\xf3\x09\x53\xba\x4d\x3a\x66\xdf\x70\x46\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x39\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x5c\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xff\ \xff\x6d\x92\xb6\x80\x80\xbf\x71\x8e\xc6\x70\x80\xbf\x78\x87\xc3\ \x71\x80\xb8\x76\x80\xba\x71\x84\xbd\x76\x86\xbf\x78\x87\xbf\x76\ \x87\xc1\x77\x88\xc1\x78\x89\xc2\x79\x8a\xc2\x7e\x8d\xc3\x7d\x8e\ \xc4\x7d\x8c\xc4\x80\x91\xc6\xe8\xeb\xed\xe8\xeb\xed\x7f\x8e\xc5\ \x80\x92\xc7\xe6\xec\xed\x80\x91\xc7\x7d\x8f\xc3\x7e\x8f\xc4\x7f\ \x8e\xc3\x7f\x8e\xc5\x7e\x8f\xc5\x7d\x8d\xc4\x7e\x8e\xc3\x7d\x8e\ \xc5\x80\x91\xc5\x7e\x8f\xc4\x82\x94\xc7\x81\x93\xc6\x82\x93\xc6\ \x80\x90\xc7\x81\x91\xc7\x81\x93\xc6\x82\x93\xc6\x80\x90\xc6\x81\ \x90\xc6\x82\x92\xc5\x81\x93\xc6\x82\x93\xc6\x80\x91\xc8\x81\x92\ \xc8\xe7\xec\xed\xe7\xec\xed\xa7\xba\xd7\xa7\xbb\xd8\xa8\xbb\xd8\ \xa9\xbd\xd8\xa7\xbb\xd7\xa8\xbb\xd7\xa8\xbc\xd8\x9e\xad\xdd\x9e\ \xae\xdd\x9d\xad\xdd\xa9\xb8\xe6\xa9\xb9\xe6\xb5\xc4\xee\xb5\xc5\ \xee\xb6\xc5\xee\xb8\xca\xed\xb9\xc9\xed\xba\xca\xed\xbb\xcc\xed\ \xbb\xd1\xe1\xbd\xcf\xec\xbe\xd1\xea\xbf\xd2\xea\xc2\xd9\xe4\xc2\ \xd9\xe5\xc3\xd9\xe4\xc4\xd9\xe9\xc4\xd9\xea\xc4\xda\xe8\xc5\xdb\ \xe8\xc6\xd1\xf2\xc7\xd2\xf2\xc7\xdd\xe9\xc7\xde\xe8\xc8\xdd\xe9\ \xc8\xde\xe8\xc9\xe0\xe7\xca\xe1\xe8\xca\xe2\xe8\xcb\xe0\xe8\xcb\ \xe1\xe8\xd6\xe8\xed\xd8\xe9\xee\xe1\xee\xf2\xe2\xee\xf2\xe2\xef\ \xf2\xe2\xef\xf3\xe7\xec\xed\xe9\xed\xee\xe9\xee\xee\xe9\xee\xef\ \xef\xf3\xf3\xf0\xf3\xf4\xf5\xf7\xfc\xf5\xf8\xfc\xf6\xf9\xfc\xf7\ \xfb\xfc\xfc\xfc\xfd\xfc\xfd\xfd\xfd\xfd\xfd\xfd\xfd\xff\xfe\xfe\ \xfe\xff\xff\xff\xd4\x70\xa6\x7b\x00\x00\x00\x3e\x74\x52\x4e\x53\ \x00\x03\x04\x07\x08\x09\x10\x11\x12\x1a\x1b\x63\x64\x66\x67\x68\ \x69\x84\x85\x87\x8b\x8e\x8f\x91\x91\x91\x97\xc4\xc4\xc5\xc5\xc6\ \xd5\xd5\xd6\xdc\xe1\xe2\xe3\xe3\xe4\xe4\xe5\xe5\xe6\xe6\xe6\xe7\ \xe7\xef\xf0\xf6\xf7\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xfe\xfe\xab\xe6\ \x7b\xf4\x00\x00\x01\x4e\x49\x44\x41\x54\x18\xd3\x4d\x91\x67\x53\ \xc2\x40\x10\x86\xcf\x18\x88\xa0\x60\x41\xb1\x8b\x18\x62\x37\xb6\ \x88\x08\x28\x04\x2c\xa0\x60\x03\x0b\xa7\x10\xc0\xc4\x04\x25\xb4\ \xfc\xff\x19\xef\x8e\xc4\xf0\x7e\xd9\xd9\x67\x67\xb6\xbc\x0b\x00\ \xd1\xc8\x78\x80\xe5\x38\x36\xe0\x65\x80\x2d\xc7\x2c\x7f\x96\x87\ \x48\xf9\x28\xef\x73\x58\xd4\xbd\x77\xfe\x0c\x4d\x95\x62\x41\xb7\ \x49\x8f\x92\xe2\x0d\xfc\x57\x26\x44\xb8\x63\x37\x29\x8a\xe2\xc3\ \x00\x5f\xa3\x11\x5e\xb8\x40\x54\xbc\xfc\x90\x6a\x35\xa9\x4c\x78\ \x64\x12\xed\x70\x70\x97\x46\xb8\xd8\x34\x90\xf4\x0a\xe9\xcf\x33\ \x60\x22\x06\x5f\xb3\xa9\x62\xb7\xa5\x29\x8a\xd6\xea\x11\x1e\xf6\ \x80\x00\xde\xec\xed\xb7\xa5\xc8\x82\x20\x2b\x6d\x1d\xf7\xc9\x2d\ \x01\x16\x97\x25\x43\x93\x67\x86\x28\xbf\xac\x19\x12\xce\x59\xb0\ \x8e\xc3\x97\xa1\x1c\x53\x00\x50\x82\x6a\xd4\x71\xbe\x01\x38\x1c\ \xea\xc6\xb7\x60\xe2\x1a\xce\x39\xbb\x89\x9f\xa2\xe6\xe5\x86\xd5\ \x64\xe5\x1e\x85\xb2\xde\x1f\xa9\x76\x9a\x9f\xfd\x91\xde\x28\x2e\ \x57\x7a\x6d\x4d\x55\x1b\x9d\x6e\xe1\xea\x11\xc2\x93\x51\xc0\x6c\ \x97\x08\xd7\xf1\x39\x3f\x05\x74\xd9\xf5\xd3\x8e\x13\x00\x5f\x8c\ \x5c\x5c\x96\xaa\x55\xe9\x25\x85\x8d\x88\x4f\x23\x4f\xe8\x60\xc6\ \xb6\x29\x8b\x68\x62\x8b\x26\xc6\x86\x6c\xfe\x9e\x16\x13\x87\x2e\ \xd3\xf0\xd5\x48\xc9\xe2\xb7\xf1\x4d\x97\xf5\x1e\x7a\x8a\x0f\xe3\ \x3d\x61\xee\x74\x7f\x6e\x78\xe0\x9b\x8c\x67\x19\xbf\x78\x71\xcc\ \xd9\xcf\xff\x00\xc3\x22\x74\xea\x48\xa3\xaf\x79\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x09\x9b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x09\x62\x49\x44\x41\x54\x78\xda\xed\x9d\x69\x70\x53\x55\ \x14\x80\xe3\x82\x3a\xce\xf8\xc7\x9f\x6e\x65\x29\x02\x22\x54\xc1\ \x85\x4d\x59\x05\x51\xc1\x65\x10\x05\x95\x55\x71\x50\x44\xa5\xd8\ \x05\x92\xf4\x01\x23\xdb\xa0\xd8\x26\x6d\xfa\xb2\x74\x4b\x97\xf4\ \xe6\x01\xae\x8c\x0b\x58\xb1\x82\xa0\x55\x51\xb6\xe6\xbd\x02\xae\ \xa3\x33\x8a\x02\xfe\x01\x8a\xbd\xde\xf3\x48\x4b\x48\x93\x34\x2f\ \xef\xbe\x97\x7b\x81\xcc\x9c\x69\x67\xda\xbc\x9c\x7c\xb9\x39\xf7\ \x9c\x73\xcf\x39\xcf\x62\x61\xe4\x31\x58\x6c\xea\xf6\x50\x79\xcd\ \x03\xa3\xdd\xe2\x9b\x43\x4b\x8b\xb6\xde\x51\xfa\x46\x4b\x96\x6b\ \xd5\xd1\x3e\x4e\xe1\x44\x0f\x47\xfe\xe9\xee\x8e\xbc\xb6\xeb\x0b\ \xb3\xf1\x75\x85\x8b\x30\xfc\x9e\x51\x94\xf7\x5f\x9f\xe2\x65\x27\ \xb2\x4a\x56\x1d\x83\xff\x1d\x26\x16\x7e\x3a\xc6\x23\xae\x9b\xe0\ \xad\x78\x30\xb3\x68\xf3\x95\x96\x8b\x0f\x8b\x65\x8c\xcf\x3d\x71\ \x44\xa9\x33\x38\xd0\xb5\xf2\x8f\x0c\x47\x4e\x1b\xc0\xa3\x21\x19\ \x8e\xdc\xb6\x41\x25\x6b\xfe\xba\xd7\xed\xda\x7c\x7f\x99\x7f\x9a\ \x20\xe0\x4b\x2f\x18\xa8\xa3\xca\xdc\xe3\x86\x90\xd5\xd6\xdb\x61\ \x6b\xa5\x05\xb4\x2b\xe9\xe3\xb4\xb7\x0e\x15\x1d\x3b\xc7\x97\xb9\ \x1f\x3a\x2f\xa1\x4e\x12\xc5\xab\xc7\x78\x3c\xae\xfe\xc5\x2b\xfe\ \x35\x0b\x6a\x3c\xb9\xb5\xe4\xf5\xe3\xa3\x45\x8f\x08\x3a\x71\x0f\ \x76\xb2\xcf\x77\x0d\x59\x39\x35\x99\x4e\x6b\x6b\xba\xc1\x46\x4b\ \x6f\xa7\xad\x75\x94\x5b\x94\x26\x78\xd1\xb5\xfc\x91\x45\xe8\xb2\ \xb1\x1e\x8f\x97\xbc\x89\xd3\xac\x81\x8d\x96\x5e\x4e\xeb\xe9\xd1\ \x3e\x8f\x68\xc1\x02\x1f\x76\x7a\xa2\xa7\x72\x0a\x0b\xa6\x40\xab\ \x8c\x10\x9d\xbf\xdb\xd0\x81\x01\xcc\x82\x9d\xd5\xd0\x70\xd5\x08\ \xb1\x78\xe7\xf5\x85\x8b\xb9\x81\xda\xbd\x28\x1f\x8f\xf7\x96\xe3\ \x17\x6a\xb7\xe3\x82\xa0\x8c\x85\xa0\x7c\x8a\xfc\x5c\x23\xa0\x7d\ \x57\x30\x05\x77\xe9\x86\xfd\x19\x05\x48\xfe\x72\x60\xc9\x2a\x2e\ \xc0\xf6\x2d\x16\xf0\xd4\xca\x4d\x78\x29\xda\xaf\x82\x8d\x16\x02\ \xba\xc9\x1a\x50\x7a\x31\x01\x57\x90\x42\x8f\x10\x85\xfe\x06\xc5\ \xa6\x57\xbe\xcf\xb6\xbd\x75\x58\xf1\xd4\x8a\x4d\xd8\x1e\x6c\x8e\ \x09\x36\x4a\x8e\xd9\x51\xe8\x89\xf4\xc2\x0d\x86\x84\x48\xa5\x6c\ \xa8\x19\x67\x92\x37\xc1\x22\x5c\xe2\x31\xe0\xbc\xfa\x3d\xc9\x80\ \x3d\x47\xec\x41\xd9\x66\x3a\xd8\xc7\x11\xbe\x4c\x90\xe4\x92\x58\ \x0a\x3d\x5c\x5e\xcf\x14\xd8\x8c\xa2\x5c\xfc\x74\xd5\x66\xcd\x60\ \xcf\x35\x19\x8a\xd3\xb4\x68\xf0\xa5\xcd\xca\x95\xe4\x45\x83\xf1\ \x94\x81\x55\x72\x13\x79\x53\x6c\xf8\xba\x76\xbc\xb0\x6e\x97\x2e\ \xb8\x67\x25\x54\x6f\xf8\xe6\x07\x9f\x22\xb1\xb7\xa8\x2b\x65\xc6\ \x79\xcb\x18\xd8\xc8\x96\xe1\xec\xc0\x37\x94\xe0\x86\x05\x29\x9b\ \xe0\xdb\x6b\x18\x60\xf2\x22\x85\xc9\x28\xf2\x6a\x5d\x13\xbe\xa1\ \x28\x3b\x6d\x70\x33\x9d\x36\xfa\x70\xcf\x8a\xcb\x18\xb8\x52\x68\ \x99\x16\x45\x46\xb8\x4b\xd2\x02\xb7\x87\x23\x1f\xbf\x5c\xf7\x95\ \x51\x70\xdb\xdd\x38\x2b\x5d\xd3\x80\x94\x29\x5a\x95\x78\x91\x38\ \xef\x66\xc3\x85\x20\x67\x6e\xf5\x56\x43\xe1\x86\x3d\x8b\x36\x02\ \xf9\x31\x2a\x70\xc1\xe1\x26\x17\x3b\x9a\x8a\x22\x43\xc5\x22\x53\ \x01\x83\x07\x63\x34\xdc\x08\xf9\xc7\x8a\x9a\x7b\xe8\xf6\x18\x20\ \xaa\x49\x55\x89\x97\x6a\x77\xe2\xf6\x53\x08\xbd\x72\x43\xd1\x62\ \x3c\x5c\x74\xe2\x27\x2b\xdf\xc5\xcf\x56\x7f\x8a\x1f\x29\x47\xc4\ \x5b\xc9\x39\x27\xec\xb5\x06\x0f\x98\x09\x18\x0b\x48\xfe\x4a\x97\ \x67\x41\xfc\xbf\x75\x7a\x95\xb8\x27\x45\x5b\x9c\xe1\xc8\xc5\x0f\ \xf8\xfc\x78\xb6\xff\x13\xbc\x90\x7c\x50\x4b\xd0\xbe\x4e\xd7\x06\ \xff\x36\x22\xfd\x68\x2a\xdc\x08\x59\x93\x1a\xdc\x8d\x2d\xb7\x86\ \x93\x1f\xba\x14\x58\x1c\xf8\x56\x75\xf6\xb5\x02\x7e\xd0\x57\x93\ \x84\x2d\x6c\x26\x9b\xda\x92\xf0\x0a\xcf\x56\x23\xc9\x34\x00\x6e\ \x15\xa4\xe6\x81\xda\xe8\x62\x7c\x09\x81\xfb\x19\x2d\x25\x1e\x2d\ \x0f\x6a\x06\x3c\x8d\x98\x82\x64\xae\x3d\xd8\xb5\xae\xe3\x39\xf0\ \x61\xa6\x69\x15\x37\x02\x33\x0d\x09\x1c\x65\x0e\x4d\x05\x6c\x28\ \x84\x07\x94\xac\xd4\x04\x78\x52\x59\x6d\x52\xd7\x1e\x12\xde\x48\ \x01\xb4\x3d\x18\x4a\x17\x60\x4c\x98\x3d\xad\x25\x14\xfe\x8d\xb6\ \x02\x8b\x02\x4d\xb8\x3b\xf1\x51\xb5\x64\xbe\x72\x02\xbb\xbb\xbc\ \x2e\xd8\xe6\x7c\xb4\x27\x6d\x60\x23\xe4\x97\xa4\x36\x3c\x3b\x52\ \xe6\x1b\xa5\xc4\x2c\xff\xc7\x04\x5e\xf2\x5e\xc5\xcd\x4e\x3b\x9e\ \x5a\xf9\x8e\xba\xd1\xbd\x5a\xf7\x35\x0b\x10\x13\xef\x09\x52\xe8\ \xb9\x84\x70\xe7\x89\x4d\xdd\x88\xed\x3d\x64\xa4\x12\x4f\x10\xdb\ \xaa\xf5\xd4\xa3\xa7\x63\x29\x9e\xe9\xff\x48\x85\xfd\x54\xd5\x07\ \x38\xaf\xfe\x07\x56\x21\x1f\x14\x1a\x1a\x2e\x4f\x94\xdf\x9d\x61\ \x86\x22\x33\xfc\x1f\x92\x5d\xff\xb5\x94\x7d\xe2\xbb\x4b\xd7\x33\ \xbb\x8a\x13\xda\x62\x38\xf6\x31\x4b\x91\x05\xb5\x3b\x70\x96\x2b\ \xb5\x23\xa6\x91\x9e\x52\x76\x01\x23\xe5\x8b\xd8\x21\xb1\x74\xb0\ \x37\xc4\xd8\x66\x2b\xf4\x5c\x75\x03\xbe\xcf\x5b\x86\xfb\x39\x97\ \x69\xa8\xd4\x11\xb0\x35\xce\x79\x1a\x13\x90\x03\x07\x6e\x8e\x95\ \x8a\x5c\x91\x6e\xc5\xf2\xeb\xf7\xe0\xf9\x35\x9f\xab\x76\x1a\xa0\ \xdf\xe6\x5a\x1b\x37\xd4\xee\x5f\xbc\x42\x3d\x03\x4c\xa7\x6b\x16\ \x3f\xdb\x16\x12\x3a\x05\x16\x05\x92\x7c\x98\xc5\xd5\x00\x79\x5d\ \x48\xe2\xc4\x73\xf1\xe0\xd8\x9d\x3d\x3b\x2c\xb7\x9c\x13\x78\xd8\ \x36\x86\xb2\x58\x77\x81\xa0\x76\x21\x96\xf7\x01\x9b\x65\x2e\x83\ \x5e\x85\x4d\x52\xfa\x47\x26\x75\x5e\x61\x1d\x30\xc8\x70\xd1\x11\ \x73\x15\x4f\xf0\x56\x74\xfa\x5f\xc8\xb8\x4d\xf4\x55\xe1\xc7\x2a\ \xa4\xb4\x84\xd0\x02\x0a\x2d\x88\xb4\xbf\xef\xf0\x00\x18\x6c\x73\ \xbc\x8d\x6f\x8c\xd7\x83\xe7\x55\x6f\xc3\x73\xfc\x5b\x88\x1b\xf7\ \x56\xd4\x2a\xcf\xc6\xf7\xba\x5d\xaa\xe7\x62\xa2\xbe\x1b\x3a\x8e\ \xe0\x21\x79\xcc\x03\xe0\xf9\x35\x8d\xba\xf3\xca\x90\x13\x81\x15\ \x3f\x83\x04\x2e\x49\x16\xa0\xa4\x9c\x90\x57\x0f\x48\x89\xdf\x76\ \x0b\x0f\x70\xdb\xf3\x0e\xb4\x12\xf8\x20\x83\x88\x97\x62\x64\x92\ \x5e\x90\x42\x7d\x2d\x70\xb6\xc4\x0b\x60\x10\x70\xcf\x68\x1e\x33\ \x19\x19\xb4\xd8\x83\xca\xc3\x16\xe2\x47\xe6\xf3\x04\x18\x72\x12\ \x7a\xc2\xec\x58\x02\xf9\x0d\x83\x4e\x9f\x73\x60\x05\x57\xf0\x04\ \x58\x75\xd9\x6a\xb6\xe3\x1b\x0b\xe9\x41\xee\xe9\x58\x62\x54\x02\ \xc9\x07\x1e\x44\x23\x6f\x80\x41\xc0\x6b\xa0\xb9\x8a\xc7\x7a\x3c\ \xf4\xf5\x44\xf2\x36\x58\xc1\x7b\x79\x04\x0c\x9e\x00\xdd\x9a\x8a\ \x6c\x12\xcc\x7c\x41\x5b\xcf\xef\x21\x45\xf9\x23\x8f\x80\xb3\x0c\ \x28\xf6\xbe\x85\x6c\xa0\x34\xbd\x0a\xc8\xad\x83\x89\x38\xc2\x1b\ \xdc\xc5\x81\xef\x34\x9d\x8c\x68\x91\x89\x3e\x3f\x4d\x5d\xff\x04\ \xc0\x27\x79\x03\x0c\x9e\x04\x0f\xe5\x57\x64\x05\x9f\xe0\x12\x30\ \xe4\x17\x8c\x2c\xc1\x82\xfa\x66\x88\xf4\x68\x01\xe6\xce\x44\x98\ \x55\x45\x0f\x6d\x07\x3a\xc3\xe9\x3f\xb9\xdc\xe4\xa6\x54\x6c\x34\ \xad\xa0\xf0\xf1\x8a\x4d\x3a\x37\x39\x24\xef\xe1\x0d\xf0\x9c\xea\ \x2d\xa6\x01\xbe\xb3\xf4\x4d\x7d\x6e\x1a\x8f\x81\x06\x44\x5d\x46\ \x79\x11\xd1\x72\xbb\x6b\xad\xee\x40\xa3\x82\x47\x3f\x18\xde\xb8\ \x19\x80\x21\xb7\xac\x2b\x54\xe6\x2d\xd9\xd3\x2e\xd3\x2b\xdf\x33\ \x05\xb0\x1e\xbf\x58\x4d\xf6\xd8\x51\xe8\x51\x1e\x01\x43\xa9\x6a\ \xbf\xe2\xe5\x86\x03\x86\xa3\x27\x1d\x35\x12\x93\xb9\x4a\xb8\x77\ \xda\xec\xfc\x5b\x0c\x6f\x16\xd7\xe3\xa6\xa9\x09\x77\xb5\x6b\x33\ \xdc\x6b\x7c\x31\xe9\x13\x95\x8c\x77\xeb\x4a\xc6\x1f\xe9\xe8\x0e\ \x25\xbe\xf0\xdb\xbc\x02\x86\xda\xe3\xbb\x4a\xd7\x1b\x02\x78\xa6\ \x8e\x68\x4e\x40\xb2\x14\x51\xb2\x2a\xbf\xcc\x2b\xe0\x33\x90\x0f\ \xe0\x61\x71\x8e\xf4\xf5\xf4\xdb\xc1\x75\x75\x94\xb2\xbe\x18\x51\ \xd1\xde\x3c\x90\x67\xc0\xed\xfd\x1a\xc3\xdc\xf4\xda\xc6\xc6\x79\ \x7d\xba\xf4\xb1\x06\xe4\x7e\xd1\x3d\x19\x87\x78\x87\xbc\x04\xed\ \x25\x1b\x53\x1e\x85\x64\x4f\x0e\x5e\x58\xb7\x53\x8f\x2e\x4a\xa7\ \x9e\x0d\x02\x78\x39\xef\x80\xf5\xb4\x8d\x9d\xad\xaa\x2f\xd0\x5d\ \xa0\x42\x3c\x33\x7b\x8c\x76\xd9\x96\xcc\x74\x94\xaf\xd2\x96\x49\ \xe5\xb5\xba\x9a\xc8\x17\xe9\x6c\x22\x07\x86\x71\xc7\xd1\x90\x55\ \xbc\x83\x77\xc0\xa9\xa6\x32\xc1\x2c\x40\x67\x2a\x95\x96\xae\x04\ \x0d\x30\xcf\xf0\x0e\x78\x2c\xd9\x9c\x52\x01\x3c\xad\xea\x3d\x5a\ \xc5\x26\x4f\x25\x1c\x15\x03\x06\x9a\x67\xc0\x83\x52\x48\x02\x8d\ \xf2\xb8\xa9\xd5\x05\x27\x6c\x82\x51\x57\x71\x50\x7e\x9e\x57\xb8\ \x50\x21\xaf\xb5\x83\x09\x26\xa3\xc4\xea\x83\x4e\x69\xf5\x22\x65\ \x6e\xb2\x1d\xf6\xbf\xf2\x08\x18\x4a\xa0\xb4\xc0\x85\xea\x20\x4a\ \x76\x17\xe4\xa7\xa4\x3b\xef\x49\x98\x37\x8b\x47\xc0\x77\x94\xbe\ \xa1\xf1\x38\x68\x23\xcd\xd1\x06\xd3\x35\x35\x83\x93\x27\x35\xf0\ \x04\x17\x3a\x41\xb5\x9c\x72\x40\xe9\x15\xc5\x02\x93\xcf\x35\x35\ \x83\xab\x7d\x1b\x92\xd2\x9f\xc6\x38\x03\xb3\x64\x34\xd9\xa8\x92\ \x85\x0b\x21\x35\x24\x89\x68\x8d\x33\x48\x79\xa8\x28\x0c\x9b\xe0\ \x01\x2e\x34\x9a\x27\x3b\xe5\x0a\x22\x3d\x9a\x95\xed\x42\x50\x59\ \x99\xf2\xc4\x93\x70\xef\x32\xf3\xc1\xc7\x48\x8f\x98\x04\xdc\x6c\ \xf5\xf8\x87\x72\x5f\xdd\x2e\xdd\xc3\xea\x04\x74\xf0\x26\x96\x8b\ \x53\xc0\xf6\x76\xb5\x7a\x61\x2a\xca\x6c\xff\xc7\xb4\x8b\xab\xff\ \xd6\x3d\x14\xa9\xc3\x37\x96\x94\x49\xac\xe6\x29\xa0\x55\x2b\x11\ \xdc\x21\x62\x21\x7e\xad\x7e\x37\xe5\xd4\xa8\xdc\x06\x53\x67\xa9\ \xce\x4e\x83\x29\xa4\x4c\x1e\x19\xf9\x2a\xe3\x94\xa2\x2e\xd7\x75\ \x22\xd1\x45\x38\x9c\x6b\xd4\x68\xc5\xf5\xec\x6d\x70\xdf\xc0\x1c\ \xf6\x0e\xb0\x59\xae\xd5\x78\x7a\xd5\xfb\x34\xbd\x84\xe8\x21\xa1\ \xc5\xc6\x0e\x07\x95\x94\x00\x73\x21\x32\xda\xab\xda\x58\x8a\x51\ \x59\x3c\xa9\x33\x7c\xcc\x2d\xec\x9a\x30\xea\xf5\x7c\x48\xce\x6b\ \x86\x6b\xda\x6c\x77\xf5\x88\x49\xff\xd0\x3a\x6e\x44\x52\x1c\x69\ \xb9\x5d\x0f\x4c\x21\x3d\x1f\x4e\x41\x12\x7a\x0b\x48\xc9\x4b\xef\ \x1c\x77\xa4\x4c\xe6\xb1\x88\x3b\x09\x3f\xf7\x28\x4c\x9d\x65\xe3\ \x4e\x04\x24\x18\x39\x1f\x8e\x9b\xce\x8a\xf2\xb5\xb0\x41\xee\xc9\ \xd4\xbd\x34\xce\x6c\x7e\xf2\x1a\x9e\x12\x44\x31\x56\xed\x29\xc8\ \x2d\x40\x8a\x80\xd9\x3b\xc2\xc0\x40\xa0\x02\x24\x7f\xc2\x1d\x60\ \x24\x6f\x83\x81\xa8\x7c\xdc\x2c\x8a\x78\x19\x70\x80\x2a\x48\xf2\ \xcf\x1c\xc0\xfd\x49\x3d\xa8\xd4\x9a\xcf\x65\xe1\x71\x26\x1b\x17\ \x9a\x41\xdc\x9c\x10\x83\xe6\xe0\x10\xd4\xe4\x09\xe5\x87\xaf\xb2\ \xf0\xfe\x80\x93\x56\x98\x88\x07\x43\xdb\xd2\xe9\xd6\x85\x5f\xbb\ \x11\x56\xac\xa1\xb7\x6b\x48\xb7\xc7\x01\xc9\x12\xb2\x82\x64\x33\ \xcd\x00\x79\xbd\xd5\x50\xbd\x64\xb9\x90\x1e\xe0\x0a\x09\x48\x9e\ \x07\x37\x3f\x21\xf2\x17\xc5\xaf\xff\x71\xd8\x68\xe1\x83\xb4\xa1\ \x96\xc1\x5c\xda\x57\x63\x12\x49\xa1\xbe\x90\x67\x05\x30\xd0\xa1\ \x03\x5f\x67\xf2\x01\xec\x86\xa9\xa6\xe1\x60\xe6\x64\x58\x8e\xa8\ \x93\x4e\xcf\xfc\xad\x91\x3c\xc7\x0b\x0d\x27\xf0\x5c\x2b\x6a\xee\ \xc3\xd2\x5d\x68\xff\x07\x33\x87\x3b\xd0\xfd\x0f\xcd\x29\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0d\xcd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x02\xfd\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x55\x55\xff\x40\x40\xff\x66\x66\xff\x55\x55\xff\x49\x49\ \xff\x60\x60\xff\x55\x55\xff\x4d\x4d\xff\x5d\x5d\xff\x55\x55\xff\ \x4e\x4e\xff\x5b\x5b\xff\x55\x55\xff\x50\x50\xff\x5a\x5a\xff\x55\ \x55\xff\x51\x51\xff\x59\x59\xff\x55\x55\xff\x51\x51\xff\x59\x59\ \xff\x55\x55\xff\x52\x52\xff\x58\x58\xff\x55\x55\xff\x52\x52\xff\ \x58\x58\xff\x55\x55\xff\x52\x52\xff\x58\x58\xff\x55\x55\xff\x53\ \x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\ \xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\ \x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x57\ \x57\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\ \xff\x57\x57\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\ \x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\ \x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\ \x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\ \xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\ \x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\ \x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\ \x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\ \xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\ \x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xfc\xd9\x40\x56\x00\x00\x00\xfe\x74\x52\x4e\ \x53\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\ \x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\ \x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\ \x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\ \x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\ \x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\ \x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\ \x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\ \x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\ \x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\ \x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\ \xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb9\xba\xbb\xbc\xbd\xbe\xbf\ \xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\ \xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\ \xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\ \xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xed\ \x44\x12\x2d\x00\x00\x09\x81\x49\x44\x41\x54\x58\xc3\xb5\x59\x79\ \x6c\x14\xd7\x1d\xfe\xf6\xb0\xd7\xd8\x80\x17\xcc\x61\xee\x70\x98\ \xc3\x25\x9c\x45\x34\x90\x28\xe1\x28\x10\x8a\x1a\x4a\x29\x4a\x5a\ \x45\x6d\x0e\x94\xa4\x48\xa9\x12\xa4\xd2\x86\xb6\x2a\x88\xb6\x81\ \x46\x49\x94\x50\x92\x36\xa4\x0a\xa2\x24\xb4\x02\xd2\x94\xa6\xa1\ \x10\x02\x69\x21\x8e\xcb\x11\xb0\x6c\x02\x06\x6c\xb0\xd7\x86\xb5\ \xf1\xfa\x5a\x7b\xcf\xf9\xb6\x7f\xbc\x63\x66\x67\xd7\xeb\xa3\xea\ \xfc\xb3\xbf\x99\x79\xf3\xbd\xef\x7d\xbf\xeb\xcd\xac\x03\xdd\x1f\ \xe3\xe6\x14\x4d\x2e\x1a\x96\xdb\x3f\xdf\x08\x86\x1b\x7c\xb5\x97\ \x2e\x96\xb5\x76\xff\x90\xa3\x9b\xfb\x43\x56\x2e\xba\xff\x2e\xfb\ \x45\x5e\x38\x7e\xf4\xa4\x81\xbe\x1f\x39\xdf\xf9\x5b\x84\x5d\x1c\ \xfe\xdf\xdd\xd3\x57\xc6\xc3\x7f\xf4\xb4\x17\x00\xd0\x52\xf2\x65\ \x65\x65\x6d\xb0\xb3\x1d\x03\x3d\x23\xc6\x8e\xbf\x7b\xd6\x8c\x6c\ \x00\xc0\xd9\x9d\xfb\xa3\xbd\x67\x3b\x61\x57\x27\x49\xc6\x4f\x6c\ \x9c\xeb\xb2\xdf\xcb\x5d\xf1\x52\x15\x49\xb2\xea\x31\x77\x2f\x61\ \xf3\x5f\x8e\x90\xe4\xa5\x9f\x8e\xed\x6a\xa5\xf7\xbc\xd1\x46\x92\ \x15\x8b\x7b\x03\xeb\x7c\xfc\x16\x49\xfe\x6b\x55\x46\xd7\x7a\x37\ \xd6\x93\xe4\xbe\xa1\x3d\x07\x3e\x4c\x92\xff\xbc\xb7\xdb\x71\xb9\ \x3f\x6e\x22\x59\xbf\xac\xa7\xb8\xfd\xe2\xe4\xb5\xd5\x3d\x1a\x3a\ \xec\x1d\x83\x34\x5e\x74\xf5\x10\xf9\x85\x8a\xcd\x39\xd6\xf3\xa9\ \x4f\xbe\x79\xe4\x72\x88\x64\xa4\xae\xf4\xad\x0d\x53\x93\xc6\x2e\ \xa9\x25\x79\x78\x40\xef\xa3\xc3\xb5\xf4\x9d\xdb\xb6\x10\xbe\xf1\ \xdb\x19\x96\x01\x05\xef\x93\xbc\x30\xbc\xbb\x44\xcc\xb6\x2d\x75\ \x9b\xcf\x04\x8c\x36\x19\xca\x3c\xb5\xd6\x5c\xbd\x63\x53\x9c\xbc\ \x3c\x3a\x73\xf0\x5e\x6b\x5f\x62\x39\x1d\xb1\xb3\x83\x24\x79\xeb\ \xe0\x73\x0f\x4e\xeb\x07\xc0\x55\x78\xff\xb3\x07\x02\x24\xc9\x72\ \x8b\x13\x1e\x0e\x93\x57\x0b\x33\xb9\xa2\x92\x7c\x5d\x9f\x65\x3d\ \xdf\x42\x92\x35\x3b\x66\xd9\xc4\x59\xb1\x2f\x44\x92\x27\x4c\xb1\ \x57\x76\x92\x17\xbd\x5d\xe2\x0e\x38\x4b\xb6\xcd\x54\x67\xd3\xbe\ \x10\xb1\xec\x4c\x33\xb2\x70\x5b\x0b\xc9\xd0\x66\xad\xc7\x8a\x08\ \x79\xa4\xab\xd8\x70\x1f\x23\x3b\x75\x22\xad\x0f\x92\x3c\x7f\x7f\ \x97\x55\xef\xb5\x28\xc9\x13\x5a\xd9\x47\xe2\xe4\xaf\xba\x18\xbb\ \x83\x8c\x7f\x53\xe5\xde\x2b\x24\xdb\x36\x64\x8a\xcf\x59\xa5\x24\ \x6f\x2d\x50\xa7\x9b\x49\x63\x55\xda\x81\xdf\x30\xc8\x17\xa4\x9d\ \x7d\x80\xe4\x99\xc9\xb6\x22\x3a\xb8\x7f\xf2\x0a\xb7\xc4\xc8\xd0\ \x77\x55\x6c\x1c\x22\x1b\x86\xa5\xcb\x7c\x1f\x79\x50\xd6\x06\xf7\ \x41\x92\x7b\xad\x91\xf7\xd0\x5f\xca\xc2\x24\xc3\x75\xa7\x5e\xfa\ \xd6\x10\x33\x39\x02\x64\xfc\x29\x05\x50\x4d\xbe\x9b\x06\xf8\x0f\ \x64\xdd\x60\x39\xf9\x5e\x92\xbf\xb6\x16\xa0\xe1\x31\x4b\x7e\x44\ \x0e\xad\x52\x12\x4d\xbf\x49\x1a\xcf\xc8\x93\xa5\x06\xf9\x60\x0a\ \xee\x9c\x38\xb9\x52\x65\x34\xc9\xad\xc9\xf1\xd2\x48\xb2\xc5\x17\ \x50\xd8\x95\x6b\x54\xa4\x9f\x23\xe3\x0f\x9b\xdc\xca\x53\xea\xf3\ \x09\xf2\xa0\x34\x97\xc7\xc8\x57\x95\x72\x8b\x8b\x01\x00\x63\xd7\ \xcc\xce\x01\xe0\x1a\xb6\x62\xcb\xc9\x38\x49\x9e\x2c\x96\x85\xfb\ \x73\x32\x2c\x3d\x58\xd0\x44\x3e\x6d\xc3\x5d\x42\x86\x8b\x84\x39\ \xb8\xde\x0c\x49\xef\xfb\x0c\x17\xdb\x39\x8c\xdf\xea\x27\xd9\xf6\ \x88\x8c\xbb\x0a\xb2\x7e\x94\xb0\x37\x92\x35\xb6\x9a\x70\x8c\x7c\ \x4d\x9a\x7b\xc9\x6a\x29\xf6\x98\x0a\x92\x8b\xd2\xf4\x97\xed\x21\ \x92\xaf\x8a\xd4\x19\xdf\x40\x1e\x17\xa6\xa7\x86\x7c\x2c\x39\x26\ \xc9\x88\x6c\x42\x8b\x49\xe3\xeb\x32\xc3\xaf\x93\xdc\x91\x36\x36\ \xa7\x94\x91\xdc\x25\xfc\xbb\x28\x4a\x6e\x14\x97\x9f\x27\xcb\x93\ \xc6\xed\x24\xf7\x48\x51\x4b\xc9\xdd\x32\x6e\x4f\x93\xd1\x1f\x76\ \x91\x1e\x79\xfb\x48\xbe\x2c\xec\xad\x64\x87\xd8\x7b\xf4\x6f\x22\ \xad\xbb\x82\x7e\x01\x72\xa1\x30\xd7\x92\x6d\xb2\xb6\xbe\x4b\x46\ \xba\xee\x3a\x8e\x37\x49\xfe\x40\x54\xab\xb3\xda\xf3\xbb\xc8\x37\ \x2c\x83\x56\x93\x95\x32\x6c\x4b\xc8\x2d\xc2\x5a\xc7\x54\x1f\x27\ \x75\xdc\xbd\x64\xdb\x24\x00\xc0\xfc\xb8\x22\xba\x90\xbc\x6d\xa9\ \x5a\xbb\x35\xda\x7c\xb2\x7d\x90\x58\x55\x8d\xe9\x4f\x00\x98\xb4\ \x61\xfb\x9e\xdd\xdb\x2c\x69\x07\xcf\x05\xb2\x44\xa0\xec\x21\xff\ \x21\xd6\xe1\x23\xe7\x99\xab\xaa\x27\xe7\x0b\xf3\x6d\xbd\x94\xed\ \xe4\xcd\x3c\xcd\xee\xd1\x32\x99\x1a\xe1\x03\x66\x75\x2e\xee\x20\ \xd7\x89\x59\xa3\xe4\x74\x00\xc0\x1f\xc9\x9f\x9b\x03\x48\xbf\x98\ \x39\xab\x91\x14\x0f\x0e\x68\x25\xd7\xea\xd2\x7c\xc1\x92\xd1\xf1\ \xd7\x3d\xea\xfa\x2f\xc8\x0a\x11\xf1\xef\x91\xaf\x28\x01\x3f\xd2\ \xc0\x4f\x92\x07\x84\xb5\x8c\xbc\x22\xac\x67\xc8\x52\x75\x7f\x79\ \x33\xc9\x96\xfd\xcf\x7d\xef\xfb\xbf\x3c\x69\x90\x2c\x51\xbd\x62\ \x60\x23\x29\xf2\xe4\x01\xd2\xef\x02\x80\x51\x64\xc0\x61\x91\x78\ \x93\x2e\xc9\x2f\x0a\xeb\x1c\xf9\x84\xbc\x3d\xb7\x83\x6c\xde\x94\ \x2b\x4e\x26\x1f\x22\x59\xd2\x4f\xde\xfa\x09\x79\x44\xa8\x59\xad\ \xd4\xf4\x91\xba\xdc\x7e\x46\xca\xc6\x71\x9a\x5c\x2e\x12\x80\x6c\ \x91\x0a\x7b\x6b\xc8\x4a\xcb\x5e\xe2\xa9\x18\xb9\x53\x35\xc9\x28\ \x63\xa2\x89\xfe\x5e\x69\xfb\x01\xf9\xa8\x1a\x7a\x87\x1c\x21\xea\ \x7b\x88\xb1\x7c\xd1\x98\xc8\xfd\xf2\xee\x6f\x48\x7f\xd2\xd6\x7b\ \x3d\x69\x28\xcf\x1f\x25\x9f\x05\x00\x7c\x9b\xfc\x37\x00\xe0\x67\ \xe6\xb4\x83\xc9\xa0\x43\xf1\xbc\xa2\x0b\x86\xcc\xb9\xc1\x41\x72\ \x4d\x72\x04\xff\x99\xfc\xbb\x34\x9f\x20\x3f\x11\xeb\x8a\x32\x9a\ \x0b\x00\xcb\xc9\xcf\xe5\xcd\x99\x64\x99\xec\xe2\xda\xa5\xd7\x49\ \xb9\xdb\x79\x9c\x2c\xb5\x6d\x3a\xc7\x47\x19\x1b\x29\xcc\xa1\x06\ \x83\xa2\x9e\x9d\x97\x22\x17\x90\xad\x0e\x00\x4e\xa0\x00\x68\x90\ \x6f\x31\x40\xb5\xf0\xc5\x68\x18\x15\xb2\x29\x01\x7b\x13\xc9\xc0\ \xd5\xc7\xe0\x92\xc5\xbd\xf1\x2a\x72\xe7\x00\x00\xca\x80\x99\x00\ \xd0\xe4\xc7\x80\x42\x0d\xdc\x2c\xcb\x21\x10\x10\x25\x3b\x0b\x8d\ \xf2\xe5\x65\x2a\x70\x4c\x02\x4e\x56\x61\xf6\x1e\xb0\x4e\x39\x1e\ \xb8\x2f\x09\x18\x95\xc0\x14\x01\x9c\x0f\xc8\xd7\xab\xfe\x40\xbb\ \xe8\x71\x80\x5f\xe6\xdc\x38\xf0\x86\x30\x37\x5c\xbe\x22\xf7\xd8\ \x7f\x8d\x60\xee\x20\x0d\xfc\x35\x00\xc0\x45\xe0\x6e\x00\xc0\x55\ \x0d\xec\x04\xe2\xb2\x3b\x2b\x2b\x4f\xcd\x80\x84\x1b\x8c\x08\x73\ \x01\x86\xca\xae\x18\x2c\x85\x4b\x6e\x65\xce\x01\x22\x6c\x2b\x80\ \x89\x36\x60\x00\x52\xc4\x4e\x40\x04\x6f\x50\x19\x48\x04\xe1\x96\ \xb9\x71\x01\x58\xa8\x3a\x24\x20\x1b\xcb\x55\x60\x92\x0b\x00\xfc\ \x21\x14\x7a\x92\xa5\x48\xe8\x97\xb2\x20\x20\xf6\x24\xed\x80\xda\ \x4a\xd7\x00\x32\x3e\x4a\x00\x55\xc4\x3f\x05\xbe\x2a\x1f\xf1\xc3\ \x33\x06\x00\x12\x75\x70\x8c\x91\xc0\xe3\x04\x70\x44\xd3\x6b\x00\ \x46\x2b\xe0\x41\xa6\x77\xe4\xcb\xc8\xb9\x38\xa6\x49\xf2\xe7\x13\ \x98\x21\xcb\xee\x35\xa0\x48\x31\x18\x0b\x00\x37\xc4\xaf\x13\x68\ \x06\xf2\x65\xf4\x02\x13\xc4\x2b\x63\x13\x0a\x46\xc8\x2c\x57\xde\ \x41\xe8\x1a\x9c\xb2\x65\xb7\x55\x23\xaf\x48\x3f\x33\x0e\x00\x50\ \x0b\x8c\x01\x80\x8e\x16\xf4\xf7\x02\x4e\x20\x00\x0c\xd4\xb3\x4f\ \x16\x44\xbe\x00\x44\x78\xa2\x14\x50\xf9\x5b\xae\x1c\x0f\x94\x69\ \x81\x6e\x01\x22\x56\x6e\x2b\x43\xcc\x20\x80\x25\xbb\xc6\x5a\x78\ \x8b\x15\xf0\x5c\xe9\x9d\x76\x8c\xce\xd3\xc0\xd3\x25\xf0\x25\x60\ \x92\x2c\x34\x0a\x2f\x00\x88\x5d\x83\x4f\x01\xd7\x01\x63\x1c\x7a\ \xdd\xf7\xaa\x28\x92\x02\x24\xaa\xe1\x10\x6b\xc5\x15\xa5\x14\x50\ \x65\x05\x1e\xa6\x80\x0b\x14\xe3\x42\xc0\x09\xb4\xdd\x41\x8e\x6c\ \x65\xa7\x80\x07\x94\xcb\x16\xb8\x74\x58\xdc\x65\x73\x01\x70\x4d\ \x45\x2d\xee\x00\x43\x92\x19\x7f\x60\x74\xfc\x47\xc4\xf1\x75\x3d\ \xfd\x09\x60\x91\x13\x00\x7c\x37\x31\x50\x3a\xea\xa6\x74\x0a\x50\ \x05\x4c\x74\xd8\x5c\x86\x46\x45\x54\x03\x7f\x34\x61\x62\xb9\x06\ \x96\xda\x7d\x59\x87\xa1\xc2\x3f\xe7\x81\x59\x9a\x92\x78\x12\x81\ \x66\xe4\xca\xad\xb5\x9f\x90\xbb\x8f\x56\x20\x57\x19\xd2\x17\xb5\ \x0d\x32\xf3\x2e\x01\x5f\x81\xd6\x62\x9e\x4a\x7d\xf9\x9a\xd3\xa4\ \x98\x58\xb5\x88\x37\x23\x47\xc4\x68\x18\xe8\x97\x6c\xc8\x22\x23\ \x3c\xa5\x5e\x35\xcf\xaa\x68\xb8\xa8\xaf\x05\x4c\xe0\x7a\x1d\x3f\ \xf0\x43\x52\x0e\x29\xbc\x50\x2a\xf0\x99\x04\xe6\xb9\x75\x3d\x98\ \xa2\x8c\xd9\x9a\xb1\x94\x02\xb7\x01\xf5\x9a\xd8\xa0\x82\x21\xa4\ \xa4\xd0\x86\x09\x1c\xb8\x81\x3c\x29\xb2\x4f\x71\xaa\x69\x46\xc1\ \x48\xc5\x78\x90\x09\xac\xde\x99\x1b\x95\x69\x95\x22\xc7\x06\x8c\ \x33\xc0\x02\x1b\xa7\x44\x39\x50\x6c\xd7\xd8\xc2\x58\x4b\x11\x8b\ \xc3\xed\x96\xc0\x1e\x3b\xf0\x27\xba\x0a\xb6\x86\x91\x9f\x93\xec\ \xa8\x40\x5a\x60\x2d\x05\x62\x12\xc4\x00\x5c\x76\xe0\xa3\xc0\x12\ \x17\x92\x83\xa6\x4a\x01\xb7\xc6\xd3\x01\x9b\x95\x4b\x7f\x8c\x4b\ \x03\x7c\xe3\x3a\xbc\xb2\xd2\x68\x17\x54\xa9\xdc\x4a\x34\x23\x7b\ \x80\x16\x56\xcd\xa1\x7b\x02\x28\x41\x12\x89\x54\x60\x1c\x07\xe6\ \xeb\x07\x34\xb0\xcc\xad\x0e\x5d\xfd\xda\xb4\x85\x0e\xb3\xc7\xa8\ \x3e\x61\xc0\xe9\xb0\x03\xbf\xdd\x19\xfc\xd4\xc6\xc4\x07\x8c\x84\ \x2d\x40\x2d\xc0\x9a\x80\x15\x18\x96\x3d\xb7\x88\xdf\x33\xa3\x54\ \xa3\x0e\x03\x62\x03\x72\xdb\x70\x0d\x77\x19\xc9\x18\x91\x88\xc7\ \xe3\x89\x28\xc6\x76\x60\x27\x40\x3b\x63\xb4\xb6\x22\x59\x31\xc4\ \x1b\xe1\x1a\xae\xc8\xa9\x94\x6a\xd5\x2e\xeb\x4c\x95\xc2\x8d\x78\ \x22\x05\xd8\xea\x5b\x87\x2d\x7f\x2d\xb9\x6a\x6a\x61\x32\x76\x03\ \x51\x00\x70\x39\xd4\x2e\x22\x2d\x70\x42\x5f\xf2\xa7\x24\xad\x95\ \x71\x7d\x4c\x6e\x9a\x90\x8d\x44\x2c\x69\x53\x62\xd5\x38\x1d\xe3\ \x16\xc0\x6b\xf3\x93\x05\x38\xb0\x76\xa9\xf8\x7a\xe4\xc8\x42\x2c\ \xd1\x03\x60\x93\xb1\x06\xb6\x48\x11\x32\xeb\xc1\xe1\xc3\x8a\xb0\ \x50\x02\x6e\xc0\x40\x46\x8d\x4d\xe0\x7c\xbb\xf3\xe2\xa9\x4c\xac\ \xc0\xdd\x68\xec\xb0\x2d\xdb\x22\x45\x0c\xc8\xea\x3b\x70\x06\x29\ \xfe\x07\x60\x53\x0a\xad\x67\x28\x89\xb1\x94\xc2\x7b\xa4\xa4\xa8\ \x8f\xc0\x51\xc5\x2e\x6e\x16\x5a\x93\xf1\x43\xcb\xe6\xaf\x4f\x06\ \x4e\x00\x91\x1e\x69\x1c\x53\xc9\x6d\xa9\x01\x26\x70\xb6\xda\x98\ \x7a\x14\xb0\xef\x63\xe3\xad\xcc\x71\x6c\x67\x6c\x98\xa3\xe2\x1a\ \x58\xc7\x47\xb6\x22\xca\x65\x9e\x4c\x8c\xa3\x3a\x1a\xa3\x8a\x71\ \xdc\xac\xe0\xb1\xb4\xc0\xea\x3f\x8b\x08\x32\x00\xff\x29\x54\x7e\ \xda\x06\x62\xe9\x39\xe6\x1c\xe9\x80\x93\xbf\x23\xda\xbf\xfb\x7b\ \x63\xd2\xba\x69\xb8\xea\xec\x52\xb8\xb4\xe7\xf5\x14\xd9\x40\xac\ \x27\xc0\xe6\xa8\xaa\xd5\xb3\x77\xd9\xa5\x30\x43\x4a\x3b\xb9\xa7\ \x8c\x2d\xc7\x87\x1f\xc2\x2e\x45\x96\x06\xd6\x4e\xee\x0a\xd8\xd9\ \xfd\xe7\x7f\x8b\x14\x6e\xbd\x22\x0d\xec\x03\xae\xf7\x92\x31\x52\ \x3c\x66\x91\x42\x03\x9f\x5d\x3b\x61\x57\x1f\x81\x8d\x8c\xc0\x38\ \xd4\xc5\x47\xae\x5e\x01\x67\x69\x29\x8c\xee\x1e\xed\x01\x70\xa7\ \xd9\x7d\x4d\xc6\xe1\xe4\xb2\xde\x27\xe0\x92\xcf\x9a\x77\xa7\x38\ \xaf\xf4\x74\xcb\xee\x8c\x4f\xf5\x40\xe3\x0e\xf3\x6f\x32\x33\xdc\ \x3a\xef\xeb\xee\xaf\xbb\x5e\xfd\xf1\x64\x00\x9d\xf8\x7f\x1c\x2b\ \xef\x7c\x9c\xd3\xc3\xa1\xff\x05\x0b\xac\xc6\xd6\x81\x20\x90\x65\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x53\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x02\x31\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\xff\ \x80\xff\xd5\x55\xff\xdb\x49\xe3\xc6\x55\xe6\xcc\x4d\xea\xd5\x40\ \xef\xcf\x50\xf0\xb4\x0f\xf0\xd2\x4b\xf2\xc9\x51\xf4\xd3\x4e\xea\ \xca\x4a\xf0\xcb\x4b\xf1\xcd\x47\xf1\xcf\x4c\xf2\xd1\x48\xec\xcc\ \x4d\xf1\xcf\x48\xed\xce\x4c\xee\xcc\x48\xea\xb9\x15\xef\xce\x49\ \xe9\xbb\x16\xee\xcd\x49\xef\xcd\x4c\xe9\xbb\x16\xf0\xce\x49\xea\ \xba\x15\xf0\xcd\x49\xcf\xc9\xad\xcd\xc8\xae\xf0\xcd\x4b\xeb\xba\ \x16\xee\xce\x49\xee\xcd\x49\xef\xcf\x4a\xf0\xcf\x4b\xef\xce\x4b\ \xef\xce\x49\xf0\xcf\x49\xef\xce\x49\xf0\xce\x4b\xee\xcf\x49\xef\ \xce\x4a\xef\xce\x4a\xea\xb9\x16\xec\xba\x17\xef\xce\x4a\xef\xcf\ \x49\xef\xce\x49\xef\xcf\x4a\xef\xcd\x4a\xeb\xdf\xac\xeb\xbf\x21\ \xec\xbf\x27\xed\xc3\x2e\xeb\xbf\x21\xe0\xc5\x68\xd0\xc1\x8f\xed\ \xc6\x36\xec\xbd\x1c\xef\xcd\x46\xd3\xc2\x87\xda\xcc\x8b\xde\xc4\ \x71\xee\xc6\x33\xd8\xc3\x76\xd6\xca\x97\xde\xcc\x7e\xf2\xdf\x97\ \xd0\xc0\x8d\xe0\xc5\x67\xef\xcf\x4b\xeb\xbd\x1b\xef\xce\x4a\xd6\ \xc1\x7e\xd3\xca\xa0\xf0\xce\x49\xed\xc8\x3b\xe3\xce\x71\xef\xce\ \x4a\xe6\xc9\x61\xeb\xbb\x19\xef\xce\x4a\xeb\xba\x16\xd4\xc0\x81\ \xef\xce\x4a\xd1\xc9\xa6\xd3\xc0\x81\xeb\xb9\x16\xea\xd0\x67\xf3\ \xed\xd1\xf4\xef\xdc\xe7\xcd\x63\xee\xcc\x42\xe7\xca\x57\xed\xe7\ \xd2\xf4\xee\xd7\xeb\xba\x16\xef\xce\x4a\xed\xe8\xd4\xec\xe8\xd3\ \xef\xce\x4b\xf3\xee\xd5\xd1\xc0\x86\xeb\xbb\x17\xef\xce\x4a\xcf\ \xc9\xab\xef\xce\x4a\xe8\xcd\x58\xeb\xcc\x52\xeb\xba\x16\xed\xcd\ \x4d\xef\xcd\x46\xeb\xba\x16\xd1\xc0\x85\xef\xce\x49\xcf\xc9\xad\ \xd1\xc0\x86\xef\xce\x4a\xce\xc9\xae\xd1\xbf\x86\xd1\xc0\x86\xeb\ \xba\x15\xeb\xba\x17\xeb\xbb\x16\xef\xce\x4a\xf4\xef\xdb\xed\xcd\ \x4e\xed\xce\x51\xef\xce\x4a\xef\xce\x4a\xef\xcd\x49\xef\xce\x49\ \xef\xce\x4a\xce\xc9\xae\xd1\xbf\x86\xeb\xba\x16\xee\xce\x4a\xeb\ \xba\x16\xef\xce\x4a\xef\xce\x4c\xf0\xcf\x4d\xee\xce\x4d\xef\xce\ \x4a\xf4\xef\xdc\xeb\xba\x16\xce\xc9\xae\xd1\xbf\x86\xeb\xba\x16\ \xef\xce\x4a\xef\xce\x4b\xce\xc9\xae\xce\xc9\xaf\xcf\xca\xaf\xd1\ \xbf\x86\xd4\xce\xb4\xd5\xd0\xb7\xd8\xd3\xbb\xda\xd6\xbd\xdb\xd5\ \xbd\xdb\xd6\xbe\xdc\xd7\xbf\xdd\xd8\xc1\xe0\xdb\xc3\xe1\xdc\xc5\ \xe2\xdd\xc7\xe3\xdd\xc7\xe4\xdf\xca\xe5\xe0\xcb\xe6\xe1\xcb\xe8\ \xe3\xce\xe9\xe5\xcf\xea\xe5\xcf\xeb\xba\x16\xeb\xe7\xd2\xec\xe7\ \xd2\xec\xe7\xd3\xee\xea\xd6\xef\xce\x4a\xef\xe9\xd5\xf0\xec\xd7\ \xf1\xec\xd9\xf3\xee\xdb\xf4\xef\xdc\x8d\x8c\x65\xe0\x00\x00\x00\ \x9a\x74\x52\x4e\x53\x00\x01\x02\x06\x07\x09\x0a\x0c\x10\x11\x11\ \x13\x17\x18\x22\x24\x25\x27\x28\x35\x39\x3c\x3e\x3f\x47\x4d\x51\ \x53\x54\x55\x57\x5a\x61\x66\x68\x69\x6c\x6f\x74\x7e\x81\x84\x92\ \x96\x99\x9b\x9c\xa1\xaa\xaa\xae\xb1\xb3\xb4\xb6\xb7\xb8\xb8\xbb\ \xbc\xbd\xbd\xbe\xbe\xbf\xbf\xbf\xbf\xc0\xc1\xc2\xc2\xc3\xc3\xc3\ \xc4\xc4\xc5\xc6\xc6\xc8\xc9\xc9\xca\xcb\xcc\xce\xcf\xcf\xd1\xd1\ \xd1\xd2\xd2\xd3\xd5\xd6\xd7\xd8\xd8\xd9\xd9\xda\xdb\xdb\xdb\xdd\ \xde\xdf\xe0\xe0\xe2\xe2\xe5\xe5\xe5\xe9\xeb\xec\xed\xed\xed\xee\ \xee\xee\xee\xee\xef\xef\xef\xf0\xf0\xf0\xf1\xf2\xf3\xf4\xf7\xf7\ \xf7\xf7\xf9\xf9\xf9\xf9\xfa\xfb\xfb\xfc\xfe\xfe\xfe\xfe\xfe\x6c\ \x77\x7e\x18\x00\x00\x02\x37\x49\x44\x41\x54\x58\xc3\xed\xd8\xf9\ \x37\x94\x51\x18\x07\xf0\x51\xa4\x45\x96\x6c\xa9\xc6\xd6\xa2\x10\ \x53\x91\x4a\xd9\x29\xa3\xcd\x2e\x64\x09\x15\x59\x5b\x84\x09\x95\ \xa2\x7d\x21\xc5\x64\x62\x90\x2d\x32\x53\x8d\xe8\xaf\x6b\xf8\xed\ \x79\x74\x9c\xfb\x3a\xdf\xdb\xc1\xf1\xfd\x03\x3e\xe7\x7b\xde\xfb\ \xde\xfb\xde\xf7\x51\xa9\x68\x0a\xfe\x2c\x33\x05\xaa\xa5\xb3\xaa\ \x60\x9f\x26\x6b\xae\x4b\x80\x7d\xf5\xd6\xdc\x58\x2d\x70\x85\x4e\ \xa7\x3b\x2d\x03\x6e\x30\x18\x0c\xe7\xd6\xe1\x7f\xc3\x73\x53\x13\ \x34\x66\x10\x3c\xa2\xe7\xf9\x8e\x81\x87\x17\xc1\xdf\x30\xf0\xef\ \xaf\x46\x9a\xd1\xb9\x35\xff\x56\x6c\xd9\xa9\x56\xab\x25\xc0\x1e\ \x2d\x26\x6b\x1e\xe0\xe1\x3c\x93\x24\xf8\x83\x2c\xd8\xf4\xbf\xe1\ \x99\xc1\x01\x81\x0c\xce\x28\x86\x87\xf4\x42\x19\x52\x0c\x8f\x89\ \xc1\xe3\xca\x9f\xf1\x8f\x69\x81\xfc\x5c\x41\x8b\xb7\x62\xe0\x12\ \x8d\x46\x13\xba\x5b\x02\x5c\xbe\xe0\xf8\xcb\x82\xb3\x64\xc1\x75\ \x02\xf0\xec\x2f\x81\xcc\x2a\x87\x27\x3f\x8b\xec\x8f\xbe\x49\xc5\ \xb0\x51\x6c\xe7\x19\x15\xc3\xe6\xfe\x2f\x02\xe9\x37\x2b\x7f\xc6\ \xd2\x16\x6f\x1d\x96\x07\x77\x3d\x5a\x56\xae\xb6\xce\xa7\x74\xeb\ \x42\xec\x17\xc3\xd7\xce\xbe\xb3\x00\x92\xe3\xc4\xe1\xe3\x16\x4c\ \xc2\x38\x9c\x0f\x82\x9f\x30\xb8\xaa\x17\x04\x67\x32\x38\x16\xe4\ \x5a\xf6\x53\xb8\xbb\x06\xe4\x76\x6e\xa7\xf0\x15\x54\xe1\x70\xf6\ \xba\x25\xa1\x60\x6f\x0a\x3f\x6f\x03\xb9\x4f\x37\x51\xf8\x22\xaa\ \x70\x08\xdb\x79\xa9\x28\xd8\x93\xc2\xf7\xdf\x82\xdc\xea\x0d\x14\ \x4e\x44\x15\x3e\xc4\x4e\xb7\x42\x14\xbc\x83\xc2\x31\x28\x37\x8d\ \x9d\xc7\x71\x28\x78\x1f\x85\x3f\xd6\xa2\xb6\xb3\x03\x85\xb3\x51\ \x85\x8f\xb1\x4f\x53\x32\x0a\xde\x43\xe1\x17\x8f\x51\x47\xbc\x1d\ \x85\x2f\xa0\x0a\x07\xb3\xaf\x74\x3a\x0a\x76\xa7\xf0\xbd\xf7\x20\ \xb7\xd2\x86\xc2\x09\xa8\xc2\x07\xd9\x85\xa5\x18\x05\xbb\x50\x38\ \x17\xe5\x5e\x62\x57\xac\x48\x14\xbc\x97\xc2\xaf\x6f\x83\xdc\x37\ \xdb\x28\x9c\x82\x2a\x7c\x94\xdd\x36\xe3\x51\xf0\x2e\x0a\x37\xb7\ \x83\xdc\x46\x5b\x0a\x9f\x42\x15\x0e\x62\x3f\xe9\x97\x51\xb0\x1b\ \x85\x6f\x75\x82\xdc\x9b\x36\x14\x3e\x81\x2a\x1c\x40\x07\x21\x9f\ \x8a\x40\x6e\x8f\x23\x85\x33\x50\x85\xb5\x6c\x74\x73\x12\x05\xfb\ \x51\xf8\xe5\x1d\x90\xfb\x6a\x33\x85\xa3\x50\x85\x8f\xb0\x29\xd6\ \x19\x14\xec\x45\xe1\xbb\x1d\x20\xb7\x7e\x23\x85\x23\x50\x85\x03\ \xd9\x40\x2f\x1a\x05\xbb\x32\xf8\x21\xc8\x2d\xe3\x23\xc8\xf3\x20\ \xf8\x00\x87\x9d\xb5\x88\x23\xe8\xd9\x61\xb6\x74\xaa\xbf\x20\x2c\ \xf9\x7b\x42\x3b\x20\x4b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x05\x4f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\xb0\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xff\ \xff\xaa\xaa\xaa\xbf\xbf\xbf\xcc\xcc\xcc\xd5\xd5\xd5\xb6\xdb\xb6\ \xbf\xbf\xbf\xc6\xc6\xc6\xc4\xcc\xc4\xc5\xce\xc5\xc9\xc9\xc9\xcb\ \xcb\xcb\xc5\xcc\xc5\xc6\xcd\xc6\xc8\xc8\xc8\xc9\xc9\xc9\xc4\xcb\ \xc4\xc6\xcc\xc6\xc7\xc7\xc7\xc8\xc8\xc8\xca\xca\xca\xc5\xcb\xc5\ \xc6\xcc\xc6\xc8\xc8\xc8\xc9\xc9\xc9\xc8\xc8\xc8\xc7\xca\xc7\xc7\ \xcb\xc7\xc8\xcb\xc8\xc6\xc9\xc6\xc6\xc9\xc6\xc7\xca\xc7\xc8\xcb\ \xc8\xc7\xca\xc7\xc6\xc9\xc6\xc7\xca\xc7\xc8\xca\xc8\xc8\xcb\xc8\ \xc6\xc9\xc6\xc7\xc9\xc7\xc7\xca\xc7\xc6\xcb\xc6\xc6\xc9\xc6\xc7\ \xca\xc7\xc8\xcb\xc8\xc6\xcb\xc6\xc7\xca\xc7\xc6\xcb\xc6\xc6\xcb\ \xc6\xc8\xca\xc8\xc6\xcb\xc6\xc7\xc9\xc7\xc7\xc9\xc7\xc8\xca\xc8\ \xc6\xca\xc6\xc7\xca\xc7\xc8\xca\xc8\xc6\xca\xc6\xc7\xc9\xc7\xc8\ \xca\xc8\xc6\xca\xc6\xc7\xca\xc7\xc8\xca\xc8\xc7\xcb\xc7\xc7\xcb\ \xc7\xc7\xca\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\xc9\xc7\xc6\xca\xc6\ \xc7\xca\xc7\xc7\xca\xc7\xc7\xcb\xc7\xc7\xcb\xc7\xc8\xc9\xc8\xc7\ \xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\ \xc7\xc8\xcb\xc8\xc6\xc9\xc6\xc7\xca\xc7\xc7\xca\xc7\xc8\xcb\xc8\ \xc6\xc9\xc6\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\ \xca\xc8\xc6\xca\xc6\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\xca\ \xc8\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xcb\xc7\ \xc7\xca\xc7\xc7\xcb\xc7\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\ \xca\xc7\xc7\xca\xc7\xc7\xc9\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xca\ \xc7\xc7\xca\xc7\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\ \xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\xca\xc7\xc7\xca\xc7\xc7\ \xca\xc7\xc7\xcb\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\ \xc7\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\ \xc7\xca\xc7\xc7\xca\xc7\xce\xd0\xce\xd2\xd4\xd2\xd7\xd9\xd7\xe0\ \xe2\xe0\xee\xef\xee\xff\xff\xff\x04\x71\x41\x71\x00\x00\x00\x89\ \x74\x52\x4e\x53\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x1e\x1f\ \x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x33\ \x4d\x4e\x4f\x50\x51\x52\x54\x57\x5a\x5b\x5c\x5d\x5e\x5f\x60\x62\ \x63\x65\x66\x67\x69\x6b\x6c\x6f\x70\x76\x77\x78\x79\x7c\x7d\x7e\ \x80\x81\x82\x83\x86\x88\x89\x8c\x8f\x91\x93\x94\x95\x96\x97\x9c\ \x9d\x9e\x9f\xa0\xa7\xa8\xa9\xaa\xab\xac\xad\xaf\xb0\xb1\xbb\xbf\ \xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc9\xca\xcb\xcc\xd0\xd1\xd2\xd3\ \xd4\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xeb\ \xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf8\xf9\xfa\xfb\xfe\xca\xd9\x5f\ \x39\x00\x00\x02\xc5\x49\x44\x41\x54\x58\xc3\xb5\xd9\xe9\x5f\x12\ \x51\x14\x06\xe0\x33\xa0\x58\xe4\x92\xb9\x45\x66\x84\x85\x50\xb6\ \x93\x90\x66\xa5\xd0\x9e\x6d\xda\x4a\xd9\x80\x56\x9a\x2d\x02\x86\ \xd9\x32\x60\x0b\xc8\xd1\xb4\x7f\xb9\x0f\xca\x3e\x30\xcb\x3d\xe7\ \xfd\x38\x3f\xe6\xf9\xc0\xdc\x7b\x19\xde\x03\xa0\x19\x6b\x97\x2b\ \x70\x2f\xba\x10\x4f\x65\x32\xa9\xf8\x42\xf4\x6e\xc0\xd5\x69\x05\ \xe1\xb4\x9c\x9a\x52\xb0\x2a\xbf\xc3\xfe\x5e\x8b\x80\xba\xc7\x1f\ \xc3\x9a\x59\x1e\x6f\x37\xa7\x36\x7a\x67\x50\x23\x51\x4f\x83\x61\ \xd6\xe6\xfd\x84\x3a\xb2\xe4\xdb\x6d\x88\x95\x06\xbf\xa1\xce\xac\ \x1c\x93\xf4\xbb\x8e\x08\x1a\x88\xbc\x5f\x27\xdb\x14\x5a\x43\x43\ \xc9\x06\x6d\xba\x96\xc2\x2c\x1a\xce\x5c\xab\xb6\xeb\x4c\xa1\x89\ \xfc\x3c\xa2\xe5\x8e\xa2\xc9\x8c\xd4\xdf\xbd\xb7\xd0\x74\x6e\xd4\ \xd9\x8a\x4d\x8f\x50\x20\x93\x35\x1f\xa1\x65\x0a\x85\xf2\xb4\xd6\ \xd9\x74\x0d\x05\x73\x5b\xdd\xbd\x84\xc2\x19\x56\x73\xfb\xc5\x5d\ \xcc\xb9\xaa\xdd\xd6\x55\x02\x18\xd3\xcd\x55\x0b\x62\x0e\x49\xf2\ \xa6\x72\x69\x84\x54\x3e\xb4\xf1\xb7\x98\xf5\xfc\xc5\xf5\x92\x8b\ \x1b\x2a\x37\x05\xcb\xdd\x9e\xac\xca\x67\xb6\xfe\x15\xb3\x99\xbf\ \xb8\x59\x72\x71\x4b\xe5\xa6\x35\x47\xd9\xf9\xfb\x12\xa9\x60\x94\ \x4b\xcf\xe7\x41\xa4\x83\x71\xa0\xe4\xc9\x7d\xa5\x84\xbf\x14\x9f\ \xdf\x19\xa4\x84\xf1\x64\xe1\xf7\x38\x41\x0b\xc7\xf3\xbf\xdd\x5e\ \xa4\x85\x0b\xdf\xf2\x2c\x35\x1c\xd9\x76\xf7\xe6\xa8\x61\xdc\x7e\ \x47\xba\x82\xe4\xf0\x28\x00\x80\xb4\x44\x0f\xc7\x24\x00\x38\x80\ \xf4\x30\x76\x03\xc0\x79\x0e\xf8\x1c\x00\x3c\xe7\x80\x9f\x00\x58\ \xd3\x1c\x70\xda\x0a\x5d\xc8\x01\x63\x07\xb8\x78\xe0\x43\x70\x81\ \x07\x1e\x82\xfb\x3c\xf0\x04\xc8\x3c\xf0\x34\x7c\xe0\x81\xdf\xc1\ \x67\x1e\x38\x01\x0a\x0f\xfc\x1d\x32\x3c\xf0\x1f\x3e\x98\xed\xab\ \x60\x7b\x78\xef\xb9\x96\x1b\xdb\x06\x61\xdb\xd2\x6c\x87\xd0\x61\ \x1e\xb8\x8f\xef\xa0\xb7\xa6\x38\x60\xc5\x02\xf0\x8c\x03\x7e\x0c\ \x00\x3e\x0e\xf8\x2c\x00\x38\x38\xe0\x4e\x00\x90\x12\xf4\xf0\xa2\ \x04\x00\x70\x99\x1e\xbe\x08\x00\x00\x6d\xe4\xaf\xb1\xb9\x9d\x26\ \x67\x86\x1a\x96\x77\xde\xe8\x3d\xd4\xb0\x3b\x5f\xd8\x2c\xd2\xc2\ \xb1\x42\x31\x79\x9a\x16\x3e\x51\xfc\x03\xb9\x42\x09\x27\x4b\x0a\ \x80\xe3\x94\xf0\xd1\xd2\x3f\xe9\x2f\xe8\xe0\x57\x65\x25\x6a\x37\ \x5d\xad\x50\x51\xa1\x06\xa9\x8a\x90\xb1\xca\x7e\x5b\xb3\xde\xd6\ \x97\xd7\x55\xad\x9e\x5d\xa1\x70\x53\xcd\xd5\x35\xd6\xc1\x1c\x41\ \x3d\xe6\x54\x2b\xde\x46\xc4\x61\xbf\x7a\x55\x78\x55\xd4\xbd\x59\ \xab\x34\x7d\x28\xe6\x3e\xa8\x59\xf4\xda\x26\x85\xdc\x3a\x4d\xbd\ \x14\x32\xef\x5e\xaf\x3f\x23\x1a\x36\xb9\x36\x72\x01\xad\x92\xbe\ \xcf\xd4\x7a\x5e\xed\xd7\x1e\x2b\xd8\x4d\xec\xc1\xb7\x2d\xba\xc6\ \x4c\xc1\xac\xc1\x01\xcb\x58\xa3\xce\xd9\x4d\x7b\xd8\x88\x3b\xdd\ \x63\x60\x88\xe5\x59\xd6\xcb\x26\xdd\x92\xc1\x69\xde\x47\x3d\x6c\ \xc2\xb7\xcb\xf0\x44\xaf\x61\x20\xa2\xb1\xf4\x72\xb2\xdb\xe4\xf0\ \xd4\xee\xaf\x33\x2d\x4c\x8e\xb7\x09\x0e\x63\x7f\x54\xa3\xbf\xc2\ \xfe\x5e\x09\x44\x63\xe9\x70\xfa\x27\xe4\xf9\xb8\x92\xc9\x28\xf1\ \x79\xf9\xce\x90\x73\x9f\x8e\x09\xef\x7f\x14\xca\xc9\xa0\x78\x1d\ \x68\x45\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x4e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\x7e\x50\x4c\x54\x45\x00\x00\x00\x42\x4a\x61\x43\x4a\ \x60\x41\x4b\x5f\x42\x4a\x60\x46\x4e\x63\x48\x4f\x65\x48\x50\x64\ \x49\x51\x65\x4a\x51\x66\x50\x58\x6c\x60\x66\x78\x70\x75\x85\x73\ \x79\x88\x84\x88\x96\x84\x89\x96\x8a\x8e\x9b\x8e\x92\x9e\x93\x97\ \xa2\xa0\xa4\xad\xa8\xab\xb4\xac\xae\xb6\xac\xaf\xb6\xaf\xb1\xb9\ \xb3\xb6\xbc\xb9\xbc\xc1\xbc\xbe\xc4\xc2\xc4\xc9\xc5\xc7\xcb\xd1\ \xd2\xd4\xdb\xdc\xdd\xe0\xe0\xe1\xe1\xe1\xe2\xe3\xe3\xe4\xe6\xe6\ \xe6\xe9\xe9\xe9\xeb\xeb\xeb\xec\xec\xec\xee\xee\xee\xef\xef\xef\ \xf0\xf0\xf0\xf3\xf3\xf3\x59\xd8\x31\x3c\x00\x00\x00\x04\x74\x52\ \x4e\x53\x00\x7c\x8a\xc3\x2d\x79\x14\x65\x00\x00\x00\x7b\x49\x44\ \x41\x54\x18\xd3\xad\xd0\x49\x12\x82\x30\x14\x45\x51\x90\x8f\x48\ \x2b\x22\x9d\xd2\x1a\x89\x26\xfb\xdf\x20\x21\x45\x93\x4f\x18\x72\ \x87\xa7\xde\xe8\x19\x16\x00\xd4\x64\x2b\x85\x8b\x21\x52\x39\x8b\ \xa2\x26\x05\xe9\x2a\xdf\x63\xbf\x12\x3c\x39\xe2\x22\x90\x0c\xe6\ \x31\x5b\x98\xbd\xeb\x11\x77\x6d\xfb\x51\xf8\xf1\x92\x3d\x13\x51\ \xb8\xb1\xd6\x79\x9c\xf7\x28\x67\xe6\x37\x19\x18\x63\xc3\x72\x96\ \xbb\x32\xe5\x9c\x53\x9d\xa7\x35\xfb\x6b\xfc\xfd\x89\xe8\x8e\x4b\ \x82\xba\xcd\x9c\x60\xb6\xcf\xe2\x11\xe8\x5b\x22\x79\xc6\xfc\xa1\ \xa1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0a\xe8\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0a\xaf\x49\x44\x41\x54\x78\xda\xed\x9d\x79\x70\x13\xd7\ \x19\xc0\x95\xce\xb4\xd3\x7b\x3a\x6d\xfa\x67\xcf\xe9\x35\x99\x1e\ \xd3\xce\x34\x90\xd2\x4e\x48\x20\xa4\xc1\x09\x94\x1b\x0c\xc6\x98\ \x80\x11\x01\x5f\xc0\x40\xc1\x76\x39\xec\x60\x20\x84\x74\x7a\x01\ \x4d\x30\xe6\x68\x00\xbb\x81\x60\x07\x9b\xdb\xc6\xc6\x36\xd8\x69\ \x49\x93\x12\x5b\x92\x6d\xc9\x92\xb5\x5a\x79\xf7\xad\x81\x24\x74\ \x12\x92\x7c\x7d\xdf\xda\x5a\xed\x69\x4b\xb2\x96\x99\x3c\xf4\x66\ \xbe\x7f\x3c\xd6\xee\xbe\x9f\x3e\x7d\xef\xbb\xf6\x3d\x87\x23\x81\ \x11\x08\x04\x3e\xc7\x11\xf2\x38\x27\x8a\x65\x21\x81\xd4\x51\xe9\ \x09\x89\x44\xa2\xf2\x31\x15\xf8\x84\xcb\xc7\xf2\x5c\x08\xe9\xc6\ \xb9\x71\xa2\xb4\x95\xce\x75\x92\xd7\xeb\xfd\xac\xc3\xee\x11\x96\ \xa4\x9f\x72\x02\x79\x91\x3e\xc0\x0d\x06\x40\xc6\x25\xbc\x48\x06\ \x78\x42\xfe\xce\x4b\xd2\x4f\x92\x0e\xb6\xbf\xbf\xff\x7b\xf4\x9b\ \x7c\x95\x11\x0d\x1d\xb5\x86\x53\xd8\xc7\xc3\xe1\x1b\xdf\x1d\x35\ \x58\x00\xb8\x2f\x24\x4a\xeb\xe8\x45\xff\x97\x02\x6b\x90\xdb\xd4\ \x84\xac\x41\x46\x09\xc1\x25\x84\x7c\x99\x5e\xa0\x96\x75\x50\x9c\ \x20\xc0\x9b\xde\x6b\xd0\xf4\xf6\x39\xa8\xbb\x56\x09\x27\xdb\x2b\ \xe0\xc2\x9b\xd5\x70\xd5\xd5\x04\x5d\x5c\x77\x0c\xd7\x10\x6b\x04\ \x41\xf8\x52\x5c\x70\x43\xa1\x77\xbe\x4e\x35\xf7\x5f\xcc\x42\x15\ \x45\x68\xba\x7e\x06\xf6\x9c\x2f\x86\xfc\x43\x13\x61\xe9\x4b\xbf\ \x34\x95\xec\x7d\x63\x60\xcb\xf1\x0c\xa8\x6c\xdd\x0d\xae\x80\x6b\ \xb8\x6b\xb6\x23\xb3\xd8\x35\x57\x94\x5e\x67\x15\x6e\xab\xab\x1e\ \x36\xbf\x92\x61\x09\xd5\x4a\x96\x97\xff\x0a\x0e\x34\xec\x00\x2f\ \xd7\x6b\xf1\x4b\x20\x6f\x78\x07\x06\xbe\x32\x92\xcd\xfd\x14\xab\ \x66\xa1\xaf\x3f\x04\xbb\xcf\x15\x99\xc2\x73\xee\x1f\x0b\x39\x87\ \x7f\x03\x05\x47\xc7\xc3\xaa\xca\x47\x21\xef\xe5\x87\x61\xc5\xc1\ \x71\x90\x6d\xf2\xbf\x79\x54\xe3\x9b\x3b\x2e\x58\x9a\x8b\x61\x6d\ \x32\xd5\xdc\xb5\x2c\xc2\xf5\x04\xbb\xa1\xe4\x44\xa6\xee\xe7\xff\ \x20\xac\xa9\x9a\x00\x9b\xea\xa6\x42\x59\xc3\x1c\xd8\x66\x22\xcf\ \x5e\x98\x09\x85\xd5\x93\x61\xe5\xa1\x5f\x6b\x3e\xbb\xac\x7c\x2c\ \xbc\xda\x56\x61\x7e\x3f\xba\xf0\x59\xba\x62\x2c\x7a\x0b\x3e\xbe\ \x0f\x8a\x2a\x67\x69\x00\xe5\x1f\x19\x0f\x25\xe7\x66\x98\x42\x35\ \x95\xfa\xd9\x50\x58\x93\x26\x6b\xba\xfa\x3a\x16\x90\x6f\x9b\xba\ \x70\x43\x7e\x2e\x73\x1e\xc2\xf3\xaf\xe5\x44\xb5\x96\xca\xba\xe3\ \x93\x2c\x35\x76\x24\x41\x8d\x56\x6b\x33\x6a\xb2\x85\xb9\x78\xc5\ \x10\xa1\xb1\x18\x44\x1c\xbf\xf2\xa2\x46\xe3\x36\x9c\x7c\x22\x21\ \xb0\x6a\x29\xbb\x38\x8b\x42\x1e\xa7\xb1\xc9\xde\x50\xaf\x31\x18\ \x51\x47\x7c\x43\xe1\x2f\x53\x70\x71\xd2\xb9\x07\x1f\x55\x40\xac\ \xf9\xe7\xc4\x51\xc3\x8d\x48\x29\x35\x2f\x6a\x73\x71\xf0\xd2\x73\ \xc6\xd0\x9a\x86\xd5\x4a\xe2\x86\xc5\xdc\x02\x4e\x5a\x71\xb1\x2a\ \x1e\x82\x32\x6a\x47\x93\x05\x18\x05\x6d\x72\xd4\x85\x1b\x07\xee\ \x3e\xb7\x21\x77\x21\x27\x88\x30\x2b\xc6\xa2\xed\x2d\x38\x34\x49\ \x01\x50\x44\x61\x24\x13\x6e\x64\xe1\x53\x9b\x8a\xaa\xd6\x3d\x86\ \xe7\x08\x8b\xe2\x44\xea\x9a\x89\xdb\x58\x03\x7c\xd5\x75\x49\xb5\ \x10\x8d\xa1\x30\xe6\x24\x1f\x30\x95\x0d\xd4\x85\x8b\xdc\x07\xdd\ \x40\x63\xc4\x28\x6d\x75\xc8\xf9\x5c\xd6\xcc\x43\xe3\x4e\x65\xe2\ \xab\x69\xe0\x60\x07\x5c\xd9\xab\x38\x3f\x53\x09\x46\x30\xac\xee\ \x0e\xf6\x68\x9f\x85\x90\xd7\x1c\x72\x62\x99\x31\xc0\x2f\xd4\x16\ \x28\x80\x0b\xed\x30\x0f\x2a\x51\x9b\x89\x36\x77\xb3\xee\x59\x24\ \x0f\x35\x11\xe4\x26\x6b\x80\x31\x41\x13\x99\xf4\x46\x1a\xa9\xd9\ \x09\x38\xef\xc8\xc3\xca\xbd\x30\x0b\xa7\x7b\x16\x09\x01\xdf\x61\ \x0d\xf0\xba\x97\xa7\x28\x93\xde\x72\x76\x9a\xad\x80\x31\x77\x11\ \xb9\x17\xa6\x3a\x75\xcf\x72\xc7\x21\x27\x8e\x19\x03\x5c\x5c\x35\ \x5b\x99\xf4\xe6\x33\xf6\x6a\x70\xc1\xd1\x47\x94\x7b\x9d\xbe\x56\ \xa9\x7f\x96\x77\x11\x30\xcf\x1a\xe0\xed\x35\xcb\x95\x49\x17\x9f\ \x7a\xd2\x5e\x1b\x7c\x38\x1a\x3a\x9b\x84\xcd\x1c\x02\xbe\xc2\x1a\ \x60\x75\x5a\x12\x73\x0f\xb6\x01\xa6\xee\x9f\x73\xff\x18\xe5\x5e\ \x6f\x79\xdf\xd0\xb9\x69\xa4\x19\x01\xef\x67\x0d\x30\x96\x7e\x22\ \x93\xc6\xe4\x8c\x5d\x80\x71\x01\x8d\xdc\xa7\xe0\xd0\x63\x72\x80\ \xa3\x7b\x96\x7d\x0e\x1a\x33\x2f\x61\x0d\x70\x0f\xe7\x93\x33\x5d\ \x91\x0c\x5a\xc9\xb9\xe9\xb6\x00\x5e\x5d\x35\x41\x01\xbc\xf7\xfc\ \x26\xe3\xb3\x10\x92\xe5\xe0\x06\x06\xbe\xc5\x62\x26\x6d\x5b\xf5\ \xb2\xa8\x76\x1d\x1d\x9f\x74\xb8\xf8\xa5\x61\xd2\x3e\x72\x0f\x2c\ \x9a\xea\x33\x6a\x9c\x24\x7d\x73\x28\x17\x4c\x9a\xd9\x0b\x97\x1b\ \x35\x79\xe0\x8d\xa7\x93\xe7\x4d\x94\xe9\xfc\xdf\x92\x13\x8b\xcc\ \xb4\xb7\x31\x5a\x2a\xa2\xaa\xcc\x62\xa9\x68\xd7\xa9\x5c\x4d\xdd\ \x2d\x59\xa6\x02\x17\x4e\x75\x9e\x19\xbf\x4c\x93\xfa\x5c\xa6\xba\ \xd8\xf9\x69\xfa\x47\x1f\x6b\x80\xdf\xee\xbd\x0e\xb9\x07\xa3\x76\ \x12\x0b\x99\xa5\xf1\x94\x8a\x4c\x64\xfd\xc9\x27\x34\xc5\x50\x53\ \xdb\x2b\x12\x7a\x67\xf8\x8c\xae\xe0\x29\x66\xb2\xa8\xc5\xcd\x1d\ \x17\xc1\x59\xfe\x50\x54\x93\x2b\xc6\x26\x64\x2e\x30\x9f\xac\x5e\ \xd4\x50\x4a\x4f\x2c\x86\xbe\x7e\xde\x2c\x8b\xb6\xc0\xa2\x4d\x4a\ \x6c\x60\x11\x72\xdd\xbf\x8f\x69\x20\xa3\x06\xe6\xd3\x85\xaf\xe4\ \xec\xf4\x98\xec\x6d\x61\x75\x9a\x9c\xb4\x57\xc3\x2d\xae\x9c\x63\ \xd1\xf9\x23\xd5\x5b\x96\xee\x83\x84\x7c\x83\xfe\x93\xc8\x22\xe4\ \x96\xce\x7a\x8d\xb9\x88\x80\xc6\x6c\xd8\x5a\x6a\x53\x31\xe2\xdb\ \x7c\xfa\x77\xb0\x85\x42\xdf\x58\x3b\x45\x86\xba\xea\xd8\x23\x72\ \x3e\x59\xdf\x1b\xf1\x42\x6d\x3e\xf4\x86\x83\x66\xf7\x91\xd0\x2b\ \x1b\xb6\xf9\x04\x7b\x61\xe9\x3f\xbe\xcf\x22\x64\xb4\xc9\xbb\x4e\ \xe5\xc5\xdd\xd5\xa3\x2e\x70\x9e\x68\xdb\x2f\xb7\x5e\x99\x5c\xff\ \x7d\xb9\x82\x11\xcb\xe0\x05\x69\x1e\xfd\xc0\x87\xac\xb6\x4f\x61\ \x63\xdf\xf6\x1a\xa7\x12\x8c\x8c\x24\xab\x0e\x3f\x0e\x87\x9a\x9e\ \x07\x6f\xc8\x6f\x75\xcd\x3b\x94\xd9\xdc\xb8\x1a\x00\x79\x51\x9c\ \xca\x7a\xdb\x2a\xf6\x99\x61\x06\x6c\xcf\xb9\x22\x78\xae\x66\x85\ \x9c\x85\xfb\xfd\x91\xa9\xb2\x5f\xfb\xc7\xba\x55\x32\xd4\x76\x4f\ \xb3\x59\x08\xac\x96\xf7\x28\xdc\xa7\x12\x6a\x61\x0d\xf6\x0f\xfc\ \x9c\x06\x21\xee\x54\x2f\xb0\xa5\xb8\xc2\xe1\x81\x9f\x8d\xb6\xbb\ \xfd\x8b\x34\x10\xd9\x49\x2f\xf6\x41\x0a\xa8\x22\x1f\x50\x26\x3b\ \x78\x9e\xff\x42\x32\x5f\x23\xf8\x3e\xbd\x70\x39\xab\x0b\x60\x8c\ \x82\x73\xdf\x87\x7d\x7c\xb6\xbd\x08\xd3\x77\xeb\xd6\xd7\xa8\xbf\ \xbc\x62\xa8\x1a\xfd\xee\x3d\x00\xf5\x9d\xc1\x96\x5e\xe9\x99\xc0\ \xcd\x9b\x5f\x75\xdc\xcd\x81\x21\x36\x75\x59\x7e\xc4\x0b\xc2\x14\ \x4c\x7b\x52\x17\x2f\x7f\xf0\x9d\x8e\x4f\xae\xe0\x1c\xe8\x5c\x9e\ \xc6\x39\x05\x05\xe1\x87\x38\x47\x47\x6a\xa4\x46\x6a\xa4\x46\x6a\ \xa4\x46\x6a\xa4\x46\x6a\xa4\x46\x6a\xdc\xdd\x40\x83\xc6\xe4\x0f\ \x60\xe6\x8d\x13\xa4\x6c\x56\x02\x0d\x9c\x0b\x06\x1a\x38\xb7\xbb\ \x1e\x68\x70\xb7\x6e\xdd\x4f\x81\xe6\xf0\x22\x39\x83\xa9\xba\x7b\ \x20\x54\xc6\x74\xc0\xe9\x90\x28\xae\xc4\x34\x81\x6d\x60\x31\x6c\ \xa4\x37\xaa\x48\x25\x7b\x48\x79\x9f\x20\xfc\x20\x69\x60\xf1\x55\ \x7d\x5e\x20\xbb\x58\xec\x23\x1e\x85\xdc\xc1\x14\x2e\xa6\x72\x47\ \x67\x0e\x04\xe1\x17\xd8\x06\x9f\x02\x6a\x29\x5e\x6a\x3a\x1e\x4c\ \x0c\xae\x28\x4e\x1b\xb6\x64\x24\x88\xd0\xd7\xd6\x0a\xde\xfd\xbb\ \xa1\x6b\xfb\x1f\xc0\x53\x94\x07\xee\xdc\x2c\x70\xaf\x59\x06\x9e\ \xd2\xf5\xd0\xfd\xa7\xed\xd0\x5b\x7b\x12\xb8\xde\x5e\xe6\x77\x3e\ \xc1\x45\x3e\xbe\x7a\x9c\x20\xa5\x5b\x15\x3d\xb9\x40\x40\x86\xea\ \x5a\x36\x17\x3a\xd2\x27\x8f\x28\x9d\x19\x4f\x41\xd7\x96\xb5\xf2\ \x97\xc1\x30\xe4\x0f\xb1\x50\x1c\x9b\xe6\x12\xf2\x5b\xd3\xf2\x10\ \xd5\x58\x5f\xd5\x3f\xa0\x73\xe9\xec\x98\xc0\x9a\x49\x57\x59\x11\ \x04\x5d\x1d\xcc\x96\x91\xb0\xe5\x61\x78\x4f\xc1\xa2\xf1\x84\x0b\ \x06\xa1\x6b\x6b\xa1\x01\x98\x6b\xc1\x93\xe0\x7d\x7a\x06\x04\x9d\ \x73\x81\x5f\x31\x1f\xfa\x73\x32\x80\x5f\xb9\x00\x42\xcf\xa4\x83\ \x3f\x7b\x16\x78\x32\xa7\x1a\x35\x9a\x7e\x41\x81\x96\x26\x56\x21\ \x4b\xa1\x81\x81\x6f\x5b\x05\x0d\xf7\x61\xcb\xa5\xfe\x43\x41\xaf\ \x17\xdc\xab\xb3\x35\x90\xdc\xf4\x67\x1f\x5c\x3e\x17\x48\x41\xd6\ \x88\xd2\x9f\xbb\x10\x7a\x16\x4f\xd7\x99\x8d\x29\xb2\x7d\x66\x13\ \xb2\xd8\x60\xda\x3a\x65\xda\xc2\xca\xf3\xf2\xe2\xa5\x86\xe3\x5b\ \x32\x13\xc4\xfc\x45\x31\xc1\x55\x4b\x88\x6a\x78\x27\xd5\x78\x35\ \xe4\x40\xeb\x65\x56\x21\x2f\x34\x86\xbc\x26\xed\xab\xe8\x09\xa8\ \xe1\xf6\x39\xe7\xc6\x0d\x56\xa3\xcd\x79\x99\xe0\x59\x38\x45\x63\ \x2e\x82\xae\x4e\x16\x21\xfb\x35\xed\xab\x3c\x21\x8b\xf5\xff\x14\ \xb8\xda\xac\x81\xeb\xcf\x9e\x3d\x2a\xb8\x6a\xc8\x2e\x95\x26\x77\ \x6d\x2b\x66\x55\x8b\x17\xa9\x7a\x83\x49\x8b\xde\x63\xf0\x6c\xc8\ \x51\x20\xf4\x64\x4d\x4b\x0a\x5c\xb5\xb9\x50\x7f\x79\x81\xb6\x2b\ \xec\x01\x16\x48\xd3\x20\x5c\xba\xea\xe9\x5f\x82\x09\x34\xd6\x47\ \x7f\xc6\xf3\x27\xcb\x0b\x55\x32\x01\xa3\xf4\x2c\x9e\xa6\xdc\xc3\ \x53\xb2\x8e\xc9\x3d\x2e\xe5\x97\x60\x38\x81\x2c\x35\xbc\x06\xf5\ \xe7\xed\x9a\x45\x2d\xd9\x70\x65\x53\x91\xb3\x50\xb3\xe0\x71\x7e\ \x3f\x7b\x3b\xb6\x52\xd3\xeb\x18\xca\x90\x69\xcc\x83\xcb\x39\x4f\ \x99\x7c\x88\xfa\xb5\x76\x00\x46\xf1\x64\x46\x17\x3c\x7f\x5d\x35\ \x8b\x5a\x5c\x8e\x80\xaf\x6a\x76\xc8\x7b\xeb\x3f\x9a\x40\xc2\x2e\ \xb8\x28\x18\x8c\x28\x76\xfe\x2f\x3b\x58\x04\xdc\x62\x78\x19\x3c\ \x70\xb9\x41\x99\x74\x37\x8d\xc4\xec\x04\xcc\xd1\x88\x4f\xb1\xc3\ \xa5\xeb\x59\x04\xcc\x19\xb6\x33\xc0\x08\x2b\x32\x69\x2f\x8d\xc0\ \xec\x04\x8c\x61\xb5\x12\x1d\xae\x71\x32\x59\x0d\x31\x6c\xc8\xe1\ \x3b\x71\x4c\x05\x78\x86\xad\x80\xc3\x39\x19\x51\x73\x94\x9b\xc5\ \x64\x62\xde\xa1\xdf\x33\xcd\x7f\xfe\xb4\x6d\xfe\xef\x70\xfe\xb0\ \xbb\xb8\x80\xc9\xe4\x0f\xbe\x80\xd8\xa5\xb1\xc1\xd4\xe9\x57\xec\ \x22\x0d\x6b\xed\x04\x8c\x59\x38\x25\xa2\xdb\xb1\x89\xc1\x8d\xa0\ \x89\xdb\xb0\xad\x17\xe7\xf3\x42\xc7\xfc\x34\x65\xe2\x02\x0d\x6d\ \xed\x02\x8c\xa9\x4e\xc5\x1c\x55\xec\x61\x4f\x83\x71\x5b\x2f\xf9\ \x2c\x0c\xfd\x7e\xbb\x85\xb9\xca\xc4\x63\x4d\x4b\x26\x22\xea\x9c\ \x44\xe0\xf5\x36\x06\x35\x58\x7a\x36\xf2\xe2\xa1\xf6\xf5\xa6\xa3\ \x07\x6c\x37\x13\x6a\xf3\xe0\x5a\x9e\x2e\x07\x38\xec\x9d\xbd\x21\ \x4e\x70\xe0\x06\x96\xb8\x91\xa5\x86\x7c\x97\x07\x3a\x16\x4e\xb5\ \x4f\x8b\xf3\x17\x81\x5b\xa5\xbd\x3d\x07\xf6\x30\xb9\xc0\x29\xa7\ \xc7\xe0\x56\xac\x06\x2d\xde\xf7\x37\x4d\x44\xd7\x9f\x44\x5b\xdc\ \xbb\x24\x6a\x7b\x3b\xb3\xe7\xc8\x85\x54\x06\xf3\x10\x7b\xd5\xd5\ \x8c\x07\xe8\x1f\x3f\xd2\x68\xb1\xdf\x2f\x4f\x5e\x59\xe5\x69\x54\ \x27\xe6\x8f\x1e\x72\x40\x57\x8d\xf6\x1d\x3f\xca\xe6\x69\x31\xfa\ \x23\x79\xf0\xf8\x18\xd3\xa4\xbb\xaa\x02\x81\xf6\x78\x34\xa9\x4b\ \xbf\xea\x0b\x53\x92\xed\x0c\xda\x5e\x2a\x55\xc6\x72\xfd\xe0\xe6\ \x48\x86\x66\x3e\x75\x64\x17\x31\x17\x41\xe7\xbc\xf8\x52\x93\xb9\ \x19\x72\xd0\xa2\x29\x9c\xd2\xd0\x98\xe3\x38\x36\x1b\x51\x6e\xdc\ \xf8\x8e\x69\x65\x19\x8f\x28\x30\xdd\xc9\x9f\x42\xc6\x06\x12\x8d\ \xf6\x51\x93\x81\x35\x3a\x71\x18\xdb\x8c\xb9\x06\x1f\xb5\xb7\x9d\ \xe9\x69\x9a\xcf\x7a\x8a\x0a\x64\x7f\x9b\xc9\x53\x66\x08\x29\x18\ \xae\xdf\x17\x77\x3d\xa9\x31\xfb\x20\xf6\x32\x74\x66\x9b\x77\xf3\ \xa0\xe9\x40\x0d\xc5\xc0\x01\x2b\x15\x08\x5f\xed\xe3\xaa\xa5\xfb\ \xaf\x3b\x21\xc4\x87\x19\xad\xc3\x49\x27\x47\x3c\x3c\x8a\xfe\x6c\ \x3f\x6f\xa8\xd1\xa9\xdb\xa6\xca\xa9\x77\x61\xd2\x50\x32\x92\x60\ \xf9\x9f\xf1\xf6\xa9\xf6\x98\xbb\x2d\x07\x0f\x8b\x22\xed\x96\x3f\ \x83\xee\x2e\xf0\x1e\x3b\x30\xd8\x33\x31\x3f\xcd\x12\xaa\xcb\x99\ \x2e\x6b\xac\xff\xf2\x25\xd6\x1b\x00\xdb\xb0\x31\x3d\xee\xbe\x60\ \x2b\x73\xa1\xcd\x5d\xf8\x20\xd0\x7e\x15\xfc\x17\xcf\xca\xb6\xba\ \xb7\xae\x1a\xfc\x2d\x8d\x10\xbc\xfe\x5f\x56\x3d\x04\x83\x59\x48\ \xb8\x4f\x58\xb6\xc9\x83\x0b\xdf\x6d\xf6\x41\xc5\x2d\xef\xe1\x82\ \x96\xf0\x81\x7d\xea\x81\x67\xf3\xe0\xf1\x31\xa1\xd4\x91\x93\x30\ \x14\x90\x55\x59\xba\x62\xa3\x19\x18\x9d\xc8\x07\x87\xea\x72\x17\ \xf7\x82\x0c\x1d\x9a\xba\x97\x32\xf8\xb1\xed\x6f\x1a\x61\x12\x23\ \x4c\xc8\x63\x98\x8e\xa3\x61\xf6\xa9\xa1\xd7\x0c\x58\x39\xf6\xf7\ \xa3\xc1\xb9\xd0\x39\xd1\xb9\xf1\xa2\x54\x8a\xdb\x75\x25\x7a\xec\ \xef\xff\x01\xda\x1a\x34\x26\xcb\xef\xf1\xa8\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x82\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x95\x50\x4c\x54\x45\x00\x00\x00\xdb\xb6\x24\x80\x00\ \x80\xdf\xbf\x20\xe3\xc6\x1c\x80\x00\x80\xef\xbf\x10\xf0\xb4\x0f\ \xf1\xb8\x1c\xeb\xba\x14\xec\xbd\x13\xed\xb6\x12\xee\xbb\x1a\x80\ \x00\x80\xe4\xea\xef\xe5\xea\xef\xec\xbb\x16\xec\xb9\x15\xea\xba\ \x15\xea\xbb\x15\xea\xb9\x15\xea\xb9\x17\x80\x00\x80\xec\xba\x16\ \xec\xbb\x15\xe8\xb6\x19\xea\xba\x17\xea\xbb\x17\xeb\xba\x16\x80\ \x00\x80\xba\x68\x45\xea\xba\x16\xea\xba\x16\xeb\xbb\x16\xeb\xb9\ \x16\x81\x03\x7e\x86\x0a\x7b\xe7\xec\xec\xe7\xec\xec\xeb\xba\x16\ \xe6\xeb\xeb\xeb\xba\x15\xeb\xba\x17\xeb\xbb\x16\xeb\xba\x16\xeb\ \xba\x17\xeb\xbb\x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x16\xeb\xba\ \x16\x80\x00\x80\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\ \xeb\xba\x16\x80\x00\x80\xe7\xea\xe4\xe8\xea\xe4\xe8\xeb\xe5\x80\ \x00\x80\x81\x01\x7f\x82\x05\x7d\x86\x0a\x7a\x88\x0d\x79\x88\x0f\ \x78\x8b\x13\x75\x92\x21\x6d\x97\x28\x69\x98\x2a\x68\xaa\x4a\x56\ \xae\x4f\x53\xb5\x5c\x4c\xd5\x93\x2c\xd9\x9b\x27\xde\xa3\x23\xdf\ \xa6\x22\xe3\xab\x1e\xe3\xac\x1e\xe3\xad\x1d\xe4\xae\x1d\xe6\xb1\ \x1b\xe7\xb2\x1b\xe7\xec\xed\xe9\xca\x59\xe9\xca\x5a\xe9\xca\x5b\ \xea\xb9\x17\xea\xcb\x60\xea\xcc\x5f\xeb\xba\x16\xeb\xba\x17\xeb\ \xba\x18\xeb\xbb\x17\xeb\xbb\x18\xeb\xbb\x19\xeb\xbb\x1a\xeb\xbc\ \x19\xeb\xbc\x1a\xeb\xbc\x1b\xeb\xbc\x1c\xeb\xbe\x29\xeb\xbe\x2a\ \xeb\xbf\x2b\xec\xbb\x17\xec\xbb\x1a\xec\xbd\x1c\xec\xbd\x1d\xec\ \xbd\x1f\xec\xbe\x20\xec\xbe\x22\xec\xbf\x22\xec\xbf\x23\xec\xbf\ \x24\xec\xc0\x23\xec\xc0\x24\xec\xc0\x27\xec\xc2\x2c\xec\xc3\x2f\ \xed\xc0\x27\xed\xc1\x27\xed\xc2\x2b\xed\xc3\x2e\xed\xc6\x35\xed\ \xc6\x36\xed\xc7\x36\xed\xc7\x39\xed\xc8\x39\xee\xc6\x34\xee\xc8\ \x39\xee\xc9\x3d\xee\xca\x3e\xef\xca\x3e\xef\xca\x3f\xf5\x5b\x5d\ \x76\x00\x00\x00\x3d\x74\x52\x4e\x53\x00\x07\x08\x08\x09\x0c\x10\ \x11\x12\x1a\x1b\x1c\x1e\x28\x30\x31\x5e\x5f\x60\x61\x62\x63\x66\ \x76\x78\x7a\x7a\x7b\x7d\x7e\x9f\xad\xae\xaf\xb0\xb4\xb5\xc7\xc8\ \xc9\xca\xca\xcb\xcd\xce\xd7\xd8\xd9\xe2\xe3\xe4\xe7\xef\xf0\xf1\ \xf3\xf4\xfc\xfc\xfc\xfc\x12\xdf\x4a\x6c\x00\x00\x01\x5f\x49\x44\ \x41\x54\x18\x19\x45\xc1\x8b\x23\x13\x71\x00\x07\xf0\x2f\x93\x6d\ \xca\x26\x42\x79\xc4\x84\xa1\x8c\x62\x3b\x8d\x5f\xe5\x2d\x79\x8d\ \xa3\xae\xef\xcc\x3c\x66\xe4\xd1\x95\x70\xcc\x59\x6d\x6e\x7f\x77\ \xdb\x6f\x37\x3e\x1f\x14\xb9\x9e\x75\x04\x46\x46\x02\xbe\x3a\x27\ \x1a\x50\x52\xd1\x1c\xa2\x2d\xf8\xf2\x7d\x35\x8a\xdc\xbd\xfc\x9d\ \x49\x51\x8a\x4c\x8b\xce\x47\x28\x78\xfc\x2e\x9e\x31\x4f\x0e\x49\ \x7e\x9b\x9d\x10\x05\x43\xad\x40\xc5\xeb\xf8\x9d\x91\x30\xb3\x3b\ \x24\x23\x33\xa2\xe0\x55\x39\xd0\xc2\x8c\xa1\xe7\xf4\xad\x23\xe6\ \xad\x8e\x0b\x21\xa6\x5e\x00\xae\xd0\x1f\x33\x61\xed\x5e\x58\xe7\ \xcc\x5b\xfb\x20\x84\x98\x0c\x3a\x51\xcf\xcc\x89\xa9\x5f\xfc\x8b\ \x1e\x68\x5a\x92\xf3\x9f\x3e\x7f\x99\xfb\xb8\x5c\x8b\x0e\xa6\x62\ \xd9\x2d\x2b\xfa\x75\x4c\x55\xc3\x1b\x0b\x2b\x24\x17\x97\xda\x31\ \x40\xf2\xc7\x91\x71\x30\xd6\xe5\xf1\x74\x87\x93\x94\x02\x50\x28\ \x69\xaa\x07\xf0\xaa\x1a\x25\x05\x0a\x25\x4d\xf5\x00\x5e\xf5\x3b\ \xa5\x10\x06\x28\x25\xc3\xdd\x5e\x6f\xcf\xe8\xbe\x91\xd8\x21\x19\ \x80\x8f\x45\x1b\x61\x55\x1d\x5d\x8f\xe6\x36\xb3\xb1\x14\xdb\x50\ \x47\x5b\x52\xd3\xf6\xa3\x37\xd7\x3f\xcd\xd3\x34\x6b\xe0\x0a\xf2\ \x9e\x91\xbb\xde\xb5\xf6\x6e\xcf\x86\x2b\x81\x26\xde\x3b\xde\xd4\ \x2d\xfd\x2a\xcd\x46\x00\x8e\x3e\x96\x6c\x67\xcd\xbd\xab\xbb\xb8\ \xdf\x81\xbc\xaa\xb7\x2c\x89\x9d\xde\xa6\xe3\x83\x6e\x48\x6e\x3f\ \x6d\x97\x7f\x7f\xf1\xcd\x13\xd8\x1c\xcf\x83\xb4\x0d\x37\x96\xe1\ \x81\xb3\xd6\xd7\xaf\x28\xfd\xed\x4f\x2b\x21\xfd\x07\x34\x36\x81\ \x0a\x59\x5b\xd2\x78\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x01\xe3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x00\x8a\x50\x4c\x54\x45\x00\x00\x00\x00\x00\x00\x40\x50\ \x60\x42\x4b\x60\x42\x4a\x60\x4a\x52\x66\x4d\x54\x69\x4e\x55\x6a\ \x50\x58\x6c\x53\x5b\x6e\x54\x5b\x6e\x5a\x61\x74\x5d\x64\x77\x7d\ \x81\x90\x81\x85\x94\x81\x86\x93\x88\x8c\x99\x8b\x90\x9c\x8f\x93\ \x9f\x97\x9a\xa5\x9b\x9e\xa8\xa4\xa8\xb0\xa7\xaa\xb3\xab\xae\xb6\ \xaf\xb1\xb9\xaf\xb2\xb9\xb8\xba\xc0\xcd\xce\xd2\xd1\xd2\xd4\xe0\ \xe0\xe1\xe1\xe1\xe2\xe3\xe3\xe4\xe6\xe6\xe6\xe7\xe7\xe7\xe8\xe8\ \xe8\xea\xea\xea\xeb\xeb\xeb\xed\xed\xed\xee\xee\xee\xef\xef\xef\ \xf0\xf0\xf0\xf4\xf4\xf4\xf7\xf7\xf7\xf8\xf8\xf8\xf9\xf9\xf9\xff\ \xff\xff\x30\xe6\xcf\x1e\x00\x00\x00\x04\x74\x52\x4e\x53\x00\x01\ \x10\x9a\xe8\x49\x64\xa6\x00\x00\x01\x04\x49\x44\x41\x54\x58\xc3\ \xed\xd5\xc9\x0e\x82\x30\x10\x80\x61\x54\xdc\xf7\x5d\x54\x94\x02\ \x22\x02\xbe\xff\xeb\x89\xa8\x2c\xa5\x36\x50\xa6\x09\x09\xf3\x5f\ \x7a\xa1\xdf\xa1\x34\x53\xa5\xad\x52\xcd\x8c\x92\xad\xa2\x6d\x9d\ \x96\x92\x0d\x0a\xce\xc9\x60\x30\x2d\xc3\xc1\x94\x0c\x08\x67\xe5\ \xd2\xf0\x69\x1b\x77\xa0\xe0\x8c\x5c\x1a\xde\x25\x9f\x8e\x69\x38\ \x2d\xc3\xc2\x29\x19\x18\x4e\x64\x21\x78\xa1\x69\x5a\x9f\x0d\xc7\ \xb2\x10\xbc\x0f\xd7\xd1\x1f\xf8\x27\xc3\xc3\x5f\x59\x02\xfc\x91\ \x65\xc0\x91\x2c\x05\x7e\xcb\x72\x60\xb5\x8d\x70\x5d\xe1\x79\x38\ \x33\x7b\x32\x60\xce\x10\x6a\x12\x7c\xd6\xe2\x8e\xa0\x30\xe7\x31\ \x45\xb8\x20\x3c\xe5\x18\x57\x9d\xd1\xb2\x20\x0c\x13\xc2\x08\x23\ \x8c\x30\xc2\x0d\x83\xd7\x1b\xd1\xba\x7c\xd8\x10\x6e\x82\x70\x5d\ \x60\xd7\x4f\xe7\xdd\xa1\xe0\xdb\x93\xca\x06\x82\x5d\x1a\x76\x80\ \x60\x12\x64\x5d\x0f\xee\xe7\x11\x33\x15\x69\xf2\x75\x23\x56\x3e\ \x13\x00\x36\xbd\x80\x91\x5b\x1d\x76\x58\x6e\xe0\x57\x87\x2d\x26\ \xfc\x00\x38\x63\xdb\xcd\xe7\x10\x1c\x9b\xcd\x84\x2f\xc2\xf0\x90\ \x0f\xeb\xc2\xf0\x00\x61\x84\x11\x46\x18\xe1\x2a\xf0\x0b\x46\xc4\ \x07\x3e\x39\x05\xdc\x1e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x07\xb4\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x07\x7b\x49\x44\x41\x54\x78\xda\xed\xdd\x7d\x4c\x13\x67\ \x1c\x07\x70\x1c\x8b\x3a\x33\x5f\xd8\x04\x24\x31\x53\xa3\x71\x2e\ \x5b\xf6\xcf\x66\x96\x6c\x33\x03\x7a\x52\x7b\x2d\x46\xc4\x52\xda\ \x6b\xa1\xe0\xc2\x86\xb6\x28\x16\x98\xd9\xd4\x41\x8b\x53\x37\x23\ \x4e\xcd\x74\xd9\x96\x6d\x2a\x2f\xbd\x82\xb4\xd1\x21\x2f\xc2\x61\ \x50\xa3\x8b\xba\x69\xa6\x6d\x25\x19\x99\x6e\x2e\xa1\x4c\x9d\x80\ \x82\x82\xb7\xe7\xa8\x45\xec\xe8\xdb\xbd\xb4\x77\xed\x3d\xc9\x37\ \xf7\x0f\xb4\x4f\x3e\x3c\xfc\x9e\xe7\xb9\x7b\x28\x51\x51\x7c\xf3\ \xbb\x95\x96\x96\x3e\x23\x30\x23\x32\x81\x59\x59\x2b\x30\xab\xae\ \x83\xeb\x60\xb2\x45\xd9\x0d\x99\x95\x67\x93\xcd\xc8\x27\x02\x8b\ \x3c\x9e\x57\x22\xd9\x04\x96\xac\xd7\x01\xe8\x25\x10\xdc\x4b\x7a\ \x01\x7c\x01\xaf\x15\x60\x5b\x7a\x44\xf5\x9e\x13\xcf\x2b\xee\x68\ \xc0\xa8\xfe\x8a\x57\xf3\xb3\x25\xd7\x29\xe6\x00\xb4\x1e\x7f\x71\ \x9f\x84\x1f\xc9\xfe\x95\x06\xb3\xb2\x3a\x70\x5c\x67\xb9\x48\xfc\ \x49\x3d\x8b\x17\xf4\xd2\x84\x75\xca\x04\x00\x35\x4c\x12\x98\xc8\ \xc7\xbc\xa2\xb7\xd1\x5b\xaf\x5a\x4d\x01\x17\x04\x39\xc3\x2b\x7a\ \xab\xbf\x66\xd5\x36\x2a\xc0\xc4\x12\x8e\x96\x8e\x5c\x55\x0a\x13\ \xac\x72\x78\xa3\x15\x81\xab\xae\x22\xf0\x21\xab\x42\xa4\xb1\xe5\ \x2e\x9f\xca\x75\x60\xa8\x5e\xb9\x97\xda\x08\x56\xde\xa7\xdc\x09\ \xab\x42\xbc\xd2\xaa\x80\xfb\x40\x70\xb7\xdc\xbc\x92\x09\xbf\xc5\ \x69\x60\x8b\x6a\x13\xc5\x12\xd1\x45\xa9\x03\xb6\x4c\xf8\x4d\x00\ \x39\x38\x0e\xae\x2b\x0e\x62\x74\x73\x16\xd8\xac\x12\x52\x03\x56\ \xd5\x50\x1b\xbd\x08\x7c\xcc\x0b\xae\x33\x72\xf1\x4e\xae\x02\x4b\ \x51\xe9\x44\x41\xad\xb2\x9f\x2c\x30\x28\x31\xe9\xa4\xdf\x1c\x8f\ \x8a\x9a\x00\x00\xef\xfb\x06\x86\x7f\xe5\x2a\x70\x92\x28\xa7\x4c\ \x50\x9c\x45\x76\x04\x5f\x24\xee\x5d\x90\x7e\xf3\x4e\x91\x68\x92\ \x4f\x5c\x67\xba\xb8\x8a\x9b\x0c\xab\xf1\x91\xec\x51\x05\x8a\x7b\ \x37\xe5\x88\xea\x35\x1a\x26\x38\xf8\x0f\x3f\x80\x9b\x38\x8d\x0b\ \x22\x58\xa1\xee\x17\x54\xa9\xce\xf9\x89\xeb\x00\x59\x42\x4b\x47\ \x6c\x0a\xb1\xde\x17\x70\xc5\x4a\xa9\x89\xcb\xb8\x20\x7d\x90\x44\ \x9d\x08\xea\x71\x34\x54\x8f\x68\x89\xb5\xad\x07\xd8\x61\xc8\x8c\ \x1c\x4c\xac\x43\x66\xd3\xd6\x99\xf3\x79\xa9\x53\xc0\x9a\xf7\x82\ \x27\xdc\x6a\x69\x1a\x2e\x00\x9d\x4c\x12\xa9\x37\x73\x19\xf7\x7f\ \x13\x9f\x45\xb9\xd4\xb9\x84\x43\xf6\x01\xd8\xad\x90\x05\xc9\x65\ \xec\x5e\x70\x27\x22\x9a\x66\x53\xc0\xdf\x8c\x5d\xae\x5d\x51\xc0\ \xfd\x15\xe9\xab\x06\x21\x38\xfb\xc9\xaf\x99\x38\x7b\x0b\xd7\x71\ \x43\xda\x08\x68\x6b\xa6\xf8\x6d\x3b\xb2\x6c\x71\x97\x3a\x71\x32\ \xb4\x2c\xf7\xdd\x64\x71\x76\xef\x53\xb5\x8c\xa5\xc8\xac\xc7\xf5\ \xb8\x50\xe7\x00\x32\x67\x71\xb9\x80\xcc\x79\x5c\x36\x23\x87\x0d\ \xae\x37\x64\x90\x4f\x79\xdc\x30\x43\x0e\x5b\x5c\x36\x20\x87\x3d\ \x6e\x28\x91\x23\x06\x37\x14\xc8\x11\x87\x1b\x4c\xe4\x88\xc5\x0d\ \x14\x59\xa4\x3d\x3c\x4d\xa2\x41\x65\x62\x8d\x71\x8f\x58\x8b\xd6\ \x49\xb4\x68\xab\xf3\x6a\xfa\x52\xac\x31\x49\x97\x97\x58\xa6\xf2\ \xb8\x24\x90\x45\xda\xba\xd9\xe2\x02\xf4\x5b\x80\x39\x08\x82\x7b\ \xc9\x80\x58\x83\x7e\x2d\x5c\x5f\x97\xc0\xe3\xfa\x89\x2c\xcc\xfa\ \xdc\x02\xe0\xee\xf9\x80\x75\x4f\x9f\x50\xb9\xa3\x9e\xc7\xf5\x81\ \x2c\x54\x6d\xc7\x03\x84\x7d\x2a\x29\xca\x6d\x3c\xae\x27\xe4\x14\ \xa5\x61\x80\x0a\xee\x28\xb2\xa2\x6c\x90\xc7\x75\x9f\xcc\x34\xc6\ \x77\xc4\x5a\xe3\x30\x1d\xc0\x60\x42\x1c\x4a\x5d\x57\xb3\x98\x57\ \x1d\xd3\x00\xcc\x69\x5a\x70\x47\x91\xd1\x93\xbc\xea\x28\xae\x11\ \xa2\x15\x77\x34\xa6\x25\xbc\x2e\x68\x70\x81\x69\x3f\x33\xc0\xc6\ \x0a\x5e\xd7\x59\x1e\xba\x98\x00\x06\x9b\x12\x5b\xc4\xe3\x4a\xa5\ \x68\x34\xc0\x18\x62\x66\x04\xa3\x83\x51\x51\xf8\x84\x88\x06\x26\ \x76\x60\x0c\xe1\x8e\x24\x6d\xed\x91\x17\x23\xbb\x3c\xe4\x57\xc6\ \x30\x09\x2c\x5d\x83\x3e\xcf\xd7\xe0\xc0\xb7\xc5\xfe\xe6\x0e\x3f\ \xc3\x39\x81\xcf\x33\x04\x7c\x9a\xd7\x75\x02\x6f\x61\x64\x15\xa1\ \x31\x95\xf0\xba\xc4\x3a\x78\x6d\xcd\x42\x06\x56\x12\x0f\x52\x35\ \xe8\x3c\x5e\xd7\x35\x8a\x9d\xf7\x7e\x69\x5c\x03\x9b\xf6\xf1\xaa\ \x6e\xcb\x35\x78\x6d\x55\x1f\x1d\xb8\xe0\x75\xfe\x15\x69\xd1\x58\ \x5e\x75\x4c\x23\x9e\x44\x40\x69\x85\xb8\x58\x53\x43\xf1\x26\x4f\ \x0d\x0e\xa5\xad\x67\xfd\xa9\xce\xa0\xe3\xba\x9e\x42\x40\xe9\x45\ \xc4\x08\x7c\x44\x6a\xe4\xae\xa9\x7c\x04\xa5\xeb\x38\x73\x74\x36\ \xe8\xb8\xae\x27\x11\x4b\xe5\x9b\x95\x00\xac\x23\x40\xe0\x36\xa1\ \xbc\x34\x83\x2b\x47\x67\x43\x86\x3b\xf6\x49\x84\x44\x6b\x4c\x05\ \x70\x8d\x5e\x1e\x7c\x0e\x48\xb4\x68\x83\xa4\xc0\x08\xbb\xbe\x87\ \x4b\xe7\x93\x43\x8a\x3b\xb6\x41\x79\xe8\x74\x61\xce\xbe\xf7\x53\ \x64\x9b\xf0\x14\x85\x1e\x27\xae\xc2\x9c\xbd\x39\xe3\x3d\xb2\xe7\ \x91\xa3\xc8\x3d\x5a\x4f\x12\x66\xbf\x3a\xf6\x7b\x92\x96\xe5\xbe\ \xec\xed\xeb\x23\x16\x99\xec\xb9\x85\x40\x81\x23\x12\x99\xca\xa1\ \x10\x32\xc0\x9e\x90\x43\x75\x3e\x99\xb5\xb8\x54\x80\x23\x02\x99\ \x8e\xe3\x4c\x54\x80\x47\x91\x61\xf5\xdd\xb0\x43\xa6\xeb\xac\x18\ \x55\xe0\xb0\x44\xa6\xf3\x20\x1e\x1d\xc0\x61\x85\x4c\xf7\x29\x47\ \xba\x80\xc3\x02\x99\x89\x23\xa4\x74\x02\x73\x1a\x99\xa9\xf3\xb9\ \x74\x03\x7b\x42\x16\xa6\xaa\xca\x1c\x4d\xf1\x12\x47\x73\x9c\xbe\ \xa7\x25\xd6\xd0\xdd\x14\xbb\xaa\xb3\x61\xc1\xa4\xb0\xc6\x65\x0a\ \xd8\x1d\x19\x41\xa4\xf8\x85\xea\xf9\x38\xc0\x75\xcf\xef\x3d\x27\ \x66\x2d\x0e\x5b\x5c\x26\x81\x5d\xc8\x2b\xd2\x15\xbd\xb6\xba\x97\ \xc6\xc3\x7d\x9c\xf8\x5b\x7f\x1f\x9f\x35\x37\x2c\x71\x99\x06\x26\ \xda\xc5\xca\xf9\x07\x3d\xe3\x3a\xd3\xdd\x1c\xf7\x43\x58\xe2\x06\ \x03\xd8\xd1\x14\x77\xc9\x0f\xe0\x9e\xb0\xc4\x0d\x0a\x70\x73\xdc\ \x4d\x5f\xc0\x20\x8f\x70\x2c\xea\xd9\xb0\xc3\x0d\x12\xf0\x59\x3f\ \x80\x6f\x90\x7e\x03\xa4\xf3\xf0\x34\x99\x0d\xcd\x97\xd9\x4c\x0d\ \x20\xd6\x0c\x9b\xe9\x26\xb8\xfe\x02\x72\x40\x6e\x43\x93\x43\x89\ \x1b\x9c\x12\x11\x5f\xe8\x13\xb8\x29\xee\x0b\x52\x2f\x9e\x69\x47\ \x55\x00\xb2\x1b\x04\xf7\x12\x4c\x6a\x43\xe7\x85\xea\xef\xd0\x98\ \x06\xee\xc2\xe6\x4e\x76\x34\xc7\xfe\xec\x05\xb8\xf3\xce\xb1\xe9\ \x31\x01\xbf\xb0\xcc\x56\x5b\xee\x03\x76\x34\x19\x97\x8d\xfd\x29\ \x79\xeb\x42\xf2\x77\x68\x4c\x03\x13\xed\x36\x36\x63\x06\x40\xae\ \x26\x6a\xad\xdb\xc8\x3d\xee\x68\x9c\x19\xf8\x67\x71\x66\xd8\x6a\ \x73\xfd\xc5\x75\x45\x7a\xee\x10\x0e\x65\xe4\x05\x15\xf7\xa3\xed\ \x2d\xd3\xf3\x4a\x8c\x3a\xe4\x83\xdd\x78\x96\xe6\x00\x4e\x5c\xf3\ \x8b\x6a\xd6\x97\xec\x38\xc5\xc8\x47\xe9\xde\x6e\x4d\x98\xd3\xdd\ \x12\x9b\xe1\x68\x89\x57\x38\x4e\xcc\x5c\x48\xea\x45\x14\x97\x2b\ \x63\x00\xd8\x3f\x81\x02\x13\x59\xfe\xe3\xae\x87\xc1\xc0\x25\x60\ \x75\x06\x6c\x27\xc8\x7d\x10\x7c\x9c\xdc\xdb\x60\xc0\xb6\x33\x05\ \x4d\xa9\x81\x49\xac\x84\x0c\xae\x33\xe8\x50\x9a\x95\xd9\x93\xe3\ \x85\xa5\xd8\x02\x9d\x1e\xb3\x7a\x80\x75\xcf\x6f\x45\x86\x93\xec\ \x3a\xe8\x97\x69\x33\x75\x90\x07\x06\xf5\xd8\x56\xab\x64\x0e\xb7\ \xf1\x05\x5d\x39\xd6\xe9\x27\xae\x33\xfa\x76\xfb\xc6\x6d\x1d\x31\ \xac\x01\x06\x48\x0e\x2a\xc0\xe0\x07\x64\x60\xaa\x6f\x00\xec\x70\ \x40\xb8\xae\x94\xb7\x7f\xc7\x26\xe0\x01\x2a\xc0\x32\x7b\xed\x5e\ \x46\x70\x3f\xc3\x16\xe9\x0c\x6d\xc3\xa4\x80\x0d\xd8\x50\xb1\xa1\ \x75\x3e\x5b\x6a\xf0\x0d\x6a\x25\xc2\xb4\x89\x89\x7e\x6d\x30\xb4\ \x6f\x26\x89\x3b\x92\x22\x43\x7b\x31\x5b\x80\x2d\x94\x4a\xc4\x35\ \x54\xcc\x50\x79\x38\x4a\x05\x18\x84\x1d\x1f\xab\xfb\x78\xf7\x46\ \x16\xf8\x96\xba\xeb\xfb\xc9\x0c\x01\x9f\xa5\x08\xdc\xc1\x0a\x60\ \x29\x8e\x46\x83\x5d\xdc\x55\x92\xcb\x34\xc6\x7e\x0d\x01\x50\x0b\ \x25\x60\x3d\x76\x8c\x35\x13\x9d\xd4\x8a\xbe\x01\xc0\xfa\x03\xc4\ \x3d\x25\xbd\x82\x4e\x64\x0c\xb8\x1c\xdb\x4f\x71\x04\xef\x66\xd5\ \x7a\x58\x66\x35\x49\x00\x5c\xaf\x9f\xc0\xa7\xe5\xf6\xaa\x99\x4c\ \xf6\xa7\x68\x6b\x9b\x98\xda\x24\x87\x41\xac\xdb\xd5\xc9\xae\xd5\ \xbc\x02\x26\xbd\xe3\x5e\x60\x7b\x65\x76\x74\x8b\xa8\xb3\x81\xf1\ \xa7\xab\x52\x14\x8d\x26\x76\x66\xe4\x80\xdb\x2f\x51\xfa\x17\x0b\ \x4c\x37\xb9\xbd\x76\x51\xa6\xd5\x54\x44\xdc\x03\xce\xb4\x9b\xaa\ \xc0\xb5\x02\x4c\x86\x32\xe2\x5e\x71\x30\xfb\x51\x64\x68\x4d\x06\ \x60\x0f\x03\x04\x7e\x50\xac\x6f\xe7\x3f\x80\xc3\xef\x5a\xac\xc7\ \x3e\x0c\x60\xc3\x31\x04\x4a\xc3\x6a\x5e\x2d\xe0\x4d\x07\x26\x01\ \x78\x7f\xfa\xc0\xbd\xae\x2b\x6b\x13\xf2\x5a\x24\x5b\x69\xe9\xd1\ \x29\x60\x77\x97\x0f\x56\x17\xcd\xa0\xc6\xfe\x05\x32\x38\x72\x2d\ \xc7\x1a\x75\xfa\xb6\xbc\xc2\x5d\x67\x9e\x63\x63\xbf\xff\x03\xf6\ \xa9\x78\xf8\x56\x89\x47\x54\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x0b\x00\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0a\xc7\x49\x44\x41\x54\x78\xda\xed\xdc\x7f\x50\x14\xd7\ \x1d\x00\x70\xda\x26\x4d\xa3\xcd\xa4\x9d\xe9\x74\xa6\x9d\x69\x92\ \xe9\xa4\x69\x3b\x93\xc9\x4c\x9b\x49\xd3\x3f\x3a\x1d\x3b\xb5\xca\ \xed\x82\xd8\xb4\x28\x7b\x07\xa8\xc4\x40\x8c\x1a\x1b\xc5\x31\x80\ \x20\x3f\x44\x40\x40\x11\x39\x10\x08\x22\xdc\x9d\x22\x22\x2a\x3f\ \x02\x27\x3f\x05\xe4\xe7\xdd\xe1\xa1\xf7\x03\x0e\x38\x38\x48\x6a\ \xdb\x34\x9d\x69\xda\xb4\x51\xcb\xeb\x7b\x7b\x07\xec\x1d\xbb\xb0\ \xc7\xed\xde\x2e\x71\x77\xe6\x0d\x83\x72\x77\xbb\x1f\x1e\xdf\xf7\ \x7d\x6f\xdf\x7e\x03\x02\xa4\x43\x3a\x96\x3b\x74\xba\xe2\x27\x1d\ \x3a\x75\x91\x43\xaf\x6e\xe1\xb2\xcd\xea\xd5\x4a\xf4\xde\x8f\x3d\ \xee\x8c\x5e\x5d\x0b\x1b\xe0\xa7\x69\x6a\x1e\x5b\x64\xfe\x71\x17\ \xda\xd5\xc7\x0e\xd9\x89\xab\xb9\xe6\x07\xdc\xc7\x0f\xd9\x64\xaa\ \xfe\xba\x9f\x71\xe7\x5b\x83\xcd\x96\xff\x94\x84\x2b\x21\xfb\x80\ \xab\x53\x5f\x17\x10\x57\xdc\xc8\x13\xa1\x1b\x9f\x1d\x95\x07\xfd\ \xc2\x4c\xc8\xb6\x5a\x08\x7c\xbf\x55\x2e\xcb\x34\x2b\x30\x95\x45\ \x8e\xdd\x84\xad\x05\x35\xb3\x1c\xef\x86\x5f\x75\x64\x23\x64\x1d\ \xb0\xd5\x9a\x09\xbc\xcc\xac\x08\x4a\x9b\x2c\x8c\x33\x4c\x5d\xcf\ \x05\x8e\x9e\x32\xf0\xd8\x23\x9b\x42\x37\x7c\x13\x62\x6d\x84\xed\ \x08\x44\xbc\x6c\x91\xe3\x36\x88\x36\x07\x1b\xe0\xa2\x59\xdf\xfa\ \x03\xb0\x25\xbc\x05\x26\x8a\xe2\xc0\x54\xfd\x69\x30\x33\x58\xb9\ \x6a\xac\xf1\xdb\xe7\xc1\x88\xf6\x2c\x18\xbc\x9e\x0d\xfa\xae\x66\ \x82\xde\x2b\x19\x60\xf0\x5a\x36\x18\xfe\x30\x0f\x8c\x76\x95\x02\ \x87\x5e\x45\xff\x5a\x83\xaa\xd1\x6f\xc8\x20\x34\xf4\x6b\xa3\x8a\ \xc0\xd7\xac\x04\x9e\x00\x01\x3a\x61\x7b\xc0\x15\x26\x2b\xf0\x9d\ \x21\xc0\x96\x1c\x03\x26\x2b\xd3\x80\xe3\x36\xbb\x1e\x6e\xeb\xfe\ \x00\x82\x66\x81\x0e\x55\xf2\xb2\xad\xbb\xea\x38\xb8\xd7\xaa\x84\ \xd0\x7e\x46\x06\x01\x01\x5f\x19\x25\x02\x7f\x65\x55\x60\x4a\x78\ \x91\x7f\x65\x87\x81\x7f\x06\xbf\x9a\x60\xd3\xc2\x56\x6e\x51\xc8\ \x52\x60\xa8\xd8\x03\xff\x3d\x1a\x35\x33\x81\xed\xb6\xca\xf1\x50\ \xb3\x42\xb6\xdd\x1c\x11\xb4\x77\x3c\xf7\x90\x69\x22\xf7\x20\xc4\ \x7b\x1b\x8c\x1e\x8c\x00\x96\x5d\x5b\x57\xfe\x8c\x88\x20\x12\xdb\ \x7e\x25\x0b\x38\x86\x96\xf6\x6c\x04\x75\xa7\xe9\xcc\x8a\xb0\x9e\ \x0d\xf5\xee\xa9\x81\x0a\xfe\x91\x4d\xe1\x9b\x5f\xb4\x12\x58\x96\ \x55\x8e\x39\x96\xed\x55\x72\xec\x1f\x28\xbe\xa2\x58\x8b\xd0\xc6\ \xe4\xf8\x0f\xbd\x19\xd0\xe0\x54\xf5\x06\x5d\xcf\x9b\xee\x28\x06\ \xf6\xea\x4c\x30\x91\x77\x18\x8c\xc5\xee\x20\x41\x19\xcf\x21\xe6\ \x8f\x60\xf2\x5c\x02\x98\xe9\x3d\xef\xc2\x55\x91\x7f\xfe\xde\xe2\ \xce\xb7\x9e\xcb\xe9\xfc\x20\xa3\x10\x00\xc1\x42\x2c\x72\x59\x33\ \x3c\xf1\xff\x31\x5c\xd0\x43\xd8\x7a\xe0\x00\x96\x04\x7b\xe0\x2f\ \xd1\x6b\x56\x9b\x2d\x40\x88\x3a\xb6\x31\xd4\xd1\x7f\x01\xd8\xab\ \x32\x80\x2d\x7d\x1f\xb0\x46\xd1\xf7\x70\xeb\x8e\x2d\x60\xfc\xd4\ \x21\x30\x5c\x7b\x72\xd5\xb8\xd4\x9e\xec\x18\xa2\x8d\xcb\x1f\x7a\ \x8d\x6c\x93\xc9\x9e\x22\xff\x74\xe5\xd8\x38\x03\xea\x23\xd8\x3b\ \x5b\xe1\x60\xf6\xe6\x88\x1c\xff\x36\x17\xa9\x98\x37\xb8\x4b\x1a\ \x1c\xec\x48\xec\xc4\x68\x60\x0d\x5f\xda\xb3\x4d\x91\xc1\x60\x28\ \x29\x1a\x74\x96\x27\xfa\x84\x8c\x06\x45\x86\x73\x60\x87\xac\x8b\ \x7e\xf5\x49\x94\x4a\xc1\x1e\xfb\x11\x03\xac\x15\xa2\xbf\x67\x0e\ \xdf\xfc\x3d\xae\x42\x8f\xbd\xa3\xfc\x1b\xe8\x04\xb9\x4a\xa5\xa6\ \x3b\x4b\x60\xaf\x3d\x08\x2c\x70\x00\xf4\x3c\xff\x7b\x51\x21\xa0\ \xef\xe4\x7e\xf7\x3f\xff\xea\xf4\xcf\x61\x26\x61\x18\xba\x91\xd3\ \xdf\x57\x93\xf9\x49\x87\x9a\x19\xf8\x96\x26\x85\x3e\x54\x38\xc3\ \x50\x1d\xea\x28\x8c\x17\x0a\x7b\xec\x1b\xf0\x24\xc6\xe8\x7a\x2b\ \x6c\x35\x26\x45\xe0\x6f\xd1\x00\xc7\xe5\x80\xe9\xc2\x6d\xe2\x25\ \x67\xed\x2b\x07\xa3\x79\xb1\x64\xef\xf5\xbc\x26\xe3\xbb\x04\xe8\ \x2e\x89\x03\xc3\x75\x79\xa7\x3c\xcf\xc9\xd8\x98\x4f\xf4\x54\xa5\ \x3f\x60\x42\xbe\xdb\x52\xc0\x1c\xb6\xe8\x90\x4d\x61\xd8\xeb\x64\ \x0c\x5d\x0a\xfb\x05\x8c\xbf\xa5\x68\x70\xe3\x23\x1b\x71\xe1\x36\ \xf3\x39\x31\x40\x59\xc3\xad\xb2\xa3\x40\x1f\x1f\x05\x2c\x0a\x8f\ \xd0\x11\x8e\x3f\xb0\x10\x58\x0c\x5d\xa7\xb9\xd3\xa0\xfc\x4d\xa7\ \x3a\x85\x16\x78\xa0\x36\x6b\xa5\xcf\xad\x07\x1d\x1d\x4f\x04\x58\ \xa3\xb6\x3c\xe3\x4a\xb5\x3c\x07\x2f\xf4\xfd\xf9\xbb\x61\x9b\x7e\ \xc0\x57\xfe\xec\x0f\x5c\xd4\xa8\x99\x43\x77\xd1\x11\x60\xdc\x17\ \x46\x17\xf6\xea\xc7\x23\x36\x7d\xd7\xf3\x1c\x51\xd8\xa0\x0d\x13\ \x17\x53\x57\x1e\x80\x0d\x97\xbe\x1f\xe0\x9a\x18\x78\x7e\x98\xd6\ \x4a\x04\xbe\xc2\xe7\xe4\x64\xa6\xb7\xfa\x69\x78\x12\x5a\x7f\x4c\ \x6d\xd1\xec\xcc\x0d\xa8\xf2\x18\xe8\xcf\xdc\x07\xcc\x91\xc1\x8f\ \xdc\xae\x9b\xc0\x66\x61\x88\x7c\x95\x7a\x9e\x86\xfa\xbc\x34\xa6\ \x30\xe1\xd0\xa9\x58\x01\xff\x9d\xf2\x21\x30\xf6\xe2\x9b\xf9\x9e\ \xf9\xf9\x13\x17\xb5\xdb\xd5\x27\x68\x81\x74\xea\xb4\x01\x9a\x0e\ \xf6\x6f\x98\xe7\x6f\x5b\x00\x6e\xc8\x3b\xc2\x04\x3c\xbd\xc2\x14\ \x9d\x04\x46\x6f\x06\xdf\xb4\x0f\xa6\x5b\xa9\x33\xa1\xa1\x4f\xfb\ \x03\x77\xd6\xa0\xb9\xe9\xcf\xc5\x99\xfe\xda\x2c\x86\x9c\x36\xe3\ \x3e\x48\x4e\xfe\x2a\xcc\x96\xe2\x3d\x42\xe4\x1c\x9a\x65\xa2\xb8\ \x3c\x54\x97\xdb\xc8\x94\x49\xb0\x0a\x11\xfe\x3c\x10\x2e\xba\xa1\ \xe8\xef\xd5\x2f\x43\xc3\x69\x86\x94\x2b\x05\x0c\x37\xe7\xe3\x64\ \xf6\x44\xc8\x82\x21\xec\x3f\xdd\x26\x28\x91\xc1\x97\xbb\xab\x8e\ \x3f\xa4\x7b\x6d\xef\x95\x13\xe2\x02\x16\x0a\x17\xb5\xd1\x5b\x25\ \xcc\xd3\xdf\xaa\xf4\x2f\x8c\x8d\x05\xaf\xa3\x73\x34\x47\xe0\x2f\ \x43\xd8\x49\x27\xb0\xec\x3f\x86\xfc\xd8\x4f\x99\x5e\x87\x32\x13\ \xd1\x00\x7f\xac\x2b\x5e\x07\x3f\xb0\x55\xa8\xf5\x5b\x34\xb5\xed\ \xba\x94\xc6\x88\xdc\xa5\x49\x9d\x1b\xb8\x9e\xd3\xa7\x6f\xc8\x8b\ \x37\x5e\xcc\x88\x1b\x49\x8a\xb1\xf6\x96\x25\x3e\x64\x9c\xcd\xc1\ \x49\xc8\x84\x6b\x7d\x43\x70\x60\xa1\x71\xe7\xdb\xbd\x16\xa5\xcf\ \xeb\x10\x0b\x83\x63\x7d\x2e\xbb\x5f\x2c\xdf\xc0\x62\xc1\x25\x9b\ \x0e\x0e\x76\x57\x33\x7d\xc6\xed\x86\x7f\x09\xf6\xfe\x0b\xc2\x03\ \x8b\x0a\xd7\xd5\xa6\x06\x2b\x60\xcc\x3d\xbe\x6a\xdc\x4e\x4d\x32\ \xb0\x75\x97\xb2\x0f\x4d\x7c\x01\x3b\x71\x35\x6d\x62\xc2\x9d\x6f\ \xf6\xfe\x0a\xd0\x5b\x93\xe1\x35\x6e\xd7\xc5\x34\x30\xe6\x05\x2e\ \x6f\xc0\x62\xc6\x5d\x58\x69\x83\x83\x1e\xb9\x3e\xa1\x49\x61\x85\ \x3b\x54\x97\xc3\x3a\x2c\xf0\x0a\xbc\x16\x70\xdd\x7a\xf3\xc0\x05\ \x72\x6d\x17\xc5\x66\x2a\x36\x5a\xe0\x41\xb3\x3f\xf4\x4b\x40\x37\ \x45\x57\x9d\xbd\x70\x09\xec\x8a\xb9\xed\x6b\x05\x97\xbe\x67\x57\ \x92\x71\x9a\xb3\xf4\x90\x2b\xe0\x2f\x03\x2e\x2f\xf9\x37\x17\xc0\ \x12\x2e\x8f\xc0\xf7\x8d\x95\xeb\x25\x5c\x9e\x80\x49\x5c\x83\xba\ \x43\x82\xe4\x01\x58\xc2\xe5\x11\x58\xc2\xe5\x11\xf8\x6f\x3d\x65\ \xcf\x38\x0c\xea\x1e\x09\x8f\x07\x60\x9d\xae\xf8\x59\x87\x41\x23\ \xe1\xb2\xc5\xd5\xab\x4e\xb1\xc7\xad\x2f\x5e\x37\xd4\xac\x6c\x37\ \xb6\x9d\x1b\x90\xf0\x38\xc6\x35\x6a\xb3\xd7\x23\x5c\xd8\x00\x6a\ \x12\xf2\xf2\x6d\x22\xf3\xc0\x2d\xcf\x3b\xd3\x2b\xe0\x16\x76\xcc\ \xe3\x8a\x09\x79\xba\x31\x1f\x4c\x9c\x8e\x85\x5f\xcf\x88\x06\x77\ \x3c\x7d\xef\xfc\xc6\x1d\xed\xaa\x71\x45\x81\x3c\x50\x01\xac\x51\ \xbf\x77\xde\x98\xdc\x15\xe2\xd3\x0e\x77\xce\xd6\x9a\x6b\xb2\x2b\ \xdd\xee\x4a\x6f\xc7\x5e\x5a\x35\xae\xd0\xc8\x53\xf5\x79\x8b\x77\ \x7e\xc3\x83\x04\x07\x9e\x35\xa8\x73\xd0\x2d\x7e\x0b\x81\xdd\xa5\ \x6c\x62\x39\xe1\x13\xae\x90\xc8\x93\x25\x09\x0b\xc0\x63\x7f\x52\ \x08\x8e\xbb\xb0\x71\x92\xc0\x0e\x52\x7a\xf1\x08\x3d\xae\x56\xd9\ \xc9\x16\x97\x82\xac\xf7\xe7\x45\xa1\x47\x0a\xe6\x2f\x64\x3c\x63\ \xbf\x80\xc0\xaa\x6c\xaa\x1f\xda\xce\x4b\x7d\xd8\xc7\x14\x19\xfc\ \x9c\xcf\xb8\x42\x20\x8f\xee\xdd\xbe\x00\x3c\x59\x9e\x2c\x0a\xdc\ \xc5\xed\xbf\xe4\x33\x28\xce\xf0\x45\x60\xbb\x38\xc1\xf5\x2b\xf2\ \x50\xa5\xdb\xee\xf5\xa9\xa6\xb3\x42\x00\x9f\x64\x1a\xbf\x5c\x3b\ \x55\xe7\xcf\xaf\xc0\xb9\xc1\xad\xb1\xe0\x79\x08\x34\xe5\x2b\x30\ \x6a\x23\x6d\x45\x83\xbc\xa6\x67\xad\x85\x6e\x3b\x41\x1d\xbd\xe5\ \xa2\xc1\x75\x01\xbf\x4d\x39\xbf\xb6\xc5\xd9\x5a\x4b\xf1\x73\x10\ \x68\x92\x1b\xe4\x62\xde\x7a\xb2\xbd\x36\x87\xf2\xc8\x56\xb0\xbf\ \x71\xb3\x56\x4a\x6f\xcd\x61\x38\x4e\x79\x6c\xcd\xe6\x3e\x25\x5e\ \x03\xc8\x76\x4d\xfa\x62\x8a\xb6\x67\x9b\xa8\x70\xc9\x1e\x4c\x04\ \xbe\x42\x7d\x94\x6d\xc9\x0f\xb8\xc2\x85\x68\x91\x27\xcb\x8e\x2d\ \xa6\x68\x87\x22\x44\x85\x8b\x0e\xf4\x44\x00\x25\x44\xfc\x97\xf6\ \x87\x38\x45\x6e\xe7\x16\x79\xa2\xe4\xe8\x22\xf0\xe1\x1d\x7e\xd8\ \x72\xa5\xca\xf4\x66\x49\xd7\x12\x16\xf8\xc2\x8a\xc0\x62\x46\x9e\ \x28\x5d\x04\x46\x8f\xd7\x8a\x09\xd7\x99\x0b\x07\xff\x9c\x02\xfc\ \x97\x65\x7f\x18\x21\xeb\x9a\x95\x76\x31\x21\x4f\x96\x25\x2d\x02\ \xef\x27\x44\x85\xeb\x39\xc8\x99\x15\x98\x79\xc5\x17\x88\x0d\xd9\ \x7e\x91\x32\xc8\xbd\xb3\x9d\xaf\x6a\x53\xc7\x56\x7b\x33\x18\x95\ \x70\xa0\x0c\x72\xd7\x58\xbd\x88\x4b\x64\x38\x19\x31\xf8\xb4\xd0\ \x73\xe3\x14\xe5\x19\xb7\x20\x72\x65\x4d\x2c\xb8\xce\xf5\x08\xfc\ \x0a\x25\x4d\x4b\x67\xfd\x42\xb1\x20\x4f\x77\x16\xbb\x4d\x34\xa6\ \x9a\xf2\xb9\xdc\x43\x9c\xe4\x0b\x2e\xf9\x08\xb2\x1c\xfb\x94\x32\ \x55\x0e\xf4\xea\x0d\xfa\x9a\x8a\x5e\x10\x03\x32\xf5\xa9\x7a\x7b\ \x45\xaa\x28\x70\x5d\xe1\x61\x23\x35\x83\x30\x46\x6c\x5a\xef\xf5\ \x9b\x88\x01\x19\x95\x93\xe1\x72\x35\xcd\xa1\x53\x25\x72\xb1\x47\ \x0f\x9e\x4f\xf5\x02\xb0\x02\x6b\x58\xf5\x1b\x71\x89\x0c\x27\x23\ \x5e\x23\x4f\x96\x2e\x66\x12\xd6\xdd\x6f\xa0\x11\x5f\x70\x5c\xb3\ \x1c\x7b\xde\x55\x33\x63\x7e\x80\x0b\xf1\xe9\x0d\xf5\xcd\xca\x17\ \x75\x5a\xe5\xac\x10\xc8\xa8\xea\x09\xec\x21\x8b\x61\xe2\x72\xa6\ \xa0\xb8\xae\xde\x5b\x41\x09\x0f\x33\x1d\x1b\x36\x3c\xe1\xf3\x9b\ \xf6\xdf\x3c\xf7\x23\xa1\x90\xc7\xe2\xdf\xa4\xcc\xe8\x22\x57\xb1\ \x29\x44\x73\x94\x2b\x5c\x54\xae\xcc\xbd\xaa\x16\x1e\xcd\xd9\xc6\ \x6b\xa1\x90\xa7\xae\x66\xbb\x65\x13\xf6\x4b\x19\x82\xe0\xa2\xc7\ \x8f\xdd\xee\xc5\xc9\x31\x0b\x27\xbd\x97\x2f\x64\x63\x6b\xf1\x30\ \xeb\x5e\x8c\x8a\x22\x51\x6a\xa9\x39\x58\x6c\xf7\x77\xe8\xd5\x09\ \x5c\x5e\x3b\xcc\x1c\x0a\xdd\xee\x26\xf3\xf5\x30\xbd\x10\xc8\xe8\ \x6e\x06\xf5\xee\xc6\x58\x5c\x14\x6d\x29\x2f\xde\x70\x09\x6c\xb7\ \xdb\x93\xfa\x0a\x59\x3e\xaf\x0f\x1e\x0a\x81\x8c\xaa\xff\x51\x2f\ \xd2\x96\xfa\x0e\x2d\xf2\xac\x5e\x15\xcf\xe5\xb5\x5a\xc3\xf1\x2d\ \xd4\xac\x01\x85\x09\x7f\x54\x2b\xf0\x3f\x32\x4c\xd1\x10\xaa\x1b\ \xf2\xd1\xdd\x6e\xb7\x92\x38\xc7\x75\x96\x80\xf8\x9c\xf2\x99\xf7\ \xbd\xa9\x0b\xc7\x09\x32\x04\xfa\x88\x13\xe4\x76\x16\xc8\x83\x15\ \x60\xf4\xf0\x4e\xf7\x5a\x69\x7b\xb6\x91\xb7\x97\x66\x75\xea\x38\ \x4e\x07\x34\xb9\x2c\xdb\x23\x63\xf8\x8c\xf5\x5e\x34\x2e\x8f\x81\ \xc6\x82\x97\xfc\x8a\x3c\x50\x01\x6c\xc7\x62\x3c\x4b\xe3\xcc\xa1\ \x15\x2d\x53\x98\xec\x67\x3e\xaf\x31\x10\x58\x8c\xb3\xe4\x8c\xdb\ \xfb\xff\x0b\xc6\xe1\xdf\x05\x08\x75\xf8\x1d\x59\x07\x63\xf2\x99\ \xc3\x70\xb0\xc1\xe9\x8a\x1e\xf5\xc1\x9e\x16\x8b\x16\xc4\x51\x95\ \x93\x95\x51\x83\xd7\x91\x6b\x0b\x04\x5e\x02\x7b\xed\x27\x34\xa5\ \x23\x1d\x82\xf4\x5c\x3e\x91\xef\xb6\xb3\xcc\x2e\xd4\x69\x05\x10\ \xc1\xc8\x5c\x5b\x13\x82\xa1\xfa\xc4\x72\x5c\x0d\xbf\xcf\x35\xcb\ \x65\x89\x64\x3d\x63\x98\x72\x41\xb8\x2a\x54\x78\xcf\x55\x27\x8e\ \xee\xf5\x28\x3c\x94\x0f\xef\xdc\xfa\xad\x00\xb1\x1c\x7e\x45\xd6\ \xa9\xdf\x47\x9f\xe9\xac\xc5\x43\x16\xd9\x1b\xe4\xa8\x8c\xee\x23\ \x2e\xc2\xcd\x5a\x46\x9e\x83\x19\xc5\x01\xda\xa9\xac\x22\xf0\x35\ \xb4\xdb\x11\xdd\xc2\xf1\x16\x15\xf6\xf6\x5e\x8b\x02\x8b\x73\xdb\ \x67\x26\xd6\x83\x47\x64\x46\xdc\x25\xd8\x44\xf0\x77\x50\x79\x48\ \x54\x7b\x93\xcc\x08\xc8\x18\x4b\x2e\x33\x56\xa3\x72\xe6\xce\x72\ \xbc\xb2\x3d\xf0\xff\x7f\x8d\x2a\x79\x07\xac\xb5\x63\xa8\xa9\xf0\ \xc7\x5c\x21\x8f\xb4\x9d\xbb\xe3\xc4\xd5\xbc\x1b\x20\x1d\x94\xa5\ \xce\x16\xe5\x4f\x21\xd0\x7d\x2e\x90\xef\x75\x7d\xf0\x9e\x24\xca\ \xdc\x93\x3f\xf6\x0d\xb8\x20\x5e\x92\xe4\x09\x79\xb0\xa9\x30\x4e\ \x12\xe4\x09\x59\xc2\xe5\x11\x59\xa7\x55\xbe\x2f\x89\xf1\x84\x2c\ \xe1\xfa\x78\xe8\xb4\x67\x7f\xc2\x80\x3c\x37\xd8\xac\x3c\x20\x09\ \xf1\x83\x2c\xe1\xf2\x84\xfc\x67\x09\x97\xcf\x98\xac\x2d\x7a\x79\ \x48\x5b\x18\x2d\x49\x48\xc7\xb2\xc7\xff\x01\x23\x1b\xfa\x8b\x45\ \x03\x11\x66\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x68\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\xef\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x55\x55\xff\x40\x40\xff\x66\x66\xff\x55\x55\xff\x49\x49\ \xff\x60\x60\xff\x55\x55\xff\x4d\x4d\xff\x5d\x5d\xff\x55\x55\xff\ \x5b\x5b\xff\x55\x55\xff\x50\x50\xff\x5a\x5a\xff\x55\x55\xff\x59\ \x59\xff\x55\x55\xff\x51\x51\xff\x55\x55\xff\x58\x58\xff\x58\x58\ \xff\x55\x55\xff\x52\x52\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\ \x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x55\x55\xff\x53\ \x53\xff\x55\x55\xff\x53\x53\xff\x55\x55\xff\x57\x57\xff\x55\x55\ \xff\x55\x55\xff\x57\x57\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x55\x55\xff\x54\x54\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\ \x55\x55\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x54\x54\xff\x55\x55\xff\x56\x56\xff\x55\x55\ \xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\ \x55\x55\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x54\x54\ \xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x56\x56\xff\x55\x55\xff\ \x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\ \x56\xff\x55\x55\xff\x54\x54\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\ \x55\x55\xff\x54\x54\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x55\x55\x5c\x98\xcd\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\x47\xa0\xdc\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\x48\xa0\xdc\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\x53\x9c\xd4\x47\xa0\xdd\x48\x9f\xdb\x4a\x9f\ \xdb\x4b\x9e\xda\x4c\x9f\xda\x4d\x9d\xd8\x64\x95\xc8\x6d\x91\xc1\ \x48\xa0\xdc\x48\xa0\xdc\x4a\xa1\xdc\x53\xa6\xde\x5a\xa9\xdf\x5e\ \xac\xe0\x6d\xb3\xe3\x80\xbd\xe7\xd2\xe8\xf6\xd3\xe8\xf7\xda\xec\ \xf8\xdb\xec\xf8\xeb\xf5\xfb\x3e\xa9\x12\xf1\x00\x00\x00\x99\x74\ \x52\x4e\x53\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\ \x0e\x0f\x10\x11\x12\x14\x15\x16\x18\x1a\x1d\x1e\x1f\x21\x22\x23\ \x25\x26\x27\x28\x2a\x2b\x2d\x2e\x30\x32\x33\x36\x38\x3b\x3c\x3d\ \x3f\x40\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4d\x4f\x50\x51\x53\ \x54\x56\x57\x59\x5a\x5b\x5c\x5e\x60\x62\x63\x68\x69\x6b\x6d\x6e\ \x6f\x71\x72\x74\x75\x76\x77\x78\x79\x7a\x7c\x7d\x7f\x80\x83\x84\ \x86\x88\x8c\x8d\x8e\x8f\x90\x91\x94\x95\x96\x98\x9a\x9b\x9c\x9d\ \x9f\xa0\xa3\xa4\xa5\xa6\xa9\xaa\xac\xad\xae\xb0\xb2\xb4\xb5\xb6\ \xb6\xb7\xba\xbb\xbc\xbd\xbe\xbf\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\ \xc7\xca\xcb\xcf\xd0\xd2\xd3\xd4\xd6\xe2\xef\xf5\x6c\x87\xce\x03\ \x00\x00\x01\x8f\x49\x44\x41\x54\x18\xd3\x65\xd1\x05\x4f\x82\x51\ \x14\x06\xe0\x97\xd2\x0f\xc4\xc0\x0e\x0c\x14\x6c\x0c\xec\x40\xc1\ \xc0\x44\x51\xb1\x30\xb0\xbb\xbb\x51\x52\xec\x44\x3f\x31\xd1\x1f\ \xea\x15\xd4\xb9\xf9\x6e\x67\xf7\xee\xd9\xd9\x3d\x67\xbb\x80\x3b\ \x94\x72\xd9\x62\x32\x1d\x2e\xc9\xbd\xf0\x27\x35\x27\xea\xf0\xaf\ \x33\xbc\xed\xb8\xe8\x0f\x2b\x28\xae\x7c\x6a\x6b\x77\x28\x15\xfc\ \x49\x3d\xc3\x63\xbe\x46\x5f\x28\x4f\x35\x71\x5c\x2a\x65\x7c\x4f\ \x08\xad\xde\xc3\xf3\x05\xe8\x1b\xf3\x86\xb8\xa3\x29\x93\x29\x3a\ \xcd\xc0\xa4\xfb\x9d\xf4\x19\xd4\x0c\x22\x3b\x26\x3a\xab\xb0\xc7\ \x9e\x12\x72\x26\xf6\x39\xe1\x10\x5e\x15\x06\xd8\x39\xb9\x5b\xdc\ \xaf\x16\xc1\x7e\x5a\x98\x8d\xd5\x5a\x46\x56\xb3\xa0\xa1\x8a\x7d\ \xc4\x63\xb7\x5b\xac\x8d\x8c\x40\x3b\xa7\xab\x24\x6a\x01\x48\x1a\ \xc0\xa6\x5f\x7e\x27\x7a\x34\x0c\x56\x5f\x13\x74\x32\xe1\x2c\xec\ \x40\x91\x1a\x26\x68\x73\x60\x43\xb0\x3f\xeb\x08\xc9\xc3\xe4\xb6\ \xcd\x43\x79\x1d\x61\x5d\x3a\x8c\x50\x34\x60\x3a\x96\x63\x80\x81\ \x35\x2a\x82\x4c\x83\x6d\x7e\x75\x15\x0e\x19\x92\x09\xd4\xcb\x61\ \xc5\x62\x48\x73\x21\xe2\xc7\xd1\x2b\x4d\xd6\x63\x33\x94\x3a\x80\ \x4c\x4b\x78\x44\x1c\x28\x00\xdb\x80\x12\x35\x65\xc0\x44\x02\x91\ \x75\x87\xf9\xce\xec\x38\x37\xef\x00\xbb\x3c\xa9\x8e\x48\xb7\x14\ \x16\xdc\xd2\x9e\xdc\x03\x91\xcc\x44\x3d\x0e\xd8\x2d\x79\x30\x31\ \xaf\x68\xda\xf9\xf6\xe4\x66\x40\x32\x88\x95\xa0\xc6\x62\x6c\xf8\ \x5d\x10\xfd\x78\x7f\xf2\xb0\x78\x18\x73\x11\xb5\x65\x58\x0b\xb8\ \x7c\x78\x7d\x71\x3d\xbf\x3b\xdd\x1c\xdd\x8f\x31\x91\xaa\x92\xf0\ \x0d\xfd\x48\xbb\x48\xdd\x7f\xff\x43\x3c\xaf\x42\x45\xf8\x9a\x8c\ \x73\xd1\xf4\x2f\x03\xa5\xb5\x84\xaf\xfe\xb1\x8f\x00\x33\xfc\x8b\ \x1f\xfe\x04\x01\xed\x75\xe0\x72\x66\x99\xac\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x03\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x01\xca\x49\x44\x41\x54\x38\x8d\xd5\x94\xcf\x6b\x13\x51\ \x14\x85\xbf\xf3\x32\x69\x16\x1a\xb4\xc8\x44\x11\x5c\x8c\xae\xec\ \x42\x5c\xb9\x95\x5a\xa8\x0d\x6e\x04\x57\x22\x2e\x92\xba\x6e\xff\ \x16\x4b\x57\x6a\x40\x70\x23\x64\x25\x82\x6d\x05\xc1\x82\xee\x05\ \x05\xc5\x1f\x13\x37\xa2\x26\x6a\x91\x8a\x5a\x3b\x79\xd7\xc5\xc4\ \x42\xd3\x64\x88\x23\x22\x1e\x78\x30\xbc\x7b\xef\xf7\xee\x9c\x79\ \x73\x45\x0e\xbd\xad\x55\xc3\xa2\xf3\x91\xf7\x2e\x42\x16\x19\x44\ \x32\x45\xc8\x22\x60\x5f\xb8\x5e\x0e\x95\x05\x78\x77\x71\x7a\x97\ \x2b\x16\xea\x18\x47\x4c\x16\x09\x22\xd2\xb5\x3b\xab\x2e\x0c\x3a\ \x63\x41\x56\x42\x50\x70\x13\x1e\x5b\x40\x90\xd9\xc1\x00\xb9\xdf\ \xcc\xff\xa7\x60\x03\xc8\xb4\x62\x88\x36\x80\x37\x82\xd8\x43\x2c\ \x29\x06\x8b\x25\x1f\x17\x9c\x7f\x99\x6c\x06\xcb\xa3\x82\x1f\x4a\ \x2c\x76\xbd\x6b\x91\x24\xad\x03\x37\xee\xb6\xb3\x92\xdb\xb5\x19\ \x46\x02\x0b\x3d\x0e\x1b\x4b\x37\x47\x68\x60\x9b\xfe\xab\x8f\xf7\ \x77\xc1\x79\x6e\x05\x00\x06\x6a\xd7\x66\x2e\x48\x9c\x31\xa8\x00\ \x8f\x8a\x41\x72\x39\xd9\xfc\x03\xb0\x81\x3a\xf5\x6a\x53\xd8\x39\ \xd8\xfa\x2b\x4f\x25\x49\xa1\x8e\xf8\x9e\x1b\xfc\x61\xf6\xf4\x79\ \x2c\x85\x6e\x97\xf6\xfe\x7a\xca\xe5\xb1\x79\x77\x22\x2b\xcc\xda\ \x61\xbf\xd5\xf1\xfb\x4b\x53\xfb\xe5\xc7\xe6\x90\x1d\x97\xd9\x0f\ \x43\xb7\x12\xa7\x67\x05\x3f\xb0\x36\xce\x00\xbf\x50\xb3\xd9\x0d\ \x00\x3e\xd6\xaa\x13\x5d\x6f\x0f\xc0\xc6\x31\xb0\xd4\xb5\xb3\xce\ \xfb\xa7\xe0\x56\xfb\x2b\x37\xbe\x94\xaf\x96\xca\xeb\xb3\xc0\xb1\ \xbe\x90\x47\x36\x0f\x3d\x2b\xba\xb2\x6b\xc0\xf8\xce\xc3\x75\x74\ \x50\x4b\x87\x9a\xcd\x6f\x25\xd9\x24\xb0\x80\x78\x05\xac\x09\xee\ \x21\x37\x59\x69\xac\xa4\xb3\xc2\x40\x1d\x18\xea\x99\x19\xc9\xa0\ \xfd\x3d\x8d\x95\x4f\xc0\x7c\x6f\xed\x90\x53\xfa\xe6\xaf\x87\x81\ \x11\xcf\x87\xc6\x32\x94\xde\x8a\x2e\x73\xf4\xe6\x68\x1f\xf5\x49\ \x12\x04\x8d\xdc\xe0\xca\xf5\xe5\x3b\xc2\xa6\x30\xee\x03\x9f\x81\ \x16\xa6\xc5\x92\xfc\xc9\x83\x57\x6e\x7f\xcd\x03\xfe\x09\x1b\x84\ \x97\x6d\x27\x57\xc5\x15\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x03\xc3\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\xbc\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xff\ \xff\x99\x00\x99\x6d\x92\xb6\x80\x80\xbf\x71\x8e\xc6\x8e\x00\x8e\ \x70\x80\xbf\x78\x87\xc3\x71\x80\xb8\x80\x00\x80\x76\x80\xba\x71\ \x84\xbd\x82\x00\x82\x76\x86\xbf\x78\x87\xbf\x76\x87\xc1\x77\x88\ \xc1\x78\x89\xc2\x80\x00\x80\x79\x8a\xc2\x81\x00\x81\x7d\x8e\xc4\ \x7e\x89\xc0\x7d\x8c\xc4\x80\x91\xc6\xe8\xeb\xed\xe8\xeb\xed\x7e\ \x78\xbc\x7f\x8e\xc5\x80\x92\xc7\xe6\xec\xed\x80\x91\xc7\x80\x00\ \x80\x80\x02\x81\x7d\x8f\xc3\x7e\x8f\xc4\x7f\x8e\xc3\x7f\x8e\xc5\ \x7e\x8f\xc5\x7d\x8d\xc4\x7e\x8e\xc3\x80\x91\xc5\x7e\x8f\xc4\x82\ \x94\xc7\x81\x93\xc6\x82\x93\xc6\x80\x90\xc7\x81\x91\xc7\x81\x93\ \xc6\x82\x93\xc6\x80\x90\xc6\x81\x90\xc6\x82\x92\xc5\x81\x93\xc6\ \x82\x93\xc6\x82\x7d\xbc\x80\x01\x81\x80\x91\xc8\x81\x92\xc8\x80\ \x00\x80\xe7\xec\xed\xe7\xec\xed\xa7\xba\xd7\xa7\xbb\xd8\xa8\xbb\ \xd8\xa9\xbd\xd8\xa7\xbb\xd7\xa8\xbb\xd7\xa8\xbc\xd8\x9a\x81\xbd\ \x8f\x49\xa2\x9e\xad\xdd\x9e\xae\xdd\x80\x00\x80\x80\x05\x82\x81\ \x02\x81\x82\x07\x83\x83\x09\x84\x87\x18\x8b\x93\x34\x98\x95\x40\ \x9e\x9b\x52\xa6\x9d\xad\xdd\xa0\x61\xad\xa9\xb8\xe6\xa9\xb9\xe6\ \xac\x87\xbe\xb5\xa1\xcb\xb5\xc4\xee\xb5\xc5\xee\xb6\xc5\xee\xb8\ \xa8\xce\xb8\xca\xed\xb9\xc9\xed\xba\xca\xed\xbb\xcc\xed\xbb\xd1\ \xe1\xbd\xbd\xd7\xbd\xcf\xec\xbe\xd1\xea\xbf\xbd\xd8\xbf\xd2\xea\ \xc1\xd6\xe2\xc2\xd9\xe4\xc2\xd9\xe5\xc3\xd9\xe4\xc4\xd9\xe9\xc4\ \xd9\xea\xc4\xda\xe8\xc5\xdb\xe8\xc6\xd1\xf2\xc7\xd2\xf2\xc7\xdd\ \xe9\xc7\xde\xe8\xc8\xdb\xe6\xc8\xdd\xe9\xc8\xde\xe8\xc9\xdd\xe6\ \xc9\xe0\xe7\xca\xe1\xe8\xca\xe2\xe8\xcb\xe0\xe8\xcb\xe1\xe8\xd6\ \xe8\xed\xd8\xe9\xee\xe1\xee\xf2\xe2\xee\xf2\xe2\xef\xf2\xe2\xef\ \xf3\xe7\xec\xed\xe9\xed\xee\xe9\xee\xee\xe9\xee\xef\xef\xf3\xf3\ \xf0\xf3\xf4\xf5\xf7\xfa\xf5\xf7\xfc\xf5\xf8\xfc\xf6\xf9\xfc\xf7\ \xfb\xfc\xfc\xfc\xfd\xfc\xfd\xfd\xfd\xfd\xfd\xfd\xfd\xff\xfe\xfe\ \xfe\xff\xff\xff\x81\x3c\x66\xd6\x00\x00\x00\x4b\x74\x52\x4e\x53\ \x00\x03\x04\x05\x07\x08\x09\x09\x10\x11\x12\x14\x1a\x1b\x39\x63\ \x64\x66\x67\x68\x68\x69\x71\x85\x86\x87\x8b\x8e\x8f\x90\x91\x91\ \x91\x97\xa3\xaa\xc4\xc4\xc5\xc5\xc6\xd5\xd5\xdc\xe1\xe2\xe3\xe3\ \xe4\xe4\xe5\xe5\xe6\xe6\xe6\xe7\xe7\xe9\xeb\xef\xf0\xf1\xf6\xf7\ \xf8\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfd\xfe\xfe\xbc\x73\x7f\x3c\x00\ \x00\x01\x6b\x49\x44\x41\x54\x18\xd3\x45\x91\x57\x57\xc2\x40\x10\ \x85\xc7\x28\x0a\x8a\xbd\xf7\xae\x28\x62\x17\xbb\xd8\x50\x31\xf6\ \x6e\xec\x8a\x05\x6c\xd8\x59\x85\x00\x26\x26\x58\x40\x20\x7f\xd8\ \xdd\x04\xe4\xbe\xcc\xb9\xdf\x9e\x33\x3b\x73\x07\x40\x56\x6a\xae\ \x4e\x6f\x30\xe8\x75\x39\x1a\xc8\x4b\x81\xa8\x92\x2b\x8c\x93\x76\ \x84\x65\x37\x1b\xcb\x87\x0b\xa2\x34\xbd\x67\xf6\x16\x29\x7a\x3c\ \x99\xa1\x07\x32\xd2\x64\x3a\xb4\xc9\x1c\x29\x74\x6f\x81\x96\x55\ \x83\x3b\x74\x6f\x32\x0c\x73\xa5\xf0\xed\x45\x42\x6b\x13\x01\xaa\ \xd7\x30\x65\xf6\x5f\x59\xaf\x97\x75\xa1\x75\x4c\xe7\x8a\xf0\x0c\ \x7d\xe7\xbb\x18\xdf\xfd\x48\x58\x01\xf7\x0a\xbd\x34\x4f\xf7\x6b\ \x20\x7f\x0a\x3d\x58\x77\xee\xc2\x41\x91\xe7\xc5\x60\x64\x79\xeb\ \xe5\x6c\x75\x3a\x1b\x74\x64\xb2\xa7\xef\x20\xcf\x99\x4c\x1c\xff\ \xfb\xe9\xc2\xf6\xa2\x1e\xf4\xe4\x27\x56\x12\xb9\xd2\x04\xaa\x8c\ \x13\x25\x96\x78\x3d\xb4\x92\xf2\x2e\xf1\x23\x14\x00\x65\x12\x24\ \x1f\xf1\x6d\x60\x20\xc5\x27\x7d\x98\xa2\xd8\x4b\xbc\x21\xde\xa4\ \x8c\xa2\xaa\x38\x7f\xac\x49\xe3\x25\x2e\xae\x80\xf2\xa5\x10\xfa\ \x79\xc3\xd6\x56\x0f\x39\x66\xf2\xec\x8e\xfc\x8a\x82\xe0\x0f\x85\ \x1d\x07\xd7\x08\x8d\x66\x82\xa6\xd3\x29\xf3\x00\x59\xe7\xcb\x81\ \x37\x3b\xbc\xe9\x52\x03\x14\x4f\xc9\x69\xb8\x58\x8f\x87\xbd\xdf\ \x21\x41\x58\x4a\x70\x80\xaa\xe6\x63\xf4\x2f\x2b\xa6\x1b\x1d\x2a\ \x39\xd8\x96\x38\x7f\xde\x65\x36\x06\xb5\xd1\x33\x34\x4d\x38\x63\ \xfc\xd4\xd2\xae\x8d\x1d\x4d\x55\x68\x1c\x23\x73\x22\xdb\x78\x6f\ \x65\x12\xc4\xa5\xc9\x6e\x20\x27\xae\xcb\x52\x2b\xfe\x0f\xd0\x11\ \x98\xc6\x12\x88\x73\xc8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\xd4\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xc6\x50\x4c\x54\x45\x00\x00\x00\xff\x55\x55\xff\xd5\ \x55\xff\xbf\x60\xff\xb9\x5d\xff\xcc\x52\xff\xce\x58\xf3\xd6\x9c\ \xf4\xd7\x99\xf4\xbf\x8f\xf5\xc1\x8d\xf5\xbf\x8e\xff\xcd\x53\xff\ \xcf\x54\xed\x7c\x72\xee\x7d\x71\xee\x54\x63\xee\x56\x65\xff\xcf\ \x55\xed\x56\x64\xed\x54\x64\xed\x56\x63\xff\xcd\x54\xff\xce\x54\ \xf3\xbe\x8f\xff\xce\x55\xff\xcf\x54\xff\xce\x54\xf9\xc2\x48\xf4\ \xbe\x8e\xf9\xc2\x49\xf9\xc2\x48\xf4\xbe\x8e\xfc\xd1\x67\xf4\xbe\ \x8e\xf4\xbe\x8e\xf4\xbe\x8e\xed\x9d\x99\xff\xce\x54\xe3\xde\xd6\ \xe5\x82\x8e\xe5\xdf\xd7\xe7\xe0\xd6\xe8\x88\x93\xe9\xe2\xd7\xea\ \xe2\xd7\xed\x55\x64\xf1\x89\x79\xf4\xbe\x8e\xf7\xbd\x44\xf8\xbf\ \x45\xf8\xbf\x46\xf9\xc2\x49\xfa\xc2\x4a\xfb\xc5\x4b\xfc\xc8\x4e\ \xfc\xd1\x65\xfd\xc9\x4f\xfd\xca\x50\xfd\xca\x51\xfe\xcb\x51\xfe\ \xcd\x53\xff\xcd\x53\xff\xcd\x54\xff\xce\x53\xff\xce\x54\x14\x79\ \x64\x12\x00\x00\x00\x27\x74\x52\x4e\x53\x00\x06\x06\x08\x0b\x19\ \x1a\x2c\x2d\x30\x31\x34\x4d\x4f\x65\x66\x67\x68\x75\x80\x82\x83\ \xa4\xa7\xb1\xb2\xb3\xb7\xde\xe1\xe1\xe2\xe3\xeb\xec\xed\xef\xf3\ \xf3\x65\x71\x36\x49\x00\x00\x00\x96\x49\x44\x41\x54\x18\xd3\x63\ \x60\xc0\x04\x5c\x0a\x12\xd8\x44\x95\x0d\x64\x31\x45\x39\x95\x0c\ \x54\xb8\x87\x88\x28\xa3\xb0\x88\x00\x1f\x86\x28\xbb\xaa\x1e\x10\ \xe8\x2b\x73\xa1\x88\xf2\x2a\xea\x6a\x80\xc4\xf9\x91\x05\xd9\xc4\ \x1d\x1d\x2d\xb4\xb4\x81\xc2\x82\x48\xa2\x42\x6a\x0e\x66\x96\x8e\ \x16\xea\x40\x71\x51\x24\x61\x29\x2b\x23\x13\x5b\xa0\x7a\x4d\x0d\ \x3d\x61\x24\x61\x16\x39\x4b\x47\x3b\x47\x47\x73\x0b\x1d\x55\x46\ \x64\xb3\x99\xa4\xac\x0d\xed\xcd\x8d\x1d\x15\x39\x50\xbd\xc1\x2c\ \x6f\x6d\x6b\x68\xe3\xc8\x83\xee\x3d\x66\x69\x53\x33\x47\x31\xcc\ \x08\x61\x92\xb1\x57\x63\xc5\x12\x7d\xcc\x92\x42\xa8\x02\x00\x56\ \x69\x15\x2d\xdd\x99\x3c\xfc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x01\x27\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\x63\x50\x4c\x54\x45\x00\x00\x00\x80\x80\xaa\x80\x80\ \xb3\x70\x80\xbf\x78\x87\xc3\x6f\x85\xbc\x72\x84\xc1\x75\x83\xc1\ \x71\x82\xbe\x74\x85\xbc\x72\x82\xbe\x71\x84\xbd\x74\x83\xbd\x73\ \x83\xbf\x73\x82\xbe\x72\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\ \xc0\x73\x83\xbf\x74\x83\xbf\x73\x84\xbf\x72\x83\xbf\x73\x83\xbf\ \x73\x83\xbf\x73\x83\xbf\x73\x83\xc0\x73\x83\xbf\x73\x83\xbf\x73\ \x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x23\x94\x39\xa9\x00\ \x00\x00\x20\x74\x52\x4e\x53\x00\x06\x0a\x10\x11\x17\x1d\x25\x2b\ \x2e\x2f\x36\x42\x50\x66\x88\x90\xa4\xb1\xb3\xb7\xb8\xc4\xcf\xda\ \xde\xe5\xe8\xec\xf3\xf8\xfc\x17\x6c\x08\xb1\x00\x00\x00\x53\x49\ \x44\x41\x54\x18\xd3\xb5\xc8\x37\x16\x80\x20\x14\x04\xc0\x55\x30\ \x2b\xe6\x9c\xfe\xfd\x4f\x69\x65\x21\x6c\xe5\xd3\x29\x07\x78\x2b\ \x4c\xd8\xa6\xeb\x4c\x36\xdb\x64\x71\x37\xdf\x85\x74\x71\x88\xd5\ \x91\x31\xa6\x3c\xc5\xee\x46\x6e\x8f\xee\x7f\xec\x8a\x37\x94\xd6\ \xf1\xe4\x36\x00\x04\x23\x6d\xa8\x81\x36\xfc\x8e\x36\xbc\xba\xc5\ \xa7\x2e\x23\x73\x0c\xe5\x05\x8a\xa3\x3b\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xd2\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xb7\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\xbf\ \x00\x80\x80\xaa\xff\xaa\x00\x80\x80\xb3\xea\xbf\x15\xeb\xb1\x14\ \x70\x80\xbf\x78\x87\xc3\xf1\xb8\x1c\xe6\xbf\x1a\xe7\xb6\x18\xe7\ \xc2\x18\x6f\x85\xbc\xe9\xbc\x16\x72\x84\xc1\x75\x83\xc1\x71\x82\ \xbe\x74\x85\xbc\x72\x82\xbe\x71\x84\xbd\xeb\xbb\x18\x74\x83\xbd\ \xeb\xbb\x14\xeb\xb9\x17\xec\xbb\x17\x73\x83\xbf\xec\xba\x16\x73\ \x82\xbe\xeb\xba\x16\xeb\xba\x16\xec\xb9\x15\xec\xba\x15\xea\xb9\ \x17\x72\x83\xbf\x73\x83\xbf\xea\xba\x17\xea\xb9\x16\x73\x83\xbf\ \xec\xba\x17\x73\x83\xc0\x73\x83\xbf\xeb\xba\x16\x74\x83\xbf\x73\ \x84\xbf\xeb\xba\x15\xeb\xba\x16\xeb\xbb\x16\x72\x83\xbf\xea\xba\ \x16\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xc0\x73\x83\xbf\ \x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x5a\ \x12\xad\x9b\x00\x00\x00\x3c\x74\x52\x4e\x53\x00\x01\x04\x06\x06\ \x0a\x0c\x0d\x10\x11\x12\x14\x15\x15\x17\x17\x1d\x25\x2b\x2e\x2f\ \x36\x40\x42\x4b\x4d\x4f\x50\x5d\x66\x72\x73\x84\x85\x87\x88\x90\ \x93\xa1\xa4\xaa\xb1\xb3\xb6\xb7\xb8\xbf\xc1\xc2\xc4\xc7\xcf\xda\ \xde\xe5\xe8\xec\xf3\xf8\xfc\x2e\x48\xf1\x43\x00\x00\x00\x8e\x49\ \x44\x41\x54\x18\xd3\x63\x60\x20\x17\x08\x08\x63\x13\x15\x31\x37\ \xc5\x22\x2a\x6a\x61\x63\x86\x29\x2a\x6e\x69\x83\x45\x58\xda\xca\ \x06\x2c\x2c\x27\x01\x13\x11\x94\x95\x95\x55\xb6\xb6\x01\x0b\xab\ \xf2\x1a\x71\x43\x85\x35\x6d\x60\xc0\x8c\x41\x46\x49\x4a\x01\x2a\ \xac\x8b\x24\xcc\x68\xc4\x62\x80\x45\x98\x41\x83\x5f\x9f\x11\x8b\ \xb0\x36\xbb\x3e\x16\xd5\x5c\x7a\x4c\x30\x43\x54\x90\x84\xd5\x24\ \x24\x15\x61\x2e\xe4\xe0\xe4\x14\x32\x81\x08\x8b\xb1\x19\xf1\x20\ \x7b\x87\xcf\x18\x62\xb6\xbc\x24\xaa\x37\x39\x0c\xb1\x79\x9e\x81\ \x81\x55\x07\xab\x30\x03\xb3\xba\x16\x03\x55\x01\x00\x1e\xa5\x1c\ \xc8\x6b\x4c\xfa\xae\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x09\x6c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x09\x33\x49\x44\x41\x54\x78\xda\xed\x9d\x0b\x50\x54\x55\ \x18\x80\xd7\xde\x4d\x35\xbd\xdf\x65\x53\x4d\xd3\xd4\xd4\xf4\x6e\ \x6a\xaa\x99\x66\xaa\x29\x9d\x2c\x05\x96\x05\x95\xbd\x7b\x17\x44\ \x29\x51\xa1\xd0\xd4\x46\xcf\x5d\x5e\x8a\x80\x80\x4f\x2c\x95\x44\ \x04\x04\x44\x84\xb2\xd4\x50\x14\x34\x95\x52\xd1\x50\x30\xcd\xd4\ \x9c\x9c\xca\x31\x27\x4b\x2d\x3d\x9d\xff\x72\xef\x7a\xee\x61\xd7\ \x07\x9d\xdd\xbd\x7b\xef\x3d\x33\xff\x2c\x30\x7a\xee\xd9\x6f\xef\ \xfd\xcf\x7f\xfe\xd7\xda\x6c\x41\x1e\xef\xb8\x27\x5f\x67\x77\xa1\ \xb7\xa2\x04\xe9\x03\xbb\x88\x8a\xc9\xcf\x6b\xec\x02\xda\x4d\x5e\ \x0f\x11\xf9\x83\x08\x56\x5e\x0f\x29\x7f\x6f\x8a\x72\xa1\x39\xd1\ \x22\xfa\x30\xca\x29\xf5\xb1\x27\x4e\xba\xde\x66\x0d\xed\x70\x88\ \xe8\x69\x02\x29\x93\xc0\xda\x40\xa0\xfd\xa3\x40\xec\xa9\xfc\x4b\ \x64\x23\x91\x6c\x87\xcb\xf3\x9c\x69\xa1\xda\xc5\xac\x5b\xed\x2e\ \x29\x8d\x00\xdd\xfe\x3f\x81\x9e\x5b\x44\xd4\x1e\x25\x4a\x63\x63\ \x13\x32\x6f\x37\x07\x58\x67\xc6\xdd\xd1\x2e\x34\x95\xbc\xf9\xe3\ \xe7\x02\xe3\x7c\x7f\x32\x1e\x3e\xa1\x18\x8f\x2b\xac\xc0\xd9\x25\ \x0d\x38\xb7\x7c\x05\x2e\xa8\x59\x8d\xa7\x2f\x6b\x96\x5f\x73\xcb\ \x57\xca\x7f\x1f\x5f\x54\x89\x93\x27\x16\x63\xe7\xf0\x9c\xf3\xc1\ \xfe\x8b\x7c\x98\xd3\xec\x4e\xd4\xdb\x98\x60\xdf\x43\xd7\x12\x3d\ \x99\x4b\xde\xe8\x09\x5f\x00\x06\x0d\xcd\xc4\x63\xa6\x2c\xc4\x53\ \xab\x1a\x71\xc5\xe6\x5d\xb8\x61\xf7\xcf\x17\x2d\x15\xad\x1d\x32\ \xfc\x31\xb9\x65\x78\x50\x52\x96\x3f\xd0\x27\x89\x14\x18\x4a\x57\ \x47\xb9\x24\x3b\x79\x53\x07\xbb\x3f\xbe\x12\x4e\xc9\x98\x8b\xa7\ \xd7\xad\xc3\x75\x3b\xf7\xf7\x08\xaa\x3f\xa9\xdb\x75\x00\xcf\xa8\ \x6f\xc6\x29\x99\xf3\xe4\xeb\xf8\x00\x0d\x9b\xe6\xc0\xb0\x06\xab\ \x58\x04\x65\xbe\xc0\xa6\x66\xcc\xc3\x0b\xd6\x6d\xe3\x0a\xd5\x9f\ \x94\x6f\xde\x89\x27\xcc\xa8\xc6\x31\xf1\x1e\x5f\xa0\x6b\x07\x0e\ \xcc\xbe\x31\xfc\x54\x82\x0b\x3d\x49\xa4\x83\x7d\x43\x23\xa5\x4f\ \x70\xd9\xc6\xf6\xa0\x80\xed\x06\x7a\xd3\x4e\x3c\x8a\x3c\x31\x3e\ \x20\xef\x89\x74\xa3\x67\xc3\x06\x2e\xd9\xc4\xfa\xb2\x9b\x58\x1c\ \xd9\xb4\x40\x15\x84\x02\x2c\x2b\x33\xeb\x5b\x7c\x6d\x8a\x7f\x93\ \x75\xf7\xd7\xbf\xbe\x15\xa4\x41\x64\xb1\xa7\xe8\xc5\xc3\x2e\x5f\ \xb5\x65\xb7\x2e\xe0\xaa\x52\xd3\xb6\xc7\xd7\xdd\xfc\x2f\x31\xe9\ \x86\xea\x17\xae\x88\x12\xc8\x22\xcf\xd0\x8b\x4e\xff\xb4\x0e\x37\ \x74\x1e\xd4\x15\x5c\x55\xea\xc9\xba\x32\x89\xa9\x47\xac\x1b\x1a\ \xf2\x19\xb2\x29\x27\xeb\x4f\xe7\x0a\xe8\x1d\xfa\x14\x16\xed\x96\ \x70\xde\xe2\x55\xba\x04\xcb\x4a\x51\xed\x1a\xec\x70\x4b\x5a\xc8\ \x02\x72\xea\xc8\x0c\xf3\xbc\x02\x3a\x4c\x5d\xa0\x43\xf4\xc8\x26\ \x52\x38\xc0\x55\x65\xd6\xf2\x0d\xd8\xa1\xb5\x32\x4e\x12\x75\xf7\ \x5a\xc8\xe1\x0e\x88\x43\xb7\x29\x36\x65\xd7\x9d\x4b\x1e\xb7\x82\ \xea\xc6\xb0\x82\xeb\x85\xdc\xd0\x22\x3f\x79\x14\xe4\xdf\x43\x7a\ \xf2\x43\x08\x5d\x42\x16\xb1\x8a\xd6\xb9\x93\x4b\x97\x87\x25\x5c\ \x55\xe0\x48\xce\x6c\x7c\x6b\x5f\x45\xe8\xb2\x10\x99\x63\xd2\x18\ \x7a\x31\xa3\xa7\x94\x86\x35\x5c\x55\xc6\xe6\x2f\xd2\x40\x26\x9b\ \xde\xc4\x10\x38\x6d\x50\x6f\x72\xf1\x3f\xd5\x45\xb8\x53\xf2\x71\ \xed\x8e\x1f\x0d\x01\xb8\xae\x7d\x3f\x4e\x1c\x53\x44\x43\x3e\x61\ \x77\xa7\x3f\x1c\x64\x77\x23\xaa\xa3\x8f\xbe\x25\x4d\x5b\x0d\x01\ \x57\x95\xd2\xe6\xed\xf2\x66\x4d\x41\xfe\x2a\x78\xaa\xc1\x8d\x5e\ \xa7\x1f\xa1\x8f\x8b\x2a\x0d\x05\x57\x95\x89\xb3\x6a\x34\xaa\x82\ \xa8\xc4\x7e\xc1\xf2\x33\xac\xa1\xfd\xb6\x4b\xda\x7e\x34\x24\xe0\ \xda\xef\xf7\x61\x21\x59\x73\xa4\xde\x18\x04\xdd\xeb\x79\x51\x6b\ \x35\x7c\x69\x48\xb8\xfe\xac\x0a\x78\x7a\x03\x7d\xf7\xd6\xaa\x17\ \x1b\x9c\x94\x8d\x97\xb6\xef\x33\x34\x60\xf0\x53\x0b\xc3\x27\x07\ \x47\x17\x77\xc5\xd1\xce\x3a\x72\x32\xe6\xd5\x1b\x1a\xae\x2a\x93\ \x88\x6d\xaf\x09\xaa\x3a\x33\xee\x0e\xcc\xe6\x26\xa0\x11\xb4\xe5\ \x50\xd9\xda\x61\x0a\xc0\x55\x5b\x7f\xd0\xf8\x2a\xa2\x04\x34\x3a\ \x50\xea\x61\x83\x7a\x91\x11\x68\x8e\x29\xe0\xaa\x92\xa2\x75\x6d\ \x6e\xe3\x0e\xb7\xbf\x0b\xdd\xa0\xe4\x1c\xc8\x17\x09\x57\x7f\x43\ \x4f\x65\x5a\xdd\x5a\x8d\xb7\x8d\xc8\x1d\xbc\xa3\x14\xfd\xe9\xdd\ \xb4\xc2\x24\xea\x81\x56\x13\xb4\xdf\x38\xca\x85\x62\x78\xab\x87\ \x02\xfa\x58\x6c\x26\xb8\xaa\xd0\xc7\x67\x48\xd7\xe2\x0d\xb8\x49\ \x9d\x7c\x5c\x41\xb9\x29\x01\x4f\x98\x51\x75\x56\x4d\x08\x68\x33\ \x6f\xc0\x87\xd5\xc9\x73\xca\xbe\x32\x25\xe0\xfc\xca\x55\xb4\x1e\ \x3e\x46\xb0\xf4\xe2\xb9\xc1\x79\x27\x2f\x5e\xfe\x8d\x29\x01\x7f\ \xba\xb2\x55\x73\xaa\x8b\x71\xa3\xbb\xb8\x65\x3f\xd2\x13\x2f\xfa\ \xa6\xdd\x94\x80\x2b\xbf\xeb\xd4\x3a\xe3\xdd\xe8\x65\x4e\x31\x37\ \xf4\x2a\x3d\x71\xcd\xf6\xbd\xa6\x04\x0c\x7e\x62\xad\x77\x0d\xf5\ \xe5\x15\xb9\xe8\x47\x4f\xbc\x6c\xd7\x01\x53\x02\x06\xd1\x44\x9f\ \x45\xc9\xc1\x07\xb0\x28\xc5\x7a\x23\xc6\xf1\x1e\xd3\xc2\x05\x19\ \x3c\x2c\xfb\xac\xa9\x26\xa2\x04\x5e\x3e\x88\x68\x3a\x24\x6f\x66\ \xc0\x03\x87\x66\x51\x80\x25\x91\x67\xae\x99\x77\x62\xd0\x45\x66\ \x84\x0b\x99\x40\x9a\xb0\xbe\x88\xa2\x78\x26\x96\x78\x27\xae\xde\ \xb6\xc7\x94\x80\xc1\xf7\xad\xd9\xe4\x44\xe9\x4d\x3e\x66\x5a\x3c\ \x7a\x8c\x9e\xb8\xb4\x65\x87\x29\x01\x97\x6f\xda\xa5\x35\xd3\x9c\ \xe8\x79\x3e\xa7\x38\x7b\xfe\xd5\x64\xc2\xd3\xea\xc4\xe1\x96\x16\ \xc5\x4b\xe0\x80\xa5\x01\x1c\x8f\x6e\xe2\x79\x54\xde\xa7\x4e\x0c\ \xc5\x27\x66\x04\x0c\x2e\x02\x0a\xf0\x61\xde\xbe\x88\x2f\xd5\xc9\ \xd3\x72\x16\x98\x12\x30\x93\xf1\xb3\x96\x77\xa2\x89\x44\x87\xea\ \xeb\x75\x9a\xf3\x1b\x48\x11\x47\xe6\xd2\x80\x73\x38\xa7\xa8\x6a\ \x8f\xcb\x0b\xd7\x6f\x37\xd9\x06\xb7\x53\x9b\xaf\xe6\x94\xfa\x70\ \x05\xdc\x27\xb9\xe8\x4a\xb9\x98\x4f\xb9\xc0\xa4\x05\x5f\x98\x0a\ \xf0\x94\x45\x9a\xfc\x88\x53\x50\xf7\x17\x88\xa0\x67\x83\x7a\x91\ \x21\x69\x45\xa6\x02\x9c\x34\x6e\x06\x0d\xf8\xeb\x00\x65\xb2\xa3\ \x18\xfa\x31\xf9\x6c\x5d\x9b\x29\xe0\x82\x7b\x96\xc9\x19\x76\x05\ \x26\x6c\xdf\x65\x0f\x1f\x55\x2f\x34\xde\xa0\x49\x7f\xdd\x43\x45\ \xd5\x34\xdc\xe3\x50\x60\x19\xc0\x7a\x0c\x34\xcb\xeb\xd1\x8f\xf7\ \xc8\x4e\x68\xa3\x47\x93\x63\x87\x64\xd0\xc1\xce\x92\x80\xe6\xa6\ \x39\x84\xf4\x07\xe9\x6a\x22\xf8\x74\x8d\x0c\x58\x2a\xae\xa5\xef\ \xde\xd3\xc4\x5c\x7d\x34\x18\x95\x9c\x0b\x69\xff\x70\xa8\x4a\x63\ \x03\x1e\x22\x6a\xed\xd0\xdc\xbd\xe4\xc6\xaa\x0a\x4a\x7e\xb0\x23\ \x2e\xfd\x11\xfa\x2e\x86\xfa\x63\x23\x02\x4e\xcd\x9a\xaf\x49\xfa\ \x73\xb8\x3d\x4f\x04\x2f\xcb\xbd\xab\xf7\x83\x77\x01\x45\x4b\x9b\ \x0c\x05\x17\xea\x99\xb5\x85\x30\x68\x7a\x50\x6b\x34\x94\x56\x05\ \xde\x1e\x10\xb1\x43\x32\x0d\xa3\x2a\x16\x7f\xdb\x29\xe7\x3e\x53\ \x80\x7f\x81\xd4\x85\x10\xd4\x26\x4b\xef\xd2\xb5\xc9\xc3\xc6\x4e\ \x97\x1b\x61\x84\x33\xdc\x65\x1d\x07\xf1\x7b\x1f\xcf\xd4\x3a\xd6\ \x05\x14\x1d\xca\x02\xf0\x42\x7a\x31\xa9\xd9\x25\xb8\xbe\x23\x3c\ \x1d\x41\xe0\xc0\x62\x6b\xe4\xc8\x86\x3e\x3b\xa4\xa5\xb4\x89\x89\ \xc5\x97\x13\xd3\x65\xbd\x11\xaa\x8e\x18\x93\x0c\xa4\x0d\x0e\x57\ \x21\xaf\x57\x8e\x11\x33\xee\x25\x8b\xd9\x4f\x2f\x4e\x9a\xbd\x24\ \xac\x5c\x9a\x6c\xc9\x96\x5c\x7f\x1d\x97\x7e\xbf\x6e\x2a\xee\x23\ \x5d\xe9\x0f\xd1\x09\x82\x20\x1f\xe5\x95\xc9\x3a\x4d\xd7\x6a\x81\ \xac\x0f\xda\x87\x31\x70\xff\x88\x74\x7a\x9e\xb2\xe9\x6d\x38\x5c\ \xe8\x05\xda\x57\xa1\xda\xc8\x7a\x8d\x42\xd7\xb4\xed\x65\x4b\x03\ \xe0\x30\x01\x9b\xda\x08\x9b\x5e\x87\x12\x81\x3e\xc8\x36\x99\x9b\ \xb3\x62\x93\xae\xe0\x7e\xd6\xb4\x15\x8b\xa3\xf2\xfc\xf5\x56\x3b\ \x06\x37\x8b\x6e\x21\x47\xba\xd1\x03\x64\x91\x9d\xda\x02\x3e\x49\ \x4e\x60\x5e\xb2\x23\xb4\x75\x75\x50\xbd\x09\xfa\x96\xa9\x43\x06\ \x39\xc2\xfc\x7e\xd4\x2e\x78\x9e\xd1\x2d\x64\xe8\xac\x07\x67\xf7\ \x6e\x2d\x13\x87\xe7\xe0\xc2\x9a\x35\xc1\x37\xe5\xc8\x86\x5b\x54\ \xdb\xc4\x96\xc6\xaa\xb2\x14\x7a\xa7\x29\x0d\x4a\x69\x75\xf1\x2b\ \x3c\x91\x36\x3d\x8f\x68\x41\x7a\x9f\x0e\x35\x9d\xad\xf3\xc8\x93\ \xdb\x28\x06\x3a\x53\x73\x59\xe7\x01\xf9\x03\x4d\x48\x9d\xea\x0b\ \xec\x09\x02\x75\x14\x9d\xa9\x0e\xc1\x4c\xe6\xdf\x1c\x06\xdf\x8b\ \xae\x21\x2b\x2a\xa3\xc1\x67\xcf\xca\xa4\x2c\xd9\x71\x3f\xaf\xf1\ \x5b\xae\x60\x17\xae\xdf\x21\xdb\xb5\x7e\x9b\x86\x8a\xa8\xd1\x0f\ \xb8\x5e\xe4\xce\x9d\xc9\xdc\xc9\x07\x74\x65\xb2\xf9\x55\x1b\x4e\ \x69\x00\xb4\x9b\xf5\xd7\x21\x55\x1c\x99\x27\x9f\xa4\xa0\x0b\x14\ \xa4\x29\x5d\xb0\x1a\x21\x8f\x3f\x34\x14\x85\x5a\xb6\xf1\x05\x15\ \xd8\x3d\x2a\xff\x5c\x5d\x58\x3b\xa0\x97\xe6\x79\x96\xda\x8b\x58\ \x12\x9f\x30\xff\xef\xa7\x88\xf8\x8c\xfb\x74\x0f\x19\xfa\xfc\x28\ \xcd\x42\xb7\x9c\xaf\xf7\x2f\x44\x4c\x86\xa4\x15\xca\x7d\x2e\x47\ \xe7\x94\xca\x77\x3a\x1c\x60\xe0\x15\x7e\x87\xc6\x9f\x89\xa3\x0b\ \xfd\xf5\xa4\xec\x76\x2a\x93\xf3\x9c\xed\x8b\x2f\xbd\xb0\xf0\xd8\ \xe2\x4b\xc9\x31\xb9\x9c\x99\xa3\x33\x62\x70\xe6\x9d\xb6\x70\x19\ \xb0\x4b\xcb\xbe\x0c\xb2\x99\x04\xa8\x41\x33\xb4\x22\x5f\xa0\xb4\ \x20\xb8\xe8\x8a\x20\xc5\x0d\x50\xc7\x7e\x50\x03\x9c\x59\x37\xdb\ \xc2\x69\xb8\x5c\xe8\x2a\x25\x07\x39\x4f\xb9\xb3\x4f\xf7\x10\x28\ \x78\xf6\xb6\x41\x03\x68\xf2\xc1\xbd\xcd\xc3\x8f\x60\xb7\xa3\x2b\ \xc8\x9c\x9f\x33\xd7\xd9\x12\x96\x1d\x5b\xd5\x01\xbe\x57\xe5\x54\ \xe8\x82\x5e\xec\x44\xe6\xcb\x26\x9f\x80\x56\x92\x9f\x5b\x94\xd7\ \x6a\x08\x40\x12\x99\x04\x99\xe6\xd0\x28\x24\x50\x6f\x5a\x89\xa6\ \xaf\x66\x20\x6f\x08\x68\x74\xd9\x6c\x23\x2e\x6e\xca\x35\x90\xf0\ \xc7\x40\x6e\x86\xbf\x5b\x74\xf8\x1e\x9e\x36\x33\x90\x57\x80\x8a\ \xb3\xe8\x70\x1a\xb1\x89\xe8\x16\x1f\xdf\x9c\xb0\x14\x36\x44\x8b\ \x0e\xa7\x21\xf7\xeb\xec\x6e\xcf\x57\x87\xac\x05\xa3\x11\x47\x44\ \x02\xba\x87\x40\xdd\xcb\x44\x9e\x4b\xc0\xce\xb7\xe8\x70\x3b\x99\ \xca\xed\x25\xf7\x31\x90\xe7\xda\x78\x55\xe1\x5b\xc3\x1b\xc9\x39\ \xc4\xa8\x8b\x02\x8b\x0c\xcf\x3b\xd9\xe5\x79\x9c\x40\xfd\x8d\xb9\ \x93\x3d\x16\x19\xae\x90\xe5\xaf\xb5\x38\xc2\x84\xfc\xc7\x59\x64\ \x38\x0e\xe5\xf4\x79\x4c\xab\x2e\xa4\x34\x8b\x0c\xc7\x11\x2d\x78\ \x5e\xa2\xfb\x2a\xcb\xfe\x11\x51\x4a\xb2\xc8\x70\x55\x17\xd2\x1b\ \xf4\x97\x06\xc8\xdf\x6a\xc0\xab\xf5\x81\x35\xba\x86\x92\xb7\x77\ \x4a\xf3\x25\x28\xbc\x7b\xad\x59\xea\x42\x8a\x64\xbe\xe1\xf1\x14\ \x7c\xdf\x88\x45\x86\xe7\x9d\x2c\x20\x27\xe3\xdf\x3e\xc9\xad\xd7\ \x8f\x35\x14\x9d\x4c\x36\x39\xe6\x2b\x88\x8e\x43\x20\xd8\x22\xc3\ \xd7\x4e\x4e\x65\x0e\x22\x11\x16\x15\xde\x3a\x59\x94\x52\x64\x3b\ \x59\x44\x8d\xaa\xa3\xfe\x3f\xce\x96\xee\xe7\xd4\x62\xbf\x37\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0c\x1e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0b\xe5\x49\x44\x41\x54\x78\xda\xed\x5d\x6b\x6c\x1c\x57\ \x15\x5e\x1e\x29\xf0\x9b\xec\x8c\xed\x38\x49\x9b\xd8\x4e\xe2\xd8\ \x71\xdd\xd0\x90\x52\x95\x52\x37\x75\x5c\xa4\x3e\x42\x11\xe5\x15\ \x40\x20\x40\x08\xa4\xf2\x87\xa4\x48\x14\x05\x2a\x5a\x2a\x55\x42\ \x08\x68\x29\x6a\x0b\x94\x1f\x40\x2a\x1e\x7d\x67\x1f\xf6\xae\xed\ \xd8\xde\xf8\x51\x01\x4d\xa5\xa4\x6d\xec\x86\x26\xf1\xee\xce\x63\ \x0b\xfc\x81\x46\xf8\x72\xce\x9d\xc9\xee\x9d\x99\x7b\xef\xec\x7a\ \x77\x3d\x33\x5b\x2c\x5d\x35\xf5\xae\xf7\xf1\xed\xd9\xef\x7c\xe7\ \x39\xb1\x58\x48\x7e\xc8\xd1\xd8\xbb\x8c\x74\x5b\xaf\x9e\x52\x3e\ \xa6\xa7\xe2\x77\xeb\x49\xe5\x97\x70\xa6\xe0\xfc\x4d\x4b\x2a\x67\ \xb4\xa4\x6a\xc2\x7f\xff\x63\x1d\xfa\xef\x33\x78\x9b\x75\x1f\xf5\ \x71\xfa\x37\xf4\x6f\xdb\x77\xe0\x63\xc5\xfe\xff\x13\x8b\x15\xd2\ \xea\x16\x2d\xa1\x7e\x05\x00\x3a\x0a\x80\x19\x70\x48\x83\xce\xbf\ \xb4\x84\x92\xd2\x93\xf1\xc3\x5a\x62\xfd\x6e\x72\x24\xf6\xce\xb7\ \x0d\xa8\xa5\xd1\xf6\xcd\xd6\x1b\x57\x5e\x6b\x20\xa0\x3e\x27\xfe\ \xf7\x62\x52\xfd\xa1\x96\x5e\xdf\xd3\x92\xa0\x92\xf9\xd8\x3a\xf8\ \xfa\x7e\xae\x98\x50\xa6\xd7\x0e\x54\xfe\xb1\x69\xe7\x20\xc9\xc4\ \xde\x1d\x7d\x60\x8f\xee\xbc\x0c\x81\x85\x37\xf6\x4a\xd0\xc0\x72\ \x80\x5e\x02\xab\xbe\xeb\x8d\xe9\xce\xf7\x45\x0f\x58\x12\x7b\x47\ \x31\x11\xff\x22\xbc\x91\x0b\x61\x03\x96\x73\xce\xe9\x89\xf8\xe7\ \xf1\x35\x47\xc4\x71\x29\xbb\xe0\x45\x1f\x8f\x00\xb0\xee\x33\x99\ \x4f\xa9\xfd\xa1\x05\xf6\xd5\xe7\xbb\xde\x03\x2f\xf2\x41\x38\x17\ \x23\x08\xee\xa5\xf3\x16\x9c\x07\x90\xda\x42\xa7\x0c\x8a\x49\x65\ \xa6\xb6\x37\xa3\x12\x3d\xb3\x95\x18\x53\x83\xc4\x98\xd9\x43\xf4\ \xd1\x8d\x21\x02\x5a\x9d\x2f\x8c\x2a\x5b\x43\x01\xae\x9e\x50\x6e\ \xb7\x85\x7f\x75\xce\x25\xb3\x85\x18\xd3\x57\x93\xd2\xfc\x7e\x52\ \x7a\xf1\xa3\xe5\x63\xe6\xae\x0d\x9b\x35\xff\xa3\x98\x50\xef\x0c\ \x14\x5c\xd0\xb2\x47\xaa\xb6\xd6\x89\x5e\x62\xce\x7e\xc4\x01\xaa\ \x03\xe0\xe9\x0f\x84\x95\x36\xee\x09\x24\xac\x05\x70\x1f\xaa\xe6\ \x05\x1a\xe3\xdb\x88\x39\x37\xc4\x07\x76\x61\x04\xe8\xe1\x1a\xa2\ \x8f\x6f\xa7\x1f\x42\x58\xb9\x19\xe8\xef\xa7\x6b\x16\x0d\xa2\x33\ \x03\x0d\xf9\xa4\xef\x0b\x1b\xdb\x44\xcc\x13\xd7\x71\x80\xbd\x99\ \x98\x33\x7b\x89\x9e\xed\x0e\x35\xa8\x9c\x6f\xe1\xef\x9b\xee\xfc\ \xf0\x53\xb4\xf3\x06\x72\xab\x9d\xd8\x49\xad\xd3\x41\x01\x0b\x08\ \xec\x07\xc1\x99\x6d\x22\x91\x55\x19\x29\xe5\x4f\x4d\x4d\x24\x01\ \xb8\x3f\x96\xbf\x80\x0e\xea\xac\xdc\x56\x6b\x4c\x83\x4a\x48\x6f\ \x20\x11\x96\x6f\xec\x79\xb8\x39\x0e\x2d\xa9\x7c\x4f\xaa\x0e\xc0\ \x32\xdd\x5c\x6b\xce\xdf\x48\xa5\x58\x55\xea\x62\xec\xf2\xc8\xd0\ \x06\xa8\x8b\xef\x34\x14\x5c\x08\x7b\x3f\xee\x07\x8e\x39\x7f\x93\ \x13\xdc\x29\x50\x05\xa9\x36\x39\xa8\xd9\xad\x54\x3d\x94\xe6\xf7\ \x55\xac\xfd\xf8\x55\x51\xb0\xe2\x15\xcc\x3d\x37\x26\xf4\x05\xc1\ \x0d\x0f\xf8\xa6\x0c\xdc\xd2\xfc\xb0\xc3\x89\xe9\x13\x7d\x72\xc9\ \x06\xaa\x41\x24\xd9\x8c\xdc\xde\xa8\x50\x45\x29\x9f\x50\xaf\x68\ \x40\xf8\xab\xce\x4b\x69\x81\xb5\x5c\x70\x6c\x7a\xb6\x47\xec\xfc\ \x32\xdd\x40\x23\x37\x0a\x24\xdb\x7e\xaa\x2e\xb4\x74\x67\x84\xf8\ \x38\x3e\x5b\x97\xb2\xb0\x73\x0b\x62\x87\xc6\x72\x2e\x82\x0b\x51\ \x1a\xf7\xbe\xe9\x76\xa0\x82\x3d\xde\xe0\x02\xac\x9d\x3a\xc0\x6c\ \x17\x3c\x9e\x1a\x55\xa7\xf7\xc0\xaa\xc0\x35\x13\x6a\x9f\x9d\xfc\ \xe0\x80\xab\xba\xd4\xc2\xcd\x42\xcb\xd5\xc7\xae\x70\x70\x6c\xd9\ \x5a\xa7\x06\x5b\x45\x59\x5c\xc4\x0c\x62\xcd\xf9\x5c\xa0\x86\xac\ \xf0\xab\x3e\xd9\xef\xe4\x4d\xf8\x7f\x11\x25\x70\x73\x0e\xa3\x9d\ \xad\x22\xd9\xca\xa9\xce\x9a\xf2\xc9\x76\xb2\x5c\x1c\xa1\x41\xd0\ \xe0\x97\x43\x30\x26\x7a\xa9\x65\x57\xac\x76\x18\xc2\xe6\xed\xad\ \x06\x2c\x5b\x21\xf9\x6c\x2d\x79\xdd\xf3\xa2\x07\x32\x73\x95\xf0\ \xd7\x9c\xdb\xc7\x95\x62\x48\x17\x0e\x70\x81\x22\x50\x6d\x88\xf9\ \x5c\xa5\x1a\xd8\xa4\x59\xb6\x7d\xd4\xea\x65\xce\x32\xa4\xe7\x8d\ \xaa\x1c\x1e\xe8\xbb\xaf\xc9\x12\x37\xec\xd7\x9d\x17\x44\x50\xd9\ \xc6\x84\xc9\x28\xc7\x34\x21\xd7\xaa\xd4\xd2\x79\xc9\x20\x4c\x02\ \x45\x2f\x94\x56\xbf\xec\x5b\xfd\x85\x3b\x2e\x8a\xc0\x60\x81\x40\ \xef\xcf\x53\x0b\x25\x56\xb6\x81\x35\x8a\xc0\xa5\xc1\xc9\xdc\x0d\ \x7c\xc9\x06\xba\x9a\x2a\x8b\xe8\x51\xc5\x19\x69\xb5\xda\xae\x00\ \x4b\x38\xf5\x12\x08\x23\x5c\x05\x80\xc9\x1c\x56\x29\xe8\xa3\x9b\ \xf9\xe0\x4e\x0e\x38\x29\x84\x82\xba\x9f\xf2\xb9\x9e\x89\xb4\x64\ \x93\x73\xb1\xac\xec\xc3\x46\x5e\x3c\xc7\xa6\xa3\x62\x60\xbf\xe2\ \x5c\x87\xa6\x5a\xd5\x0c\x87\xc5\x8e\x40\x78\x7c\x25\xd5\xd5\x2d\ \xe2\xf0\x8e\x0b\xc0\x8d\x77\x63\x8c\xcd\xff\x3a\x6f\x71\x6a\x5e\ \x8f\xcc\x52\x1d\x11\x9a\x99\xe3\xf3\xa7\x07\xdc\xd9\xeb\xa3\x9d\ \xbe\x14\x1d\x5e\x07\x91\x9e\x8a\xdf\x2b\xa4\x07\x06\x18\x1a\xce\ \xba\x3f\x00\xb0\x56\x96\x1a\x78\xbc\x6b\xd1\x02\xeb\xc4\xf6\x46\ \x2c\xe1\x5e\xc3\x49\x28\x47\x3c\x81\x05\x76\xba\x88\x9c\x1b\x1b\ \x2c\x58\x29\x45\x31\x7d\xf0\xb2\x61\x54\x59\x30\x9c\x4b\xc1\xad\ \x82\x67\x8b\xf0\x41\x15\x72\x07\x48\xe1\xe4\xfd\xa4\xf0\xca\xe3\ \xa4\xb0\xf8\xb4\x75\x4e\x3f\x66\xfd\x0e\x6e\x2b\x86\x31\x1a\x4c\ \x28\xaf\x39\x02\x8f\xc2\x31\x65\x40\x5c\x05\xde\xea\xc8\x37\xb8\ \xad\x8e\xbd\x1d\x73\x0b\x5e\xe7\xa7\x3a\xd5\xc2\xec\x87\x7d\x2d\ \xb7\x98\xdd\x45\xf2\xa7\x7e\x41\x96\x0b\xaf\x93\x65\xdd\x90\x1f\ \xb8\x4f\xfe\xd4\x23\xf4\x6f\xc2\x04\xb2\x71\xac\x6d\x67\x25\xa9\ \x93\x52\xbf\x29\xbc\xe3\xd4\x20\x93\x4a\xf4\x72\x2b\xe6\x7d\x65\ \xd2\x8d\x96\x8f\x98\xb2\x91\x26\xe3\xdc\x14\x58\xec\xcb\xf7\x93\ \x65\x6d\xd9\x1f\x58\xf7\xd1\x2e\x90\x3c\x58\x35\x3e\x46\x28\xd4\ \x44\x2a\xfe\x0d\x36\x6b\xf6\x94\x98\x7f\x2b\x59\x30\x9d\xa3\x0c\ \xd8\x44\x8e\x47\xbb\xa6\x5c\xda\x19\xd5\x82\xc8\x6a\xc7\xba\x49\ \x7e\xe9\xf9\xda\x81\x75\x9d\xfc\xeb\x49\x08\xe7\x83\x0f\xc9\x41\ \x91\xfd\xb1\x52\x82\x4f\x2a\x25\x71\xce\x77\x23\x4d\xd0\x58\xd2\ \x4c\xe5\x70\x2b\xe3\xdc\x5c\xbc\x8a\x7c\xcd\xea\x5c\xa1\x14\x1b\ \xdb\x46\x96\xcf\xbf\x58\x37\xb8\x65\x90\xcf\xcd\xc3\x07\x16\x78\ \xa8\x6d\xd0\x52\x3f\xb6\xed\xaf\xfa\x6b\xc0\x00\xc8\x53\x17\x26\ \xab\x3e\x44\x8d\x25\xf0\x95\xce\x2f\xbd\xd0\x30\x70\x2b\x96\x9c\ \x08\xdc\x01\xea\x89\xf7\x6f\x8f\x81\x7a\x38\x50\x47\xaf\x00\x70\ \xf4\x55\x54\x15\xf0\x7a\xcb\xa4\xf4\x61\x1f\xca\xb9\x72\xb0\xfe\ \x0b\x27\xbd\xac\x99\xdf\xca\x6b\xe6\x27\xf1\x2c\xeb\xe6\x21\xf8\ \xdd\xa8\x7d\x9b\xf0\x6f\x0b\x2f\xfd\x20\x60\x1e\x56\x6f\x8b\xe9\ \x89\xf8\xb7\x9b\xf5\x04\xe5\xa4\xcf\xc2\x30\x3e\x19\x47\x2d\x0c\ \xc8\x1d\x9a\x61\x8c\xe7\x4d\xb3\x4f\x58\x2f\x34\xcd\x5d\xcb\x9a\ \x31\x29\x73\x7c\x41\xaa\x0b\x30\xde\x43\x18\x1e\xff\xaa\x69\x4f\ \x80\x29\x48\x50\x1e\x18\x46\xf3\x6e\xa7\x52\x4c\x68\x81\xe6\xaf\ \x09\x21\xeb\xfc\x8b\x03\x64\x1d\xdc\xf7\x09\xa1\x15\x9f\x7a\x38\ \x48\x0b\x7e\x0c\x15\xc4\x64\x20\x5e\x16\xf8\x51\xa8\x73\xc1\x72\ \xab\x01\xd7\x01\xb2\xc0\x92\xf3\x85\xa5\x20\xa5\xdb\x38\x02\x7c\ \x32\x10\x80\x73\x77\x08\x39\xf7\x5c\xb1\x74\x65\xad\x35\x44\xa0\ \x92\x7e\x11\x27\x17\x73\xb7\x07\x15\xd1\xfd\x35\x26\x0e\x91\x9b\ \x7b\x30\x28\x10\x00\x9c\x5e\x6d\x15\x1c\xa8\x62\x8c\x4b\x13\x27\ \xef\x0b\xca\x82\x17\x63\x0d\x1e\x00\xac\xfa\x60\x3e\x41\xc0\xbd\ \x87\xea\x00\xf8\x30\x97\x26\x4e\x3f\x1a\x14\xc0\x5a\xcc\x1e\x4f\ \x5d\x7b\x0b\x5e\x7c\x46\xc4\xbf\x9f\x58\x2d\xc0\x96\x84\xe3\x58\ \xf0\xe2\xd3\x41\x01\xfc\xef\xc0\x00\xc6\x37\xcd\xb5\x36\xc3\xb8\ \xb3\x0e\x80\x3f\xc5\x7d\xcc\xc5\xa7\x02\x05\xb8\x65\x28\x22\xaf\ \x9b\x77\x87\x8e\x22\x42\xe8\xe4\x46\xeb\xe0\xe0\x4c\xc8\x22\xba\ \x45\x0c\x34\x5e\x0a\xc4\x82\x73\x07\x84\x32\xed\x7c\xb1\x34\x58\ \x73\x17\x68\xa1\x34\x20\x94\x69\x33\xb7\x06\x27\xd3\x42\x1a\x68\ \x4c\xd4\x12\x68\xbc\x4c\xc8\x65\x17\x74\x63\x2a\x94\x81\x46\x33\ \x43\x65\x5f\x9a\x38\xf5\x88\x2c\x54\x7e\xa2\x1a\x90\x11\xdc\xbc\ \xae\xff\x46\x1c\x2a\x3f\x24\x0c\xe3\xe9\x84\x53\xb6\xbb\xb9\xa1\ \x72\x33\x93\x3d\xbe\x56\x9c\xdd\x45\x13\x32\xe2\x64\x8d\x31\x89\ \x5f\x7d\x11\xb8\x18\xf1\x89\x2c\x97\x9e\xe2\x79\x52\xcc\xf4\xf3\ \xde\x78\xa5\x69\x1c\xf3\xd8\xcd\x4c\xf6\xd4\x97\xae\x6c\xaa\xb3\ \x63\xd2\x95\x18\xa1\x99\x87\x51\x86\xd1\x43\xd5\x02\x75\x68\x3e\ \xe9\xca\x7b\x05\xd6\xdb\xe5\xec\x3e\xe2\x14\x19\xb0\x3c\x66\x15\ \x70\xd5\xfa\xd2\x95\xf5\x24\xdc\x1b\xd3\xcf\xd5\xd1\x90\x52\x91\ \x87\x7b\x97\x9e\x15\x56\x50\xfc\x0a\x01\x58\x3c\x28\x97\xb9\x32\ \xdd\xf5\x25\xdc\xfd\x4a\x46\x6b\x42\x15\x63\x3d\xb4\xcc\xd3\xb8\ \x92\xd1\x1c\xad\xf1\x89\xba\xed\xd9\xe6\x44\x77\x21\xc0\xa2\x0f\ \xa6\x4d\xc1\xdd\x15\x8a\x75\x46\xf8\x80\xcc\xdc\x87\xfc\x06\xd8\ \x8d\xf2\x74\x28\xc8\x89\x3f\x07\x5e\x24\xa4\x45\xcf\xe7\x1a\x50\ \x2a\x3a\x26\x2d\x7a\x1a\xc7\x2b\x55\xf2\xd2\xdc\x90\x4f\x1d\x71\ \x9f\xb4\xc9\x86\xdb\x00\x59\x29\x7a\xfe\x81\x69\x9b\x52\xef\x0a\ \x47\xfb\x67\x07\x0d\x0a\xa4\x8e\x4f\xe2\xd0\x28\xe7\x4a\x7a\xdc\ \x74\x6c\x1e\x67\x1b\x60\xc6\x7b\xbd\x1f\xc0\xcc\x1e\x06\xc0\xdd\ \x9c\xfe\xe8\x6b\x98\x2a\xf9\xa0\xc4\xc1\xc5\xbf\xee\xde\x52\x12\ \x9e\x41\x3f\x50\x17\x85\xd3\x3f\xa7\x1a\xd6\xd7\x62\xe1\x3e\x28\ \xc5\x78\x6a\xc1\x79\xda\x88\x39\x7b\xbd\xb3\x6f\xd9\xed\xc0\xd2\ \x9d\x8e\xee\x7d\x6f\xff\x73\x9b\x93\x5e\xc6\xb6\x48\x1c\x5c\xfb\ \x0e\xd7\x4c\x86\xa8\x2f\x38\x48\x8b\xde\x40\x93\xe5\x68\xd5\xb4\ \x5d\x8a\x6d\x9d\x82\xdf\x15\x67\x6e\xab\x2e\x88\x00\x1a\x30\x18\ \xcb\xa3\x0d\x8c\x9c\x8e\x7b\x54\x0d\xce\x0f\x80\xd7\xb9\x7f\xa9\ \x89\x66\x58\xa6\x30\x5e\xf5\xcc\x6c\xc0\x2f\xbf\xdf\x9a\xf3\x13\ \x6d\x2e\x70\x05\x43\x3b\x60\xbd\xac\x73\xe3\xb5\xdf\x62\x60\xe2\ \x98\x64\x15\x3f\xef\x77\xbd\xed\xab\xc7\xe2\x5d\xa2\xf6\xd5\xc8\ \x1e\x1c\x94\x64\x68\xc1\x92\x65\x57\x0b\x66\x4f\xae\x65\xac\x77\ \xc8\xdb\x64\x93\xde\xe8\x68\x60\xd4\xc4\xf4\xb0\x22\x5c\x47\x13\ \x86\xc5\x71\x8d\xe9\xcf\x6d\xa7\x0e\x88\xe5\xd3\x0a\xb8\xaa\xbc\ \xfd\x56\x30\x7b\xe2\x68\xe1\x85\x0f\x4d\x36\xd2\x25\x59\x57\xa0\ \x1c\x8c\x6c\xeb\x3e\x9d\x54\xea\xb2\x82\x08\xd7\xae\x0a\xb4\x3c\ \xd1\x2c\x1f\x8e\xa5\x61\xdf\x86\x7c\xf6\x64\x83\x43\x7d\xe8\x13\ \xdb\x65\x19\xb4\xcf\xc8\x57\xc5\x00\x41\x47\x0e\x5c\xd4\xae\x0b\ \xc3\xfc\x5d\x40\xe0\xac\x84\x23\x64\x94\x77\x99\x29\x54\x3a\x96\ \xd6\x21\x6d\x80\x2c\xcd\xdd\x20\x76\x6e\xd8\x17\xec\xb7\xb2\x11\ \xee\xf8\xd5\xa8\x01\x6c\xba\x9c\xd8\x25\x20\x70\x70\x47\x08\x06\ \x4a\x32\xb6\x6f\x19\x67\xad\x39\x1f\x84\x23\x6f\x21\x9c\x3d\x29\ \xef\x91\xf8\x52\xb5\x83\x88\xe7\xa2\x65\xc1\x3d\x96\x02\x00\x6b\ \x44\x8a\xf0\x1d\x2e\x1f\xdb\xec\x9a\x9f\x16\xcc\x5a\xa7\xda\xe8\ \x52\x91\xf2\xb7\xe1\xc4\x75\xb2\xd7\x71\xb6\xea\xc9\xfb\x62\x32\ \xfe\x85\x96\x1d\x79\x45\x87\xb6\xb0\xdf\xc9\xcf\x13\xbd\x55\x0c\ \xed\x8c\xd0\x48\x50\xa2\xb5\x3f\x5d\xe3\x30\x78\x3c\xd3\x52\xe0\ \x42\x40\xe2\xa1\x12\xba\xdf\xa2\x5b\x30\x17\xd8\xe7\xa4\x86\x89\ \x7e\xd9\xb2\xa4\x89\x9a\x97\x8b\xe2\x8c\x81\x70\x9d\x41\xa4\x24\ \xdb\x06\xda\x62\xeb\x9e\xfa\x47\x87\x86\xab\x16\xf8\x56\x0e\x94\ \xc3\x0e\xbc\xcb\xb7\x12\x5e\x5c\xf5\x52\x51\x5c\x36\x11\x59\xc9\ \x96\xe9\xa6\x89\x1b\xb7\x16\x2e\x4b\x31\x41\x52\x08\x97\x8a\x38\ \x64\x1e\xaa\x86\x54\xbb\x24\x6b\xa6\xde\x57\xd7\xe6\xea\x28\x05\ \x1f\x74\xdc\x01\x93\xe5\x6e\x6b\x2d\x6f\x07\x18\xb2\x46\x75\x85\ \xfc\xdc\xe3\x04\x77\xe1\x26\x1a\xc1\x49\x9e\xf3\x44\xdd\xcb\xea\ \xcc\x54\xc7\xa6\xa0\x9a\x53\x6a\x1e\x9d\xe2\xc9\x35\x3b\xf2\x32\ \xb2\xf2\xf5\x8d\xc6\x64\x9f\x6b\x05\xc3\xb0\x70\xd6\xda\xee\xee\ \x37\xeb\x5e\x8a\x54\x59\x02\xaa\xde\x12\x85\x3c\x85\x31\xb5\xdb\ \x91\x2c\xb7\x86\xcb\x7d\xf6\xb6\x81\x14\xf3\x8c\xf8\xa2\xe5\x4a\ \xc1\x55\x56\x70\xeb\x6c\xa3\x17\xd3\xdd\x13\x81\xfd\x92\x54\x15\ \x88\x9c\x17\x2f\x88\xc0\xa5\x22\x4e\xe7\x37\xe4\x47\x0b\x98\x4c\ \x3f\xdc\xa4\x75\xb6\xf1\x1f\xb5\x8a\x64\x33\x78\x5b\xb0\x50\x2d\ \x48\x1c\x1a\x75\x6a\x29\xe5\x67\x4d\x5d\x0e\xaa\xa5\xe2\xbf\x8b\ \x6c\x90\x31\xda\x69\xd3\xc8\x88\x77\xbd\xd8\xe4\x40\x15\xf3\xd3\ \xf1\xdf\x36\x7d\xcd\x2d\x7a\x4d\x5c\xf5\x1a\xa5\x84\x3b\x86\xc1\ \x56\x29\xde\x2b\xd9\x30\xfc\x95\x46\x68\x2c\xb8\x6b\xb5\xdb\xdd\ \x2e\x31\x3d\x18\xe2\xdd\x39\x34\x24\xa6\xaa\xc2\x93\xba\x64\x92\ \x41\x55\x6e\xc1\x02\xad\xfb\x93\x40\x2e\xd7\x83\x5b\x48\xc3\xa8\ \x2e\x4c\xcf\x56\x15\xa7\x64\xd3\xc7\x77\x54\xdb\xb1\xb3\x82\x17\ \xa1\x0a\x76\x8f\x7b\x52\xbd\x35\x6c\x3a\xd9\xb3\xc3\x78\x61\xd8\ \xaa\x66\x48\xaa\xc0\x9c\xf3\x26\x6e\x9d\x0d\xc5\x95\x08\x30\x18\ \x09\x53\xc4\x87\x6b\x6a\x30\x4c\xc6\x55\x0c\x96\x0e\xae\xb5\xbf\ \x4c\x9d\xc3\x2b\x85\x85\xee\xba\x45\x76\xee\x22\xca\x09\xa2\xb7\ \x30\xb7\x80\x29\x82\xd0\x5e\x11\x06\x17\x02\xe1\xb5\xdc\x22\x08\ \xee\x38\x2e\x44\x8d\xc4\xf5\x8c\xec\x1d\x40\x07\xf1\x3a\x6e\x11\ \x00\xf6\x2c\x16\x2a\x23\x73\xb1\x28\x77\x36\xce\x5e\x76\x77\x3a\ \x84\xc0\x2e\x62\x4f\xde\x52\xe6\xf2\xf7\xc6\xa2\xfe\x83\x95\x56\ \xdc\x88\xa7\x59\x57\xe9\x0a\x52\xd6\xad\xd0\x99\x14\xb4\xd8\x56\ \xbd\xee\x27\x2a\x0e\x7a\xc9\xc9\xb5\xbd\x88\xdf\x59\xbc\xe4\x24\ \x76\x2f\xc5\xde\x4e\x3f\xec\x45\x53\x8b\x49\x45\x6f\xe0\x05\x45\ \xfe\xe9\xb8\x68\x6a\x14\xf9\xb5\x19\x89\x24\x6c\xb9\xc7\x3c\x2b\ \x02\x83\x13\x3a\xf6\x88\xd9\x5f\x34\x7a\xd9\x5f\x1a\xcc\xd8\x97\ \xfd\xa5\xff\x3e\x63\xdf\x06\xf7\x89\x3f\x8a\x03\x27\xf4\xca\x60\ \x2f\xac\xdf\x16\xa6\xab\xd0\xfe\x0f\x28\x9b\x6a\x20\x57\x4c\x68\ \x5f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\x8d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\x93\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\x80\ \x00\x80\x80\xaa\xe3\xc6\x1c\x80\x80\xb3\xeb\xb1\x14\x70\x80\xbf\ \x78\x87\xc3\xf1\xb8\x1c\x6f\x85\xbc\xe9\xbc\x16\x72\x84\xc1\x75\ \x83\xc1\x71\x82\xbe\x74\x85\xbc\x72\x82\xbe\x71\x84\xbd\xeb\xbb\ \x18\x74\x83\xbd\xeb\xbb\x14\x73\x83\xbf\xec\xba\x16\x73\x82\xbe\ \xea\xb9\x17\x72\x83\xbf\x73\x83\xbf\xea\xba\x17\xea\xb9\x16\x73\ \x83\xbf\xec\xba\x17\x73\x83\xc0\x73\x83\xbf\xeb\xba\x16\x74\x83\ \xbf\x73\x84\xbf\xeb\xba\x15\x72\x83\xbf\xea\xba\x16\x73\x83\xbf\ \x73\x83\xbf\x73\x83\xbf\x73\x83\xc0\x73\x83\xbf\x73\x83\xbf\x73\ \x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x7b\x5c\x8a\xc2\x00\ \x00\x00\x30\x74\x52\x4e\x53\x00\x01\x02\x06\x09\x0a\x0d\x10\x11\ \x12\x17\x17\x1d\x25\x2b\x2e\x2f\x36\x40\x42\x4b\x50\x5d\x66\x87\ \x88\x90\x93\xa1\xa4\xaa\xb1\xb3\xb6\xb7\xb8\xbf\xc4\xc7\xcf\xda\ \xde\xe5\xe8\xec\xf3\xf8\xfc\x6b\x06\x24\xb6\x00\x00\x00\x79\x49\ \x44\x41\x54\x18\xd3\x63\x60\x20\x17\xf0\xf0\x63\x13\x15\xd0\xd6\ \xc4\x22\x2a\xa8\x63\xa0\x85\x29\x2a\xac\x6b\x80\x45\x58\x54\xcf\ \x00\x4d\x98\x57\x5c\x5c\x5c\x52\xdf\x00\x2c\x2c\xcd\x02\x17\x96\ \x37\x80\x01\x2d\x06\x31\x09\xb8\xb0\x32\x92\x30\xa3\x1a\x13\x36\ \x61\x06\x39\x6e\xac\xc2\x8a\x6c\xd8\x84\x39\x55\xe0\x66\x4b\x21\ \x09\xcb\x88\x20\x5c\xc8\xce\xc1\xc1\xa7\x01\x11\x16\x42\xf3\x0e\ \x97\xba\x01\x36\x5f\x32\xb0\xab\x62\x15\x66\x60\x55\xc2\x2a\xcc\ \xc0\x2c\xab\xc0\x40\x55\x00\x00\x65\x02\x15\x11\xa8\x3c\x8c\x7f\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0e\xbd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0e\x84\x49\x44\x41\x54\x78\xda\xed\x5d\x0b\x98\x55\x55\ \x15\x9e\x22\x29\xcd\x9c\xc2\x30\xb5\x44\x33\x42\xb3\x07\xa8\x59\ \x22\x3e\x10\x50\x19\x5e\x32\xcc\x3d\x77\x06\x10\x50\xd4\x49\xd4\ \xb4\xb0\xc4\x47\x29\x1a\x22\x90\x0f\x02\x45\x54\x84\xa1\x52\x08\ \x41\x14\x45\x3f\x02\x44\x30\x08\x45\xf0\x95\x2f\x18\x81\x7c\xf0\ \x50\x40\x05\x86\xd7\xe0\x9c\xd6\x3e\x77\x9f\x7b\xd7\xde\x9c\xbd\ \xd6\xba\x73\xee\x1d\x67\x68\xee\xf7\xed\xef\xe2\xdc\x75\xf6\xe3\ \xdf\x6b\xaf\xf7\x3e\x16\x14\xd4\xa3\x8f\xdf\xab\xd7\xd1\xbe\xe7\ \x15\xfb\x89\xc4\xb5\xf0\x3d\x01\xda\x22\x68\x6f\x43\x7b\x0f\xda\ \x16\x68\x9f\x43\xdb\xa3\xff\xbd\x0e\xda\x2b\xd0\x9e\x84\x36\x0e\ \xda\x95\xf0\xdc\x19\xf0\x5d\x58\xd0\xf8\xd1\x80\xf6\xee\xfd\x6d\ \x00\xa5\x3f\x80\x32\x09\xda\x1a\x68\x7e\x0e\x9a\xda\x84\xe5\x7e\ \x32\x39\x12\xfa\xee\x08\xff\x6e\xf2\xff\x05\xea\x85\x17\x7e\x0d\ \x16\xee\xc1\xc2\x67\x69\x6e\xf4\xf3\xdc\x3e\x02\xb0\xef\x85\xef\ \xb6\xfb\x3b\xb7\x7e\x07\x16\x3a\x1c\x16\xfa\x09\x01\x86\xfa\x6d\ \x36\xd0\xdd\x01\xdf\xe5\xb0\x11\xed\xfd\xd2\xd2\x1f\x04\xcf\xf6\ \xe8\xf1\x8d\x74\x5f\x7d\xfb\x1e\x02\xbf\x37\xf7\x4b\x4a\x7e\x06\ \x34\xdd\xa0\xfd\x1a\xda\x03\xf0\xb7\x65\xd0\x76\x13\xfd\x2f\xd3\ \x27\xa6\xe9\xfe\x03\x6c\x49\xc9\xb1\x5a\x46\xee\x74\x1c\xe7\xe7\ \x60\xd1\xd7\xc0\xf7\xc9\xb9\x38\xce\x7e\xf7\xee\x07\x41\x3f\x9d\ \xf5\x26\xb9\xc4\xce\x1a\x18\xf3\x22\xbf\x7d\xfb\xaf\x34\x5c\x60\ \x41\xd9\xc0\x22\xee\x72\x88\x81\xb7\xe0\xb7\xeb\xe1\xbb\x45\x5e\ \xe7\x50\x50\xf0\x25\x25\x1a\x60\xac\xfb\xe0\x7b\x5b\xc4\x3c\xde\ \x84\xd6\xa1\x61\x01\x3b\x74\xe8\x97\x81\x7b\x06\xc2\xc4\x37\x44\ \x2c\xe8\xf9\xe0\x48\xc3\xc2\xeb\x7c\x5e\x3d\x7b\x7e\x53\x9f\x94\ \xf5\x11\xf3\x7a\x58\x89\x9c\x86\xc2\xb9\x4f\x46\x2c\xe0\x9f\xd0\ \x4e\xaf\x17\xf3\x53\x22\x24\x65\x06\x6e\xb1\xe6\xb8\x1e\xfe\x7e\ \x6e\x7d\x07\xf7\x40\x2d\x57\xc3\x49\xbf\x0b\xdc\xdc\xb3\x5e\xce\ \xb5\xb8\xf8\x30\x00\xb4\x02\xe6\x58\x83\xe6\x5b\x03\x7f\x1b\x51\ \xaf\x4d\x3b\x00\xf4\x06\x2d\xdb\x6e\x54\x26\x59\x2d\x94\xe2\xf1\ \xb0\xc8\x4b\xa0\x9f\xf1\xd0\xc7\x1c\x68\xef\x40\xdb\x65\x71\xdb\ \x1e\xed\x68\xbc\x08\x74\x0f\x42\xbb\x42\x3d\x57\xab\xf9\xa6\x6c\ \xe5\x0f\xac\xfe\x9f\xc4\x56\x4b\xc3\xb6\x32\x80\x5b\x00\xa0\x4e\ \x9a\x9b\x36\xc6\xb4\x79\xff\x0b\xfd\xfc\x59\x99\x6f\x59\x72\xf3\ \xa1\xf0\xec\x4c\xab\xaf\x57\x95\x79\xf8\xc5\x01\x93\xd2\xd0\x4d\ \x63\x1d\x51\xcf\x1b\x06\xed\xc3\x2c\x00\xac\xd6\xb2\xb3\x46\x40\ \xbb\x18\x5a\x42\x7a\xdc\x83\xf5\x24\x93\x43\x2c\x11\xf7\x0e\xb8\ \xef\xdf\xfb\xa2\x6c\xdb\x77\xa1\x6d\x57\x47\x2c\xcb\x78\xc3\x11\ \xf0\xcc\x3d\xf0\xec\x0e\x07\x30\xca\xfa\x98\x01\x8b\xfd\x2d\xd0\ \x15\x81\xa3\xf1\x23\x25\xdb\xf7\xe1\x7a\xcf\x3b\x1c\xda\x59\x40\ \x77\x15\x7c\x4f\x27\x1c\x98\x37\xb2\xd1\x03\x30\x66\x99\xe5\xac\ \x54\xaa\xb1\xea\x56\x39\x78\xde\x2a\x34\x81\xb1\xa2\xe7\xca\xcb\ \x0f\x00\xda\xc1\xd0\x3e\x8b\x00\xe1\x7d\x68\xa3\xa0\xb5\x89\x25\ \x6a\x94\x83\x91\x32\xb9\x76\x45\x8c\xf1\x9c\x54\x4e\xc3\x86\x74\ \xb1\x1c\xa3\xd7\x94\x99\x97\x7f\x70\x41\xf0\x07\x81\x94\xcc\xc0\ \xdb\x80\xc3\x5a\xb3\xcf\xa5\xb8\xf0\x15\xa7\x5d\x0c\xb6\x73\x8e\ \xe5\xfa\xe1\x5a\xfc\xd8\x9b\xb9\x2b\x50\xbe\x02\xb1\xa1\x37\x0b\ \x3b\x49\x73\xf2\x6a\x5d\x28\xb7\x12\x06\x98\x87\x06\xdc\x29\xf1\ \x82\x80\x1b\x2e\x05\xba\x2a\x6b\xa1\x2f\xab\xe3\x5d\x27\xd1\xba\ \x64\x72\x8c\x96\xdd\x26\x37\x0b\x64\x2b\x3c\xdb\xdb\x90\xc9\x89\ \xc4\x6d\xf9\xd4\xf6\xa3\xac\x18\x42\x0f\x81\x47\x77\xb7\xb5\xb0\ \x6d\x81\x49\x55\xc7\x76\xa6\x12\x3d\x81\x49\x67\xcb\xfa\x44\xe2\ \x34\xc1\xb3\x37\x5a\x76\x72\xb7\x7c\x4c\xb0\xab\xa1\xb9\xc1\xd6\ \x65\xe8\x9b\x6a\xc5\x83\x17\xf4\x12\x88\x8a\x56\xb1\xc2\x9c\x9e\ \xd7\x0c\xda\xc1\x31\x4e\xe0\x2d\xd0\xf6\x5a\x22\xa3\x8f\xc0\x5a\ \x7a\x0c\x3d\xf3\xb1\xd2\x43\xb9\xf5\xe1\x4d\x53\x6a\x06\x15\x4b\ \xd0\x0b\x99\x61\x80\x9b\x48\xfc\x2d\x5b\x93\x0e\x9e\x39\x1f\x36\ \x72\x1a\x3c\xf7\x7a\x44\x08\x72\xb7\x76\x34\x16\xeb\xa8\x59\xb1\ \x12\x07\x59\x38\x16\x9f\x18\xa7\x31\x91\xf8\x95\x00\x83\xb5\x68\ \x3d\x8f\xe4\x0e\xe0\x54\x9c\x35\x9c\x8c\x5a\x54\x33\x72\xb7\x53\ \x60\xfa\x88\xdb\x87\x67\x1b\xdc\x09\xe2\xbf\x26\xa7\x49\xda\x9e\ \x80\xd3\x94\xd2\x64\x44\x10\x9c\xa4\x9f\xe8\x34\x54\xe6\xe8\x7b\ \xde\x20\x46\x1e\x77\x32\x4e\x31\x98\x90\xf1\xc1\x2d\x2d\x3d\xc9\ \x10\xf2\x60\xbe\x08\xdc\x64\xcc\xb9\xb7\xc6\xb0\x56\x36\x59\x00\ \x7e\xa6\x4f\xd2\x27\x02\xb0\x57\xc1\xd8\xbd\x58\x7b\xdc\xf3\x56\ \x58\x9c\x5c\x96\x05\xb3\xbd\x11\x3b\x9e\x1c\x68\x5b\x24\x1a\x18\ \x70\xcf\xb3\xb8\x6e\xb4\x40\xb6\x75\x80\x76\x82\x63\xec\x16\x0a\ \x24\xb0\x5d\x4f\xb4\x63\x1a\x81\xcd\x9b\xb2\xc7\x3b\x6b\xb9\xba\ \xd0\xf2\xc0\xc2\xb6\xd0\xd5\x7f\x3a\x66\xed\x79\x2f\x18\xa2\x87\ \x50\x7c\xda\xa5\xde\x82\x18\xee\xb2\x38\xa2\xa1\xa3\x31\x70\x49\ \xc9\x0f\x89\x89\x36\xb3\xe2\xac\xa4\xcd\xa8\x65\xda\x4c\x24\x4f\ \x4f\xc8\x81\x22\xfe\xbe\x3a\x31\x41\x0e\x6e\x5f\xcb\xa5\x37\x69\ \xca\xa5\x82\x53\x99\xb0\xa5\xe7\x7d\x97\xc0\xe5\x1a\xcb\x41\x6a\ \x5a\xdb\x09\xcf\x43\x3b\x35\x86\xd9\x0c\x2c\x77\xd7\x92\x72\xba\ \xac\xec\x28\x6b\x41\xaa\xff\xb3\x73\x68\xf1\x14\x06\x19\xe5\x7d\ \xbd\xb9\xd1\x2e\x87\x26\xd8\x1c\x65\x1d\x64\x68\x9f\x75\xd2\x16\ \x15\x7d\x55\x03\x1b\x8a\xc1\x8b\x6a\x6b\x37\x62\xe5\xd1\x82\xa0\ \xed\x60\x29\x8b\x73\x18\x37\x7b\xb5\xb5\xf0\x51\x79\xb2\x7d\x8f\ \xd3\x16\x08\x1e\x6b\x9c\x4b\xe1\xaa\x4d\x36\x1c\x12\xe0\x54\xa2\ \xef\xc1\x58\x16\xd7\x46\x3c\xdc\x83\xb8\x6b\x32\x23\x47\xb1\x01\ \x3f\x81\xb1\x63\x97\x18\x91\xb1\x44\xe2\xf2\xbc\x3a\x18\xfd\xfa\ \x7d\x5d\xc7\x26\xb0\xe2\xbd\x8b\x58\xf7\xad\x88\x76\x07\x9c\xb6\ \x63\x1c\x00\x1f\x6c\x65\x44\xda\x66\xb3\xf3\x07\x1a\x9a\x3a\x99\ \x6c\x47\xd0\x26\x0c\x59\x47\xc4\x4f\x95\xed\x68\x9c\x8a\x3a\x4a\ \xcf\xe8\x30\xe4\x78\x8b\x93\x2f\x24\x02\x52\xcb\x25\x8a\x5d\x67\ \xca\xc3\x4d\xbb\x2f\x9b\x8c\x44\x4f\xc3\xdc\xa1\x9c\x0a\xcf\x5b\ \x8a\x68\x6f\x21\xfa\x4c\x5a\x32\xf7\xb2\x82\x3a\xfc\x04\x6e\xbb\ \xa9\x27\x54\x86\xb9\xa5\x23\x14\xfb\x4b\xcb\x22\x69\xeb\x58\x53\ \x3b\x44\xb3\x51\x1c\xb0\xd2\x35\x61\x3c\x68\xa9\x89\x84\x74\xdb\ \xfd\x3e\x7d\xbe\x45\x1c\xa7\xf7\xa5\x0a\x33\xe2\xf9\x96\x41\xfc\ \x42\x29\x2e\x10\x57\x7a\x7e\xc3\xb2\xf1\xde\x90\x72\x7a\x15\xcd\ \x79\xa9\x53\x91\xa5\xc6\x09\xe9\x9e\x26\xc4\x63\xc6\xc3\x2d\x2d\ \x3d\x45\x9a\xa5\xc8\x98\x5b\x00\x22\x71\xe4\x1f\x92\x1c\x11\xad\ \xd1\xc3\xc9\xbe\xa7\xe4\xa2\x88\xe3\x3c\xaf\x5f\x84\x92\xf2\x23\ \x5c\xe6\xe9\xd2\x38\xb2\x32\x07\x8d\x40\x3f\x9c\x2c\xe7\xa6\x62\ \x85\x07\x9e\x9f\x63\x6d\x13\x51\x5f\x7f\x94\x4e\x20\x53\xd3\xe5\ \xda\xe1\x94\xac\xc2\x9e\x56\x1b\xc2\x23\xdb\x8a\xe8\x12\xc2\xd8\ \xf1\xab\xb5\x28\xf8\x1b\xab\xb8\x54\xb0\xc6\x9b\xac\xc2\x93\x26\ \x0e\xf0\xa6\x20\xf0\xee\x16\x88\xbe\x67\x24\xd6\xc3\x25\xe8\x81\ \xe9\x04\xdd\xb9\x88\x6e\x25\xb1\x98\x41\x88\xee\x45\x81\xfc\x57\ \xde\xe0\xa7\x11\x2e\xf2\x54\x9d\x42\xea\x0b\xdf\x03\xa0\x0d\xd5\ \x5e\x9a\x9d\x9b\x5b\xca\x65\x1e\x74\x5d\xdb\x26\x04\x5e\x6f\xc7\ \x1a\xdb\x1b\xcc\x16\xb1\x11\xca\x21\x31\xea\xea\xb8\x98\x8b\x21\ \x7f\x93\xc9\x21\xa2\xd8\x70\x22\x31\x82\xa0\xc3\xbe\xfe\xc5\xcc\ \xd8\x27\x5b\x79\xba\x4f\x83\x24\x64\xf7\xee\x07\x11\xdc\xde\xca\ \x0a\x25\xfa\x5a\xf1\x1e\xc8\x8c\x75\x1d\xf6\x3a\x09\x71\xb9\x96\ \x13\x97\x96\x1c\x6e\xc5\x01\xfc\x6f\x34\x70\x07\x82\x6e\x09\xda\ \x88\xf3\x08\x43\x3f\xc3\x85\x84\xec\xd5\xae\xf3\xfb\x86\xf5\x92\ \x45\x9d\x83\x0a\x37\x1a\x71\x10\xb0\xe3\x49\xfa\x94\xc3\x13\xca\ \xd8\xbd\xae\xa4\x26\xfc\xfd\x7e\x4e\xc6\xc2\x6f\x4f\xa0\x79\xf7\ \xe3\x00\xde\x9c\x26\xee\xd5\xeb\x08\x22\x98\xbe\x0b\x4d\xae\x90\ \x48\x15\x85\x03\x4f\x65\xc6\xbd\xdd\x38\x8e\x0e\x03\x5f\x90\x9a\ \xca\x78\x94\x8c\x56\x07\x9a\xb9\x08\xbc\xab\x1c\x7d\x96\xa0\x3e\ \xff\xe5\xd8\xdc\x3f\x88\x36\x56\x07\x6c\xc2\xce\xaa\x9c\x2e\xa5\ \xc9\x99\x2b\x45\xf1\x09\xc2\x63\xd3\xe3\x56\x21\xda\x5e\x31\x02\ \x54\xff\x40\x73\x7b\x8a\x01\xf8\x62\x44\xbb\x80\x38\x59\xd5\x69\ \xcf\x33\x42\x5c\x69\xbd\x11\xf6\xf3\x02\xa5\xbd\x5b\x23\xc2\xd7\ \x09\x4e\xe9\x22\xd1\x9c\x46\xcc\x81\xa8\xb4\xd1\x95\x98\x69\x45\ \x18\xa7\xf2\x52\x07\x6d\x32\x47\xbf\xac\xec\x48\x82\xb6\x39\x52\ \x92\x55\xae\xa8\x98\x4e\xd0\x3a\xe5\xb0\x0e\x61\x86\xf3\xdf\xea\ \x9c\xbf\x15\xb4\x99\x2f\xb4\x0c\xc6\x11\x0a\x62\x0f\x12\x23\x4d\ \x88\xfe\xb0\x0c\xbb\x32\x07\x41\x9e\xd9\xa8\xbf\xc1\x0c\xed\x3b\ \x48\x41\x9d\xea\x38\x15\x15\xa8\xbf\x72\x47\x3f\x1b\x38\xd1\x5a\ \xa0\xef\x4d\x84\x1d\x3d\x2a\xd4\xc0\xc3\x88\x18\x6b\x3a\xbe\xca\ \x2c\x72\x25\xa2\x3d\x8e\xb1\x91\x5b\xb1\x66\x58\x32\x79\x81\xe8\ \xc8\xda\x8e\x82\xe7\xfd\x9e\x8d\x9c\x25\x93\xf7\x3a\x68\x16\x21\ \x11\xd7\x5e\x62\x03\x4f\x20\x00\x19\xc6\x99\x72\x70\x94\x7e\x8c\ \xfa\x7a\x85\xf1\xd8\x76\xa7\x9d\x05\xc2\x51\xd0\xe9\xfe\xd0\x26\ \x6d\x4e\xcc\xef\x60\x43\x09\x3b\x5c\xf8\x88\x35\xcf\x10\x24\x1e\ \x9e\x67\xcd\x5b\x57\x02\x35\xb8\x74\x92\x01\x6e\x3c\x31\xa9\x11\ \x5c\xcc\x14\x7e\xfb\x05\x37\x29\x24\x4a\xc2\xc0\x4a\x35\xc3\xe9\ \x0f\xa3\xf9\x0d\x60\x68\x17\x22\xda\x9e\x44\x3c\xe5\x44\x34\xcf\ \xff\x38\xfa\x3a\x1c\x27\x7d\x1d\x9b\x3f\x84\x0d\x87\x1a\x00\x53\ \xb1\x05\xd3\xd5\xbc\x49\xe0\x72\xaf\x60\xc0\xc8\x94\x37\x51\x4e\ \x05\x1c\x61\x34\xbf\x07\x18\x6b\xe2\x66\x44\xfb\x17\x86\xdb\x71\ \x8d\x44\x13\x07\x13\xec\x48\x9b\x7f\x11\xa7\x2c\x08\x3c\x65\xfa\ \x99\xcd\xdb\x91\x14\x07\x9b\xd1\xfc\x51\x44\x5a\x28\xed\x34\x30\ \x00\xbf\xce\x29\x1a\x4d\x77\x3a\xc7\x6d\x0e\x37\x77\x09\x33\x7e\ \x46\x41\xb9\x03\xec\xb8\xd8\xb1\x25\x23\x12\xdf\x70\x4d\xaa\x3f\ \x2e\x14\x11\x29\x11\x47\x01\x86\xb6\x1f\xc3\x01\x37\x31\x8a\x66\ \x3c\xda\xd8\xdf\x31\x89\x80\xea\xb4\xbc\xa6\xb8\x3d\x15\x6f\xa8\ \x49\x87\x52\x89\x58\xad\x72\x20\xd0\x5c\xcf\x71\xd0\xcc\xa7\x3c\ \x5c\x9d\x39\x49\xc7\x9a\x5d\x0b\xed\x8e\x88\x66\x11\x13\x6a\x2b\ \xd1\xd2\x46\x40\xc5\x65\xba\xa4\xe8\xfa\x49\x02\x4c\x9a\xf6\x2d\ \x64\x93\xfe\x9c\xa1\x7d\x57\x62\x9d\x18\x66\x18\x28\x3d\x47\x5f\ \x93\x38\xf9\x6f\x64\x81\xa2\x2c\x1d\x2b\x42\xbf\x90\x31\xd0\x33\ \x11\x24\x77\xa6\x76\x2e\xa2\xeb\xca\x04\x6c\xd2\xf1\x62\x86\xdb\ \xa7\x49\xb3\xb9\x46\x10\x08\x4c\x50\x91\x9b\x9e\x48\x5c\xcf\xd2\ \x38\x4e\x59\x50\x43\x9c\x59\xc7\x4f\x5d\x71\x58\xd6\x05\xd6\x9d\ \xbd\x27\x08\x46\x8f\xe4\x94\x21\x52\x22\x5b\xd3\x4a\x84\x0a\x0a\ \x99\x0a\xf6\x4e\x66\x8e\xc3\x38\xe0\x34\x07\x5f\xc3\x59\x00\x86\ \x82\x4d\x26\x87\xb3\x0e\x4e\x54\x05\x94\x96\x5b\x99\xda\x5f\x2a\ \x17\x87\x13\x98\x8e\xfc\x9a\x15\x8c\x7e\x9a\x01\x03\x07\xd8\xa9\ \x4a\x9c\x52\x44\x37\x93\xe1\xf6\x81\x08\xb8\x87\x08\xba\x01\x68\ \x2d\x7f\x17\xc4\x2d\xee\x17\xe8\x92\x81\xae\x05\xe0\xe2\x8b\xe6\ \x04\xc0\x97\x73\x91\x32\x55\xe0\x6c\x05\xcd\x29\x77\x79\x96\xa4\ \xfe\x4d\xc9\x5d\x5c\xd6\xcf\x00\x7c\xa6\x50\xe4\x75\x65\x63\xc3\ \xa6\x19\xf6\xa8\x03\x93\x22\x1d\x16\xd8\xee\x3a\xd5\x76\x96\xb8\ \x2d\x93\xd6\xe1\x53\x4b\x38\x60\x1d\x25\x97\x32\x74\x63\x59\x4f\ \x28\x8b\x88\x5f\x44\xb6\x61\x2d\x41\x87\x9d\xa2\x97\x1c\x34\x67\ \xe1\xaa\x1f\x67\x5f\xca\x3c\xa5\x6a\x87\xd5\x11\x41\x9c\x74\x29\ \x73\xac\x3f\x40\x72\xb8\xb5\x83\x66\x86\x24\x18\x6d\x38\x06\x7c\ \x71\x77\xa6\xe0\x83\xaa\xc3\x48\xd5\x29\x87\x5e\xe2\x4e\xa2\x3f\ \x1c\x7e\x7d\xd3\x41\xd3\x46\x1a\xdf\xe0\x82\xd6\x37\x88\xab\x23\ \x71\x52\xd0\x6d\xde\xdc\x84\x80\xbb\x83\x58\xe4\x95\x12\x3a\x4d\ \xbb\x4c\x5a\x51\x63\x25\x66\x0b\x1d\xa2\xec\x68\xfc\x9a\x03\x87\ \x68\x3a\x5e\x2a\x9a\x24\x49\x47\x32\x08\xed\xd0\xbe\xf7\x39\x68\ \xce\x47\xfd\xcd\x25\x80\xe8\x83\x00\x9e\xc8\x80\xf6\xb8\x34\x38\ \x1f\xd4\xf0\x32\xf9\x32\x9d\x3e\x4a\xdf\xdb\x10\x6c\xc2\xaa\x38\ \xb1\xd4\x66\x86\x07\x44\x14\x18\x5b\x51\xa6\x05\x82\x89\x6d\x12\ \x6e\xec\x13\x62\xcf\x2f\x22\x53\x72\xee\xc4\xca\xd3\x3a\x57\x54\ \xee\x55\xad\xa8\x62\x55\x4d\x97\x49\x2b\x7d\xd5\x8a\x26\xad\xfa\ \x3c\xfc\xbb\xdd\x42\x1a\xd5\xe2\xd0\x44\xb4\x15\x74\x26\x82\x28\ \xe8\xb0\x64\xd7\xdb\x84\x8d\xbb\x05\xf9\xfa\x47\x3a\x94\xe6\x29\ \x92\xe8\x9b\x06\x78\x28\x55\x79\x54\x54\x51\xd9\x0e\x16\xe6\xd7\ \x93\xf6\x5a\x14\x70\x53\x85\xb9\xb4\x42\x9c\x62\x27\xe8\x16\xa1\ \xe3\xdf\xc9\x21\xe3\x8e\x95\x96\x83\x2a\xbb\x9b\xb2\x49\x1b\x02\ \xc0\xe5\x92\xcc\x86\xa6\xcd\x5c\x37\x75\xbc\xba\xc0\xca\x1a\x94\ \x0b\x82\x43\xeb\x19\x80\x7b\x52\xe2\xa4\xfe\x03\x5c\x56\x76\x8c\ \xf5\x16\xa8\x26\xa2\x50\x5f\x71\xf1\xa1\x82\xb4\xf6\x08\x42\x94\ \x84\x91\xb2\xdd\x4c\xda\xe8\x54\xaa\x5a\xa8\xde\x03\xac\x81\xab\ \x14\xc6\x68\xd7\x20\xf9\x7a\x14\x6b\x21\xd0\xb9\xbe\xcc\xdd\x0a\ \xe2\x65\x18\xc1\x6b\xbe\xd0\x4d\xf8\x86\x09\xb0\x59\xb0\x7c\xb5\ \xc8\x0c\x72\x84\x04\x2d\x8e\x5b\x26\xda\x2c\xea\x12\x8a\x19\xcd\ \xfb\xa8\x61\x02\x9c\xd2\xea\x55\xba\x50\xb9\x8d\xc8\xe8\x2f\x2d\ \x3d\x49\x10\x93\xf8\x90\xe8\xeb\x4d\x2a\x6b\x90\xa6\x4b\xd5\xf9\ \xa6\xd3\x3c\xf9\x00\xd8\x9b\xb2\xda\xbf\x6b\xf1\xc6\xfc\x01\x8c\ \xac\x84\x42\x46\xc9\x3d\xcf\xd6\x15\xa4\x5c\xd6\xbd\x5c\x8d\x44\ \x70\x97\x59\x50\xa8\xa2\x69\x33\x37\x88\xac\x1c\x59\x5c\x80\x4b\ \x1e\x59\xed\xaf\xdc\xb4\xcb\x57\x9f\xc9\x2b\x36\xe7\x0f\x60\xa1\ \x63\xb2\x10\x29\xb0\xd3\x08\xba\xf5\xac\x2d\x8c\xcd\x39\xa2\xf0\ \x5b\xd3\x6e\x44\xca\xf5\xb0\x5c\x01\xac\xc0\x5d\xbd\x65\xb7\x8f\ \x3f\x31\x41\x8e\x0d\xf0\x02\xe1\x65\x19\x7c\xb1\xe4\x64\x07\xcd\ \x1c\xb6\x78\x43\x90\x84\xac\x2d\xc0\x98\x73\xed\x4f\x0c\x90\x63\ \x03\xfc\x2c\x02\xe5\x0c\x82\x6e\x36\x77\x89\xda\x78\xeb\x13\x77\ \x27\x1a\x8b\x13\x6b\xc3\x6a\x03\x70\x72\xca\x1a\xbf\x72\x73\x34\ \xb8\xe1\x67\xd2\xf2\xcd\x5f\x08\xc0\xf8\x36\xe8\x99\xc2\xa2\x91\ \xde\x2c\x0d\x73\xd5\x80\xca\xf2\x66\x0b\x30\xc5\xb9\x7b\x6b\x6a\ \xe2\x72\x72\x6c\x80\xe7\x4a\x8e\xb5\x7e\x7f\x6f\x08\xc8\x20\x47\ \x5f\x13\xa4\x85\xcc\xc6\xeb\x1b\x2d\x6e\xcf\x06\xe0\x28\x70\x57\ \xac\xab\x4a\xff\x7b\xcb\x8e\x6a\x7f\xc3\xb6\xea\x38\x20\xc7\x06\ \x78\x8e\xa8\x22\x3e\x91\xb8\x0d\xd1\x5d\xe7\xd8\x84\x31\x9c\x4b\ \x1d\x29\x4e\xac\x57\xdb\x48\x01\x8e\x02\x77\xce\xaa\xad\xfe\xd0\ \xf9\xeb\xd2\xff\xfd\x71\x55\xb5\x3f\x60\xfa\xda\x38\x20\xc7\x06\ \xf8\x19\xc4\xc1\x1d\x09\x80\xaf\x45\x80\xdc\xee\xa0\xc1\x35\x6f\ \xbf\x11\xa7\xef\x93\xc9\x92\x6c\x01\x76\x81\x5b\x34\xb9\xd2\xbf\ \x79\x9e\x09\xb0\xa2\x8f\x01\x72\x6c\x80\x9f\xe6\xaa\x62\xf6\x09\ \x20\xb9\x83\xf3\x37\x4b\xd2\xec\xfb\xc8\x6b\xeb\x25\x1a\x1c\xc0\ \x14\xb8\xea\xf7\x28\x80\x63\x80\x1c\x1b\xe0\xa7\xb8\xcb\x30\x11\ \xd5\x3b\x93\x58\x2e\x4f\x26\xff\xc4\x64\x53\x2a\x10\xed\x05\x52\ \x80\x39\x70\x29\x80\x6b\x09\x72\x6c\x80\x67\x49\xde\x61\x63\xd4\ \x33\xb8\x6b\x0f\xd8\xa2\x42\x24\x22\x1e\x74\x55\xf8\x50\x00\x27\ \x2c\x80\x6d\x70\x39\x80\xa3\x40\xfe\xeb\xcb\xf9\x05\xf8\x09\x51\ \x3d\x83\x7a\x35\x4c\x86\x6e\x9a\xa3\xaf\xab\xb3\x48\x7c\x8e\x73\ \x29\x44\x4e\x44\x84\x20\x47\x81\x2b\x01\x18\x83\xcc\x80\x9b\x13\ \x80\x67\x22\x4e\xea\x46\x00\xdc\x8d\xab\xc8\x31\x32\xcb\x7c\x46\ \x7b\x0c\xda\x8c\x2b\x6a\xa3\xe4\xa2\xc0\x95\x02\x1c\x6e\x54\xfe\ \x95\x1c\xbe\x36\x45\x89\x08\xf3\xea\xed\x6c\x41\x2a\x68\x2c\xb3\ \xb1\x77\xba\x2c\x8e\xb8\xc1\x1e\x29\xc0\x75\x63\xa6\xa5\x4a\x5e\ \x77\x04\x45\xd4\x7d\xfb\x1e\x42\xd0\x9d\xcd\xa5\xef\xad\x8b\x84\ \xe3\x98\x71\x47\xba\xae\x31\xec\x57\x00\x07\x8b\x2d\x2f\x3f\x80\ \xa5\x49\x25\x35\xf7\x92\x56\x84\x59\xac\xf7\x00\x03\xf0\x1d\xae\ \x84\xc0\x7e\x07\x70\x16\xf2\xba\xab\xce\xcf\x35\x73\x88\x91\xfe\ \x92\x6a\x48\xdd\xd7\xe8\x38\x32\x78\xbf\x04\x58\x20\xcf\xfb\x22\ \x80\x2b\x18\x0e\xbe\xd7\x55\x2c\xd8\x08\xb0\x1b\xe0\x32\xce\x56\ \x46\x1c\x7c\xbf\xab\x16\xb7\x11\x60\x37\x68\x09\x04\xda\x14\x66\ \x33\xf0\xeb\x6c\xfa\x37\x02\x2c\x03\xb8\x98\x73\x46\x90\x88\xc0\ \x2f\x2d\xea\xd3\x08\xb0\x0c\xe0\x1e\xe2\x17\x91\xe2\x2b\x0c\xd6\ \x05\x97\x46\x80\xdd\x5c\xd9\x49\x5c\xb2\x85\xc3\x95\xc0\xf9\x8d\ \x00\x4b\x00\x4e\x5d\xe6\x5b\x1c\x54\x63\x12\x91\x39\xcd\xed\x8f\ \xb9\x5c\xf4\x46\x80\x73\x23\x4e\xf0\xff\xf1\xab\x73\x23\xc0\xb9\ \x07\xf8\x71\x57\xb2\xb5\x11\xe0\xdc\xc8\xeb\x2e\xfa\x05\x4e\xf3\ \xed\xb2\xd9\xfa\x06\xf0\xff\x00\x03\x57\xdd\xf7\xe7\xb2\xc7\x4c\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x0b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ \x00\x00\x04\xd2\x49\x44\x41\x54\x38\x8d\x8d\x95\x6b\x6c\x14\x65\ \x14\x86\x9f\xf3\xcd\xee\x76\xdd\x6d\x2b\x0b\xb4\x08\x41\x51\xc1\ \xa8\xa9\x28\x86\x68\x50\xa3\x56\x40\x8c\x31\xad\xa2\x9d\x55\x44\ \x4c\x23\x8d\xd1\x88\x37\xd0\xa8\x89\xc6\x1a\xaf\x28\xe1\x9f\xc4\ \x4b\x48\x34\x58\xb5\x3b\x5b\x89\xe8\x0f\xbc\xe3\x2d\x41\x89\x37\ \x8c\xca\x45\xb0\x18\x41\x0c\xb2\x2d\x2d\xdb\xbd\xcc\xcc\x77\xfc\ \xb1\x53\x05\xbc\xc4\xf3\x6b\x66\xbe\xcc\xf3\x9d\xf3\xbe\xef\xcc\ \x27\xfc\x4b\x69\x67\x67\x92\x62\xf1\x4a\x54\x2f\x47\xa4\x19\xd0\ \x68\x29\x86\xea\x2f\x88\xbc\x06\xac\x13\xcf\xab\xfe\xd3\xfb\xf2\ \x8f\x50\xd7\x5d\x0c\x2c\x06\x7a\x81\xb5\xe2\x79\x3f\x1f\xb1\x7e\ \x1c\x22\x0b\x50\x6d\x47\xf5\x49\xc9\xe7\x5f\xff\x7f\xe0\x6c\x76\ \x01\xa9\xd4\x5a\x8a\x45\x01\x2e\x43\xe4\x12\x54\x27\x02\x06\x91\ \xad\x40\x5e\x72\xb9\x4f\xd5\x75\xeb\x51\x5d\x89\x31\x43\xe4\x72\ \x77\xcb\x5f\x53\xfd\x05\xd6\x85\x0b\x1b\xa9\x56\xd7\x92\x48\xcc\ \x97\x9e\x9e\x21\x75\xdd\x6b\x81\x5b\x11\xe9\x23\x0c\xdf\xc4\x98\ \x5d\xa4\xd3\x4a\xa9\x34\x03\x6b\xaf\x07\x4e\xc0\x98\x25\xd2\xdb\ \xbb\x43\x5d\xf7\x5e\x44\xc6\x4b\x2e\x77\xd7\x28\xcf\xfc\xd9\x66\ \xa5\xf2\x34\xb0\x52\x7a\x7a\x86\x34\x9b\x7d\x0c\x91\xf3\x38\x78\ \xb0\x55\x72\xb9\x15\x40\x02\x91\x3b\x19\x19\xb9\x99\x30\x4c\xd3\ \xd2\xb2\x04\x58\x86\xb5\x2f\x69\x47\x47\xab\x78\xde\x13\x58\xdb\ \xa8\x1d\x1d\x97\x1f\xd6\xb1\x76\x74\x9c\x0f\x74\x4a\x3e\xbf\x58\ \x5d\x77\x31\xaa\x2d\x92\xcf\x2f\x55\xd7\xbd\x18\x63\x76\x11\x04\ \x8a\xe3\x4c\x01\x8e\x02\xce\x46\xb5\x15\x63\xee\xc6\xda\x7e\x60\ \x1d\xd6\x76\x91\x4a\xed\xa0\x5c\x7e\x87\x4c\xe6\x42\x79\xee\x39\ \x5f\x22\x33\xf2\x18\x73\x0f\x8e\x53\xc0\xf7\xd7\x91\xc9\xcc\x66\ \x60\x60\x0e\xb0\x04\x70\xc5\xf3\x4a\x47\x98\x37\x36\x32\xf6\x21\ \x1c\x67\x17\x61\xf8\x12\x30\x1b\xd5\x65\x18\xd3\x2f\xb9\x5c\xce\ \x68\x67\x67\x12\x18\x27\xbd\xbd\x3b\xa8\x56\xaf\x43\xf5\x79\xb6\ \x6d\x53\xe0\x7e\xca\xe5\x2c\xfb\xf6\xf9\xda\xd1\x71\x9f\xba\xee\ \x07\xea\xba\x1b\x34\x9b\xbd\x0d\xcf\x1b\x20\x16\x5b\x00\x3c\x4e\ \x63\xe3\x5e\x44\xde\x05\xda\x51\xcd\x03\xed\x35\x8d\x8b\xc5\x16\ \xe0\xcb\x9a\x30\x72\x31\x22\xaf\xd3\xdc\x3c\x0f\xd5\xf5\xf2\xc6\ \x1b\x23\x34\x37\x3f\x88\x31\x3e\x9e\x37\x1b\x98\x03\x1c\x43\x36\ \x7b\x87\xbc\xf2\xca\xef\x88\xbc\x47\xa1\x70\x11\x22\x2f\x03\xed\ \xd2\xd7\xb7\x13\xd5\x29\x35\xb0\xea\x64\x60\x34\xa7\xf5\xe2\x79\ \x07\x50\x3d\x1d\x63\x36\xd5\xe6\xd6\x0b\x24\x97\x5b\xc1\xfc\xf9\ \x4d\xf8\x7e\x03\xaa\x0f\xa0\x7a\xd5\xf2\xd5\x9f\x34\x6c\x9e\x38\ \xfd\x4b\x3f\x96\x6c\x93\xde\xde\x1d\xc0\x89\x11\x63\x48\xdb\xda\ \x52\x31\x44\x92\xc0\xe1\x5f\x8f\x48\x12\x6b\x47\xa2\xbb\x00\x80\ \x78\x7c\x0e\xd6\x8e\x5f\x3e\xf7\x9e\xaf\xc6\x54\x86\x4e\x35\x61\ \x72\xf7\xfb\x67\xb6\x8f\xbc\x57\x2a\x8d\x7b\x72\xee\xd2\x09\x07\ \x3e\x5c\xa5\xea\xba\x0e\xaa\x3f\x91\x4c\x1e\x1f\x43\x75\x00\x63\ \x8e\x8d\x20\xa5\x28\xf4\xfd\xc0\x09\xc0\xc7\x40\x5c\x41\x50\xfd\ \x61\xe3\xf1\xb3\x9e\x8a\xc5\x9c\xee\x93\xcf\x98\xea\x8f\x6f\xae\ \x1f\x0c\xd3\xf5\x03\xf1\xbd\x7b\x52\x3f\x0c\x38\x67\xbd\x58\xbd\ \x61\xc2\x29\xbf\x7e\x37\x63\xde\x96\xb7\x77\x22\x32\x35\x86\xea\ \x6e\x54\xaf\x88\xc0\x5f\x01\x33\x81\xef\x31\x26\x1b\x3d\x1b\xe4\ \x9a\x6b\x26\xae\x39\x67\x61\xa1\x50\xd7\x74\xe1\x39\xad\xd3\xb6\ \x34\x9a\x20\x69\xaa\x95\x54\x08\x18\x81\x69\xa7\x4e\xd8\x9f\x0e\ \xca\x99\xef\xcd\xf4\xd5\xf3\x7e\x7c\x7f\x2e\x41\x60\x0d\xfb\xf7\ \x6f\x05\xa6\x45\x90\x2f\x80\x19\xa4\xd3\x9b\x51\x3d\x3d\x92\x65\ \x0f\x61\x38\x6e\x77\x72\xd2\xd5\x93\x9b\x53\x61\xba\x3e\x51\x55\ \x63\x02\xc2\x30\x76\xa8\x7a\xc7\x4d\x4a\x97\x89\x27\xa6\x3c\xd2\ \xba\xec\x68\xf1\xbc\x82\x91\x0d\x1b\x02\x20\xd0\xb6\xb6\x14\x50\ \x40\x24\x23\x2f\xbc\x50\x06\x12\x00\x58\xfb\x2b\x30\x36\x1e\x97\ \xb3\xc6\x66\xea\x14\x40\x8d\x09\x45\xad\xc3\x11\x35\x66\x4c\x5d\ \x29\xae\x7a\x5a\x2d\x15\xb5\xba\x85\x99\x33\xcb\x18\x33\x0c\xd4\ \x8f\x9a\xa6\xad\xad\x31\x44\x46\x50\x4d\xd9\x90\x52\x18\xfd\x62\ \xd4\x98\x10\xfb\x77\x70\x18\x2a\xa1\xad\x05\xc1\x00\x88\xe7\xfd\ \x24\xdd\xdd\x16\x6b\x2d\xd6\x9a\x48\x82\x02\x4d\x4d\x19\x44\x2a\ \x18\x53\x17\x06\xc1\xdb\x7b\x7f\x2b\x42\x18\x3a\xc4\x62\x41\xd0\ \x38\xe6\xb7\x43\xa1\x7e\xa0\x32\x38\x58\x69\xf0\x13\xfe\x67\x87\ \x76\x4c\x34\xb6\x45\xc4\x44\xd7\x23\x84\x61\x8a\x5a\x14\x13\x95\ \x71\x69\x6f\xb0\x50\xd4\xbd\x7b\x86\x1a\xb0\x2a\x7f\x36\x10\xd5\ \xe6\x2d\x85\x54\x43\x75\xe8\xad\xee\xae\x73\x0b\x00\x87\x19\x00\ \x94\x50\x2d\x03\x60\x4c\x11\x91\xf4\x28\xb8\x3b\xdb\x52\xdd\xdd\ \x75\xfb\xa7\x3d\x89\x45\xd3\xf7\xef\x1b\xae\x9b\x3a\xd6\x69\x60\ \x42\xa2\x34\x7c\x20\x70\xbe\xfe\x76\xdb\xb1\x07\x87\x2a\x09\xc7\ \xd6\xad\x1b\x05\x1d\xb6\xab\xf4\xf5\x6d\x97\x7c\xfe\xde\x48\xb0\ \x55\x94\xcb\xfd\x58\x5b\x21\x32\x72\xd2\x81\x3d\xc3\xe7\xf5\x6f\ \x9c\xf5\xfb\xce\x7d\xaf\x7e\xf3\x79\x3f\x1f\xbd\xbb\x35\xb3\x6b\ \xd3\xf6\x52\x71\xb8\x7c\x63\x10\xb3\xa7\x04\xf1\xf8\x83\x8f\xae\ \xda\x74\x29\xfc\xcb\x09\x72\x68\x69\x36\x7b\x15\xd0\x24\xb9\xdc\ \x33\xea\xba\x7d\xc4\xe3\x5d\xf8\xbe\x00\xcf\x8a\xe7\xb9\xba\x68\ \x51\x5a\xd6\xac\x29\x02\x3c\xfc\xcc\xc6\x93\x1c\x75\xd6\xab\x95\ \x2e\xf3\xdf\x58\xa0\xae\x6e\x3d\xaa\xb9\xda\x2e\x3a\x88\xef\xfb\ \xe2\x79\x05\x1c\x67\x29\xc0\x28\x14\xe0\x81\x9b\x66\x6d\x37\x46\ \xae\x10\x47\x6f\xfb\x03\x8f\xed\x32\x9a\x4d\x90\xc8\x10\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x19\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x44\x50\x4c\x54\x45\x00\x00\x00\xff\xff\xff\xff\xbf\ \xbf\xb6\x00\x00\x9f\x00\x00\xaa\x00\x00\xaf\x00\x00\xa5\x00\x00\ \xaa\x00\x00\xa7\x00\x00\xaa\x00\x00\xaf\x05\x05\xad\x05\x05\xaf\ \x05\x05\xb0\x05\x05\xae\x05\x05\xaf\x05\x05\xb2\x08\x08\xb2\x08\ \x08\xb3\x09\x09\xb7\x09\x09\xff\xd6\xd6\xff\xd6\xd6\xb7\x0b\x0b\ \xba\x0b\x0b\xff\xd5\xd5\xba\x0c\x0c\xb5\x0a\x0a\xb5\x0a\x0a\xb4\ \x0a\x0a\xb4\x0a\x0a\xb4\x0b\x0b\xb7\x0d\x0d\xb5\x0b\x0b\xb9\x0f\ \x0f\xb8\x0f\x0f\xb9\x0f\x0f\xb9\x0a\x0a\xb8\x0d\x0d\xb8\x0e\x0e\ \xb8\x0e\x0e\xb9\x0a\x0a\xb8\x0d\x0d\xb8\x0e\x0e\xba\x0b\x0b\xba\ \x0b\x0b\xff\xd6\xd6\xfe\xd5\xd5\xff\xd6\xd6\xdc\x32\x32\xdd\x32\ \x32\xde\x34\x34\xdd\x33\x33\xde\x34\x34\xdf\x35\x35\xdf\x1b\x1b\ \xe0\x1c\x1c\xe0\x1c\x1c\xf0\x23\x23\xf0\x46\x46\xf1\x23\x23\xf4\ \xd2\xd2\xf4\xd3\xd3\xf4\xd7\xd7\xf5\xd6\xd6\xf5\xd7\xd7\xf6\xbe\ \xbe\xf6\xc0\xc0\xf6\xc1\xc1\xf6\xc3\xc3\xf6\xc4\xc4\xf6\xd6\xd6\ \xf7\x4d\x4d\xf8\x4e\x4e\xfa\x8e\x8e\xfa\x8f\x8f\xfa\x90\x90\xfa\ \x91\x91\xfb\xd5\xd5\xfb\xd6\xd6\xfc\x51\x51\xfc\x53\x53\xfc\x73\ \x73\xfc\x74\x74\xfc\x77\x77\xfc\x78\x78\xfe\x3e\x3e\xfe\x40\x40\ \xfe\x4b\x4b\xfe\x4c\x4c\xfe\x54\x54\xfe\xd5\xd5\xfe\xd6\xd6\xff\ \x2a\x2a\xff\x2b\x2b\xff\x2c\x2c\xff\x31\x31\xff\x32\x32\xff\x33\ \x33\xff\x36\x36\xff\x3b\x3b\xff\x49\x49\xff\x4f\x4f\xff\x50\x50\ \xff\x55\x55\xff\x56\x56\xff\x57\x57\xff\xd5\xd5\x06\x94\x4d\x25\ \x00\x00\x00\x39\x74\x52\x4e\x53\x00\x03\x04\x07\x08\x09\x10\x11\ \x12\x1a\x1b\x63\x64\x66\x67\x68\x69\x84\x85\x87\x8b\x8e\x8f\x91\ \x91\x91\x97\xc4\xc5\xc6\xd5\xd6\xdc\xe1\xe2\xe3\xe3\xe4\xe5\xe5\ \xe6\xe6\xe7\xe7\xef\xf0\xf6\xf7\xf7\xf8\xf8\xf8\xf9\xf9\xf9\xfe\ \xfe\x0f\x9d\x95\xc5\x00\x00\x01\x4b\x49\x44\x41\x54\x18\xd3\x4d\ \x91\x57\x57\xc2\x40\x10\x85\xd7\x18\x88\xa0\x60\x41\xb1\x50\x0c\ \x51\x34\xd8\xa8\x82\xd2\x42\x2c\xa1\x1a\xba\x85\x10\x6c\x28\x81\ \xfc\xff\x77\x77\x96\xc4\x70\x5f\xe6\xcc\x37\xe7\x4c\xb9\x83\x10\ \xd1\xca\x7a\x80\xe5\x38\x36\xe0\x66\x90\x25\xdb\x2e\x9f\xaa\x6a\ \x58\xd5\x14\xef\xb1\x99\xd4\x19\xb9\x79\xd3\x0c\x0d\xd2\x41\xa7\ \x41\x2f\xf3\xea\xb7\xf6\xaf\x5c\x88\x70\x5b\x24\xaf\xaa\xea\xcf\ \x02\x3f\xa4\x31\x3e\xb8\xc5\x54\xfd\x98\xf6\xeb\xf5\xfe\x8c\xf0\ \xe4\x26\xde\xe1\xfc\xe5\x1d\xe3\xf6\xa3\x80\x25\x75\x49\x7f\x9e\ \x41\x1b\xd7\xda\x64\x3c\x6a\x17\xca\xb2\xa2\x34\x4b\xc5\x0e\xf0\ \x84\x0b\x05\x60\xb3\xc9\x43\x59\xd1\xa3\x51\x5d\x11\x25\xe8\x53\ \xf1\x21\x16\xca\x7d\x41\xd6\x77\x96\x28\xaf\xde\x14\x7a\x90\xb3\ \xe8\x18\xc2\x93\xa0\x5c\x51\x08\x51\xb1\xa1\xd0\x80\xfc\x08\x71\ \x10\x1a\x82\x12\x35\x70\x1d\x72\xce\x6a\xe2\xa5\xa8\x7d\x5d\x36\ \x9b\xf8\x61\xe4\x4c\x2a\x29\x7a\x2c\x86\x47\xde\x4f\xe7\x23\xdd\ \x29\x28\x77\x8b\x62\x73\x38\x94\xc5\x42\xeb\x13\xdf\x1b\x5f\x45\ \xcc\xe9\x00\x78\x47\x82\x73\xee\x5a\xf8\xb2\xaf\xd7\x13\x3b\x42\ \x9e\x34\xb9\x78\xd6\xab\xd5\x7a\xbf\x23\x30\x22\xb3\x8d\x3d\xa1\ \x83\x39\xcb\xa6\x31\xa6\xd9\x30\x4d\x8c\x0d\x59\x7c\x32\x52\xb3\ \x17\x0e\xc3\xf0\x60\x72\x60\xf2\xe7\x4c\xd8\x61\xbe\x87\xde\xe2\ \x13\xe4\x69\x95\xf8\xd9\xde\xf2\xc2\x37\x19\x97\x1f\x5e\xec\x5b\ \xb3\xcf\xf3\x3f\x24\x22\x76\x4e\xc4\x3e\x16\xe0\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\x9a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x41\x50\x4c\x54\x45\x00\x00\x00\xe5\xea\xef\xe6\xeb\ \xeb\xe6\xeb\xeb\xe6\xea\xef\xe7\xeb\xef\xe7\xeb\xeb\xe7\xeb\xeb\ \xe6\xec\xec\xe6\xed\xed\xe7\xed\xed\xe7\xec\xec\xe8\xec\xec\xe8\ \xec\xec\xe7\xed\xed\xe8\xeb\xed\xe6\xec\xed\xe7\xec\xed\xe7\xec\ \xed\xe7\xec\xed\xe7\xeb\xed\xe7\xeb\xed\xe7\xec\xed\xe7\xed\xed\ \xe7\xed\xed\xe7\xeb\xed\xe7\xec\xed\xe7\xed\xed\xe7\xec\xed\xe7\ \xec\xed\xe7\xec\xed\xe7\xec\xed\xe6\xeb\xeb\xe7\xec\xed\xe5\xea\ \xe9\xe7\xea\xeb\xe7\xec\xed\xe7\xe8\xe9\x7a\xab\x52\x7b\xae\x4e\ \x7b\xaf\x4e\x7c\xac\x54\x7c\xb1\x4e\x7c\xb3\x4f\x7d\xad\x55\x7d\ \xb2\x4e\x7e\xb4\x4f\x7e\xb6\x50\x7f\xae\x58\x80\xae\x59\x81\xaf\ \x5c\x82\xbb\x52\x83\xb0\x5f\x83\xba\x52\x83\xbc\x52\x84\xbc\x53\ \x87\xbf\x56\x88\xbf\x57\x88\xc0\x57\x8b\xb5\x6b\x8f\xb8\x70\x90\ \xb8\x70\x9c\xbf\x82\x9d\xc0\x84\xa5\xc4\x8f\xa6\xc6\x91\xb1\xcc\ \xa1\xb2\xcc\xa3\xbb\xd1\xaf\xbc\xd2\xb0\xdb\x71\x63\xdc\x74\x66\ \xdc\x75\x68\xdc\x76\x68\xdc\x7a\x6c\xdd\x7a\x6e\xdd\x84\x78\xdd\ \x89\x7e\xde\x84\x79\xde\x88\x7d\xde\x88\x7e\xdf\x97\x8e\xdf\x98\ \x8f\xdf\xa1\x99\xe0\x6c\x5d\xe0\xa3\x9b\xe0\xaf\xa9\xe0\xe8\xe4\ \xe1\xb1\xab\xe2\x6c\x5d\xe2\xba\xb5\xe2\xbb\xb6\xe3\x6c\x5d\xe4\ \x6c\x5c\xe4\x6d\x5d\xe4\xea\xe9\xe5\x6c\x5d\xe5\xeb\xeb\xe6\xe5\ \xe5\xe6\xe9\xe9\xe7\xeb\xec\xe7\xec\xed\xea\x6e\x5d\xea\x6e\x5e\ \xec\x70\x60\xed\x70\x60\xed\x71\x61\xe8\xe7\x4d\x1d\x00\x00\x00\ \x26\x74\x52\x4e\x53\x00\x31\x33\x34\x3e\x3f\x40\x41\x51\x53\x55\ \x6b\x6d\x6e\x8c\x8e\x90\x9e\x9f\xa0\xb6\xb7\xb8\xc1\xc2\xc3\xd2\ \xdd\xf0\xf1\xf4\xf5\xfc\xfc\xfd\xfd\xfd\xfe\x82\x63\x25\x38\x00\ \x00\x00\xe2\x49\x44\x41\x54\x18\x19\x95\xc1\x59\x23\x02\x01\x14\ \x06\xd0\x4f\xb6\x26\x11\x12\x33\xd3\x98\x11\xd9\x97\xec\x6a\x8a\ \xec\xd9\xd7\xc8\x2e\x71\x6b\xcc\xff\xff\x01\xee\xe3\xf7\xea\x1c\ \x00\x31\xcb\x13\xe2\x59\x06\x54\xbf\x90\xcf\xdd\xe5\xd9\x9d\x5a\ \x02\x88\x09\xf9\x5a\x5d\xca\x17\x72\x53\x35\x03\x96\x90\xfd\x45\ \x5f\xe5\xca\x26\x5c\x21\xc5\x4d\x5f\x15\x16\x5c\x38\x42\x4a\x1b\ \xbe\xca\xaf\x38\x48\x09\x39\x9c\xf1\xd5\xfc\xde\x10\xba\xb2\x42\ \xb6\xa7\xd7\xb6\xe6\xd6\xc7\x3b\x80\x78\x46\xc8\x51\xa9\x78\x30\ \xd6\x03\x15\x19\xb4\xd3\xc4\x1e\x68\xc3\xff\xb5\x27\xed\x34\xb1\ \x93\x11\xa8\xde\x89\xc7\x8b\xeb\x17\x21\x99\x38\xd0\x3d\x79\xf6\ \xd6\x6a\x56\x2f\x85\x64\x3b\x31\x7c\xff\x1e\xaa\xea\xab\x90\x14\ \x46\x4f\x82\x50\x35\x6f\x84\x38\x70\x2b\x41\xa8\x5a\x57\x42\x5c\ \x58\xb7\xf5\x50\x3d\x3f\x09\x31\x61\x34\x8e\xeb\xc1\xef\xc7\xf9\ \x8f\x90\x28\x90\x68\xdc\x55\x4e\x1f\xbe\x85\xf4\x41\x19\xa6\x27\ \xc4\x1b\x89\x02\x7f\x54\x61\x7d\xdb\x3e\xf7\x06\x2d\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\x53\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x92\x50\x4c\x54\x45\x00\x00\x00\xff\x55\x55\xcc\x66\ \x33\xd5\x55\x55\xe6\xcc\x99\xd1\x5d\x46\xd1\xb9\x8b\xe8\xd1\xa2\ \xea\xd5\xaa\xeb\xc4\x9d\xdb\xc8\xa4\xcf\x60\x50\xdc\x5d\x46\xd3\ \x59\x4e\xd9\x5e\x4c\xcc\xbb\x99\xd6\x5a\x4a\xde\xce\x9c\xc9\xb9\ \x93\xe0\xd1\xa2\xe1\xcb\xa5\xd5\xb2\x94\xd6\x5c\x4d\xda\x94\x7d\ \xd9\x59\x48\xdb\x8e\x71\xd8\x59\x4a\xcb\xb8\x94\xd8\x5a\x4b\xd8\ \x59\x4a\xd7\x5b\x4a\xca\xb7\x96\xd7\x5a\x4a\xda\x78\x65\xca\xb8\ \x96\xcb\xb9\x94\xcb\xb7\x95\xd9\x77\x60\xcb\xb9\x96\xd6\x5a\x4a\ \xd6\x5a\x49\xd7\x5b\x49\xd7\x5a\x4b\xd7\x5a\x49\xd7\x5a\x4a\xd7\ \x65\x54\xd8\x5b\x4a\xd5\x6a\x57\xe3\xcd\xa3\xe2\xcd\xa4\xe3\xce\ \xa4\xd7\x5f\x4f\xd7\x59\x49\xd7\x5a\x4a\xca\xb7\x95\xe3\xcd\xa4\ \xe3\xcd\xa4\xe3\xcd\xa3\xcb\xb8\x95\xe3\xcd\xa4\xe4\xcd\xa3\xd7\ \x5a\x4a\xe2\xce\xa4\xd7\x5b\x4a\xe3\xcd\xa4\xd7\x5a\x49\xe3\xcd\ \xa4\xd6\x5a\x4a\xda\xc6\x9f\xd9\xc5\x9f\xd7\x5a\x4a\xd9\xc5\xa0\ \xd7\x5a\x4a\xd7\x5b\x4b\xd7\x5a\x4a\xd7\x59\x4a\xd7\x59\x4a\xcb\ \xb8\x96\xcb\xb8\x95\xe3\xcd\xa4\xe3\xcd\xa4\xe2\xc0\x9a\xd9\x6d\ \x59\xcb\xb8\x95\xd9\x72\x5d\xcb\xb8\x94\xc2\xa6\x83\xc3\xa4\x80\ \xcb\xb8\x95\xc1\xa6\x82\xc2\xa4\x81\xc2\xa6\x82\xcb\xb8\x95\xbf\ \xa3\x80\xbf\xa4\x80\xc0\xa3\x80\xc0\xa4\x81\xc3\x98\x77\xca\xb0\ \x8b\xcb\xb1\x8b\xcb\xb1\x8c\xcb\xb8\x95\xcc\xb3\x8d\xcc\xb3\x8e\ \xcd\xb3\x8e\xd0\xa0\x80\xd2\x6c\x57\xd8\x7d\x66\xd8\xc1\x99\xd9\ \x6f\x5a\xd9\x72\x5d\xd9\xc1\x9a\xda\x74\x5e\xda\xc3\x9b\xdb\x79\ \x62\xdb\x7e\x66\xdb\x85\x6c\xdb\xc3\x9b\xdb\xc3\x9c\xdc\x8d\x73\ \xdc\xc4\x9d\xde\x99\x7c\xdf\xa1\x81\xdf\xab\x89\xe0\xa9\x88\xe1\ \xb6\x92\xe1\xba\x96\xe1\xc0\x9a\xe2\xbe\x98\xe2\xc5\x9e\xe2\xc6\ \x9f\xe2\xc7\x9f\xe2\xc8\xa0\xe3\xcd\xa4\x3e\x26\x0c\xb2\x00\x00\ \x00\x5d\x74\x52\x4e\x53\x00\x03\x05\x06\x0a\x0b\x0b\x0b\x0c\x0d\ \x0e\x10\x16\x17\x1b\x1e\x1f\x1f\x21\x21\x22\x2b\x32\x37\x3c\x3f\ \x48\x4f\x55\x56\x5a\x5c\x60\x60\x61\x62\x63\x65\x66\x71\x7d\x81\ \x85\x8b\x8d\x8e\x95\x98\x99\xa9\xaa\xac\xb1\xb3\xbc\xbc\xbe\xc0\ \xc1\xc1\xc3\xc4\xc4\xc5\xc5\xc6\xc6\xc9\xc9\xca\xcb\xcb\xcc\xcc\ \xce\xd0\xd3\xd8\xe0\xe0\xe1\xe4\xf1\xf8\xf8\xf9\xfd\xfd\xfd\xfe\ \xfe\xfe\xfe\x71\x73\x8f\xad\x00\x00\x01\x13\x49\x44\x41\x54\x18\ \xd3\x63\x60\x40\x00\x0e\x03\x23\x20\x30\x60\x67\x40\x01\x2c\x16\ \xad\x60\x60\xc3\x09\xe1\x33\x4a\x68\x99\x38\x7b\x78\x06\x15\x57\ \xd6\xb7\x56\x64\xa4\x95\xda\x81\xc4\x79\x34\xbd\xf4\xa4\x78\x19\ \x38\x6c\x5a\xeb\xab\x8a\xb2\x13\x13\x12\xe2\x0b\xad\x39\x18\xd4\ \xdd\xe4\x98\x80\x92\x9c\x36\x60\x03\x32\xb3\xf4\x45\x23\x53\x5a\ \x0d\x19\x64\x98\x41\xe6\x70\xda\x41\xcc\x4d\x8f\xd2\x35\x0e\x4b\ \x6a\x75\x80\x98\x0e\x13\x6d\x2d\x8b\x8b\x0e\x8f\xcd\x87\x0a\xb3\ \x5b\xb6\xc2\x40\x61\x72\x52\x4e\x2b\x44\x18\x49\x14\x0a\x40\xc2\ \x5c\x4e\xe8\xa2\xad\xe6\x0c\x0c\x6c\x66\xae\x50\x4e\x5d\x13\x94\ \x11\xa8\xc8\xc0\x66\x95\x1a\x0a\x15\x2f\xa9\x85\xd0\x01\xe2\xa6\ \x0c\xd2\x11\xa9\xa9\xc1\x2e\x60\x6e\x5e\x0b\x44\x54\x84\xc1\x99\ \x81\x41\x09\x28\x0e\x51\x9f\x0b\x13\x65\xb0\x07\x5a\xa9\x0c\x13\ \x2f\x68\x84\x8a\x32\x3b\x32\x20\x89\x97\x57\x03\x45\x85\x81\x02\ \x0a\x1a\x0c\x70\x71\xf7\xd6\x86\xbc\x66\xb0\xa8\x80\x1b\x37\x03\ \xb2\x78\x4d\x88\x2a\x33\x03\xab\xac\xb7\x18\x2c\x0a\x20\xe2\xfe\ \x92\x3a\xb6\x3e\x6e\xda\x7c\x88\xa8\x51\x8b\x49\x4d\xf5\x15\x64\ \xc0\x00\x2a\x11\x7e\x42\x0c\x58\x80\x3c\x3f\x12\x07\x00\x92\xbb\ \x7a\x74\x15\x65\x0e\x4b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ \x60\x82\ \x00\x00\x01\xdc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xa2\x50\x4c\x54\x45\x00\x00\x00\xb6\xdb\xb6\xbf\xbf\ \xbf\xc6\xc6\xc6\xbf\xcf\xbf\xc3\xc3\xc3\xc6\xc6\xc6\xc4\xce\xc4\ \xc6\xc6\xc6\xc8\xc8\xc8\xc4\xcc\xc4\xc6\xc9\xc6\xc7\xc9\xc7\xc7\ \xca\xc7\xc8\xca\xc8\xc6\xcb\xc6\xc6\xc9\xc6\xc7\xc9\xc7\xc8\xca\ \xc8\xc7\xcb\xc7\xc7\xc9\xc7\xc8\xca\xc8\xc7\xca\xc7\xc7\xca\xc7\ \xc8\xcb\xc8\xc6\xc9\xc6\xc7\xca\xc7\xc7\xca\xc7\xc6\xca\xc6\xc7\ \xca\xc7\xc7\xca\xc7\xc8\xca\xc8\xc7\xca\xc7\xc8\xca\xc8\xc7\xca\ \xc7\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\xca\xc8\ \xc7\xca\xc7\xc7\xca\xc7\xc7\xc9\xc7\xc7\xca\xc7\xc7\xca\xc7\xc8\ \xcb\xc8\xca\xcd\xca\xcb\xce\xcb\xd1\xd3\xd1\xf8\xf9\xf8\xf9\xf9\ \xf9\xfa\xfa\xfa\xfc\xfc\xfc\xff\xff\xff\x28\x9c\x19\x94\x00\x00\ \x00\x2c\x74\x52\x4e\x53\x00\x07\x08\x09\x10\x11\x12\x1a\x1b\x1c\ \x1e\x5e\x5f\x60\x61\x62\x63\x76\x78\x7a\x7b\x7d\xad\xae\xaf\xb0\ \xc9\xca\xcb\xcd\xce\xcf\xd7\xd8\xd9\xdb\xe2\xe3\xe4\xef\xf0\xf1\ \xf3\xf4\x24\xb9\xb6\xe8\x00\x00\x00\xbd\x49\x44\x41\x54\x18\xd3\ \x6d\xd1\xc9\x76\x82\x50\x14\x44\xd1\x13\x10\xec\xa2\x89\xa2\x11\ \x0d\x31\x10\x3b\x9a\x52\x50\xf4\xff\x7f\xcd\x81\xb0\x82\xf2\x6a\ \x76\xf7\xec\x56\x01\x00\xee\xc7\x32\xca\xb2\xc8\x1f\x3b\xfc\xc7\ \x9e\x25\xaa\x12\x7b\x76\xad\xdd\x6f\x35\xf2\x3b\x78\x68\x7f\xaf\ \xa7\xec\x7a\x00\xf6\x8f\xa4\x63\x9e\x9f\xa4\x53\x9e\x1f\x25\x05\ \x16\x30\x97\xa4\xe2\x5a\x5e\xa4\x4b\x79\x2d\x24\x69\x0a\x6e\x22\ \x49\x45\x79\x3b\x4b\xe7\x5b\x59\x48\x52\xec\xf0\xa9\x36\x6b\xc4\ \xd2\xc4\x0b\x36\x26\x8e\x48\x4d\x9c\x9a\x39\xe1\xcf\xc4\x21\xbe\ \x89\xbf\x18\x9b\x78\x88\x1b\xb7\xf9\xd0\x01\xaf\xfd\xfc\x04\xb0\ \x82\xd7\xaa\x56\x16\x40\x6f\xf7\x5c\xec\xb6\x5b\xcd\xb0\x6a\xea\ \x7a\x50\xcf\x63\x4d\xe3\x1a\x0f\x93\xb7\xc6\x9a\xce\xc8\x0f\xd3\ \x34\x5c\xbc\x77\x1e\xf7\x1d\x32\xae\x42\xd7\xc6\x5a\x89\xe7\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x07\x6c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x07\x33\x49\x44\x41\x54\x78\xda\xed\x9c\x6b\x8c\x13\x55\ \x14\xc7\xcb\x43\x50\x41\x79\xed\xdc\xd9\x5d\x50\x1e\x31\x18\x24\ \x6a\xd4\x28\xc6\x17\x01\xd4\x0f\x46\x7c\x45\x8d\x04\x03\x46\xa3\ \xc1\x20\x8f\x6d\x1b\x40\x83\xd0\xed\x0c\x8b\xcf\x84\x80\x18\x8c\ \x8b\x1f\xf4\x03\x52\x81\x80\xca\xa6\x33\xed\x76\xba\xbc\x0c\x09\ \x41\x10\x1f\x11\x10\x12\x56\x81\x6d\xcb\x2e\xef\x97\xb2\xf5\x0c\ \xfb\xe8\x99\xe9\x6d\xe9\x63\xba\xbb\xd3\x3d\xff\x64\xbe\xf4\x0e\ \x24\xfb\x9b\x3b\xe7\xfe\xcf\x39\xf7\x8e\xc3\x41\x22\x91\x48\x24\ \x12\x89\x44\x22\x91\x48\x24\x52\x87\xc9\xed\x0d\x8d\x73\xc9\xe1\ \x29\xce\xaa\xe0\x68\xa2\x61\xa1\x3c\x1e\x5f\x1f\x97\x14\x5e\xeb\ \x92\xb4\x78\xeb\xd5\xec\x94\x42\x55\x44\xc6\x8a\x59\xfb\xb1\xd2\ \xcf\x25\x6b\x7e\x04\x37\x71\x55\x86\x9f\x20\x42\x79\x68\xae\x47\ \x1b\x08\x33\x77\x3b\x17\xee\xd5\x2b\xf4\x11\x51\xca\x51\x73\x96\ \x04\x45\x80\xf8\x73\x6a\xb8\x70\xc9\xe1\x95\x44\x2a\x07\xb9\xe4\ \xda\xe1\x00\x70\x7f\x5a\xb8\x04\x38\xc7\xb0\x20\xd5\x8d\x01\x78\ \xf5\xd7\x84\x9b\x27\xe0\xe8\xa6\x92\x9b\x62\xaa\x38\xe9\xe8\x0f\ \xe5\x37\x76\x9f\x99\xeb\x0d\xdd\xe7\x96\xb4\x48\x46\x70\xf3\x05\ \xac\x8a\xbb\xa2\x2a\x8b\x47\x15\xb6\xb7\x49\x1b\x38\xb0\xe8\xe1\ \x56\x78\x43\xe3\x61\x41\x3b\x95\x31\xdc\x3c\x00\xc7\x3d\x8e\x9e\ \x00\xf7\xec\x55\xc0\xfa\x15\x60\x5b\xea\x77\x0c\xbb\xa1\x78\xad\ \x98\x1c\x9e\x0c\xc0\xce\x67\x05\x37\xcf\x19\x1c\x51\xc4\x37\xda\ \x01\xb7\xcc\xe4\x8d\x71\x9f\xa3\x57\x11\x2e\x68\xda\x54\x80\x75\ \x39\x6b\xb8\x16\x2c\x72\x00\xf6\x7d\x0c\x39\x16\x10\xa4\xa2\x82\ \xeb\x94\xb4\x99\xe0\x65\xaf\xe4\x04\xd7\x22\x17\x11\x09\xb0\x95\ \x08\xf2\x95\x58\x50\x7c\xbc\x38\xc2\x82\xa4\xcd\xcf\x19\xac\x85\ \x80\xe3\x9a\xa3\x37\x80\xdd\x8a\x20\x1f\x8f\x68\x42\xa9\x7d\xc9\ \xc6\xe3\x3d\xdc\xde\xf0\xa7\x79\xc3\xb5\xd0\x07\x9f\xa8\x19\x3c\ \x0c\xc0\x46\x13\x8b\x9e\xf0\xad\x2d\xd9\xbe\xe4\xf3\xf5\x02\x28\ \xab\x2d\x81\x9b\x05\x60\xdd\xeb\x46\x54\x71\x05\xc0\x5b\x75\xf2\ \xc7\x01\x83\xb8\xf1\x58\x11\x27\x1b\xe2\x31\x78\x64\x5b\xc1\x9d\ \xb5\xbc\xa6\x2f\xd8\xb0\xf5\x96\xc1\xcd\x02\x70\x4c\x15\x66\x26\ \xc0\xb1\xed\xa9\x92\x8b\x98\xc2\xd6\x21\xc8\xfb\x0f\xd4\xdc\xd6\ \xd7\x4e\x15\x31\xd5\x52\xb8\x59\x01\x16\x27\x01\xb0\xe6\x04\x3c\ \xe1\x7b\x9e\x25\x6b\x0c\x94\xdf\x8a\xfd\x71\x2c\xc0\xde\xee\xf2\ \x70\x17\x2c\xdd\x3a\x08\x60\xfc\x64\x39\xdc\x2c\x63\x70\x4c\x11\ \xde\x35\xf8\x5e\x95\x2d\x4a\xe1\x8f\x17\xa2\x7b\x0e\xe9\x8b\x60\ \xd7\xad\x2b\x2c\xd9\x52\x06\x20\x7e\x29\x08\xdc\x34\x80\xf5\x99\ \x18\xdf\xe5\xb8\x2e\x09\x9e\xca\x3e\x43\xf0\xfe\x8b\x28\xc2\x63\ \x9c\x05\xef\x66\x18\x6b\x42\x21\xe5\xd5\xae\xe9\x71\xab\x82\xa3\ \x21\x2c\x1c\x2e\x18\xdc\x14\x80\x61\x06\x2e\xd5\xc1\x00\xcc\x7d\ \x47\xb5\xf2\x12\xb3\x25\x8b\x28\x6c\x07\xca\xde\x0e\x1e\xd6\x46\ \x5c\xcf\x89\xd9\x4b\xd0\x83\xd8\x53\x10\x40\xf3\x3c\x6a\x39\x24\ \x02\x8b\xe1\x0f\x59\x03\x9e\xd5\x97\xcd\x05\x8b\x59\x6d\xce\xd9\ \x59\x9e\x80\x01\xc8\x6e\x04\x67\xa7\x79\x41\x3b\xae\x88\x23\xe1\ \xf7\x53\x6d\xf7\x80\xbb\x78\xcf\xfc\x7f\xc0\x3d\x0c\xc6\x2e\xb4\ \xdd\xd3\xe0\x67\x77\x5b\x0b\x57\x0a\xdd\x0e\x7f\x40\x63\xc1\x01\ \x15\x64\x06\x0b\x2f\xea\x19\x19\x5a\xd0\xaa\x93\x1e\x42\x80\xb9\ \xd1\x43\x38\x7b\xac\xa6\x54\xe0\x84\x93\xf5\xa8\x18\x64\x6d\xe7\ \xc4\xed\xd5\xd6\x75\x79\xb8\x69\x62\x30\x40\x71\x1a\x3d\x2d\x7b\ \xde\x10\x2a\x7c\x63\xfb\xc0\xef\x7f\xa2\x7b\xbc\x49\x61\x22\xc0\ \x5e\x40\xe3\x7f\xeb\x15\x38\xeb\x0a\x30\x92\x76\xc8\xce\x80\x5b\ \x20\x0b\x6b\xd0\x2c\x3e\x02\xaf\x7d\x3f\x93\xab\x98\x9e\x08\x13\ \x2c\x66\x1e\xd7\x3d\x30\x5e\xec\xa2\xfe\x92\x7b\x2d\x04\x1c\xfe\ \xc7\xee\x80\xf5\x05\x0e\xc0\x9c\x40\xb3\xd0\x65\x98\xc5\xe0\x32\ \x74\xf0\x89\x71\x71\x4a\xda\x30\x01\x6f\x05\x01\x4e\x02\x24\xce\ \x31\xbc\xe6\x26\xeb\xa6\x97\x27\x71\xf2\xc1\x89\xe7\xb3\xd3\x8d\ \x77\x7b\xc0\xba\x83\x30\x14\x71\x14\xf1\x69\x83\xe7\x0d\x96\xde\ \x81\x1e\xc0\xa5\x24\xc7\x11\x10\xef\x44\xe3\x4d\xf1\xb8\xa3\x07\ \x01\x4e\xf6\xb4\xcb\x10\xa4\x6f\x38\x0b\xe2\x81\x54\x05\x1e\x1d\ \x28\xfc\x7e\x2e\xf1\xef\x4b\xca\x09\xb0\x49\x0d\x2a\x7b\x18\x01\ \x3e\xca\x59\x0c\xab\xd1\x78\x25\xe7\x01\xec\x41\x80\xc7\x13\x60\ \x73\xf9\xf9\xea\x62\x96\x28\xe0\x34\x04\xc5\x51\xa6\x38\xfb\x3a\ \x72\x13\x1b\x38\x85\x22\x5f\xc2\x0f\x8b\x6f\x12\x60\x6e\x01\x27\ \x91\x1e\x47\x54\xe1\x29\x63\xcb\x48\x78\x04\x01\xde\x97\x2a\xf5\ \xb6\xb4\x67\x57\x6c\x80\xf5\xd8\x9b\xaa\x04\xa9\xb7\x87\x50\x88\ \x38\x93\x9c\x70\x08\x0b\x12\x31\x5a\x58\x46\x80\xb9\xa5\x4a\x71\ \x39\x82\x34\x9f\x93\xd5\xb5\x01\x6e\x36\xd7\x89\x0d\xc5\xfa\x80\ \xb8\x9a\x00\xf3\x67\xf0\x27\xed\x61\x40\x11\x17\x72\xc6\x2f\xb5\ \x8d\x37\x06\x06\x0d\x30\xa5\xcc\xd3\x90\xcb\xf0\x11\x60\x3e\xe0\ \x55\xc8\x0b\x57\x10\x60\xcb\x01\x8b\x9b\x51\x0d\x78\x2a\xc7\x65\ \xb4\x17\x86\xcc\x1d\x0c\x0a\x11\x99\xcd\xe0\x43\xed\x90\x14\x71\ \x9c\xc1\x27\x07\x99\x88\x4b\x97\xb4\xc8\x65\x09\x38\xea\x2f\x29\ \x43\x00\x2f\x9b\xab\x66\x0d\x0a\x7b\x08\x8d\xff\x4a\x36\x2d\x5b\ \xc0\x8a\xf8\x16\x6e\xd9\x27\x17\x84\x84\xd7\xf0\x06\xc0\xe4\x44\ \x83\x7d\x47\x89\x46\x3a\xc0\x01\xb6\x05\x01\x9e\xc7\x19\xff\x22\ \x11\x3e\x04\x39\xf9\x01\xb1\xbd\x94\x2a\xa7\xf2\xbf\xc1\xd2\xfb\ \x71\x17\x59\xef\x36\x73\x16\xc0\x3f\xda\xee\x39\xa1\xb2\x27\x0d\ \x0b\x60\xcb\x3e\xe2\x73\xa8\xe8\x5e\x46\x80\x8d\xaf\xb7\x3f\x9d\ \xc5\x8a\x06\x4b\x46\xe3\xf8\x0c\x59\x5d\x7f\xd3\x02\x78\x17\x2a\ \xc8\x37\x52\xb9\xd2\x18\x7b\x5f\xc1\xdb\x52\x79\x2d\x1f\x08\x0f\ \x8b\x11\xc0\xcd\xe9\x0b\xee\x6c\x93\x95\x05\xf7\x9d\x76\x06\xdc\ \xda\x9a\x6f\x42\xdd\x88\x2f\x93\xaa\x6c\x90\x12\x1b\xec\x1b\x24\ \x14\x9c\x96\xd1\x86\x82\xb4\x8c\xdc\x72\x68\xb6\x5d\x01\x9f\xf2\ \x0f\x1b\x0c\x40\x7f\x47\x60\xea\x4f\x07\x87\x0e\xe1\xc4\xde\x29\ \xe8\x9e\x93\xfa\xa9\x23\x3c\xae\x6f\x48\x29\x58\xd3\xd3\xe3\xf1\ \xf4\x74\x4b\x21\xaf\x53\x0a\x9f\xb3\x1b\x60\x00\xb7\xd6\x10\x57\ \xfd\xc2\xa3\x49\xb3\x57\xdf\xe1\xa3\xb2\x7d\x68\xf3\xc9\x07\xd7\ \x68\xdb\xd7\x5b\xda\xb6\x4f\x80\xd6\x7a\xcf\xf5\x68\x23\x2a\x3c\ \xc1\x51\xd9\x5c\x4e\x59\x7b\xd0\x29\x69\xd5\x9d\xb4\xb3\x67\x5b\ \x5b\x65\x8c\xf7\xda\xb7\x66\x67\xef\x20\x78\xe7\x79\xee\xc0\x14\ \x1e\x3e\xec\x9a\xdb\x56\x5b\x8e\x09\x34\x77\x24\xe0\x58\xa0\x6c\ \x8c\xee\x6d\x23\x01\xe1\x65\x2e\xdc\xda\x21\x43\x4d\xed\xfc\xca\ \x14\x5b\xa7\x2e\x16\x6c\xeb\x94\x95\x72\xc9\xda\x74\x80\xf1\x6f\ \x67\x6f\x5f\x45\xbe\x36\x98\x6e\x43\x4a\x6b\xbb\xbf\xaa\xe0\x9b\ \xff\x2c\x85\x2c\x69\xcf\xc1\x75\xb1\xb3\x01\xeb\xb1\x16\x5b\x37\ \x73\x62\xc1\xdb\xbe\x6a\xae\xbe\x75\x59\xb9\xa5\xda\x89\x00\xe5\ \x4c\x67\x01\x06\x58\x33\x70\x59\x52\x2f\xe2\xa4\xb8\x6f\x11\xba\ \xef\xaf\x2e\xbd\x01\xdb\xac\x0a\xb9\xf6\x01\x00\x13\xeb\xf0\xa6\ \x67\x4b\x63\x13\xed\xb8\x64\x41\xde\x06\xed\xa6\xda\xb2\xe1\xc6\ \x7d\x10\x6c\x86\xc3\x6e\xaa\xf0\x86\xc6\x5a\x96\x29\x66\x0e\x78\ \x16\x82\xb6\x5b\x0f\x03\xfc\x10\x62\x70\x0e\xbf\xf1\x1e\x82\x4d\ \xc2\x45\xdd\x48\x00\x74\xb0\xa3\x00\xb7\xc6\xd5\xaf\xf5\xf3\x6f\ \x7a\x81\x3d\x45\xd7\xe3\x19\xc3\x96\x57\x45\x9c\xe8\xb0\xb3\x2c\ \x39\xbf\x51\xa8\x83\x88\xaa\xb0\xc6\x51\x0c\xca\xfb\x04\x92\x75\ \x47\x69\xb7\x21\xd7\x70\x2c\xd5\x2c\xb7\x67\xb8\xc8\xe7\x0c\x9d\ \x05\x80\x01\xe8\xe7\x86\xc3\xe0\x76\x3b\xe1\x99\x89\xf4\x53\xa0\ \x39\x1d\x5b\xc8\xf7\x73\x06\x86\x72\x25\x3f\xab\x2b\x1a\xe5\x74\ \x8e\xd9\xc2\x0f\x72\xe8\x0e\xa2\x28\x3f\xc8\x61\x0c\x88\x59\x9e\ \xc4\xb7\xea\x93\x32\x2a\xab\xe3\x9d\x97\x2b\x5a\x65\xfc\x2d\x09\ \xfa\x28\x52\xee\xca\xe8\x6b\x28\xf9\x84\x08\x4d\xe8\x1f\xf5\x97\ \x4e\xe8\x56\x9f\xf5\x4a\x82\xec\x0d\x4d\x4b\x57\x89\x73\xca\xda\ \x0a\x07\x29\xcf\x70\x21\x87\x9e\x05\x98\x17\x78\x80\xdd\xb2\x36\ \x97\x08\x59\x31\x93\x2b\xc3\x13\x00\xe8\x69\x13\xe0\x23\x15\x1e\ \xff\x60\xa2\x63\x59\xb8\xa8\xbb\xc7\xe9\xd5\x36\xb6\xa4\xd7\xa1\ \xaf\x9c\x72\xdd\x2d\x44\x85\x44\x22\x91\x48\x24\x12\x89\x44\x22\ \x91\x48\x24\x52\x77\xd7\xff\x74\xc2\xcd\xbe\x81\x4a\x58\xaa\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0d\x85\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0d\x4c\x49\x44\x41\x54\x78\xda\xed\x5d\x69\x73\x1b\x49\ \x19\x16\xcb\xf5\x23\x80\x82\x05\x0a\x96\x05\x3e\xf1\x01\x58\xfe\ \x00\x55\x54\x71\x55\x41\xc1\x42\x51\x50\xc0\x7e\xa0\x38\xd6\xb6\ \x72\x50\xb5\x89\x15\x49\xeb\x04\xa8\x38\xeb\x24\x9b\x63\x93\x38\ \xc7\xda\x4e\xe2\x38\x2c\xe4\xb6\x63\xcf\x8c\x6c\xcb\xb2\x8d\xaf\ \xd8\x89\x6d\xf9\x4e\x1c\x1f\xb2\x25\xd9\x89\x1d\x9f\xb1\x9b\x7e\ \x46\x1a\xa9\x47\xd6\x8c\x46\x52\x8f\x2c\x65\xb7\xab\xde\x8a\x22\ \x69\xa6\x67\x1e\xbf\xea\x7e\xde\x73\x2c\x96\x2c\x19\x3f\xab\xac\ \xfc\x78\x41\x51\xed\xab\x05\x0e\xe1\xa7\x05\x4e\x71\x37\xfd\xb7\ \xb4\xc0\x21\xb9\x0b\x1c\x62\x77\x81\x53\x1a\xa6\xff\x06\xe9\xff\ \x57\x43\x42\x5f\x87\xde\xeb\xce\x77\x88\x8d\xf2\x77\xe9\x31\x56\ \xa7\xf4\x93\x37\x1d\xae\xaf\xe1\x5c\x96\x8f\x86\xc5\x92\x67\xab\ \xfd\x62\x81\x5d\x78\xc3\xea\x10\x2b\x29\x70\x01\x0a\x18\xe1\x24\ \x0b\x54\xee\xd2\xf3\xee\xa2\xe7\xff\x96\x85\x90\x8f\x7d\x88\x40\ \x15\xbf\x4c\x6f\xdc\x16\xd6\xc0\xa4\x80\xdb\xb5\xdf\x25\x4b\x0a\ \x80\x0f\x51\x4d\x2f\xc4\x1f\xf4\x85\x04\xd5\x66\x13\x3f\x41\x7f\ \xc2\xbf\x0a\xfd\x9c\xc5\xcd\x78\x20\x50\xd0\x89\xfd\x48\x13\x29\ \x29\x6b\x27\x67\xaf\xf7\x90\x2a\xd7\x00\xa9\xe9\x1a\x23\xae\xde\ \xc7\xc4\x3d\x38\x49\x5a\x1f\x4e\xab\x04\xef\xe1\xb3\xea\xce\x31\ \xf9\xbb\x38\x06\xc7\xe2\x1c\x56\x6d\xa0\x31\x77\x83\xd5\x2e\xbc\ \xfe\x42\x2c\x23\x36\x5b\xe5\xa7\xac\x0e\xe9\x8f\xd0\xa0\x78\x37\ \xbc\xb7\xb8\x91\x1c\xab\xec\x22\x57\x29\x40\x0d\xde\xc7\x5b\x40\ \x4c\x55\x70\x2e\x80\x7e\xfc\x72\x17\xd9\x43\xe7\x88\x0b\xb6\x53\ \x1c\xa4\x7f\x88\xdf\xe3\x1a\x73\x0f\x59\xba\xe6\xe5\xdb\x85\xdf\ \xd0\x1b\x19\x8f\xbd\xb1\xdd\x07\xea\xc9\xd1\x8b\x1d\xe4\x46\xeb\ \x08\x69\x19\x9b\xe2\x06\xaa\x96\x60\x8e\x1b\x2d\x23\xf2\x9c\x1a\ \xcb\xcb\x23\xfc\xba\x72\x66\x9d\xce\xb3\x0b\x5f\xa7\x9a\x21\xc5\ \xd3\xd6\x8a\xea\x3e\xe2\x19\x9e\x34\x1d\x54\x2d\xc1\xdc\xe5\x35\ \x7d\xf2\xb5\xc4\xd1\x68\x01\x0c\x24\x6b\x81\x7d\xe3\x64\xdb\x27\ \xf3\x1d\x42\x11\xbd\xd8\x35\xf6\xc2\x6d\x25\x4d\xe4\x72\x9d\x97\ \x34\x67\x40\x5b\x8d\x0a\xae\xe5\x52\x5d\x3f\xbd\x36\x77\x0c\xd0\ \xd2\x2a\x55\x0e\x27\xf6\x8c\xac\x02\x37\xdf\xe9\xfa\x5c\x98\xb3\ \x46\x2e\x76\x47\x91\x8b\x1c\x2b\xef\x25\xcd\x23\xd9\x03\x6c\x3c\ \xa0\xcb\xee\xf4\xc6\x5b\x3a\x5a\xad\x0e\xd7\xcb\xd9\x01\xae\x43\ \xf8\x61\x2c\x87\x3d\x70\xa2\x93\x5c\xad\xf3\x91\x9b\x8d\x41\x22\ \xf5\xcc\x66\x2d\xc0\x8a\x48\xbd\xe3\xa4\xf8\x5c\x5b\x2c\xc8\x7e\ \xeb\xdb\xc2\x0f\xb6\x15\xdc\x90\xc5\x15\xa5\x5d\xbb\xa8\xd6\x9e\ \xa9\x1a\x96\x81\x55\xe4\x76\x53\x90\x34\x8f\xfa\xb2\x1e\x64\x48\ \xa5\xd0\x1f\xab\xcd\x9b\xf9\x4e\xd1\xba\x2d\x2c\x81\x9a\xa7\xff\ \x54\x6f\x62\x4d\xa4\xb2\x7a\x52\x05\xae\x22\xe2\x3d\x7f\x4e\x00\ \x0c\xa9\xeb\x79\x44\xec\x47\x3d\x2a\x6d\xce\xb7\x4b\x25\x36\x9b\ \xed\xa5\x8c\x6d\x66\x74\xd2\x32\xf6\x02\xfe\x71\xb2\x93\x5c\xaf\ \x0f\xc4\x05\x17\x72\xcb\x1d\xa0\x3b\xb8\x2f\x67\x40\x06\xdb\x78\ \xe7\x42\xec\x92\x21\x5c\xc0\xbd\x67\x40\x73\xc5\x73\xec\xc4\xc5\ \xa5\x3d\xe4\x66\x83\x36\xb8\x8a\xd4\x76\xe6\x8e\x16\xcb\xfc\x99\ \xca\x7b\x57\xef\xa9\x35\xd9\x21\x95\x9b\xaa\xc9\x56\xbb\x74\x90\ \x9d\xb0\xe4\xfc\x83\x84\xc0\xb2\xd2\x34\x38\x93\x53\x20\x43\x2e\ \xdc\x7c\xa0\x06\xd9\x29\x1e\x31\x07\x5c\x87\xf4\x77\x76\xa2\xa3\ \x65\x7d\x49\x81\x0b\xa9\x69\xf3\xe7\x1c\xc0\x90\xd2\x6b\x3d\xb1\ \x20\xf3\xdd\xf8\x40\x57\x58\xb6\x70\xa8\xb4\x3b\x69\x70\x15\x69\ \xf4\xce\xe4\x24\xc8\x27\xab\x54\xcb\xc5\xa6\xd5\x29\xfc\x88\x13\ \x15\xab\xfb\x3c\xcb\x73\xb1\xa1\x19\x59\x73\xb5\xe4\x4e\x73\x80\ \xb4\x8e\xe5\x1e\xc0\xf0\x69\xc4\x6c\x7c\x7e\x18\x58\x1c\x18\x43\ \xd4\x42\xdb\x5b\xec\x21\xd7\x5d\xfe\x94\xc1\x55\xa4\xbe\x37\x37\ \xb5\x18\x56\xa9\x43\x4d\xe1\x9a\xd3\x62\x16\x61\xdf\x42\xc4\x88\ \xb8\x52\x33\x95\x36\xb8\xb2\x16\x7b\x82\x54\x23\xa6\x73\x12\xe4\ \xda\xee\x87\x2a\x63\xc4\xea\x10\xec\xa9\x2d\x0d\x72\x7c\x2c\xea\ \xb8\x39\x5d\x35\xc4\x05\x5c\x45\x72\xc1\x84\xd6\x92\x2b\xd2\x80\ \xca\x41\x94\xbc\x17\x4e\xe6\xbb\x92\x2b\xb2\xee\x9e\xe8\xe0\x0a\ \x6e\xc8\xf8\xa0\x26\xf4\x88\x2f\x67\x41\x2e\x3e\xdf\xc6\xba\x3a\ \x6b\x93\x5b\x1a\x42\xce\xf2\x88\x57\xac\xea\xee\x34\x77\x80\x21\ \x42\x57\x7c\x2d\x6e\x7b\xe4\x23\xde\x99\x39\x32\xf9\x64\x91\xcc\ \x2d\xad\x90\xe5\xb5\x75\xb2\xbe\xb1\x41\x36\x37\x89\x2c\x78\x8d\ \xf7\xf0\x19\xbe\x83\xef\xe2\x98\x4c\x3b\x88\x54\x4b\x85\x5d\xfc\ \x85\x21\x70\xff\x72\xf8\xd6\xa7\xd9\x48\xc4\xf1\x0a\xaf\x29\xe0\ \x2a\xe2\x19\x8a\x02\x03\xa0\x02\xcf\x96\x29\x88\x14\xc5\x24\xc7\ \x06\x3d\x06\xc7\x7a\x7d\xc1\x8c\x81\x7c\x5e\x6d\x84\x8c\x19\xda\ \xf0\xc2\x31\xb4\x88\x03\xe7\x7a\x1a\x94\xcc\x88\xd4\x76\xf8\xc9\ \xd0\xec\x3c\x59\xa2\x1a\xc9\x6b\x3c\x5b\x5d\x27\x83\xb3\x73\xe6\ \xb3\x8a\xd1\x29\x95\xd3\x9e\x62\xf7\xbb\xc4\xc9\x1f\x0e\x71\x40\ \x39\x00\x91\x08\xf7\x80\x8f\xd4\xfc\xcf\x6f\x0a\xb8\x52\xfb\x3c\ \xf1\xcf\xf1\x03\x36\x76\x3c\x59\x5e\x25\xf7\x26\xcc\xdd\x4c\x2f\ \xd5\xf6\xab\xd2\x03\x74\xa3\x21\x08\xfe\x45\xb4\xf7\x50\xa3\x2a\ \xcc\xd3\xe8\xf5\x91\xea\x16\x7e\xda\xdc\xde\xb7\x48\xd6\x9f\x6f\ \x12\xb3\xc7\xf3\x8d\x4d\x32\xec\x9f\x37\x55\x8b\x55\x91\x6b\xa7\ \xf4\x4b\x1d\xde\x2b\xe7\x2d\xc8\x5f\xac\xa8\xe9\xdb\x7a\x42\xca\ \x5d\x5d\x0f\x66\xc8\x6d\x4f\x7a\xe0\x0e\x3c\x5a\x26\x99\x1e\xd8\ \x0c\xcd\x02\xb9\xbc\xba\x8f\xa5\x6d\x2e\xcd\x8c\x1b\xc5\xdf\x80\ \xd0\xba\x5e\xf4\xb7\x65\x74\x5a\xe6\xb1\xa0\x5a\xc9\x82\xfb\x70\ \x6a\xc5\x30\x28\xab\xeb\xeb\x64\x61\x69\x89\xcc\x3d\x5d\x20\xfe\ \xf9\x27\x64\x66\x6e\x4e\x16\xbc\xc6\x7b\xf8\x6c\x6d\xdd\xf8\x12\ \xe3\x5b\x58\x32\x05\xe0\x26\x8a\x15\xc3\x28\x36\xe3\x66\x10\x15\ \xd8\xa5\x7d\xca\x5f\xe1\xdd\x8b\x9d\x06\x4d\x47\x9f\x4c\xb5\x6e\ \x1a\x04\x7a\x68\x3c\xb1\xe6\x82\x41\x2c\x2e\x2d\x93\x99\xe0\x1c\ \x99\xf2\x07\x0c\x09\xbe\x8b\x63\x8c\xb0\x8f\x89\x79\x73\x34\xf9\ \x48\x45\x27\xb3\x4c\x08\x7b\xb7\x1a\x16\x4c\xae\x18\x92\x42\x92\ \x8a\x00\x50\xaa\x55\xdb\xae\xbf\x11\x76\xf4\x2f\x26\xbc\xf9\xa5\ \x95\x95\xa4\x80\x8d\x07\x34\xce\x91\x68\x98\xb1\x26\x5f\x6f\x1e\ \x56\x65\x0d\xa9\x12\x59\xf2\xec\xae\x6f\xb2\x09\x22\xa9\x66\xdc\ \xb8\x07\x66\x28\xe3\x08\xc4\x65\x0b\xcf\x75\x36\x34\x68\xde\xfc\ \xc2\x42\xca\xc0\xc6\x0a\x96\x0f\x3d\x6d\xc6\xc6\xc7\x9b\x5d\x00\ \xb3\xb7\x8a\x1b\xa2\x20\x17\xd5\xbe\x1a\x5d\x1e\x1c\xe2\xdf\x94\ \x0f\x90\x2b\x96\xee\x64\x8d\xfd\x33\xb2\x5b\x52\x01\x58\x8f\x8a\ \x6d\x50\xab\x0c\x6b\x2a\x2f\x70\x15\xc1\x39\x71\x6e\x3d\x0a\xc7\ \x5b\x8b\xdf\xbd\xd4\xc9\x5a\x76\x7f\x66\x4c\x63\xf1\x3f\xca\x07\ \x48\xc4\xe3\x13\xd3\xf2\x51\xc6\x31\x4b\x3a\xbd\x0b\xba\x9a\x6b\ \x06\xb8\x51\x90\xe7\x75\x35\x99\xb7\x31\x52\x25\x79\x59\x36\x71\ \x95\x35\x2e\x82\x4a\x0a\x69\x3d\xc7\x2c\x47\x08\xac\x2a\xad\x31\ \xc7\x71\x59\xd0\x5b\x2e\xf4\x2c\x3e\x9e\xf7\x0a\xec\xa2\xa9\xb3\ \x52\x40\x0e\x90\x86\xdd\x92\xf2\x9b\xc8\xad\xe5\x39\x21\x7c\x0b\ \x7a\x1b\x9a\x51\x90\x26\xfd\x81\x81\xe9\x40\xe0\xe4\x54\x20\x50\ \x08\x91\x5f\xfb\x83\x83\x46\x8f\x7f\xb6\xac\xbd\xf1\xf1\xf6\x5d\ \xec\x3b\xdc\xc4\xac\xc3\xe2\x2b\x16\xb9\x26\x42\x89\x12\x97\x75\ \x70\x9d\x0c\xce\x17\xad\xa5\xc1\x18\x5b\x08\x8a\xd3\x7e\xff\xb7\ \xb5\x0c\x23\x0a\xf4\x77\x28\xe0\xae\x44\xe7\xf1\x05\x82\xb2\x33\ \x28\xde\xc0\x35\xf2\xbc\xe7\x92\xf7\xdb\xa3\xeb\x30\xe2\x76\x6c\ \xb4\x18\x59\xe2\xbc\x26\x6a\x1f\xf7\x69\xae\x7f\xe0\xac\x09\x40\ \xd9\xa4\xc0\xed\x21\x06\x72\x76\xf1\x9d\xa9\xd9\x80\x4d\x3e\x46\ \xe7\x9c\x30\x4a\xb4\xbc\x70\x3c\x5d\x9d\x67\xaf\xdd\x67\xf9\xf0\ \x4e\x0b\x9b\x48\xc2\x6b\x83\x4b\xb4\x3c\x24\xd4\x5e\x0a\x6e\xb2\ \x11\x98\x30\xc8\xba\x1c\x39\x13\xcb\x84\x2a\xda\xe1\x94\xce\x00\ \xe0\x06\xe5\x0d\xd4\x44\xf0\x9a\x08\xb6\xbf\x96\xf9\x9b\x68\x59\ \x20\x29\x64\x9b\xcb\x9a\x9c\x60\xb9\xd0\x32\xab\x79\xfa\x29\x50\ \x33\xa2\xf2\x4b\xd0\x17\x3d\xca\x1b\xae\xbe\x71\x6e\x13\x21\xda\ \x10\x6f\xe0\xa7\xaa\x07\x82\xde\x9a\x9b\x68\xf8\x02\x81\xef\xa6\ \xb2\x4c\xe0\x5a\xf9\x45\x3a\x1e\xb3\x00\xdf\x03\xc0\x63\xca\x1b\ \xee\xa1\x09\x6e\x13\x2d\xaf\x3f\x8f\x7f\x33\x4f\xf5\xa8\x59\x70\ \x30\xdd\x3c\x0e\x30\x8e\x64\x29\x1b\xc2\x4f\xbc\xee\xbb\x71\x70\ \x82\xf5\x0f\x8f\x58\x94\xa4\x12\xf0\x37\x9e\x45\x29\xeb\x1a\x56\ \x14\xc8\xbf\xa6\xf6\x52\xfa\x95\x36\xc0\xb3\x81\x53\x7a\xd6\x5d\ \xbc\x81\x6b\xe5\x69\x32\x33\x00\xcf\x5a\xc2\xa5\xa9\xb2\xbb\x8d\ \x27\x5d\xd1\x62\x10\x70\x37\xf2\xdc\xdc\xb6\x6c\x76\xe0\xca\x5a\ \x1b\xdd\xdc\xbc\x26\x6d\xe4\x79\xef\x3b\xa3\xae\xcb\x95\x6c\x03\ \xb8\x30\x6d\x80\x75\xd8\xc4\x76\x01\x9c\x4d\x4b\xc4\x7b\x1c\x96\ \x88\xd3\x59\xb6\x44\x98\xb4\xc9\x69\x44\x89\xf5\x37\x39\xff\x10\ \x87\x25\x62\x38\xd9\x4d\x6e\xc9\xdc\x4d\x2e\xbb\x68\x1a\xa8\x56\ \xaa\xe0\x4e\x04\x83\xdf\xcb\x46\x9a\x16\x31\x34\x40\x92\xb7\xdd\ \xd0\xa0\xc6\x42\x8a\x86\xc6\x4b\x74\xfd\x6d\xd8\x76\x43\xa3\x23\ \xd6\xd0\x70\x8a\x67\x95\x37\xaa\xb2\xc7\x54\x2e\x4c\x61\x73\xb3\ \xa7\x6a\x2a\xf7\x73\x34\x95\x59\x9f\x70\xbe\x43\x3c\xad\xd4\xba\ \x71\x77\xf6\xc0\x81\xb2\x91\x8e\xb3\x87\xb2\x81\x24\x9c\x3d\xf6\ \x44\xce\x9e\xc5\x0c\x39\x7b\x4a\xff\x7b\x9f\xcd\xf4\xd9\x61\x41\ \x1b\x96\xac\x75\x57\xd2\xe5\x82\xae\xc9\xaf\xe9\x98\xc6\xaf\x25\ \x5a\x16\x14\x77\xa5\x16\x6d\xf4\x9b\xe8\xae\x44\x15\xac\x05\xb9\ \xad\xa6\x39\xdc\xe9\x4f\x8f\x87\xc3\x1d\xec\x42\xb6\xd0\xc2\x0e\ \xf7\xf0\xeb\x61\xa3\xc7\xeb\x45\x9a\xf9\x3b\xdc\xa3\xb9\x6a\x3b\ \x1d\xc2\x57\x3f\x0a\x19\x99\x1d\x32\x0a\x47\x95\x3f\x30\xc3\x27\ \x0c\x41\x60\x31\x5b\x83\x9e\x03\x33\x7c\x83\x9e\x57\x98\x0d\xce\ \x6a\x17\xab\xa2\x29\xab\x4e\xe1\xaf\x3c\xc3\xf6\xb1\x32\xbf\xb4\ \x92\x75\x61\xfb\xd9\xb9\x35\x72\xb7\x2d\x40\x9a\x86\xf8\x6d\x70\ \x47\x2f\x32\xd9\x3d\x76\xe1\x4f\x4c\x1d\x9c\xf8\x0d\xe5\x83\x3d\ \x69\x24\x9e\x68\x09\x92\x3c\x90\xec\x91\x2d\x89\x27\xc8\xea\x14\ \xdb\xe6\x43\x79\x1b\xee\x20\xa9\xeb\xf4\x13\xcf\x08\x87\xc4\x93\ \x83\xd1\x2c\x4b\x75\xdd\x46\xa8\x06\x39\xd2\xb8\x08\x3d\x6e\x78\ \x6b\x31\x92\xac\x13\x26\x4e\x2f\xaf\xc8\x3b\x7e\xaa\xc0\xe2\x58\ \x23\xa9\x53\x9d\xde\xc5\xb8\x35\x23\x62\xf7\x6c\xca\xd5\x4f\xaa\ \xd4\x29\xbb\xe4\x8d\x93\xd9\x2e\xda\x22\x65\xb2\x17\x3b\xb8\x03\ \x0c\x99\x78\x92\x38\x3f\x0d\xbc\x14\x26\x6d\xf2\xc9\x7f\x4b\x86\ \x92\xff\x90\x3a\xab\x97\x43\x77\xdb\x13\x90\x13\x66\x92\x4e\xfe\ \x2b\xef\x60\x73\xd3\xde\xda\x02\xf0\x0e\x47\xdd\x97\x94\xf4\x55\ \xb8\x2e\xcd\x6a\x5e\x84\x14\x52\xa3\x63\x8d\x73\xfa\xea\xd8\xe4\ \x8a\xf1\x5a\xbe\x96\x00\x69\xe8\x37\x56\x30\x89\xf4\xd5\xdd\x07\ \xa2\xe9\xab\x6f\xda\xc4\x2f\xc4\xcf\x70\x67\xfc\x12\xe8\x10\x65\ \x56\xc2\xf2\xf8\xdc\x42\xc6\x13\xb0\x91\x3a\x9b\x4a\xb2\x78\x75\ \x6b\x80\xb8\x13\xd4\x57\x97\x57\xf7\xb2\x0d\xf6\x24\x9d\x76\x05\ \xc2\xeb\x6c\x96\xa5\x99\x9d\xa2\x40\xdf\xf4\x36\x3e\x5e\x03\x1b\ \x5a\x67\xff\x62\xda\x25\x0f\x60\x1c\x9e\x41\x9f\x46\x09\x41\x83\ \xb1\x72\xae\x78\x45\x30\x66\x16\x90\x80\x5d\xcc\x2f\xaf\x9a\x06\ \xee\x4c\x70\x2d\xca\x16\x78\x14\x4f\x36\x86\x18\x47\xf3\x88\x46\ \x11\x8c\x53\x1c\x4c\xd8\xb2\xb1\xc0\x2e\xfe\x41\x39\xa0\xb0\xc4\ \x2d\xff\x85\xcc\x2e\x87\x1a\xa4\x84\x5f\xcf\xe2\x4b\xa5\x8c\xab\ \xad\x6f\xc1\xb4\xd2\x33\x85\x71\x78\x46\xa6\x48\xe1\x3b\x6e\xa6\ \xb7\x8f\xf8\x5b\x43\xfd\x26\xe5\x76\x83\xe1\x83\xd0\xf1\x23\x53\ \x85\x7d\xf0\x0b\xc0\x41\xb4\x91\x62\x21\xa2\x9f\x29\x44\x44\x0d\ \x89\x99\xf5\x7d\x90\x63\x15\x7d\xac\xf6\x8e\x1a\xae\xbc\xa7\x7f\ \x89\x5f\x47\x1c\x16\x94\x51\x88\x0f\xc6\x33\x06\x72\xa4\x94\x96\ \x02\xa5\x94\xd2\x2e\x45\x4a\x69\x37\x65\xc1\xeb\x25\xa6\x94\x16\ \xfe\xdc\x2d\x2e\x47\xca\x67\xef\x78\xcc\x2b\xa2\xfc\x77\xed\x34\ \xd9\xf9\x36\x5b\x4a\x2b\xfc\x3c\xb9\x62\x70\xa7\x28\x44\x1a\x1f\ \x9d\x6b\xcb\xc9\x82\xed\xfa\x5e\xf3\xb4\x78\xff\x71\x15\xef\xad\ \x49\xbe\x57\x44\x51\xed\x57\x10\x76\x56\x4e\x52\x29\x78\x73\x0f\ \x64\x68\x71\x2b\x7f\x2d\x3e\x75\x65\x48\xd5\xce\x40\xce\x03\x4e\ \xad\x11\x92\xe8\x64\xbb\x4f\xd7\x76\x3f\xca\x39\x90\xd1\x23\x88\ \x27\xb8\x97\xab\x27\xe5\x0e\x04\x0c\xef\xb5\xa5\xd5\xb9\x9a\xad\ \xfe\x84\x43\x7e\x3b\xdb\xd3\xa6\x2a\xbc\x6a\xad\xaf\xd5\xfb\xc9\ \xde\x83\x1e\x36\xe6\x56\x9f\x76\xa7\xd6\x50\x67\x55\xd1\xaf\x9c\ \x14\x8d\x81\x5a\xc6\xa6\x72\x0a\x60\xb8\x24\x6f\xa5\x09\xee\x8d\ \xc6\x80\xdc\xf4\x94\xd1\xdc\x99\x3c\x67\xdd\x67\x4c\x69\xeb\x75\ \xdc\x04\x9f\xb1\xe9\xbd\x76\x3a\xd2\xd3\xe2\xe2\x33\xdd\x6c\x9b\ \xc5\x8d\x3c\x87\xf8\x7d\xde\x8d\xe9\x76\xb0\xcd\xd9\xd0\xac\x2d\ \xb7\x3a\x46\xf9\xe4\x1e\x9a\xa9\x80\x7b\xe4\xfd\xbe\x98\xc6\x74\ \x42\xbe\x49\xad\x15\xc5\x7f\xb1\x13\x9d\xfa\xa0\x3b\xa7\x40\x16\ \xee\x25\xaf\xc5\xc7\x2b\xfa\xd5\x4d\x42\xed\xe2\x7e\xb3\xdb\xda\ \x96\xaa\x5a\x2c\x5e\xec\x20\x2d\xa3\xb9\xb1\x26\xb7\x8c\x52\x2d\ \x6e\x0a\x18\x5e\x73\x8b\x4b\xbb\x63\x9b\x36\x97\x99\xde\x4c\x3f\ \xd4\xac\x4e\xb8\xc0\x4e\x8c\x8d\x2f\x57\xd8\x85\x74\x7f\xd6\x10\ \x5b\x60\x37\xb4\xb0\x9c\xcb\x5c\x6f\x77\x3c\xc6\xc1\x21\x1e\x60\ \x2f\x60\x5f\x89\x9b\xd4\x74\x3d\xcc\x0d\xe3\x43\xc7\x84\x46\xf3\ \xbd\xc2\x43\xdb\xd8\xa0\x59\x4d\xe1\x44\xab\xaa\xc5\x38\x35\x46\ \x72\xc1\xe2\x43\x6b\xc7\x78\xe0\x9e\xa6\x16\x1a\x6b\x44\x80\x2d\ \x50\x4b\x2d\x6f\x5b\xfb\xb8\x87\x29\x9c\x5f\xd5\xb4\xf9\x5c\x1b\ \x11\x7b\xc7\xb3\x77\x2d\x46\x16\x24\xd3\x7f\x08\x7d\xe1\x54\xbe\ \x05\x85\xe7\xf2\xa6\x62\xa9\x8e\x9d\x36\xf1\xb3\x6c\xb8\x49\xf6\ \xc2\x15\x49\x72\xd5\xa3\x27\x4b\x37\x40\xf4\xb6\x40\xcb\xb2\x13\ \x97\xbc\x72\x5f\x4e\x75\xa7\x6b\xb1\x9e\x9b\x11\xc1\x6b\x60\x03\ \x40\xa3\x4c\xa5\xe6\x23\xfa\xa0\x12\x37\xb9\x5c\xd7\x9f\x11\xc7\ \x7d\x32\x9d\xa2\x10\x89\xd8\x73\xb0\x29\x76\x23\x5b\x81\x6f\x21\ \xeb\x1e\x54\xa2\x6e\x2a\x2a\xbe\x42\x41\xae\x8b\x7d\x94\x0d\x12\ \x5a\xd0\x9d\xa9\x69\x1b\xd9\x06\xe6\xc6\x35\xb0\x31\x34\xd6\xe5\ \x08\x0f\xa2\x25\x57\x06\xfa\x87\xb1\xf5\x1f\xd1\x87\x45\xb9\xe4\ \x06\x42\x48\xd4\xc8\xd4\xc3\xa2\x30\x17\xe6\x64\x42\xeb\xaa\x48\ \x44\x72\xce\xf2\x2c\x1a\xe0\xcc\x68\x37\xc8\x06\x52\x59\x41\x8f\ \x1b\xb4\x61\x41\x01\x75\x7d\x3f\xbf\xac\x4e\x9c\x0b\x99\xe6\xc8\ \x15\x63\xd3\x99\xd4\x16\x99\xe4\x45\x0c\xcd\xfc\x47\x37\x64\x60\ \xc8\xd1\x6a\xaa\xd1\xd8\x3c\xb4\x1e\xd8\x27\x73\xe9\xc3\x4d\x72\ \x02\x33\x36\xc7\x2a\x0a\x3a\x6a\x46\xd0\xe5\x14\x0f\xe7\x6b\x89\ \x61\x01\x78\x0f\x9f\xe1\x3b\xf8\x03\x21\xb3\x1c\xc7\xaa\x1a\x62\ \xc4\x7d\x60\x9f\xe4\x42\x68\x7d\x5b\x78\x6d\x46\x68\x9d\xc3\xf5\ \x32\xfa\x8a\x21\xc4\x9d\xb1\x47\x4e\x42\x5b\x1d\xd2\x1e\xcd\x8c\ \x9b\x17\x75\xa8\x1f\x9a\xaa\xe6\xd2\x69\xca\xd3\x0f\xed\x43\x53\ \xb5\x69\x9e\xed\x25\xa4\xdc\x53\x60\x7e\x8c\x4e\x21\x68\x66\x11\ \xe6\xd6\x5d\xa1\xa6\x79\xa8\x48\x55\x1e\xfb\x4b\x5f\x87\x1a\xe9\ \x75\xe1\x3b\xa8\xe6\xc1\x31\x68\xe1\x82\x73\x64\xd3\xcf\xff\xff\ \xff\x85\x5d\x0d\xd5\x7e\x54\xe3\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x0c\xa1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0c\x68\x49\x44\x41\x54\x78\xda\xed\x5d\x7b\x70\x15\xd5\ \x19\x3f\x25\x50\x7c\x81\x32\x23\xc2\x48\x90\x47\x2a\x0d\x01\x14\ \x41\x79\x8e\x8a\x03\x0a\x0a\x12\x40\x65\xda\x84\x71\x8a\x2d\x30\ \xd3\xe9\xb4\xd3\x8e\xb6\x01\x0a\x09\xc8\x40\xa7\x9d\x8e\x32\xfd\ \x43\x13\x68\xab\x8e\x8c\x14\x08\xc6\x01\xad\xd0\x96\x00\x09\x6a\ \x6d\x02\x29\x09\x49\xe5\x5d\xfb\x4f\x4b\x81\x0a\xcd\xeb\x7a\x73\ \xef\xe9\xf7\xdb\xec\xde\x9e\x5d\x76\xf7\xee\xee\x3d\x67\xb3\x17\ \xbd\x33\x5f\x72\xe7\xee\xfb\x77\xcf\xfd\xce\xf7\xf8\x7d\xdf\x61\ \x2c\x22\xaf\x1d\x8c\xe5\x90\x14\xec\x64\x6c\x11\xfd\x2f\xf9\x1d\ \x63\xbf\xa1\xff\x47\x48\x8e\x93\x9c\x21\xb9\x4c\x12\xd3\xe5\xb2\ \xfe\x19\xb6\xd5\xea\xfb\x96\x90\x2c\xdc\xce\xd8\x68\x9c\x8b\x7d\ \xf9\x62\xac\x92\xb1\x91\x04\xc6\x72\x92\x1d\x24\x97\x48\xb8\x24\ \xf9\x2f\xc9\x1f\x08\xf8\x9f\xd0\xff\x89\x9c\xb1\xaf\x7c\x61\x40\ \xa5\x07\xfe\x1a\x3d\x78\x99\x3e\x02\x7d\x01\xb7\xbb\x77\x6f\x4d\ \x02\x00\x7e\x9a\x7e\x19\xa5\xf8\x42\xaf\x4b\x50\xab\x19\xeb\x4d\ \x0f\x58\x8c\x9f\x33\x49\xd2\x09\x88\x7d\xb7\xde\xca\x3f\xba\xeb\ \x2e\x7e\x62\xcc\x18\xfe\xe9\x94\x29\xfc\x3f\x8f\x3e\xca\xdb\xe7\ \xcd\xe3\xb1\xc2\x42\xce\x9f\x79\xc6\x24\xf8\x0c\xdb\xb0\x0f\xf6\ \xc5\x31\x38\x16\xe7\x70\x01\x1a\xd7\xae\x21\x29\xba\x2e\xd4\x08\ \x3d\xc4\x57\x69\xb4\x2e\xc3\x08\xb2\x7b\xe0\xbd\x37\xdd\xc4\xeb\ \xf3\xf2\x34\x80\x3a\xe7\xcf\xbf\x06\xc4\xa0\x82\x73\xe1\x9c\x75\ \x23\x47\x6a\xd7\x70\x00\xfb\x14\xc9\xb7\x71\x8f\x59\x07\x2c\x74\ \x1e\x8d\xd8\x67\xe9\xe6\xff\x61\x7d\xb0\xb7\xfb\xf4\xe1\x1f\x0f\ \x1f\xce\x2f\xcc\x98\xc1\x93\x4f\x3f\x2d\x0d\x54\x27\xc1\x35\xfe\ \xf5\xf0\xc3\xda\x35\x1d\xd4\xcb\xa7\xf8\x75\x65\x8d\x9e\xde\xc5\ \xd8\x18\xba\xe9\x83\x76\xa3\xf5\xf4\x84\x09\xbc\x6b\xd1\x22\xe5\ \xa0\x3a\x09\xae\x7d\xea\xbe\xfb\x9c\x46\xf5\x01\x58\x20\x91\x05\ \xb6\x9c\xb1\x3e\xa4\x0e\x36\xd2\x8d\x7e\x2e\xde\xf8\xef\xfb\xf5\ \xe3\xe7\x1e\x78\x80\x27\x9e\x7a\xaa\xc7\x80\xb5\x0a\xee\xe5\xec\ \xfd\xf7\xf3\xf7\x6e\xb9\xc5\x0a\x32\x4c\xc0\x0d\x98\x33\x22\x05\ \xee\x5b\x8c\x0d\xd5\x6d\xd6\xd4\xcd\x56\xf6\xea\xc5\x9b\x06\x0d\ \xe2\x89\x85\x0b\x23\x03\xac\x1d\xd0\x27\xc7\x8f\xb7\x53\x1d\x1f\ \x93\x8c\x88\xca\x44\x36\xdf\x6a\xc3\x1e\xe9\xdf\x9f\xb7\xdd\x7d\ \x37\xe7\x05\x05\x9c\x3f\xf2\x48\x64\x01\x36\xa4\x6d\xee\x5c\x7e\ \x64\xc8\x10\x2b\xc8\x17\x49\xe6\xf6\x34\xb8\x25\xa2\xd9\xb5\x9b\ \x46\xed\x79\xba\x51\x0d\x58\x43\xc6\x8e\xe5\xbc\x07\xf5\xae\x1f\ \x39\x3f\x69\x92\x75\x34\x27\x49\xed\x3d\xdf\x23\x56\x02\x5d\xfc\ \xe7\xe2\x37\xfe\x7e\xdf\xbe\xfc\x33\x32\xb9\x4c\xe0\x1a\xf2\xe0\ \x83\x59\x01\x30\xe4\xea\x9c\x39\xd7\xd8\xd2\x64\x65\x6c\x2e\x63\ \xac\x57\x98\x93\xd9\x9b\xe2\x0d\x7c\x48\x2a\xa1\x6b\xf4\x68\x7b\ \x70\x21\xe4\x04\x70\x1b\x67\x21\xaa\x02\x6b\xe3\x83\xdc\x5c\xab\ \xca\x78\x03\xcf\x1e\x86\x7d\xfb\x9a\x78\xe1\xfa\x01\x03\x78\xd2\ \x09\x58\x51\xa6\x4e\xcd\x1a\x80\x0d\x69\x18\x35\xca\x0a\xf2\x36\ \xa5\x23\x99\x2e\xf0\x4b\xf1\x82\xc7\x6f\xbf\x3d\x3d\xb0\xa2\x3c\ \xf9\x64\xd6\x81\xdc\x32\x6e\x9c\x15\xe4\x5f\x29\x01\x97\x46\xee\ \x4a\xf1\x42\x27\x06\x0e\xf4\x07\x2e\x84\xec\xe1\x6c\x03\x18\x82\ \x38\x87\xf8\xec\xd2\x27\x3e\x98\x2b\xa2\xb5\x00\xb5\xe0\x1b\x5c\ \x43\x68\x12\xc9\x46\x90\x8f\x91\xd9\x29\x5a\x17\x34\xe0\x0a\x65\ \xc5\x6c\x87\x89\x76\x2e\x26\xb4\x64\x50\x70\x21\xe4\xaa\x66\x23\ \xc0\x88\x69\x58\x26\xbe\x8b\x70\xb0\x32\xb6\x18\x44\x0f\x6d\x1f\ \x99\x62\x5d\xf9\xf9\xc1\xc1\x35\x64\xd6\xac\xac\x04\x19\xd6\xc5\ \xfe\xdb\x6e\x13\x41\xfe\x28\x23\xcb\x42\x8f\x2d\xa4\x9c\x88\xab\ \x4e\x76\xae\x5f\xb9\xf7\x5e\xce\x43\x88\xa4\xa9\x90\x2b\xb3\x67\ \x9b\x9c\x11\x52\x15\xeb\x83\xea\xdd\x02\x31\x70\x73\x8d\x87\x96\ \xa9\xcc\x98\x91\x95\x00\x43\xfe\x3e\x79\xb2\x29\x40\xe4\x3b\x0a\ \xa7\x7b\x6a\x87\x8c\x93\x7c\x40\x7a\x57\x2a\xb8\x10\x32\x7f\x78\ \x84\x03\x41\xe9\xc4\x12\xbb\xf8\xa3\x5f\x93\xec\x59\x31\x2a\xd6\ \x6a\x04\x6e\x64\x8b\x83\x0b\x9d\x2c\x2e\xe6\x5d\xab\x56\xf1\xd8\ \x96\x2d\xbc\xa3\xaa\x8a\xb7\xd7\xd4\xf0\xb6\x63\xc7\x78\xeb\x89\ \x13\x9a\xe0\x7d\xfb\xe1\xc3\xda\xb6\x58\x45\x05\xef\x5a\xbd\x5a\ \x3b\x26\xec\x00\x91\x45\x55\x7c\xc3\x13\xb8\xef\x31\xd6\x57\xcc\ \x44\xfc\x6d\xd0\x20\x35\xe0\x5a\x5d\xe8\xc5\x8b\x35\xa0\x3a\x77\ \xee\xe4\xad\x8d\x8d\xbc\xb5\xa5\xc5\x9f\xd0\x31\x38\x16\x5f\x0c\ \xce\xd5\x03\x4e\xc8\x79\x4f\x13\x9e\x9e\x43\xeb\x0e\x96\xdf\x70\ \x03\x4f\xb8\xc5\x18\x64\x08\xb9\xd0\xf1\x75\xeb\x78\xfb\xc1\x83\ \xfe\x41\x75\x90\xf6\xea\x6a\x1e\x2f\x2d\x0d\x25\x9e\x2c\x06\xed\ \x69\x14\x2f\xf5\x42\xfe\x38\x69\x1c\x80\x4c\x04\x9f\x37\xaf\xdb\ \x03\x53\x00\x6e\x62\xe6\x4c\xde\xb1\x63\x87\x34\x60\xad\xd2\xb1\ \x77\x2f\x4f\xac\x58\xa1\x14\x64\x64\x46\x44\x7a\x80\x6b\x36\x44\ \x4f\xad\x6b\x3b\xbf\x7b\xf3\xcd\xe6\x34\xcf\xe3\x8f\x73\x3e\x61\ \x82\x34\x70\xe3\xcf\x3d\xc7\xdb\xea\xea\x94\x81\x6b\x48\x5b\x43\ \x03\x8f\xbf\xf8\xa2\xd2\x51\x2c\xe6\xf8\x48\x03\x7c\xd3\x6d\x04\ \xd7\x1a\x3b\x22\x41\x69\x7b\x52\x38\x09\xf7\xdc\x93\x91\xde\x8d\ \x91\x4a\x50\x0d\xac\x55\x30\x61\xaa\xd2\xcd\x48\xa4\x0a\xa3\xf8\ \x90\x23\xe3\xc6\x88\x37\x20\xb5\xee\x9a\xfd\xc5\xc8\x46\x2a\x08\ \xa6\x96\x4f\x70\x3b\x5f\x7e\xd9\xfb\x4f\xbc\xb9\x99\xc7\x48\xe2\ \x24\x09\xb2\x1e\x92\xf4\x3f\xa9\xbf\x8f\xeb\xdb\xda\x49\x3c\x83\ \xfc\xfa\xeb\x4a\x40\x8e\x93\xb9\x29\x58\x14\x49\x5b\x06\x11\x6d\ \x58\x67\x7c\x0b\x7f\x19\x31\xc2\xdb\xc9\x61\xc7\xc2\xd4\xf2\x08\ \x70\x6c\xe3\x46\x6f\x40\x00\x48\x02\x91\x7b\x14\xec\x1b\xf3\x0a\ \xf2\x2b\xaf\x28\x19\xc5\x7f\x1e\x36\x4c\x1c\xc5\x6b\xed\x1c\x8b\ \x14\x57\xec\x82\x5f\x2f\x0b\xac\x1c\xf2\x6e\x5c\x75\xee\xb2\x65\ \x69\x1f\xbe\x53\x1f\xa1\xdc\x07\xb8\x26\xa0\xe9\xd8\x4e\x0f\x23\ \x3a\xbe\x61\x83\x74\x80\x41\x6e\x11\x59\x43\x26\x22\x0b\x7d\x30\ \x4e\x24\x88\x04\x66\xdc\x3c\xf1\x04\xe7\x13\x27\xda\x5a\x0b\x9a\ \xa3\xe0\xf6\xd0\x19\x00\x6b\x95\x78\x1a\x90\x31\xf1\xc9\xb6\x2e\ \x80\xd9\x9e\x1b\x6f\x14\x41\x2e\x10\x01\xfe\x41\x2a\xd6\x8b\x80\ \x4e\xa6\x17\x44\xcc\x77\xfc\xf8\x14\xc0\x6e\xa6\x58\x1b\x49\x42\ \x12\xb0\xa2\xe0\x9c\x6d\x69\x4c\x38\xd9\xa3\x18\xaa\x55\x00\xf8\ \x7b\x22\xc0\x55\xc6\x06\x90\xe6\xa4\x5c\x10\xbf\x02\x1a\xb9\xf1\ \xe5\xcb\x5d\x47\x53\x42\xe2\xc8\xb5\x03\xd9\xed\xda\x5d\x6b\xd7\ \xaa\x0c\x02\x55\x8a\xce\xc5\x65\x63\x43\x87\xcc\xbc\x19\xcd\xd8\ \x6e\x1e\x5a\x5c\x11\xb0\x5e\xd5\x05\x3c\x3e\x99\x56\x05\xb0\x13\ \x00\xbe\xa4\x25\x48\xf5\xb0\x64\x8a\x9f\x2b\x35\x40\xbd\x7a\xb5\ \xeb\x84\xe6\x03\xa8\x93\x24\xe5\x24\xa5\xba\xe0\xfd\x29\xaf\xc7\ \xbb\x4d\x7c\x5d\x2b\x57\x4a\x7d\xe6\xf7\xfb\xf7\x4f\x81\xbc\x8b\ \xb1\x7c\xa6\xd7\x44\x68\x1f\x80\xc0\x2c\xf3\x62\x5a\xe0\xc6\xe1\ \xc1\x3c\x59\x0b\xcd\xcd\xd5\xf4\x7f\xb2\x63\x58\xb5\xb9\x79\x0a\ \x6d\x3f\xe4\xc5\x8c\x73\xd2\xc7\x9d\x34\x3f\xc8\x7c\xe6\x0f\x87\ \x0e\x15\x63\x13\x85\xa6\x6c\x31\xb2\xa7\xd2\x66\xd5\x25\x4b\x1c\ \xa3\x62\xb1\xf4\xe0\x26\x79\x53\xd3\x1a\xce\x79\x5a\xce\x2e\xf6\ \xa1\xfd\xcb\xb4\x63\x5c\xce\x19\x73\x1a\xc5\xc7\x8f\x73\x5e\x54\ \x24\xed\xb9\x9b\x68\x52\x17\x00\xfe\x31\x13\x89\x24\xd2\x26\x38\ \xa8\x87\x55\xab\x9c\x47\x6f\xba\x91\x4b\xe0\xfa\x26\xc5\x74\x83\ \xec\x3a\x8a\xc3\x50\x13\xe2\x44\x47\xd8\xfe\x9a\xe9\x35\x0b\xda\ \x07\xa8\x77\x90\x75\x21\xf8\xfe\x4e\xee\x6f\x5a\xb5\xe0\x61\xe4\ \x3a\x8c\x64\x57\x75\xd1\xee\xe4\xdd\x95\x97\x4b\x7b\xee\xcb\xb3\ \x66\x99\xe3\x12\xf4\xa7\xd1\xf8\x00\x45\x25\xd2\x66\xd4\xaa\xaa\ \xa0\xea\x61\x72\x60\x6a\x57\x4b\xcb\xd4\x20\x6a\xa2\x63\xf7\x6e\ \xa9\x99\x0e\x01\xe0\xbf\x02\xe0\xf3\xc6\x07\x9f\x2f\x58\x20\xed\ \x42\xed\xb5\xb5\x41\x3c\xb6\x53\x19\xf3\xe7\xba\x2d\x0e\x5f\x26\ \x1b\xd2\x4f\xb2\x9e\x1b\x18\x0a\x00\x9f\x65\x22\xa9\x44\x66\x51\ \x4a\xdb\xd1\xa3\xf6\x8e\x85\xfb\xe8\x2d\xcf\x18\xe0\xa6\xa6\x2d\ \x7e\x1d\x8f\xb6\xfa\x7a\xa9\x2e\xb3\x00\xf0\xbf\x99\x5e\x97\xa0\ \x85\xdb\x64\x9a\x2b\xad\x4d\x4d\xfe\x3d\xb7\x00\x93\x9b\xcd\x08\ \x2e\xf5\xed\xd9\x91\xb5\x23\xf3\xd9\x2b\x73\x72\x0c\x80\x3b\xa3\ \x05\x30\x81\x23\x01\xe0\xb2\xa8\x01\x1c\x1d\x15\xd1\xdc\x5c\x21\ \x01\xe0\xad\x51\x53\x11\x6a\x26\xb9\x9a\x9a\x20\x93\xdc\x69\x09\ \x00\x9f\x89\xda\x24\x17\x2d\x33\x8d\x4c\xad\x0c\x26\xb8\xe9\x51\ \x34\xd3\xd4\x38\x1a\x15\x15\xc1\x1c\x0d\x38\x0b\xc1\x1c\x8d\x5e\ \x74\x6c\x4d\x14\x1d\x8d\xdf\x2a\x71\x95\x5d\x22\x69\x1e\xf2\x6d\ \xbe\x27\x3b\xd2\xdf\xeb\x03\xbb\xca\x25\x25\xaa\x62\xc2\x5b\x8d\ \x5a\x37\xf9\xc1\x9e\xe2\x62\xe7\x60\x0f\x49\xda\x60\x0f\xac\x01\ \xaf\xc1\x9e\x6e\x70\x23\x17\xec\x21\x79\x01\x00\x2f\x8c\x6c\xb8\ \x12\xea\xa2\xb1\x71\x9a\x23\xb8\xb4\x2d\x9d\x5a\xe8\xc9\x70\x25\ \xaa\x60\x99\xde\xe3\xa6\xbb\x98\x10\x34\x55\x99\x01\x77\x97\x88\ \x9a\xcf\x80\xfb\x69\xdd\x43\xeb\x0e\xb8\x77\xbf\x3f\xe3\x39\xe0\ \xee\x96\x36\x52\x18\x70\x27\xf9\xba\xfa\x94\x51\x75\x75\x28\x99\ \xe4\x40\x29\xa3\x03\x07\xd4\xa7\x8c\xf4\xbc\xdc\xdb\x2a\x26\x3a\ \x8d\xf5\x52\x5a\x1a\xdd\xa4\xe7\x9a\x35\x2a\x93\x9e\xbb\x44\xca\ \xea\xf7\xa5\xa6\xed\xad\xdf\xec\x3b\xef\x84\x9f\xb6\xa7\x2f\xce\ \x35\x6d\xbf\x7d\x3b\xe7\x93\x26\x49\x2d\x8e\x14\xd3\xf6\x3b\x19\ \xfb\x6e\x0a\x60\xd2\xc3\x63\xa5\x10\x4f\x9c\x18\x88\x2b\x56\x68\ \x64\x8f\xc8\x10\x4f\xea\xea\x78\x12\xdc\x3a\x83\x04\x3e\x7d\x3a\ \xe7\x19\x7a\xb1\x56\xe2\x89\xa9\x6e\x43\xa7\x4e\xa5\x1a\x17\x81\ \x06\x24\x9d\x20\xe7\x81\x51\xd9\xe9\x93\x93\x66\x67\x2d\x74\x7a\ \xe0\xa7\xc5\xc1\xea\xb1\x63\xdb\x3f\xf4\x50\xe0\xd6\x0b\xff\xa4\ \x63\x05\xf5\xf0\x89\x1d\xb3\xbd\xcc\xd8\x01\x0d\x84\x54\x10\xe4\ \x62\xaf\xbe\x9a\x9e\xcf\x1b\x94\xfc\x97\x46\x25\xa4\x6c\x70\xfa\ \xa2\x5d\x49\x8a\xa0\xe6\xce\x9c\xe9\xbb\xcc\x4c\x24\xff\x91\x7a\ \xf8\xe9\x35\x00\xd3\x90\xce\x33\xe8\xab\x08\x5d\x2a\x69\x5e\x44\ \x33\x36\x28\xa4\x9e\x4b\x01\x74\xb0\x35\xfa\xaa\x4e\x0c\x4c\xea\ \xef\x53\xf4\x55\x3f\x1c\xe1\x97\x5e\xf2\x4e\xb5\x05\xf5\x6b\xf6\ \xec\x40\xf4\xd5\xb7\x18\x1b\xee\xc4\x11\xae\x49\x4b\xc0\x96\x11\ \x71\xda\xbc\x39\x7c\x02\xf6\xa6\x4d\xc1\x08\xe3\x20\x33\x82\xd4\ \xe8\xf2\x3c\xe8\xfb\x23\xa8\x87\x83\x6e\x0c\xf7\x22\x71\xb2\x53\ \xd9\x29\x0a\xe6\x5b\x3a\xc6\xa5\x94\x12\x82\xa3\x47\x35\x7e\x5c\ \xc6\x65\x0f\xb0\x38\x6c\x9a\xe7\x59\x4b\x08\x5c\xcb\xb9\x6c\x8b\ \x60\x54\x56\xe9\xd0\x64\xd3\xb1\x67\x8f\xba\x22\x98\x6d\xdb\xfe\ \x6f\x2d\xc8\x2a\x3b\x9b\x36\xcd\x54\x40\x79\x86\x46\xb8\xa5\x9b\ \x60\x4e\xba\x22\xc4\xef\x18\x07\xa0\x44\x29\x8c\x7e\x67\x30\xf8\ \xdd\x3c\x3e\xdf\x65\x5c\xe4\xa1\x75\x2d\x5d\xaa\xb6\xbe\x8f\xac\ \x86\x04\x99\x76\x28\x16\x12\x00\xfe\x96\xa7\x7e\x93\x68\x37\x68\ \x1c\x84\x62\xbb\x50\xaa\x27\x51\x88\xb8\x72\xa5\x16\x7c\x41\x84\ \xcb\x37\xb0\x74\x0c\x8e\xd5\x62\x0b\x70\x7f\x65\x8e\x5c\x07\x69\ \x1e\x3c\x58\x04\xf7\x9c\xe7\xca\x7b\x32\xd9\x96\xa4\x4a\x69\x73\ \x72\x78\x6b\x1a\x25\x2f\x5d\x8a\x8a\x34\xa0\x10\x08\x47\xb6\x01\ \x29\x1d\x2d\xc7\x87\x44\x2a\x09\xde\x6b\xa5\xb4\xb4\x0d\xfb\x68\ \xf1\x5c\x6b\xc8\x11\xbf\x3c\x54\xf5\x2b\x02\x17\x7d\xe1\xd0\x81\ \x40\x28\xdf\x5a\xec\xb7\x18\xfc\x40\xaa\xd1\x1c\x2a\xed\xb3\xb1\ \x68\x1b\x19\x1a\x45\x00\xd7\xf6\xeb\x27\x8e\xde\xfd\xbe\xf3\x5b\ \x64\x17\x8f\x42\xda\x39\xac\x09\x4f\x89\xc0\x59\x40\x87\x15\xc9\ \xe0\x9e\xbd\xf3\x4e\x53\x3b\x03\x8d\x07\x1c\xb0\x67\xc4\x06\xb1\ \xfb\xf4\x15\x8f\x86\x77\xa4\x04\x15\xaa\x12\xc1\xbd\x92\x97\xa7\ \x75\x20\x10\x54\x43\x59\x46\x9d\xab\xc5\xea\x4f\x04\x93\xbb\xb2\ \xa4\x4d\xa2\x49\x24\xd5\x5a\xc7\xf3\xf3\xb5\x0e\x87\xc2\xe8\x3d\ \x9c\x71\xa7\x56\xbd\xb3\xea\xc5\x54\x73\x8e\xdc\xdc\x50\x1a\x2b\ \x4b\x15\x84\x24\x61\x5a\x65\x00\x2e\x1a\x41\x1d\x31\x67\x2b\x2e\ \x90\x0c\x51\xd3\xd6\x4b\x41\xcc\x58\xb9\xa0\xf3\x60\x06\x00\xd7\ \x0d\x18\x20\x82\x9b\x20\x99\x23\xbb\x77\xda\x0b\xa6\xc6\x74\x12\ \x33\xd0\xa1\x08\x1a\x7f\x04\x1c\xc5\x4d\x03\x07\x5a\xbb\xff\xfd\ \x48\x55\xf7\xbf\x5f\x98\x5a\x2b\xa2\xc5\x57\x36\x81\xec\xa3\xae\ \xda\x90\x96\x3b\xee\xb0\x82\xbb\x49\x69\x73\x50\x7d\xd5\x15\x2e\ \xc6\x8e\xb3\x46\x27\x63\x82\xf6\xd8\x21\x00\x3a\xb7\xde\xac\x16\ \x60\x31\xbc\xa9\xbc\x99\xbe\xde\xac\xee\x0d\xf1\xc2\x98\xf8\xb2\ \xc6\xba\xf0\xe0\x42\xc3\x5a\xb0\x4c\x68\x88\x92\xbd\x16\x5a\x6f\ \x77\xbd\xcd\xed\xcf\xac\xcd\xf0\x3f\x7b\xec\xb1\xe8\x03\x9c\xc6\ \x85\x46\xf3\xbd\x7d\x66\x53\x2c\xdc\x06\xcd\x96\x98\xc5\xf3\xa6\ \x16\xe3\xe4\x8c\x64\x85\xc7\xe7\xe0\x42\x9f\x23\x0f\x4d\x74\x22\ \x60\x2d\xd0\x33\xfe\xb0\xa7\xfb\xb8\xcf\x15\xed\x64\x48\x2d\xdd\ \x28\x68\x9c\x91\x76\xa1\x85\xfe\x43\xe8\x0b\x67\x89\x2d\x18\x76\ \xee\x1c\x16\x85\x57\x25\x63\xb9\x62\xba\xc9\x88\xc2\x81\x08\x17\ \xa5\xf5\x33\xac\xbd\x2d\xd0\xb2\xec\xe4\xe0\xc1\xa6\xa8\x98\xe1\ \xa1\x49\x73\x22\x64\xbd\xf4\x05\xa1\xd6\x1b\x35\x1f\x62\xd0\x1e\ \xad\xaf\xa2\xb8\x50\xc9\xbb\x16\x5d\x8b\xe0\x16\x62\x0b\x91\x5b\ \xa8\xc4\xb2\xd4\x4e\x3e\xdd\xe8\x9f\xec\x96\xda\x41\x77\xa6\x78\ \x0f\xf6\xab\xc4\xb5\x5d\x96\xda\xd9\x8f\x08\x22\xcb\x96\x17\xfa\ \x87\x89\xf5\x1f\xe2\x44\x08\x0e\x01\xc8\x2d\x61\x2d\x16\x05\x52\ \x08\xae\xe9\xb0\x58\xd4\x39\x5f\xc1\xf2\x28\xbd\x60\x33\xa3\xdd\ \xa0\x98\x48\x15\x05\x54\x23\xf0\xb9\x40\x9a\x93\xc9\xea\xc4\xb9\ \x70\x4e\x9c\xdb\xd2\x47\xc7\xc4\xbe\x41\x0e\x4d\xf9\xd2\x0d\x21\ \x59\x1a\x39\xfa\x88\x3e\xec\xb6\x60\x1f\xc2\xa1\x20\x30\x63\x72\ \x04\xcb\x13\xf5\x0e\xb0\x46\x9c\x16\xec\xc3\x36\xec\x03\x30\x71\ \x0c\x8e\xb5\xf0\x73\xed\x16\xec\x3b\x84\xd4\x7a\x8f\xd8\xb5\x21\ \x81\x3d\x02\x7d\xc5\xf4\x14\x77\x58\x4b\x4e\x7e\x42\x5f\xf0\x1a\ \x47\xc6\xcd\xf5\xfa\xb2\x2c\x9a\x7a\x51\xe2\xa2\xa9\x57\xbf\xb0\ \x8b\xa6\x3a\xbd\xf0\x93\x05\xe5\x9e\x40\x59\x80\x4e\x21\x68\x66\ \xa1\xdb\xd6\x0d\x7a\xd3\xbc\x4b\xc2\xb2\xbf\x97\xf4\xcf\x1a\xf4\ \x7d\xb6\xea\xc7\x14\xe2\x1c\x51\xfa\xf9\xff\x0f\xa6\x13\x65\xa9\ \xb5\xbd\x41\x4b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x04\x19\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\xbc\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x55\x55\xff\x40\x40\xff\x66\x66\xff\x55\x55\xff\x49\x49\ \xff\x60\x60\xff\x55\x55\xff\x4d\x4d\xff\x5d\x5d\xff\x55\x55\xff\ \x5b\x5b\xff\x55\x55\xff\x50\x50\xff\x5a\x5a\xff\x55\x55\xff\x59\ \x59\xff\x55\x55\xff\x51\x51\xff\x55\x55\xff\x58\x58\xff\x58\x58\ \xff\x55\x55\xff\x52\x52\xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\ \x53\x53\xff\x57\x57\xff\x55\x55\xff\x53\x53\xff\x55\x55\xff\x53\ \x53\xff\x55\x55\xff\x53\x53\xff\x55\x55\xff\x53\x53\xff\x57\x57\ \xff\x55\x55\xff\x53\x53\xff\x57\x57\xff\x55\x55\xff\x57\x57\xff\ \x56\x56\xff\x55\x55\xff\x54\x54\xff\x55\x55\xff\x54\x54\xff\x56\ \x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\ \x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x56\ \x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x54\x54\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\ \x55\x55\xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x56\ \x56\xff\x55\x55\xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x56\x56\ \xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\ \x54\x54\xff\x56\x56\xff\x56\x56\xff\x55\x55\xff\x56\x56\xff\x54\ \x54\xff\x55\x55\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\x54\ \xff\x56\x56\xff\x55\x55\xff\x54\x54\xff\x54\x54\xff\x56\x56\xff\ \x55\x55\xff\x56\x56\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x54\ \x54\xff\x55\x55\xff\x54\x54\xff\x54\x54\xff\x56\x56\xff\x55\x55\ \xff\x54\x54\xff\x54\x54\xff\x56\x56\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\ \xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\ \x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\x55\xff\x55\ \x55\xff\x55\x55\x79\xa6\x59\x71\x00\x00\x00\x94\x74\x52\x4e\x53\ \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0e\x0f\x10\ \x11\x12\x14\x15\x16\x18\x1a\x1d\x1e\x1f\x21\x22\x23\x25\x26\x27\ \x28\x2a\x2b\x2d\x2e\x30\x31\x32\x33\x34\x35\x36\x38\x3b\x3c\x3d\ \x3f\x40\x41\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4d\x4f\x50\x51\ \x53\x54\x56\x57\x59\x5a\x5b\x5c\x5e\x60\x62\x63\x68\x69\x6b\x6d\ \x6e\x6f\x71\x72\x74\x75\x76\x77\x78\x79\x7a\x7c\x7d\x7f\x80\x83\ \x84\x86\x88\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x94\x95\x96\x98\x9a\ \x9b\x9c\x9d\x9f\xa0\xa3\xa4\xa5\xa6\xa9\xaa\xab\xac\xad\xb0\xb2\ \xb4\xb5\xb6\xb7\xb8\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\ \xc5\xc6\xc7\xca\xb6\xf2\xa6\x6e\x00\x00\x01\x78\x49\x44\x41\x54\ \x18\x19\x05\xc1\x89\x22\x13\x00\x00\x00\xd0\x37\x33\xcd\xd9\x46\ \x8e\x8a\x8a\x46\x8a\xa2\x4b\x17\x89\x28\xa1\x1c\xa9\x74\x11\x1a\ \x29\x57\xba\x28\x72\x94\xd8\xe6\x88\x7e\xb8\xf7\x00\xe1\xf6\xc5\ \x64\x22\xb1\xb3\xd0\x92\x01\x00\x5d\xfb\x7d\x25\x50\xf2\xec\x6f\ \x13\x00\xda\xc2\x99\x2d\x73\xab\xeb\xef\xce\xcb\x99\x8d\x07\x80\ \xdc\xad\x5c\xed\x07\x03\xa7\x32\xc3\xb5\xd3\xbf\x4a\x0d\xc6\x81\ \x2f\xb7\x8c\x4c\x1d\x12\x7b\xd1\x7f\x39\xad\xfc\xe0\xa2\xd9\x26\ \xa8\x9b\xd7\x35\xe1\xea\x89\xb2\x2b\x8d\xc3\xbb\xb5\x85\xff\x62\ \xd9\xfb\x21\x2c\x95\x46\x76\x43\xd7\x57\x33\x21\xfa\xe7\x42\xf1\ \x76\xf0\x69\x2b\xe1\xa4\x9e\x8e\xf4\xbd\xac\xf4\xe7\xc9\x54\x6f\ \x20\x7f\x37\xf4\xaa\xf9\xf8\x57\xaa\xc7\xad\xe4\xdd\x7c\x69\x78\ \x20\x10\x1c\xe9\x37\xd4\x50\xfa\xc9\x2e\x4d\x7d\x12\x06\xaf\xd9\ \x76\xe4\x70\x70\x4f\xcd\xa4\x6d\x6b\x59\xee\x3e\x94\x30\x54\x67\ \x4b\x5b\x8f\x8f\x27\x43\x1b\x36\x82\x1f\xca\x35\x0c\x58\xcb\x79\ \xd0\x61\x27\x50\x39\xe3\x51\x8b\x94\x6f\x85\x8f\x1b\x55\x4c\x7b\ \x53\x5f\x13\xb7\x52\x14\xde\xd4\x30\x28\xe5\x7d\x2c\x3f\x2a\x7d\ \x43\x73\x5f\x78\xc3\xcc\x69\x29\xd5\x63\x92\xc6\xab\x60\x3d\xab\ \x7e\x48\xca\xeb\x7a\x49\xa5\x73\x52\xe2\x55\x70\x2c\xed\x4c\xdc\ \x66\xfa\x93\x1b\x12\x69\xd1\x25\x89\xb4\xb7\xd5\x40\xe5\x84\xef\ \x05\xbd\xb7\xfd\xcc\x0b\xd4\x4a\x1a\x3b\x0b\xc4\x26\x7d\x3e\xda\ \xdd\x6a\x39\x92\x71\x49\xc2\xe8\x39\xa0\x6c\xd4\x54\x79\xe7\x7d\ \xcb\x91\xc2\x05\x09\x45\x19\x00\x2a\xb2\xee\x75\x5a\x8e\x14\x2c\ \xfa\x0d\x00\xdc\xe9\xb6\x1c\x89\xfe\x90\x0d\x00\x64\x47\xcd\xe7\ \x28\x06\xfc\x07\xa8\x1e\x53\x72\xa9\x10\xe2\x95\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x51\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x02\x2b\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\x80\ \x00\xff\xaa\x00\xff\xbf\x00\xff\xcc\x00\xff\xaa\x2b\xdb\xb6\x24\ \xdf\xbf\x20\xe3\xc6\x1c\xee\xbb\x1a\xef\xbd\x19\xe8\xb9\x17\xe9\ \xbc\x17\xe9\xbd\x16\xea\xb8\x15\xea\xba\x15\xeb\xbc\x14\xeb\xb7\ \x14\xec\xb9\x13\xec\xbb\x19\xed\xbc\x18\xed\xb8\x18\xee\xb9\x17\ \xe8\xbb\x17\xe9\xbc\x16\xe9\xb8\x16\xeb\xb9\x14\xeb\xb9\x17\xeb\ \xba\x17\xec\xbb\x17\xec\xb9\x16\xec\xba\x16\xec\xbb\x16\xea\xb9\ \x15\xea\xb9\x17\xeb\xbb\x17\xeb\xb9\x16\xec\xba\x16\xec\xba\x16\ \xec\xbb\x16\xec\xb9\x15\xea\xba\x15\xea\xb9\x15\xea\xb9\x17\xeb\ \xbb\x17\xeb\xb9\x17\xeb\xba\x16\xec\xbb\x16\xec\xba\x15\xec\xbb\ \x15\xea\xba\x17\xeb\xbb\x17\xec\xba\x16\xec\xba\x15\xec\xbb\x15\ \xec\xb9\x15\xea\xb9\x17\xeb\xba\x16\xeb\xba\x16\xeb\xb9\x16\xeb\ \xba\x16\xeb\xba\x16\xec\xbb\x15\xea\xba\x17\xea\xba\x17\xeb\xba\ \x16\xeb\xba\x16\xeb\xb9\x15\xec\xba\x17\xea\xba\x17\xea\xba\x16\ \xea\xbb\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\x15\xec\xbb\x17\xec\ \xba\x17\xec\xba\x16\xea\xba\x16\xeb\xba\x15\xeb\xbb\x15\xeb\xba\ \x17\xec\xba\x17\xec\xba\x16\xec\xb9\x16\xea\xba\x16\xeb\xbb\x16\ \xeb\xb9\x16\xeb\xba\x16\xeb\xb9\x16\xeb\xba\x15\xeb\xba\x17\xeb\ \xba\x16\xeb\xbb\x16\xeb\xba\x16\xeb\xba\x16\xec\xba\x16\xea\xb9\ \x16\xea\xba\x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x17\xeb\xba\x17\ \xeb\xba\x16\xeb\xb9\x16\xec\xba\x16\xea\xba\x16\xeb\xba\x16\xeb\ \xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\ \x16\xec\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x16\ \xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xea\xba\x16\xeb\ \xba\x16\xeb\xba\x17\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xbb\ \x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\ \xeb\xba\x16\xeb\xba\x16\xeb\xbb\x18\xeb\xbb\x19\xeb\xbc\x1b\xec\ \xbd\x20\xec\xbe\x22\xec\xbf\x27\xed\xc1\x2e\xed\xc2\x31\xee\xc3\ \x34\xee\xc3\x36\xee\xc5\x3a\xef\xc6\x3f\xef\xc7\x43\xef\xc8\x45\ \xef\xc8\x46\xf0\xca\x4d\xf0\xcc\x51\xf1\xcf\x5d\xf1\xd0\x5f\xf2\ \xd3\x6a\xf3\xd6\x73\xf4\xda\x83\xf5\xdd\x8b\xf6\xdf\x92\xf7\xe3\ \xa2\xf8\xe6\xaa\xf8\xe8\xb1\xf9\xeb\xbc\xfa\xed\xc1\xfa\xef\xc8\ \xfb\xf0\xcc\xfb\xf2\xd2\xfb\xf3\xd6\xfc\xf3\xd7\xfc\xf4\xda\xfc\ \xf6\xdf\xfd\xf7\xe3\xfd\xf9\xea\xfd\xfa\xed\xfe\xfb\xf0\xfe\xfb\ \xf2\xfe\xfd\xf7\xfe\xfd\xf9\xff\xfe\xfa\xff\xfe\xfb\xff\xff\xfe\ \xff\xff\xff\xee\x1f\xa5\xc6\x00\x00\x00\x89\x74\x52\x4e\x53\x00\ \x01\x02\x03\x04\x05\x06\x07\x08\x09\x1e\x1f\x21\x22\x23\x24\x25\ \x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x33\x4d\x4e\x4f\x50\x51\ \x52\x54\x57\x5a\x5b\x5c\x5d\x5e\x5f\x60\x62\x63\x65\x66\x67\x69\ \x6b\x6c\x6f\x70\x76\x77\x78\x79\x7c\x7d\x7e\x80\x81\x82\x83\x86\ \x88\x89\x8c\x8f\x91\x93\x94\x95\x96\x97\x9c\x9d\x9e\x9f\xa0\xa7\ \xa8\xa9\xaa\xab\xac\xad\xaf\xb0\xb1\xbb\xbf\xc0\xc1\xc2\xc3\xc4\ \xc5\xc6\xc7\xc9\xca\xcb\xcc\xd0\xd1\xd2\xd3\xd4\xd9\xda\xdb\xdc\ \xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xeb\xec\xed\xee\xef\xf0\ \xf1\xf2\xf3\xf8\xf9\xfa\xfb\xfe\xca\xd9\x5f\x39\x00\x00\x03\x4c\ \x49\x44\x41\x54\x58\xc3\xb5\x99\xe7\x5b\x13\x41\x10\xc6\xe7\x12\ \x8a\x22\x88\x48\x13\x11\x63\x50\x8a\x62\x47\x82\x20\x2a\x04\xbb\ \xd8\xc0\x8a\xe2\x51\x54\x10\x0b\x24\x08\x62\x49\xc0\x92\x90\x45\ \xc5\x82\xbd\x61\xef\xbd\xe0\xfc\x79\x7e\xa0\x05\x92\xbb\xdb\x76\ \xef\xe7\xbd\xdf\x73\xcf\xee\xec\xec\xcc\x3b\x00\x86\xb2\x26\xdb\ \x0b\xb7\xd7\x35\xbb\xbc\x3e\x9f\xd7\xd5\x5c\xb7\xad\xd0\x9e\x64\ \x05\x61\xc5\x2d\xae\xf2\x90\x10\x5d\xa9\x76\xa4\x5b\x04\xa8\x53\ \x1c\xad\x44\x53\x1d\x65\x09\x7c\xd4\xc8\xdc\x7a\x62\xa0\xba\x9c\ \x08\x66\x6c\x54\xee\x69\x42\xa1\xb6\xfc\xc9\x4c\x58\x25\xef\x3c\ \xa1\x54\xe7\x7c\x85\x9e\x9b\x56\x4b\x18\xa4\xce\xa0\xc4\x46\x97\ \xf7\x10\x26\xf9\x9d\x51\x54\xa1\xd0\x40\x98\xd5\x38\xd5\x98\x6b\ \xf3\x12\x0e\x5d\x9a\x6b\xc4\x2d\x21\x9c\x2a\xd6\xbf\xbd\x9b\x09\ \xb7\x36\xea\x5c\xc5\xe8\xdd\x44\x40\x95\x9a\x47\x68\xa9\x22\x42\ \xda\xa7\x95\x9b\xd6\x13\x41\x6d\x09\xcf\x5d\x4d\x84\x55\x14\x8e\ \x9b\x29\xce\x25\x01\x7b\x28\x77\x6a\xb7\x04\x30\xe9\x8a\x0d\x09\ \x88\x46\x22\x45\x47\x27\x86\x46\xb9\xd6\xca\xbe\x87\xd7\x98\xc8\ \xce\xf1\xdc\x54\xbf\xc6\xba\xde\x2f\xf8\xf1\x1e\x0b\xb8\x27\x6d\ \x5c\xfe\x3d\xa4\xb5\xee\x0e\x22\xfe\x19\x60\xf9\x69\x35\x38\x3f\ \xe7\x69\x2e\xeb\x47\x44\xc4\x0f\x77\x19\xc8\xd9\x41\x27\x77\xce\ \x00\x8c\xbf\x07\x7a\xa9\xc1\x67\xc7\xce\x6f\x29\x31\x02\x23\xbe\ \xbb\x4d\x4d\x5e\x34\xfa\x1e\xbb\x29\xc0\xf8\xeb\x39\x2d\xd8\x35\ \xf2\x76\xe7\x12\x1a\x30\xe2\xdb\x5b\x8c\xbb\xdc\x40\x09\xc6\x9f\ \xcf\xe8\xc0\xb5\x43\xdc\x69\x01\x5a\x30\xe2\x9b\x9b\x54\xe4\xa1\ \x1a\x69\x2d\xa1\x07\xe3\xf7\x27\x34\xe0\x12\x00\x00\xa5\x8d\x05\ \x8c\xf8\xba\xcf\x18\xdc\xaa\x00\xc0\x4c\xc2\x06\xc6\x6f\x8f\x8d\ \xc9\x29\x00\xb0\x82\x15\x8c\xff\x5e\xdd\x30\x02\x2f\x07\x80\x03\ \xcc\x60\xc4\xaf\x8f\x0c\xc0\x7b\x01\xac\x5d\x1c\x60\x1c\x7c\x79\ \x5d\x3f\xe1\x5b\x21\x99\xf0\x80\x11\x3f\xdf\xd7\xfd\x2e\x11\xec\ \x9c\x60\xfc\xfb\x42\x2f\x99\xce\x86\x95\xbc\x60\xfd\x64\x5a\x00\ \x3b\xf8\xc1\x7a\xc9\xb4\x02\x54\x01\x30\xe2\xfb\x7e\x8d\xef\x6a\ \xe0\xa4\x10\x58\x33\x99\x1e\x87\x33\x62\x60\xad\x64\xea\x06\x8f\ \x28\x18\x7f\x3c\x0d\xf3\xdd\x05\xf0\x09\x83\x71\x30\xcc\x46\x5f\ \x35\x0f\x6c\xda\x56\x98\x76\x78\x27\xcc\x0a\x37\xb1\x0b\xa2\x59\ \x6d\xd4\x98\x77\xa5\x4d\x4b\x42\x73\xcc\x49\x9b\x19\xdc\x89\xfe\ \x93\x51\xa2\xb7\x7a\xcd\x78\x9a\x3c\x16\x80\xfd\x66\x3c\xa6\x7b\ \x00\x20\xdf\x8c\xe7\x7f\x19\x00\xa4\x99\x51\xb0\x24\x01\x80\xe2\ \x96\x5f\x62\xb5\x28\x00\x00\x6b\xe4\x17\x85\xab\x00\x00\x20\x5e\ \x7a\x19\x1b\x18\x76\x72\xea\x65\x17\xde\xea\x70\x45\x9f\x23\xbb\ \x55\xc8\x1a\x31\x6c\x5a\xe4\x36\x37\xad\xa3\xc6\xe4\x12\xb9\xed\ \xd8\xc2\xb1\x06\xb2\x53\x66\x03\xd9\x1e\x64\x00\x2c\x90\xd9\xf2\ \xce\x0b\x6e\xd2\x0f\xca\x6b\xd2\x0f\x8f\x33\x51\x53\xe4\xd9\x0a\ \x13\x2c\x54\xa7\xa6\x11\xf2\x80\xcd\x08\x29\x9d\xe8\x6f\xd7\x13\ \x29\x3a\x12\xe2\xea\xc5\x78\x64\x70\xbd\xb1\xa1\x36\xd6\xac\x80\ \x04\x7b\xcc\x16\xce\x78\x2b\x16\x07\x3b\xc2\x5b\x85\xeb\x44\xb9\ \x9b\xb4\x4c\xd3\x5d\x62\xdc\x9d\x9a\x46\x6f\x54\xa5\x10\x57\xc7\ \xa9\x57\xca\xf9\xb9\x1b\xf4\x67\x44\x45\x9c\xb1\x11\x28\x34\x32\ \xe9\x33\xb8\xe2\xb9\x3b\xd3\x78\xac\x10\xc3\x71\x07\x8f\xc5\x51\ \x8d\x99\x9c\x7e\x36\xac\xbf\x34\x92\x72\x76\x93\x50\xcd\xc2\xad\ \x49\x65\x18\x62\xe5\x74\x50\xbf\x17\x59\x0a\xe3\x34\xef\x14\x0d\ \xd6\x9d\x3f\x89\x79\xa2\x17\x91\x5d\x6b\x10\x7a\x01\x35\x8b\x73\ \x78\x1a\xe3\xd0\x99\x16\xb6\x97\xc5\x0b\x0e\x63\x2f\x86\x42\x2f\ \x57\x3b\xd2\x15\x10\x95\x25\xd1\xe6\xa8\x50\x9b\x5c\x1e\x9f\xcf\ \xe3\x6a\x52\xb7\x16\xd8\xa6\x53\x4c\x78\xff\x03\x40\xad\x5d\x8c\ \xe4\xb7\xa5\x38\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x02\x2a\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xe4\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\xbf\ \x00\x80\x80\xaa\xff\xaa\x00\x80\x80\xb3\xe6\xb3\x1a\xea\xbf\x15\ \xeb\xb1\x14\x70\x80\xbf\x78\x87\xc3\xf1\xb8\x1c\xe6\xbf\x1a\xe7\ \xb6\x18\xe7\xc2\x18\x6f\x85\xbc\xe9\xbc\x16\x72\x84\xc1\xea\xb8\ \x15\x75\x83\xc1\xea\xba\x15\x71\x82\xbe\xed\xb8\x18\xe8\xbb\x17\ \x74\x85\xbc\x72\x82\xbe\x71\x84\xbd\xed\xbc\x16\xe9\xb9\x16\xea\ \xb9\x15\xeb\xba\x14\xeb\xbb\x18\x74\x83\xbd\xeb\xbb\x14\xeb\xb9\ \x17\xec\xbb\x17\x73\x83\xbf\xec\xb9\x16\xea\xb9\x15\xec\xba\x16\ \x73\x82\xbe\xeb\xba\x16\xeb\xba\x16\xec\xb9\x15\xec\xba\x15\xea\ \xb9\x17\x72\x83\xbf\xeb\xba\x16\xeb\xb9\x16\x73\x83\xbf\xea\xba\ \x17\xeb\xba\x16\xea\xb9\x16\x73\x83\xbf\xec\xba\x17\x73\x83\xc0\ \x73\x83\xbf\xeb\xba\x16\x74\x83\xbf\xeb\xb9\x16\x73\x84\xbf\xeb\ \xba\x15\xeb\xba\x16\xeb\xbb\x16\x72\x83\xbf\xea\xba\x16\x73\x83\ \xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xc0\x73\x83\xbf\x73\x83\xbf\ \x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\xfd\xb7\x99\x59\ \x00\x00\x00\x4b\x74\x52\x4e\x53\x00\x01\x04\x06\x06\x0a\x0a\x0c\ \x0d\x10\x11\x12\x14\x15\x15\x17\x17\x1d\x24\x25\x25\x2b\x2b\x2d\ \x2e\x2f\x36\x39\x3a\x3e\x3f\x40\x42\x4b\x4d\x4f\x50\x50\x54\x5d\ \x66\x72\x73\x84\x85\x87\x88\x89\x8b\x90\x93\x98\xa1\xa4\xaa\xb1\ \xb3\xb6\xb7\xb7\xb8\xbf\xc1\xc2\xc4\xc7\xcf\xda\xde\xe5\xe8\xec\ \xf3\xf8\xfc\x93\xcf\x65\x51\x00\x00\x00\xaa\x49\x44\x41\x54\x18\ \xd3\x63\x60\x20\x17\x08\x4a\x60\x13\x95\x74\x73\xc1\x22\x2a\xe5\ \xee\xed\x0a\xa4\xd4\x54\x51\x44\x15\x3c\xbc\xc1\xc2\x6c\x76\xe2\ \x48\xa2\x2a\x9e\xde\x60\x61\x4d\x45\x21\x6b\x88\x88\xb0\x86\x86\ \x86\x9e\x97\x37\x58\xd8\x88\xcf\x91\xc7\x58\x06\x2c\x6c\xee\x0d\ \x03\xae\x0c\xea\xba\xca\xda\xb2\x06\x60\x61\x1b\x24\x61\x46\x47\ \x16\x7b\x26\x5b\x0c\x61\x06\x33\x01\x3b\x46\x3b\x4c\x61\x4b\x0e\ \x3b\x06\x4c\x61\x6e\x5b\x26\x98\x21\x86\x48\xc2\x26\x8a\x4a\x3a\ \x72\xfa\x10\x17\x72\x72\x71\x89\x3a\x43\x84\xe5\xd9\x1d\x79\x8d\ \xa5\x11\xde\xe1\x77\x82\x98\xad\xa5\x24\x62\x89\xec\x79\x4e\x07\ \x98\xe7\xc5\x50\x02\x85\xd5\x0a\x12\x54\xca\x68\x41\xc8\x6c\x6a\ \xc1\x40\x55\x00\x00\xd4\x83\x28\x92\x57\x24\xa9\x1b\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\xfa\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\xda\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x55\x55\xbf\x40\x40\xcc\x66\x33\xd5\x55\x55\xdb\x49\x49\ \xdf\x60\x40\xe3\x55\x55\xd5\x5e\x4d\xd6\x5a\x4a\xd8\x5d\x4d\xda\ \x5a\x4b\xdb\x57\x49\xd5\x5c\x47\xd6\x5a\x4c\xd7\x57\x4a\xd8\x5c\ \x48\xd9\x59\x4d\xda\x57\x4b\xd5\x5b\x49\xd5\x59\x47\xd6\x5d\x4b\ \xd7\x5b\x4a\xd8\x59\x48\xd9\x5c\x4c\xd7\x5a\x4b\xd7\x59\x49\xd8\ \x5c\x4b\xd8\x5a\x4a\xd6\x59\x49\xd6\x5b\x4c\xd7\x5a\x4b\xd8\x5b\ \x49\xd6\x5b\x49\xd7\x5b\x4a\xd8\x5a\x49\xd8\x59\x4b\xd6\x5a\x4a\ \xd6\x5a\x49\xd7\x5b\x4b\xd7\x5a\x4a\xd8\x5b\x49\xd6\x5a\x4b\xd7\ \x5b\x49\xd7\x5a\x4b\xd7\x59\x4a\xd8\x5a\x49\xd6\x5b\x4a\xd7\x5a\ \x49\xd8\x5a\x4a\xd6\x5b\x49\xd6\x5b\x49\xd6\x5a\x4b\xd7\x59\x4a\ \xd7\x5b\x4a\xd8\x5a\x4a\xd6\x5a\x49\xd7\x59\x4b\xd7\x5a\x4a\xd7\ \x5b\x49\xd8\x5a\x4b\xd6\x5a\x4a\xd7\x59\x4a\xd8\x5a\x49\xd8\x59\ \x4a\xd7\x59\x4b\xd8\x59\x49\xd7\x5a\x4a\xd7\x5a\x4b\xd7\x5a\x4a\ \xd8\x5b\x4a\xd6\x5a\x4b\xd6\x5a\x4a\xd8\x5a\x4a\xd6\x59\x4b\xd7\ \x5a\x4a\xd7\x5a\x4a\xd7\x59\x49\xd7\x5a\x49\xd8\x5a\x4a\xd6\x5b\ \x4a\xd7\x5a\x4a\xd7\x59\x4b\xd7\x5a\x4a\xd7\x5a\x4a\xd8\x5a\x4a\ \xd6\x5a\x4a\xd7\x59\x49\xd7\x5a\x4a\xd7\x59\x49\xd7\x5a\x4a\xd7\ \x5a\x4a\xd8\x59\x4a\xd6\x5a\x4b\xd7\x5a\x4a\xd7\x5b\x4a\xd7\x5a\ \x49\xd7\x5a\x4a\xd6\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\ \xd7\x59\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x59\x4a\xd7\x5a\x4b\xd7\ \x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4b\xd6\x5a\x4a\xd7\x5a\x4a\xd7\x5a\ \x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd8\x5a\x4a\xd7\x5a\x4a\ \xd7\x59\x4a\xd7\x5a\x49\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x49\xd7\ \x5a\x4a\xd7\x5a\x4a\xd8\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\ \x4a\xd7\x5a\x4b\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\ \xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5b\x4b\xdb\x6a\x5c\xdb\x6b\x5c\xdc\ \x6d\x5f\xdc\x6e\x60\xdc\x6f\x61\xe8\xa0\x97\xe8\xa1\x97\xec\xb1\ \xaa\xec\xb2\xab\xfa\xe8\xe6\xfa\xe9\xe7\xfa\xea\xe8\xfa\xeb\xe9\ \xfa\xec\xea\xfb\xeb\xea\xfb\xec\xea\xfb\xee\xec\xfb\xee\xed\xff\ \xff\xff\x00\x23\x8a\x5e\x00\x00\x00\x89\x74\x52\x4e\x53\x00\x01\ \x02\x03\x04\x05\x06\x07\x08\x09\x1e\x1f\x21\x22\x23\x24\x25\x26\ \x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x33\x4d\x4e\x4f\x50\x51\x52\ \x54\x57\x5a\x5b\x5c\x5d\x5e\x5f\x60\x62\x63\x65\x66\x67\x69\x6b\ \x6c\x6f\x70\x76\x77\x78\x79\x7c\x7d\x7e\x80\x81\x82\x83\x86\x88\ \x89\x8c\x8f\x91\x93\x94\x95\x96\x97\x9c\x9d\x9e\x9f\xa0\xa7\xa8\ \xa9\xaa\xab\xac\xad\xaf\xb0\xb1\xbb\xbf\xc0\xc1\xc2\xc3\xc4\xc5\ \xc6\xc7\xc9\xca\xcb\xcc\xd0\xd1\xd2\xd3\xd4\xd9\xda\xdb\xdc\xdd\ \xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xeb\xec\xed\xee\xef\xf0\xf1\ \xf2\xf3\xf8\xf9\xfa\xfb\xfe\xca\xd9\x5f\x39\x00\x00\x03\x46\x49\ \x44\x41\x54\x58\xc3\xad\xd9\x67\x57\x13\x41\x14\x06\xe0\x09\xa1\ \x28\x52\x44\x9a\x88\x18\x83\x52\x14\x3b\x12\x04\x51\x21\xd8\x45\ \x51\xb0\xa2\xb8\x80\x05\xc4\x02\xa1\x89\x25\x01\x4b\x42\x2e\x4d\ \x6a\x50\x31\xff\xd5\x4d\x68\x21\xbb\xb3\x7b\xef\xce\xbc\x5f\xe7\ \xec\x73\xf6\xec\x4e\xbd\xc3\x98\x69\xec\xb9\xce\xea\x3b\x9d\xbd\ \x1e\x9f\xdf\xef\xf3\xf4\x76\xde\xae\x76\xe6\xd8\x99\x70\xd2\x4f\ \xb4\x7a\x41\x93\x1f\x6d\xae\xc2\x04\x01\x75\x97\xab\x1f\xb8\x19\ \x69\xc8\xb2\xa6\x26\x95\x77\x81\x49\x3a\xcb\x12\xc9\x6c\x72\xf9\ \x07\x40\x64\xb0\x72\x27\x89\xb5\x55\x7c\x06\x64\x46\x8f\xd8\xf0\ \x6e\x41\x07\x10\xa2\xec\x45\xb2\x29\x8d\x13\x40\x4a\xc0\x9d\x8c\ \xea\x0a\x2f\x80\x9c\xee\x0c\x73\xd7\xe1\x03\x0b\xf9\x76\xc8\xcc\ \xad\x03\x8b\xa9\x35\x1e\xbd\x37\xc0\x72\xae\x19\x0c\xc5\x94\xfb\ \x20\x90\x16\xee\x2f\x4c\x68\x05\xa1\x3c\xe2\xcd\x4d\x57\x40\x30\ \x37\xf5\xdd\x0b\x20\x9c\x1a\x3d\xb7\x58\xdc\x85\xa0\x53\xeb\x66\ \x8c\x4b\x80\x61\x2c\x4d\xd3\x21\xba\x41\x4a\x5e\xc5\x77\x8d\x46\ \x90\x14\xf7\x76\x37\x3f\x20\x0b\x9e\x28\xd8\x36\xff\x3e\x03\x69\ \x51\x62\xe7\xe7\x0a\x90\x98\xd2\x98\x3f\xf7\x49\x26\xfc\x71\xeb\ \xff\x9d\x02\xa9\x39\xbe\xb9\x1e\x0f\xc8\x85\x3d\x1b\x6b\x77\xb9\ \x7e\xfb\xe4\xdc\xe2\xb4\xd1\xf3\x53\x8b\x73\x93\xc6\x5f\x99\xb3\ \x16\xcd\x87\xc3\xa1\x59\xbe\x3b\x1b\x0a\x87\xe7\xf5\x9b\x3a\xd6\ \xdc\xdd\x41\xfd\xe6\x85\xb0\x91\x1c\x71\xc3\x0b\x9c\xc6\xb5\x3d\ \xd2\x25\x4e\xeb\x74\xc8\x40\x8e\xba\xa1\x29\xce\xa3\x75\xd1\xc1\ \x31\xc8\x7b\xa9\x99\x25\xf5\xe1\xdf\xbf\x74\x9b\x96\xb9\x4d\x91\ \xf4\x47\x06\xc9\x3e\xfe\x67\xe4\xca\x26\x2e\x40\x9e\x0a\x9f\x05\ \xb2\x6c\xea\xc2\x19\x15\x7e\x02\x54\xd9\xdc\x85\x87\xea\x8a\x3f\ \x06\x44\x19\xe1\xc2\x98\x9d\xe5\x9a\x0c\x23\x8d\x8c\x71\x01\xb2\ \x99\x13\x68\x32\xce\x85\x03\xec\x1c\x90\x64\xa4\x0b\x55\xac\x19\ \x28\x32\xd6\x85\x26\xa6\x00\x41\x46\xbb\xd0\xce\xde\x01\x5e\xc6\ \xbb\xf0\x86\x0d\x01\x5a\x5e\xfd\x8b\x76\x61\x80\x79\x01\x2f\xe3\ \x5d\xf8\xc2\xfc\xc8\x65\x61\x66\x25\xe2\xfe\x43\xba\xf0\x13\x0f\ \xff\x89\xc0\xab\x78\x18\xfb\x29\x96\xa9\x9f\x62\x08\xef\xae\xae\ \x50\x7e\xde\x5b\xb4\xab\x76\xb7\x25\x42\x77\x53\xf0\xae\xe1\x9a\ \xa2\x19\x20\xcd\x04\x97\x20\x37\x61\x26\xa1\xd8\xf1\x86\x95\xab\ \xd8\x41\x92\x8b\x96\x8b\xcc\x27\xfa\xf8\xf9\x01\x27\x67\x33\xbb\ \x8f\xe6\xe2\x64\xaf\x7a\x4c\x7d\x4c\x74\x51\xf2\x03\x75\x95\xae\ \xa4\xba\x18\xf9\x74\xa4\x9c\x42\x76\x11\x72\x4e\x64\x8b\x35\x40\ \x76\x4d\xe5\xbe\xe8\x39\xe4\xa2\xfc\x4d\xe1\xf9\xe8\x6e\x33\x53\ \xfa\x36\x36\xb8\x5e\xc9\xe9\x92\xbd\xf1\x56\xd6\x77\xf4\x65\xb2\ \x8f\x0a\x25\x1b\x05\x9b\x3e\xb9\x87\x9b\xfe\xcd\xc2\xe4\x49\xb9\ \xf0\xb1\xad\x03\xe4\xa8\x4c\x77\x38\xa6\x00\x70\x54\x26\x7c\x38\ \xf6\x90\xfe\x54\x9e\xfb\x7c\x5b\x11\x35\x4f\x5e\x59\x21\xae\x84\ \xea\x96\x05\xd7\xc7\xd7\xb7\xbb\xe4\xb8\x2f\x35\x55\xbd\x54\xaf\ \x0c\xd7\x97\xa6\x2d\x63\xed\x0f\x4a\x28\x8f\x39\xf4\x0a\x6f\xb5\ \xe2\xb0\x4b\xbf\x54\x78\x59\xd4\xbd\xce\x2b\x9a\xde\x13\x73\xef\ \x72\x0b\xbd\xc9\x2d\x42\xae\x41\xa5\xde\x26\x50\xd7\xbb\x6a\x7c\ \x47\x54\x63\xb1\x6f\x04\xab\xcd\x8a\xf4\x45\x96\xfa\xf3\x78\xb1\ \xf9\xb5\x42\xaa\x85\x31\xf8\x3a\x1d\x75\xcd\xe4\x26\xce\x48\x81\ \xfa\x24\xe4\xdd\x4d\x56\x1b\xc5\x6d\xcf\x27\x5c\x62\x95\x8d\xa0\ \xd7\x8b\x12\x1b\xf1\x36\xef\x3d\xea\x0c\x53\xb9\x83\x7c\xa3\x97\ \x58\xda\x61\xd2\xf5\x82\x4a\x89\xc5\xcb\xd3\x54\x97\xc1\x6d\xe1\ \x70\x43\xa6\xe0\x65\xec\x57\x2d\xfa\xbd\xcd\x55\x68\x63\xa2\x49\ \xc8\x76\xb8\x9a\x94\x1e\x8f\xd7\xef\xf7\x7a\x7a\x94\x5b\x55\x8e\ \x3d\x88\x1b\xde\xff\xed\xe6\xc5\x5e\xf8\x64\x9e\xe0\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xb0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x26\x50\x4c\x54\x45\x00\x00\x00\x80\x80\x80\x40\x40\ \x80\x40\x80\xbf\x40\x40\x60\x39\x55\x55\x71\x8e\xc6\xe3\x55\x55\ \x4d\x4d\x66\x40\xaa\x55\x5b\x5b\x80\xdb\x5b\x49\x55\xaa\x99\x55\ \xdd\xaa\x3c\xb4\x5a\x47\xaa\x55\x55\xd5\xaa\xf1\xb8\x1c\x59\xd9\ \xa6\x6f\x85\xbc\x4a\x63\x9c\x4b\x69\xa5\xeb\xbc\x14\x76\x83\xbe\ \x4a\x6c\xaa\xc3\x57\x51\x49\x6d\xac\xd7\x5a\x4b\x55\xd7\xaa\x42\ \xb2\x5d\x73\x83\xbe\x43\xaf\x5b\x73\x84\xc0\x44\xb0\x5c\x57\xd8\ \xab\x41\x4b\x5f\x43\x4a\x61\xd7\x59\x4a\x4b\x6c\xab\x4c\x6c\xaa\ \xeb\xba\x16\xeb\xba\x16\x44\x56\x76\x42\x4a\x60\x57\xd7\xac\x73\ \x83\xbf\xe8\xb8\x17\x4a\x6c\xa9\x73\x84\xbf\x45\x57\x79\x72\x83\ \xbf\x9d\x54\x52\x42\x4a\x60\x4c\x93\x87\x4b\x6d\xa8\x4c\x6d\xa9\ \x43\x4d\x67\x41\x4a\x60\x43\x49\x60\x73\x84\xbf\x43\x4f\x6b\xd7\ \x59\x49\x4b\x6c\xaa\x73\x83\xbf\xd7\x5b\x4a\xe6\xb7\x18\x43\x4a\ \x5f\x84\x76\x43\x4a\x51\x6b\x42\x88\x5e\x57\xd8\xac\x57\xd8\xac\ \x43\xb1\x5c\x4b\x6b\xa5\x4a\x69\xa0\x73\x82\xbe\x4b\x6c\xaa\x57\ \xd8\xab\x43\xb0\x5c\x43\xb0\x5c\x56\xd8\xab\x73\x83\xc0\xe5\xb6\ \x18\x4a\x67\x9e\x43\xb0\x5c\x57\xd8\xab\x49\x6b\xa5\x4a\x6b\xa7\ \x56\xd6\xaa\x42\xb0\x5b\x43\xb0\x5c\x57\xd8\xab\x43\xb0\x5c\x4b\ \x6d\xaa\x57\xd8\xab\x73\x83\xbf\xd7\x5a\x4a\xeb\xba\x16\x18\x98\ \x1a\x3e\x00\x00\x00\x5c\x74\x52\x4e\x53\x00\x02\x04\x04\x08\x09\ \x09\x09\x0a\x0c\x0e\x0e\x0f\x0f\x11\x12\x12\x12\x14\x17\x1f\x22\ \x26\x27\x2d\x2f\x31\x33\x3f\x42\x52\x5c\x5d\x5e\x61\x66\x67\x67\ \x6a\x6f\x73\x7d\x7f\x80\x81\x90\x93\x97\x9b\x9c\x9c\xa1\xaa\xac\ \xad\xaf\xb0\xb7\xb8\xbe\xbf\xbf\xc1\xc3\xc5\xca\xcb\xce\xd0\xd4\ \xd9\xdc\xdd\xde\xe2\xe3\xe4\xe4\xe8\xe9\xe9\xf1\xf4\xf5\xf8\xf9\ \xfa\xfa\xfc\xfe\xfe\xfe\x34\x51\xe4\x88\x00\x00\x00\xdd\x49\x44\ \x41\x54\x18\xd3\x63\x60\xc0\x00\x8a\xfe\x1e\xb2\x98\xa2\x9c\x21\ \x31\x31\x1e\x20\x06\xb7\x83\x2d\x3b\x42\x98\x3f\x32\x26\xc6\x0f\ \xc4\x90\x4e\x48\x90\x44\x08\x6b\xbb\x46\x85\xc8\x83\x59\xaa\xc6\ \x56\xac\x70\x51\x13\x26\x3e\x4e\x18\x47\xc5\x8a\x05\x2e\x8a\x6c\ \x91\x8a\x25\x0b\x16\x51\x06\x06\x65\x1b\x33\x1f\x3b\x43\x74\x51\ \x06\x66\xcf\xd8\xd8\xd8\x70\x51\x74\xe7\x4a\xc5\x82\x80\x3a\xba\ \xb0\x04\x58\x58\x0d\x5d\x98\xd1\x0b\x28\x1a\x26\x82\x2e\xac\x6d\ \xa1\x1f\x6c\xae\x65\xc9\x82\x26\x0a\x74\x83\x13\x07\x83\x32\xaa\ \x38\xd8\xbd\x40\x61\x54\x71\x88\x2f\x40\xc2\x0c\xca\xce\x7a\x82\ \x28\xa2\x10\x61\x86\xa0\x44\x0d\x20\x29\xe3\xe6\x6b\x0a\xf5\x9b\ \x0b\x17\x88\xd4\x74\x14\x03\x92\xee\x71\x71\x11\x3c\x20\x2e\x9b\ \x7d\xbc\xb7\x38\xdc\xd8\x80\xb8\xb8\x68\x01\x10\x43\x21\x3e\x3e\ \xde\x00\x2e\xac\x14\x1a\xad\x03\x66\xc8\x01\x85\x75\x11\xae\xe0\ \x15\x82\x7a\xd3\x28\xd0\x5a\x18\x26\x08\x00\x3e\xb7\x23\x36\x3e\ \x2b\x7d\x54\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0e\x38\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0d\xff\x49\x44\x41\x54\x78\xda\xe5\x5d\x7b\x74\x14\xe5\ \x15\x5f\x11\x50\xfb\x47\xff\x68\xd9\x9d\x04\xc2\x2b\x90\x00\x21\ \xbc\x0b\xa2\x96\x82\x11\x43\xb4\x15\xc1\x5a\xb5\x52\xb4\x47\xa4\ \xd6\x56\x8b\xd5\x23\xd0\x0a\x1a\xc0\xf7\xb1\xb6\xd6\x8a\xc0\x01\ \x4a\xa1\xa7\xad\x70\xf4\x14\x50\x60\x77\xf3\x0e\x81\x90\x07\xc7\ \x2a\x58\x22\x92\x88\x3c\xb2\xd9\x9d\x99\x78\xda\x7f\x2a\x5a\xbe\ \xde\xfb\xed\x92\xcc\xe3\xfb\xbe\xd9\xc9\xce\xec\xec\xd2\x3d\xe7\ \x1e\x31\xfb\x9a\xf9\xed\x9d\x7b\x7f\xf7\x39\x3e\x5f\x86\x3c\xc8\ \x4e\xdf\x95\x4a\x45\x4e\x91\x1c\x0e\xdc\x21\x87\xfd\x2b\xe5\x50\ \xe0\x8f\x20\x0d\x20\x1f\xc4\x42\x81\x53\xb1\x90\xa4\xc2\x7f\xbf\ \x88\x0b\xfd\xf7\x29\x7c\x2e\xfe\x1a\x69\x2b\x7d\x0f\x7d\x6f\xee\ \x38\xfc\xac\x54\x8e\xa5\xdc\x57\x5e\xe8\xbb\x1c\x1e\x5d\x15\x52\ \x7e\x2c\x28\xfd\x04\x00\xda\x09\x80\x29\x20\xc4\x21\xf9\x77\x2c\ \x18\x08\xcb\x21\xff\x8a\x58\x70\xd0\x34\x52\xee\xeb\x67\x13\xe0\ \x23\x20\x25\x59\x09\x6a\x77\x65\xee\xf0\xf8\x89\x07\x3e\x71\x10\ \x50\x0b\xf1\x7f\x16\x0d\x49\x2f\xc6\x2a\x06\x15\x26\x01\xee\x02\ \x10\xf8\x4d\xca\x1b\xb2\x06\x54\xd2\xe2\x1b\x00\x97\xef\x7d\xd1\ \x60\xe0\x50\xfa\x40\x65\x4b\xc2\xec\x2c\x26\xd5\xbe\xfe\x8c\x43\ \xbd\x02\x80\x7d\x3f\x01\x30\x4a\x59\x66\x03\xbb\x73\xfc\x40\x04\ \x16\x4e\xec\x63\xaf\x81\x65\x00\xdd\x01\x5a\xbd\xec\xcc\xa1\xbc\ \x6b\x2e\x1d\xef\x1a\xdf\x9a\xbb\x35\xe0\xa2\xb4\x20\xe8\x99\x07\ \x2c\xf1\x5d\x11\x0d\xfa\x1f\x80\x13\x39\x9f\x69\xc0\x32\xe4\xac\ \x1c\xf4\xdf\x5f\x3d\xa7\xbc\x3f\x00\xfa\x91\x01\x60\x94\xf9\x19\ \xe6\xb8\x02\x13\xe1\xa0\x0f\x66\x01\xb0\x3a\xa9\xfc\xd9\xdc\x36\ \x06\xb8\x28\x1f\x80\xf4\xf3\x1c\xd8\x93\xfb\x46\x5f\x05\x07\xfa\ \x0a\xc8\x97\xd9\x06\x6e\xf4\x40\x0e\xf9\x5d\xde\x32\xc2\x01\x18\ \xe5\x4e\xcf\x99\x41\x34\x14\x38\x6c\xef\xc4\x24\x22\x57\x8f\x22\ \x4a\xc3\x14\xa2\x1c\x9e\x41\xe4\xca\xa1\x9e\x01\x5c\xf7\xf8\x6c\ \x11\xb8\x28\xc7\x77\xfa\x76\x5e\xe9\x09\xb8\x72\x30\xb0\x20\x41\ \xfc\x93\x73\x2e\xd5\xf9\x44\x39\x34\x9d\x74\xb7\xcc\x23\xdd\x47\ \x6f\xed\x11\xb5\xf1\x06\x4f\xc0\xed\xda\x97\x4b\x7e\x93\xf3\xb8\ \x15\xc0\x04\x1c\xe0\xa2\xb4\x83\x0b\x5c\xb6\x3c\x69\x6d\xad\x2b\ \x22\x6a\xd3\x1c\x1d\xa8\x3a\x80\x0f\x7d\xcb\x13\x80\xab\x1e\x2d\ \xb1\x04\x37\x21\x27\x41\xfa\xa7\x2d\xac\x05\x70\xd7\x27\x73\x02\ \x4a\xed\x18\xa2\x36\x97\xb0\x81\x6d\x2d\x03\xf3\x70\x1d\x91\x6b\ \xc7\xd2\x1f\x21\x1d\x80\x9e\xdf\x3d\x84\xfc\xf3\xcd\x22\x72\x64\ \xf5\x75\x24\xb8\xa4\x8c\xbc\xfc\x8d\x27\x93\x05\x18\x65\x1b\xc8\ \x83\x20\x73\x40\xf2\x5c\xa1\x70\xe8\xcc\x80\x43\xee\xb2\x3c\x99\ \xaa\x61\x44\x3d\x32\x8b\x01\xec\x2d\x44\x3d\x3c\x93\xc8\x35\x05\ \xae\x81\x7a\xf6\x9d\x61\xe4\xa3\x37\x8a\x49\xe3\xaa\xeb\x29\x88\ \xbb\x6e\xbd\x8b\x6c\x99\xfa\x20\x79\x35\x17\x4c\xc1\x15\xcf\xd8\ \x01\xd4\x4a\xbe\x00\x39\x05\x12\x06\xd9\x08\x66\x64\x05\xc8\x0f\ \xd6\xfa\xd6\x8e\xef\x93\xb6\x63\x4c\x9f\xc8\x1b\x88\xb5\xb6\x6e\ \x3c\xd5\x4e\x9d\x09\x68\x45\x60\xaf\x05\x67\x36\xcc\x35\xed\x6c\ \xdf\x31\x8a\xbc\x3a\xf8\x97\x4e\x02\x98\x2a\xf8\x2b\xed\x39\xb4\ \x90\xf4\x9a\xf0\x24\xc3\x83\xa9\xb3\x32\x6a\xad\x72\x08\x58\x42\ \xc5\x90\xb4\x98\x80\x13\x9b\xc6\xda\xbd\xec\xdd\x92\x3f\xd8\xe2\ \xcf\x70\xf0\x6b\x84\xec\x00\x34\xd3\x68\x6b\xd5\x96\x9b\x28\x15\ \x4b\x8a\x5d\x54\x8d\x70\xcc\x6c\x9c\xdc\x3a\x86\xbc\xe2\x7f\xc2\ \x4b\x70\x5f\xb4\xa5\xb9\x10\xf6\xde\x69\x05\x8e\xda\x72\xb3\x1e\ \xdc\x06\x60\x05\xe1\x1c\x31\xa8\x35\xa3\x28\x7b\xe8\x6e\x99\xdb\ \xab\xed\x07\xa7\x3a\x63\x2e\xfe\x9c\x0f\xc1\xc3\x63\xe9\x06\xf6\ \x22\xd8\xe0\x27\xec\x85\xbe\x95\x81\x51\x70\xc0\x9f\x8b\xc0\xed\ \x6e\x29\xd5\x39\x31\xb9\xae\x58\x4c\xd9\x80\x35\xf0\x28\x9b\xd2\ \x38\xd3\x31\x73\xf1\xd9\x5b\x23\xc8\xeb\xf9\x8f\xa4\x0b\xdc\xaf\ \x90\x61\xf4\x21\xfc\x95\x5a\x84\x66\x41\xab\xb9\xe0\xd8\xe4\x9a\ \x42\xbe\xf3\xab\x2e\x00\x33\x72\x13\x87\xb2\xcd\xa3\xec\x22\x56\ \x91\xe7\x30\xa3\x18\x4a\x36\x14\xfd\x34\x1d\x0e\xed\x2e\xfb\x81\ \x44\x3c\xb7\xc0\x77\x68\x5a\x9b\x8b\xe0\x42\x94\xc6\x7c\x6d\x45\ \x2e\x98\x82\x19\xe6\xe0\x02\xb4\x9d\x3a\xc0\x9a\xd1\xf0\x79\xee\ \xf1\xe0\xce\x3d\x43\xc8\xd6\x69\x4b\x5c\x01\x77\x5d\xff\xd5\x17\ \xfa\x94\x37\x56\x83\x52\x31\x1c\xdc\x05\x36\xb8\x92\x81\x2d\xdc\ \xc2\xd5\x5c\xb9\x6a\xa4\xce\xc6\xf6\x68\x6b\xc3\x94\xb4\x31\x0b\ \x94\xc8\xbe\x1c\xb2\xe3\xdb\xf7\x39\x0a\xee\x73\xd7\x3c\x45\x8e\ \xbe\x3c\xf5\x2b\xcc\x20\xda\xce\xe7\x82\x69\xa8\xe1\x5e\xea\xf5\ \x13\xf4\x76\x13\xfe\x9f\x67\x12\x98\x39\x87\xca\x3c\x6f\xf2\x0e\ \xfb\x73\xc8\xf6\x59\x8b\x1d\x03\xf7\xa3\xf5\xe3\x2f\x7d\x76\x3d\ \x62\x66\x87\x35\x3c\x20\x8c\xd0\x20\x68\xb0\xca\x21\x28\x75\x45\ \x54\xb3\x7b\xb5\xb6\x14\xc2\xe6\xb1\x9e\xa7\x26\xdf\x5d\xf4\x3d\ \x47\x00\x7e\xf6\xea\xa7\x48\x34\x28\x69\x2b\x24\x3f\xb2\x93\xd7\ \x3d\xc7\x3b\x40\xb5\xb1\x37\xfc\x55\x9b\xe7\x32\xa9\x18\x9a\x0b\ \x1d\xb8\x60\x22\x90\x6d\xf0\xed\xb9\x44\x39\xb0\x4a\xb3\x6c\x73\ \xa9\xd6\x8b\x9c\x65\x2a\xb2\xfd\xfa\xfb\x1d\x33\x11\x9f\x6c\x2b\ \xd0\x7e\xf6\x19\x2c\x91\x59\x47\x6b\xe1\xc0\xc3\xa2\xc4\x8d\xf6\ \x72\x67\x05\x11\x94\xb6\x69\xc2\x64\xa4\x63\x31\xae\xad\x95\xa8\ \xa6\xb3\x92\x41\x98\x04\x72\x03\x60\x9a\x8f\x70\x08\xe0\x23\xcf\ \xcc\x34\x2a\xca\x52\xcb\xea\x2f\xbc\xb0\x9d\x07\x86\x16\x08\xf4\ \xfe\x2c\xb6\xd0\xad\xa5\x6d\xa0\x8d\x3c\x70\x69\x70\xd2\x7c\x23\ \x9b\xb2\x01\xaf\xa6\xcc\xc2\x05\x36\xb1\xc6\xc1\x64\xcf\xbe\xc5\ \xdf\x35\x7e\xc7\x29\x4e\xb5\xba\x47\x7b\xef\xe3\x27\x70\x8a\x34\ \x20\x94\x31\x19\x00\x26\x73\xb4\x4c\x41\xae\x1c\xce\x06\xb7\x7e\ \x92\xde\x84\x50\x50\xe7\x51\x7b\x2e\x57\xbb\x47\xd9\x3e\x7c\x6d\ \x82\xa3\x2c\x02\x1d\x26\xa3\x5a\xcd\xb7\xc5\xa2\xb2\x8f\x36\xf2\ \x62\x39\x36\x19\x19\x83\xf6\x12\x67\x3a\x34\x29\x5e\xcd\xd0\x69\ \x6c\x19\x84\xc7\x93\x29\xaf\x76\xdb\xc1\xd5\x3c\x36\xc7\x51\x80\ \x31\x14\x67\x7c\xcf\x41\x0e\xb8\xfe\x02\x78\xf2\x22\xfb\x72\xce\ \xd7\x73\x5e\x13\xcd\x92\x74\x11\x9a\xda\xc8\xb6\x9f\x26\x70\x9b\ \x66\xbb\x9a\xbe\x34\xca\xdb\x0b\xee\xb0\x04\x6d\x63\xf1\x43\xa4\ \x65\xdd\x0c\xb2\xf7\x9e\xf9\x94\x8a\x09\xcb\x48\xfd\x9e\x26\x9d\ \x7b\x19\x8a\xc1\xea\x20\x92\xc3\xfe\x75\x5c\xf3\xa0\x01\x86\x86\ \xb3\xc6\x1f\x00\xb4\x55\x6b\x1a\x58\x76\x37\x6e\x16\xb4\x4e\x6c\ \x66\xda\xaa\x18\x97\x64\xd3\xc4\xa5\x5c\xb0\x36\x8c\x7b\x98\x34\ \xaf\xd5\xfb\x95\x33\xbb\x86\x91\xf7\xc0\xce\x3e\xff\xb5\x5f\x73\ \xdf\x77\xfc\x75\x46\xde\x25\x18\x28\x37\x05\x16\xd8\xe9\xc2\x73\ \x6e\xda\x60\x21\x9e\x52\xe4\x9b\x0f\x56\x36\x8c\x32\x0b\x8d\xcd\ \xa5\xe0\x26\x61\x67\xa3\xf0\x43\x75\x35\x2e\x24\x5d\xc7\x5e\x20\ \x5d\x1f\x6f\x25\x5d\xed\x7b\xe2\xd2\xb6\x25\xfe\x37\x78\x2e\x6a\ \x23\x1a\x7c\xf1\xeb\x2b\x4d\x00\x61\x32\x08\x2b\x1f\xa2\xf7\x21\ \xd0\x7b\xee\x9e\x4f\xd6\x5d\xb5\xca\xf4\x7e\xac\x48\x33\x00\xfe\ \x44\x17\x78\x74\x1d\x08\x4c\xe2\x57\x81\x47\xe9\xf2\x0d\x46\xad\ \xd3\x3e\x8f\xb9\x05\xb3\xf3\x93\xf4\x6c\xa1\xe9\x3b\x96\x9a\x1b\ \xad\x99\x48\x22\x27\x36\x91\xce\xae\x4f\x49\xa7\xac\x88\x05\x5e\ \x13\x39\xb1\x91\xbe\x47\xf4\x99\x1d\x7f\xc9\xd7\x01\xf3\xfb\x91\ \x8f\x52\x60\xa3\xc1\xe4\xaf\x80\x33\xbb\x86\x9b\x80\x7e\x67\xe1\ \x1d\xec\xab\xfe\x40\xce\xf8\xde\xa4\x4e\x58\x7a\x8c\x6b\x1e\x1a\ \xa6\x68\x52\x89\x66\xdb\x8a\x79\x5f\x11\x75\xa3\xe5\x23\x4d\xd9\ \x28\x26\xb2\xb9\x61\xd0\xd8\xe3\x2f\x90\xce\x58\xa7\x35\xb0\x46\ \x89\x9d\x27\x11\xd0\x6a\xfc\x0c\xd6\x67\xb7\x3c\x3b\x3d\xae\xb1\ \x23\x7e\x61\x1b\x58\x53\x1a\x74\x67\x02\xe8\x81\xab\xc9\xe6\xc9\ \x4b\xd9\x8a\x19\xf6\x3f\xa2\xcd\x9a\xed\xe6\xdb\xdf\xde\x2c\x98\ \xcc\x60\x06\xda\x44\x8e\x89\xbb\x86\x0d\xdc\x19\xd9\x02\x4f\x6b\ \xab\x0a\x48\xa4\x63\x9f\x7d\x60\x0d\x12\xf9\x34\x04\xe1\xbc\xf9\ \x38\x9b\xca\xaf\xa5\x95\xe4\x54\x80\x65\x25\xf5\xf7\xde\x7b\x1b\ \xfb\x7c\x42\x81\x77\x7a\x4b\xf0\xa1\x40\x37\x3f\xe7\x3b\x94\x26\ \x68\xe2\xd4\x4c\x62\xd8\x56\x8d\x73\x33\xd8\x55\xb4\xd7\x5a\x9e\ \xcb\xa5\x62\x55\x63\x48\xe7\xb9\xa3\x29\x83\xdb\x03\xf2\xd9\x16\ \xf8\xc1\x0a\xbd\xce\x7b\x28\xb4\xf1\x1b\xdb\xf6\xfb\xdc\x02\xaa\ \x01\x90\xc5\x2e\x54\x2d\xfb\xe0\x35\x96\xc0\x25\x1d\xe9\xd8\xef\ \x18\xb8\xbd\x9a\x1c\xb4\xe5\x00\x5d\x69\x91\x0d\x7e\x73\xac\x0f\ \xd8\xc3\xc2\xbe\x7f\x08\x04\x0e\x0d\x53\x29\x2b\x60\xf5\x96\x09\ \xcd\xc7\xa5\x14\x22\xda\x5c\x31\x58\xff\x05\xa9\xe8\x8c\xa9\x4f\ \x46\x62\xea\x3d\x28\x9d\xb2\xba\x1c\xfe\x56\x99\x78\x8e\xfb\xde\ \xae\x0f\x9f\xf3\x16\xe0\xb0\x74\xbb\x4f\x0e\xfa\x7f\xe5\xd6\x17\ \xf4\x24\x7d\x5a\x4b\xf1\xcb\x18\x6c\x61\x92\xd8\xa1\x29\x4a\x6d\ \x44\x55\x8b\xb9\xf5\x42\x55\x9d\xd8\x19\x53\xea\x45\x8e\xcf\x8a\ \x5d\xb8\xdc\xe4\xbd\x1c\xc3\xe3\x6d\xae\x7d\x01\xa6\x20\x81\x79\ \x60\x18\xcd\xac\x32\x20\x15\xe3\x6a\xa0\xfa\x27\x42\xc8\x00\xeb\ \xe2\x00\x19\x00\xaf\xdd\xce\xd5\xe2\x13\x6f\x7a\xa9\xc1\x5b\x90\ \x41\xd4\x7b\xd2\x93\x0b\xf6\x91\xcb\x73\x41\x73\x93\x01\x57\x07\ \x32\x47\x93\x23\x5d\x1d\x5c\xea\x96\x06\xa9\x45\x80\x8f\x79\x02\ \x70\xe3\xf7\xb9\x36\xf7\x6c\xb4\x7b\xb2\xdd\x1a\x22\x98\x92\x09\ \x3c\x9b\x1c\x6d\x5c\xe0\x0d\xc0\xc1\xc0\x3f\x7c\xfc\x10\xd9\xe5\ \x22\xe4\x31\xae\x73\xab\xe8\x6b\x63\x22\x98\x8a\x2a\xa6\x99\x38\ \xf6\xbc\x57\x1a\xdc\xee\x73\x78\x00\x30\xf9\x02\x64\xdb\x16\x9e\ \xed\x5d\x9e\x02\xc0\x2b\x98\x66\xa2\x6d\xb3\x57\x00\xc7\x7c\x89\ \xf1\xd4\xf4\x6b\x70\xfb\x5e\x9e\xfd\xbd\xab\xaf\x00\xc7\x29\x1c\ \x43\x83\xdb\xf7\x78\x05\xf0\x7f\x3c\x03\x18\x4f\x9a\xa9\x6d\x8a\ \x72\x77\x0a\x00\xff\x90\xf9\x99\xed\xbb\x3d\x05\xf8\xb2\x31\x11\ \x11\x59\x5d\x99\x71\x26\x22\x03\x9d\x5c\x65\x0a\x36\xb8\x3a\xc3\ \x22\xba\x76\x0c\x34\x3e\xf4\x44\x83\x1b\x17\x72\x69\xda\xb9\x68\ \xf7\x14\xdb\x03\x90\x5d\xdd\x93\xb8\x34\xed\xf0\x7c\xef\x68\x5a\ \x86\x06\x1a\x75\x76\x02\x8d\xe3\x84\x0c\x3c\x2f\x2b\x0d\x19\x19\ \x68\xb8\x19\x2a\x5b\x9a\x89\x13\x1b\x45\xa1\xf2\xf6\x64\x40\x46\ \x70\x23\xb2\xbc\x83\x1f\x2a\xaf\xe7\x86\xf1\x74\xc2\xa9\xa6\xc0\ \xdd\x50\xd9\xcd\x64\x8f\xa5\x16\xd7\x4c\xa4\x09\x19\x7e\xb2\x46\ \xa9\xc7\x4b\x9f\x07\x2e\x46\x7c\x3c\xcd\xa5\x12\x3d\x47\xa2\xd5\ \x13\x58\x27\xde\xdb\x34\x8e\x79\x6c\x37\x93\x3d\xa9\xa5\x2b\x5d\ \x75\x76\x9a\x74\x25\x46\x68\xea\x0a\xa4\x61\x54\x28\x5b\xa0\x0e\ \xcd\x22\x5d\xb9\x8e\xa3\xbd\xa3\xf5\xdd\x47\x8c\x22\x03\x96\xc7\ \xe2\x05\x5c\x29\xb5\x74\x65\x2a\x09\x77\x47\x24\x3c\xd8\x91\x52\ \x91\xc9\xf6\x76\xbc\xcb\xad\xa0\x58\x15\x02\xb0\x78\xd0\x53\xe6\ \xaa\x2e\x48\x2d\xe1\x6e\x55\x32\x4a\x8b\xa9\xa8\x2a\xa4\x65\x1e\ \xe7\x4a\x46\xcd\xb4\xc6\xc7\xeb\xb6\xd7\x36\x27\x1a\x0b\x01\x71\ \xf3\xa1\x69\x53\x30\x76\x85\x62\x9d\x11\x7e\x20\xb5\xf1\x7a\xab\ \x01\x76\xa5\x67\x57\x10\xd0\x89\xbf\x7b\xbe\x52\x80\x16\x3d\xdf\ \x73\xa0\x54\x74\x80\x59\xf4\xec\x29\xe2\x1e\xec\xad\x92\x77\x37\ \x97\x58\xd4\x11\xe7\x0a\x9b\x6c\x98\x0d\x90\xbd\x45\xcf\xb7\x35\ \x6d\x53\xd2\xb2\x8c\xd8\xdd\x00\x97\x34\x06\x05\x42\xc7\x27\x70\ \x68\xd4\xe6\x0a\x7a\xdc\x64\x6c\x1e\xd7\x36\xc0\xd4\x16\x99\x7f\ \x80\xc3\x33\x34\x00\x4e\x63\xf4\x47\x5f\xa7\xa9\x92\x4f\x11\x38\ \x38\xff\xcf\x8d\x5b\x4a\x32\x67\x41\x06\xb0\x8b\xae\xb6\x0d\x94\ \xc3\x5a\x6a\x2c\xbc\x06\xa9\x18\x8b\x2d\xe8\x25\x87\xa8\x4d\xb3\ \xf5\x7d\xcb\x46\x07\x56\x91\xa7\xeb\xde\x37\xf7\x3f\xe7\xe8\xcd\ \x4b\x55\xbe\xc0\xc1\xe5\x8e\x33\xcc\x64\xf0\xfa\x82\xbd\xd4\xe8\ \x21\x34\x59\x8e\x5a\x4d\xdb\xa5\xb4\xad\x53\xf0\xb7\xe8\xe1\xdb\ \x93\x0b\x22\xc0\x0c\x28\x1a\xcd\xa3\x0d\x8c\x8c\x8e\x7b\x64\x0d\ \xfa\x1f\x80\xd5\xb9\x7f\xa9\x89\xa6\x54\xc4\x30\x4e\x9a\x66\x36\ \xe0\x8f\x6b\xb3\x6d\x15\x4c\x72\x92\x63\x00\x97\x33\xb4\x03\xda\ \xab\x75\x6e\xac\xf6\x5b\x0c\x4c\x74\x93\xac\xfc\xef\x7d\xda\xdc\ \xbe\x7a\xc0\x3f\x9a\xd7\xbe\x9a\xb5\x82\x83\x92\x1a\xb3\x10\xa7\ \x65\xd3\x39\xb3\x27\x37\x68\xb4\xb7\xc4\xdc\x64\x53\x31\x54\xd7\ \xc0\x18\xe3\x9b\x87\x8b\x38\x1d\xcb\x99\x2e\xf2\x7e\x71\x9c\x23\ \x02\x54\x0c\x1d\x90\xd6\x9e\xf6\x82\x2b\x89\xdb\x6f\x39\xb3\x27\ \xba\x16\xde\xa6\xd9\xa2\xef\xaf\x17\xac\x2b\x08\x2c\xce\x56\x50\ \x65\x3a\xa9\x34\x3a\x1e\x44\x18\x76\x55\xa0\xe6\xf1\x66\xf9\x70\ \x2c\x0d\xfb\x36\xc4\xb3\x27\x43\x74\xec\x43\xae\x1b\x2b\xca\xa0\ \x2d\x12\xaf\x8a\x01\x03\x9d\x75\xe0\x22\x77\x6d\x2d\x65\xef\x02\ \x02\x67\xc5\x1d\x21\xa3\x76\x57\x33\x85\x4a\xc7\xd2\x06\x0b\x1b\ \x20\xbb\x9b\x6f\xe4\x3b\x37\xec\x0b\x16\x0d\xc1\x24\x9c\xdd\x43\ \xd9\x06\xb0\x6a\x70\x62\x97\x80\xc0\xc1\x1d\x2e\x18\x48\xc9\xb4\ \x7d\xcb\x38\x6b\xcd\xf8\x21\x74\x79\x0b\xee\xec\x49\x82\x5e\x06\ \xa5\x25\xc9\x0e\x22\x9e\xcd\x2e\x0d\x2e\x8c\x33\x00\xd0\x46\x34\ \x11\x96\xc3\xe5\x55\xc3\x0d\xf3\xd3\x9c\x59\xeb\x70\x0e\x5d\x2a\ \xd2\x73\x35\x1c\x99\x25\x3a\x8e\xd3\x49\x0d\x22\x26\x06\x62\x7e\ \x7c\x79\x52\xb6\x84\x43\x6b\x9d\xa7\xb7\xcf\x75\x45\x49\x0c\xed\ \x94\xd1\x48\x50\xc0\xb5\xef\xb5\x39\x0c\xee\xaf\xbe\xac\xc0\x85\ \x80\xc4\x64\x4a\xe8\x7e\x8b\x02\xce\x5c\x60\xb1\xde\x34\xd4\x09\ \x22\xc5\x70\xa0\xce\xd6\x30\x38\x3e\x70\xc6\x80\xbb\xce\x20\xab\ \x28\xdb\x10\xda\x62\x6b\x9c\xfa\x47\x87\x86\xab\x16\xd8\x5a\x0e\ \x26\x47\x3b\xf0\x2e\xde\x4a\xf8\x65\x24\x2c\x4d\xe8\xdb\x66\xbf\ \x50\xe0\xa5\xac\xa5\x6c\xd5\x05\x34\x71\x63\xe4\xc2\x3d\x54\x8c\ \x93\x14\xc2\xa5\x22\x3a\x9a\x87\xac\x21\x9c\x2b\xc8\x9a\x49\xcf\ \xa7\xb4\xb9\x3a\x9b\x82\x0f\x3a\xee\x80\xc9\x72\xa3\xb6\xf6\x6c\ \x07\x28\x89\x8f\xea\x72\xed\x73\xa1\x1e\xdc\xd6\x9b\x69\x04\x27\ \xf8\xce\x23\x49\x3b\x36\xee\xe6\x93\xf0\xe0\x61\x5e\x35\xa7\xd8\ \x15\x85\x45\xd7\x12\x91\x97\x52\x23\x5e\xdf\xa8\xd4\x17\x1b\x56\ \x30\x94\x72\x67\xad\x13\xdd\xfd\x6a\x24\x28\x8d\x74\x68\x09\xa8\ \x74\x5b\x36\xe4\x29\x94\x86\x69\xba\x64\x79\x7c\xb8\xdc\x62\x6f\ \x1b\x50\x31\xd3\x88\x2f\x6a\xae\x10\xdc\xc0\x45\xdc\x3a\xeb\xec\ \xa6\xd5\x50\x60\x75\xe6\x6b\x71\x7c\xb1\x07\xcf\x79\xb1\x82\x08\ \x5c\x2a\xa2\x77\x7e\x25\x56\x66\x01\x93\xe9\x2b\x5c\x5a\x67\xeb\ \xff\xed\xe5\x42\xd9\x14\xd6\x16\x2c\x64\x0b\x02\x87\x46\x9d\x5a\ \x38\xf0\x86\x7b\x6b\x6d\xcb\x7d\xfd\x62\x61\xff\xdf\xb2\x36\xc8\ \xa8\xcc\x4b\x98\x91\x32\xf3\x7a\xb1\xfa\x49\x49\xcc\x4f\xfb\xff\ \x6a\xf7\xa6\x27\x7d\xba\x75\x03\x5c\x8a\x6f\x65\x53\xc2\x1d\xc3\ \xe0\x78\x29\xde\x4c\xd9\x30\xfc\x15\x46\x68\x5a\x70\x53\x65\x0c\ \xf6\x22\x3d\xc1\xd2\x3a\xcf\x4d\x40\x7c\x7d\x23\x65\x15\xa6\xd4\ \xa5\x26\x19\x94\xe4\x16\x2c\xe0\xba\xaf\xbb\xae\xb9\xec\x04\xbd\ \xb4\x2a\x13\xd9\x85\x6a\xda\xaa\xa2\xa7\x6c\x72\xed\xb8\x64\x3b\ \x76\x2e\xe2\x4d\xa8\x3c\xbd\x03\x01\x1c\xe8\xfc\x4c\xe3\xc9\xa6\ \x1d\xc6\xad\xa5\xf1\x6a\x86\xa0\x0a\xcc\x90\xcf\x71\xeb\x6c\x46\ \xdc\x9c\x04\x83\x91\x4c\x8a\xf8\x70\x4d\x0d\x86\xc9\xb8\x8a\x21\ \xce\x83\xed\xf6\x97\x49\xcd\x78\xa7\xb0\x8c\xbb\x6f\x51\x22\x77\ \x91\xcd\x09\xa2\x0b\x98\x5b\xc0\x14\x41\xc6\xde\x20\x0a\x17\x02\ \xe1\xbd\xdc\xb2\x10\xdc\x5a\x5c\x88\xea\xcb\x86\x47\x62\x07\xd0\ \x62\xbc\x8f\x5b\x16\x00\x7b\x1a\x0b\x95\xb6\xf3\xb9\x19\x01\x74\ \xe2\x3e\x72\x70\x12\x6d\x19\x08\x6c\x3b\xf6\xe4\x75\x54\x8f\xb8\ \xda\x97\xed\x0f\xac\xb4\xe2\x46\xbc\xc4\x5d\xba\xbc\xa4\x75\x17\ \xe9\x4c\x0a\x6a\x6c\x8a\xf7\xfd\xcc\xd8\x07\x32\x0e\x7a\xcb\xc9\ \xf4\xde\xc4\xef\x34\xde\x72\x12\xbb\x97\x7c\xff\x4f\x0f\xed\x4d\ \x53\xa3\xa1\x80\xec\x5c\x24\x17\xf8\x97\xee\xa6\xa9\xd9\x68\x5f\ \xdd\x48\x24\x61\xcb\x3d\xe6\x59\x11\x18\x9c\xd0\x49\x8c\x98\xbd\ \x1f\xa3\xb7\xfd\xa5\xc1\x4c\xe2\xb6\xbf\xf4\xdf\xa7\x12\xcf\xc1\ \x6b\xfc\x9b\x71\xe0\x84\xde\x19\x6c\xff\xa0\x31\x9e\x84\xb5\x9c\ \xc7\xff\x00\xfb\xeb\xe4\x28\x2e\x7d\xb0\x3c\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xdc\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x2f\x50\x4c\x54\x45\x00\x00\x00\xdb\xb6\x24\xdf\xbf\ \x20\xe3\xc6\x1c\xef\xbf\x10\xf0\xb4\x0f\xf1\xb8\x1c\xeb\xba\x14\ \xec\xbd\x13\xed\xb6\x12\xee\xbb\x1a\xe4\xea\xef\xe5\xea\xef\xec\ \xbb\x16\xec\xb9\x15\xea\xba\x15\xea\xbb\x15\xea\xb9\x15\xea\xb9\ \x17\xec\xba\x16\xec\xbb\x15\xea\xba\x17\xea\xbb\x17\xeb\xba\x16\ \xea\xba\x16\xea\xba\x16\xeb\xbb\x16\xeb\xb9\x16\xe7\xec\xec\xe7\ \xec\xec\xeb\xba\x16\xe6\xeb\xeb\xeb\xba\x15\xeb\xba\x17\xeb\xbb\ \x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x17\xeb\xbb\x16\xeb\xba\x16\ \xeb\xba\x15\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\ \xba\x16\xeb\xba\x16\xeb\xba\x16\xe7\xea\xe4\xe8\xea\xe4\xe8\xeb\ \xe5\xe7\xec\xed\xe9\xca\x59\xe9\xca\x5a\xe9\xca\x5b\xea\xcb\x60\ \xea\xcc\x5f\xeb\xba\x16\xeb\xba\x17\xeb\xba\x18\xeb\xbb\x17\xeb\ \xbb\x18\xeb\xbb\x19\xeb\xbb\x1a\xeb\xbc\x19\xeb\xbc\x1a\xeb\xbc\ \x1b\xeb\xbc\x1c\xeb\xbe\x29\xeb\xbe\x2a\xeb\xbf\x2b\xec\xbb\x17\ \xec\xbb\x1a\xec\xbd\x1c\xec\xbd\x1d\xec\xbd\x1f\xec\xbe\x20\xec\ \xbe\x22\xec\xbf\x22\xec\xbf\x23\xec\xbf\x24\xec\xc0\x23\xec\xc0\ \x24\xec\xc0\x27\xec\xc2\x2c\xec\xc3\x2f\xed\xc0\x27\xed\xc1\x27\ \xed\xc2\x2b\xed\xc3\x2e\xed\xc6\x35\xed\xc6\x36\xed\xc7\x36\xed\ \xc7\x39\xed\xc8\x39\xee\xc6\x34\xee\xc8\x39\xee\xc9\x3d\xee\xca\ \x3e\xef\xca\x3e\xef\xca\x3f\x0f\x09\x3d\x62\x00\x00\x00\x33\x74\ \x52\x4e\x53\x00\x07\x08\x09\x10\x11\x12\x1a\x1b\x1c\x1e\x30\x31\ \x5e\x5f\x60\x61\x62\x63\x76\x78\x7a\x7b\x7d\xad\xae\xaf\xb0\xc7\ \xc8\xc9\xca\xca\xcb\xcd\xce\xcf\xd7\xd8\xd9\xe2\xe3\xe4\xef\xf0\ \xf1\xf3\xf4\xfc\xfc\xfc\xaa\x26\x41\xc8\x00\x00\x01\x29\x49\x44\ \x41\x54\x18\x19\x45\xc1\x89\x5a\x01\x61\x00\x05\xd0\x9b\x3d\x14\ \x15\x15\xda\x54\x94\x30\x96\xa9\xa6\x8b\x64\x2f\xd1\xb4\x69\x4a\ \x43\x61\xbc\xff\x33\xe4\xfb\x0d\x9d\x83\x39\xc7\x46\x24\x9e\xc9\ \xc4\xc3\x7e\x3b\xfe\x59\xb7\xd3\x34\xa5\x82\x56\x98\x9c\x47\x7c\ \x19\xf5\x69\x3a\x75\x43\x58\xbd\x28\x8f\xf4\xce\x3d\x17\x12\x2e\ \xcc\x58\x8f\xcb\x13\xad\xae\x8f\x2b\x5c\x88\x5a\x00\xec\x70\xa4\ \xa9\x53\xf5\xb6\xcd\xa5\x00\xe0\x48\xbf\xe9\x75\xa3\xda\x33\xde\ \xb9\x94\xb2\x63\x93\xa3\x8e\xae\xf6\x7e\x0b\x2d\x45\x69\xd2\xe4\ \x43\x84\xfd\xd2\xf8\xd6\x28\x5c\xe7\x65\x39\x7b\xc5\xb9\x10\xce\ \x48\x3e\xb4\xb5\x56\x7e\xcf\xe3\xd9\xcf\x36\x29\xc4\x21\x51\x50\ \x64\x0f\xe0\x95\x15\x0a\x12\x24\x0a\x8a\xec\x01\xbc\xf2\x0d\x85\ \x34\xce\x28\x34\xb3\xfb\x5e\xef\x61\xae\xa1\xd5\x2b\x24\xe3\x08\ \x73\xee\x2a\x2b\xcb\xb9\xcb\xc2\xb4\x38\x2e\xf5\xb9\x0b\x3f\x4d\ \x4d\x45\x69\x14\xbe\xbf\x9e\xf4\xee\x90\x6b\x70\xa4\xb8\xa4\x4d\ \xbf\xaa\x46\x6d\xf0\x9a\xb4\x01\x41\x2e\x3d\x16\x55\x43\xfd\x1c\ \x72\x0b\x80\x25\xca\x85\xbb\xb1\x5e\xfb\x9c\x94\x0f\x2c\x98\x71\ \x25\xb8\x50\xea\x0e\x86\xe5\x73\x27\x04\xe7\x01\x4d\x1f\x3f\xcf\ \x3c\x71\xc3\x64\x09\xa4\x68\x4a\x6e\xad\xe0\x9f\xdd\x17\x8e\x49\ \x52\x2c\xb4\x6e\x83\xf0\x07\xdc\xa3\x57\xab\x45\x91\x14\x49\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x45\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\xda\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\x80\ \x80\xff\x55\x55\xff\x80\x40\xff\x66\x33\xff\x55\x55\xdb\x6d\x49\ \xdf\x60\x40\xe3\x55\x55\xe6\x66\x4d\xe8\x5d\x46\xea\x6a\x40\xeb\ \x62\x4e\xef\x60\x50\xf0\x69\x4b\xf1\x63\x47\xe4\x5e\x43\xe7\x61\ \x49\xe8\x5d\x46\xea\x60\x4a\xeb\x66\x47\xeb\x62\x45\xed\x64\x49\ \xed\x61\x46\xee\x66\x44\xe7\x60\x48\xe8\x64\x46\xe9\x62\x4b\xe9\ \x5f\x49\xea\x63\x47\xec\x60\x46\xec\x64\x4b\xe8\x60\x4a\xe9\x64\ \x48\xe9\x62\x47\xea\x60\x4a\xea\x63\x49\xeb\x64\x46\xeb\x62\x4a\ \xec\x60\x48\xec\x63\x47\xe8\x61\x4a\xe8\x64\x49\xe9\x62\x48\xea\ \x62\x48\xea\x60\x47\xea\x63\x4a\xeb\x61\x49\xeb\x62\x47\xe8\x63\ \x48\xe9\x62\x47\xea\x62\x49\xeb\x63\x49\xeb\x62\x48\xe9\x63\x49\ \xe9\x62\x48\xe9\x62\x47\xea\x61\x49\xea\x63\x48\xea\x62\x47\xea\ \x61\x49\xeb\x61\x48\xeb\x62\x49\xe9\x61\x48\xe9\x63\x47\xe9\x62\ \x49\xea\x63\x48\xea\x61\x47\xea\x62\x48\xeb\x62\x49\xea\x62\x47\ \xea\x63\x47\xea\x61\x48\xea\x63\x47\xeb\x61\x48\xe9\x63\x49\xe9\ \x61\x47\xea\x63\x49\xea\x62\x48\xea\x61\x49\xeb\x61\x49\xe9\x62\ \x48\xea\x63\x47\xea\x62\x48\xea\x62\x47\xeb\x61\x48\xe9\x62\x48\ \xea\x61\x49\xea\x61\x49\xeb\x63\x47\xeb\x62\x49\xe9\x62\x48\xea\ \x62\x48\xea\x62\x47\xeb\x63\x48\xe9\x61\x49\xea\x63\x47\xea\x62\ \x48\xea\x62\x48\xea\x62\x49\xeb\x62\x47\xeb\x63\x48\xe9\x62\x48\ \xea\x62\x49\xea\x62\x48\xea\x62\x48\xea\x62\x48\xeb\x62\x48\xea\ \x62\x48\xea\x62\x47\xea\x63\x48\xea\x62\x48\xea\x62\x48\xea\x61\ \x48\xeb\x62\x47\xea\x62\x49\xea\x62\x48\xea\x62\x48\xea\x62\x48\ \xea\x62\x49\xea\x62\x47\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\ \x62\x49\xea\x62\x48\xea\x62\x48\xeb\x62\x48\xe9\x61\x49\xea\x62\ \x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x49\ \xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xe9\x62\x48\xea\ \x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\ \x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xe9\x62\x48\ \xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\x62\x48\xea\ \x62\x48\x61\x83\xc2\x3d\x00\x00\x00\x9d\x74\x52\x4e\x53\x00\x01\ \x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x10\x11\x12\x13\ \x15\x16\x18\x19\x1a\x1c\x1d\x1e\x20\x21\x22\x23\x24\x28\x29\x2d\ \x2e\x2f\x30\x31\x33\x34\x35\x36\x37\x38\x39\x3c\x3d\x3e\x3f\x41\ \x43\x44\x49\x4d\x4e\x50\x51\x53\x54\x55\x56\x57\x59\x5b\x5c\x5d\ \x5e\x5f\x61\x63\x66\x6b\x6c\x6e\x6f\x71\x74\x76\x77\x78\x7b\x7e\ \x80\x84\x87\x88\x8b\x8d\x90\x93\x96\x97\x99\x9c\xa1\xa3\xa5\xa8\ \xaa\xab\xac\xaf\xb0\xb1\xb3\xb7\xb8\xb9\xbb\xbe\xc1\xc2\xc4\xc6\ \xc7\xc8\xcc\xcd\xd0\xd2\xd3\xd6\xd7\xd8\xd9\xda\xdd\xdf\xe0\xe1\ \xe2\xe3\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xf0\xf1\xf2\xf3\ \xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x0d\xa6\x95\xc4\x00\ \x00\x02\x7d\x49\x44\x41\x54\x58\xc3\xed\xd9\xf9\x5b\x12\x41\x18\ \x07\xf0\x09\x85\x14\xf3\x2c\x34\x89\x0e\x3a\xc8\x34\x2b\xb3\x2c\ \xc3\x2c\xc9\xb4\xcc\xec\x12\xd3\xb2\x54\xd4\x34\xa5\xe8\xc0\x90\ \x0e\x8f\xc2\x4e\x54\xd2\xa8\x88\x9d\xff\x35\x4c\x7d\x9e\xbd\x66\ \xd8\x39\xf6\xa7\xe6\xfb\xeb\xbe\xf3\x79\xd8\x61\x9f\xd9\x77\x67\ \x00\xe0\x16\x4b\xc5\x31\xdf\xed\x87\xa1\x0f\xab\x7e\x5e\x62\xe9\ \x61\xef\xf5\xfb\x13\x6f\x7f\xc2\x8d\x48\xdb\x18\xc1\xad\xae\xfa\ \x36\x7f\x20\xbc\x04\xd5\x29\xa3\x04\xad\xe5\x1e\x6f\x57\x7f\x70\ \x26\x0d\x11\x21\x86\x8b\xd7\xc1\x14\xcc\x12\xc3\x70\xde\xfa\x3d\ \x7f\x87\x06\x63\x04\xde\x7e\x67\x64\x6a\x11\x12\xc6\x08\xfc\x08\ \x52\xc4\x08\x3c\x2d\x60\x01\x0b\xf8\x7f\x86\x53\x31\xde\xf0\x62\ \x38\xe0\x6f\xab\x77\xe5\x3a\x79\xc1\xc9\x99\x60\x7f\x97\xd7\x53\ \xb8\x39\x80\x19\xfe\xf5\x0f\xac\x75\xa9\x07\xd0\xc3\x1b\xf7\x9c\ \x83\x18\x40\x0e\xaf\x81\x1d\x5e\x8f\x3d\xcb\x00\x02\x78\x76\xac\ \xb7\xa3\xc1\x6d\xb4\x57\x20\x80\x5b\x89\xde\xe4\x02\x16\xb0\x80\ \x05\x2c\x60\x01\x1b\x87\xcb\x4a\xac\xbc\x61\x4b\xd5\xcd\xa7\x0b\ \x99\x0f\x4a\x69\x6e\xfc\xda\x2e\x7e\x70\x6e\x4b\x54\xd6\x17\xa4\ \x83\x27\x38\xc1\x47\xde\xa9\x7b\x8e\x51\x07\x0f\xb8\xf3\xb7\xb6\ \x3f\xfa\x5c\xcb\x0e\x77\xeb\x77\x5e\xed\xac\x70\x27\xa2\xa7\x4b\ \x33\xc2\xee\x14\x7b\xe3\xad\x07\x5b\x9e\x43\x73\xe0\xd3\xd0\x24\ \x78\xc8\x24\xd8\xbe\x6a\x12\x5c\x0d\x4d\x82\xcf\x99\x05\xb7\xe0\ \xe1\x62\x6a\xf8\x2c\xd6\x95\xac\x88\xfd\xba\xa2\xac\xf0\x01\x2c\ \x3c\xaf\x1d\xe0\xb8\x34\x18\x8d\x67\x2e\xc5\x82\xb7\x3c\x38\xd8\ \x96\xc0\xc1\x01\x75\xf9\xa1\x61\xf9\xa6\x62\xc4\x97\x83\x7e\x8e\ \x03\x38\xf8\x82\xb2\xb6\x68\x48\x52\x15\x44\xaa\x90\x70\x1d\xc6\ \xfd\x92\xaf\x28\xad\x99\xd3\xf9\xe2\xbe\x82\x5c\x84\xc6\xd0\xf0\ \x65\x45\xe1\xd1\x15\xdd\xa2\x1e\x14\x5c\xb9\x82\x72\x9f\x6d\x91\ \xd7\x1d\x5c\x42\x6d\x13\xa0\xd6\xe3\xc6\x3f\xfa\x03\xde\x57\x2a\ \xfe\xe5\x28\x66\xce\x10\x6f\x10\x9f\xa4\x57\xfc\x75\x9f\xa2\xe8\ \x06\x24\x87\x41\xc3\x37\x6d\x6d\x78\x8f\xa2\xa4\x20\x41\x03\x83\ \x9d\x13\xea\xbd\x0b\xbf\x4d\x59\xd1\x0c\xa9\xe0\xcc\xa3\x34\x2e\ \x9b\xe9\xc4\x5d\x07\xc1\xb3\x03\xb3\xb4\x58\xa5\x4d\x0f\x42\xaf\ \xe3\x1f\x23\x93\xdd\x75\x36\xed\xd5\x4f\x58\xb8\x89\xfa\xd8\x21\ \x0f\xbf\x08\x9e\xa1\x86\x4b\xf0\xf0\x45\xfa\x83\x12\xb3\x7e\x31\ \x88\x61\xe1\xfd\xf4\xf0\x28\xce\x4d\xd8\xe8\xe1\x56\xa2\x65\x9b\ \x20\x05\x71\x0c\x7c\x92\xe5\x9c\xab\x1d\xed\x3e\x66\x3a\x40\xb3\ \xbc\x44\xb9\x3f\x5c\x4c\x30\xd8\xbd\x80\xe8\x76\xcf\x03\xc6\xb8\ \xf5\xa7\xf9\x2a\x60\xce\xde\x57\x5a\x76\xb9\x19\x70\x48\x7e\x9f\ \xfa\x63\xe5\x89\x13\xf0\x89\xf3\x5e\x52\xd6\x27\x4d\x1e\x07\xfc\ \x62\x3f\xd5\x1b\x7a\xb3\x9c\x9c\x7f\x31\xe0\xdb\xc1\x48\xfd\x05\ \x91\x07\x2a\x24\x58\xb8\x05\x69\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x02\xe7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x01\x5f\x50\x4c\x54\x45\x00\x00\x00\x00\x00\x00\x66\x66\ \x99\x55\x55\x80\x60\x60\x80\x55\x55\x8e\x5d\x5d\x8b\x4e\x62\x89\ \x5b\x5b\x80\x55\x63\x80\x59\x66\x80\x55\x61\x86\x52\x5c\x85\x58\ \x62\x80\x58\x61\x84\x57\x5f\x83\x57\x5d\x83\x55\x61\x80\x55\x60\ \x80\x55\x5f\x82\x57\x60\x80\x5a\x66\x85\x54\x5f\x81\x54\x5f\x80\ \x56\x60\x81\x56\x63\x81\x54\x61\x81\x56\x5f\x81\x59\x67\x84\x58\ \x63\x82\x54\x5f\x80\x55\x60\x80\x5a\x68\x85\x56\x60\x80\x57\x63\ \x82\x59\x6a\x88\x56\x60\x80\x55\x60\x81\x56\x61\x80\x55\x5f\x81\ \x5b\x69\x88\x5a\x66\x87\x5f\x69\x89\x5e\x6a\x89\x5d\x6a\x89\x5f\ \x6d\x8a\x5e\x6c\x8a\x55\x60\x80\x5c\x69\x87\x59\x66\x84\x5e\x6c\ \x89\x5e\x6c\x8a\x5f\x6d\x8b\x55\x60\x80\x55\x60\x80\x5d\x6a\x89\ \x55\x5f\x80\x5e\x6c\x8a\x55\x5f\x80\x55\x60\x80\x5f\x6c\x8a\x5f\ \x6e\x8a\x5d\x69\x88\x5e\x6a\x88\x5e\x6c\x89\x5d\x69\x88\x5c\x6a\ \x88\x5d\x6b\x89\x5d\x6a\x88\x5d\x6b\x89\x5e\x6b\x89\x5d\x6b\x8a\ \x5e\x6d\x8a\x64\x72\x8f\x65\x74\x91\x5f\x6d\x8a\x60\x6e\x8b\x61\ \x70\x8e\x5f\x6c\x8a\x67\x79\x93\x6c\x7e\x99\x69\x79\x95\x69\x7a\ \x95\x79\x8d\xa4\x79\x8e\xa5\x76\x89\xa2\x73\x87\xa1\x7f\x96\xac\ \x81\x99\xad\x84\x9d\xb2\x71\x83\x9d\x87\xa0\xb5\x91\xad\xc0\x88\ \xa3\xb7\x8a\xa6\xb9\x96\xb3\xc5\x99\xb8\xc9\x95\xb1\xc3\x9d\xbd\ \xcd\x92\xaf\xc0\x97\xb4\xc5\x9b\xbb\xca\x9d\xbd\xcc\x9e\xbe\xce\ \xa0\xc1\xd0\xa1\xc2\xd1\xa3\xc5\xd3\xaa\xce\xdb\xab\xcf\xdb\xae\ \xd2\xdf\xae\xd3\xdf\xae\xd4\xe0\xaf\xd4\xdf\xb0\xd6\xe1\xb3\xd9\ \xe4\xb4\xda\xe4\xb4\xdb\xe5\x10\x93\x0b\x2e\x00\x00\x00\x63\x74\ \x52\x4e\x53\x00\x01\x05\x06\x08\x09\x0b\x0d\x0e\x12\x14\x15\x19\ \x1a\x1d\x23\x29\x2a\x30\x33\x38\x41\x43\x46\x4d\x4d\x4f\x53\x59\ \x5a\x5e\x60\x60\x62\x64\x67\x68\x6f\x74\x7b\x7e\x7f\x8f\x93\x9c\ \x9f\xae\xb0\xb1\xb2\xb4\xb5\xb7\xb9\xc2\xc2\xc3\xc7\xcb\xcc\xcd\ \xcf\xd5\xd7\xd9\xdf\xe3\xe3\xe7\xe9\xea\xeb\xeb\xeb\xeb\xec\xec\ \xec\xed\xed\xed\xee\xef\xef\xef\xf0\xf1\xf1\xf4\xf6\xf7\xf8\xfa\ \xfb\xfd\xfd\xfd\xfe\xfe\x7f\xfc\xd1\x7c\x00\x00\x00\xd4\x49\x44\ \x41\x54\x18\xd3\x63\x60\x00\x01\x21\x1d\x67\x77\x3f\x17\x63\x49\ \x46\x06\x24\xc0\x61\xe4\x9f\x52\x58\x52\x52\x9c\x1e\x6a\x2f\x80\ \x10\xe5\x71\x8c\x29\x81\x82\x4c\x6f\x51\x98\x28\x8b\x5d\x42\x09\ \x1c\x64\x7b\xf0\x43\x85\x35\x22\x4b\x90\x40\x9a\x25\x44\x94\xd9\ \xad\x10\x59\xb8\x24\x40\x18\x2c\x2c\x1e\x82\x22\x5a\x92\xa8\x0d\ \x16\xd6\x4c\x46\x15\xce\xb1\x05\x0b\xeb\xa6\xa2\x0a\x17\x39\x81\ \x85\xb5\x52\x50\x85\xf3\x1d\xc0\xc2\x4a\xd1\xa8\xc2\x19\x26\x60\ \x61\x5e\x2f\x54\xe1\x08\x59\x88\x0b\xcd\x93\x90\x45\xf3\x5c\xd9\ \x20\xc2\x82\xbe\x05\x48\xc2\x61\xca\x30\xdf\x2b\x04\xe5\xc2\x04\ \x8b\xa3\x0c\x10\x61\x25\xe3\x13\x0f\x11\xcd\x0a\x34\xb4\xe6\x42\ \x88\xf3\xe9\x79\x07\xc7\xc6\x85\x7b\xda\x88\x30\x48\x59\x71\x22\ \x05\x39\xab\x98\xbc\x8a\x04\x37\x88\x25\x6d\xc1\xce\x80\x0d\xc8\ \x99\xb1\x61\x15\x57\x34\x65\xc1\x2a\xae\xaa\xcf\x84\x55\x5c\x5d\ \x0d\x00\x73\x5b\x66\xe4\xca\x3b\x47\xfd\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xf1\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xc6\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\xff\xff\ \x00\xdb\xb6\x24\xe3\xc6\x1c\xea\xbf\x15\x3b\x4e\x62\xee\xbb\x11\ \xea\xbf\x15\xeb\xba\x14\xed\xb6\x12\xee\xbb\x1a\xef\xbd\x19\xe9\ \xbc\x17\xe9\xbd\x16\xea\xba\x15\xeb\xbc\x14\xec\xb9\x13\xee\xb9\ \x17\x41\x4c\x62\x40\x4a\x60\xeb\xb9\x14\x5d\x66\x94\xed\xbc\x16\ \x46\x54\x72\x44\x48\x62\xea\xbb\x15\x44\x4c\x60\x61\x6c\x97\xec\ \xba\x17\xec\xbc\x17\xed\xb9\x16\x4d\x57\x72\x5c\x68\x94\x5e\x6a\ \x95\x62\x69\x91\x60\x6b\x96\xeb\xb9\x16\xeb\xba\x16\xeb\xba\x16\ \xec\xba\x15\xea\xba\x17\xea\xba\x17\xeb\xb9\x15\xec\xb9\x17\xeb\ \xb9\x16\xeb\xbb\x16\xec\xba\x17\xeb\xbb\x16\x42\x49\x61\x41\x4a\ \x60\xeb\xba\x17\x66\x73\xa5\x42\x4a\x5f\x42\x49\x60\x42\x4a\x60\ \x42\x4a\x60\x6f\x7e\xb7\x6f\x7e\xb8\x6f\x7e\xb9\x70\x80\xba\x70\ \x81\xbb\x42\x4a\x60\x52\x5d\x7f\x71\x80\xbb\x73\x83\xbf\x93\x4d\ \x78\x3e\x00\x00\x00\x3e\x74\x52\x4e\x53\x00\x01\x01\x07\x09\x0c\ \x0d\x0f\x18\x1a\x1c\x1e\x1f\x22\x23\x25\x26\x28\x2c\x2f\x30\x33\ \x37\x39\x3a\x3c\x3c\x40\x42\x43\x44\x45\x4c\x56\x57\x6d\x70\x80\ \x81\x82\x85\x86\x88\x8f\x92\x96\x99\x9e\xa4\xb1\xb7\xcb\xd2\xeb\ \xec\xf2\xf4\xfd\xfe\xfe\xfe\xfe\x28\x82\x2d\xde\x00\x00\x00\x9c\ \x49\x44\x41\x54\x18\xd3\xcd\xcf\x57\x12\x82\x40\x10\x04\xd0\x66\ \x15\x23\x18\xd0\x35\x60\x40\x14\x03\x86\x35\x60\x44\x41\xb9\xff\ \xa5\x2c\xdd\x0f\x1d\xf0\x00\xf6\xe7\xab\x99\xa9\x69\x80\x66\x95\ \x47\x3c\x7d\x06\x6c\x74\xa0\xa2\x11\x9e\x2c\xd9\x8b\x0d\xaf\x48\ \xc7\x67\x2e\x7a\x69\xcd\xd3\xe3\x67\x4a\x68\x28\x6a\x8e\x90\xca\ \x79\x15\xb6\xbf\x57\xb2\x9c\x97\x3f\x6c\x0a\xb1\x18\x5e\xa3\xa0\ \x6b\x09\xe1\x92\x05\xdb\x8f\x1e\x4e\xe2\xc1\xd6\x25\x0a\x46\x30\ \xe6\x8c\x68\xfd\x78\xbf\x39\xeb\x02\xa6\x82\x11\x0d\xcf\x83\x77\ \x9d\xb1\x49\xb5\x23\x5b\x7e\xa5\x26\x15\xcd\x14\xd1\x83\x54\x9a\ \x7f\x50\x6c\xc3\x53\x3b\xa9\xc8\xec\x7e\xe9\x13\xbe\x51\x13\xdd\ \x5b\x2d\x26\xcc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \ \x00\x00\x04\xac\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\xda\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\x80\x80\ \x80\x55\xaa\xaa\x80\x80\xbf\xff\xcc\x00\x80\x80\xaa\x6d\x92\xb6\ \xe6\xb3\x1a\x74\x8b\xb9\xe8\xb9\x17\x70\x80\xbf\x78\x87\xc3\x71\ \x80\xb8\xf1\xb8\x1c\xf2\xbc\x1b\xe6\xbf\x1a\x6f\x85\xbc\x70\x85\ \xc2\xeb\xb8\x14\x76\x80\xba\x72\x84\xc1\xee\xbb\x1a\x73\x84\xbd\ \x70\x80\xbf\x74\x83\xc1\xe8\xb9\x17\x71\x80\xbc\xe9\xbc\x17\x72\ \x86\xbc\x76\x83\xbe\x70\x83\xc1\xec\xbb\x19\x71\x82\xbe\x72\x82\ \xc1\xeb\xb8\x14\x73\x82\xbe\xec\xbc\x18\x71\x84\xbd\x74\x82\xbe\ \xec\xb9\x17\x72\x84\xbf\xe9\xba\x16\xea\xb8\x15\x71\x82\xbe\x72\ \x81\xc0\x74\x83\xbd\x73\x81\xc0\xea\xba\x15\xeb\xb9\x17\x74\x84\ \xc0\x74\x84\xbe\x73\x83\xbf\xec\xba\x16\xea\xb9\x15\xea\xbb\x15\ \xeb\xb9\x17\x73\x84\xc0\x73\x84\xbf\xeb\xb9\x16\x72\x82\xbe\xec\ \xbb\x16\x73\x84\xbf\xeb\xb9\x17\xec\xbb\x16\x72\x83\xbf\x74\x84\ \xbe\xea\xba\x17\x74\x84\xbf\xeb\xb9\x17\xeb\xba\x16\xeb\xba\x16\ \xec\xba\x16\x74\x83\xbf\xec\xba\x15\xea\xb9\x17\x72\x83\xbf\x74\ \x83\xbe\x72\x83\xbe\xea\xb9\x17\x73\x83\xbe\xeb\xba\x16\x74\x82\ \xc0\xec\xba\x15\xec\xb9\x17\x72\x84\xbf\x73\x84\xc0\xeb\xba\x16\ \xeb\xbb\x16\xeb\xba\x15\x72\x83\xbf\xeb\xba\x15\x73\x84\xc0\x73\ \x83\xbe\xeb\xba\x16\x73\x83\xbf\xeb\xba\x15\x73\x83\xc0\xeb\xba\ \x17\x74\x83\xbf\xec\xba\x17\x74\x82\xbf\x73\x83\xc0\x72\x82\xbf\ \xeb\xba\x17\x73\x84\xbf\xec\xba\x16\x73\x84\xbf\x73\x83\xc0\xeb\ \xbb\x16\xeb\xba\x16\x73\x83\xc0\xec\xba\x16\xea\xb9\x16\x73\x83\ \xbf\x73\x83\xc0\xeb\xba\x16\xeb\xba\x16\x73\x83\xbf\x73\x83\xbf\ \xea\xba\x16\xeb\xba\x15\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\xeb\ \xba\x16\x73\x84\xbf\x73\x83\xbf\xeb\xba\x15\x73\x83\xbf\xeb\xba\ \x16\xeb\xba\x16\x73\x83\xc0\xeb\xba\x16\x74\x83\xbf\xeb\xba\x16\ \x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\xc0\x73\ \x83\xbf\x73\x83\xbf\xeb\xba\x16\x72\x83\xc0\x73\x83\xbf\x73\x83\ \xbf\x73\x83\xbf\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\ \x73\x83\xbe\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\ \xba\x16\xc7\x9f\x92\x8c\x00\x00\x00\x9c\x74\x52\x4e\x53\x00\x01\ \x02\x03\x04\x05\x06\x07\x0a\x0b\x0b\x10\x11\x12\x12\x13\x14\x17\ \x19\x19\x1a\x1d\x1e\x1f\x20\x21\x21\x22\x22\x26\x27\x29\x29\x2b\ \x31\x32\x33\x35\x36\x37\x37\x38\x3b\x3d\x3f\x41\x42\x45\x4a\x4c\ \x4d\x4f\x50\x51\x54\x56\x58\x59\x5b\x5b\x5e\x5e\x5f\x66\x69\x6b\ \x6e\x6f\x70\x71\x72\x73\x76\x77\x77\x7c\x7f\x82\x86\x87\x8a\x8c\ \x8d\x90\x92\x93\x95\x98\x99\x9b\x9c\x9c\x9d\x9e\xa3\xa7\xa7\xa9\ \xa9\xaa\xaa\xac\xad\xb0\xb5\xb8\xb8\xba\xbd\xc2\xc4\xc5\xc5\xc6\ \xc7\xc9\xc9\xce\xcf\xd2\xd3\xd6\xda\xdc\xde\xde\xdf\xe2\xe2\xe3\ \xe3\xe4\xe5\xe6\xea\xeb\xec\xed\xee\xef\xf1\xf2\xf3\xf4\xf5\xf6\ \xf7\xf8\xfa\xfa\xfb\xfc\xfd\xfd\xfe\xfe\xf1\x60\x8a\x5f\x00\x00\ \x01\xe5\x49\x44\x41\x54\x58\xc3\xed\xd8\x69\x57\x4e\x61\x18\x05\ \xe0\xbb\x78\x9b\x0c\x95\x21\x42\xc6\x4c\x25\x32\x4f\x4d\x64\x4a\ \xc9\x58\xa2\x24\x91\x32\xcf\x22\x8a\x06\x89\x32\x57\x94\xbd\xff\ \x6b\x1f\x58\xcb\x2b\x6b\x9d\xf5\x9c\x77\x3d\x7b\x2d\x1f\xce\xfe\ \x01\xd7\xb7\xf3\x9c\x7b\x6f\xb3\x28\x51\xa2\xfc\xff\x59\xbf\x37\ \x4f\xc1\xa6\x5c\x01\x26\x6b\xfd\xbb\xe9\x37\x00\x00\x5b\x7c\xbb\ \xb3\xee\x01\x00\x70\xca\xb3\x9b\xfd\xf4\x97\x8b\x7a\xbf\xee\xa2\ \x2e\x48\xe0\x15\xbd\x90\xc0\xf9\x83\x90\xc0\x9b\x46\x20\x81\xb7\ \x7d\x81\x04\xde\x37\x0a\x09\x7c\xe0\x07\x24\x70\x15\xa0\x80\x93\ \xce\x40\x02\xcf\x68\x82\x04\x4e\xbd\x0e\x09\x9c\x7e\x0b\x12\x78\ \xf6\x43\x48\xe0\x79\x9d\x08\x80\x73\x62\x89\xba\x79\x3d\x08\x80\ \x4f\xf2\x59\x96\x23\xb4\xa0\xe6\xf2\xd5\xb8\xdc\x1e\x45\x10\xfc\ \x84\x7c\x9c\xe6\xe4\x2e\x7f\x0f\xc7\xd4\x9b\x99\xed\x9a\x20\x1b\ \x9d\xe0\x36\x84\x82\xed\x08\xc9\x9d\x2e\xf0\xcb\x90\xb0\xb5\x90\ \xaf\x33\x1c\xe0\x81\xb0\x70\xd6\x3b\xf2\xa8\x02\xb6\x4a\xb2\x3f\ \xa6\x80\xd3\xde\x92\x5b\x15\xb0\x9d\x25\x9b\x25\x70\x01\xf9\x46\ \x02\xc7\x3e\x91\xcb\x14\xb0\x3d\x20\x8b\x25\x70\x33\x59\x21\x81\ \xcf\x91\xc7\x25\xf0\x69\xb2\x5a\x02\x9f\x27\x0f\x4b\xe0\x0e\x72\ \xbf\x04\xee\x26\x37\x28\xe0\xf9\xe4\x58\x86\x02\x2e\x27\xef\x4b\ \xbe\xbc\x3b\xe4\x31\x05\xbc\x96\xfc\x9e\xa3\x80\x6f\x92\xd7\x14\ \x0f\xfd\x1e\x72\x62\x8d\x03\xfc\x28\x24\xbc\x64\x98\xbc\xe0\xf2\ \x33\x3d\x18\x0e\x9e\xfb\x9c\xec\xcb\x74\x81\x93\x4f\x7c\x0e\x03\ \xb7\x92\x63\x85\x8e\xa7\xd0\xcc\xc5\x4b\xe3\xb2\xf1\x62\x20\x7c\ \x97\x3f\x4b\x13\xee\x08\x93\x01\xf0\xca\x86\xdd\x89\x9f\x9b\x65\ \xe3\x9a\x33\xd6\x6c\xc7\x37\x11\x6c\x9b\x3f\x8a\x60\x5b\x37\x24\ \x82\x6d\xd5\x80\x08\xb6\xdc\x17\x22\xf8\xdf\x2a\xe2\xad\x4b\x4f\ \x2f\x4f\xfe\xda\xff\xb4\xba\xe7\x71\xaf\x48\x6d\x13\xc1\x7f\x57\ \x6a\xaf\x9b\x50\xfc\x08\xe0\x79\x1e\xab\x52\xc1\x7f\x86\x16\xdf\ \xb0\x95\xfc\x7e\xec\xea\xbc\x8f\xa6\xdb\xbf\x02\x00\x0e\xf9\x9f\ \x63\x8b\x3e\x00\x78\x35\x47\x30\x20\xaf\x6e\xef\xbc\xb4\x30\x9a\ \xe7\xa3\x44\x89\xe2\x2d\x53\xe9\x3d\x32\xfd\xad\x05\xdb\xe7\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\xdf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x02\x37\x50\x4c\x54\x45\x00\x00\x00\xff\x40\x80\xff\xbf\ \x40\xff\xaa\x80\xff\xdf\x9f\xff\xc6\x55\xe6\xcc\xb3\xff\xcc\x4d\ \xff\xd1\x5d\xff\xc4\x4e\xff\xc8\x5b\xef\xbf\x8f\xf0\xc3\x87\xff\ \xd1\x51\xff\xd3\x59\xff\xca\x55\xed\x52\x64\xed\x58\x61\xf6\xc1\ \x8d\xf7\xbf\x8f\xea\x55\x63\xf4\x8f\x7a\xfa\x97\x82\xff\xcc\x52\ \xff\xce\x53\xed\x55\x62\xff\xce\x55\xed\x54\x65\xff\xcf\x54\xee\ \x56\x63\xf2\xdc\xa4\xff\xcc\x55\xf2\xde\xab\xff\xce\x52\xff\xcd\ \x55\xff\xd0\x54\xff\xcd\x53\xec\x56\x63\xed\x56\x65\xed\x56\x65\ \xed\x55\x64\xed\x54\x63\xed\x56\x65\xec\x55\x63\xff\xce\x54\xff\ \xcf\x55\xff\xcd\x53\xed\x55\x65\xff\xce\x54\xf4\xbd\x8e\xf4\xbe\ \x8d\xff\xcd\x52\xff\xcd\x54\xff\xcb\x52\xff\xce\x54\xf0\xde\xac\ \xf4\xbf\x8d\xff\xcd\x54\xed\x54\x65\xf4\xbf\x8f\xed\x55\x63\xf1\ \xdf\xae\xff\xce\x54\xfc\xc6\x4e\xff\xcf\x53\xff\xcf\x54\xff\xce\ \x54\xfc\xc6\x4d\xff\xce\x54\xff\xce\x53\xed\x55\x64\xed\x55\x63\ \xf9\xc2\x48\xf9\xc1\x49\xff\xce\x55\xee\x86\x7f\xef\x83\x7c\xfa\ \xc2\x48\xf4\xbe\x8e\xff\xce\x54\xff\xce\x54\xed\x55\x64\xff\xcd\ \x55\xff\xce\x54\xf4\xbe\x8e\xff\xcd\x54\xf4\xbe\x8e\xf4\xbd\x8e\ \xf5\xbe\x8f\xf3\xbe\x8e\xff\xcf\x54\xff\xce\x54\xf4\xbe\x8e\xff\ \xce\x54\xed\x8a\x86\xf4\xbe\x8e\xed\x55\x64\xed\x55\x64\xec\x8c\ \x87\xff\xce\x54\xff\xce\x54\xff\xce\x54\xff\xce\x54\xeb\xe4\xd1\ \xea\xe5\xd3\xed\x55\x64\xf4\xbe\x8e\xf4\xbe\x8e\xed\x55\x64\xff\ \xce\x54\xff\xce\x54\xe8\xe7\xe3\xe8\xe7\xe4\xff\xce\x54\xcc\xd1\ \xd9\xcd\xd2\xda\xd4\xb2\xbc\xd4\xb4\xbe\xd4\xd8\xdf\xd5\xda\xe0\ \xd6\xb5\xbf\xdb\xbb\xc3\xdc\xbb\xc3\xde\xe1\xe7\xdf\xe2\xe7\xe1\ \xe4\xe9\xe1\xe4\xea\xe2\xe6\xea\xe5\xe8\xec\xe5\xe9\xed\xe6\xe9\ \xec\xe6\xe9\xed\xe7\xc4\xcb\xe8\xc6\xcd\xec\x5a\x69\xec\x5b\x69\ \xec\x5b\x6a\xed\x55\x64\xed\x56\x64\xed\x56\x65\xed\x5b\x6a\xed\ \x5c\x6a\xf0\x85\x77\xf0\x86\x78\xf1\x89\x79\xf4\xbe\x8e\xf5\xd8\ \x8f\xf5\xd8\x91\xf5\xd9\x8f\xf6\xbb\x42\xf6\xbb\x43\xf6\xbc\x42\ \xf6\xbc\x43\xf7\xbc\x43\xf7\xbc\x44\xf7\xbd\x43\xf7\xbd\x44\xf7\ \xbd\x45\xf7\xbe\x45\xf8\xbf\x45\xf8\xbf\x46\xf8\xc0\x46\xf9\xc0\ \x47\xf9\xc1\x48\xf9\xc2\x48\xf9\xc2\x49\xfa\xc3\x4a\xfa\xc4\x4a\ \xfa\xc4\x4b\xfb\xc5\x4b\xfb\xc5\x4c\xfb\xc6\x4c\xfb\xc6\x4d\xfc\ \xc7\x4e\xfc\xc8\x4e\xfd\xc9\x4f\xfd\xc9\x50\xfd\xca\x50\xfd\xca\ \x51\xfd\xcb\x51\xfe\xcb\x51\xfe\xcb\x52\xfe\xcc\x52\xfe\xcc\x53\ \xfe\xcd\x53\xff\xcd\x53\xff\xcd\x54\xff\xce\x53\xff\xce\x54\x1b\ \x8a\xa2\x88\x00\x00\x00\x72\x74\x52\x4e\x53\x00\x04\x04\x06\x08\ \x09\x0a\x0a\x0b\x0d\x0e\x10\x11\x16\x17\x18\x1c\x1d\x1d\x20\x24\ \x30\x31\x32\x34\x39\x39\x3a\x3a\x3b\x3b\x3c\x3d\x3e\x42\x46\x47\ \x50\x53\x56\x57\x64\x65\x6c\x6d\x6f\x71\x72\x77\x78\x79\x7a\x80\ \x85\x88\x8a\x8b\x8b\x8e\x8f\x90\x90\x92\x99\x99\x9e\xa1\xa2\xa6\ \xa8\xab\xac\xb5\xb6\xb8\xb9\xbb\xbb\xbc\xbc\xc6\xc7\xd3\xd4\xd7\ \xd8\xd9\xda\xdc\xdd\xdd\xde\xe0\xe0\xe2\xe2\xe4\xe5\xe6\xeb\xec\ \xf0\xf1\xf2\xf3\xf6\xf7\xfa\xfc\xfc\xfd\xfe\xfe\xfe\x30\x77\xc6\ \xe9\x00\x00\x02\xe5\x49\x44\x41\x54\x58\xc3\xed\xd7\xe7\x5f\xd3\ \x40\x18\x07\xf0\x03\x37\x0e\xb4\xe2\xc4\x8d\x8a\xa2\x02\x6a\xc5\ \xbd\x70\x81\x13\x1c\x28\x02\xee\x85\x16\xb4\x80\x82\x13\x68\x50\ \xac\x03\x89\x35\x80\x5a\xa5\x82\xd6\x0a\x52\x41\x6a\x85\x7a\x7f\ \x9c\x97\xe4\x2e\x4d\xdb\xf0\xf9\x34\xc9\xe5\x5d\x7e\xaf\xf2\x86\ \x6f\x8f\xe7\x79\xee\x92\x03\x80\x72\x26\x6d\x3d\x7f\xab\x68\xdd\ \x28\xda\x2c\xb0\x9c\x66\xf9\x1c\xa5\x2d\x5b\x8a\x59\x31\x6b\x0d\ \x72\xd9\x93\x06\xb9\xec\x4d\x83\x5c\xb6\xd4\x20\x97\xdd\x64\x90\ \x5b\x34\x91\x9e\x7b\x46\xe6\x96\x4e\x37\x5d\xd3\x35\x5d\xd3\x35\ \x5d\xd3\x35\x5d\xd3\x35\x5d\xd3\x35\xdd\xb8\x92\xb2\x32\x3d\x75\ \x6a\x02\x7d\x77\x59\xb9\x13\xc5\x76\xb1\xf0\xc0\xb6\xac\x15\xf3\ \x67\x50\x73\x33\x6c\x4e\x79\x5e\xb4\x52\x72\x0f\xbd\x74\x46\xa5\ \x85\xb8\xc5\x16\xed\xec\xe8\x73\xce\xd8\xbc\xd1\xbf\xde\x05\xd7\ \x9f\xbe\x56\x90\x5b\xf4\xba\x1b\x6f\x33\xcc\x48\xb2\x0e\x37\x69\ \xd7\x5b\x07\xc3\x30\x4d\xaf\x14\xe4\x56\x1d\xee\xbc\x12\x08\x45\ \xf9\xb9\x82\x3c\x53\x2b\x3b\x26\xa7\x02\x42\x51\x7e\x72\xb7\x39\ \x16\x9e\xa3\xd1\x5d\x78\x0a\x8a\x41\xf2\xa3\x2a\x05\x39\x5d\x13\ \x3b\x2e\xa7\x12\x42\x49\x6e\xa8\xad\xbe\x1f\xd3\xc1\x2c\x2d\xee\ \xd2\x32\x28\x8b\x50\xe7\x98\xd9\xd8\xa2\x9e\x4d\xce\x85\x91\x51\ \x94\xf7\xab\x65\x13\xd7\x5c\x85\x50\x41\x6e\xac\x8b\xac\x73\xa1\ \x4a\x37\xed\x04\x54\x08\x92\xeb\xa3\x3a\x78\x41\x15\x3b\xfb\x58\ \x18\x1b\xf8\xe2\xe9\x97\xcb\xf7\xaa\xea\xe4\xd5\xb0\x25\xc4\xcf\ \x4e\xd9\x67\x97\xa4\x90\x8f\xe3\xb8\xce\xc8\x35\x37\x46\xd4\x79\ \x5a\xfc\x70\x41\xd8\xf9\xdd\x89\x5c\xce\x23\xab\xc6\xbb\xe8\x0e\ \xa6\xc6\x0f\x5f\x21\xc8\xb0\x97\x67\xb9\xcf\x01\x18\x2d\x3f\x68\ \xd6\xb2\x43\x32\x31\xd1\xe7\x16\x5c\x6f\x28\xb2\x83\xbc\x5c\x5d\ \xf3\x8c\xc0\x19\x2a\x7a\x67\x15\x9a\xe6\x11\xd8\x4f\xbf\x62\x66\ \xc3\xe5\x60\x6a\xab\x6a\xf0\x89\x54\x9e\x02\x54\xc9\xc1\x6f\x02\ \xdb\xe6\x1d\x56\x98\x3a\x97\xa3\xe1\xe1\x63\xb1\xce\xb6\xe5\xea\ \xc6\x78\x67\xbb\xe0\x76\x05\xa0\x62\x5c\x52\x07\x57\xa9\xdd\x78\ \x47\xf8\xa6\xf5\xc1\x91\x42\xe4\xc3\xea\x4f\x8a\xfc\x8f\x3d\x21\ \x05\xf1\x9f\xcf\xe3\x97\x66\xa3\xe9\x92\x96\xa3\x6d\x43\x58\x0b\ \xf6\x4a\x1d\xfc\x8e\xfe\x93\x21\x22\xdf\x18\xab\xe9\x30\xce\x96\ \x76\x09\x1a\x3b\xbc\xab\xfb\xf9\xda\x07\xf1\xd4\xdd\x59\xa4\xf1\ \xed\x81\xe5\x41\x7e\x9c\x7f\x88\x4b\xe7\x1f\x7d\xa4\xce\xdb\x35\ \xbf\x46\xb3\x25\xd7\x2d\xae\xb2\x9b\xdf\xdf\xa4\xf4\xb9\x3a\x3e\ \xab\x90\x1c\xf8\xc0\xbb\x83\x02\xd5\x83\x1e\x3b\xfe\x60\xf7\x6c\ \x92\x9e\x4f\x60\xab\xdc\x0d\xb4\xa1\x67\x32\x82\x15\x73\xf5\x7d\ \x5c\xe7\x85\xdd\x10\xbf\xc7\xbf\x92\x8e\x6e\xd6\xfb\xd9\x9e\x4f\ \x5c\xd8\xcb\xff\xc6\x10\x76\x4b\xc6\xeb\xbe\x10\xe4\x61\x37\xd8\ \x81\x60\x3f\x76\x2b\x17\x53\xb8\x6a\xe0\xa9\xeb\x92\x17\x62\x07\ \x95\x4b\x8c\x20\xfb\x91\xfb\xfe\x2f\x76\xcb\x26\x00\x5a\x72\xc8\ \x2d\x9b\x08\x7b\x1a\xad\x8b\x97\x15\xfe\x94\xbf\xfa\x76\x53\xbb\ \xd1\x81\xf5\x68\xc1\xed\x03\xd8\xbd\x96\x4c\x0f\x46\x53\xc7\x75\ \x93\x05\xaf\x06\x80\xaa\x4c\x16\x7c\x3c\x91\x2a\x0c\xf6\x90\x05\ \x2f\x01\x94\x83\xe7\xf9\x20\x00\x86\xc8\xf6\x59\xc0\x18\x79\x2f\ \x30\x22\x99\x97\x0b\x26\x6b\xff\xeb\xff\x40\x2c\x3f\x8e\x29\xc3\ \x32\x89\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xf4\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xcf\x50\x4c\x54\x45\x00\x00\x00\xff\xaa\x55\xea\xbf\ \x15\xea\xd5\x40\xd3\xc8\xb1\xeb\xcc\x47\xf2\xd1\x48\xf5\xf1\xdd\ \xd3\xbd\x84\xf0\xcd\x49\xf0\xdb\x90\xee\xcf\x4a\xdf\xda\xc2\xef\ \xce\x4a\xd2\xbf\x86\xf0\xce\x4a\xcf\xc2\x98\xef\xcd\x4a\xef\xce\ \x49\xec\xb9\x16\xeb\xba\x16\xda\xbf\x64\xf0\xce\x4a\xe3\xbf\x41\ \xec\xba\x16\xef\xce\x4a\xdb\xbd\x5e\xdb\xbe\x5f\xdc\xc3\x71\xd6\ \xca\x97\xed\xc4\x32\xd3\xc0\x85\xeb\xbe\x1e\xd0\xc1\x8d\xed\xc9\ \x3d\xef\xc7\x38\xf1\xd9\x81\xef\xcb\x47\xf0\xda\x7b\xef\xce\x4a\ \xcf\xca\xae\xd0\xca\xb1\xe7\xcd\x65\xed\xc7\x47\xef\xcf\x4a\xeb\ \xcc\x52\xef\xce\x4a\xef\xcc\x46\xef\xce\x4b\xeb\xba\x16\xef\xce\ \x4a\xef\xce\x4a\xd8\xd3\xbb\xda\xd6\xbd\xdd\xd8\xc0\xde\xd9\xc2\ \xde\xda\xc2\xe4\xdf\xca\xe7\xe2\xcd\xe8\xe2\xcd\xea\xe4\xd0\xeb\ \xba\x16\xec\xe7\xd2\xee\xe9\xd4\xef\xce\x4a\xf2\xec\xd9\xf2\xee\ \xda\xf2\xee\xdb\xf4\xef\xdc\x89\x9e\x73\x85\x00\x00\x00\x34\x74\ \x52\x4e\x53\x00\x03\x0c\x0c\x17\x19\x27\x35\x3a\x42\x55\x5a\x60\ \x72\x7c\x87\x8b\x9f\xa0\xac\xb1\xb2\xb7\xb8\xb8\xbb\xbe\xbf\xc0\ \xc1\xc2\xc3\xc3\xc5\xc8\xc9\xca\xcc\xcd\xcf\xd5\xd5\xd5\xd5\xdd\ \xe2\xe4\xf0\xf3\xf5\xf6\xfc\x85\x8d\x51\xd8\x00\x00\x00\xa0\x49\ \x44\x41\x54\x18\xd3\x6d\xd0\x47\x12\xc2\x30\x0c\x40\x51\x53\x43\ \x27\xf4\x5e\x42\xef\x9d\x80\x31\x35\xf1\xfd\xcf\x84\x3c\xe3\x78\ \x9c\x28\x7f\xf9\x16\x92\x46\x84\x90\x78\x8e\xfb\x32\x88\x28\x65\ \x2e\xc3\xb8\x60\x01\x3f\x19\x63\x1f\xcc\x0f\x4a\xe9\x5b\xe7\x6a\ \xcd\x0a\x1b\xf2\xea\x08\xbe\x5d\x65\x77\x1f\xbb\x3f\x99\xcb\x79\ \x26\xaa\xd8\xf1\xd8\xe1\x7c\x5d\x51\x6c\x5f\x64\x36\x70\x53\xb1\ \x9e\xc7\x8b\xc9\x4c\x6f\x3a\x6a\x95\x05\xf7\xbe\xc1\xe6\x82\x57\ \x88\xf3\xc0\x03\xa4\xe7\x04\x70\x17\x71\x1d\x56\xb6\xb7\x88\xb3\ \xc0\x0d\xa4\x87\x18\x70\x1f\x71\x09\xee\x3e\xee\x11\xa7\x81\x87\ \x48\x77\x11\xe0\x31\xe2\xa2\x78\xec\x26\xa8\xa7\x24\xe8\x1f\x05\ \x61\x60\x28\xf1\x65\xe0\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x04\x62\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\xc2\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\x80\ \x00\xff\xaa\x55\xff\xbf\x40\xff\xcc\x00\xff\xcc\x33\xff\xdb\x49\ \xea\xbf\x15\xea\xd5\x40\xee\xcc\x44\xef\xbf\x10\xef\xcf\x50\xf0\ \xb4\x0f\xeb\xcc\x47\xed\xd1\x49\xed\xb9\x12\xef\xcf\x48\xf0\xcb\ \x4b\xed\xce\x49\xee\xcd\x48\xef\xcf\x4a\xeb\xb8\x14\xf0\xce\x4a\ \xec\xbc\x18\xf1\xcc\x4a\xf0\xce\x4b\xf0\xcf\x4a\xee\xce\x49\xee\ \xcd\x4a\xef\xcf\x4a\xea\xba\x15\xf0\xcf\x4b\xeb\xba\x17\xef\xce\ \x49\xef\xcd\x4a\xea\xb9\x15\xef\xce\x49\xf0\xcf\x4a\xf0\xcd\x4b\ \xee\xcd\x4a\xef\xce\x49\xeb\xbb\x16\xf0\xcd\x49\xee\xcf\x4a\xef\ \xce\x4a\xeb\xba\x16\xee\xcd\x4a\xef\xce\x4a\xef\xce\x4a\xef\xcf\ \x4a\xf0\xcd\x4a\xeb\xba\x16\xeb\xbb\x16\xeb\xb9\x16\xef\xce\x4b\ \xec\xba\x17\xef\xce\x4a\xf0\xce\x4a\xf0\xce\x4a\xee\xcf\x4a\xec\ \xba\x17\xef\xce\x4a\xec\xba\x16\xef\xce\x4a\xee\xc3\x2d\xeb\xbf\ \x24\xec\xbf\x24\xee\xce\x49\xec\xc1\x28\xec\xbf\x22\xed\xc4\x30\ \xec\xc0\x28\xef\xce\x4a\xed\xc3\x2e\xec\xbd\x1f\xeb\xc0\x26\xec\ \xbf\x20\xec\xc3\x2b\xef\xcd\x4a\xeb\xba\x17\xec\xc2\x29\xee\xc8\ \x39\xef\xce\x4a\xeb\xbd\x1d\xeb\xbf\x21\xed\xbd\x20\xed\xc6\x36\ \xed\xc4\x33\xed\xc4\x31\xec\xbd\x1e\xea\xbc\x1b\xeb\xbb\x1a\xeb\ \xbc\x1a\xee\xc7\x3a\xee\xc8\x3b\xee\xc9\x3d\xeb\xbc\x1a\xef\xca\ \x3f\xef\xce\x4a\xea\xb9\x17\xeb\xba\x18\xef\xce\x4a\xf0\xce\x4a\ \xef\xca\x3f\xef\xca\x42\xeb\xba\x16\xef\xce\x4a\xeb\xba\x16\xf0\ \xcc\x42\xeb\xb9\x16\xec\xba\x17\xeb\xba\x16\xef\xcc\x43\xef\xce\ \x49\xea\xb9\x16\xeb\xb9\x16\xeb\xb9\x17\xee\xcb\x43\xeb\xbb\x17\ \xf0\xcc\x45\xef\xcd\x46\xef\xce\x4a\xeb\xba\x16\xef\xce\x4a\xef\ \xcd\x47\xef\xce\x4a\xeb\xba\x17\xeb\xbb\x16\xeb\xbb\x16\xef\xcd\ \x4a\xef\xce\x49\xeb\xba\x16\xee\xcd\x48\xef\xce\x4a\xef\xce\x49\ \xef\xce\x4a\xeb\xba\x16\xee\xce\x4a\xeb\xba\x16\xeb\xba\x16\xeb\ \xba\x16\xef\xce\x49\xef\xce\x4a\xeb\xba\x16\xef\xce\x4a\xeb\xba\ \x16\xef\xce\x4a\xeb\xba\x16\xef\xce\x4a\x9b\x02\x23\x12\x00\x00\ \x00\x94\x74\x52\x4e\x53\x00\x01\x02\x03\x04\x05\x05\x07\x0c\x0c\ \x0f\x10\x10\x11\x19\x1c\x1d\x20\x22\x2a\x2e\x30\x32\x34\x35\x37\ \x44\x45\x49\x4c\x4f\x55\x55\x59\x5e\x61\x62\x62\x64\x66\x6b\x73\ \x74\x76\x79\x7c\x7d\x8a\x8d\x91\x94\x95\x98\x99\x9a\x9d\x9e\xa2\ \xa5\xa6\xa9\xaa\xaa\xab\xac\xaf\xb7\xb8\xb8\xb9\xba\xba\xbb\xbb\ \xbc\xbd\xbe\xbe\xbe\xbe\xc0\xc0\xc1\xc1\xc2\xc2\xc2\xc2\xc3\xc4\ \xc6\xc7\xc8\xcc\xcc\xcc\xcc\xce\xce\xd0\xd1\xd4\xd5\xd6\xd9\xd9\ \xda\xda\xdb\xdb\xdc\xdf\xe5\xe5\xe5\xe6\xe7\xe7\xe7\xe8\xe8\xe9\ \xe9\xea\xea\xec\xed\xee\xef\xf2\xf2\xf3\xf4\xf4\xf4\xf6\xf6\xf7\ \xf7\xf9\xfa\xfb\xfc\xfc\xfd\xfd\xfe\xfe\x93\xeb\x02\x19\x00\x00\ \x01\xbb\x49\x44\x41\x54\x58\xc3\xed\xd9\xc5\x72\x03\x31\x10\x04\ \x50\x87\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\xc9\x01\x07\xed\ \x58\xfe\xdf\x54\xe5\x36\x93\x4a\xe2\x6c\x5a\x17\xd7\xf6\x07\xbc\ \xea\x83\xa4\x95\x66\x35\x1a\x35\x6a\x2c\x21\x51\x85\x65\xdf\x27\ \x56\xb9\x9b\x2e\x7e\xca\x93\xbf\x62\x78\xf7\x47\x58\xac\x3a\x2a\ \x85\xc5\x2f\xc9\x95\x05\x8b\x08\x59\xf0\x85\xa7\x24\x58\x74\x5a\ \x4b\x82\x45\xb2\x2c\xf8\x39\x50\x12\xac\x6c\xcd\x99\x03\x8b\x7c\ \x37\xb3\x62\xf7\x67\xd8\xcc\xe8\x2a\x5c\xe4\xc0\x42\xe4\xc9\x82\ \xd7\x65\xc1\x9b\x2a\xac\xc2\x2a\xac\x08\xbe\x1a\xee\xfb\x47\x6a\ \x12\x3e\x13\xe7\xf3\x05\x3e\xd8\x32\x21\x62\x88\xe4\x70\x97\x09\ \x93\x19\x06\xeb\xf7\x41\xf0\x35\x83\xc7\x40\xae\xa9\x92\xc1\x43\ \x28\x38\x9c\xc2\xda\x5b\x90\x7b\xee\x40\xe1\x7e\x54\xe1\x6c\xb6\ \xdc\xc6\x51\x70\x10\x85\xf7\x5e\x41\xee\x8a\x15\x85\x5b\x51\x85\ \xd3\xd8\x96\x5e\x04\xb9\x46\x6f\x0a\xcf\xa1\x0a\xf7\xb0\x43\xa8\ \x1d\x05\xc7\x53\xf8\xe5\x10\xe4\x3e\xba\x52\x78\x04\x55\xb8\x94\ \x9d\xc7\x83\x28\x38\x8c\xc2\x97\x37\x20\xf7\xd4\x9e\xc2\x6d\xa8\ \xc2\x59\xec\xd3\x34\x81\x82\x03\x28\xbc\xf1\x06\x72\x17\xd8\xc7\ \xb4\x11\x55\x38\x95\xc2\xef\x4b\xa8\xed\xec\x45\xe1\x29\x54\xe1\ \x0e\x76\xaf\x68\x46\xc1\x31\x14\xd6\x1d\x81\xdc\x07\x67\x0a\xf7\ \xa2\x0a\x97\xb0\x2b\xd6\x00\x0a\x0e\xa5\xf0\xc9\x3d\xc8\x3d\xb6\ \xa5\x70\x3d\xaa\x70\x26\xbb\x6d\x4e\xa2\x60\x3f\x0a\x2f\x1b\x40\ \xee\x3c\x7b\xa4\xd7\xa1\x0a\xa7\x50\x58\xbf\x06\x72\x0d\x1e\x14\ \x1e\x45\x15\x6e\x62\xf3\x8a\x06\x14\x1c\x4d\x61\xed\x19\xc8\xbd\ \x73\xa2\x70\x0b\xaa\x70\x11\x9b\x09\x75\xa3\xe0\x10\x0a\xef\xa0\ \xb6\xf3\xb6\x0d\x85\xab\x51\x85\x33\xd8\x78\x6c\x1a\x05\xfb\x52\ \x78\xd6\x08\x7b\xd9\xd1\x54\xa1\x0a\x27\x31\x78\x01\xe4\xbe\xb9\ \x33\xf8\x1c\x04\xd7\xf2\xd9\x66\x0e\xe8\xfc\x09\xe6\xb0\x4d\x62\ \x71\xf9\xff\x53\x10\xa2\xfe\xf7\x51\x63\x89\xf9\x00\xb8\x21\xaa\ \xc0\x48\x5f\x81\x14\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x02\x2c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\xdb\x50\x4c\x54\x45\x00\x00\x00\xdb\xb6\x24\xdf\xbf\ \x20\xe3\xc6\x1c\xef\xbf\x10\xf0\xb4\x0f\xf1\xb8\x1c\xeb\xba\x14\ \xec\xbd\x13\xed\xb6\x12\xee\xbb\x1a\xec\xbb\x16\xec\xb9\x15\xea\ \xba\x15\xea\xbb\x15\xea\xb9\x15\xea\xb9\x17\xec\xba\x16\xec\xbb\ \x15\xea\xba\x17\xea\xbb\x17\xeb\xba\x16\xea\xba\x16\xea\xba\x16\ \xeb\xbb\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x17\xeb\ \xbb\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x17\xeb\xbb\x16\xeb\xba\ \x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\ \xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\xba\x16\xeb\ \xba\x17\xeb\xbb\x1a\xec\xbc\x1c\xec\xbc\x1e\xec\xbf\x26\xed\xc0\ \x2a\xed\xc1\x2d\xf1\xd0\x5f\xf2\xd1\x64\xf2\xd2\x65\xf3\xd5\x70\ \xf8\xe8\xb0\xfa\xec\xc0\xfa\xec\xc1\xfa\xee\xc5\xfa\xef\xca\xfd\ \xf8\xe8\xfd\xf8\xe9\xfd\xf9\xeb\xfd\xf9\xec\xfe\xfa\xef\xfe\xfb\ \xf0\xfe\xfb\xf1\xfe\xfb\xf2\xff\xfe\xfc\xff\xfe\xfd\xff\xff\xfe\ \xff\xff\xff\x4a\x4a\x72\xf9\x00\x00\x00\x2c\x74\x52\x4e\x53\x00\ \x07\x08\x09\x10\x11\x12\x1a\x1b\x1c\x1e\x5e\x5f\x60\x61\x62\x63\ \x76\x78\x7a\x7b\x7d\xad\xae\xaf\xb0\xc9\xca\xcb\xcd\xce\xcf\xd7\ \xd8\xd9\xdb\xe2\xe3\xe4\xef\xf0\xf1\xf3\xf4\x24\xb9\xb6\xe8\x00\ \x00\x00\xd4\x49\x44\x41\x54\x18\xd3\x6d\x91\xc7\x02\x82\x30\x10\ \x44\x57\x14\xc1\x86\x82\x0d\x3b\x58\x11\xb1\xf7\xde\x50\xf3\xff\ \x5f\x24\x26\x04\xa2\x32\xa7\x9d\x77\xd8\xd9\x02\x80\x15\x4d\x97\ \xf4\xc1\x40\x57\x25\x1e\x7c\x85\x73\x7d\xcb\x95\x91\x0d\x53\x2a\ \x54\x2c\x46\x8d\x38\xa1\xb1\xae\xf5\xa5\x8e\x88\x3b\xd4\xac\x1f\ \x55\x39\x07\xe7\x71\x39\xb6\xd7\x3e\x57\x9c\x19\x48\xda\xe4\x7c\ \x3f\xcc\xbd\x5c\x1e\x32\xa4\x9a\x9c\xd0\xeb\xb8\xa2\x3c\x05\x25\ \x0f\x23\x74\xdd\x4d\x89\x2b\x42\x8b\xc1\xe8\x71\x5a\x60\xa7\x83\ \xc9\x62\x84\x6e\x9b\xa1\xe3\xcc\x60\xdc\x87\x66\x50\x13\x0d\x54\ \x36\x72\xeb\x46\x16\x40\xf2\xf0\xf3\xb8\xa4\x03\x26\x20\x6a\x10\ \x7c\xb1\xf7\x33\x4a\x7b\x11\x80\xec\xff\xf2\xb2\x73\x13\xae\x8a\ \xcb\x91\x4f\xcb\x9f\x53\x81\xd8\xf9\x3e\x60\x5b\x70\xdf\x50\x66\ \x69\x3d\x4e\xdf\xc3\x29\x86\x97\x26\x87\x98\x6f\xf2\x29\x55\x33\ \x4d\xad\x98\x8c\x10\xff\x06\xa8\x65\x46\x58\x9d\x73\x05\x79\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x13\xaf\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x13\x76\x49\x44\x41\x54\x78\xda\xed\x5d\x0b\x78\x54\xd5\ \x9d\x4f\xb5\xa5\xab\xb5\xcb\x2e\x2e\xad\x7d\xe9\x6e\xd7\xc5\xdd\ \xee\xb6\x5a\xed\x6e\x17\xad\xbb\x54\x6d\x15\x2b\xac\xc0\xcc\x24\ \x81\x05\xb5\x2a\x2b\x85\xd5\xad\xd6\x47\x4b\x8b\x51\x93\x09\xc4\ \x14\xf8\x42\x32\x33\x51\x88\xf1\xc1\xc3\x40\x40\x12\x08\x20\x6a\ \x78\x43\x66\x26\x21\xc9\x24\x93\x27\xe1\x91\x84\x10\x12\x40\x20\ \xc1\x84\x84\xdc\xfd\x9f\x99\x73\x67\xfe\xf7\xe4\x9e\xc7\x24\x99\ \x98\x74\xf7\x7e\xdf\xf9\x26\xdf\xcc\xff\x9e\x7b\xce\xef\xfc\xcf\ \xff\x7d\x6e\x62\x62\x46\xd0\xa5\x4d\x9f\x7e\x93\x66\xb5\x4e\xd3\ \x2c\x96\x17\xe0\x73\x25\xb4\x3d\xd0\xaa\xa1\x9d\x80\x76\x16\xda\ \x15\x68\x97\xe9\xdf\x27\xa1\x95\x42\xcb\x87\xe6\x80\xb6\x00\xee\ \xbb\x1b\x3e\xc7\xc6\xfc\xff\x45\x01\x8d\x8f\xff\x2b\x00\x65\x0e\ \x80\xf2\x16\xb4\xa3\xd0\xb4\x21\x68\x64\x11\x8a\x35\x9b\x6d\x09\ \xf4\x7d\x2f\xfc\x7d\xf5\xff\x2d\x50\x1f\x7d\xf4\xcf\x60\xe2\x56\ \x98\x78\x1e\xe5\x46\x2d\xca\xed\x34\x80\x9d\x01\x9f\x13\xff\xd4\ \xb9\xf5\xeb\x30\x51\x3b\x4c\xf4\x9c\x00\x0c\xf2\xdb\x56\xa0\x4b\ \x85\xcf\xb9\xb0\x10\x93\xb4\xd8\xd8\xbf\x0d\xdc\x3b\x75\xea\x57\ \x43\x7d\xcd\x9a\xf5\xe7\xf0\xfb\x78\x6d\xc6\x8c\x1f\x00\xcd\x43\ \xd0\xfe\x1b\xda\x1b\xf0\x9d\x07\x5a\xb7\xa0\x7f\x0f\xdd\x31\x63\ \xfe\x74\x80\x9d\x31\xe3\xbb\x54\x46\x7e\xc6\xd9\xce\xbb\x60\xd2\ \xcf\xc1\xe7\x1d\x43\xb1\x9d\xb5\x29\x53\xae\x85\x7e\x1e\xa0\x8b\ \xc4\x13\x3b\x47\xe1\x99\x8f\x69\x93\x26\x7d\x71\xf4\x02\x0b\xca\ \x06\x26\xb1\x94\x23\x06\xaa\xe0\xb7\xdf\xc2\xe7\x8d\x51\x1d\x43\ \x4c\xcc\x17\x88\x68\x80\x67\x39\xe1\xf3\xa2\xc9\x38\xfc\xd0\xee\ \x19\x5d\xc0\x26\x24\x5c\x05\xdc\xf3\x4b\x18\xf8\x29\x93\x09\xed\ \x0d\x6c\x69\x98\xf8\xb0\x8f\xeb\xe1\x87\xff\x82\xee\x94\x16\x93\ \x71\xad\x26\x22\x67\xb4\x70\x6e\xbe\xc9\x04\x3e\x84\xf6\x93\x11\ \x31\x3e\x22\x42\x82\x66\xe0\x59\x66\x8c\x2d\xf0\xfd\xcf\x47\x3a\ \xb8\xd7\x50\xb9\xaa\x0f\xfa\x08\x70\xf3\xc3\x23\x72\xac\xd3\xa6\ \x7d\x0d\x00\xcd\x86\x31\xf6\xa1\xf1\xf6\xc1\x77\x8b\x47\xb4\x69\ \x07\x80\xfe\x8e\xca\xb6\x85\xc4\x24\x1b\x80\x52\xfc\x7b\x98\xe4\ \x13\xd0\x8f\x0b\xfa\xd8\x01\xad\x06\x5a\x17\xc3\x6d\x97\xa9\xa3\ \xe1\x06\xba\x37\xa1\xcd\x27\xf7\x0d\x68\xbc\x41\x5b\xb9\x89\xe9\ \x3f\x1f\x5b\x2d\xa3\xdb\xca\x00\x6e\x01\x80\xee\xa3\xdc\xd4\x3a\ \x48\x9b\xf7\x38\xf4\xf3\x3a\x31\xdf\x22\xe4\xe6\xeb\xe1\xde\x4d\ \x4c\x5f\x65\xc4\x3c\xfc\xfc\x80\x09\x6a\xe8\x31\x83\xda\xa2\x56\ \x6b\x22\xb4\xe6\x08\x00\xec\xa1\xb2\xb3\x4f\x81\x76\x3f\x34\x8b\ \xea\x76\x0f\xcc\xc7\x66\x7b\x91\x11\x71\x35\xe0\xbe\x7f\xfb\xf3\ \xb2\x6d\x8f\x40\xeb\x20\x5b\x2c\xc2\x78\xc3\x37\xe0\x9e\x74\xb8\ \xf7\x12\x07\x18\x62\x7d\xe4\xc2\x64\x7f\x0d\x74\x93\xc1\xd1\xf8\ \x07\x22\xdb\xfb\x71\xbd\xd5\x7a\x03\xb4\x7f\x07\xba\xa7\xe1\x73\ \x83\xc0\x81\xa9\x8c\x44\x0f\xc0\x33\xe3\x18\x67\xa5\x9e\x3c\x6b\ \x78\x95\x83\xd5\x5a\x87\x06\xb0\x42\xe9\xbe\xb9\x73\xbf\x04\xb4\ \xcf\x42\x3b\x6f\x02\x42\x23\xb4\x14\x68\xb7\x0d\x4a\xd4\x10\x07\ \x23\x68\x72\x75\x99\x3c\x63\x97\xaa\x9c\x86\x05\x79\x90\x71\x8c\ \xca\x89\x99\x17\x7d\x70\x41\xf0\x07\x02\x29\xe1\x07\x5f\x04\x0e\ \xbb\x55\x7a\x5f\x90\x0b\x4b\xb9\x76\x31\xd8\xce\x43\x2c\xd7\x6f\ \xa0\xe2\x87\x5d\xcc\xae\x80\xf2\x55\x10\x1b\x74\xb1\xb0\x93\xb4\ \x23\xaa\xd6\x05\x71\x2b\xe1\x01\x1f\xa1\x07\x7e\xa6\xe2\x05\x01\ \x37\x3c\x09\x74\x9d\xcc\x44\x0f\x93\xed\x3d\x2c\xd1\x3a\x9b\x2d\ \x8d\xca\x6e\x23\x37\x2b\xc8\x56\xb8\x37\xde\x20\x93\x2d\x96\xa4\ \x68\x6a\xfb\x14\x26\x86\x30\x55\xc1\xa3\x5b\xc6\x4c\xec\x62\xc0\ \xa4\x1a\x66\x3b\x93\x88\x9e\x80\x49\xc7\xca\x7a\x8b\xe5\x4e\x85\ \x7b\x17\x32\x76\xf2\x43\xd1\x18\xe0\x2f\x0c\x9a\x1b\x6c\x5d\x09\ \xfd\x18\xaa\x78\xf0\x84\xbc\x20\x2a\x26\x0c\x2a\xcc\x69\xb5\x8e\ \x83\x76\xdd\x20\x76\xe0\x2b\xd0\x7a\x19\x91\x31\x53\xc1\x5a\xda\ \x88\xee\x69\x23\x7a\x68\x68\x7d\x78\xa3\x29\x95\x2b\x8a\x25\xd0\ \x89\xe4\x1a\xc0\xb5\x58\xde\x8d\xd4\xa4\x83\x7b\xfe\x03\x16\x32\ \x07\xee\xf3\x99\x84\x20\xbb\xa9\xa3\xb1\x9f\x46\xcd\xa6\x11\x71\ \x10\x81\x63\x71\xce\xb0\x1b\x2d\x96\xff\x52\xc0\xe0\x18\x9a\xcf\ \x9a\xa1\x03\x38\x18\x67\xd5\x07\x43\x26\x35\x4e\xb8\xda\x41\x30\ \x35\xc4\xed\xf6\x48\x83\x3b\x81\xf8\xaf\x91\xd3\x54\xda\xe5\x00\ \xa7\x11\xa5\x29\x11\x41\xb0\x93\xfe\x89\xa6\xa1\xc2\x5b\xdf\x6a\ \x9d\x27\x91\xc7\xf7\x19\x76\x31\x98\x90\x83\x07\x37\x36\xf6\x76\ \x83\x90\x07\xf3\x45\xc1\x4d\xc6\x9c\xfb\xea\x20\xac\x95\x76\x06\ \xc0\xf3\x74\x27\x9d\x53\x00\xbb\x0e\x9e\x3d\x5d\x6a\x8f\x5b\xad\ \x25\x0c\x27\xc7\x45\xc0\x6c\x95\x83\x8e\x27\x07\xb4\x2d\x12\x0d\ \x12\x70\xef\x67\xb8\x6e\xb9\x82\x6c\xbb\x07\xda\xf7\x38\xcf\xbe\ \x91\x80\x04\xb6\xeb\x0f\xd9\x98\x46\xc0\xe6\x0d\xda\xe3\x0f\x50\ \xb9\xba\x9b\xf1\xc0\xf4\xb6\x9b\xd7\x7f\x28\x66\x6d\xb5\x16\x19\ \x44\x8f\x40\xf1\x51\x97\xfa\x2c\x62\xb8\xa7\x06\x23\x1a\xee\x35\ \x3c\x78\xc6\x8c\xbf\x13\x0c\x74\x1c\x13\x67\x15\xda\x8c\x54\xa6\ \x6d\x42\xf2\xf4\x7b\x43\xa0\x88\xff\x86\xec\x98\x40\x0e\xae\xbf\ \xe5\x12\x2f\x34\xe5\x82\xc1\xa9\x70\xd8\xd2\x6a\xfd\x96\x00\x97\ \xe7\x18\x07\x69\xcc\x40\x07\xfc\x11\x5a\xa9\x34\xc9\x62\x60\xb9\ \x7b\x4c\x28\xa7\xe3\xe2\xbe\xc3\x4c\x88\xf4\xff\xd3\x21\xb4\x78\ \xc6\x06\x32\xca\xfd\xbd\xb9\xe5\x3c\x87\x26\xb0\x38\xc4\x3a\x08\ \xd3\x7e\xc2\xa5\x9d\x3c\xf9\xcb\x14\x58\x5d\x0c\x3e\x36\x50\xbb\ \x11\x2b\x8f\x1b\x05\xb4\xf7\x30\xca\xe2\x67\x12\x37\xbb\x81\x99\ \x78\x4a\x94\x6c\xdf\x5b\xa8\x05\x82\x9f\xe5\xe0\x29\x5c\xb2\xc8\ \x06\x87\x04\x38\x55\xd0\xf7\xb3\x58\x16\x0f\x44\x3c\xa4\x23\xee\ \x7a\x5b\x22\x47\xb1\x01\xbf\x52\x62\xc7\x1e\x30\x44\xc6\x2c\x96\ \x5f\x45\xd5\xc1\x98\x3d\xfb\x2b\x34\x36\x81\x15\xef\x52\xc1\xbc\ \x5f\x45\xb4\x97\x60\xb7\xfd\x35\x07\xe0\xeb\x98\x8c\xc8\xc4\x48\ \x56\xfe\x1a\x83\xa6\xb6\xd9\xee\x12\xd0\x5a\x0c\xb2\x4e\x10\x3f\ \x25\xb6\xa3\x61\x57\x0c\x53\x7a\x86\x86\x21\x5d\x0c\x27\x3f\x2a\ \x08\x48\x15\xab\x28\x76\x9a\x29\xd7\x17\xcd\x19\x49\x46\xe2\x61\ \x83\xb9\x23\x72\x2a\xac\xd6\x43\x88\xf6\x15\x41\x9f\x36\x46\xe6\ \x3e\x15\x33\x8c\x57\xc0\x6d\x37\xea\x09\x92\x61\xbe\x99\x13\x8a\ \xfd\x31\x63\x91\x4c\xe4\xcc\xe9\x2e\x44\xd3\xaa\x1c\xb0\xa2\x35\ \x61\x72\xd0\x82\x03\xd1\xe9\x3a\xb4\x99\x33\xff\x52\xb0\x9d\x1a\ \x55\x15\xa6\xc9\xfd\x37\x07\xe2\x17\x44\x71\x81\xb8\xa2\xe3\x4b\ \x8c\xc4\x7b\x43\xca\xa9\x0c\x8d\xf9\x10\x57\x91\x05\x9f\xa3\xd3\ \x15\x08\xc4\x63\xd8\xc3\x8d\x8d\xfd\x67\xd5\x2c\x45\xd8\xdc\x02\ \x10\x05\x5b\x7e\x95\xca\x16\xa1\x1a\x5d\x1f\xec\x09\x22\x17\x95\ \x38\xce\x6a\x9d\x6d\xa2\xa4\x34\x13\x97\x79\x83\x6a\x1c\x99\x98\ \x83\x86\x40\x3f\xec\x2c\xee\xa2\x62\x85\x07\x9e\x1f\x67\x6e\x59\ \xa8\xaf\x3f\xa8\x0e\x20\x5c\xd3\xc5\x5b\xe1\xa0\xac\xc2\x9e\xd6\ \x6d\x02\x8f\xec\x02\xa2\xb3\x28\xc6\x8e\xcb\x06\x50\xf0\xb7\x82\ \x70\xa9\xc2\x1c\x17\x31\x85\x27\x57\x73\xc0\x5b\x8b\xc0\x5b\xa6\ \x20\xfa\xb6\xa9\x58\x0f\x4f\xa0\x1b\x36\x08\xe8\x7e\x8e\xe8\x6a\ \x05\x93\x99\x87\xe8\xdc\x0a\xf2\x9f\x78\x83\x9f\x9a\xb8\xc8\xeb\ \x68\x0a\x69\x16\x7c\x3e\x02\x2d\x81\x7a\x69\x6c\x6e\xee\x90\x2c\ \xf3\x40\xeb\xda\xda\x11\x78\xf1\x9c\x39\x4e\x32\x30\x9b\xc9\x42\ \x10\x87\xc4\x50\x57\x27\x8b\xb9\x18\xe4\xaf\xcd\xf6\xa2\x52\x6c\ \xd8\x62\x59\x2c\xa0\xc3\xbe\xfe\xe3\x92\x67\xdf\xc1\xe4\xe9\x3e\ \x0d\x24\x21\xa7\x4c\xb9\x56\xc0\xed\x13\x98\x50\xa2\x46\x15\xef\ \x35\x92\x67\xbd\x84\xbd\x4e\x81\xb8\x3c\x26\x13\x97\x8c\x1c\x9e\ \x20\x03\xf8\x20\x7a\xf0\x3d\x02\xba\x03\x68\x21\xee\x17\x18\xfa\ \x61\x2e\x14\xc8\x5e\xea\x3a\x37\x1a\xac\x97\x08\xea\x1c\x48\xb8\ \xd1\x10\x07\x01\x3b\x5e\x48\x1f\x74\x78\x74\x19\xdb\xcb\x4b\x6a\ \xc2\xf7\x99\x32\x19\x0b\xbf\x6d\x46\xe3\x9e\x2d\x03\xf8\x4c\x88\ \x78\xfa\xf4\x6f\x08\x82\xe9\x5d\x68\x70\x63\x05\xa9\x22\xfd\xc1\ \xeb\x24\xcf\x4d\x36\x6c\x47\x8e\x81\xaf\x90\x9a\x0a\x7b\x94\x12\ \xad\x0e\x34\x3b\x11\x78\x4f\x73\xfa\x9c\x81\xfa\xdc\xc7\x59\xdc\ \xdf\x2b\x2d\x2c\x0d\xd8\xe8\x9d\x75\x72\x5d\x4a\x23\x67\xd6\x2a\ \xc5\x27\x04\x1e\x1b\x7d\x6e\x27\xa2\x9d\x3e\x88\x00\xd5\xfb\x68\ \x6c\x5b\x24\x00\x3f\x8e\x68\x0b\x05\x3b\xab\x27\xe4\x79\x9a\x88\ \x2b\xaa\x37\xf4\x7e\x8a\x44\xda\xfb\x56\x44\xe8\x13\x70\xca\x83\ \x2a\x9a\xd3\x10\x73\x10\x54\xda\xd0\x4a\xcc\x90\x22\x1c\x4c\xe5\ \x25\x0d\xda\x84\xb7\x7e\x5c\xdc\x37\x05\xb4\xe3\x91\x92\xec\xe4\ \x45\xc5\x68\x82\x96\x2b\x87\x69\x08\x53\x1f\xff\x05\xee\xf8\x99\ \xa0\xcd\xc7\x8a\x96\x81\x43\xa0\x20\x2e\x23\x31\x72\xb5\xa0\x3f\ \x2c\xc3\x16\x0c\x41\x90\x67\x2b\xea\xef\x59\x09\x6d\x0d\x52\x50\ \xff\xca\xd9\x15\xd9\xa8\xbf\xb9\x9c\x7e\x4e\xc9\x44\x6b\x0c\x3d\ \x37\xa1\x77\xb4\x5e\x51\x03\x27\x0a\x62\xac\xa1\xf8\xaa\x64\x92\ \xb5\x88\xf6\x16\x89\x8d\x3c\x41\x6a\x86\xd9\x6c\xff\xa9\xb4\x65\ \x59\x47\xc1\x6a\x7d\x5e\x1a\x39\xb3\xd9\x32\x38\x34\x7b\x90\x88\ \x9b\xa4\x62\x03\xaf\x14\x00\x92\x28\x33\xe5\x60\x2b\xfd\x23\xea\ \xab\x54\xe2\xb1\x75\x87\x9c\x05\x81\xa3\x40\xd3\xfd\xba\x4d\x3a\ \x5e\x30\xbe\xeb\xb0\x12\xbe\x30\x67\xfe\xf5\x8b\x33\xbd\xdf\x4f\ \x76\x78\xad\x49\x0e\xcf\xf3\x76\xa7\x3b\x39\xc9\xe5\x59\x6c\x77\ \xb9\x5f\xdb\x98\xf0\xee\xfb\xb5\xf3\x5e\xd2\xce\xcd\x79\x82\x1b\ \xd8\x61\x12\x0f\x7b\xa5\xe6\x2d\x2f\x81\x1a\x38\x74\x12\x06\xce\ \x25\x50\x24\x8b\x65\x31\x53\xf8\xed\x5f\x64\x83\x42\xa2\x44\x0f\ \xac\xf4\x48\x38\x7d\x35\x1a\xdf\x23\x22\xda\x1e\x5b\xfc\xde\xea\ \xf9\x0b\xb5\xdc\x57\x57\x6b\x4b\x32\x0e\x5d\xb4\x3b\x3d\x9a\xac\ \xa5\x2d\x2f\xbc\x0c\xc0\x67\xda\x1d\xc5\x77\x6b\x9a\xf6\x05\xf4\ \xdc\x1b\x70\xd2\x97\xb3\xf8\x2f\x4a\xc3\xa1\x06\x80\x45\xb1\x05\ \xa3\xab\xb9\x48\xc1\xe5\x2e\x91\x00\x17\x2e\x6f\x12\x39\x15\xb0\ \x85\xd1\xf8\xde\x30\xa3\x79\xfd\x9d\xb2\xaf\x10\x2e\x4d\x4d\x3f\ \xa0\x04\x2a\xb7\xb9\x3c\x15\x49\x0e\xef\xcc\x84\x04\xed\x2a\xca\ \x04\x97\x42\xe6\x9f\xc9\x2e\x0b\x04\x9e\xc2\xf3\xdd\x2a\xb7\x23\ \x45\x1c\x6c\x8c\xe6\xa7\x08\xd2\x42\x21\xa7\x41\x02\xb0\x4f\xa6\ \x68\x28\xdd\x4f\x50\x9f\x15\xec\xef\xb0\xe5\xa7\x03\x38\x27\x06\ \x05\x6c\xff\x56\x94\x94\xe9\xbd\x9d\x29\x76\xbc\x59\x22\x12\x2b\ \x79\x5b\x7f\x0e\x2e\x14\x51\x52\x22\x9c\x02\x0c\x6a\x3f\xea\x0f\ \x6c\x97\x28\x1a\x17\x5a\xd8\xdf\x48\x12\x01\x3d\x21\x79\x4d\xb9\ \x3d\x21\xd3\x7b\x2d\x70\x5c\x16\x0f\xa4\xa5\xab\xbc\x5a\xd6\xe6\ \x9a\xf6\xdc\xbd\x8d\xc7\xb7\x97\xb6\xd5\x14\x56\x9e\xf5\xef\xa9\ \x39\x57\x41\x3e\xb7\x15\xb7\xd6\xe5\x15\xf8\xbb\xde\x5a\x7b\x58\ \x7b\xfd\x0d\x2f\x0f\xe4\xcb\x85\x2f\xa5\xd7\xc1\xd8\xb8\x1e\x2e\ \xcd\x9c\x84\x62\xcd\xbc\x89\x4e\x41\x44\x79\x82\x89\x4e\x54\xd1\ \xd2\x86\x80\x0a\xcf\x74\x09\xd2\xcd\x56\x09\x30\x51\xda\x2a\x64\ \x93\xfe\xc8\x9e\x56\x32\x1e\x00\xf0\x98\x01\x93\xb5\xb6\xf4\xca\ \xde\x4f\x2a\xb4\x6a\x77\xb5\x56\xd6\x78\xb1\xa2\xb4\xb5\xdb\x6b\ \xd6\xfc\x95\x8d\xed\x35\x9e\x6a\xcd\x5f\x54\xa5\x15\xec\x69\x68\ \x4b\x7b\xaf\xbc\xd3\xac\xbf\xbc\x97\xb3\xb5\x2b\xb6\x58\xae\xfc\ \x37\x64\x81\xcc\x2c\x1d\x26\x42\xbf\x5b\x62\xa0\x87\x23\x48\xfc\ \x4c\xed\x4e\x44\xf7\x0b\x49\xc0\x26\x14\x2f\x96\x70\x7b\x8e\x4e\ \x7b\xea\xd1\x05\xcf\xc0\xc4\xab\xfa\x29\xab\x35\xbe\x0e\xc2\x9d\ \x7e\xdf\xf1\x73\x04\x38\xd2\x7c\x0d\x67\x8e\xf0\x00\xae\xac\x3a\ \xd9\xa2\xd3\x55\xd6\x9c\x6a\x22\xdf\x6d\x29\x6a\x39\x92\x9a\x55\ \xda\xcd\xf6\xbd\xfe\xd5\x35\x1a\x28\xd0\x17\x38\xf3\x2d\x47\xf3\ \xf8\x3e\x2f\x0e\x2b\x75\x81\x69\x67\x27\x14\x82\xd1\x4b\x64\xca\ \x10\x59\x12\x17\x42\x4a\x44\x14\x14\xa2\x0a\xb6\x3b\x6e\x96\x96\ \xbe\xec\xa3\x53\x2c\x00\x6f\x6f\xad\x3b\x5d\x7c\xb2\xab\x38\x00\ \x5c\x75\xcb\x49\x16\x38\xb3\x56\x51\xdb\xda\x18\xa2\xf3\x37\x9f\ \xd2\xbf\x3f\x74\xa2\xa3\xd4\xf1\x7e\xe5\x05\xf6\x19\xef\x26\x6f\ \x2c\x93\x3a\x38\x66\x15\x50\x34\x4e\x1a\xae\xfd\x15\xe5\xe2\x70\ \x02\x93\x93\x5f\x63\x82\xd1\x05\x92\x05\xc3\x01\x76\x51\x25\x4e\ \x2c\xa1\x21\xdb\x15\x4f\x3a\x39\xd3\xdb\x97\xbb\xb7\xe9\xb8\x01\ \xb8\xfa\xb6\x63\x3a\x70\x20\x06\xda\xb8\x00\xd7\x9f\x3e\x1a\xa2\ \xab\x38\x71\x06\xff\x46\x16\x2b\x7b\x4b\xfd\x69\x16\xe4\x64\x97\ \xf7\x29\x89\x2e\xf9\x25\x6f\x02\xb8\xf8\x62\xbc\x00\xe0\x5f\xc9\ \x22\x65\xa4\xc0\x99\x09\x9a\x8b\xdc\xe5\x3c\x95\xfa\x37\x22\x77\ \x2b\x17\x2c\xea\x27\x1f\x37\xee\x6b\x3a\xc6\x02\x57\x7e\xec\xd3\ \x6a\x1d\xb8\xaa\xb2\x86\x8b\x3c\x80\x7d\x0d\x67\xeb\x42\x74\xe5\ \x47\xcf\x9b\xd1\xac\xce\xaf\xf9\x94\x79\xe6\x67\xf6\xf4\xa2\x09\ \x0c\x26\x93\x69\x58\xa0\x83\xb7\xab\xd9\x2c\xf1\x44\x49\x5a\x47\ \x9e\x5a\xc2\x01\x6b\x33\xb9\x14\xa6\x5b\x21\xf5\x84\xe0\xda\xff\ \x5c\xea\x4d\xe0\x10\x18\xc0\x7d\xa7\xa0\xbe\xd5\x0c\x94\xb2\xe6\ \xce\x32\x1d\xb8\xea\x92\xba\x6e\x1e\xc0\xe5\xc7\xcf\x57\x85\x00\ \x2e\x6d\xe8\x34\xa5\x39\x7a\xae\x26\x6b\xcd\x61\x76\x61\x3f\x34\ \x35\x4f\x45\xb5\xc3\xc0\x3d\xef\x21\x4e\x7a\x52\xb2\xad\x9b\x90\ \x1c\xbe\x95\x43\x93\xab\x12\x8c\x06\x50\x5f\x56\x29\xee\x06\x5b\ \x77\x11\x9e\x64\xc6\x5a\x5f\xa7\x2e\x73\xfb\xb5\x96\xae\x62\x1d\ \xb8\x1a\x6f\xcd\x15\x1e\xc0\xc4\xc2\x08\x2f\x44\xfd\x67\x9c\x45\ \xf0\x97\x1f\xa8\xd2\x52\xdf\x34\x9a\x72\xc9\x0e\xcf\x7d\x91\x06\ \xad\x7f\xa7\x5c\x1d\x89\x93\x82\x16\xcb\x13\x52\xaf\xcf\x66\x4b\ \x15\x2c\xd6\x02\x19\x1d\xf1\xd2\x60\x52\xed\xa1\xc9\x39\xbd\xda\ \x9e\xf2\xd6\x06\x1e\x70\xa4\x55\x17\xd7\xf6\xe8\xe0\x95\x9e\xbc\ \x74\xd8\x14\xe0\xa6\x8e\x72\x19\xa7\xeb\x8b\xb0\x7d\x5b\x39\xeb\ \xf1\x7d\x12\x29\xc0\xf7\xcb\x82\xd0\x88\xeb\x9e\x93\xb9\xd6\x81\ \x2a\xf5\x70\x7f\x3b\x05\x00\xcf\x44\x00\x67\x99\x72\xaf\xd3\x33\ \xdb\x20\x1a\xd6\x95\x6a\xbe\x23\xed\xf5\x42\x80\x81\x23\x75\xf0\ \xb8\xb6\x70\x73\x67\x69\x08\xe0\xe2\xda\xcb\xa2\x45\xa8\xf6\x54\ \x69\x69\x6f\x15\xf7\x19\x40\x66\x64\xb1\x2c\x96\x3a\x0e\x05\xa1\ \x3b\x44\x05\xc6\x4c\x94\xa9\x90\xa3\xe8\x6e\x52\xf1\xe8\x98\x85\ \xdd\x6c\x46\x93\xec\xf4\x14\xe0\x89\x1d\xd8\x55\xa9\x55\xd4\xb5\ \x1e\x17\x01\x0c\x4a\xeb\x82\x0e\x1e\x51\x7a\xa6\x74\xc0\xd9\x61\ \x51\x52\xdb\x2b\x5b\x84\xfc\xad\xbe\x5e\x83\x98\x70\x7a\xff\x10\ \x19\x17\x1b\xab\x1f\x6f\x13\xd0\xe1\xd4\x51\xb5\xc0\xc6\x0d\x17\ \xc9\x71\x32\x0c\x24\x7f\x26\x8a\xbe\xa5\xa5\xd5\x7d\x19\x26\x13\ \xf2\xb0\xd2\xb2\x8a\x83\x76\x2b\xd8\xba\x22\x80\xc1\xd9\x38\x2b\ \x75\x36\x8c\xb2\xba\x4f\xb6\x08\x65\x87\x6a\x7a\x8c\xca\xce\xbd\ \x27\x52\x80\xd7\x29\xe6\xd2\xc6\xe2\x14\xbb\x80\x6e\x0f\xda\xfe\ \xf7\x71\xcc\xaf\xef\x8a\x82\x25\x76\x57\xd1\x44\x3c\xa9\x75\x1b\ \xca\xa4\xf6\x6d\xd0\x4b\x6b\x6e\xd5\x81\x11\x71\x3b\x01\x36\x24\ \xab\x5b\x4c\x94\x26\xa3\x30\x19\x77\xba\x9b\x30\x40\x24\x00\xcf\ \x55\xc9\x6c\x50\xda\xf0\x71\x53\xce\xab\x0b\x98\xac\xc1\x5c\x85\ \xe0\x50\x4b\x7f\x80\x3d\x8f\x63\x80\x77\x6e\xf7\x05\x01\x06\x77\ \x58\x08\x70\x75\x4b\x73\xc8\x4b\x13\x70\x3b\x01\x2d\x12\x80\xfb\ \x39\x1f\xae\x43\xea\x15\xfa\x24\x65\xce\xbc\x05\x4a\xe4\x20\x84\ \x73\x51\xd3\xa6\x5d\xaf\x90\xd6\x5e\x2c\x10\x25\x7a\xa4\xac\xdb\ \x44\xc1\x25\xe1\x09\x1d\x04\xf9\x4b\xed\xd6\x0e\x11\xc0\x84\x6b\ \x43\x00\x03\x37\x0f\x18\x60\x42\x83\xc4\xc8\x86\xdd\x8d\x86\xb0\ \x68\xa2\xcb\x3d\x25\x52\x31\x51\xaf\x18\xa3\x3d\x8a\xe4\xeb\x77\ \xa4\x16\x82\x38\xd7\x17\x3e\x5b\xc1\xbc\x0c\x03\x38\x38\x1d\x4f\ \xa8\x64\xbf\x3f\xa8\xf5\x0f\xd7\x77\x09\x01\xc6\x6e\xb0\x40\x9c\ \x30\x00\x97\x08\x01\x86\xb6\xf9\x60\x4b\x83\x51\xd1\xb9\x67\x45\ \x6a\xae\xe1\x82\xe5\x67\x04\xa0\x54\xca\x12\x96\x64\x81\xf0\x7b\ \xcb\x94\x16\x8b\x39\x84\x62\x77\x78\x56\xe2\x09\x95\x81\xd1\x4f\ \xcd\xaa\x1e\x11\xc0\x44\xb1\xf1\xe2\x0c\x11\x03\x8c\xe4\x74\x81\ \xe7\x54\x3d\xa3\xe8\x9e\x8c\x0c\xe0\xa0\x56\xef\xa4\x85\xca\x22\ \x4b\xc2\x83\x38\xfd\x76\x85\x98\x44\xb3\xa0\x2f\x3f\x2f\x6b\x00\ \x93\x58\x61\xe0\xe0\x7d\x7e\xb1\xd6\x37\x89\x33\x88\xe4\x35\x31\ \xcf\x22\x01\x78\xf3\xc1\xe6\xa3\x83\xe2\x60\x64\x25\x8c\x95\xd0\ \xec\x95\xd6\x15\x04\x8f\xd6\xf6\xca\x6a\x24\x02\x67\x99\x39\x85\ \x2a\x24\x03\x6c\xb4\x81\xfd\x7d\x32\x99\xa9\xc7\x10\x64\x81\x9c\ \x81\x00\xbc\x7e\xd7\x89\x46\xc6\xa3\x7b\x30\x26\x1a\x17\x2d\x21\ \xd5\x15\xd8\x9d\x02\xba\x16\xa9\x2d\x8c\xcd\x39\xa6\x82\xc6\xee\ \xf0\x3e\x82\x27\xb4\x7d\x5b\x45\x78\x4b\x83\x13\xa0\x14\xc8\x11\ \x44\xd4\x94\x00\x46\x4a\x2e\x2b\xbf\xae\x0d\x8f\xe7\x35\x87\xe7\ \x96\x68\x01\x5c\xa8\x78\x58\x06\x1f\x2c\xb9\x83\x43\xb3\x83\x57\ \xbc\x91\xe8\x2a\xfa\x11\x9e\xd0\x9a\x0d\x65\xbd\xc8\x05\xf6\x71\ \x01\x3e\x71\xa1\x52\x16\x29\x1b\x88\x99\xb6\xfc\xdd\xf2\x4b\x68\ \x3c\x9d\x99\x99\xde\x2f\x45\x0b\xe0\x4f\x10\x28\x77\x2b\x95\x33\ \x71\x0e\x51\x1b\xde\xfa\xc4\xc4\x84\x13\x12\x0a\xbf\x08\x13\x39\ \xaf\x4f\x6a\xd9\xaa\xe2\x3e\x92\x6b\x0b\xb8\xc0\xc7\xcf\xfb\xb9\ \x72\x98\xb8\xb8\x74\x6b\x13\xb7\x59\xc9\xd1\x90\x78\x7b\x87\xf7\ \x57\x5f\x61\xc2\x96\x1f\xc5\x44\xeb\x62\x4e\x83\xfe\x9b\x62\xd1\ \x48\xbc\x94\xc6\xe4\xa8\x41\x92\xd3\xbb\x11\x4f\x8c\x24\x34\x03\ \x00\x83\x9c\x95\x29\x3a\x62\x03\x8b\x38\x5d\xea\x2a\x83\xd8\x08\ \x29\xb8\x7c\x9f\x11\x60\x97\xf7\xd9\x68\x02\xbc\x53\x5a\x93\x15\ \x34\xfb\x32\x10\x78\xf3\xa4\xe5\x47\x26\xb1\xe3\x64\xa7\x67\x06\ \x9e\x18\x49\xb5\x07\x63\x0c\x67\xeb\x44\x00\x4b\x9b\x4a\xdc\x98\ \xc6\x22\xfc\xee\xaa\x40\x19\x00\x1a\xc7\x95\x25\x6f\x1e\xfa\x76\ \x34\x01\xde\xa1\x54\x11\x6f\xb1\x24\x21\xba\x97\x38\x8b\x90\x26\ \x72\xa9\x69\xc0\xa7\xd9\x60\x4d\x14\x56\x4a\x43\x96\xd2\x86\x02\ \x39\x5c\xbb\x9a\x46\xd3\xf2\xf3\x7d\x86\x78\x30\xd9\x55\x31\xd1\ \xbc\x48\x7d\x30\xe2\xe0\x7b\x05\x00\xbf\x80\xc0\x4b\x56\xa8\x79\ \xfb\x1f\x33\x9a\x24\xa7\xe7\xd7\x86\x8c\xc6\xdb\xc5\x5a\x69\x5d\ \x5b\xc3\xa0\x00\x56\x89\x07\x37\x77\x96\x1d\xde\x5f\xa5\xa5\x64\ \x1a\xb8\xb7\xcf\x9e\xe9\xfd\x71\xb4\x01\x2e\x40\xc0\xfd\x4c\x29\ \x80\xc4\x0f\xce\xbf\x8c\x68\x7e\x6b\x46\xb3\x74\xe9\x81\x6b\x60\ \x62\x06\x2f\x2a\x7b\xa3\xff\xe2\x60\x00\x56\xca\xdd\x35\x76\x94\ \x67\xbe\x53\x62\xcc\x66\x38\x3c\xeb\x62\xa2\x7d\x91\x32\x7d\xd9\ \x61\x18\x93\xea\x9d\xb7\xa4\x5c\x6e\xb3\xbd\xc6\xeb\x2b\xd9\xe5\ \x7e\xc0\xee\x70\x1b\x26\xfb\xfe\xc7\xc7\x9b\x78\xdb\x9f\x38\x18\ \x24\x28\xc4\x53\x72\x86\x94\x11\x27\xb6\xb1\x6a\x53\xcd\x39\xc6\ \x72\x38\xb3\x64\x45\xc9\x37\x87\x03\xe0\x3c\x95\x77\xd8\xe8\xf5\ \x0c\x14\xbc\xf7\x06\x5a\x54\xa8\x5f\xb9\xaf\xad\xf1\xb1\xa9\xfb\ \x1c\xf0\xae\x44\xc1\x1e\x5c\x54\xc2\xe4\xdb\x7c\xbc\xa4\x67\xc9\ \xc9\xae\xe2\x55\x1f\xd4\x9c\x31\x72\xae\x5b\x23\x0a\x37\x66\x38\ \x2e\x43\xf9\xbf\xa8\x9e\x81\xbc\x1a\x26\x4c\x97\xc3\xe9\xeb\x19\ \x95\x04\x29\xb9\x2e\xc7\xcf\x72\xad\x49\xda\xd0\xbf\x1e\x2d\xaf\ \xb6\xcd\xdb\x74\xa9\xc4\xb4\xf8\xc4\xdf\x74\x3a\x12\x67\xe4\x40\ \xc3\xc5\xb2\x8c\xb5\x15\xfd\xca\x60\xd7\x25\xe6\xec\x8c\x19\xae\ \xcb\xe0\x1c\x08\x5e\xd8\x46\xdf\x04\xa5\x73\xe7\x26\x69\x66\x59\ \x9e\xd1\x4e\xeb\x8e\x9f\xa5\x65\x2f\xc9\xeb\x07\xf2\xb2\xec\xd2\ \x2e\x52\x35\xa9\x1a\xae\x24\x8e\x0a\x02\xb8\x83\x70\x2d\x89\xf7\ \xa6\xac\xf4\xf6\x72\x6a\x87\x77\x44\x94\xc1\x18\x14\xc0\xf8\xd8\ \x94\x48\x44\x18\x8f\xde\x6e\xe5\x80\xf6\x94\xea\x0b\x47\xe1\xf7\ \x3f\xea\x35\x6a\xce\xa5\x3b\xaa\xcd\x80\x58\xb1\xda\xd7\xb1\x65\ \xd7\x91\xb6\xca\xa2\x10\xc0\xed\xa2\x78\x45\xd9\xc1\x2a\x2d\x6f\ \x9b\xbf\xeb\x8f\xd9\x87\xbb\x15\xea\x86\x37\x47\xcd\x3d\x66\x40\ \x99\x42\xab\xbf\x7d\xa4\xb6\x4d\x40\xf7\x53\x59\xfa\x9e\x39\x48\ \xe8\x90\x3c\x37\x54\x58\xd8\x63\x8d\x7d\x9e\x66\x3c\xae\x98\x81\ \x91\x92\xe9\xd1\x56\xad\x2e\xd1\xd6\x6f\xf1\x5f\xfa\xe0\x40\xf3\ \xd1\xed\x25\x6d\xb5\x3b\x4a\x4e\xd7\x16\x78\x5b\xeb\x36\xed\x6b\ \x3e\xb6\xa6\xa0\xf6\x8c\x0b\x2c\x04\x52\x67\xc1\x01\xb3\xdd\xee\ \x74\x67\x9b\x7c\xbf\x36\x27\x27\x27\xfa\xaf\x88\x24\x27\xef\xa5\ \x34\xc1\xa4\x66\xaf\xd0\x8a\xc0\xe7\xe5\x38\x47\x04\x10\x6d\x2a\ \x9b\x10\x80\x09\xdf\x05\xad\x6c\x68\x2b\xdc\xdd\xab\x49\x0d\x32\ \x8d\xe8\xbd\x62\x22\x2e\xb2\xf0\x79\x8e\xcf\xf5\x0a\xbc\xff\x32\ \x98\x9f\x1b\xc7\x11\x23\xb8\xc2\x7e\x95\xa4\xaf\xe5\x48\x21\xce\ \x67\x82\x42\xb3\xed\x4e\x6f\xe5\x20\x80\x25\xb2\x77\x7d\x62\x86\ \xfb\xce\xfe\xee\xba\x3b\xd5\x84\x7e\x45\xcc\x68\xb8\x02\xaf\x2a\ \x08\x03\x9c\x2d\xe1\xe0\x0c\x59\xb1\x20\x01\x68\xd5\x92\xfc\x82\ \xcc\xd4\xed\x52\x50\x53\x32\x0e\x6a\xc4\x2a\xd9\xb1\x30\xd3\x97\ \x98\x5e\x72\x13\xf7\xb9\xc0\xad\x49\x0e\x8f\xd3\xa4\x8f\x25\xa3\ \x01\xe0\x38\x99\xad\x8c\x38\x38\x53\x5a\x8b\x1b\x13\x7e\xff\xd0\ \xa5\x99\x73\xb4\xea\xf9\x0b\x0b\xc1\x86\x7d\x0c\xb8\xfb\xe9\xc0\ \x79\xb9\xc0\xdf\x45\x0f\x7d\xb8\xd0\x39\xbb\x37\x36\x5e\xe8\xc6\ \x1b\x43\xa7\xda\x55\xc9\x0e\xcf\xdb\xfd\xc5\x85\x7b\xd1\xc8\x06\ \x18\xbf\xc1\xca\x66\x5b\x2b\x59\x0c\xfc\x3a\x9b\x39\x82\x3e\xa7\ \x2a\xbe\x60\x64\x3a\x39\x80\x23\x3a\x46\x86\x2f\xa2\xdc\x88\x92\ \x33\xe1\xe4\x17\x46\x32\xc0\xd3\x64\xce\x08\xe2\x4c\xfc\xd2\xa2\ \x99\x8a\xf6\xf7\x90\x46\xbe\x88\x99\x06\x4a\x30\x9f\x01\xb8\x0f\ \x76\xc8\xbc\x91\x0a\xf0\x54\xe5\x17\x91\xe2\x23\x0c\x16\x8b\x55\ \x40\x37\x19\xf5\xf9\xc1\x50\x8f\x39\x21\xa7\x72\x8c\xdd\xe1\xd9\ \xd6\x0f\x64\x97\xe7\xf1\x91\x07\x70\xf0\xfd\xbc\x6a\x25\x5b\xe8\ \xb4\x11\xe1\x7c\x45\xfb\x3b\x37\x1a\xe3\x26\xe7\xf4\x92\x9c\x9e\ \xdd\xac\x25\x02\xdf\xc5\x8d\x2c\x80\x83\x87\xf9\xf6\x07\xaa\x31\ \x05\x91\x39\xca\xed\x1b\x95\x5c\xf4\xe0\xff\x96\xdb\x17\x28\x01\ \x1b\x8a\x17\x2a\x73\xae\xc5\x99\xde\xb1\x00\xaa\x97\x01\xb9\x3b\ \xd9\xe9\x99\x14\x33\x1a\x2f\xe6\x3f\x7e\x3d\x30\x12\xc6\x64\x4f\ \x2f\xba\x1e\x40\x65\xa2\x7c\xee\xfc\xd1\x0a\xf0\x07\x2a\xc9\xd6\ \xe1\xbe\x52\x32\xdc\x37\x80\x4c\xae\x41\x15\x3f\xa9\xa3\x13\xe0\ \xe0\x6b\x6d\xc8\x0b\x9c\x3e\x1e\xc8\x7f\xfc\x8a\x2a\x27\x83\x6b\ \x0d\xf2\x37\x91\x98\x6c\x24\x03\xf3\xbf\x65\x82\x30\x59\x25\xee\ \x28\x87\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x01\xdb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x16\x00\x00\x00\x16\x08\x03\x00\x00\x00\xf3\x6a\x9c\x09\ \x00\x00\x00\x9f\x50\x4c\x54\x45\x00\x00\x00\xdb\x49\x49\xdf\x60\ \x40\xe3\x55\x55\xcf\x60\x50\xd2\x5a\x4b\xd5\x55\x47\xd8\x58\x4e\ \xd9\x5e\x4c\xdb\x5b\x49\xd5\x5e\x4d\xd6\x5a\x49\xd7\x5b\x4b\xd7\ \x5a\x4a\xd8\x59\x4a\xd8\x5b\x49\xd6\x5a\x4b\xd6\x5b\x49\xd7\x59\ \x4a\xd7\x5a\x49\xd8\x59\x4b\xd6\x5a\x49\xd7\x5a\x4a\xd7\x59\x49\ \xd8\x5a\x4a\xd6\x5a\x4a\xd6\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\ \x5a\x49\xd7\x5a\x4a\xd8\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\ \x4a\xd7\x5a\x4b\xd8\x5a\x4a\xd7\x5a\x4a\xd7\x59\x4a\xd8\x5a\x4a\ \xd7\x5a\x4a\xd7\x5a\x4a\xd7\x5a\x4b\xd7\x5a\x4a\xd7\x5a\x4a\xdc\ \x6d\x5f\xdd\x75\x67\xdf\x79\x6c\xdf\x7a\x6d\xdf\x7c\x70\xfa\xe8\ \xe6\xfb\xec\xeb\xfb\xed\xeb\xb3\x55\x01\x85\x00\x00\x00\x2c\x74\ \x52\x4e\x53\x00\x07\x08\x09\x10\x11\x12\x1a\x1b\x1c\x1e\x5e\x5f\ \x60\x61\x62\x63\x76\x78\x7a\x7b\x7d\xad\xae\xaf\xb0\xc9\xca\xcb\ \xcd\xce\xcf\xd7\xd8\xd9\xdb\xe2\xe3\xe4\xef\xf0\xf1\xf3\xf4\x24\ \xb9\xb6\xe8\x00\x00\x00\xbf\x49\x44\x41\x54\x18\xd3\x6d\x91\xd7\ \x12\x82\x30\x10\x45\x57\xba\x28\x28\xa0\x52\x44\x05\x15\x81\x10\ \x8a\xc8\xff\x7f\x9b\x40\x08\xfd\x3e\x24\xb3\x27\x99\xbd\x5b\x00\ \x5a\x09\x07\xdb\x4f\x12\xdf\x52\x79\x18\xc4\x9e\x62\xdc\x29\x32\ \x58\x4a\xc5\x2b\x1e\xe9\x21\x13\xba\xfd\xe0\x89\x02\xa9\xcd\x70\ \xc3\x33\xb9\x4c\x8d\xcf\x78\x21\xbd\xae\xa1\x75\x4b\x33\x02\xb2\ \xb4\xf5\xe5\xe1\x48\xc2\xb2\x68\xae\xa2\x24\xcf\x0a\xd8\xe4\x5b\ \x5e\x7e\xbb\xa3\x91\x09\x2f\xdc\xf3\x9e\x62\x1f\x10\xf5\xc9\xab\ \x8a\x52\x8c\x46\xf8\x37\xe0\x18\x9e\x6b\x49\x3c\xb0\xd6\x2c\x2f\ \xa0\xae\x15\xb8\x03\x21\x5a\xb6\x13\x72\x00\xc6\xb2\x79\xad\x9e\ \x09\xe3\xce\xa9\xd3\x8c\x0a\xa4\x60\x4a\xdf\x62\xb7\x06\x67\x4c\ \xef\x32\x5d\x0f\xa3\x47\x14\x86\xda\x66\xb4\x4d\x5e\xb1\x3c\x84\ \x3c\x73\xcf\x91\xf8\x0f\x96\x68\x41\x36\x66\x7b\xfd\xf5\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x7d\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x02\x88\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\x80\x80\ \x80\xff\x80\x00\x55\xaa\xaa\xff\xaa\x00\x80\x80\xbf\xff\xbf\x00\ \xff\xcc\x00\x80\x80\xaa\xff\xaa\x2b\x6d\x92\xb6\xdf\xbf\x20\xe6\ \xb3\x1a\x74\x8b\xb9\xe8\xb9\x17\xea\xbf\x15\xeb\xb1\x14\xed\xb6\ \x12\xee\xbb\x11\x70\x80\xbf\x78\x87\xc3\xf0\xb4\x0f\x71\x80\xb8\ \xf1\xb8\x1c\xf2\xbc\x1b\xe6\xbf\x1a\xe7\xb6\x18\x6f\x85\xbc\xe9\ \xbc\x16\xea\xbf\x15\x70\x85\xc2\xeb\xb8\x14\x76\x80\xba\xec\xbd\ \x13\x72\x84\xc1\xee\xbb\x1a\x73\x84\xbd\x70\x80\xbf\x74\x83\xc1\ \xe8\xb9\x17\x71\x80\xbc\xe9\xbc\x17\x72\x86\xbc\xeb\xbc\x14\x76\ \x83\xbe\x70\x83\xc1\xec\xbb\x19\xed\xbc\x18\x71\x82\xbe\x72\x82\ \xc1\xeb\xb8\x14\x73\x82\xbe\xec\xbc\x18\x71\x84\xbd\x74\x82\xbe\ \xec\xb9\x17\x72\x84\xbf\xe9\xb9\x16\xe9\xba\x16\xea\xbb\x15\xea\ \xb8\x15\xea\xb9\x15\x71\x82\xbe\x72\x81\xc0\x74\x83\xbd\xec\xba\ \x17\x73\x81\xc0\xed\xba\x16\xea\xba\x15\xeb\xb9\x17\x74\x84\xc0\ \x74\x84\xbe\x73\x83\xbf\xec\xba\x16\xea\xb9\x15\xea\xbb\x15\xeb\ \xb9\x17\x73\x84\xc0\xeb\xba\x17\x73\x84\xbf\xeb\xb9\x16\x72\x82\ \xbe\xec\xbb\x16\x73\x84\xbf\xec\xb9\x15\xea\xba\x15\xea\xb9\x15\ \xeb\xb9\x17\xeb\xba\x16\xec\xbb\x16\x72\x83\xbf\xec\xba\x15\xec\ \xbb\x15\xea\xbb\x15\x74\x84\xbe\xea\xba\x17\x74\x84\xbf\xeb\xb9\ \x17\xeb\xba\x16\xeb\xba\x16\xeb\xbb\x16\xec\xba\x16\x74\x83\xbf\ \xec\xba\x15\xec\xb9\x15\xea\xba\x17\xea\xb9\x17\xeb\xba\x16\x72\ \x83\xbf\xeb\xbb\x16\xeb\xba\x16\x74\x83\xbe\xeb\xba\x16\xec\xbb\ \x15\xec\xb9\x15\x72\x83\xbe\xea\xb9\x17\xea\xba\x17\x73\x83\xbe\ \xeb\xba\x16\x74\x82\xc0\xec\xba\x15\xec\xb9\x17\x72\x84\xbf\xea\ \xba\x17\xea\xba\x16\x73\x84\xc0\xeb\xba\x16\xeb\xbb\x16\xeb\xba\ \x15\x72\x83\xbf\xeb\xba\x15\x73\x84\xc0\x73\x83\xbe\xeb\xba\x16\ \xeb\xba\x16\x73\x83\xbf\xeb\xba\x15\xeb\xbb\x15\x73\x83\xc0\xeb\ \xba\x17\x74\x83\xbf\xec\xba\x17\x74\x82\xbf\x73\x83\xc0\xea\xba\ \x16\x72\x82\xbf\xeb\xb9\x16\xeb\xba\x15\xeb\xba\x17\x73\x84\xbf\ \xec\xba\x16\x73\x84\xbf\xeb\xba\x16\x73\x83\xc0\xeb\xbb\x16\xeb\ \xba\x16\x73\x83\xc0\xec\xba\x16\xea\xb9\x16\x73\x83\xbf\x73\x83\ \xc0\xeb\xba\x16\xeb\xba\x16\x73\x83\xbf\x73\x83\xbf\xea\xba\x16\ \xeb\xba\x16\xeb\xba\x15\xeb\xba\x17\xeb\xba\x16\x73\x83\xbf\xeb\ \xba\x16\x73\x83\xbf\xeb\xb9\x16\x73\x83\xbf\xeb\xba\x16\x73\x84\ \xbf\x73\x83\xbf\xeb\xba\x15\x73\x83\xbf\xeb\xba\x16\xeb\xba\x16\ \x73\x83\xc0\xeb\xba\x16\x74\x83\xbf\xeb\xba\x16\x73\x83\xbf\xea\ \xba\x16\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\xeb\xba\x16\x73\x83\ \xc0\xeb\xba\x16\x73\x83\xbf\x73\x83\xbf\xeb\xba\x16\xeb\xba\x16\ \x72\x83\xc0\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\x73\x83\xbf\xeb\ \xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\ \xbe\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\x73\x83\xbf\xeb\xba\x16\ \xcc\xda\x57\x5f\x00\x00\x00\xd6\x74\x52\x4e\x53\x00\x01\x02\x02\ \x03\x03\x04\x04\x05\x06\x06\x07\x08\x0a\x0b\x0b\x0c\x0d\x0e\x0f\ \x10\x11\x11\x12\x12\x13\x14\x15\x17\x17\x18\x19\x19\x1a\x1b\x1d\ \x1e\x1f\x20\x21\x21\x22\x22\x26\x26\x27\x29\x29\x2a\x2b\x31\x32\ \x33\x35\x36\x37\x37\x38\x3a\x3b\x3c\x3d\x3e\x3f\x41\x42\x43\x45\ \x46\x4a\x4c\x4d\x4f\x50\x51\x54\x56\x58\x59\x59\x5b\x5b\x5e\x5e\ \x5f\x5f\x60\x62\x66\x68\x69\x6b\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\ \x73\x74\x76\x77\x77\x79\x7a\x7c\x7e\x7f\x7f\x81\x82\x82\x83\x84\ \x86\x87\x88\x8a\x8c\x8d\x90\x92\x93\x93\x94\x95\x98\x99\x9b\x9c\ \x9c\x9d\x9e\xa2\xa3\xa7\xa7\xa8\xa9\xa9\xaa\xaa\xac\xad\xae\xb0\ \xb0\xb2\xb5\xb8\xb8\xba\xbc\xbd\xc2\xc4\xc5\xc5\xc6\xc7\xc9\xc9\ \xce\xcf\xd2\xd3\xd4\xd6\xd7\xd9\xda\xdb\xdc\xdc\xde\xde\xdf\xe2\ \xe2\xe3\xe3\xe4\xe5\xe6\xea\xeb\xec\xec\xed\xee\xef\xf0\xf1\xf1\ \xf2\xf3\xf3\xf4\xf5\xf6\xf6\xf7\xf8\xf9\xfa\xfa\xfb\xfc\xfd\xfd\ \xfe\xfe\xe4\x7c\x8e\x47\x00\x00\x02\xce\x49\x44\x41\x54\x58\xc3\ \xed\xd8\x67\x73\x55\x55\x18\xc5\xf1\x05\x12\x72\x09\x5e\x82\x80\ \x94\x50\x85\x20\x11\xa4\x88\x20\x55\x4a\x04\x2c\xf4\xae\x48\x15\ \x35\x2a\x58\xe8\xa0\x42\x12\x9a\x51\x29\x51\x4c\x94\xde\x02\x01\ \x04\x14\x44\x8c\xd2\x9b\xa1\xc7\x98\xe4\xf9\x7f\x1d\x5e\x84\x19\ \x23\x65\x87\x73\x67\x9f\x19\x5e\xdc\xf5\x01\x7e\x33\x77\xce\xcc\ \xbe\xcf\x5a\x52\x3c\xf1\xc4\xf3\xf8\xa7\xd7\xa8\x4e\x61\xb0\x75\ \xd6\x99\x95\x2f\xf4\xef\xd6\xfb\xd1\xcc\xcc\x5e\xf1\xed\x36\xda\ \x61\x66\x66\xb6\xc4\xb3\xdb\x62\x5f\xa5\x6b\x99\x7e\xdd\xf6\x87\ \x2d\x14\xb8\xcb\xef\x16\x0a\xdc\xe3\x2f\x0b\x05\x1e\x78\xd1\x42\ \x81\x5f\xbd\x66\xa1\xc0\x63\x6e\x5b\x28\xf0\xdb\xff\x5a\x28\x70\ \x86\x59\x18\x70\x8d\x65\x16\x0a\x5c\x6b\x8d\x39\xe0\xe8\xf2\xac\ \xc6\xb1\xb9\x75\xbf\x33\x17\x3c\x15\x76\x46\x63\x7a\xce\x36\x9b\ \x13\x4e\xaf\x80\xbc\x84\xe0\xee\xd3\xbb\xcd\x0d\xeb\x43\x60\x6e\ \x60\xb7\xf5\x7e\x73\xc0\xa9\x11\x49\x5a\x01\xa5\x03\x02\xba\x9d\ \x8e\x9b\x03\x5e\x44\x61\x8a\xa4\xc4\x5d\xf0\xcb\x93\x6e\xe8\x99\ \x8f\xbf\xde\x50\x25\x5b\x6f\x9b\x0b\x2e\x80\xbd\x51\x49\x69\x97\ \xe0\x23\xa7\xdb\xf9\x9c\x3d\x62\x32\x25\x69\x78\x19\xac\x96\xa4\ \xf7\xa0\xb8\xb9\x0b\xce\xb5\x40\xb0\x66\x03\x6f\x48\x4a\xfa\x19\ \xe6\xb9\xe0\x5f\x03\xc2\xfa\x06\x4e\x24\x4b\x9a\x08\x67\x92\x1d\ \x70\x51\x50\x38\xe5\x2c\xbc\x2b\x29\x72\x02\x46\xfb\x84\x35\x13\ \xfe\x88\x48\x9a\x0f\x79\x5e\xe1\xe8\x29\x18\x26\xa9\x1b\xdc\x8a\ \xfa\x84\xf5\x39\xe4\x48\xd2\x11\x48\xf7\x0a\xf7\x83\x3f\x25\x69\ \x35\x7c\xea\x15\x8e\x14\x43\x47\x49\x93\xe1\x7b\xaf\xb0\x76\xc1\ \x50\x49\xfd\xa1\xd0\x2f\x9c\x03\x53\x24\xb5\x82\xbf\xfd\xc2\x5f\ \xc0\x07\x92\x92\xa0\x22\xc1\x2b\xbc\x14\xe6\x48\xd2\x2d\x68\xe8\ \x15\xce\x82\x77\x42\x81\xf3\x61\xac\xa4\x08\x90\xe8\x15\x3e\x06\ \xbd\x25\xb5\x84\x62\xaf\x1f\xaf\x0d\x94\x24\x4b\xea\x0b\x07\xbc\ \xc2\x6f\xc2\x4e\x49\x9a\x04\x3f\x78\x85\xb7\xc1\xfb\x92\x94\x0d\ \x0b\x7c\xc2\x3d\xa1\x34\x55\x92\x0e\xc1\x10\x9f\xf0\x4f\xb0\x51\ \x92\x9e\x87\x92\xfa\x1e\xe1\x91\x50\xf6\xa2\x24\x7d\x02\xf9\x8e\ \x87\x7e\x4f\x40\x38\xed\x3c\xac\x94\xa4\x84\x63\x30\xde\x01\xcf\ \x08\x06\x37\x3d\x08\x27\x9b\x49\xd2\x68\xb8\xf0\x94\x03\xae\xf9\ \xd9\xd5\x20\xf0\x7a\x28\x79\x59\x92\x12\x0b\x61\xb1\xfb\x14\xaa\ \xfd\xec\x73\x55\xd2\x67\x95\x13\xde\x4e\x45\xe5\xef\x9f\x06\xd7\ \xdb\x04\xec\x08\xe5\x0e\xb8\x6b\xf6\x08\x49\x52\xdb\xb3\xce\xff\ \xa5\x07\x67\xc2\x3f\xd5\x9d\xb1\x7a\x62\xcb\xdd\xb3\x25\x58\x5e\ \xbf\x59\x1d\xbc\x18\xca\x86\xc4\x70\xd2\x0f\xbe\xe2\x86\xdf\x02\ \x16\xc5\x54\x42\x5e\x3a\xed\x82\xfb\x97\xc1\x96\x48\x6c\xf5\xe6\ \x85\x22\x07\x3c\x1d\x0a\x1a\xc4\x5a\xc8\x3a\x1c\x7d\x38\xdc\xe0\ \xab\x6f\x5b\xc6\x5e\xf5\xee\xab\x22\xde\xba\xf4\xbd\xe5\xc9\x5f\ \xfb\xbf\xa7\xee\x79\xdc\x2b\xea\xe6\x86\x04\xff\xbf\x52\x7b\xdd\ \x84\xaa\x8e\x00\x9e\xe7\xb1\x8c\xb0\xe0\xff\x86\x16\xdf\xb0\xc6\ \xdd\x7d\xec\xbe\xf4\x3e\x9a\xbe\x76\xc3\xcc\xcc\x66\xf9\x9f\x63\ \x07\x5d\x36\xb3\xdf\x9a\x84\x30\x20\x77\xdf\xb4\x7f\x6d\xbb\xf8\ \x3c\x1f\x4f\x3c\xf1\x78\xcb\x1d\x0e\x48\x35\x6f\xa3\xf8\x5f\x1b\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x0f\x08\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x06\x00\x00\x00\x71\x95\x30\x34\ \x00\x00\x0e\xcf\x49\x44\x41\x54\x78\xda\xed\x5d\x79\x4c\x1c\xd7\ \x19\x5f\xbb\x69\x5a\xf5\x90\xaa\x4a\xad\x2a\xf5\x70\x9a\xb6\x49\ \x9a\x36\x52\xab\x56\x6a\x93\xb4\x52\xff\xa8\xd4\x48\x91\xd2\xa6\ \x4d\xab\x1c\x55\xd4\x26\x8d\xd5\x56\x6d\x1a\x03\x76\x1c\x29\x98\ \x65\x67\x8d\xdd\x58\x06\xe3\xdb\x31\xc6\x2e\x01\x8c\x01\xd7\x8e\ \xf1\x01\x84\xdd\x99\x05\x76\x17\x1c\x2e\x63\x1b\x58\x2e\x63\x63\ \x83\x81\x3d\x70\xc0\x9c\x86\xd7\xf7\xcd\xee\xec\xbe\x59\x76\x66\ \x67\x66\xdf\xcc\x2e\x51\x9f\xf4\xc9\xeb\xd9\x39\x7f\xbc\xfd\xde\ \xef\x3b\xc7\x64\x4a\x91\xf1\xfb\xf2\xf2\x4f\xa4\xe7\xd4\x3d\x9a\ \xce\xd8\x7f\x9b\x6e\x65\x37\xe3\x7f\x0b\xd3\x19\xce\x99\xce\xb0\ \x9d\xe9\x56\x6e\x00\xff\xeb\xc7\xff\x9f\x0f\x0a\xfe\x1c\xdc\xd6\ \x99\xc6\xb0\x8d\xfc\xbe\xf8\x98\x0c\x2b\xf7\xec\x1b\x8c\xe3\xbb\ \x70\xae\x44\xef\xc7\x62\xb2\x3c\x6e\x36\x99\x3f\x67\x5a\xcd\x63\ \x83\xb9\xee\xc1\x74\x8b\x7d\x7d\x06\xc3\x96\x63\xe0\x7c\x18\x30\ \x44\x49\xa6\xb0\x7c\x80\xcf\xfb\x26\x3e\xff\x8f\x4c\x08\xad\x51\ \x7b\x6f\x18\x5c\x77\xb6\x29\xfb\xad\x55\x08\x2a\xfb\x6d\xfc\xe0\ \xe6\xd0\x0c\x54\x05\xdc\x9b\xdb\x1c\xbc\x68\x00\xbc\x1f\xcf\xf4\ \x2c\xf8\x83\x2a\xb9\x47\x0c\xec\xd3\x18\x60\x84\x25\x80\xe5\x0b\ \x29\x0f\xaa\xd9\xcc\xde\x87\x7f\xc2\x2f\x05\x7f\xce\xec\x72\x2c\ \x10\x30\xe8\xc8\xb2\xc7\x85\xf2\x8b\x5b\xd1\xd1\xaa\xcb\xa8\xd2\ \xd1\x8b\x6a\x3b\x86\x90\xa3\xeb\x26\x72\xf6\x8d\xa0\x8b\xd7\x6f\ \x8b\x04\xb6\xc1\x77\x35\xed\x43\xfc\xbe\x70\x0c\x1c\x0b\xe7\xc8\ \x90\x06\x1a\xae\xdd\x90\x61\xb1\xbf\x28\xa3\x46\xd6\x60\x50\x2f\ \x86\x00\x46\x18\xec\xac\x14\x06\xb6\xfc\xfe\x0c\x86\x7b\x0d\x66\ \x50\xac\x07\xde\x92\xdb\x88\xf6\x97\x77\xa0\x93\x18\xa0\x06\xcf\ \xcd\x15\x20\x6a\x15\x38\x17\x80\x7e\xe0\x44\x07\xca\xc4\xd7\x88\ \x09\xb6\x95\xed\xc3\x7f\x88\x57\xe1\x1e\xa3\x66\xef\xb3\x02\xb8\ \x21\x99\xc4\xf2\xc5\xd4\x42\x16\xeb\xbc\x34\x8b\xfd\x65\xfc\x20\ \xc3\xd1\x0f\xb6\x79\x7b\x3d\xda\x7b\xbc\x0d\x9d\xbd\x38\x88\x9a\ \x87\x46\xa9\x81\x2a\x25\x70\x8d\xb3\xcd\x83\xfc\x35\x25\xd4\xcb\ \x0d\xf8\x75\x85\xf4\x34\xcc\xde\x8e\x28\x80\x41\xb6\xa6\x8e\x8e\ \xb5\xd8\xbf\x87\x67\x06\x17\x6b\xb6\x96\xd6\x74\x23\xf7\xc0\x88\ \xee\xa0\x4a\x09\x5c\xbb\xa4\xb6\x9b\xbf\x97\x18\x33\xda\x9e\xb9\ \x2e\x2f\x2d\x06\xb8\x20\xd3\x58\xbe\x9c\x54\x60\xd7\x1f\x6a\xf9\ \x64\x1a\x63\xcf\xc1\x37\xbb\x40\xde\xb8\x39\xdf\x85\x4e\xd8\x3c\ \xa8\xc9\x80\xd9\xaa\x54\xe0\x5e\xca\x6c\x3d\xf8\xde\x9c\x91\x35\ \x20\x9b\x45\x99\x5f\x7a\x67\x59\x02\x60\x90\x1d\x49\x03\x37\xcd\ \xea\xf8\x7a\x88\xb3\x86\x6f\x78\x63\x8e\x03\xed\x2f\xe9\x42\x4d\ \x83\xa9\x03\x6c\x2c\xa0\x8b\xab\xbb\x78\xd5\xb1\xf9\x77\x65\x48\ \x06\x5c\x90\x59\xab\xc9\xfa\x55\xe3\xc1\x65\xec\xcf\x44\x73\xd8\ \xed\x07\xdb\xd1\x49\xdb\x18\x3a\xd7\xe8\x47\xdc\xe5\x89\x94\x05\ \x58\x10\xee\xf2\x0d\x64\xf9\xca\x8e\x78\x00\x83\xe4\x1b\x0a\x6e\ \xd0\xe2\x8a\xd0\xae\x37\xf1\xac\x3d\x52\x39\xc0\x03\x2b\xc8\x05\ \x97\x1f\x35\x5d\x1b\x4b\x59\x70\x9b\xaf\x8d\xa2\x0a\xc6\xa6\x04\ \x5c\x90\x39\xc6\xc4\x7c\xc7\x10\x96\x80\xcd\xd3\x77\xc4\x8b\x98\ \x0b\x95\xd7\x8c\x88\xc0\x15\x84\xbd\xe4\x4d\x2e\x88\x78\x71\xe3\ \x1a\x7a\xd1\xf9\x92\x16\x54\xb9\xcd\x8e\x8a\xfe\x76\x1a\x1d\x7c\ \xba\x08\xe5\x3e\xb6\x17\x31\x9f\xb1\x2a\x05\x97\x14\x30\x40\x5a\ \xb0\x94\x63\xd9\x8e\x65\x3d\x96\x5f\x62\x79\x10\xcb\xda\x84\x17\ \x33\x0c\x68\x31\x09\xee\xbf\x0f\xb5\xa3\xaa\x7a\x5f\x4c\x70\x41\ \xce\x3b\x7d\x78\x05\x37\x6e\x16\x57\x97\xb5\xa1\xa3\x2f\x57\xa0\ \x7d\xbf\x28\x44\x3b\x1e\xc8\x43\xd9\xf7\x59\xb4\x80\xa8\x55\xa6\ \x42\x54\xaf\x12\xc0\xd7\x30\x73\xd9\x63\x24\xb8\xb9\x85\x97\xd1\ \xb9\x06\x69\x70\x05\xa9\x6b\x37\x6e\x16\xbb\xbb\x6f\xa2\xbd\x3f\ \x2f\x30\x12\x54\x29\x51\x07\x70\x86\x85\xdb\x49\x82\x9b\xff\x9f\ \xab\x71\x81\x25\xc5\xd5\x37\x6e\x1c\x43\xc0\xa6\xf4\xc1\xa7\x8a\ \x92\x05\xec\x32\xb6\x08\x37\xa8\x03\x97\xe1\xde\x22\xc1\xdd\x5b\ \xdc\xad\x0a\x5c\x90\xda\x16\x83\x75\x31\xa6\x88\x87\x9f\x2b\x35\ \x1a\xdc\x7b\x58\x5e\x51\x07\xee\x56\xfb\xd3\x24\x5b\xc8\x2b\xec\ \x54\x0d\xae\x20\x8d\x9e\x71\x63\x17\x38\xcc\x75\x8f\xbd\x72\xd2\ \x28\x70\xe7\xb1\x3c\xa7\x92\x8a\xd9\xd6\x91\x3c\x17\x16\x34\x25\ \x3a\x57\x4a\xaa\x9b\x7c\xe8\xe2\x90\xf1\x4c\xa2\xe4\x8d\xb3\x7a\ \x83\x7b\x17\xab\x85\x5f\x69\x60\x0c\x11\x0b\x6d\x4b\xae\x1b\x55\ \x39\xbc\x9a\xc1\x15\xa4\xbe\x6b\x3c\x29\x74\xad\x6c\x73\xb5\x5e\ \xe0\x06\x2c\x26\xcb\x93\x5a\xac\xb4\x1c\xd2\x88\xa8\xa8\x1d\x4d\ \x18\x5c\x7e\x16\xbb\xfd\xf8\xa7\x9b\x1c\x4e\x5c\xb9\xd5\x86\xb2\ \xd7\x66\xd3\x03\xf7\x7e\x06\x1c\x41\x3f\x50\x6f\xa5\xf1\xf1\xb1\ \x88\xe3\xa6\xa0\xb2\x9f\x0a\xb8\x82\x24\xd3\x84\x3e\xb5\xab\x1e\ \x99\xd7\x24\x0e\x6e\xd6\xe7\x73\xd0\xc6\xd7\xcf\x2f\x40\x1c\x50\ \x03\xdf\xe5\x1c\x61\xbd\x7b\xb0\x8d\x2a\xb8\x41\xe3\x03\x9b\xd0\ \x83\xc9\x31\xa1\x9d\x97\xae\x53\x99\xbd\x99\xeb\xf2\x04\x57\x67\ \x9d\x3a\xd5\x10\x74\x96\x87\xbd\x62\x95\x1f\xdc\xa6\x0e\x30\x88\ \xbd\x23\xf6\x2c\x6e\xb9\x31\x86\x3c\xe3\x01\x34\x72\x67\x1a\x05\ \x66\xe6\xd0\xec\xc2\x22\x5a\x5c\x5a\x42\xcb\xcb\x88\x17\xf8\x0c\ \xdb\xe0\x3b\xd8\x07\xf6\x85\x63\x14\x5b\x7a\x27\xda\xa9\x00\x9c\ \xf5\x69\x06\xa5\x5b\xec\x41\x77\xa7\x85\x7d\x5e\x11\xb8\xff\xdc\ \x7d\xfe\x53\x64\x24\xe2\x40\xa9\x47\x17\x70\x05\x71\xf7\x47\x80\ \x01\xa0\x7c\x77\x67\x31\x88\x18\x45\x95\x63\x09\x1f\x03\xc7\x7a\ \xc6\xfc\x71\x01\xae\xc8\xae\xa3\xa6\x83\x33\x32\xaa\x05\xdb\x60\ \x08\x48\x81\x12\x83\xe2\x35\xd2\x81\x53\x95\x00\x25\x53\x22\x75\ \x6d\x5e\xd4\x3f\x31\x89\x66\xf0\x8c\xa4\x35\xee\xce\x2f\xa2\xbe\ \x89\x80\x24\xc0\x47\x5e\x38\x41\x6f\x91\x5b\xff\x3e\x11\xb8\xe5\ \xfe\x1c\x3f\xf9\x83\x61\x7b\x85\x03\x20\x12\xe1\xec\x1d\x43\xb5\ \x1f\x7a\x75\x01\x97\x6b\x9d\x44\xde\x00\x3d\x60\xa3\xc7\x9d\xd9\ \x79\x74\xe9\xd6\x4a\x35\xb4\xeb\x87\x07\xa8\x01\xbc\xef\xd5\x53\ \xa2\xf4\x00\x88\xa0\xcb\xf9\x77\x5f\x0a\xcf\xde\xbc\x46\x51\x98\ \xa7\xd1\x33\x86\x6a\x9a\xe9\xcd\xe6\xd6\xee\x69\xb4\x78\x6f\x19\ \xe9\x3d\xee\x2d\x2d\xa3\x01\xef\xa4\xc8\xb2\x63\x3e\xbb\x95\x1a\ \xc0\x87\x9e\x29\x16\x47\xae\xad\xdc\x0b\x32\xbc\x97\xcf\x5b\xe0\ \x77\x2c\xad\xed\x5e\xf9\xf3\xc2\xdc\xd5\x71\x75\x1c\x5d\x70\x27\ \x06\x6e\xef\x8d\x59\x64\xf4\x80\xc5\x90\x8f\x5e\xd4\xf7\xc6\x05\ \x6d\xef\xcf\x0a\x50\xed\xe9\x4e\x74\x66\xbf\x0b\xed\x78\x30\x4f\ \x76\xdf\x9d\x0f\xef\x46\x25\x35\xdd\xc4\x2c\xe6\x1c\x92\x19\x37\ \x82\xbf\x01\x42\xeb\x72\xd1\xdf\xe6\x6b\xb7\x79\x1e\x0b\x54\x4b\ \x2d\xb8\xd7\x47\xe7\x14\x83\x32\xbf\xb8\x88\xa6\x66\x66\x50\xe0\ \xa3\x29\xe4\x9d\xbc\x83\xc6\x03\x01\x5e\xe0\x33\x6c\x83\xef\x16\ \x16\x95\xab\x98\xb1\xa9\x19\x54\xf5\xae\x5b\x12\xac\xfc\x1f\x1f\ \xe4\x19\x46\x74\xc4\x23\x08\xf4\xae\x98\xc7\x80\xaf\xd9\xd9\x7d\ \x93\x4c\x09\x58\x8e\x99\x41\x94\x6e\xe1\xb2\x85\xbf\xc2\xbe\xe3\ \xed\xca\x5c\x82\x98\xc7\x02\xd5\x3a\xa7\x10\xe8\xfe\xe1\xf8\x33\ \x17\x18\xc4\xf4\xcc\x2c\x1a\xf7\x07\xd0\xa8\xd7\xa7\x48\x60\x5f\ \x38\x46\x09\xfb\xa8\x7a\xab\x36\x36\xb0\x65\x6d\x71\x43\x4b\x3c\ \xd0\x0f\xac\x9c\xd1\xb6\xea\xab\x68\x4f\x69\x3b\xa1\x26\xec\x5b\ \x56\x1a\x16\x44\xae\x18\x24\x85\xa8\x72\x70\x63\xaa\x55\xd7\x2a\ \xbf\x10\xb6\xf5\x4c\xc7\x7d\xf8\x99\xb9\x39\x55\xc0\xc6\x02\x1a\ \xce\x21\x37\xca\x9f\x2b\x17\x01\x7b\xe1\x78\xab\xea\xf0\xd3\xa9\ \x5c\x07\x7a\x67\x5d\x6e\xf8\x3c\x60\x19\x56\x35\x0d\x88\xb2\x86\ \x44\x09\x87\x1b\x2c\x8e\xc7\xc8\x04\x11\xad\x19\x37\xce\xde\x71\ \xcc\x38\x7c\x31\xd9\xc2\x3d\x99\x05\x0d\x66\xde\xe4\xd4\x94\x66\ \x60\xa3\x05\xd4\x87\xd4\x6c\xde\xf3\xd0\x1e\x54\xf0\xc4\x11\x54\ \x73\xec\xc3\x84\xe3\x7c\x3c\xd0\xdf\xc8\x45\x45\x7f\x3d\xcd\x63\ \xf6\x76\x6e\x43\x04\xe4\x9c\xba\x47\x23\xea\x81\x61\xff\x25\x7c\ \x01\xb9\x62\x89\x9a\xa2\x8d\x3d\xe3\xbc\x5b\x52\x00\x58\x8e\x8a\ \x2d\x61\xab\x0c\x74\x2a\x2d\x70\x05\x81\x73\xc2\xb9\xa3\xff\x90\ \x83\xb6\xc1\x30\x85\xa3\x15\x39\xa9\x39\x19\xc4\x6c\x5f\x59\x44\ \x4d\x60\xcb\xee\x1f\x84\x69\xcc\x9e\x16\xbe\x80\x44\x3c\x2a\x8e\ \xee\xeb\x63\x98\x71\x4c\xa0\x76\xcf\x94\xec\xcc\xd5\x03\xdc\x08\ \xc8\x93\xb2\x7a\x59\xce\x18\xd1\xe4\xa9\xe3\x3c\x24\x9b\x38\x49\ \x1a\x17\x7e\x21\x85\xb4\x9e\x62\x96\x23\x08\x58\x55\x52\x23\x40\ \x51\x2d\xc8\xa9\x0b\x39\x8b\x8f\xe6\xb3\x02\x76\x91\xd4\x59\xce\ \x67\x36\x9b\xd7\x0a\x6e\x49\x7e\x23\xe4\xd6\xd2\xbc\x20\xf8\x16\ \xe4\x16\x34\xa5\x20\x8d\x78\x7d\xbd\xb7\x7d\xbe\x43\xa3\x3e\x5f\ \x16\x08\xff\xd9\xeb\xef\x53\x7a\xfc\xdd\x59\xe9\x85\x4f\x89\xef\ \x42\x8d\x64\xef\x76\x11\x7a\x98\x7d\xc4\xc4\xd7\x44\x08\x51\xe2\ \xe2\x36\xaa\x17\x03\xe7\x8b\x94\x6a\x50\xc6\x16\xfc\xec\x6d\xaf\ \xf7\x27\x52\x86\x11\x06\xfa\xa7\x18\x70\x47\xbc\xf3\x8c\xf9\xfc\ \xbc\x33\x28\xd6\x80\x7b\xa4\xf9\xcc\xf9\xef\xb5\x46\xf4\xb0\xd5\ \xfe\x6b\x51\xb4\x18\xb2\xc4\x69\x5d\xa8\x75\x78\x4c\x52\xff\x01\ \x67\x8d\x03\xca\x32\x06\x2e\x13\x29\xa8\xad\x80\x7d\x46\x27\x7c\ \x66\xfe\x18\x99\x73\x82\x51\x22\xe5\x85\x53\xe3\xea\x8c\x27\x47\ \xcf\x5c\x21\xf9\xf0\x26\x13\x99\x48\x42\x6b\x81\x8b\xa7\x1e\xe2\ \xce\x5e\x0c\xae\xda\x08\x4c\x08\x64\x59\x8e\x6c\x84\x9a\xa8\xe0\ \x7a\x49\xbf\xc4\x11\x00\xb8\x41\xd8\x00\x35\x11\xb4\x2e\x04\xb6\ \xbf\x94\xf9\x1b\x4f\x2d\x20\x0d\x55\x41\xfc\x4c\x8e\xa3\x2e\xa4\ \xcc\x6a\xc1\x4f\x41\x43\xa0\x66\x44\xe4\x97\xc0\x1f\x2e\x0b\x1b\ \x1c\xdd\xc3\xd4\x2e\x04\xd1\x86\x58\x03\x7e\xaa\x72\x20\xc8\xe9\ \xdc\x78\x63\xcc\xe7\x7b\x5c\x8b\x9a\x80\x7b\xa5\x96\x0a\xdb\x75\ \x93\x04\xf8\x12\x00\x3c\x24\x6c\x70\xf6\xdf\xa2\x76\xa1\xd9\xc5\ \x7b\xb1\x1f\xe6\x23\x39\x6a\xe6\xef\x4b\x34\xf1\x13\x18\x87\x5a\ \xca\x06\xe1\x27\x5a\xcf\xdd\xd8\x77\x8b\xf4\x0f\x0f\x9a\x84\xa4\ \x12\xe0\x6f\x34\x8b\x52\x16\xa3\xac\x28\x61\x00\xf9\x97\x9c\xbd\ \x98\x7e\x25\x0c\xf0\x84\xef\xb0\x9c\x75\x17\x6b\xc0\xbd\xd2\xcc\ \x24\x22\x00\x9e\x30\x85\x4a\x53\x79\x77\x1b\x4d\xba\x22\xc5\x20\ \xc0\xdd\x48\x73\x71\x5b\xb1\xd8\x01\x57\x96\x5a\xe8\x02\x93\x92\ \xb4\x91\xe6\xb3\x6f\x8a\xb8\x2e\xe7\x52\x0d\xe0\x84\x8b\xfe\xe4\ \xd8\x44\xb2\x00\x4e\x25\x15\xf1\x2e\x05\x15\x51\x90\x62\x2a\x42\ \xa7\x45\x4e\x22\x4a\x2c\xbf\xc8\x79\xfb\x29\xa8\x88\x01\xb5\x8b\ \xdc\x8c\xbe\x8b\x5c\x6a\xd1\x34\xa0\x5a\x5a\xc1\xbd\xe5\xf7\x3f\ \x99\x8a\x34\x2d\x6c\x68\x00\x49\x4e\xba\xa1\x81\x8d\x05\x8d\x86\ \xc6\x5a\xac\x7f\x1b\x92\x6e\x68\xb4\x45\x1b\x1a\x56\xf6\xa8\xb0\ \xa1\x32\x75\x4c\xe5\x2c\x0d\x8b\x9b\x45\xab\xa9\xdc\x43\xd1\x54\ \x26\x7d\xc2\x69\x0c\x5b\x20\xd4\xba\x51\x77\xf6\x80\x03\x65\x29\ \x11\x67\x0f\x66\x03\x2a\x9c\x3d\x96\x78\xce\x9e\x69\x83\x9c\x3d\ \x85\xef\x5f\x21\x33\x7d\x36\x9a\xa0\x0d\x4b\xca\xba\x2b\xb1\xba\ \xc0\x3a\xf9\x09\x19\xd3\xf8\x89\x78\x6a\x41\x70\x57\x4a\xd1\x46\ \xaf\x8e\xee\x4a\xa8\x82\x35\x41\x6e\xab\x6e\x0e\x77\xfc\xd3\xa3\ \xe1\x70\x07\x76\xc1\x5b\x68\x21\x87\x7b\xe8\xf3\x80\xd2\xe3\xe5\ \x22\xcd\xf4\x1d\xee\x91\x02\xf3\x4d\x8c\xfd\xe1\xff\x87\x8c\xf4\ \x0e\x19\x85\xa2\xca\xa7\xf4\xf0\x09\x83\x40\x60\x31\x55\x83\x9e\ \xbd\xe3\x74\x83\x9e\x15\xc4\x02\x97\x61\x61\x2b\x23\x29\xab\x56\ \xfb\xeb\x34\xc3\xf6\xd1\x32\x39\x33\x97\x12\x61\x7b\x72\x4c\x04\ \x16\xd0\x07\x2d\x3e\xe4\xea\xa7\xb7\xc0\xed\x3d\x4e\x64\xf7\x58\ \xec\x7f\x27\xea\xe0\xd8\xef\x0b\x5f\x64\x26\x90\x78\x22\x25\x90\ \x42\x0a\x59\x8e\xa9\x90\x78\xc2\x9b\xc6\xf7\x96\x11\xdb\x32\x19\ \xcc\xdb\x70\xfa\x91\xad\xdd\x8b\xdc\x83\x89\x9b\xc8\x6f\xef\x8c\ \x64\x59\x8a\xeb\x36\x82\x35\xc8\xe1\xc6\x45\xd0\xe3\x86\xf6\x2c\ \x86\x24\xeb\xb8\x89\xd3\xb3\x73\xfc\x8a\xaf\x15\x58\x38\x36\x5e\ \xea\x14\x8c\x76\xcf\x74\xcc\x9a\x11\xb6\x73\x42\x73\xf5\x93\x28\ \x75\xca\xc2\x79\x62\x64\xb6\xb3\xe6\x70\x99\xec\xf1\x36\xea\x00\ \x83\xdc\xba\x13\x3f\x3f\x0d\x78\x29\x98\xb4\xea\x93\xff\x66\x14\ \x25\xff\x41\xea\xac\x5c\x0e\xdd\x05\xb7\x8f\x4f\x98\x51\xfb\x6c\ \x7b\x4a\xda\xc8\xdc\xb4\xb7\x57\x00\xbc\x91\xb1\x7d\x4b\x48\x5f\ \x05\xd7\xa5\x5e\xcd\x8b\x20\x85\x54\xe9\x58\xa0\x9c\xbe\x3a\x34\ \x32\xa7\xbc\x96\xaf\xd9\x87\x1a\x7a\x94\x15\x4c\xba\x30\x56\x9b\ \xb7\x47\xd2\x57\xdf\x30\xb3\x0f\xc4\xce\x70\x27\xfc\x12\xd0\x21\ \x4a\xaf\x32\xaa\xe1\xc0\x94\xe1\x09\xd8\x90\x3a\xab\x25\x59\xbc\ \xe6\xa2\x0f\x39\xe3\xd4\x57\x97\xd4\x74\x91\x0d\xf6\x38\x99\x76\ \x05\xf6\x17\xc9\x2c\x4b\x3d\x3b\x45\x01\x7d\x93\x5b\xf8\x68\x0d\ \x58\xd0\xda\x7b\xa6\x13\x2e\x79\x00\xc6\xe1\xee\x5b\xc9\x38\x9a\ \xae\x8d\x62\x62\xd0\x40\xd2\xb3\xe7\x55\x15\xc1\xe8\x59\x10\x08\ \xec\x62\x72\x76\x5e\x37\x70\xc7\xfd\x0b\x11\xb6\x40\xa3\x78\xb2\ \x31\xc8\x38\x9a\x08\xc6\x51\x56\xd7\x23\xca\x0b\x8e\xdb\xf9\x35\ \xdd\xc2\xfe\x45\x38\x20\x2b\xdf\xc9\xff\x85\xf4\xae\xbc\xec\xc3\ \x84\x5f\xce\xe2\xd3\x52\xc6\xd5\xd2\x3d\xa5\x5b\xe9\x99\xc0\x38\ \xdc\x83\xa3\x28\x6b\x57\xc4\x34\x4e\xb3\xb0\x7f\x52\xd4\x6f\x92\ \x6f\x37\x18\x3a\xa8\xe8\xdc\x55\xc3\x4a\x5c\xc1\x2f\x00\x0e\xa2\ \x25\x8d\x85\x88\x5e\xa2\x10\x11\x6a\x48\xf4\xac\xef\x03\xd9\x5f\ \xda\x4d\xce\xde\x6b\x8a\x0a\x11\x43\xf9\xc2\x7f\x0c\x3b\x2c\x30\ \xa3\x60\xaf\x0e\x1b\x06\x72\xb8\x94\x16\x03\x25\x94\xd2\xce\x84\ \x4b\x69\x97\x79\x81\xcf\x33\x44\x29\x2d\xf8\x73\x57\xb8\x1c\x31\ \x9f\xad\x76\xeb\x57\x44\xf9\xdf\xba\xdb\x68\xd3\x56\x07\xa1\x7b\ \xed\x7f\x50\x57\x0c\x6e\x65\xed\xe1\xc6\x47\xc7\x5a\x52\xbe\xb9\ \x5c\x4c\xe7\x4b\x97\x7e\xb3\x78\xdb\x01\x11\xef\xad\x55\xdf\x2b\ \x22\xa7\xee\x21\x08\x3b\x0b\x27\x29\xb7\x7b\x56\x1f\xc8\x30\x8b\ \x2f\xd2\x9f\xc5\x87\x2b\xfa\xc9\xb0\xd0\x3c\x9f\x07\xac\x65\x60\ \x4e\x67\x25\xbb\x4f\xd7\x75\xde\x58\x75\x20\x43\x8f\x20\x9a\xe0\ \x9e\xa8\x19\xe1\x3b\x10\x10\xbc\xd7\x9c\x50\xe7\x6a\xb2\xfa\x13\ \x1c\xf2\xc9\x6c\x4f\xab\x55\x68\xd5\x5a\x9f\xa9\xf7\xa2\x2d\x3b\ \xdd\x64\xcc\xad\x5e\xb6\x36\x59\x79\x67\x55\xd6\x2b\x9c\x74\x57\ \x51\x8b\x21\x8d\x95\x69\x0a\xb8\x24\xcf\x27\x08\xee\xd9\x46\x1f\ \xdf\xf4\x94\x98\xb9\xe3\x1b\xac\x36\x3a\xdd\x58\xa3\xdb\x7a\x1d\ \xd0\xc1\x67\xac\xb7\x40\xdb\x84\x44\x00\xce\x3d\xd2\x49\xe8\x5d\ \xfb\xd2\x06\x86\x7d\x8a\x6a\x3f\x50\x88\x90\x92\x8d\xe9\x0a\xcf\ \x5c\x5e\x55\x00\x43\xd9\x2f\xf4\xd0\xd4\x02\xee\x9e\xf7\xba\x45\ \xdd\xb2\xd3\xac\xf6\x34\x5d\x9a\xae\x62\x3b\x7b\x07\x79\xa1\xc3\ \xa7\x3a\x57\x15\xc8\xf6\x4b\xea\x67\xf1\x81\xd2\x1e\x71\x2b\x72\ \x0b\xbb\x4d\xef\xb6\xb6\x85\xa2\x16\x8b\xc7\xdb\xf8\x42\xe9\xd5\ \x00\x70\xf3\x35\x3c\x8b\x5d\x3e\xc5\x3a\x37\xb7\xb0\x33\xba\xd7\ \x7b\xb1\x96\x97\x9e\x68\x68\x56\x67\x2f\x22\x2f\x0c\x0b\xdf\x6a\ \x61\x17\xdc\x95\x09\x45\x6c\x81\x5c\xd0\x42\x72\x2c\x61\xc6\xa0\ \xea\x35\x0e\x0c\xbb\x9d\xbc\x81\xec\x7c\x27\xaa\xed\xb8\xbe\x3a\ \x8c\x0f\x19\x13\x1a\x9a\xef\x65\xe5\xb9\xc5\x3a\xd7\xc2\xe5\x87\ \x43\xf0\xc6\x36\xc7\x67\x33\x44\x2d\xc6\xb1\x31\xb2\x1a\x2c\x3e\ \x68\xed\x18\x0b\xdc\x02\x6c\xa1\x91\x46\x04\xb0\x05\x6c\xa9\x6d\ \x30\x25\x73\x84\x28\x9c\x57\xd4\xb4\xf9\x58\x0b\x62\xbb\x86\x53\ \x57\x17\x43\x16\x24\xd1\x7f\x08\xfa\xc2\x89\x7c\x0b\x02\xcf\xa5\ \x4d\xc5\xb4\x8e\x4d\x66\xf6\x6b\x64\xb8\x89\xf7\xc2\xe5\x70\x7c\ \xd5\xa3\x3b\x45\x17\x40\xe8\x6d\x01\x2d\xcb\x0e\x96\x79\xf8\xbe\ \x9c\x22\x95\x80\x2d\x34\x6a\x46\x04\xcd\x17\x42\x65\x30\x76\x8b\ \x50\xf3\x11\x79\x51\x89\x13\x9d\xb0\xf5\x18\xe2\xb8\x57\xcc\x89\ \xf1\xbd\x40\x24\x22\x73\xa7\x2b\x7a\x21\x9b\x03\xdf\x82\x71\x8b\ \x99\x96\x57\x3f\xe4\xb0\x8f\x60\x90\x6d\xd1\xaf\xb2\x81\x84\x16\ \xe8\xce\xe4\x4a\x22\xdb\x80\x6b\xc3\x3d\x90\x31\x34\xd2\xe5\x08\ \x1e\x44\xd3\x6a\x19\xd0\x3f\x8c\xac\xff\x88\xbc\x2c\xca\xc1\x37\ \x10\x82\x44\x0d\xa3\x5e\x16\x05\xd7\x82\x6b\x12\xa1\x75\x51\x24\ \x42\x9d\xb3\x3c\x85\x06\x70\x66\x68\x37\x48\x06\x52\x49\x81\x1e\ \x37\xd0\x86\x05\x0a\xa8\xeb\x7b\xe8\x65\x75\xc2\xb9\x20\xd3\x1c\ \x72\xc5\xc8\x74\x26\xb1\x45\xc6\x79\x20\x86\xa6\x38\xcc\x93\xca\ \x83\x8f\x56\xe3\x19\x0d\x8b\x87\xd4\x0b\xfb\x78\x2e\xbd\xdb\xc5\ \x27\x30\xc3\xe2\x58\x89\x41\x87\x9a\x11\x0e\xb3\x11\x78\x39\x5f\ \x73\x14\x0b\x80\x6d\xf0\x1d\xec\x03\x7f\x20\xc8\x2c\x87\x63\x45\ \x0d\x31\x62\xbe\xb0\x8f\x73\x40\x68\x3d\x29\xbc\xd6\x10\x5a\xc7\ \x38\xbe\x09\x7d\xc5\x20\xc4\x6d\xd8\x2b\x27\x61\xb6\x32\x5c\xa6\ \x64\xc6\xcd\xc7\x75\x88\x5f\x9a\x2a\xe6\xd2\x09\xca\x47\x89\xbe\ \x34\xf5\x63\x37\xe0\x27\x0b\x29\xf7\x18\x98\xdf\x40\xa7\x10\x68\ \x66\x11\xe2\xd6\x1d\xc1\xa6\x79\x50\x91\x2a\xbc\xf6\x17\x7f\x0e\ \x36\xd2\xeb\x80\x7d\xa0\x9a\x07\x8e\x81\x16\x2e\x70\x8e\x54\xfa\ \xf9\xff\x0f\x78\xd4\x06\x30\x4d\x58\xbb\x29\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x26\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\x71\x50\x4c\x54\x45\x00\x00\x00\xff\xff\x00\xff\x80\ \x00\xff\xaa\x00\xff\xcc\x00\x49\x49\x6d\xdf\xbf\x20\x39\x55\x55\ \xe3\xc6\x1c\xe6\xb3\x1a\xe8\xb9\x17\xea\xbf\x15\xeb\xb1\x14\xed\ \xb6\x12\xee\xbb\x11\xef\xbf\x10\x69\x78\xb4\xf1\xb8\x1c\x5e\x6b\ \xa1\xe6\xbf\x1a\x43\x4e\x64\xed\xb6\x12\xee\xbb\x1a\xef\xbd\x19\ \xe9\xbc\x17\xea\xb8\x15\xea\xba\x15\xec\xb9\x13\xec\xbb\x19\xed\ \xbc\x18\x57\x68\x91\xee\xb9\x17\x5b\x66\x93\xe9\xb8\x16\x5e\x68\ \x92\xeb\xb9\x14\xeb\xbb\x18\x43\x4a\x60\x42\x49\x5f\xea\xb9\x15\ \x41\x4b\x5f\xeb\xbb\x14\xeb\xb9\x17\xec\xb9\x16\xec\xba\x16\xec\ \xbb\x16\xeb\xb9\x16\xea\xba\x15\x60\x6d\x9a\xea\xb9\x17\xeb\xb9\ \x17\xea\xbb\x15\xea\xb9\x15\xeb\xbb\x16\xeb\xb9\x16\xec\xba\x15\ \x5d\x69\x94\x5e\x6e\x97\xeb\xb9\x16\xec\xbb\x15\xea\xba\x17\xea\ \xba\x17\xeb\xbb\x16\xeb\xb9\x16\xeb\xba\x16\xeb\xba\x16\xeb\xbb\ \x16\xec\xba\x15\xec\xba\x17\xec\xb9\x17\xea\xba\x17\xea\xba\x16\ \xeb\xb9\x16\xeb\xba\x16\x41\x4a\x60\xeb\xba\x15\xec\xba\x16\xea\ \xb9\x16\xeb\xba\x16\xeb\xba\x15\xeb\xba\x17\xec\xba\x17\x42\x49\ \x61\x42\x4a\x5f\x43\x4a\x60\xeb\xba\x17\xeb\xba\x16\xeb\xba\x17\ \xeb\xba\x16\xeb\xba\x16\xec\xba\x16\xea\xba\x16\xeb\xba\x16\xeb\ \xba\x17\xeb\xbb\x16\x42\x4a\x60\xeb\xba\x17\xeb\xba\x16\xeb\xb9\ \x16\xec\xba\x16\xeb\xba\x16\xeb\xba\x16\x6b\x79\xb0\x6b\x7a\xb0\ \x62\x70\x9f\xeb\xba\x16\x42\x4a\x60\xeb\xba\x16\x42\x4a\x60\x6c\ \x7a\xb2\x6d\x7b\xb3\xeb\xba\x16\xeb\xba\x16\x66\x73\xa4\xeb\xba\ \x16\x42\x4a\x60\x44\x4c\x63\x66\x74\xa6\x66\x74\xa7\x71\x81\xbb\ \x72\x81\xbd\x73\x83\xbf\xeb\xba\x16\xdf\x95\x81\x76\x00\x00\x00\ \x73\x74\x52\x4e\x53\x00\x01\x02\x03\x05\x07\x08\x09\x09\x0a\x0b\ \x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x17\x1c\x1e\x1f\x22\x24\x25\ \x28\x29\x2a\x2c\x2c\x2d\x2f\x31\x33\x40\x45\x46\x49\x4b\x4b\x4c\ \x50\x51\x52\x5b\x60\x62\x63\x66\x6d\x6e\x74\x75\x77\x7c\x80\x80\ \x83\x86\x88\x8a\x8b\x8c\x8d\x8e\x90\x91\x92\x93\x94\x96\x97\x98\ \x9b\x9f\xa1\xa6\xa7\xa9\xaa\xb1\xb3\xb4\xb5\xbd\xc0\xc1\xc4\xc5\ \xc7\xc8\xcc\xcd\xd5\xd7\xda\xdc\xdf\xe3\xea\xec\xec\xef\xef\xf6\ \xf6\xf8\xf8\xf9\xfa\xfc\xfd\xfe\x49\x52\x14\x49\x00\x00\x01\xf1\ \x49\x44\x41\x54\x58\xc3\xed\xd8\x57\x57\xc2\x30\x14\x00\xe0\xa0\ \x88\x8a\x0c\x27\xee\xbd\xf7\x16\x45\x9c\xa8\xb8\xf7\x00\xf7\xde\ \x1b\x57\xf3\xeb\x4d\x4b\xa5\x49\x11\x84\x26\xf1\x29\xf7\x31\xb9\ \xf9\x9a\xd3\x34\x39\x37\x05\x80\x26\x2a\xcf\x4e\x4a\x00\x8f\x18\ \x83\xd0\xc3\x05\x9e\x86\x70\x44\xc0\x4c\x61\xa7\x7f\xdc\x1a\x1f\ \xb6\xfb\xa6\x6c\x06\xe0\x61\x08\x03\xd6\x78\xb0\x63\x1f\x42\xb7\ \x01\xb8\x07\xea\x64\x1d\x2c\xbb\xb0\xc3\x00\x6c\x9a\x41\x03\x83\ \xb6\x58\xb0\x63\x0f\x75\x4f\x1a\x7a\xc9\x7a\x99\x80\x29\xdc\x28\ \x19\x87\xa9\x5c\x24\xfb\x71\x79\x54\xdb\xd2\x94\xae\x4e\x2e\x3f\ \x3d\x2e\x66\xe4\x22\x79\x0e\x11\xdb\x29\x64\xa3\x79\x17\x35\x4e\ \x50\x6e\x13\x45\x2e\x25\xdb\x6a\x19\xb8\x48\xf6\xbd\x06\xcd\x64\ \x53\xc6\xc1\xab\x97\xc5\xde\xce\x8a\x7e\x98\x95\xed\x29\x54\x95\ \xcd\xe5\x70\x03\x15\x0f\x97\xb9\x7c\x5c\x49\xe2\x21\xcb\x2e\x0f\ \x39\xec\x4a\xd2\x15\x8d\x5c\xbd\xb4\x16\x89\xe5\x66\xc2\x8d\xc8\ \xed\x2b\x5a\xce\x62\x59\x82\xf0\x21\xc4\xe2\xce\x42\xb8\xaa\xec\ \x7c\xc2\x73\x02\x09\xc2\x5b\xf8\xa0\xf3\x54\x00\x6a\x1e\x35\x57\ \xfa\xec\x42\x29\x96\x0b\x3c\x67\x35\x41\xd8\xde\xe3\x8e\x44\xaf\ \x8b\x9c\xaf\xf4\x35\xa4\xe4\x14\xf5\x69\x39\xdd\x56\xba\x75\xc3\ \x5d\x96\xdf\x83\x70\xff\xd5\x75\xb5\x98\xb9\xb8\x79\x37\x70\x87\ \xea\x44\xce\xbf\xc6\xf7\xc5\xa0\x56\xda\xeb\x6b\xa4\x64\xdd\xa3\ \xb7\x0f\x62\xbe\x85\x05\x6a\x8f\x9f\x4a\xce\x3f\x0a\x85\x22\xb2\ \xec\x36\x3e\x3f\xd5\xc5\xa8\xbe\x92\x75\x91\xfc\xae\xbd\x5f\x1f\ \x84\x5e\x40\x2d\x87\x5d\x55\x0e\xaf\x1b\x5e\x62\x19\x96\x7f\x5c\ \x45\x56\xbf\x07\xa2\x28\x34\x28\x6b\x2e\x92\x5f\x06\x7f\x2b\x63\ \x4d\xb3\xf2\x0a\x66\x1a\x77\x43\xf7\x4d\xbf\x17\xde\x8a\xdc\xcf\ \xc0\x8d\xba\x2a\xc8\x72\x27\x03\x37\xfa\x72\x63\x6a\x6d\x33\x31\ \x70\x69\xaf\x63\x31\x5d\x4a\x38\xb6\x4b\x07\xc7\x71\xa9\xe0\x78\ \x2e\xf0\x40\x38\xc0\xc3\x05\x39\x8b\x0b\x76\x1e\x2e\x97\x75\x13\ \xae\x70\x85\x2b\x5c\xe1\x0a\x57\xb8\xc2\x15\xae\x70\xff\x8e\x79\ \xcc\xbd\x6d\x60\xf8\x87\x32\x6d\x83\xcb\x7c\x71\x99\xb1\x8b\xe4\ \x4d\x3e\xae\x2a\x73\x70\x15\x99\x8b\x0b\x40\xfa\x7a\x3d\x6b\xf2\ \x1b\x49\x0f\x08\x6e\xb9\x87\x4d\xaa\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x02\xd6\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x58\x00\x00\x00\x58\x08\x03\x00\x00\x00\x46\x4b\xc0\x06\ \x00\x00\x01\x0b\x50\x4c\x54\x45\x00\x00\x00\x00\xff\xff\x80\x80\ \x80\x55\xaa\xaa\x80\x80\xbf\x80\x80\xaa\x6d\x92\xb6\x74\x8b\xb9\ \x70\x80\xbf\x78\x87\xc3\x71\x80\xb8\x6f\x85\xbc\x70\x85\xc2\x76\ \x80\xba\x72\x84\xc1\x73\x84\xbd\x70\x80\xbf\x74\x83\xc1\x71\x80\ \xbc\x72\x86\xbc\x76\x83\xbe\x70\x83\xc1\x71\x82\xbe\x72\x82\xc1\ \x73\x82\xbe\x71\x84\xbd\x74\x82\xbe\x72\x84\xbf\x71\x82\xbe\x72\ \x81\xc0\x74\x83\xbd\x73\x81\xc0\x74\x84\xc0\x74\x84\xbe\x73\x83\ \xbf\x73\x84\xc0\x73\x84\xbf\x72\x82\xbe\x73\x84\xbf\x72\x83\xbf\ \x74\x84\xbe\x74\x84\xbf\x74\x83\xbf\x72\x83\xbf\x74\x83\xbe\x72\ \x83\xbe\x73\x83\xbe\x74\x82\xc0\x72\x84\xbf\x73\x84\xc0\x72\x83\ \xbf\x73\x84\xc0\x73\x83\xbe\x73\x83\xbf\x73\x83\xc0\x74\x83\xbf\ \x74\x82\xbf\x73\x83\xc0\x72\x82\xbf\x73\x84\xbf\x73\x84\xbf\x73\ \x83\xc0\x73\x83\xc0\x73\x83\xbf\x73\x83\xc0\x73\x83\xbf\x73\x83\ \xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x84\xbf\x73\x83\xbf\ \x73\x83\xbf\x73\x83\xc0\x74\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\ \x83\xc0\x73\x83\xbf\x73\x83\xbf\x72\x83\xc0\x73\x83\xbf\x73\x83\ \xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbf\x73\x83\xbe\x73\x83\xbf\ \x73\x83\xbf\x90\x30\xd9\x6f\x00\x00\x00\x58\x74\x52\x4e\x53\x00\ \x01\x02\x03\x04\x06\x07\x0b\x10\x11\x12\x17\x19\x1a\x1d\x1f\x20\ \x21\x22\x26\x27\x29\x2b\x31\x33\x36\x37\x38\x3f\x41\x42\x45\x4d\ \x4f\x50\x59\x5b\x5e\x5f\x6b\x6e\x70\x77\x7f\x82\x86\x8a\x8d\x93\ \x95\x9c\x9d\x9e\xa7\xa9\xaa\xac\xad\xb0\xb8\xba\xbd\xc5\xc7\xc9\ \xcf\xd2\xda\xdc\xde\xdf\xe2\xe3\xe5\xea\xec\xee\xf1\xf2\xf3\xf5\ \xf6\xf7\xf8\xfa\xfb\xfd\xfe\xe0\xb2\xd6\xd8\x00\x00\x01\x22\x49\ \x44\x41\x54\x58\xc3\xed\xd8\xc7\x4e\x02\x00\x10\x45\xd1\xb1\x81\ \xbd\x61\x6f\xd8\x0b\xf6\x8e\x5d\xb1\x62\x2f\x28\xf7\xff\xbf\xc4\ \x85\x26\x22\x6c\x34\x99\x97\xb0\x98\xfb\x01\x67\x39\xc9\x3c\xb3\ \x28\x8a\xaa\xbf\xa1\xa9\x94\x82\x6d\xd8\x81\xe2\xb2\xbf\x9b\x3c\ \x00\x20\xed\xed\x36\x1e\x03\xc0\x8a\xb3\xdb\x72\xf6\xe5\xb2\xee\ \xeb\x76\x9c\x23\x81\x7b\x6f\x90\xc0\x03\xb7\x48\xe0\x91\x07\x24\ \xf0\xf8\x0b\x12\x78\xba\x80\x04\x9e\xfb\x40\x02\x67\x40\x01\xd7\ \xac\x22\x81\xeb\x36\x91\xc0\x89\x3d\x24\x70\xf2\x10\x09\xdc\x74\ \x82\x04\x6e\xcd\x21\x81\x53\x57\xf8\xc0\x6d\x8b\xdb\xbb\x25\x1d\ \x15\xf0\x81\x7b\xee\xf9\x63\xff\x84\xb3\x88\xe0\x4b\x15\x9c\x0f\ \x38\xe0\x80\x03\x0e\x38\xe0\xea\x82\x4f\x55\xf0\xbc\x0a\xae\x5d\ \x7a\xd6\xc0\x66\xf5\x9d\xdd\x25\x0d\x6f\xb8\xc1\x15\x3f\x42\x51\ \x04\xdb\xec\xbb\x08\xb6\xc9\x37\x11\x6c\x63\x4f\x22\xd8\x06\xef\ \x44\xb0\xf5\xe5\x45\xb0\x75\x5d\x88\xe0\xca\x57\xc4\xed\x97\x2e\ \x7f\x9e\xfc\xbe\xff\xb2\x77\xcf\x71\xaf\x48\x64\x45\xf0\xef\x97\ \xda\x75\x13\x2a\x1d\x01\x9c\xe7\xb1\x8c\x0a\xfe\x19\x5a\xbc\x61\ \x9b\xf9\x3e\x76\x6b\xee\xa3\xe9\xc4\x2b\x00\x0b\xfe\x73\xec\xe8\ \x23\x70\xdd\x2c\x18\x90\xfb\xf7\x73\x5b\xed\x16\x45\x51\xe4\xd5\ \x27\x0a\x3c\x3e\xcc\xc3\x8c\x41\xd2\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x01\x36\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\xfd\x49\x44\x41\x54\x78\x01\x63\x20\x05\x14\xca\xf4\ \x71\x3e\x2e\xb4\xe4\x64\xa0\x36\x68\x10\x6d\xe0\xa9\x90\x69\x6d\ \xa8\x90\x69\x9b\xfc\xaa\xc4\x6a\xea\x9b\x12\x9b\x89\xef\x0b\x1c\ \x04\xa8\x60\xf4\x7f\xc6\x72\xe9\xd6\x38\x20\x7e\x01\xc4\xff\xcb\ \xa4\x5b\x67\xbe\x2e\xb5\x9a\xf9\xba\xc4\xfa\x3f\x10\xbf\x7d\x55\ \x6c\x93\xff\x3f\x34\x94\x99\x2c\xa3\x2b\x64\xdb\x4d\x81\x86\x1e\ \x07\x19\x0c\xc2\x18\x16\x20\xf0\x39\xa0\x45\x36\x44\x1b\x5c\x26\ \xdb\x29\x55\x21\xdd\xb2\x08\x68\xe0\x3f\x84\xe1\x98\x16\x60\xe0\ \x62\xab\xcd\xef\x8b\xad\xe4\x71\x1a\x9c\x66\x3c\x93\xb5\x5c\xa6\ \x35\x1f\x68\xd0\x27\x98\x81\x04\x2d\xc0\xc4\x5f\x5f\x97\xd8\x34\ \xdc\x6f\x70\xe0\xc0\xb0\x00\x68\xc0\x1d\x98\x41\x64\x5b\x80\xc0\ \x77\xb0\x59\xf0\x9f\x8a\x16\xfc\xa7\x83\x05\xa3\x16\x8c\x5a\x30\ \x6a\x01\xbd\x8b\x0a\x44\x61\x07\xc4\x1f\xa9\x5c\xd8\x61\x16\xd7\ \x20\x83\x80\x06\xfe\x25\xc1\x82\x7f\x6f\x4a\xac\x57\xbd\x2b\xb7\ \x91\xa3\x41\x85\x63\x75\x16\x54\xe1\x50\xbd\xca\x7c\x55\x62\xfd\ \x06\x56\x65\xd2\xa4\xd2\x7f\x57\x6e\xcc\x4f\x8c\x5e\x9a\x37\x5b\ \x00\x76\x3d\x36\x28\xad\x67\x1e\x38\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x18\x55\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ \x00\x00\x18\x1c\x49\x44\x41\x54\x78\xda\xed\x5d\x05\x54\x5b\x49\ \x14\xcd\xba\xfb\xd6\x02\xeb\xbe\x55\xea\x0d\x74\x97\xae\xbb\xd7\ \xdd\xa8\x63\x31\xa4\x92\x16\x87\xba\x53\x77\x17\xb6\xee\x5b\xa5\ \xee\x58\x70\x97\x08\xee\xd2\xb7\x93\x77\x38\x9f\x4e\x02\x69\x0a\ \xe9\x27\x1f\xfe\x3b\xe7\xad\x44\x7e\x4f\x73\xef\xcc\xd3\x79\x23\ \xe0\x85\x17\x5e\x78\x69\x5e\x22\x7f\x7b\x56\x5b\xfd\xd7\xb4\x72\ \x5b\x7c\x8d\x97\x26\x2c\x32\xab\x00\x6b\x37\x2b\xef\x0d\x72\x2b\ \x9f\x58\xfd\xf7\xd4\x52\xdb\x38\xb5\x58\xb4\x3f\x53\xf2\xc5\x7b\ \x02\x5e\x9a\x96\x28\x84\x8a\xe7\xdd\xac\x7d\xe4\x04\xf8\x02\xa2\ \x40\x34\xae\x56\x02\x48\x6c\x81\x68\xb1\x4a\x22\xf2\x57\xcb\x6c\ \x5f\x12\xf0\xc2\x75\x81\xc7\xc8\x8a\xef\xeb\x66\xe5\x93\x58\x0d\ \x3c\x3c\x98\x00\x8c\xa6\xa9\xc5\x76\x0e\xa0\x10\x3c\x2e\xe0\x85\ \x7b\x22\x7b\xcb\xbb\xab\xcc\xca\xe7\x3c\x05\xbc\xa9\x04\xa0\xf5\ \xaa\x4a\x6c\x67\x27\xe0\x85\x2b\xc0\x07\x08\x09\xf0\xc1\x04\xe4\ \x2a\xa2\xd0\x70\x02\xa0\xde\xd3\x48\x6c\x77\xe4\x88\x45\xef\x08\ \x78\xb1\x4c\x71\xb1\x9e\xfb\x5c\xb5\x9d\xcf\xa7\xc0\x6e\x28\x01\ \x68\x2d\xd2\xf9\x07\xaa\x89\xf6\x2f\x0a\x78\xb1\x1c\x91\x0b\xbd\ \x7f\x25\xa0\x26\x50\x20\x9b\x9b\x00\xb4\xa6\x6a\xa4\x76\xc3\x40\ \x20\x78\x4c\xc0\x4b\xe3\x89\x54\xe8\xd3\x99\xac\xfa\xb3\x0c\xb0\ \x6c\x10\x80\xd6\x2b\x5a\x89\xa8\x17\x8f\x04\xcb\xe2\xf1\x8e\x4f\ \x9b\x6a\x3b\x5f\x49\x14\x1a\x87\x00\xb4\x7f\x90\x2d\xb7\x7b\x9b\ \x47\xe6\x11\x8b\xa2\xad\xe2\x69\xb9\xb5\x8f\x13\xd1\x3c\x0a\xd0\ \xc6\x22\x00\xad\x45\x6a\x89\x9d\x22\x41\x61\xff\x2c\x8f\xd4\xa3\ \xb3\xf3\x71\x14\x90\x16\x42\x00\x5a\xed\x52\x78\xff\xc0\x8c\xe2\ \x26\xf4\xb3\x21\x89\x9c\xd3\x14\x80\x96\x4a\x00\x5a\x2f\x69\x5d\ \x6d\x7b\xf2\x08\xd6\x53\xdc\xad\x7c\xdf\x70\x13\xfa\x2e\xa0\xec\ \x3c\xa7\x08\x80\x5a\xa5\x96\x88\x36\xa8\xa4\xf6\xad\x79\x44\x4d\ \x14\x87\x2e\xc1\x4f\xa1\x9d\xb7\xf2\xc9\xa5\x40\xe3\x1a\x01\x68\ \x2d\x34\xdd\x3f\xe0\xed\x7c\x2c\x05\x16\xd7\x09\x40\x6b\x92\xce\ \x3f\x10\xf0\x42\x8b\xbb\xd0\xf7\x53\x02\xca\x21\x0a\xa4\xa6\x45\ \x00\x5a\xc5\xb6\xa7\xb2\x5c\xed\x3a\x0a\xf8\xf4\xad\xe2\xf5\x6a\ \x3b\x5f\x41\x14\x9a\x07\x01\x68\xff\x20\xcb\xa9\x47\xab\x66\x69\ \xe7\x49\x06\xcf\x81\x00\xa1\xa6\x80\x69\x2e\x04\xa0\x35\x47\x23\ \xb1\x93\xc7\x4c\xf9\xf1\x99\x66\x12\xd6\x79\x7d\x23\x17\xfa\x86\ \x31\x60\xf0\x04\xa8\x56\x51\xb4\x4a\x6a\xd7\xb7\xe9\x96\x69\x85\ \x5e\x9f\x90\x1f\xfe\x00\x05\x04\x4f\x00\x43\x95\x8a\x4e\x64\xba\ \xf4\x6a\xdf\x74\x56\xfc\xdb\x7e\xaf\xc9\x84\x3e\xfe\xe4\x47\x2f\ \x23\x0a\x3c\x01\x4c\xd2\x0a\x42\x84\xe0\x0c\xf7\xde\x2d\xb8\x9b\ \xb7\x17\x28\x9e\xac\xb6\xf3\x2a\x7d\x00\x9a\x34\x01\xe4\x5f\x40\ \xf6\x7a\x17\x28\xbc\xb4\x06\x8a\xc3\x77\x43\xe1\x85\x95\xa0\x0d\ \x1e\x47\x56\xb6\x5d\x7d\x9e\x97\xad\xf3\x0f\x40\xd1\xf6\x69\x8e\ \x75\xdf\xfa\x7c\x2d\xb7\xf2\xbd\x63\x04\x80\xa6\x49\x80\x99\x3f\ \x43\x69\xc2\x51\x80\x7b\x31\x06\x5a\x12\xb9\x17\xd4\x53\xbf\xad\ \xef\xb3\x95\x84\x40\xbf\x58\x7e\x7d\xde\xda\xeb\x23\x02\xfc\x0e\ \x16\x00\xb4\x3c\x02\xc8\x7a\x53\xe0\xd7\xa6\xc5\x61\x3b\x1b\xba\ \xc3\x1c\xb7\xc8\xf3\x0b\xce\xef\x2a\x5e\xad\xb6\xf3\xa5\x44\xa1\ \x39\x12\x20\x7b\x9d\x33\x05\x76\x65\xde\x75\x28\xb8\xbd\x1b\xaa\ \x8a\xef\x52\xaf\x6b\x97\x8e\x6e\x28\x09\xca\x75\xfe\x41\xba\xd8\ \xfe\x4d\x4b\xb0\xf3\x8f\x93\x1f\x73\x18\x59\xf5\x59\x2c\x80\x66\ \xd1\x04\x28\xbc\xba\x81\x01\xb9\x22\xe7\x2a\x44\x8e\xeb\x0d\x77\ \xfb\xb5\x03\xa5\xe3\xb7\x70\xaf\x2c\x9c\x79\x2f\xff\xd4\x42\x73\ \x39\x8a\x5a\xd2\xad\xec\x04\x0a\xfb\x27\x1b\xc7\xbb\xb7\xf2\xfa\ \x8a\x94\x69\x6f\xb3\x00\x16\x27\x08\x50\x1c\x15\xc2\x80\x9c\x77\ \x69\xa3\x0e\x7c\x46\x8b\x63\x0f\x33\xef\x15\x5e\x59\x6f\xee\x88\ \x21\x52\x25\xb5\xfd\x89\x3d\xe0\xad\xfd\x3e\x34\xb4\xf3\x3c\x01\ \xf2\xce\xad\xbc\x6f\xfb\xbf\x01\xb1\x2e\xdf\x80\x72\x6c\x17\x88\ \xf7\xfc\x1d\xee\x95\x47\x32\xef\xe5\x1c\x9e\x67\x4e\xf0\x69\xff\ \x40\xdc\xfb\xf3\x47\x06\xbc\xa4\x55\xd0\x0b\x24\xac\x53\xd4\x6e\ \xe7\x79\x02\xa4\x2e\x18\x47\xd9\xfa\xaa\x92\x30\x28\x4d\x3c\x0a\ \xf7\x2a\x22\xa9\xd7\x53\xbc\xfb\x3f\xca\xfc\x41\x39\x09\x1b\x17\ \x64\xcb\xbb\xbc\x62\xe6\x32\xad\xff\xdb\xc6\xed\x3c\x4f\x80\xd8\ \x29\x7d\xa0\xaa\x34\xdc\x68\x14\x90\x7b\x6e\x0d\xc4\x8e\xb2\x61\ \x23\x91\x94\x65\xd6\x26\x55\xa9\x95\x4f\x27\x4b\x06\xd4\xbf\xe7\ \x3c\xd8\x3f\x63\x27\xdc\xd9\x77\x0a\x92\xaf\x5f\x86\xdc\xd4\xdb\ \x50\x9c\x1b\x0e\xf9\x59\x77\x41\x1d\x7b\x03\x62\xce\x9e\x87\xd0\ \x35\x87\x61\xb7\x6c\x1b\xcc\xff\x66\x09\xb8\xbf\xed\x67\x56\x02\ \x68\x7c\xff\x80\xb2\xb4\x33\xc6\xc1\x3f\xbf\x06\xc2\x87\x74\x86\ \xa4\x71\xdd\xd8\x20\x00\xa8\xa4\xa2\x4e\x4d\x9e\x00\xc1\x7f\xaf\ \x80\x98\x33\xe7\xe1\x5e\x15\xfe\xc8\x26\x6b\x4e\xd2\xad\x72\x81\ \x9e\x94\x28\xff\x2d\x2e\x89\xde\x07\x85\x17\x57\x43\x6e\xc8\x2c\ \xd0\x2e\x1e\x01\x6a\xf9\x97\xc6\x81\x77\xfb\x12\x72\xf7\xcc\x20\ \xdb\x3d\x1d\xea\x95\x24\x9e\x00\xf5\xbe\xd9\x04\xf4\xb5\xf8\xef\ \xb8\x69\x7d\xd1\x19\x0c\xeb\xdf\x1e\xb2\x5c\x44\x3c\x01\x1a\xaa\ \x33\xdb\x06\xc1\xcd\x3d\x27\x8d\x80\x6c\x5c\xc9\xce\x50\x29\xd0\ \x93\x0a\xed\xc5\x0a\xfd\xcf\x55\x95\x86\x41\xf1\x9d\xed\xa0\x5d\ \xeb\x88\x60\xe3\x8f\x3b\xed\x5b\xd0\x2e\x1f\x0b\xf9\xc7\xe7\x93\ \x70\xef\x8a\xfe\xb3\x11\xfc\xc8\x31\x22\x04\x9c\x51\x04\xbf\x1d\ \xa4\x4c\xea\x51\x1f\x30\x79\x02\x4c\xfd\x20\x90\xf9\x6f\xdd\x16\ \xae\x4d\xbc\x55\xfb\xca\xce\xbc\x09\x17\x76\xed\x83\x83\x4b\x36\ \xc3\x36\xef\x55\xb0\x3b\x70\x1d\x1c\x59\xb1\x15\xee\xfe\x77\x1c\ \x0a\x34\x77\x6a\x3e\x97\x71\xeb\x9e\x40\x4f\xca\xd5\xa1\x95\xc6\ \x48\x53\x55\x7c\x07\xaa\x0a\x6b\xfd\x73\xa9\xf0\x2f\x62\x64\x4f\ \x03\xf0\xa3\x86\x74\x84\xf4\x29\x26\x83\x8f\x75\x83\xec\xcd\x52\ \x28\x89\x0a\x41\x92\x95\xa5\xff\x07\x05\xe7\x57\x80\x26\xe0\xef\ \xe6\x45\x00\xc5\xc7\x73\x61\xf5\xcf\xdb\xe1\xe0\x84\x33\xb0\xa4\ \xcf\x06\x58\xf8\xe3\x52\x28\xca\xa6\x1d\xad\x7b\x55\xd1\x10\xba\ \x67\x1f\xb8\xf7\xf1\x80\x41\x2d\xc6\xc0\xc0\x37\x47\xd7\xa9\x53\ \x6c\x5c\x61\xee\xf0\x40\xd8\xee\xb3\xa6\x4a\xa0\x27\xaa\x5d\x3e\ \x55\x3a\x00\x4b\x93\x4e\x12\xcf\x5d\xf9\x50\x3b\x4a\x79\xd6\x05\ \x48\x59\x3c\x85\x01\x3c\x61\x6c\x57\xc8\x74\xee\x05\x69\x53\x7a\ \x02\x29\xed\x9a\x00\x18\x65\x56\x30\x65\x5c\xcb\x9f\x83\xe1\x64\ \xf6\x26\x49\xd3\x27\xc0\xac\xcf\xe6\xc3\xda\xdf\x76\xc1\xc1\x89\ \x67\xe1\xd0\x24\x54\x38\x3d\xe3\x02\x94\xe4\xd2\x21\x55\x72\xf8\ \x05\xf0\xf8\xda\x93\x01\x78\xf0\x9b\x63\x61\x54\xcb\x29\x30\xb6\ \x95\x33\x8c\x6b\x2d\x06\x87\x56\xae\x30\x86\xfc\xf7\x88\x96\x93\ \x60\x10\x79\xaf\xe6\x73\x0e\x06\x26\x20\x62\x50\x87\xf2\x6a\x00\ \xd1\x59\x4b\xf0\x1e\x02\x9a\x03\x73\xc9\x0a\xbc\x56\x27\xf0\x24\ \xc1\x43\x80\x9f\x0c\x61\x83\x6d\x18\xf0\x13\x1d\xba\x36\x68\xeb\ \x2e\x38\xb3\xd4\x18\xd9\x08\x39\xa3\x40\x3b\x77\x50\xd3\x24\x80\ \x57\xdb\xf9\xb0\xfe\x8f\xdd\x70\x10\x41\xaf\xd1\xa3\x2e\xe7\xa0\ \x20\x8d\x06\xff\xfa\xe1\xc3\x30\xe2\xad\xf1\x3a\x40\x11\x74\xe7\ \x36\x53\x41\x56\xf7\xb3\xf1\x3d\x97\x36\x33\x60\x72\x6b\x37\x18\ \xdb\xd2\x35\xc7\x08\x01\x28\x0d\x1b\xd4\x09\x92\xe7\x8d\xc3\x9d\ \xc1\x60\xe5\xab\x2f\x41\x8c\xf8\x27\xfc\x5c\xc4\xa0\xf6\x90\x36\ \xb9\x47\x83\xab\x89\xf7\x2a\x6b\x76\x9f\xca\x82\x5b\xa0\x3d\xb2\ \x10\x0a\x6e\x6c\xa7\xfe\xdc\xa2\x9b\x9b\x9b\x16\x01\x7c\x3b\x2c\ \x86\x8d\x7f\x87\x20\xd8\xb5\x69\xe2\x7f\xb4\xed\x55\x9e\x3f\x0b\ \x43\x85\x0e\x30\xb4\xc5\x78\x04\xde\x1c\x79\x80\x0c\xe7\x9e\xc9\ \xba\x2d\x3b\x79\x7c\x37\x88\x1b\xdd\x05\x22\x07\x77\xa0\x89\x30\ \xa0\x03\xa4\x2e\x75\x24\xa0\xdc\xa4\x8b\x3e\xe4\xff\xd3\x02\x87\ \x80\xca\xb5\xe1\x8e\x5b\xf6\x46\x31\xf5\xec\xf8\x19\xfd\x98\x3f\ \x3f\xe7\xec\x1a\xe6\x75\xe2\x8b\x34\x09\x02\x20\xf0\x5b\xfa\xed\ \x33\x00\xfc\x42\xe0\x25\x88\xfa\xf7\x06\x24\x9c\xb8\x85\x0a\xf7\ \x85\x79\x85\x19\x91\x70\xc4\xf9\x0c\xb8\x77\xf0\x06\xa9\x95\xd7\ \x23\x4d\x04\x65\x3a\x8b\xd0\x9e\x93\xdd\xa1\xc6\xa1\x9b\x60\x0f\ \x85\xe1\xff\x1a\x44\x0b\x9a\x39\x03\x1a\x4c\x80\xdc\x9d\x9e\xd4\ \x73\xc3\x87\x75\x65\xfe\xdc\x8c\x4d\xd3\x98\xd7\xc9\x2e\x81\x8e\ \x22\x37\x09\x60\xed\x0b\x81\x5d\x96\xc3\xf6\xc1\x87\x0c\x80\x3f\ \x33\x33\x14\xb2\x63\xc2\x8d\xd8\xbf\x18\xb8\x10\x70\x11\x3f\x7b\ \x60\xfc\x7f\x48\x20\x36\x32\x81\x2a\xa2\x49\x64\x67\x08\x1f\x88\ \x44\x80\x30\xf2\xef\x9c\xff\x82\xe9\x9d\x20\xe7\x2a\x6e\xe1\x0d\ \x0a\xdd\x16\x8f\xa6\x9e\xa9\xd9\x3f\x1b\x62\x26\xf7\x84\x78\xf7\ \x1f\x48\x24\x70\x96\x79\x9d\x24\x9d\xb8\xb7\x03\xb8\xbd\xe5\x0b\ \x73\x7b\xae\x84\x5d\x43\x8f\xd4\xba\xcd\x9f\xf3\x0d\x85\xf2\xc2\ \x68\xe3\x0e\x50\x65\x0c\x5c\x5d\x76\x99\xf9\xce\xbf\x63\x4f\xa2\ \xc3\xc8\x56\x2a\x58\x25\x16\x91\x54\x6e\x67\xc0\x55\xd9\xdf\x80\ \x04\x98\xfb\xcf\x3f\x36\x97\xe4\x08\xe6\x11\x6f\x5d\x0c\x6a\x8f\ \x3e\x0f\x45\x80\xe4\xc9\xbd\xa0\x42\x7b\x99\xfe\x3b\x93\xdd\x05\ \x2a\xe9\xa8\x24\x6b\xc7\x2c\xee\x11\x60\xf5\x2f\x3b\xea\xb4\xf1\ \x47\x1c\xcf\x42\x61\x26\xed\xe4\x55\x91\x50\x4c\x9d\x74\x0d\x4a\ \x8b\x22\xe8\x95\x56\x12\x0d\x27\x3d\xce\x33\xdf\x0d\x19\x73\x92\ \x84\x8b\x73\x58\xad\x05\xa4\x4c\xe8\x4e\x08\xd0\x9e\xec\x04\x1d\ \xa1\x30\x2c\x84\x26\x2a\xdd\x14\x82\xfd\x80\x26\x13\x60\x42\x37\ \x48\x0c\x1c\x45\x39\x82\xfa\x5a\x92\x70\x1c\x22\x86\x77\xe3\x1e\ \x01\x76\x0c\x39\x54\x27\x01\x6e\x6f\xbc\x4a\xfd\x25\x6f\x1e\x3f\ \x02\x13\xda\x3a\xa2\x87\x3f\xfa\xfd\x89\x70\x38\x78\x1b\xf5\x7e\ \xe2\xa9\xdb\xd4\xf7\xf7\x8c\x3c\x06\xd3\x3f\x0c\x62\xb5\x18\x44\ \x3c\x7e\x4c\xed\xc6\x4d\xef\x47\x83\x54\x4b\xec\xae\x59\x30\xd4\ \xa4\x67\x66\x3a\x61\x12\x09\x8a\x22\xf7\xd5\xf6\x2c\x8c\x06\x22\ \xc7\xda\x81\x72\xb8\x0d\xb7\x08\xe0\x4e\xec\xfe\x81\x09\xa7\xeb\ \x24\x40\xe6\x8d\xbb\x54\x36\x8f\x84\x77\x4c\x5c\x3f\xa8\x3a\x76\ \xbf\x7b\xfa\x78\x4d\x18\x94\x15\x69\xf0\x8c\x5d\xc3\x8e\xc2\xd4\ \xf7\x03\x59\x20\x00\x4d\x82\xfc\xab\x5b\x0c\xca\xc0\x95\x85\xb7\ \x69\xd3\x90\x70\xc4\xe4\x67\xc6\x8c\xe8\x02\x55\x45\x77\x6a\x9c\ \xde\x3b\xbb\x21\x7d\x8d\x1c\x62\x64\xbf\x32\x0e\x61\xea\x94\x1e\ \xdc\x22\x80\x17\xb1\xd3\x34\x60\xb4\xe6\x25\xd7\x6c\xff\xe7\xb6\ \x87\x90\xc4\xcd\x64\x10\x0b\x67\xe2\x77\x25\x56\xb3\x48\xdc\xee\ \x0c\x6b\xdd\x98\x04\x09\x46\x05\x87\x1d\x0d\x9e\x83\x8e\xa5\xe7\ \x3b\xfe\xec\x95\x83\x3d\xbf\xa6\xb6\xeb\xfc\x6b\xdb\x48\x52\xa8\ \x33\x3a\x89\xd9\x27\x97\xd3\x0e\x9d\xf7\xef\xa6\x3d\xd3\xff\x6f\ \xea\x7b\x49\xb3\xc7\x50\xe1\x68\x02\x95\x68\xe2\x08\x01\xe6\xf4\ \x5c\x65\x94\x00\xb9\x89\x35\x76\xfe\xea\xbe\x43\xb5\x84\x77\xde\ \xb0\x63\xe6\x1a\xca\x19\xac\xeb\x59\x5b\x07\xec\x27\xe5\x5e\x7f\ \x56\x08\xa0\xf1\xff\x8b\x36\x4d\xfe\xc3\x19\xa0\x62\xe5\xbf\xd1\ \xcd\xa0\x8b\x47\x9a\x96\x0b\x58\x3b\x85\xce\x79\x4c\xf9\x06\x0b\ \x49\xca\x61\x9d\x20\x6d\x52\x77\x6e\xd6\x02\x96\x7f\xb7\xc9\x28\ \x01\x52\x42\x6b\xb6\xbc\x8a\xd2\x28\x08\xe8\x45\x7b\xf6\xd3\x3e\ \x0e\x80\xac\xd8\x6b\x35\xb6\x30\x3d\xd2\xe8\xf3\xe6\xf4\x58\xc1\ \x0e\x01\x66\x7c\x4f\x81\xa5\x0e\x09\x82\xc8\x11\x36\x10\x49\x22\ \x85\x8c\x8d\x53\xe9\x1d\x20\xb0\x9f\x69\x04\xd8\x2a\xa3\x77\x80\ \x49\x22\xee\x57\x03\x37\xf6\xdd\x6b\x14\xb0\xcb\x0b\x2f\xd1\x55\ \xbd\x94\xdb\xb0\x75\xd2\x46\x24\xc2\xaa\x41\xab\x20\xf9\x06\x1d\ \x1a\x29\xf7\xdd\x30\xfa\xbc\x59\x9f\xce\x63\x83\x00\x98\x28\x2a\ \x8e\x3d\x72\x9f\x69\x8a\x86\xa2\x88\x3d\x50\x78\x6b\x1b\x40\x95\ \x92\x4a\x19\xa7\x3b\x89\x4c\x23\xc0\xce\xe9\xf7\x3d\x4f\x09\x69\ \x8e\xbd\xb8\x4f\x80\x90\xb1\x27\x10\x18\x63\x9a\x75\x27\xcc\xa4\ \xca\x5b\xb1\x3a\x0a\x8e\x89\xcf\xd5\xf5\x1c\x4c\x10\x39\x5a\x4d\ \x65\x83\x00\xe8\xb5\x27\xf8\x0e\x23\x40\x19\xcf\x5f\xa4\x2c\x71\ \x34\xb9\x1c\x9c\xbd\xd7\xab\xc6\xd4\x95\x45\x80\xca\x95\xe3\x04\ \x98\xfe\xe1\x6c\x06\x1c\x63\x7a\x5c\x72\x1e\x72\x13\x22\x8c\xfe\ \x90\xa5\xb9\x51\x70\xd6\x3b\xd4\xe8\x73\x36\x0d\x0a\x01\x17\xe1\ \x74\x76\x9c\x40\xb1\x08\x43\xc1\xb4\xd5\xb2\xda\x4b\xc8\x55\x4a\ \x4c\xda\x10\x9f\xc0\xe4\x4e\x20\xcd\x16\x0f\xda\xac\xb8\x7d\xc9\ \x69\x02\x60\xda\x17\xc1\x31\x41\x8f\x38\x9f\x83\x98\x83\x37\x49\ \x46\x50\xa9\x97\x14\x8a\x81\x54\xe2\x27\x9c\x74\x3b\xff\xc0\x67\ \x2c\xfa\x69\x0d\xc8\xac\xbc\xd9\x6a\x0a\x65\x32\x83\xd1\x2e\x3f\ \x80\xf6\xf0\x02\x28\x52\x1e\xc4\x32\x71\xf6\x89\x65\x10\xeb\xfe\ \x27\xe0\x7b\xc3\x3b\x99\xfc\xbc\xac\x95\xb4\x13\xa8\x51\xfc\xc8\ \x6d\x02\x2c\xee\xb3\x9e\x02\xc8\x14\x3d\x3c\xe5\x2c\x84\x06\x5d\ \x84\xeb\x2b\xae\xc0\xa5\xf9\x97\xe0\xa8\xeb\x39\x93\xbf\xeb\x6d\ \x3b\x8f\xcd\xae\x60\x5c\xd9\xa4\x14\x8c\x40\xd7\xa6\xe1\x03\xdb\ \xa3\xaf\x60\xea\xf3\xd2\xe7\x8d\xa2\x09\x30\x7f\x08\xb7\x09\xb0\ \xf6\x8f\x9d\x08\x0c\x5b\xea\xd6\xd6\x9b\xf5\xb6\xf0\x4c\x17\x11\ \xae\x72\x83\x56\xb0\xa1\x9d\xd0\x4f\x78\xa8\xf3\x05\xb2\xef\x28\ \x02\x64\x6f\x96\x71\x9b\x00\x3b\x87\x1f\x66\x0d\xfc\x83\x93\xce\ \x80\xe3\x5b\x9e\x8d\x76\x3c\x3c\xc3\xb9\x17\xd6\x09\x92\x89\xa6\ \x3b\xd5\xcf\x79\x4b\x21\xb1\x7e\x45\xf6\x95\x1a\xf3\x57\x74\x1b\ \xca\x92\x4f\x40\xc1\xd9\xe5\xa0\xf1\xfb\x8b\x5b\x04\xf0\x20\x59\ \xb9\x43\x13\xcf\xb0\x46\x80\x1d\x23\x0f\x81\x53\x9b\x69\x9c\x9e\ \x10\x92\xe1\x62\x07\xa5\xa9\xd4\x19\x03\x2a\x2a\x20\xc3\x27\xb8\ \x43\x00\x9f\x0e\x8b\x58\xdd\xfe\x57\xfc\xb1\x19\xb3\x88\xf5\x21\ \x40\x59\xca\xc9\x52\x5d\x39\xb7\xe0\xbf\x45\xa0\x59\x38\xac\xd1\ \x08\x90\x7f\x6a\xf1\x03\x7a\x02\x23\x41\x33\xa7\x3f\x37\x08\x30\ \xbf\xf7\x6a\x56\x09\x10\x60\xbf\xb8\xde\xc5\x20\xfd\x73\x01\x25\ \xb1\x07\x40\x13\xd4\x8f\x4d\xf0\xb1\x5e\x70\xaf\x8c\x09\x85\xb1\ \xa8\xa4\x3d\xb6\x04\x0a\xee\xec\xa6\x7b\x02\xaf\x6f\xe2\x06\x01\ \x56\xfc\xbc\x95\x55\x02\x4c\xb3\xf1\xaf\x0f\x01\xe8\x73\x01\x74\ \xab\x17\x0e\x7e\x78\x84\xa0\xa3\x97\x5f\x70\x6e\x39\x94\x67\x9d\ \x33\x58\xed\xf1\x33\x07\x32\x0e\x25\x39\x65\xc4\xbd\x9e\xc0\x2d\ \x83\xf6\xb3\x4a\x00\xd7\xf7\x67\xd4\x9b\x00\x99\x5b\xa6\x55\xe9\ \xea\xed\xd5\x2b\x90\x4a\xef\xe6\x6c\x91\x99\x1f\x78\xdf\x3f\xa1\ \xe8\xf6\x36\xa3\xdb\x7d\xf8\xd0\x2e\xb5\xf6\x04\x02\x17\x7a\x02\ \xc9\x51\x72\xd8\x3f\xfe\x14\x6b\xe0\xff\xeb\x70\x02\x1c\xdb\x78\ \xd6\x83\x00\x74\x5b\x78\xd4\xf8\x2f\x20\xe7\xf4\x4a\xbd\x56\x34\ \x25\xd9\x09\x9c\xcc\x03\xbe\xfb\x57\xa4\x6d\x6c\x0e\x33\x33\xc0\ \x98\xaa\x43\xfc\x21\x7a\x62\x0f\x88\x93\x7d\x4b\x1c\xc3\xd3\xcc\ \xeb\xa4\x3f\xd0\xf2\x77\x80\x99\x9f\xce\x63\x75\xf5\xaf\xed\xb7\ \x0b\xc4\x42\x45\x83\x09\x50\xad\x90\xb9\x79\x9a\xfe\x81\x8c\x86\ \x90\x00\x4b\xc7\x79\x87\xfc\xa0\x32\xf7\x6a\xad\x5d\x43\xe4\x54\ \x12\xa6\x94\xcb\x55\xa1\xfa\x66\xc8\xa0\x45\x2c\x6b\xa7\x8f\xe5\ \x13\x60\x4e\x8f\x95\xac\x12\x60\xde\x77\x2b\x1a\xd4\x12\x96\xe5\ \xd2\x2b\x51\xd7\xe1\x13\x3b\x92\x34\x74\x54\x93\x20\x6b\x87\x8f\ \x61\x4f\x5e\xcc\x01\x3c\xa7\x77\x9f\xe2\x89\xe2\xa2\x1b\x9b\x75\ \xce\x19\xfe\x7f\xfe\x89\xf9\x24\x6e\x5f\x06\x45\xd7\x36\xe0\xf9\ \xbe\xca\xfc\x1b\x75\x9f\x27\x0c\x5d\x0f\x51\x93\xbe\x62\x88\xf7\ \x80\x9e\x40\x3c\xa0\x12\x31\xa2\xbb\xe5\x13\x60\xd9\xb7\x1b\x59\ \x25\xc0\xac\x1e\xb3\xcd\xd6\x13\x98\xee\xd8\x93\x69\x01\xd7\x1c\ \x5a\x40\x01\x60\x26\xc5\x58\x3f\x61\xd6\x20\xbd\x13\xc4\x98\x52\ \xc6\x2e\xa0\x8a\xdc\xeb\x7a\xdf\xc1\xf6\x30\x1c\x3e\x15\x3d\xac\ \x93\xe5\x13\x60\xfd\x3f\x7b\x58\x25\x80\xec\x93\x99\x66\x6d\x0a\ \x25\x87\x3b\x19\x12\x64\x6e\x99\x4e\x3b\x87\xf5\x57\xec\xea\xc5\ \xf3\x84\x83\x6a\x52\xc7\x31\x23\x6d\xf0\x20\xa9\x4a\xac\xeb\x09\ \xb4\x61\xce\x27\x26\xcf\x75\xc0\x6a\x62\xc6\x06\x0f\x88\xf5\xf8\ \xb3\xa6\x27\x70\x32\x07\x7a\x02\xf7\x8e\x3e\xce\x1a\xf8\x07\x26\ \x90\x14\xb0\xd0\xdd\xdc\x5d\xc1\x98\xce\x0d\x1f\x80\xab\x52\xb7\ \x4d\xa3\x49\xc8\xbf\xbe\x0d\x9b\x40\xea\xd2\x92\xf8\x63\x50\xa1\ \xbd\x52\x57\x8f\x00\x7e\x26\x6a\xc2\x97\xf8\xcc\xc8\xc1\xcc\xb1\ \x71\xaa\xb8\x14\x39\xa4\x63\x9d\xc5\xa5\x84\xb1\x1c\xe8\x09\x9c\ \xf6\x7e\x10\xab\xab\x7f\xcb\x90\x7d\xe0\xd2\x66\xba\x59\x09\x40\ \x9b\x03\x24\xc1\x43\x69\xc4\xc8\x1e\x90\xe0\x35\x08\x13\x39\x7a\ \x1e\x3f\xe6\xfa\xd3\xfc\x07\x82\xaa\xae\x0a\xa3\xab\x2d\xc4\x8f\ \xe9\x5a\x73\x12\xa9\x7a\xc6\x40\x2a\x57\x7a\x02\x03\x6c\x96\xb2\ \x4a\x80\x25\xbf\xac\x07\xa9\x95\xb7\x99\x09\x40\x9b\x83\x98\x11\ \x58\xf7\xaf\x8f\x62\x4b\x77\x69\xf2\xa9\xfa\xe4\xf5\xf1\x34\x92\ \x8a\x6b\xd5\xc0\x45\xf6\xeb\x58\x25\x80\x9f\xdd\x02\x56\x4e\x06\ \x65\xb9\x8a\xd0\xfe\xa6\x4c\xec\x5e\x87\x62\x25\x10\x5b\xb7\x63\ \x47\xda\x50\x27\x8c\x75\x49\x9d\xfc\x6b\x5b\x69\x93\x40\xbc\xfd\ \x9c\xad\xf2\xa6\x37\x22\x66\xf5\xef\xdb\x59\x25\x80\x47\x7b\x6f\ \x8b\xbd\x2f\x20\x83\xf8\x11\xe4\x24\x0f\x73\xc4\x5c\x7b\x64\x91\ \x7e\xa6\x11\x07\x4d\x35\x29\x02\x6c\x1f\x7a\x90\x55\x02\x38\xbf\ \xe3\x69\xf1\x17\x46\x24\x8d\xeb\xca\xe4\x17\x32\xb7\xcd\x44\xe0\ \x29\x12\xec\x9e\xd6\x34\x08\x40\x66\xf0\xe1\x4c\x1f\xb6\xc0\xdf\ \x35\xea\x08\xe9\x01\x98\xca\x85\x1b\x43\xd0\x7c\x84\x55\x47\x15\ \x69\x2b\xc5\x7a\x24\x50\x62\xe1\x89\xf3\x04\xf0\x6e\xbb\x80\xd5\ \xd5\xbf\xf2\xaf\x2d\x20\x11\xce\x6c\x3c\x02\xcc\xfa\x15\x72\xb6\ \xbb\x43\xde\x41\x7f\xc8\xd9\x2c\xc3\xc3\x22\xc6\x3e\x8f\x51\x45\ \x35\x09\xd2\xd7\xca\xf5\x6b\xfd\x38\x82\x8e\xd3\x04\x98\x27\x62\ \xb7\x07\x20\xa8\xcf\xd2\xc6\x19\x15\x2b\xff\x12\x47\xbf\x63\xda\ \x56\xcf\xbb\xcf\x3b\x14\x08\x6a\x69\x6f\x30\x16\x55\x44\x0c\xc6\ \x58\x1f\x13\x3d\x54\xee\xbf\xe8\x16\x68\x82\xfa\x72\x97\x00\xc1\ \x3f\x6e\x61\x95\x00\xd3\xbb\x04\x34\x06\x01\x30\xff\x6f\x74\x18\ \xe5\xf1\x79\x0f\x6a\x24\x65\x46\xcf\xa8\xf6\x06\xd2\xc3\xa7\xd2\ \x4f\x63\xd5\x90\x93\x04\xd8\x34\x20\x84\x55\x02\x48\x3e\x9a\xc1\ \x3a\x01\xb4\xcb\xc6\xd6\xd2\xaf\x17\xae\x1f\xe2\x31\x83\x1d\x8d\ \xed\x04\x48\x02\x52\x03\xc8\x39\x4b\x11\x0a\x2f\x9b\xe2\x1c\x01\ \xdc\x88\xee\x73\x38\xc9\x1a\xf8\xfb\x48\xbf\xc1\x14\xa1\x27\xbb\ \x04\xa0\x57\x3f\x4e\x08\x27\x45\x1d\x1c\x19\x93\x34\xd7\x81\x72\ \xec\x88\x29\x30\x25\x4c\xc4\x4c\x23\xc9\xfd\x53\x17\x4b\xe0\xf7\ \xf7\xfb\x60\x88\x48\xa6\x86\x62\x47\xb0\x85\x13\x00\x27\x7b\xb2\ \xba\xfa\x37\x0c\xd8\x0d\xae\x42\xf6\x77\x80\x92\xe8\xfd\xd4\x4c\ \x80\xfb\xb2\x7e\x58\x0b\x60\x56\xf1\xe5\xb5\xa6\xe5\x0a\xd0\x31\ \x6c\x87\x47\xc1\xab\x4a\xea\x38\x23\x59\xa5\xc4\x92\xb3\x7a\xfa\ \x77\x96\x4b\x80\xa0\x6e\xcb\x59\x25\xc0\xfc\x1f\x56\xe3\x00\x48\ \xd6\x77\x80\x1b\xdb\xa8\xee\x9c\xc8\xe1\x5d\xf0\x58\x78\x94\x83\ \x88\x9a\x23\x98\x77\x6a\xc9\xc3\x8d\x9c\xa1\xfc\x81\xda\xb5\x2c\ \xf9\x38\xf1\x0f\xfa\x58\x26\x01\x96\x7e\xb3\x81\x55\x02\x78\xf5\ \x9a\xdb\x28\x17\x46\x64\x6d\xf6\xa4\x6b\xfb\x04\x94\x9c\x13\x0b\ \x0d\x1a\x3b\xd3\x17\x4f\x78\xa8\x6d\x3b\x71\x7c\x0f\x28\xcb\xbc\ \xa0\x9f\x29\x34\x6c\x22\x39\xe0\x6b\x99\x04\x58\xf7\xf7\x2e\x56\ \x09\x20\xff\xdc\xab\x51\x08\x10\xe3\xd0\x0b\xcf\xfc\x1b\xad\xfb\ \xc7\x1f\x85\xb8\xd1\x0f\x37\x37\x58\xb3\x94\x9a\x13\x88\x95\xc4\ \xf0\xe1\xdd\x20\x46\xfa\x0b\x94\x65\x85\xd6\x44\x09\x19\x16\x3a\ \x27\x70\xf7\xc8\xa3\x6c\x81\x8f\x27\x8e\x1c\xad\x3d\x1a\x83\x00\ \xd8\x36\x16\x23\xfb\x8d\xea\xda\xa1\x76\x84\x94\xd3\xa0\x9c\xd4\ \x07\x6b\xf7\x0d\x9a\x14\x3a\xbc\x3b\xe3\x5b\x90\xa6\x14\xcb\x9e\ \x14\xea\xf9\x6e\x00\x9e\xcd\x63\x8b\x00\xdb\x87\x1d\x00\x67\xe1\ \x34\xf6\x08\x40\xdb\x6b\xf4\xda\xa9\x33\x7c\xc4\x79\x2b\x8a\x3a\ \x40\xda\xb7\xa7\x32\x23\x5e\x33\x1e\xf2\x7c\x60\xf6\x06\x7a\x56\ \x70\x9c\xfb\x9f\xc4\xbf\xb0\x81\x08\xd2\x0b\x90\x7d\x2a\x98\x3a\ \x2f\x68\x71\x3b\x80\x5f\xc7\x25\xa6\x82\x87\xed\xe2\xab\xff\xd9\ \x0e\xbe\x5f\x2c\x00\xe7\xcf\x3d\x61\xf9\xef\x0f\xdf\x3f\xb8\x8c\ \x7c\xe7\xd1\xce\x0a\x36\xae\x2a\x3d\x3f\x20\x65\xe1\x84\xfa\x74\ \xee\xd0\xc4\xf2\xfc\x49\xe7\xed\x53\x17\x50\x6a\x0f\xcf\x86\xfc\ \x2b\xeb\xe9\x24\xd3\x15\x0b\x3c\x19\xb4\xa8\xf7\x5a\xa3\x2d\x5b\ \x9b\x06\xed\x85\xa0\xaf\x96\x80\x6b\xbb\x69\x30\xa4\xa5\x83\xc1\ \x65\x0e\x9e\x5d\xfd\x60\xdf\x38\xd3\x73\x08\xfe\x5f\x2e\x6e\xac\ \x5b\xc3\xd0\x0b\x27\xab\x9f\x9a\xdd\x4b\x4a\xbd\x4c\x63\x67\xe2\ \xb8\xae\xf5\xac\x18\x76\x23\x2b\x7d\xc5\x03\xce\x06\x2a\x21\xce\ \xe3\x2f\xcb\x23\xc0\xaa\x5f\xb7\xd7\x0d\x78\xab\x71\x7a\x80\x8f\ \x81\xe1\x2d\x27\xe2\xa5\x0e\x8e\x6d\x3c\x60\x64\xcb\xc9\xf8\xfa\ \xd8\xb7\x9d\x60\x5d\x7f\xd3\xe6\x09\x78\x76\xf4\x6b\x34\x02\xe4\ \x1d\xa6\x42\x35\x1c\x23\x1f\x3d\xb4\x23\x36\x84\x90\xa6\x91\x86\ \x54\x0b\xd1\xe9\xa3\xa7\x91\xd3\x67\x13\x52\x97\x3b\x63\x1d\xc1\ \xe2\x08\xb0\xec\xa7\x4d\x10\xd8\x47\x07\xf8\x54\x18\xda\x1a\x01\ \xa7\x74\x58\x8b\x09\x78\x93\xc7\x14\x02\xb8\x54\x68\x38\x07\x70\ \x52\x6b\x37\x18\x4c\x88\x31\xb8\xe5\x18\xf0\xb7\x5f\x04\x07\x1f\ \x70\xac\xdc\xf5\xbd\xe9\x8d\x42\x00\x8d\x8f\xee\x00\x67\x38\xb5\ \xfa\xc3\x07\x76\xa4\xec\x7d\xbd\x55\x2c\xd2\xf5\x01\x62\xc7\x70\ \xda\x0a\x57\x28\x8e\x3e\x88\x97\x46\x94\x6b\x2e\xe3\xb5\x73\xb1\ \x6e\x7f\x54\x9b\x97\x2e\x96\x47\x00\x32\xcd\x93\x02\x9c\x5c\xe6\ \x50\x0b\xe0\xc6\x95\x64\xf5\x90\x28\x78\xbf\xcf\x27\x6e\xb0\x7d\ \x78\xed\x8d\x25\x7b\xc7\x1c\xc7\x63\x60\xac\x13\x40\xda\x1b\x0f\ \x7a\x50\xc3\x21\xfd\x86\x63\x2b\xb7\xd9\x7a\x06\x26\xa2\xe7\x5f\ \x97\x62\x27\xb1\xca\x55\x64\x79\x04\x18\xd3\xca\x09\x1c\x5a\xb9\ \x20\xe0\x0d\x70\xce\x70\xc0\x13\xb9\xeb\x07\xcd\xc4\xd0\xd6\xe3\ \x61\xc1\x0f\x06\x53\x46\xd1\x81\xc4\x1e\x00\x96\x09\x90\x77\xc0\ \x4f\xef\x32\xc8\xb5\x94\xb7\x6f\x26\x45\x53\x52\xed\x53\x50\xaa\ \x9b\x16\x4a\x4e\x30\x35\x8b\x5b\xc3\xb0\xcb\x67\x68\x0b\x34\x25\ \x20\xef\x34\x0b\x57\x3d\x33\x09\xf4\x9b\x60\xd6\xaf\x8e\xd5\xae\ \x9c\xa0\x8b\xbf\xa9\x51\xf0\x91\xe3\xbe\xc0\xe6\x4f\x63\x3b\x46\ \xf6\x9a\xc9\x50\x18\xba\x0a\x8a\xef\xee\xc0\x63\x63\xda\x15\xe3\ \x4d\x03\x50\x8c\x44\xd0\x45\x13\xe8\x54\xa6\x3b\xf6\x68\x7e\xf7\ \x06\xca\x88\xe9\x18\xdd\xd2\x09\x49\x30\xe6\x6d\x47\x58\xdb\x77\ \x07\x12\x60\x46\xb7\xd9\xac\x12\x40\x3b\x7f\x30\x5d\xa4\xa9\x52\ \xe2\xad\x62\xe1\x03\x8c\xdc\x04\x3a\xed\x5b\xa6\x68\xa4\xaf\xc5\ \x11\x7b\x70\xd0\x34\x7f\x71\xa4\x89\x3a\xb9\xda\x41\x1c\xd8\x62\ \x0c\x78\xf7\x9e\x07\xd2\x8f\x14\xac\x11\x40\xbb\x68\x04\x26\x5e\ \xa8\xd3\xb9\xdb\xbd\x70\x4b\x26\x17\x4c\xd5\x79\xf1\x23\xb9\x86\ \xd6\xf8\xc4\xd3\xf0\xdd\xf8\x39\x9e\x00\x26\xaa\xc4\x6a\x26\x8c\ \x68\x31\x09\x77\x03\x42\x08\x36\x08\x80\x83\x21\xf4\xcf\x04\x92\ \x01\x90\xd8\xc0\x11\x53\xf7\xf0\x47\xdc\xf6\xe9\x36\xaf\xdb\x78\ \xb0\xb3\xfa\x1e\x00\x46\xb5\xc1\x0e\xac\x12\x80\xfb\xd7\xc7\x0b\ \xbd\x61\x5c\x2b\x09\x46\x0b\x8f\x90\x00\x38\xab\xa7\xe8\xd6\x56\ \xc3\x2a\xdc\x95\xcd\xe8\x9c\x91\x2e\x1e\xa3\xf1\x3e\xb1\xf9\xd4\ \xb5\x72\xba\x9b\xc6\xd0\x89\x73\xfc\x96\x32\x25\xe4\x92\x48\x4e\ \x5c\x1f\x8f\x22\x69\x15\xf4\x02\x99\xfa\xa1\x20\x3f\x5e\x09\x51\ \xe0\xa6\x1a\x27\x80\xc6\xeb\x37\xc8\x3b\x32\x1b\x2f\x6a\xaa\xfd\ \xd2\x2a\x25\x0e\x6c\xd2\xac\x71\x34\xba\x7d\x17\xdf\xdd\x59\x03\ \xf2\xcd\x1d\x8c\x17\xaf\x7f\x1d\x4c\xd1\x8d\x2d\xe6\x06\xbe\x5c\ \x23\xb1\x5b\x90\x2d\xef\xf2\x8a\xe0\x51\x89\x9b\xb5\xdf\x87\x64\ \x37\xd8\xd1\xd4\x08\x40\xe2\xfb\x62\x26\x0f\x6f\x82\x96\xc4\xe8\ \x4d\x11\x73\xef\x83\x91\x42\x61\xe8\x4a\x6a\xab\xd7\x25\x72\x62\ \x5d\xbf\x05\x25\x49\xde\xc4\x4a\xbe\x87\xaa\xe2\xbb\x35\x61\xe4\ \xc9\xc5\xe6\x04\xff\xb8\x56\xdc\xfb\x73\x01\x5b\x42\x3a\x71\xfa\ \x90\x1e\xc0\xdb\x4d\x82\x00\xf4\x98\x38\xd3\xb5\x52\x89\x57\xc5\ \x95\x67\x9e\xd5\xbf\xda\xcd\xc0\x07\x28\x56\xfe\x6b\xd0\xee\x95\ \x3a\x7b\x84\x39\x80\x8f\x24\x21\xe3\x8f\x82\xc6\x10\x85\x40\xf1\ \x38\xf9\x31\x87\x51\xfe\x01\x17\xd4\xf8\x98\x38\x9c\xf8\xad\x0e\ \x09\x24\x15\xbe\x89\x10\x23\xf9\x45\x77\xba\x17\x6f\x07\x53\xed\ \xf2\xa5\x5a\xbe\x1a\xa2\xf9\x37\xb6\xe3\x60\x88\x06\x00\xaf\x55\ \x89\xed\x9c\x40\x61\xff\xa4\xa0\xb1\xc5\xf9\x5d\xc5\xab\x32\xa1\ \x8f\x3f\xf9\x61\x4b\xb9\x4a\x00\xcd\xbe\x39\x55\xba\x49\x1c\xd1\ \xce\xdf\x19\x4f\xc5\x8e\xb5\xc5\x0b\xa1\xea\x30\x17\xb8\xca\x73\ \x43\xd7\x63\x79\xb8\x30\x6c\x6f\xed\xd7\xbf\xdd\xda\x89\xcd\x1e\ \xf5\x29\x19\x13\x2d\x57\x4b\x45\xc1\xe9\x62\xfb\x37\x05\x96\x26\ \x52\x6b\xaf\x8f\x38\xe0\x1f\x18\x9f\x12\x46\x8f\x7a\xc7\xf4\x6b\ \x34\x51\x25\x69\xca\x08\xbb\xff\xcc\xbf\xe4\x67\xdd\x8e\x80\x45\ \x9a\x9c\xd3\x2b\x30\x37\x90\xe0\x33\x14\x1b\x45\x98\x67\xe8\x4a\ \xc3\x01\x23\x21\xfb\xf8\x12\xdd\xf5\x72\xd8\xe2\x95\xe8\x3b\x0c\ \x5f\x0f\x23\x4a\x0e\x87\x3c\xbc\x9d\x97\xdb\xb6\x15\x58\xb6\xa0\ \x7f\xf0\x35\x21\xc2\x1d\xae\x11\x80\x00\x83\x60\x63\x59\xd7\x30\ \xe7\x8e\x59\xbf\xf8\xd1\xcc\x14\x31\x63\xca\x9c\xff\xab\x43\xf1\ \x96\xd0\x87\x00\x3e\x4a\x2d\x11\xfd\x2c\xe0\x8e\xa0\x7f\xf0\x24\ \x09\x1b\x1d\xc8\x8f\xad\xe2\x00\x01\xf0\xfa\x78\xe2\x4c\x99\xda\ \xc7\x8f\x44\x31\xac\xd4\x75\x80\xf8\x31\x9d\x75\x03\x9f\x98\xd1\ \xef\x84\x58\x06\x9f\x49\x9d\x64\x72\x5e\x3f\x9b\x84\x75\x72\x50\ \xb4\x7d\x5a\xc0\x55\x71\x7b\xdb\xef\xb5\x6a\xff\xa0\xcc\xd2\xf3\ \x00\xf5\xb8\x2d\x04\x87\x3c\x65\x38\xf5\x34\x96\x18\xc2\x6a\x21\ \x69\xf6\x78\x98\xaa\x61\x85\xce\xce\x67\xb8\xf7\x6e\x21\x68\x2a\ \x42\x0a\x3b\x9f\x90\x1f\xfe\x00\xc7\x08\xc0\xbe\x4a\x45\x27\x32\ \x5d\x7a\xb5\x17\x34\x55\x71\x13\x7a\x7d\x23\x17\xfa\x86\xf1\x04\ \xd0\x57\x51\xb4\x4a\x6a\xd7\x57\xd0\x1c\xc4\xa1\x4b\xf0\x53\xd5\ \xfe\x81\x5a\xce\x13\x20\x47\x67\xe7\x63\xa6\xfc\xf8\x8c\xa0\xb9\ \x89\x8b\xb5\xe2\x75\x37\xa1\xef\x02\x02\x48\x45\x33\x24\x40\x15\ \x59\xf5\x1b\x32\x25\xa2\x96\x82\xe6\x2e\xee\x42\xdf\x4f\x09\x28\ \x87\x9a\x0d\x01\xc4\xb6\xa7\xb2\x5c\xed\x3a\x0a\x78\xa9\xc5\x3f\ \xb0\xf6\x09\x6f\xc2\x04\x88\x61\xc1\xce\x73\xdf\x3f\x20\x24\x70\ \x22\x20\xe5\x36\x21\x02\x14\xaa\x25\x76\x8a\x04\x85\xfd\xb3\x3c\ \xc2\x26\x8a\xbb\x95\xef\x1b\xd5\xfe\x41\x25\x87\x09\x80\x76\x5e\ \x25\xb5\x6f\xcd\x23\x5a\x6f\xb3\xe0\x67\x43\xca\xce\xa7\x39\x48\ \x80\x4b\xc4\xbb\xef\xc1\x23\x68\xb6\xb6\x34\xef\x5f\x75\xc0\x71\ \x80\x00\xc9\x1a\xa9\xdd\x30\x10\x08\x1e\xe3\x51\x33\xb3\x28\xda\ \x2a\x9e\xd6\xf9\x07\x44\xf3\x58\x20\x80\xa5\xda\x79\x5e\x3c\xde\ \xf1\x69\x43\x2a\x8e\xc1\xe8\x1f\x34\x3e\x01\xee\x69\x24\xb6\x3b\ \xb0\x09\x93\x17\x76\x45\x2a\xf4\xe9\x4c\x32\x8a\x67\x1b\x8d\x00\ \x62\xbb\xcb\x5a\x89\xa8\x17\x8f\x84\x25\xf8\x07\xd6\x3e\xf1\x2c\ \x12\x20\x95\xb7\xf3\x16\x97\x56\x9e\xfb\x1c\xd9\x0d\xe4\x04\xdc\ \xfc\x47\x48\x80\x22\x95\x44\xe4\xaf\x9a\x68\xff\xa2\x80\x17\xcb\ \x14\xd9\x5b\x01\xc2\x6a\xff\xa0\xca\x8c\x04\x40\x3b\x9f\x23\x16\ \xbd\x23\xe0\x85\x2b\x44\xf0\xee\x4a\x88\x70\xde\x0c\x04\xb8\x9a\ \x25\xed\x6d\x2b\xe0\x85\x8b\x02\x8f\xb9\x59\x79\xf7\x25\x89\xa4\ \xc4\x7a\x10\x20\x8d\x38\x79\x0e\xa0\x10\x3c\x2e\xe0\x85\xdb\xa2\ \x10\x2a\x9e\xaf\xf6\x0f\x0a\x4c\x20\x40\xb1\xce\xce\xab\x65\xb6\ \x2f\x09\x78\x69\x5a\xe2\x69\xed\x6d\x45\x76\x84\x0d\x84\x00\xb1\ \xb5\x12\x40\x2c\xda\x9f\x29\xf9\xe2\x3d\x01\x2f\x4d\x5b\xe4\x6f\ \xcf\x32\xe8\xad\xc7\x7e\x7b\x5e\x78\xe1\x85\x97\x66\x25\xff\x03\ \x60\x37\xfd\xc4\x50\x21\xe6\x17\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ " qt_resource_name = b"\ \x00\x06\ \x07\x03\x7d\xc3\ \x00\x69\ \x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\ \x00\x09\ \x09\x60\x84\x27\ \x00\x63\ \x00\x64\x00\x72\x00\x6f\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x06\xac\x8f\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x38\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x08\x53\x8e\xe7\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x64\x00\x61\x00\x74\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x09\xf8\xec\xe7\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x2d\x00\x67\x00\x72\x00\x61\x00\x79\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x04\x4b\x27\xe7\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x73\x00\x61\x00\x76\x00\x65\x00\x64\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x12\ \x04\xe5\xe0\x87\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x76\x00\x69\x00\x64\x00\x65\x00\x6f\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0c\ \x0e\xd2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x37\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xb0\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x35\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0d\xdc\xf1\x67\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x2d\x00\x67\x00\x72\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xf2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x35\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xb2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x39\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xac\x7b\x67\ \x00\x63\ \x00\x64\x00\x72\x00\x6f\x00\x6d\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x03\x26\x60\x87\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x31\x00\x30\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x18\ \x02\x2f\xb7\x07\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x31\x00\x30\x00\x30\ \x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x00\xe7\x33\x67\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x31\x00\x30\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x05\x80\x09\xa7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x39\x00\x30\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x07\x05\x4c\x07\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x31\x00\x30\x00\x30\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x05\xbf\x20\xa7\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x76\x00\x69\x00\x64\x00\x65\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x05\x80\x05\xa7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x37\x00\x30\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x07\ \x04\x5f\xb4\x38\ \x00\x31\ \x00\x32\x00\x38\x00\x78\x00\x31\x00\x32\x00\x38\ \x00\x0f\ \x05\xff\xc8\x27\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x61\x00\x75\x00\x64\x00\x69\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x03\x41\x52\x67\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xa0\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x36\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x0e\x00\x5d\x87\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x64\x00\x61\x00\x74\x00\x61\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x0a\ \x0a\xcb\x27\x16\ \x00\x6c\ \x00\x6f\x00\x61\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x67\x00\x69\x00\x66\ \x00\x12\ \x0a\x6d\xe8\x87\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x61\x00\x75\x00\x64\x00\x69\x00\x6f\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x05\ \x00\x35\xbb\x54\ \x00\x32\ \x00\x34\x00\x78\x00\x32\x00\x34\ \x00\x05\ \x00\x35\x9b\x52\ \x00\x32\ \x00\x32\x00\x78\x00\x32\x00\x32\ \x00\x14\ \x0a\x80\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x38\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x03\x6e\x07\x87\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x07\x3b\x4c\xe7\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x07\ \x05\x8d\xb5\xe6\ \x00\x32\ \x00\x35\x00\x36\x00\x78\x00\x32\x00\x35\x00\x36\ \x00\x05\ \x00\x34\xdb\x46\ \x00\x31\ \x00\x36\x00\x78\x00\x31\x00\x36\ \x00\x05\ \x00\x36\x9b\x62\ \x00\x33\ \x00\x32\x00\x78\x00\x33\x00\x32\ \x00\x17\ \x05\x80\x01\xa7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x35\x00\x30\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xc2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x38\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x00\x28\x5a\xe7\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\xe2\x04\x27\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x36\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x05\x80\x03\xa7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x36\x00\x30\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x06\xac\x8d\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x37\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x06\xac\x8b\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x36\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x03\x8a\x2a\x47\ \x00\x74\ \x00\x72\x00\x61\x00\x63\x00\x6b\x00\x2d\x00\x73\x00\x61\x00\x76\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\x90\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x37\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x05\ \x00\x37\xfb\x78\ \x00\x34\ \x00\x38\x00\x78\x00\x34\x00\x38\ \x00\x09\ \x09\x6a\x86\x67\ \x00\x61\ \x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x08\xc2\x5a\x27\ \x00\x43\ \x00\x6f\x00\x76\x00\x65\x00\x72\x00\x41\x00\x72\x00\x74\x00\x53\x00\x68\x00\x61\x00\x64\x00\x6f\x00\x77\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x10\ \x00\xe0\x1d\x47\ \x00\x66\ \x00\x69\x00\x6c\x00\x65\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x06\xac\x81\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x39\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xf0\x36\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x39\x00\x30\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x06\xac\x89\xe7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x35\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x08\ \x0a\x85\x58\x07\ \x00\x73\ \x00\x74\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x05\x80\x07\xa7\ \x00\x6d\ \x00\x61\x00\x74\x00\x63\x00\x68\x00\x2d\x00\x70\x00\x65\x00\x6e\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2d\x00\x38\x00\x30\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x08\x6d\x86\x07\ \x00\x6f\ \x00\x72\x00\x67\x00\x2e\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x62\x00\x72\x00\x61\x00\x69\x00\x6e\x00\x7a\x00\x2e\x00\x50\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x0a\x2a\x6b\x47\ \x00\x66\ \x00\x69\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x70\x00\x72\x00\x69\x00\x6e\x00\x74\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0b\ \x06\x3d\x10\x27\ \x00\x67\ \x00\x6f\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x0f\xe3\xd5\x67\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x73\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x08\ \x02\x8c\x59\xa7\ \x00\x70\ \x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x23\ \x01\x54\x1c\x47\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x73\x00\x61\x00\x76\ \x00\x65\x00\x64\x00\x2d\x00\x6d\x00\x6f\x00\x64\x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x0f\ \x0e\x36\x76\xc7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x70\x00\x72\x00\x65\x00\x76\x00\x69\x00\x6f\x00\x75\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x0c\x2b\x1f\xc7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x6e\x00\x65\x00\x78\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0d\xcd\xf8\x07\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x73\x00\x61\x00\x76\ \x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x0a\xc8\xfb\x07\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0d\xe9\x71\x67\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x36\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0e\xe8\x99\x87\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x65\x00\x64\x00\x69\x00\x74\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x73\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0a\xa7\x63\xe7\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x6f\x00\x70\x00\x65\x00\x6e\x00\x40\x00\x32\x00\x78\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x05\x70\xe6\x47\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x63\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x1d\ \x07\xa6\xd8\x87\ \x00\x61\ \x00\x63\x00\x6f\x00\x75\x00\x73\x00\x74\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x69\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x70\x00\x72\ \x00\x69\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x09\x6e\xef\x07\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x73\x00\x61\x00\x76\ \x00\x65\x00\x64\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0d\x16\x71\x67\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x33\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0d\x8b\x39\xe7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x63\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x07\xed\x90\x87\ \x00\x67\ \x00\x6f\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x03\x31\x34\xe7\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x31\x00\x30\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x0a\xde\xca\xa7\ \x00\x70\ \x00\x6c\x00\x61\x00\x79\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x19\ \x0a\x96\x44\x47\ \x00\x6c\ \x00\x6f\x00\x6f\x00\x6b\x00\x75\x00\x70\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x62\x00\x72\x00\x61\x00\x69\x00\x6e\ \x00\x7a\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x20\ \x0a\x57\x7b\xa7\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x73\x00\x61\x00\x76\ \x00\x65\x00\x64\x00\x2d\x00\x6d\x00\x6f\x00\x64\x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x08\x8a\x40\xe7\ \x00\x6d\ \x00\x6f\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x6c\x00\x6c\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x40\x00\x32\x00\x78\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x08\xb2\xe6\x47\ \x00\x6d\ \x00\x6f\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x6c\x00\x6c\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0d\ \x01\xd4\x55\x27\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x30\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x05\x2b\x04\x47\ \x00\x72\ \x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2d\x00\x69\x00\x74\x00\x65\x00\x6d\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x16\ \x07\xf5\x87\xc7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x61\x00\x75\x00\x74\x00\x6f\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x40\x00\x32\ \x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x0d\x49\x86\xc7\ \x00\x70\ \x00\x72\x00\x65\x00\x66\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x65\x00\x73\x00\x6b\x00\x74\ \x00\x6f\x00\x70\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x0d\x1b\x99\xe7\ \x00\x61\ \x00\x64\x00\x64\x00\x2d\x00\x69\x00\x74\x00\x65\x00\x6d\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x07\xb1\x59\x27\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x63\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x01\xa6\xc4\x87\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x6f\x00\x70\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x17\ \x08\x1f\x12\x27\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x65\x00\x72\x00\x72\ \x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x03\x75\x06\xe7\ \x00\x70\ \x00\x6c\x00\x61\x00\x79\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x09\x17\x4c\x27\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x75\x00\x73\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x1a\ \x0c\x7d\x14\x87\ \x00\x61\ \x00\x63\x00\x6f\x00\x75\x00\x73\x00\x74\x00\x69\x00\x64\x00\x2d\x00\x66\x00\x69\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x70\x00\x72\ \x00\x69\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x0a\xe4\xc3\xa7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x70\x00\x61\x00\x73\x00\x74\x00\x65\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x17\ \x0f\x76\x8b\xe7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x65\x00\x64\x00\x69\x00\x74\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x73\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x0c\x98\xba\x47\ \x00\x70\ \x00\x61\x00\x75\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0d\x58\x3e\xe7\ \x00\x61\ \x00\x70\x00\x70\x00\x6c\x00\x69\x00\x63\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x73\x00\x2d\x00\x73\x00\x79\x00\x73\x00\x74\ \x00\x65\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x01\x82\x91\xa7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x70\x00\x72\x00\x65\x00\x76\x00\x69\x00\x6f\x00\x75\x00\x73\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x11\ \x0c\x83\x0d\x07\ \x00\x6d\ \x00\x6f\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x6c\x00\x6c\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x14\ \x09\xb9\xa3\xe7\ \x00\x66\ \x00\x69\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x70\x00\x72\x00\x69\x00\x6e\x00\x74\x00\x2d\x00\x67\x00\x72\x00\x61\x00\x79\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x07\xd8\x55\x07\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x12\ \x0e\x51\x13\x67\ \x00\x6c\ \x00\x69\x00\x73\x00\x74\x00\x2d\x00\x72\x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x15\ \x00\x24\xf9\x87\ \x00\x61\ \x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x67\x00\x6f\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2d\x00\x31\x00\x36\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x18\ \x09\x77\x53\xa7\ \x00\x61\ \x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x67\x00\x6f\x00\x2d\x00\x64\x00\x6f\x00\x77\x00\x6e\x00\x2d\x00\x31\x00\x36\ \x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0d\x4a\xc4\x67\ \x00\x70\ \x00\x61\x00\x75\x00\x73\x00\x65\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x06\x89\x11\xa7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x61\x00\x75\x00\x74\x00\x6f\x00\x2d\x00\x74\x00\x61\x00\x67\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x1a\ \x04\x78\x27\x87\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x6d\x00\x6f\x00\x64\ \x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x0e\x5f\xcf\xc7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x75\x00\x70\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x07\xcc\x54\xc7\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x65\x00\x72\x00\x72\ \x00\x6f\x00\x72\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x10\ \x08\x15\x13\x67\ \x00\x76\ \x00\x69\x00\x65\x00\x77\x00\x2d\x00\x72\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x16\ \x08\x9b\xc7\x87\ \x00\x6c\ \x00\x6f\x00\x6f\x00\x6b\x00\x75\x00\x70\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x62\x00\x72\x00\x61\x00\x69\x00\x6e\ \x00\x7a\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x02\x69\x3c\x47\ \x00\x72\ \x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2d\x00\x69\x00\x74\x00\x65\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0c\xee\xc3\x07\ \x00\x70\ \x00\x6c\x00\x61\x00\x79\x00\x2d\x00\x6d\x00\x75\x00\x73\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x13\ \x0f\xe8\xae\x47\ \x00\x64\ \x00\x69\x00\x61\x00\x6c\x00\x6f\x00\x67\x00\x2d\x00\x65\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\ \x00\x6e\x00\x67\ \x00\x10\ \x0f\xcb\x90\x67\ \x00\x64\ \x00\x69\x00\x61\x00\x6c\x00\x6f\x00\x67\x00\x2d\x00\x65\x00\x72\x00\x72\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0f\ \x09\xef\xcc\x47\ \x00\x66\ \x00\x69\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x70\x00\x72\x00\x69\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x09\ \x04\xc3\x8b\x07\ \x00\x67\ \x00\x6f\x00\x2d\x00\x75\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x01\xf8\xf5\xa7\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x33\x00\x33\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x1a\ \x05\x00\xfa\x67\ \x00\x61\ \x00\x70\x00\x70\x00\x6c\x00\x69\x00\x63\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x73\x00\x2d\x00\x73\x00\x79\x00\x73\x00\x74\ \x00\x65\x00\x6d\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0c\ \x06\x4c\xbf\x47\ \x00\x61\ \x00\x64\x00\x64\x00\x2d\x00\x69\x00\x74\x00\x65\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x0b\xb8\xaa\x87\ \x00\x64\ \x00\x6f\x00\x63\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x2d\x00\x73\x00\x61\x00\x76\x00\x65\x00\x40\x00\x32\x00\x78\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x06\x8b\xba\x67\ \x00\x70\ \x00\x72\x00\x65\x00\x66\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x63\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x65\x00\x73\x00\x6b\x00\x74\ \x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1d\ \x04\x97\xd9\xa7\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2d\x00\x6d\x00\x6f\x00\x64\ \x00\x69\x00\x66\x00\x69\x00\x65\x00\x64\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x01\xf8\xea\x07\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x36\x00\x36\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x11\ \x00\xbd\x49\x67\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ \x00\x10\ \x03\xbd\x6d\x27\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x07\x12\xd3\xc7\ \x00\x67\ \x00\x6f\x00\x2d\x00\x6e\x00\x65\x00\x78\x00\x74\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x02\xd2\xa5\xe7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x79\x00\x7a\x00\x65\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0f\ \x02\x30\x8b\xe7\ \x00\x6c\ \x00\x69\x00\x73\x00\x74\x00\x2d\x00\x72\x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x02\x2c\x75\xc7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x63\x00\x6c\x00\x75\x00\x73\x00\x74\x00\x65\x00\x72\x00\x40\x00\x32\x00\x78\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x09\x5e\x0e\x27\ \x00\x66\ \x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x02\x79\x4f\x07\ \x00\x6d\ \x00\x65\x00\x64\x00\x69\x00\x61\x00\x2d\x00\x6f\x00\x70\x00\x74\x00\x69\x00\x63\x00\x61\x00\x6c\x00\x40\x00\x32\x00\x78\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x06\x3e\xc6\xc7\ \x00\x6d\ \x00\x6f\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x6c\x00\x6c\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x40\x00\x32\x00\x78\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x15\ \x0c\xb1\x0c\xa7\ \x00\x70\ \x00\x69\x00\x63\x00\x61\x00\x72\x00\x64\x00\x2d\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x79\x00\x7a\x00\x65\x00\x40\x00\x32\x00\x78\ \x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0e\ \x0c\xaa\xc0\xa7\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x70\x00\x61\x00\x73\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x17\ \x0c\xd0\x61\x47\ \x00\x66\ \x00\x69\x00\x6e\x00\x67\x00\x65\x00\x72\x00\x70\x00\x72\x00\x69\x00\x6e\x00\x74\x00\x2d\x00\x67\x00\x72\x00\x61\x00\x79\x00\x40\ \x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x12\ \x05\xa1\x31\x87\ \x00\x73\ \x00\x70\x00\x65\x00\x61\x00\x6b\x00\x65\x00\x72\x00\x2d\x00\x31\x00\x30\x00\x30\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\ \x00\x67\ \x00\x0f\ \x03\x7d\xa0\x87\ \x00\x65\ \x00\x64\x00\x69\x00\x74\x00\x2d\x00\x63\x00\x75\x00\x74\x00\x40\x00\x32\x00\x78\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x14\ \x02\x40\x88\x67\ \x00\x73\ \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x73\x00\x65\x00\x61\x00\x72\x00\x63\x00\x68\x00\x40\x00\x32\x00\x78\x00\x2e\ \x00\x70\x00\x6e\x00\x67\ \x00\x11\ \x0e\xfe\x4a\xe7\ \x00\x73\ \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x2d\x00\x73\x00\x65\x00\x61\x00\x72\x00\x63\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\ \ " qt_resource_struct_v1 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x34\x00\x00\x00\x02\ \x00\x00\x04\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x68\xf6\ \x00\x00\x04\x80\x00\x02\x00\x00\x00\x51\x00\x00\x00\x6f\ \x00\x00\x03\xe6\x00\x02\x00\x00\x00\x34\x00\x00\x00\x3b\ \x00\x00\x03\xd6\x00\x02\x00\x00\x00\x01\x00\x00\x00\x3a\ \x00\x00\x04\x90\x00\x02\x00\x00\x00\x01\x00\x00\x00\x39\ \x00\x00\x05\xf4\x00\x02\x00\x00\x00\x01\x00\x00\x00\x38\ \x00\x00\x06\x46\x00\x00\x00\x00\x00\x01\x00\x01\x12\x38\ \x00\x00\x02\x06\x00\x00\x00\x00\x00\x01\x00\x00\x48\x72\ \x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x47\xa1\ \x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x47\x35\ \x00\x00\x03\x20\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x03\ \x00\x00\x04\x24\x00\x00\x00\x00\x00\x01\x00\x00\x60\xb2\ \x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x4c\ \x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x17\x91\ \x00\x00\x02\xe8\x00\x02\x00\x00\x00\x01\x00\x00\x00\x37\ \x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x19\x61\ \x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x67\x59\ \x00\x00\x05\x26\x00\x00\x00\x00\x00\x01\x00\x00\x6a\xf8\ \x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x4b\xe9\ \x00\x00\x06\xf8\x00\x00\x00\x00\x00\x01\x00\x01\x17\x24\ \x00\x00\x02\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x49\x43\ \x00\x00\x04\x6c\x00\x02\x00\x00\x00\x01\x00\x00\x00\x36\ \x00\x00\x02\x90\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xac\ \x00\x00\x02\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x4c\xe8\ \x00\x00\x06\x6c\x00\x00\x00\x00\x00\x01\x00\x01\x13\x4a\ \x00\x00\x06\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x14\xc6\ \x00\x00\x05\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x23\ \x00\x00\x05\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x29\ \x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x11\x87\ \x00\x00\x02\x60\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x41\ \x00\x00\x04\x40\x00\x00\x00\x00\x00\x01\x00\x00\x64\xde\ \x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x12\x82\ \x00\x00\x06\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x71\x0f\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x06\x04\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x96\ \x00\x00\x00\x70\x00\x00\x00\x00\x00\x01\x00\x00\x14\x6b\ \x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x06\ \x00\x00\x03\xf6\x00\x00\x00\x00\x00\x01\x00\x00\x60\x37\ \x00\x00\x06\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x15\xdd\ \x00\x00\x05\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x1a\ \x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x51\x9c\ \x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x1c\xe4\ \x00\x00\x03\x92\x00\x00\x00\x00\x00\x01\x00\x00\x5a\x61\ \x00\x00\x06\x90\x00\x00\x00\x00\x00\x01\x00\x01\x14\x50\ \x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x1d\x66\ \x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x52\x21\ \x00\x00\x01\x92\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x5c\ \x00\x00\x01\x74\x00\x00\x00\x00\x00\x01\x00\x00\x1e\xe7\ \x00\x00\x04\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x68\x7b\ \x00\x00\x00\xea\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x6a\ \x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x74\ \x00\x00\x01\x56\x00\x00\x00\x00\x00\x01\x00\x00\x1e\x65\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x02\x74\x78\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x03\xd3\x68\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x01\x18\x1f\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x81\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x03\xd2\x2e\ \x00\x00\x12\x78\x00\x00\x00\x00\x00\x01\x00\x02\xab\xff\ \x00\x00\x07\xea\x00\x00\x00\x00\x00\x01\x00\x03\x71\xa5\ \x00\x00\x0c\x66\x00\x00\x00\x00\x00\x01\x00\x03\x97\x7d\ \x00\x00\x0b\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x01\xcf\ \x00\x00\x12\x50\x00\x00\x00\x00\x00\x01\x00\x03\xb5\x9d\ \x00\x00\x11\x2e\x00\x00\x00\x00\x00\x01\x00\x03\x8c\xea\ \x00\x00\x13\x36\x00\x00\x00\x00\x00\x01\x00\x02\xe3\x01\ \x00\x00\x13\x12\x00\x00\x00\x00\x00\x01\x00\x03\xb3\xbe\ \x00\x00\x14\xb6\x00\x00\x00\x00\x00\x01\x00\x03\x04\xd0\ \x00\x00\x13\x86\x00\x00\x00\x00\x00\x01\x00\x03\x42\x25\ \x00\x00\x07\xd4\x00\x00\x00\x00\x00\x01\x00\x03\x9d\xdb\ \x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x03\x2a\xb4\ \x00\x00\x0a\x4a\x00\x00\x00\x00\x00\x01\x00\x03\x66\xc5\ \x00\x00\x0c\xc2\x00\x00\x00\x00\x00\x01\x00\x03\x60\x70\ \x00\x00\x12\xa0\x00\x00\x00\x00\x00\x01\x00\x03\xcf\x54\ \x00\x00\x0f\x70\x00\x00\x00\x00\x00\x01\x00\x02\xfc\x30\ \x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x03\xbc\x1e\ \x00\x00\x09\x42\x00\x00\x00\x00\x00\x01\x00\x03\x91\x9a\ \x00\x00\x14\x68\x00\x00\x00\x00\x00\x01\x00\x03\x3a\xb5\ \x00\x00\x0f\x44\x00\x00\x00\x00\x00\x01\x00\x03\x8a\xf5\ \x00\x00\x11\xdc\x00\x00\x00\x00\x00\x01\x00\x03\x32\xe0\ \x00\x00\x09\x6a\x00\x00\x00\x00\x00\x01\x00\x03\x1b\xf3\ \x00\x00\x0f\xc8\x00\x00\x00\x00\x00\x01\x00\x03\x4f\xae\ \x00\x00\x0b\xb8\x00\x00\x00\x00\x00\x01\x00\x03\xcb\x2a\ \x00\x00\x0c\x8e\x00\x00\x00\x00\x00\x01\x00\x03\x2f\xc3\ \x00\x00\x10\x28\x00\x00\x00\x00\x00\x01\x00\x02\xa7\xb1\ \x00\x00\x0c\xde\x00\x00\x00\x00\x00\x01\x00\x03\x6e\xf1\ \x00\x00\x13\x66\x00\x00\x00\x00\x00\x01\x00\x03\x99\x75\ \x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x03\x0e\x40\ \x00\x00\x10\xf2\x00\x00\x00\x00\x00\x01\x00\x03\x5c\x53\ \x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x02\xb8\xdb\ \x00\x00\x0a\xce\x00\x00\x00\x00\x00\x01\x00\x02\xdd\x94\ \x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x02\xaf\x3c\ \x00\x00\x09\x14\x00\x00\x00\x00\x00\x01\x00\x02\xc6\xac\ \x00\x00\x08\xaa\x00\x00\x00\x00\x00\x01\x00\x02\xaa\x82\ \x00\x00\x0a\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x82\xc1\ \x00\x00\x11\xae\x00\x00\x00\x00\x00\x01\x00\x02\xe1\x1a\ \x00\x00\x0d\x08\x00\x00\x00\x00\x00\x01\x00\x02\xf5\xbd\ \x00\x00\x0d\x9e\x00\x00\x00\x00\x00\x01\x00\x03\x38\xd5\ \x00\x00\x13\xe2\x00\x00\x00\x00\x00\x01\x00\x03\xa0\x0b\ \x00\x00\x10\x7e\x00\x00\x00\x00\x00\x01\x00\x02\xfa\x29\ \x00\x00\x09\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x1a\x62\ \x00\x00\x0b\xea\x00\x00\x00\x00\x00\x01\x00\x02\xd2\xa8\ \x00\x00\x0f\x26\x00\x00\x00\x00\x00\x01\x00\x02\xcc\x03\ \x00\x00\x0a\x06\x00\x00\x00\x00\x00\x01\x00\x02\xff\xf7\ \x00\x00\x08\x76\x00\x00\x00\x00\x00\x01\x00\x03\x7f\xe1\ \x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x03\x02\xfa\ \x00\x00\x0e\x96\x00\x00\x00\x00\x00\x01\x00\x03\x68\xf3\ \x00\x00\x08\xe6\x00\x00\x00\x00\x00\x01\x00\x03\x35\x7e\ \x00\x00\x14\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x88\x0a\ \x00\x00\x0d\x6a\x00\x00\x00\x00\x00\x01\x00\x02\xea\xb9\ \x00\x00\x07\xac\x00\x00\x00\x00\x00\x01\x00\x02\xd1\x56\ \x00\x00\x0e\xc0\x00\x00\x00\x00\x00\x01\x00\x01\xce\xb3\ \x00\x00\x12\x78\x00\x00\x00\x00\x00\x01\x00\x02\x1c\x54\ \x00\x00\x07\xea\x00\x00\x00\x00\x00\x01\x00\x01\x30\x29\ \x00\x00\x0d\xea\x00\x00\x00\x00\x00\x01\x00\x01\xbc\x95\ \x00\x00\x0c\x66\x00\x00\x00\x00\x00\x01\x00\x01\x9a\xb5\ \x00\x00\x0b\x6e\x00\x00\x00\x00\x00\x01\x00\x01\x81\x9c\ \x00\x00\x12\x50\x00\x00\x00\x00\x00\x01\x00\x02\x17\x47\ \x00\x00\x11\x2e\x00\x00\x00\x00\x00\x01\x00\x01\xf7\xe8\ \x00\x00\x13\x36\x00\x00\x00\x00\x00\x01\x00\x02\x28\xe7\ \x00\x00\x13\x12\x00\x00\x00\x00\x00\x01\x00\x02\x27\x78\ \x00\x00\x10\x5a\x00\x00\x00\x00\x00\x01\x00\x01\xeb\x42\ \x00\x00\x13\x86\x00\x00\x00\x00\x00\x01\x00\x02\x34\x25\ \x00\x00\x07\xd4\x00\x00\x00\x00\x00\x01\x00\x01\x2e\xa0\ \x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x02\x24\x04\ \x00\x00\x0a\x4a\x00\x00\x00\x00\x00\x01\x00\x01\x6c\x56\ \x00\x00\x0c\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x9e\x56\ \x00\x00\x14\x92\x00\x00\x00\x00\x00\x01\x00\x02\x6d\x99\ \x00\x00\x12\xa0\x00\x00\x00\x00\x00\x01\x00\x02\x1f\x7f\ \x00\x00\x0f\x70\x00\x00\x00\x00\x00\x01\x00\x01\xd8\xc0\ \x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x02\x07\x52\ \x00\x00\x11\x16\x00\x00\x00\x00\x00\x01\x00\x01\xf6\xa5\ \x00\x00\x11\x56\x00\x00\x00\x00\x00\x01\x00\x01\xfb\x82\ \x00\x00\x0b\x8e\x00\x00\x00\x00\x00\x01\x00\x01\x82\xb6\ \x00\x00\x09\x42\x00\x00\x00\x00\x00\x01\x00\x01\x4d\x5c\ \x00\x00\x14\x68\x00\x00\x00\x00\x00\x01\x00\x02\x67\x13\ \x00\x00\x07\x90\x00\x00\x00\x00\x00\x01\x00\x01\x2c\x3c\ \x00\x00\x13\xb4\x00\x00\x00\x00\x00\x01\x00\x02\x43\x35\ \x00\x00\x11\x90\x00\x00\x00\x00\x00\x01\x00\x02\x01\xe0\ \x00\x00\x0f\x44\x00\x00\x00\x00\x00\x01\x00\x01\xd6\xad\ \x00\x00\x11\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x05\x00\ \x00\x00\x12\xc6\x00\x00\x00\x00\x00\x01\x00\x02\x21\xdc\ \x00\x00\x09\x6a\x00\x00\x00\x00\x00\x01\x00\x01\x4f\x46\ \x00\x00\x0c\x48\x00\x00\x00\x00\x00\x01\x00\x01\x98\x86\ \x00\x00\x0f\xc8\x00\x00\x00\x00\x00\x01\x00\x01\xdd\x8b\ \x00\x00\x0e\x6a\x00\x00\x00\x00\x00\x01\x00\x01\xc1\x6d\ \x00\x00\x0a\x28\x00\x00\x00\x00\x00\x01\x00\x01\x69\xb1\ \x00\x00\x0b\xb8\x00\x00\x00\x00\x00\x01\x00\x01\x84\x8d\ \x00\x00\x10\x02\x00\x00\x00\x00\x00\x01\x00\x01\xe6\xb5\ \x00\x00\x0c\x8e\x00\x00\x00\x00\x00\x01\x00\x01\x9c\x51\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x01\xf1\xee\ \x00\x00\x0b\x14\x00\x00\x00\x00\x00\x01\x00\x01\x7e\x40\ \x00\x00\x10\x28\x00\x00\x00\x00\x00\x01\x00\x01\xe9\x2f\ \x00\x00\x0b\x44\x00\x00\x00\x00\x00\x01\x00\x01\x80\x95\ \x00\x00\x0c\xde\x00\x00\x00\x00\x00\x01\x00\x01\xa3\x1f\ \x00\x00\x13\x66\x00\x00\x00\x00\x00\x01\x00\x02\x30\xbb\ \x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x01\x5a\x48\ \x00\x00\x0e\xf0\x00\x00\x00\x00\x00\x01\x00\x01\xcf\xe7\ \x00\x00\x0e\x3c\x00\x00\x00\x00\x00\x01\x00\x01\xbf\xbd\ \x00\x00\x10\xf2\x00\x00\x00\x00\x00\x01\x00\x01\xf4\x08\ \x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x01\x21\x38\ \x00\x00\x0a\xce\x00\x00\x00\x00\x00\x01\x00\x01\x7b\x45\ \x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x01\x74\x27\ \x00\x00\x09\x14\x00\x00\x00\x00\x00\x01\x00\x01\x49\x3a\ \x00\x00\x08\xaa\x00\x00\x00\x00\x00\x01\x00\x01\x43\xc4\ \x00\x00\x0a\x6e\x00\x00\x00\x00\x00\x01\x00\x01\x6e\x25\ \x00\x00\x0d\x42\x00\x00\x00\x00\x00\x01\x00\x01\xa8\x73\ \x00\x00\x11\xae\x00\x00\x00\x00\x00\x01\x00\x02\x03\x42\ \x00\x00\x08\x5a\x00\x00\x00\x00\x00\x01\x00\x01\x40\x0e\ \x00\x00\x0d\x08\x00\x00\x00\x00\x00\x01\x00\x01\xa5\x93\ \x00\x00\x0e\x14\x00\x00\x00\x00\x00\x01\x00\x01\xbe\xb6\ \x00\x00\x0d\x9e\x00\x00\x00\x00\x00\x01\x00\x01\xb9\x4c\ \x00\x00\x14\x12\x00\x00\x00\x00\x00\x01\x00\x02\x5a\x0a\ \x00\x00\x13\xe2\x00\x00\x00\x00\x00\x01\x00\x02\x45\x92\ \x00\x00\x14\x34\x00\x00\x00\x00\x00\x01\x00\x02\x5c\x0f\ \x00\x00\x10\x7e\x00\x00\x00\x00\x00\x01\x00\x01\xec\x18\ \x00\x00\x09\xe4\x00\x00\x00\x00\x00\x01\x00\x01\x67\x41\ \x00\x00\x0c\x24\x00\x00\x00\x00\x00\x01\x00\x01\x94\x76\ \x00\x00\x0b\xea\x00\x00\x00\x00\x00\x01\x00\x01\x89\xf1\ \x00\x00\x0f\x26\x00\x00\x00\x00\x00\x01\x00\x01\xd2\xc2\ \x00\x00\x0d\xb6\x00\x00\x00\x00\x00\x01\x00\x01\xba\xb5\ \x00\x00\x0a\x06\x00\x00\x00\x00\x00\x01\x00\x01\x68\x97\ \x00\x00\x08\x76\x00\x00\x00\x00\x00\x01\x00\x01\x41\x0d\ \x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x01\x44\xf7\ \x00\x00\x08\x36\x00\x00\x00\x00\x00\x01\x00\x01\x3f\x0b\ \x00\x00\x0e\x96\x00\x00\x00\x00\x00\x01\x00\x01\xca\x5c\ \x00\x00\x0f\xaa\x00\x00\x00\x00\x00\x01\x00\x01\xdb\x18\ \x00\x00\x08\xe6\x00\x00\x00\x00\x00\x01\x00\x01\x46\x7c\ \x00\x00\x0d\x6a\x00\x00\x00\x00\x00\x01\x00\x01\xae\x13\ \x00\x00\x10\xcc\x00\x00\x00\x00\x00\x01\x00\x01\xf2\xc7\ \x00\x00\x07\xac\x00\x00\x00\x00\x00\x01\x00\x01\x2d\x7f\ \x00\x00\x10\xa0\x00\x00\x00\x00\x00\x01\x00\x01\xee\x21\ " qt_resource_struct_v2 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x34\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x04\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x68\xf6\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x04\x80\x00\x02\x00\x00\x00\x51\x00\x00\x00\x6f\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x03\xe6\x00\x02\x00\x00\x00\x34\x00\x00\x00\x3b\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x03\xd6\x00\x02\x00\x00\x00\x01\x00\x00\x00\x3a\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x04\x90\x00\x02\x00\x00\x00\x01\x00\x00\x00\x39\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x05\xf4\x00\x02\x00\x00\x00\x01\x00\x00\x00\x38\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x06\x46\x00\x00\x00\x00\x00\x01\x00\x01\x12\x38\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x02\x06\x00\x00\x00\x00\x00\x01\x00\x00\x48\x72\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x01\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x47\xa1\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x47\x35\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x03\x20\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x03\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x04\x24\x00\x00\x00\x00\x00\x01\x00\x00\x60\xb2\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x05\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x6e\x4c\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x17\x91\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x02\xe8\x00\x02\x00\x00\x00\x01\x00\x00\x00\x37\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x19\x61\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x04\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x67\x59\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x05\x26\x00\x00\x00\x00\x00\x01\x00\x00\x6a\xf8\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x02\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x4b\xe9\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x06\xf8\x00\x00\x00\x00\x00\x01\x00\x01\x17\x24\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x02\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x49\x43\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x04\x6c\x00\x02\x00\x00\x00\x01\x00\x00\x00\x36\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x02\x90\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xac\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x02\xfc\x00\x00\x00\x00\x00\x01\x00\x00\x4c\xe8\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x06\x6c\x00\x00\x00\x00\x00\x01\x00\x01\x13\x4a\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x06\xbe\x00\x00\x00\x00\x00\x01\x00\x01\x14\xc6\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x05\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x6d\x23\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x05\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x29\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x11\x87\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x02\x60\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x41\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x04\x40\x00\x00\x00\x00\x00\x01\x00\x00\x64\xde\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x12\x82\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x06\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x71\x0f\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x06\x04\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x96\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x00\x70\x00\x00\x00\x00\x00\x01\x00\x00\x14\x6b\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x06\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x03\xf6\x00\x00\x00\x00\x00\x01\x00\x00\x60\x37\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x06\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x15\xdd\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x05\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x1a\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x03\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x51\x9c\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x01\x08\x00\x00\x00\x00\x00\x01\x00\x00\x1c\xe4\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x03\x92\x00\x00\x00\x00\x00\x01\x00\x00\x5a\x61\ \x00\x00\x01\x6e\xbb\xa8\x2e\xa4\ \x00\x00\x06\x90\x00\x00\x00\x00\x00\x01\x00\x01\x14\x50\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x1d\x66\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x03\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x52\x21\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x01\x92\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x5c\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x01\x74\x00\x00\x00\x00\x00\x01\x00\x00\x1e\xe7\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x04\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x68\x7b\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x00\xea\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x6a\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x74\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x01\x56\x00\x00\x00\x00\x00\x01\x00\x00\x1e\x65\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x02\x74\x78\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x03\xd3\x68\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x01\x18\x1f\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x81\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x03\xd2\x2e\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x12\x78\x00\x00\x00\x00\x00\x01\x00\x02\xab\xff\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x07\xea\x00\x00\x00\x00\x00\x01\x00\x03\x71\xa5\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\x66\x00\x00\x00\x00\x00\x01\x00\x03\x97\x7d\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0b\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x01\xcf\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\x50\x00\x00\x00\x00\x00\x01\x00\x03\xb5\x9d\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x11\x2e\x00\x00\x00\x00\x00\x01\x00\x03\x8c\xea\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x36\x00\x00\x00\x00\x00\x01\x00\x02\xe3\x01\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x12\x00\x00\x00\x00\x00\x01\x00\x03\xb3\xbe\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x14\xb6\x00\x00\x00\x00\x00\x01\x00\x03\x04\xd0\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x13\x86\x00\x00\x00\x00\x00\x01\x00\x03\x42\x25\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x07\xd4\x00\x00\x00\x00\x00\x01\x00\x03\x9d\xdb\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x03\x2a\xb4\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0a\x4a\x00\x00\x00\x00\x00\x01\x00\x03\x66\xc5\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\xc2\x00\x00\x00\x00\x00\x01\x00\x03\x60\x70\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\xa0\x00\x00\x00\x00\x00\x01\x00\x03\xcf\x54\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0f\x70\x00\x00\x00\x00\x00\x01\x00\x02\xfc\x30\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x03\xbc\x1e\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\x42\x00\x00\x00\x00\x00\x01\x00\x03\x91\x9a\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x14\x68\x00\x00\x00\x00\x00\x01\x00\x03\x3a\xb5\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0f\x44\x00\x00\x00\x00\x00\x01\x00\x03\x8a\xf5\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x11\xdc\x00\x00\x00\x00\x00\x01\x00\x03\x32\xe0\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\x6a\x00\x00\x00\x00\x00\x01\x00\x03\x1b\xf3\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0f\xc8\x00\x00\x00\x00\x00\x01\x00\x03\x4f\xae\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0b\xb8\x00\x00\x00\x00\x00\x01\x00\x03\xcb\x2a\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\x8e\x00\x00\x00\x00\x00\x01\x00\x03\x2f\xc3\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x10\x28\x00\x00\x00\x00\x00\x01\x00\x02\xa7\xb1\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\xde\x00\x00\x00\x00\x00\x01\x00\x03\x6e\xf1\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x66\x00\x00\x00\x00\x00\x01\x00\x03\x99\x75\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x03\x0e\x40\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x10\xf2\x00\x00\x00\x00\x00\x01\x00\x03\x5c\x53\ \x00\x00\x01\x6f\xd1\xc5\xf4\xb5\ \x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x02\xb8\xdb\ \x00\x00\x01\x6f\xd1\xc5\xf4\xd6\ \x00\x00\x0a\xce\x00\x00\x00\x00\x00\x01\x00\x02\xdd\x94\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x02\xaf\x3c\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\x14\x00\x00\x00\x00\x00\x01\x00\x02\xc6\xac\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x08\xaa\x00\x00\x00\x00\x00\x01\x00\x02\xaa\x82\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0a\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x82\xc1\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x11\xae\x00\x00\x00\x00\x00\x01\x00\x02\xe1\x1a\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0d\x08\x00\x00\x00\x00\x00\x01\x00\x02\xf5\xbd\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0d\x9e\x00\x00\x00\x00\x00\x01\x00\x03\x38\xd5\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\xe2\x00\x00\x00\x00\x00\x01\x00\x03\xa0\x0b\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x10\x7e\x00\x00\x00\x00\x00\x01\x00\x02\xfa\x29\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x1a\x62\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0b\xea\x00\x00\x00\x00\x00\x01\x00\x02\xd2\xa8\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0f\x26\x00\x00\x00\x00\x00\x01\x00\x02\xcc\x03\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0a\x06\x00\x00\x00\x00\x00\x01\x00\x02\xff\xf7\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x08\x76\x00\x00\x00\x00\x00\x01\x00\x03\x7f\xe1\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x03\x02\xfa\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0e\x96\x00\x00\x00\x00\x00\x01\x00\x03\x68\xf3\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x08\xe6\x00\x00\x00\x00\x00\x01\x00\x03\x35\x7e\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x14\xe4\x00\x00\x00\x00\x00\x01\x00\x03\x88\x0a\ \x00\x00\x01\x6f\x15\x4b\x80\x0d\ \x00\x00\x0d\x6a\x00\x00\x00\x00\x00\x01\x00\x02\xea\xb9\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x07\xac\x00\x00\x00\x00\x00\x01\x00\x02\xd1\x56\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0e\xc0\x00\x00\x00\x00\x00\x01\x00\x01\xce\xb3\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x12\x78\x00\x00\x00\x00\x00\x01\x00\x02\x1c\x54\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x07\xea\x00\x00\x00\x00\x00\x01\x00\x01\x30\x29\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0d\xea\x00\x00\x00\x00\x00\x01\x00\x01\xbc\x95\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0c\x66\x00\x00\x00\x00\x00\x01\x00\x01\x9a\xb5\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0b\x6e\x00\x00\x00\x00\x00\x01\x00\x01\x81\x9c\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\x50\x00\x00\x00\x00\x00\x01\x00\x02\x17\x47\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x11\x2e\x00\x00\x00\x00\x00\x01\x00\x01\xf7\xe8\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x36\x00\x00\x00\x00\x00\x01\x00\x02\x28\xe7\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x12\x00\x00\x00\x00\x00\x01\x00\x02\x27\x78\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x10\x5a\x00\x00\x00\x00\x00\x01\x00\x01\xeb\x42\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x86\x00\x00\x00\x00\x00\x01\x00\x02\x34\x25\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x07\xd4\x00\x00\x00\x00\x00\x01\x00\x01\x2e\xa0\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\xe8\x00\x00\x00\x00\x00\x01\x00\x02\x24\x04\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0a\x4a\x00\x00\x00\x00\x00\x01\x00\x01\x6c\x56\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x9e\x56\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x14\x92\x00\x00\x00\x00\x00\x01\x00\x02\x6d\x99\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x12\xa0\x00\x00\x00\x00\x00\x01\x00\x02\x1f\x7f\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0f\x70\x00\x00\x00\x00\x00\x01\x00\x01\xd8\xc0\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x12\x10\x00\x00\x00\x00\x00\x01\x00\x02\x07\x52\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x11\x16\x00\x00\x00\x00\x00\x01\x00\x01\xf6\xa5\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x11\x56\x00\x00\x00\x00\x00\x01\x00\x01\xfb\x82\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0b\x8e\x00\x00\x00\x00\x00\x01\x00\x01\x82\xb6\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\x42\x00\x00\x00\x00\x00\x01\x00\x01\x4d\x5c\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x14\x68\x00\x00\x00\x00\x00\x01\x00\x02\x67\x13\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x07\x90\x00\x00\x00\x00\x00\x01\x00\x01\x2c\x3c\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x13\xb4\x00\x00\x00\x00\x00\x01\x00\x02\x43\x35\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x11\x90\x00\x00\x00\x00\x00\x01\x00\x02\x01\xe0\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0f\x44\x00\x00\x00\x00\x00\x01\x00\x01\xd6\xad\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x11\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x05\x00\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x12\xc6\x00\x00\x00\x00\x00\x01\x00\x02\x21\xdc\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x09\x6a\x00\x00\x00\x00\x00\x01\x00\x01\x4f\x46\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0c\x48\x00\x00\x00\x00\x00\x01\x00\x01\x98\x86\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0f\xc8\x00\x00\x00\x00\x00\x01\x00\x01\xdd\x8b\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0e\x6a\x00\x00\x00\x00\x00\x01\x00\x01\xc1\x6d\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0a\x28\x00\x00\x00\x00\x00\x01\x00\x01\x69\xb1\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0b\xb8\x00\x00\x00\x00\x00\x01\x00\x01\x84\x8d\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x10\x02\x00\x00\x00\x00\x00\x01\x00\x01\xe6\xb5\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\x8e\x00\x00\x00\x00\x00\x01\x00\x01\x9c\x51\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x07\x2c\x00\x00\x00\x00\x00\x01\x00\x01\xf1\xee\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0b\x14\x00\x00\x00\x00\x00\x01\x00\x01\x7e\x40\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x10\x28\x00\x00\x00\x00\x00\x01\x00\x01\xe9\x2f\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0b\x44\x00\x00\x00\x00\x00\x01\x00\x01\x80\x95\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0c\xde\x00\x00\x00\x00\x00\x01\x00\x01\xa3\x1f\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x13\x66\x00\x00\x00\x00\x00\x01\x00\x02\x30\xbb\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x09\xaa\x00\x00\x00\x00\x00\x01\x00\x01\x5a\x48\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0e\xf0\x00\x00\x00\x00\x00\x01\x00\x01\xcf\xe7\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0e\x3c\x00\x00\x00\x00\x00\x01\x00\x01\xbf\xbd\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x10\xf2\x00\x00\x00\x00\x00\x01\x00\x01\xf4\x08\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x01\x21\x38\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0a\xce\x00\x00\x00\x00\x00\x01\x00\x01\x7b\x45\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0a\x96\x00\x00\x00\x00\x00\x01\x00\x01\x74\x27\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x09\x14\x00\x00\x00\x00\x00\x01\x00\x01\x49\x3a\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x08\xaa\x00\x00\x00\x00\x00\x01\x00\x01\x43\xc4\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0a\x6e\x00\x00\x00\x00\x00\x01\x00\x01\x6e\x25\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0d\x42\x00\x00\x00\x00\x00\x01\x00\x01\xa8\x73\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x11\xae\x00\x00\x00\x00\x00\x01\x00\x02\x03\x42\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x08\x5a\x00\x00\x00\x00\x00\x01\x00\x01\x40\x0e\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0d\x08\x00\x00\x00\x00\x00\x01\x00\x01\xa5\x93\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0e\x14\x00\x00\x00\x00\x00\x01\x00\x01\xbe\xb6\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0d\x9e\x00\x00\x00\x00\x00\x01\x00\x01\xb9\x4c\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x14\x12\x00\x00\x00\x00\x00\x01\x00\x02\x5a\x0a\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x13\xe2\x00\x00\x00\x00\x00\x01\x00\x02\x45\x92\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x14\x34\x00\x00\x00\x00\x00\x01\x00\x02\x5c\x0f\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x10\x7e\x00\x00\x00\x00\x00\x01\x00\x01\xec\x18\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x09\xe4\x00\x00\x00\x00\x00\x01\x00\x01\x67\x41\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0c\x24\x00\x00\x00\x00\x00\x01\x00\x01\x94\x76\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0b\xea\x00\x00\x00\x00\x00\x01\x00\x01\x89\xf1\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0f\x26\x00\x00\x00\x00\x00\x01\x00\x01\xd2\xc2\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0d\xb6\x00\x00\x00\x00\x00\x01\x00\x01\xba\xb5\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0a\x06\x00\x00\x00\x00\x00\x01\x00\x01\x68\x97\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x08\x76\x00\x00\x00\x00\x00\x01\x00\x01\x41\x0d\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x01\x44\xf7\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x08\x36\x00\x00\x00\x00\x00\x01\x00\x01\x3f\x0b\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x0e\x96\x00\x00\x00\x00\x00\x01\x00\x01\xca\x5c\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x0f\xaa\x00\x00\x00\x00\x00\x01\x00\x01\xdb\x18\ \x00\x00\x01\x6f\xce\xad\x3b\xf6\ \x00\x00\x08\xe6\x00\x00\x00\x00\x00\x01\x00\x01\x46\x7c\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x0d\x6a\x00\x00\x00\x00\x00\x01\x00\x01\xae\x13\ \x00\x00\x01\x6f\x15\x4b\x80\x0a\ \x00\x00\x10\xcc\x00\x00\x00\x00\x00\x01\x00\x01\xf2\xc7\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x07\xac\x00\x00\x00\x00\x00\x01\x00\x01\x2d\x7f\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ \x00\x00\x10\xa0\x00\x00\x00\x00\x00\x01\x00\x01\xee\x21\ \x00\x00\x01\x6f\x15\x4b\x80\x06\ " qt_version = [int(v) for v in QtCore.qVersion().split('.')] if qt_version < [5, 8, 0]: rcc_version = 1 qt_resource_struct = qt_resource_struct_v1 else: rcc_version = 2 qt_resource_struct = qt_resource_struct_v2 def qInitResources(): QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() picard-release-2.3.1/picard/script.py000066400000000000000000001171261362601763300175340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2009, 2012 Lukáš Lalinský # Copyright (C) 2007 Javier Kohen # Copyright (C) 2008-2011, 2014-2015, 2018-2020 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009 Nikolai Prokoschenko # Copyright (C) 2011-2012 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2012 stephen # Copyright (C) 2012, 2014, 2017 Wieland Hoffmann # Copyright (C) 2013-2014, 2017-2020 Laurent Monin # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2016-2017 Ville Skyttä # Copyright (C) 2017-2018 Antonio Larrosa # Copyright (C) 2018 Calvin Walton # Copyright (C) 2018 virusMac # Copyright (C) 2020 Bob Swift # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import namedtuple from collections.abc import MutableSequence import datetime from functools import reduce from inspect import getfullargspec import operator import re import unicodedata from picard import config from picard.metadata import ( MULTI_VALUED_JOINER, Metadata, ) from picard.plugin import ExtensionPoint from picard.util import uniqify class ScriptError(Exception): pass class ScriptParseError(ScriptError): pass class ScriptEndOfFile(ScriptParseError): pass class ScriptSyntaxError(ScriptParseError): pass class ScriptUnknownFunction(ScriptError): pass class ScriptText(str): def eval(self, state): return self def normalize_tagname(name): if name.startswith('_'): return "~" + name[1:] return name class ScriptVariable(object): def __init__(self, name): self.name = name def __repr__(self): return '' % self.name def eval(self, state): return state.context.get(normalize_tagname(self.name), "") FunctionRegistryItem = namedtuple("FunctionRegistryItem", ["function", "eval_args", "argcount"]) Bound = namedtuple("Bound", ["lower", "upper"]) class ScriptFunction(object): def __init__(self, name, args, parser): try: argnum_bound = parser.functions[name].argcount argcount = len(args) if argnum_bound: too_few_args = argcount < argnum_bound.lower if argnum_bound.upper is not None: if argnum_bound.lower == argnum_bound.upper: expected = "exactly %i" % argnum_bound.lower else: expected = "between %i and %i" % (argnum_bound.lower, argnum_bound.upper) too_many_args = argcount > argnum_bound.upper else: expected = "at least %i" % argnum_bound.lower too_many_args = False if too_few_args or too_many_args: raise ScriptError( "Wrong number of arguments for $%s: Expected %s, got %i at position %i, line %i" % (name, expected, argcount, parser._x, parser._y) ) except KeyError: raise ScriptUnknownFunction("Unknown function '%s'" % name) self.name = name self.args = args def __repr__(self): return "" % (self.name, self.args) def eval(self, parser): try: function, eval_args, num_args = parser.functions[self.name] except KeyError: raise ScriptUnknownFunction("Unknown function '%s'" % self.name) if eval_args: args = [arg.eval(parser) for arg in self.args] else: args = self.args return function(parser, *args) class ScriptExpression(list): def eval(self, state): return "".join([item.eval(state) for item in self]) def isidentif(ch): return ch.isalnum() or ch == '_' class ScriptParser(object): r"""Tagger script parser. Grammar: text ::= [^$%] | '\$' | '\%' | '\(' | '\)' | '\,' argtext ::= [^$%(),] | '\$' | '\%' | '\(' | '\)' | '\,' identifier ::= [a-zA-Z0-9_] variable ::= '%' identifier '%' function ::= '$' identifier '(' (argument (',' argument)*)? ')' expression ::= (variable | function | text)* argument ::= (variable | function | argtext)* """ _function_registry = ExtensionPoint(label='function_registry') _cache = {} def __raise_eof(self): raise ScriptEndOfFile("Unexpected end of script at position %d, line %d" % (self._x, self._y)) def __raise_char(self, ch): #line = self._text[self._line:].split("\n", 1)[0] #cursor = " " * (self._pos - self._line - 1) + "^" #raise ScriptSyntaxError("Unexpected character '%s' at position %d, line %d\n%s\n%s" % (ch, self._x, self._y, line, cursor)) raise ScriptSyntaxError("Unexpected character '%s' at position %d, line %d" % (ch, self._x, self._y)) def read(self): try: ch = self._text[self._pos] except IndexError: return None else: self._pos += 1 self._px = self._x self._py = self._y if ch == '\n': self._line = self._pos self._x = 1 self._y += 1 else: self._x += 1 return ch def unread(self): self._pos -= 1 self._x = self._px self._y = self._py def parse_arguments(self): results = [] while True: result, ch = self.parse_expression(False) results.append(result) if ch == ')': # Only an empty expression as first argument # is the same as no argument given. if len(results) == 1 and results[0] == []: return [] return results def parse_function(self): start = self._pos while True: ch = self.read() if ch == '(': name = self._text[start:self._pos-1] if name not in self.functions: raise ScriptUnknownFunction("Unknown function '%s'" % name) return ScriptFunction(name, self.parse_arguments(), self) elif ch is None: self.__raise_eof() elif not isidentif(ch): self.__raise_char(ch) def parse_variable(self): begin = self._pos while True: ch = self.read() if ch == '%': return ScriptVariable(self._text[begin:self._pos-1]) elif ch is None: self.__raise_eof() elif not isidentif(ch) and ch != ':': self.__raise_char(ch) def parse_text(self, top): text = [] while True: ch = self.read() if ch == "\\": ch = self.read() if ch == 'n': text.append('\n') elif ch == 't': text.append('\t') elif ch not in "$%(),\\": self.__raise_char(ch) else: text.append(ch) elif ch is None: break elif not top and ch == '(': self.__raise_char(ch) elif ch in '$%' or (not top and ch in ',)'): self.unread() break else: text.append(ch) return ScriptText("".join(text)) def parse_expression(self, top): tokens = ScriptExpression() while True: ch = self.read() if ch is None: if top: break else: self.__raise_eof() elif not top and ch in ',)': break elif ch == '$': tokens.append(self.parse_function()) elif ch == '%': tokens.append(self.parse_variable()) else: self.unread() tokens.append(self.parse_text(top)) return (tokens, ch) def load_functions(self): self.functions = {} for name, item in ScriptParser._function_registry: self.functions[name] = item def parse(self, script, functions=False): """Parse the script.""" self._text = script self._pos = 0 self._px = self._x = 1 self._py = self._y = 1 self._line = 0 if not functions: self.load_functions() return self.parse_expression(True)[0] def eval(self, script, context=None, file=None): """Parse and evaluate the script.""" self.context = context if context is not None else Metadata() self.file = file self.load_functions() key = hash(script) if key not in ScriptParser._cache: ScriptParser._cache[key] = self.parse(script, True) return ScriptParser._cache[key].eval(self) class MultiValue(MutableSequence): def __init__(self, parser, multi, separator): self.parser = parser if isinstance(separator, ScriptExpression): self.separator = separator.eval(self.parser) else: self.separator = separator if (self.separator == MULTI_VALUED_JOINER and len(multi) == 1 and isinstance(multi[0], ScriptVariable)): # Convert ScriptExpression containing only a single variable into variable self._multi = self.parser.context.getall(normalize_tagname(multi[0].name)) else: # Fall-back to converting to a string and splitting if haystack is an expression # or user has overridden the separator character. evaluated_multi = multi.eval(self.parser) if not evaluated_multi: self._multi = [] elif self.separator: self._multi = evaluated_multi.split(self.separator) else: self._multi = [evaluated_multi] def __len__(self): return len(self._multi) def __getitem__(self, key): return self._multi[key] def __setitem__(self, key, value): self._multi[key] = value def __delitem__(self, key): del self._multi[key] def insert(self, index, value): return self._multi.insert(index, value) def __repr__(self): return '%s(%r, %r, %r)' % (self.__class__.__name__, self.parser, self._multi, self.separator) def __str__(self): return self.separator.join(self) def enabled_tagger_scripts_texts(): """Returns an iterator over the enabled tagger scripts. For each script, you'll get a tuple consisting of the script name and text""" if not config.setting["enable_tagger_scripts"]: return [] return [(s_name, s_text) for _s_pos, s_name, s_enabled, s_text in config.setting["list_of_scripts"] if s_enabled and s_text] def register_script_function(function, name=None, eval_args=True, check_argcount=True): """Registers a script function. If ``name`` is ``None``, ``function.__name__`` will be used. If ``eval_args`` is ``False``, the arguments will not be evaluated before being passed to ``function``. If ``check_argcount`` is ``False`` the number of arguments passed to the function will not be verified.""" args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations = getfullargspec(function) required_kwonlyargs = len(kwonlyargs) if kwonlydefaults is not None: required_kwonlyargs -= len(kwonlydefaults.keys()) if required_kwonlyargs: raise TypeError("Functions with required keyword-only parameters are not supported") args = len(args) - 1 # -1 for the parser varargs = varargs is not None defaults = len(defaults) if defaults else 0 argcount = Bound(args - defaults, args if not varargs else None) if name is None: name = function.__name__ ScriptParser._function_registry.register(function.__module__, (name, FunctionRegistryItem( function, eval_args, argcount if argcount and check_argcount else False) ) ) def script_function(name=None, eval_args=True, check_argcount=True, prefix='func_'): """Decorator helper to register script functions It calls ``register_script_function()`` and share same arguments Extra optional arguments: ``prefix``: define the prefix to be removed from defined function to name script function By default, ``func_foo`` will create ``foo`` script function Example: @script_function(eval_args=False) def func_myscriptfunc(): ... """ def script_function_decorator(func): fname = func.__name__ if name is None and prefix and fname.startswith(prefix): sname = fname[len(prefix):] else: sname = name register_script_function(func, name=sname, eval_args=eval_args, check_argcount=check_argcount) return func return script_function_decorator def _compute_int(operation, *args): return str(reduce(operation, map(int, args))) def _compute_logic(operation, *args): return operation(args) @script_function(eval_args=False) def func_if(parser, _if, _then, _else=None): """If ``if`` is not empty, it returns ``then``, otherwise it returns ``else``.""" if _if.eval(parser): return _then.eval(parser) elif _else: return _else.eval(parser) return '' @script_function(eval_args=False) def func_if2(parser, *args): """Returns first non empty argument.""" for arg in args: arg = arg.eval(parser) if arg: return arg return '' @script_function(eval_args=False) def func_noop(parser, *args): """Does nothing :)""" return '' @script_function() def func_left(parser, text, length): """Returns first ``num`` characters from ``text``.""" try: return text[:int(length)] except ValueError: return "" @script_function() def func_right(parser, text, length): """Returns last ``num`` characters from ``text``.""" try: return text[-int(length):] except ValueError: return "" @script_function() def func_lower(parser, text): """Returns ``text`` in lower case.""" return text.lower() @script_function() def func_upper(parser, text): """Returns ``text`` in upper case.""" return text.upper() @script_function() def func_pad(parser, text, length, char): try: return char * (int(length) - len(text)) + text except ValueError: return "" @script_function() def func_strip(parser, text): return re.sub(r"\s+", " ", text).strip() @script_function() def func_replace(parser, text, old, new): return text.replace(old, new) @script_function() def func_in(parser, text, needle): if needle in text: return "1" else: return "" @script_function(eval_args=False) def func_inmulti(parser, haystack, needle, separator=MULTI_VALUED_JOINER): """Searches for ``needle`` in ``haystack``, supporting a list variable for ``haystack``. If a string is used instead, then a ``separator`` can be used to split it. In both cases, it returns true if the resulting list contains exactly ``needle`` as a member.""" needle = needle.eval(parser) return func_in(parser, MultiValue(parser, haystack, separator), needle) @script_function() def func_rreplace(parser, text, old, new): try: return re.sub(old, new, text) except re.error: return text @script_function() def func_rsearch(parser, text, pattern): try: match = re.search(pattern, text) except re.error: return "" if match: try: return match.group(1) except IndexError: return match.group(0) return "" @script_function() def func_num(parser, text, length): try: format_ = "%%0%dd" % max(0, min(int(length), 20)) except ValueError: return "" try: value = int(text) except ValueError: value = 0 return format_ % value @script_function() def func_unset(parser, name): """Unsets the variable ``name``.""" name = normalize_tagname(name) # Allow wild-card unset for certain keys if name in ('performer:*', 'comment:*', 'lyrics:*'): name = name[:-1] for key in list(parser.context.keys()): if key.startswith(name): parser.context.unset(key) return "" try: parser.context.unset(name) except KeyError: pass return "" @script_function() def func_delete(parser, name): """ Deletes the variable ``name``. This will unset the tag with the given name and also mark the tag for deletion on save. """ parser.context.delete(normalize_tagname(name)) return "" @script_function() def func_set(parser, name, value): """Sets the variable ``name`` to ``value``.""" if value: parser.context[normalize_tagname(name)] = value else: func_unset(parser, name) return "" @script_function() def func_setmulti(parser, name, value, separator=MULTI_VALUED_JOINER): """Sets the variable ``name`` to ``value`` as a list; splitting by the passed string, or "; " otherwise.""" return func_set(parser, name, value.split(separator) if value and separator else value) @script_function() def func_get(parser, name): """Returns the variable ``name`` (equivalent to ``%name%``).""" return parser.context.get(normalize_tagname(name), "") @script_function() def func_copy(parser, new, old): """Copies content of variable ``old`` to variable ``new``.""" new = normalize_tagname(new) old = normalize_tagname(old) parser.context[new] = parser.context.getall(old)[:] return "" @script_function() def func_copymerge(parser, new, old): """Copies content of variable ``old`` and appends it into variable ``new``, removing duplicates. This is normally used to merge a multi-valued variable into another, existing multi-valued variable.""" new = normalize_tagname(new) old = normalize_tagname(old) newvals = parser.context.getall(new) oldvals = parser.context.getall(old) parser.context[new] = uniqify(newvals + oldvals) return "" @script_function() def func_trim(parser, text, char=None): """Trims all leading and trailing whitespaces from ``text``. The optional second parameter specifies the character to trim.""" if char: return text.strip(char) else: return text.strip() @script_function() def func_add(parser, x, y, *args): """Adds ``y`` to ``x``. Can be used with an arbitrary number of arguments. Eg: $add(x, y, z) = ((x + y) + z) """ try: return _compute_int(operator.add, x, y, *args) except ValueError: return "" @script_function() def func_sub(parser, x, y, *args): """Subtracts ``y`` from ``x``. Can be used with an arbitrary number of arguments. Eg: $sub(x, y, z) = ((x - y) - z) """ try: return _compute_int(operator.sub, x, y, *args) except ValueError: return "" @script_function() def func_div(parser, x, y, *args): """Divides ``x`` by ``y``. Can be used with an arbitrary number of arguments. Eg: $div(x, y, z) = ((x / y) / z) """ try: return _compute_int(operator.floordiv, x, y, *args) except ValueError: return "" except ZeroDivisionError: return "" @script_function() def func_mod(parser, x, y, *args): """Returns the remainder of ``x`` divided by ``y``. Can be used with an arbitrary number of arguments. Eg: $mod(x, y, z) = ((x % y) % z) """ try: return _compute_int(operator.mod, x, y, *args) except (ValueError, ZeroDivisionError): return "" @script_function() def func_mul(parser, x, y, *args): """Multiplies ``x`` by ``y``. Can be used with an arbitrary number of arguments. Eg: $mul(x, y, z) = ((x * y) * z) """ try: return _compute_int(operator.mul, x, y, *args) except ValueError: return "" @script_function() def func_or(parser, x, y, *args): """Returns true, if either ``x`` or ``y`` not empty. Can be used with an arbitrary number of arguments. The result is true if ANY of the arguments is not empty. """ if _compute_logic(any, x, y, *args): return "1" else: return "" @script_function() def func_and(parser, x, y, *args): """Returns true, if both ``x`` and ``y`` are not empty. Can be used with an arbitrary number of arguments. The result is true if ALL of the arguments are not empty. """ if _compute_logic(all, x, y, *args): return "1" else: return "" @script_function() def func_not(parser, x): """Returns true, if ``x`` is empty.""" if not x: return "1" else: return "" @script_function() def func_eq(parser, x, y): """Returns true, if ``x`` equals ``y``.""" if x == y: return "1" else: return "" @script_function() def func_ne(parser, x, y): """Returns true, if ``x`` not equals ``y``.""" if x != y: return "1" else: return "" @script_function() def func_lt(parser, x, y): """Returns true, if ``x`` is lower than ``y``.""" try: if int(x) < int(y): return "1" except ValueError: pass return "" @script_function() def func_lte(parser, x, y): """Returns true, if ``x`` is lower than or equals ``y``.""" try: if int(x) <= int(y): return "1" except ValueError: pass return "" @script_function() def func_gt(parser, x, y): """Returns true, if ``x`` is greater than ``y``.""" try: if int(x) > int(y): return "1" except ValueError: pass return "" @script_function() def func_gte(parser, x, y): """Returns true, if ``x`` is greater than or equals ``y``.""" try: if int(x) >= int(y): return "1" except ValueError: pass return "" @script_function() def func_len(parser, text=""): return str(len(text)) @script_function(eval_args=False) def func_lenmulti(parser, multi, separator=MULTI_VALUED_JOINER): return str(len(MultiValue(parser, multi, separator))) @script_function() def func_performer(parser, pattern="", join=", "): values = [] for name, value in parser.context.items(): if name.startswith("performer:") and pattern in name: values.append(value) return join.join(values) @script_function(eval_args=False) def func_matchedtracks(parser, *args): # only works in file naming scripts, always returns zero in tagging scripts file = parser.file if file and file.parent and hasattr(file.parent, 'album'): return str(parser.file.parent.album.get_num_matched_tracks()) return "0" @script_function() def func_is_complete(parser): # only works in file naming scripts, always returns zero in tagging scripts file = parser.file if (file and file.parent and hasattr(file.parent, 'album') and file.parent.album.is_complete()): return "1" return "" @script_function() def func_firstalphachar(parser, text="", nonalpha="#"): if len(text) == 0: return nonalpha firstchar = text[0] if firstchar.isalpha(): return firstchar.upper() else: return nonalpha @script_function() def func_initials(parser, text=""): return "".join(a[:1] for a in text.split(" ") if a[:1].isalpha()) @script_function() def func_firstwords(parser, text, length): try: length = int(length) except ValueError: length = 0 if len(text) <= length: return text else: if text[length] == ' ': return text[:length] return text[:length].rsplit(' ', 1)[0] @script_function() def func_startswith(parser, text, prefix): if text.startswith(prefix): return "1" return "" @script_function() def func_endswith(parser, text, suffix): if text.endswith(suffix): return "1" return "" @script_function() def func_truncate(parser, text, length): try: length = int(length) except ValueError: length = None return text[:length].rstrip() @script_function(check_argcount=False) def func_swapprefix(parser, text, *prefixes): """ Moves the specified prefixes to the end of text. If no prefix is specified 'A' and 'The' are taken as default. """ # Inspired by the swapprefix plugin by Philipp Wolfer. text, prefix = _delete_prefix(parser, text, *prefixes) if prefix != '': return text + ', ' + prefix return text @script_function(check_argcount=False) def func_delprefix(parser, text, *prefixes): """ Deletes the specified prefixes. If no prefix is specified 'A' and 'The' are taken as default. """ # Inspired by the swapprefix plugin by Philipp Wolfer. return _delete_prefix(parser, text, *prefixes)[0] def _delete_prefix(parser, text, *prefixes): """ Worker function to deletes the specified prefixes. Returns remaining string and deleted part separately. If no prefix is specified 'A' and 'The' used. """ # Inspired by the swapprefix plugin by Philipp Wolfer. if not prefixes: prefixes = ('A', 'The') text = text.strip() rx = '(' + r'\s+)|('.join(map(re.escape, prefixes)) + r'\s+)' match = re.match(rx, text) if match: pref = match.group() return text[len(pref):], pref.strip() return text, '' @script_function(check_argcount=False) def func_eq_any(parser, x, *args): """ Return True if one string matches any of one or more other strings. $eq_any(a,b,c ...) is functionally equivalent to $or($eq(a,b),$eq(a,c) ...) Example: $if($eq_any(%artist%,foo,bar,baz),$set(engineer,test)) """ # Inspired by the eq2 plugin by Brian Schweitzer. return '1' if x in args else '' @script_function(check_argcount=False) def func_ne_all(parser, x, *args): """ Return True if one string doesn't match all of one or more other strings. $ne_all(a,b,c ...) is functionally equivalent to $and($ne(a,b),$ne(a,c) ...) Example: $if($ne_all(%artist%,foo,bar,baz),$set(engineer,test)) """ # Inspired by the ne2 plugin by Brian Schweitzer. return '1' if x not in args else '' @script_function(check_argcount=False) def func_eq_all(parser, x, *args): """ Return True if all string are equal. $eq_all(a,b,c ...) is functionally equivalent to $and($eq(a,b),$eq(a,c) ...) Example: $if($eq_all(%albumartist%,%artist%,Justin Bieber),$set(engineer,Meat Loaf)) """ for i in args: if x != i: return '' return '1' @script_function(check_argcount=False) def func_ne_any(parser, x, *args): """ Return True if all strings are not equal. $ne_any(a,b,c ...) is functionally equivalent to $or($ne(a,b),$ne(a,c) ...) Example: $if($ne_any(%albumartist%,%trackartist%,%composer%),$set(lyricist,%composer%)) """ return func_not(parser, func_eq_all(parser, x, *args)) @script_function() def func_title(parser, text): # GPL 2.0 licensed code by Javier Kohen, Sambhav Kothari # from https://github.com/metabrainz/picard-plugins/blob/2.0/plugins/titlecase/titlecase.py """ Title-case a text - capitalizes first letter of every word like: from "Lost in the Supermarket" to "Lost In The Supermarket" Example: $set(album,$title(%album%)) """ capitalized = text[0].capitalize() capital = False for i in range(1, len(text)): t = text[i] if t in "’'" and text[i-1].isalpha(): capital = False elif iswbound(t): capital = True elif capital and t.isalpha(): capital = False t = t.capitalize() else: capital = False capitalized += t return capitalized def iswbound(char): # GPL 2.0 licensed code by Javier Kohen, Sambhav Kothari # from https://github.com/metabrainz/picard-plugins/blob/2.0/plugins/titlecase/titlecase.py """ Checks whether the given character is a word boundary """ category = unicodedata.category(char) return "Zs" == category or "Sk" == category or "P" == category[0] @script_function() def func_is_audio(parser): """Returns true, if the file processed is an audio file.""" if func_is_video(parser) == "1": return "" else: return "1" @script_function() def func_is_video(parser): """Returns true, if the file processed is a video file.""" if parser.context['~video'] and parser.context['~video'] != '0': return "1" else: return "" @script_function() def func_find(parser, haystack, needle): """Find the location of the first occurrence of one string within another. Arguments: parser: The ScriptParser object used to parse the script. haystack: The string to search. needle: The substring to find. Returns: The zero-based index of the first occurrance of needle in haystack, or -1 if needle was not found. """ return str(haystack.find(needle)) @script_function() def func_reverse(parser, text): """Returns 'text' in reverse order. Arguments: parser: The ScriptParser object used to parse the script. text: String to be processed. Returns: Text in reverse order. """ return text[::-1] @script_function() def func_substr(parser, text, start_index, end_index): """Extract a specified portion of a string. Arguments: parser: The ScriptParser object used to parse the script. text: The string from which the extract will be made. start_index: Integer index of the first character to extract. end_index: Integer index of the first character that will not be extracted. Returns: Returns the substring beginning with the character at the start index, up to (but not including) the character at the end index. The first character is at index number 0. If the start index is left blank, it defaults to the first character in the string. If the end index is left blank, it defaults to the number of characters in the string. If either index is negative, it is subtracted from the total number of characters in the string to provide the index used. """ try: start = int(start_index) if start_index else None except ValueError: start = None try: end = int(end_index) if end_index else None except ValueError: end = None return text[start:end] @script_function(eval_args=False) def func_getmulti(parser, multi, item_index, separator=MULTI_VALUED_JOINER): """Returns value of the item at the specified index in the multi-value variable. Index values are zero-based. Arguments: parser: The ScriptParser object used to parse the script. multi: The multi-value from which the item is to be retrieved. item_index: The zero-based integer index of the item to be retrieved. separator: String used to separate the elements in the multi-value. Returns: Returns the value of the item at the specified index in the multi-value variable. """ if not item_index: return '' try: index = int(item_index.eval(parser)) multi_value = MultiValue(parser, multi, separator) return str(multi_value[index]) except (ValueError, IndexError): return '' @script_function(eval_args=False) def func_foreach(parser, multi, loop_code, separator=MULTI_VALUED_JOINER): """Iterates over each element found in the specified multi-value variable. Iterates over each element found in the specified multi-value variable, executing the specified code. For each loop, the element value is first stored in the tag specified by _loop_value and the count is stored in the tag specified by _loop_count. This allows the element or count value to be accessed within the code script. Arguments: parser: The ScriptParser object used to parse the script. multi: The multi-value to be iterated. loop_code: String of script code to be processed on each iteration. separator: String used to separate the elements in the multi-value. """ multi_value = MultiValue(parser, multi, separator) for loop_count, value in enumerate(multi_value, 1): func_set(parser, '_loop_count', str(loop_count)) func_set(parser, '_loop_value', str(value)) loop_code.eval(parser) func_unset(parser, '_loop_count') func_unset(parser, '_loop_value') return '' @script_function(eval_args=False) def func_while(parser, condition, loop_code): """Standard 'while' loop. Also includes a runaway check to limit the maximum number of iterations. Arguments: parser: The ScriptParser object used to parse the script. condition: String of script code to check before each iteration through the loop. loop_code: String of script code to be processed on each iteration. """ if condition and loop_code: runaway_check = 1000 loop_count = 0 while condition.eval(parser) and loop_count < runaway_check: loop_count += 1 func_set(parser, '_loop_count', str(loop_count)) loop_code.eval(parser) func_unset(parser, '_loop_count') return '' @script_function(eval_args=False) def func_map(parser, multi, loop_code, separator=MULTI_VALUED_JOINER): """Iterates over each element found in the specified multi-value variable and updates the value. Iterates over each element found in the specified multi-value variable and updates the value of the element to the value returned by the specified code. For each loop, the element value is first stored in the tag specified by _loop_value and the count is stored in the tag specified by _loop_count. This allows the element or count value to be accessed within the code script. Arguments: parser: The ScriptParser object used to parse the script. multi: The multi-value to be iterated. loop_code: String of script code to be processed on each iteration that yields the new value for the multi-value element. separator: String used to separate the elements in the multi-value. Returns the updated multi-value variable. """ multi_value = MultiValue(parser, multi, separator) for loop_count, value in enumerate(multi_value, 1): func_set(parser, '_loop_count', str(loop_count)) func_set(parser, '_loop_value', str(value)) multi_value[loop_count - 1] = str(loop_code.eval(parser)) func_unset(parser, '_loop_count') func_unset(parser, '_loop_value') return str(multi_value) @script_function(eval_args=False) def func_join(parser, multi, join_phrase, separator=MULTI_VALUED_JOINER): """Joins all elements in the specified multi-value variable, placing the join_phrase between each element. Arguments: parser: The ScriptParser object used to parse the script. multi: The ScriptVariable/Function that evaluates to a multi-value whose elements are to be joined. join_phrase: The ScriptVariable/Function that evaluates to a string which will be placed between each of the elements. separator: A string or the ScriptVariable/Function that evaluates to the string used to separate the elements in the multi-value. Returns a string with the elements joined. """ join_phrase = str(join_phrase.eval(parser)) multi_value = MultiValue(parser, multi, separator) return join_phrase.join(multi_value) @script_function(eval_args=False) def func_slice(parser, multi, start_index, end_index, separator=MULTI_VALUED_JOINER): """Returns a multi-value containing a slice of the supplied multi-value. Index values are zero-based. Arguments: parser: The ScriptParser object used to parse the script. multi: The ScriptVariable/Function that evaluates to a multi-value from which the slice is to be retrieved. start_index: The ScriptVariable/Function that evaluates to a zero-based integer index of the first item included in the slice. end_index: The ScriptVariable/Function that evaluates to a zero-based integer index of the first item not included in the slice. separator: A string or the ScriptVariable/Function that evaluates to the string used to separate the elements in the multi-value. Returns: Returns a multi-value variable containing the specified slice. """ try: start = int(start_index.eval(parser)) if start_index else None except ValueError: start = None try: end = int(end_index.eval(parser)) if end_index else None except ValueError: end = None multi_value = MultiValue(parser, multi, separator) return multi_value.separator.join(multi_value[start:end]) @script_function() def func_datetime(parser, format=None): """Return the current date and time as a string. Arguments: parser: The ScriptParser object used to parse the script. format: A string or the ScriptVariable/Function that evaluates to the string used to format the output. Default is '%Y-%m-%d %H:%M:%S' if blank. Uses strftime() format. Returns: Returns the current date and time as a string. """ # local_tz required for Python 3.5 which does not allow setting astimezone() # on a naive datetime.datetime object. This provides timezone information to # allow the use of %Z and %z in the output format. local_tz = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo # Handle case where format evaluates to '' if not format: format = '%Y-%m-%d %H:%M:%S' return datetime.datetime.now(tz=local_tz).strftime(format) @script_function(eval_args=False) def func_sortmulti(parser, multi, separator=MULTI_VALUED_JOINER): """Returns the supplied multi-value sorted in ascending order. parser: The ScriptParser object used to parse the script. multi: The ScriptVariable/Function that evaluates to a multi-value to be sorted. separator: A string or the ScriptVariable/Function that evaluates to the string used to separate the elements in the multi-value. Returns: Returns the supplied multi-value sorted in ascending order. """ multi_value = MultiValue(parser, multi, separator) return multi_value.separator.join(sorted(multi_value)) @script_function(eval_args=False) def func_reversemulti(parser, multi, separator=MULTI_VALUED_JOINER): """Returns the supplied multi-value in reverse order. parser: The ScriptParser object used to parse the script. multi: The ScriptVariable/Function that evaluates to a multi-value to be reversed. separator: A string or the ScriptVariable/Function that evaluates to the string used to separate the elements in the multi-value. Returns: Returns the supplied multi-value in reverse order. """ multi_value = MultiValue(parser, multi, separator) return multi_value.separator.join(reversed(multi_value)) picard-release-2.3.1/picard/similarity.py000066400000000000000000000045031362601763300204100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2008 Will # Copyright (C) 2011-2012 Michael Wiencek # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2017 Ville Skyttä # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from picard.util import strip_non_alnum from picard.util.astrcmp import astrcmp def normalize(orig_string): """Strips non-alphanumeric characters from a string unless doing so would make it blank.""" string = strip_non_alnum(orig_string.lower()) if not string: string = orig_string return string def similarity(a1, b1): """Calculates similarity of single words as a function of their edit distance.""" a2 = normalize(a1) if a2: b2 = normalize(b1) else: b2 = "" return astrcmp(a2, b2) _split_words_re = re.compile(r'\W+', re.UNICODE) def similarity2(a, b): """Calculates similarity of a multi-word strings.""" alist = list(filter(bool, _split_words_re.split(a.lower()))) blist = list(filter(bool, _split_words_re.split(b.lower()))) total = 0 score = 0.0 if len(alist) > len(blist): alist, blist = blist, alist for av in alist: ms = 0.0 mp = None for position, bv in enumerate(blist): s = astrcmp(av, bv) if s > ms: ms = s mp = position if mp is not None: score += ms if ms > 0.6: del blist[mp] total += 1 total += len(blist) * 0.4 if total: return score / total else: return 0 picard-release-2.3.1/picard/tagger.py000066400000000000000000001070541362601763300175000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2009, 2011-2014, 2017 Lukáš Lalinský # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2008 amckinle # Copyright (C) 2008-2010, 2014-2015, 2018-2020 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2010 Andrew Barnert # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2011-2014, 2017-2019 Wieland Hoffmann # Copyright (C) 2012 Chad Wilson # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013 Ionuț Ciocîrlan # Copyright (C) 2013 brainz34 # Copyright (C) 2013-2014, 2017 Sophist-UK # Copyright (C) 2013-2015, 2017-2019 Laurent Monin # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 Simon Legner # Copyright (C) 2016 Suhas # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017-2018 Vishal Choudhary # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 virusMac # Copyright (C) 2019 Joel Lintunen # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import argparse from functools import partial from itertools import chain import logging from operator import attrgetter import os.path import platform import re import shutil import signal import sys from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from PyQt5.QtDBus import QDBusConnection from picard import ( PICARD_APP_ID, PICARD_APP_NAME, PICARD_DESKTOP_NAME, PICARD_FANCY_VERSION_STR, PICARD_ORG_NAME, acoustid, config, log, ) from picard.acoustid.manager import AcoustIDManager from picard.album import ( Album, NatAlbum, run_album_post_removal_processors, ) from picard.browser.browser import BrowserIntegration from picard.browser.filelookup import FileLookup from picard.cluster import ( Cluster, ClusterList, UnclusteredFiles, ) from picard.collection import load_user_collections from picard.config_upgrade import upgrade_config from picard.const import ( USER_DIR, USER_PLUGIN_DIR, ) from picard.const.sys import ( IS_FROZEN, IS_HAIKU, IS_MACOS, IS_WIN, ) from picard.dataobj import DataObject from picard.disc import Disc from picard.file import File from picard.formats import open_ as open_file from picard.i18n import setup_gettext from picard.pluginmanager import PluginManager from picard.releasegroup import ReleaseGroup from picard.track import ( NonAlbumTrack, Track, ) from picard.util import ( check_io_encoding, decode_filename, encode_filename, is_hidden, mbid_validate, thread, uniqify, versions, webbrowser2, ) from picard.util.checkupdate import UpdateCheckManager from picard.webservice import WebService from picard.webservice.api_helpers import ( AcoustIdAPIHelper, MBAPIHelper, ) import picard.resources # noqa: F401 # pylint: disable=unused-import from picard.ui.itemviews import BaseTreeView from picard.ui.mainwindow import MainWindow from picard.ui.searchdialog.album import AlbumSearchDialog from picard.ui.searchdialog.artist import ArtistSearchDialog from picard.ui.searchdialog.track import TrackSearchDialog # A "fix" for https://bugs.python.org/issue1438480 def _patched_shutil_copystat(src, dst, *, follow_symlinks=True): try: _orig_shutil_copystat(src, dst, follow_symlinks=follow_symlinks) except OSError: pass _orig_shutil_copystat = shutil.copystat shutil.copystat = _patched_shutil_copystat class Tagger(QtWidgets.QApplication): tagger_stats_changed = QtCore.pyqtSignal() listen_port_changed = QtCore.pyqtSignal(int) cluster_added = QtCore.pyqtSignal(Cluster) cluster_removed = QtCore.pyqtSignal(Cluster) album_added = QtCore.pyqtSignal(Album) album_removed = QtCore.pyqtSignal(Album) __instance = None _debug = False _no_restore = False def __init__(self, picard_args, unparsed_args, localedir, autoupdate): # Use the new fusion style from PyQt5 for a modern and consistent look # across all OSes. if not IS_MACOS and not IS_HAIKU: self.setStyle('Fusion') super().__init__(sys.argv) self.__class__.__instance = self config._setup(self, picard_args.config_file) super().setStyleSheet( 'QGroupBox::title { /* PICARD-1206, Qt bug workaround */ }' ) self._cmdline_files = picard_args.FILE self.autoupdate_enabled = autoupdate self._no_restore = picard_args.no_restore self._no_plugins = picard_args.no_plugins self.set_log_level(config.setting['log_verbosity']) if picard_args.debug or "PICARD_DEBUG" in os.environ: self.set_log_level(logging.DEBUG) # FIXME: Figure out what's wrong with QThreadPool.globalInstance(). # It's a valid reference, but its start() method doesn't work. self.thread_pool = QtCore.QThreadPool(self) # Provide a separate thread pool for operations that should not be # delayed by longer background processing tasks, e.g. because the user # expects instant feedback instead of waiting for a long list of # operations to finish. self.priority_thread_pool = QtCore.QThreadPool(self) # Use a separate thread pool for file saving, with a thread count of 1, # to avoid race conditions in File._save_and_rename. self.save_thread_pool = QtCore.QThreadPool(self) self.save_thread_pool.setMaxThreadCount(1) if not IS_WIN: # Set up signal handling # It's not possible to call all available functions from signal # handlers, therefore we need to set up a QSocketNotifier to listen # on a socket. Sending data through a socket can be done in a # signal handler, so we use the socket to notify the application of # the signal. # This code is adopted from # https://qt-project.org/doc/qt-4.8/unix-signals.html # To not make the socket module a requirement for the Windows # installer, import it here and not globally import socket self.signalfd = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM, 0) self.signalnotifier = QtCore.QSocketNotifier(self.signalfd[1].fileno(), QtCore.QSocketNotifier.Read, self) self.signalnotifier.activated.connect(self.sighandler) signal.signal(signal.SIGHUP, self.signal) signal.signal(signal.SIGINT, self.signal) signal.signal(signal.SIGTERM, self.signal) if IS_MACOS: # On macOS it is not common that the global menu shows icons self.setAttribute(QtCore.Qt.AA_DontShowIconsInMenus) # Ensure monospace font works on macOS QtGui.QFont.insertSubstitution('Monospace', 'Menlo') # Setup logging log.debug("Starting Picard from %r", os.path.abspath(__file__)) log.debug("Platform: %s %s %s", platform.platform(), platform.python_implementation(), platform.python_version()) log.debug("Versions: %s", versions.as_string()) log.debug("Configuration file path: %r", config.config.fileName()) log.debug("User directory: %r", os.path.abspath(USER_DIR)) # for compatibility with pre-1.3 plugins QtCore.QObject.tagger = self QtCore.QObject.config = config QtCore.QObject.log = log check_io_encoding() # Must be before config upgrade because upgrade dialogs need to be # translated setup_gettext(localedir, config.setting["ui_language"], log.debug) upgrade_config(config.config) self.webservice = WebService() self.mb_api = MBAPIHelper(self.webservice) load_user_collections() # Initialize fingerprinting acoustid_api = AcoustIdAPIHelper(self.webservice) self._acoustid = acoustid.AcoustIDClient(acoustid_api) self._acoustid.init() self.acoustidmanager = AcoustIDManager(acoustid_api) # Load plugins self.pluginmanager = PluginManager() if not self._no_plugins: if IS_FROZEN: self.pluginmanager.load_plugins_from_directory(os.path.join(os.path.dirname(sys.argv[0]), "plugins")) else: mydir = os.path.dirname(os.path.abspath(__file__)) self.pluginmanager.load_plugins_from_directory(os.path.join(mydir, "plugins")) if not os.path.exists(USER_PLUGIN_DIR): os.makedirs(USER_PLUGIN_DIR) self.pluginmanager.load_plugins_from_directory(USER_PLUGIN_DIR) self.browser_integration = BrowserIntegration() self.files = {} self.clusters = ClusterList() self.albums = {} self.release_groups = {} self.mbid_redirects = {} self.unclustered_files = UnclusteredFiles() self.nats = None self.window = MainWindow() self.exit_cleanup = [] self.stopping = False # Load release version information if self.autoupdate_enabled: self.updatecheckmanager = UpdateCheckManager(parent=self.window) def register_cleanup(self, func): self.exit_cleanup.append(func) def run_cleanup(self): for f in self.exit_cleanup: f() def set_log_level(self, level): self._debug = level == logging.DEBUG log.set_level(level) def mb_login(self, callback, parent=None): scopes = "profile tag rating collection submit_isrc submit_barcode" authorization_url = self.webservice.oauth_manager.get_authorization_url(scopes) webbrowser2.open(authorization_url) if not parent: parent = self.window dialog = QtWidgets.QInputDialog(parent) dialog.setWindowModality(QtCore.Qt.WindowModal) dialog.setWindowTitle(_("MusicBrainz Account")) dialog.setLabelText(_("Authorization code:")) status = dialog.exec_() if status == QtWidgets.QDialog.Accepted: authorization_code = dialog.textValue() self.webservice.oauth_manager.exchange_authorization_code( authorization_code, scopes, partial(self.on_mb_authorization_finished, callback)) else: callback(False) def on_mb_authorization_finished(self, callback, successful=False): if successful: self.webservice.oauth_manager.fetch_username( partial(self.on_mb_login_finished, callback)) else: callback(False) @classmethod def on_mb_login_finished(self, callback, successful): if successful: load_user_collections() callback(successful) def mb_logout(self): self.webservice.oauth_manager.revoke_tokens() load_user_collections() def move_files_to_album(self, files, albumid=None, album=None): """Move `files` to tracks on album `albumid`.""" if album is None: album = self.load_album(albumid) if album.loaded: album.match_files(files) else: for file in list(files): file.move(album.unmatched_files) def move_file_to_album(self, file, albumid): """Move `file` to a track on album `albumid`.""" self.move_files_to_album([file], albumid) def move_file_to_track(self, file, albumid, recordingid): """Move `file` to recording `recordingid` on album `albumid`.""" album = self.load_album(albumid) file.move(album.unmatched_files) album.run_when_loaded(partial(album.match_files, [file], recordingid=recordingid)) def create_nats(self): if self.nats is None: self.nats = NatAlbum() self.albums["NATS"] = self.nats self.album_added.emit(self.nats) self.nats.item.setExpanded(True) return self.nats def move_file_to_nat(self, file, recordingid, node=None): self.create_nats() file.move(self.nats.unmatched_files) nat = self.load_nat(recordingid, node=node) nat.run_when_loaded(partial(file.move, nat)) if nat.loaded: self.nats.update() def exit(self): if self.stopping: return self.stopping = True log.debug("Picard stopping") self._acoustid.done() self.thread_pool.waitForDone() self.save_thread_pool.waitForDone() self.priority_thread_pool.waitForDone() self.browser_integration.stop() self.webservice.stop() self.run_cleanup() QtCore.QCoreApplication.processEvents() def _run_init(self): if self._cmdline_files: files = [] for file in self._cmdline_files: if os.path.isdir(file): self.add_directory(decode_filename(file)) else: files.append(decode_filename(file)) if files: self.add_files(files) del self._cmdline_files def run(self): if config.setting["browser_integration"]: self.browser_integration.start() self.window.show() QtCore.QTimer.singleShot(0, self._run_init) res = self.exec_() self.exit() return res def event(self, event): if isinstance(event, thread.ProxyToMainEvent): event.run() elif event.type() == QtCore.QEvent.FileOpen: file = event.file() if os.path.isdir(file): self.add_directory(file) else: self.add_files([file]) # We should just return True here, except that seems to # cause the event's sender to get a -9874 error, so # apparently there's some magic inside QFileOpenEvent... return 1 return super().event(event) def _file_loaded(self, file, target=None): if file is None or file.has_error(): return if target is not None: self.move_files([file], target) return if not config.setting["ignore_file_mbids"]: recordingid = file.metadata['musicbrainz_recordingid'] is_valid_recordingid = mbid_validate(recordingid) albumid = file.metadata['musicbrainz_albumid'] is_valid_albumid = mbid_validate(albumid) if is_valid_albumid and is_valid_recordingid: log.debug("%r has release (%s) and recording (%s) MBIDs, moving to track...", file, albumid, recordingid) self.move_file_to_track(file, albumid, recordingid) return if is_valid_albumid: log.debug("%r has only release MBID (%s), moving to album...", file, albumid) self.move_file_to_album(file, albumid) return if is_valid_recordingid: log.debug("%r has only recording MBID (%s), moving to non-album track...", file, recordingid) self.move_file_to_nat(file, recordingid) return # fallback on analyze if nothing else worked if config.setting['analyze_new_files'] and file.can_analyze(): log.debug("Trying to analyze %r ...", file) self.analyze([file]) def move_files(self, files, target): if target is None: log.debug("Aborting move since target is invalid") return if isinstance(target, (Track, Cluster)): for file in files: file.move(target) QtCore.QCoreApplication.processEvents() elif isinstance(target, File): for file in files: file.move(target.parent) QtCore.QCoreApplication.processEvents() elif isinstance(target, Album): self.move_files_to_album(files, album=target) elif isinstance(target, ClusterList): self.cluster(files) def add_files(self, filenames, target=None): """Add files to the tagger.""" ignoreregex = None pattern = config.setting['ignore_regex'] if pattern: try: ignoreregex = re.compile(pattern) except re.error as e: log.error("Failed evaluating regular expression for ignore_regex: %s", e) ignore_hidden = config.setting["ignore_hidden_files"] new_files = [] for filename in filenames: filename = os.path.normpath(os.path.realpath(filename)) if ignore_hidden and is_hidden(filename): log.debug("File ignored (hidden): %r" % (filename)) continue # Ignore .smbdelete* files which Applie iOS SMB creates by renaming a file when it cannot delete it if os.path.basename(filename).startswith(".smbdelete"): log.debug("File ignored (.smbdelete): %r", filename) continue if ignoreregex is not None and ignoreregex.search(filename): log.info("File ignored (matching %r): %r" % (pattern, filename)) continue if filename not in self.files: file = open_file(filename) if file: self.files[filename] = file new_files.append(file) if new_files: log.debug("Adding files %r", new_files) new_files.sort(key=lambda x: x.filename) if target is None or target is self.unclustered_files: self.unclustered_files.add_files(new_files) target = None for file in new_files: file.load(partial(self._file_loaded, target=target)) def add_directory(self, path): if config.setting['recursively_add_files']: self._add_directory_recursive(path) else: self._add_directory_non_recursive(path) def _add_directory_recursive(self, path): ignore_hidden = config.setting["ignore_hidden_files"] walk = os.walk(path) def get_files(): try: root, dirs, files = next(walk) if ignore_hidden: dirs[:] = [d for d in dirs if not is_hidden(os.path.join(root, d))] except StopIteration: return None else: number_of_files = len(files) if number_of_files: mparms = { 'count': number_of_files, 'directory': root, } log.debug("Adding %(count)d files from '%(directory)r'" % mparms) self.window.set_statusbar_message( ngettext( "Adding %(count)d file from '%(directory)s' ...", "Adding %(count)d files from '%(directory)s' ...", number_of_files), mparms, translate=None, echo=None ) return (os.path.join(root, f) for f in files) def process(result=None, error=None): if result: if error is None: self.add_files(result) thread.run_task(get_files, process) process(True, False) def _add_directory_non_recursive(self, path): files = [] for f in os.listdir(path): listing = os.path.join(path, f) if os.path.isfile(listing): files.append(listing) number_of_files = len(files) if number_of_files: mparms = { 'count': number_of_files, 'directory': path, } log.debug("Adding %(count)d files from '%(directory)r'" % mparms) self.window.set_statusbar_message( ngettext( "Adding %(count)d file from '%(directory)s' ...", "Adding %(count)d files from '%(directory)s' ...", number_of_files), mparms, translate=None, echo=None ) # Function call only if files exist self.add_files(files) def get_file_lookup(self): """Return a FileLookup object.""" return FileLookup(self, config.setting["server_host"], config.setting["server_port"], self.browser_integration.port) def copy_files(self, objects): mimeData = QtCore.QMimeData() mimeData.setUrls([QtCore.QUrl.fromLocalFile(f.filename) for f in (self.get_files_from_objects(objects))]) self.clipboard().setMimeData(mimeData) def paste_files(self, target): mimeData = self.clipboard().mimeData() if mimeData.hasUrls(): BaseTreeView.drop_urls(mimeData.urls(), target) def search(self, text, search_type, adv=False, mbid_matched_callback=None, force_browser=False): """Search on the MusicBrainz website.""" search_types = { 'track': { 'entity': 'recording', 'dialog': TrackSearchDialog }, 'album': { 'entity': 'release', 'dialog': AlbumSearchDialog }, 'artist': { 'entity': 'artist', 'dialog': ArtistSearchDialog }, } if search_type not in search_types: return search = search_types[search_type] lookup = self.get_file_lookup() if config.setting["builtin_search"] and not force_browser: if not lookup.mbid_lookup(text, search['entity'], mbid_matched_callback=mbid_matched_callback): dialog = search['dialog'](self.window) dialog.search(text) dialog.exec_() else: lookup.search_entity(search['entity'], text, adv, mbid_matched_callback=mbid_matched_callback) def collection_lookup(self): """Lookup the users collections on the MusicBrainz website.""" lookup = self.get_file_lookup() lookup.collection_lookup(config.persist["oauth_username"]) def browser_lookup(self, item): """Lookup the object's metadata on the MusicBrainz website.""" lookup = self.get_file_lookup() metadata = item.metadata # Only lookup via MB IDs if matched to a DataObject; otherwise ignore and use metadata details if isinstance(item, DataObject): itemid = item.id if isinstance(item, Track): lookup.recording_lookup(itemid) elif isinstance(item, Album): lookup.album_lookup(itemid) else: lookup.tag_lookup( metadata["albumartist"] if item.is_album_like() else metadata["artist"], metadata["album"], metadata["title"], metadata["tracknumber"], '' if item.is_album_like() else str(metadata.length), item.filename if isinstance(item, File) else '') def get_files_from_objects(self, objects, save=False): """Return list of files from list of albums, clusters, tracks or files.""" return uniqify(chain(*[obj.iterfiles(save) for obj in objects])) def save(self, objects): """Save the specified objects.""" files = self.get_files_from_objects(objects, save=True) for file in files: file.save() def load_album(self, album_id, discid=None): album_id = self.mbid_redirects.get(album_id, album_id) album = self.albums.get(album_id) if album: log.debug("Album %s already loaded.", album_id) album.add_discid(discid) return album album = Album(album_id, discid=discid) self.albums[album_id] = album self.album_added.emit(album) album.load() return album def load_nat(self, nat_id, node=None): self.create_nats() nat = self.get_nat_by_id(nat_id) if nat: log.debug("NAT %s already loaded.", nat_id) return nat nat = NonAlbumTrack(nat_id) self.nats.tracks.append(nat) self.nats.update(True) if node: nat._parse_recording(node) else: nat.load() return nat def get_nat_by_id(self, nat_id): if self.nats is not None: for nat in self.nats.tracks: if nat.id == nat_id: return nat def get_release_group_by_id(self, rg_id): return self.release_groups.setdefault(rg_id, ReleaseGroup(rg_id)) def remove_files(self, files, from_parent=True): """Remove files from the tagger.""" for file in files: if file.filename in self.files: file.clear_lookup_task() self._acoustid.stop_analyze(file) del self.files[file.filename] file.remove(from_parent) self.tagger_stats_changed.emit() def remove_album(self, album): """Remove the specified album.""" log.debug("Removing %r", album) if album.id not in self.albums: return album.stop_loading() self.remove_files(self.get_files_from_objects([album])) del self.albums[album.id] if album.release_group: album.release_group.remove_album(album.id) if album == self.nats: self.nats = None self.album_removed.emit(album) run_album_post_removal_processors(album) self.tagger_stats_changed.emit() def remove_nat(self, track): """Remove the specified non-album track.""" log.debug("Removing %r", track) self.remove_files(self.get_files_from_objects([track])) self.nats.tracks.remove(track) if not self.nats.tracks: self.remove_album(self.nats) else: self.nats.update(True) def remove_cluster(self, cluster): """Remove the specified cluster.""" if not cluster.special: log.debug("Removing %r", cluster) files = list(cluster.files) cluster.files = [] cluster.clear_lookup_task() self.remove_files(files, from_parent=False) self.clusters.remove(cluster) self.cluster_removed.emit(cluster) def remove(self, objects): """Remove the specified objects.""" files = [] for obj in objects: if isinstance(obj, File): files.append(obj) elif isinstance(obj, NonAlbumTrack): self.remove_nat(obj) elif isinstance(obj, Track): files.extend(obj.linked_files) elif isinstance(obj, Album): self.window.set_statusbar_message( N_("Removing album %(id)s: %(artist)s - %(album)s"), { 'id': obj.id, 'artist': obj.metadata['albumartist'], 'album': obj.metadata['album'] } ) self.remove_album(obj) elif isinstance(obj, UnclusteredFiles): files.extend(list(obj.files)) elif isinstance(obj, Cluster): self.remove_cluster(obj) if files: self.remove_files(files) def _lookup_disc(self, disc, result=None, error=None): self.restore_cursor() if error is not None: QtWidgets.QMessageBox.critical(self.window, _("CD Lookup Error"), _("Error while reading CD:\n\n%s") % error) else: disc.lookup() def lookup_cd(self, action): """Reads CD from the selected drive and tries to lookup the DiscID on MusicBrainz.""" if isinstance(action, QtWidgets.QAction): device = action.data() elif config.setting["cd_lookup_device"] != '': device = config.setting["cd_lookup_device"].split(",", 1)[0] else: # rely on python-discid auto detection device = None disc = Disc() self.set_wait_cursor() thread.run_task( partial(disc.read, encode_filename(device)), partial(self._lookup_disc, disc), traceback=self._debug) @property def use_acoustid(self): return config.setting["fingerprinting_system"] == "acoustid" def analyze(self, objs): """Analyze the file(s).""" if not self.use_acoustid: return files = self.get_files_from_objects(objs) for file in files: file.set_pending() self._acoustid.analyze(file, partial(file._lookup_finished, File.LOOKUP_ACOUSTID)) def generate_fingerprints(self, objs): """Generate the fingerprints without matching the files.""" if not self.use_acoustid: return files = self.get_files_from_objects(objs) def finished(file, result): file.clear_pending() for file in files: file.set_pending() self._acoustid.fingerprint(file, partial(finished, file)) # ======================================================================= # Metadata-based lookups # ======================================================================= def autotag(self, objects): for obj in objects: if obj.can_autotag(): obj.lookup_metadata() # ======================================================================= # Clusters # ======================================================================= def cluster(self, objs): """Group files with similar metadata to 'clusters'.""" log.debug("Clustering %r", objs) if len(objs) <= 1 or self.unclustered_files in objs: files = list(self.unclustered_files.files) else: files = self.get_files_from_objects(objs) for name, artist, files in Cluster.cluster(files, 1.0): QtCore.QCoreApplication.processEvents() cluster = self.load_cluster(name, artist) for file in sorted(files, key=attrgetter('discnumber', 'tracknumber', 'base_filename')): file.move(cluster) QtCore.QCoreApplication.processEvents() def load_cluster(self, name, artist): for cluster in self.clusters: cm = cluster.metadata if name == cm["album"] and artist == cm["albumartist"]: return cluster cluster = Cluster(name, artist) self.clusters.append(cluster) self.cluster_added.emit(cluster) return cluster # ======================================================================= # Utils # ======================================================================= def set_wait_cursor(self): """Sets the waiting cursor.""" super().setOverrideCursor( QtGui.QCursor(QtCore.Qt.WaitCursor)) def restore_cursor(self): """Restores the cursor set by ``set_wait_cursor``.""" super().restoreOverrideCursor() def refresh(self, objs): for obj in objs: if obj.can_refresh(): obj.load(priority=True, refresh=True) def bring_tagger_front(self): self.window.setWindowState(self.window.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) self.window.raise_() self.window.activateWindow() @classmethod def instance(cls): return cls.__instance def signal(self, signum, frame): log.debug("signal %i received", signum) # Send a notification about a received signal from the signal handler # to Qt. self.signalfd[0].sendall(b"a") def sighandler(self): self.signalnotifier.setEnabled(False) self.exit() self.quit() self.signalnotifier.setEnabled(True) def version(): print("%s %s %s" % (PICARD_ORG_NAME, PICARD_APP_NAME, PICARD_FANCY_VERSION_STR)) def longversion(): print(versions.as_string()) def process_picard_args(): parser = argparse.ArgumentParser( epilog="If one of the filenames begins with a hyphen, use -- to separate the options from the filenames." ) # Qt default arguments. Parse them so Picard does not interpret the # arguments as file names to load. parser.add_argument("-style", nargs=1, help=argparse.SUPPRESS) parser.add_argument("-stylesheet", nargs=1, help=argparse.SUPPRESS) # Same for default X arguments parser.add_argument("-display", nargs=1, help=argparse.SUPPRESS) # Picard specific arguments parser.add_argument("-c", "--config-file", action='store', default=None, help="location of the configuration file") parser.add_argument("-d", "--debug", action='store_true', help="enable debug-level logging") parser.add_argument("-N", "--no-restore", action='store_true', help="do not restore positions and/or sizes") parser.add_argument("-P", "--no-plugins", action='store_true', help="do not load any plugins") parser.add_argument('-v', '--version', action='store_true', help="display version information and exit") parser.add_argument("-V", "--long-version", action='store_true', help="display long version information and exit") parser.add_argument('FILE', nargs='*') picard_args, unparsed_args = parser.parse_known_args() return picard_args, unparsed_args def main(localedir=None, autoupdate=True): # Some libs (ie. Phonon) require those to be set QtWidgets.QApplication.setApplicationName(PICARD_APP_NAME) QtWidgets.QApplication.setOrganizationName(PICARD_ORG_NAME) QtWidgets.QApplication.setDesktopFileName(PICARD_DESKTOP_NAME) # Allow High DPI Support QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps) QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) # Enable mnemonics on all platforms, even macOS QtGui.qt_set_sequence_auto_mnemonic(True) signal.signal(signal.SIGINT, signal.SIG_DFL) picard_args, unparsed_args = process_picard_args() if picard_args.version: return version() if picard_args.long_version: return longversion() if not (IS_WIN or IS_MACOS or IS_HAIKU): dbus = QDBusConnection.sessionBus() dbus.registerService(PICARD_APP_ID) tagger = Tagger(picard_args, unparsed_args, localedir, autoupdate) # Initialize Qt default translations translator = QtCore.QTranslator() locale = QtCore.QLocale() translation_path = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath) log.debug("Looking for Qt locale %s in %s", locale.name(), translation_path) if translator.load(locale, "qtbase_", directory=translation_path): tagger.installTranslator(translator) else: log.debug('Qt locale %s not available', locale.name()) tagger.startTimer(1000) sys.exit(tagger.run()) picard-release-2.3.1/picard/track.py000066400000000000000000000343041362601763300173300ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2007, 2011 Lukáš Lalinský # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2010, 2014-2015, 2018-2020 Philipp Wolfer # Copyright (C) 2011 Chad Wilson # Copyright (C) 2011 Wieland Hoffmann # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2014-2015, 2018-2019 Laurent Monin # Copyright (C) 2016 Mark Trolley # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 Suhas # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2017-2018 Sambhav Kothari # Copyright (C) 2018 Calvin Walton # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2019 Joel Lintunen # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict from functools import partial from itertools import filterfalse import re import traceback from PyQt5 import QtCore from picard import ( config, log, ) from picard.const import ( DATA_TRACK_TITLE, SILENCE_TRACK_TITLE, VARIOUS_ARTISTS_ID, ) from picard.dataobj import DataObject from picard.file import ( run_file_post_addition_to_track_processors, run_file_post_removal_from_track_processors, ) from picard.mbjson import recording_to_metadata from picard.metadata import ( Metadata, run_track_metadata_processors, ) from picard.script import ( ScriptError, ScriptParser, enabled_tagger_scripts_texts, ) from picard.util.imagelist import ( ImageList, add_metadata_images, remove_metadata_images, update_metadata_images, ) from picard.util.textencoding import asciipunct from picard.ui.item import Item _TRANSLATE_TAGS = { "hip hop": "Hip-Hop", "synth-pop": "Synthpop", "electronica": "Electronic", } class TagGenreFilter: def __init__(self, filters): self.errors = dict() self.match_regexes = defaultdict(list) for lineno, line in enumerate(filters.splitlines()): line = line.strip() if line and line[0] in ('+', '-'): _list = line[0] remain = line[1:].strip() if not remain: continue if len(remain) > 2 and remain[0] == '/' and remain[-1] == '/': remain = remain[1:-1] try: regex_search = re.compile(remain, re.IGNORECASE) except Exception as e: log.error("Failed to compile regex /%s/: %s", remain, e) self.errors[lineno] = str(e) regex_search = None else: # FIXME?: only support '*' (not '?' or '[abc]') # replace multiple '*' by one star = re.escape('*') remain = re.sub(star + '+', '*', remain) regex = '.*'.join([re.escape(x) for x in remain.split('*')]) regex_search = re.compile('^' + regex + '$', re.IGNORECASE) if regex_search: self.match_regexes[_list].append(regex_search) def skip(self, tag): if not self.match_regexes: return False for regex in self.match_regexes['+']: if regex.search(tag): return False for regex in self.match_regexes['-']: if regex.search(tag): return True return False def filter(self, list_of_tags): return list(filterfalse(self.skip, list_of_tags)) class TrackArtist(DataObject): def __init__(self, ta_id): super().__init__(ta_id) class Track(DataObject, Item): metadata_images_changed = QtCore.pyqtSignal() def __init__(self, track_id, album=None): DataObject.__init__(self, track_id) self.album = album self.linked_files = [] self.num_linked_files = 0 self.metadata = Metadata() self.orig_metadata = Metadata() self.error = None self._track_artists = [] def __repr__(self): return '' % (self.id, self.metadata["title"]) def add_file(self, file): if file not in self.linked_files: track_will_expand = self.num_linked_files == 1 self.linked_files.append(file) self.num_linked_files += 1 self.update_file_metadata(file) add_metadata_images(self, [file]) self.album._add_file(self, file) file.metadata_images_changed.connect(self.update_orig_metadata_images) run_file_post_addition_to_track_processors(self, file) if track_will_expand: # Files get expanded, ensure the existing item renders correctly self.linked_files[0].update_item() def update_file_metadata(self, file): if file not in self.linked_files: return file.copy_metadata(self.metadata) file.metadata['~extension'] = file.orig_metadata['~extension'] file.update(signal=False) self.update() def remove_file(self, file): if file not in self.linked_files: return self.linked_files.remove(file) self.num_linked_files -= 1 file.copy_metadata(file.orig_metadata, preserve_deleted=False) file.metadata_images_changed.disconnect(self.update_orig_metadata_images) self.album._remove_file(self, file) remove_metadata_images(self, [file]) run_file_post_removal_from_track_processors(self, file) self.update() def update(self): if self.item: self.item.update() def iterfiles(self, save=False): for file in self.linked_files: yield file def is_linked(self): return self.num_linked_files > 0 def can_save(self): """Return if this object can be saved.""" for file in self.linked_files: if file.can_save(): return True return False def can_remove(self): """Return if this object can be removed.""" for file in self.linked_files: if file.can_remove(): return True return False def can_edit_tags(self): """Return if this object supports tag editing.""" return True def can_view_info(self): return self.num_linked_files == 1 or self.metadata.images def column(self, column): m = self.metadata if column == 'title': prefix = "%s-" % m['discnumber'] if m['discnumber'] and m['totaldiscs'] != "1" else "" return "%s%s %s" % (prefix, m['tracknumber'].zfill(2), m['title']) elif column in m: return m[column] elif self.num_linked_files == 1: return self.linked_files[0].column(column) def is_video(self): return self.metadata['~video'] == '1' def is_pregap(self): return self.metadata['~pregap'] == '1' def is_data(self): return self.metadata['~datatrack'] == '1' def is_silence(self): return self.metadata['~silence'] == '1' def is_complete(self): return self.ignored_for_completeness() or self.num_linked_files == 1 def ignored_for_completeness(self): if (config.setting['completeness_ignore_videos'] and self.is_video()) \ or (config.setting['completeness_ignore_pregap'] and self.is_pregap()) \ or (config.setting['completeness_ignore_data'] and self.is_data()) \ or (config.setting['completeness_ignore_silence'] and self.is_silence()): return True return False def append_track_artist(self, ta_id): """Append artist id to the list of track artists and return an TrackArtist instance""" track_artist = TrackArtist(ta_id) self._track_artists.append(track_artist) return track_artist def _customize_metadata(self): tm = self.metadata # Custom VA name if tm['musicbrainz_artistid'] == VARIOUS_ARTISTS_ID: tm['artistsort'] = tm['artist'] = config.setting['va_name'] if tm['title'] == DATA_TRACK_TITLE: tm['~datatrack'] = '1' if tm['title'] == SILENCE_TRACK_TITLE: tm['~silence'] = '1' if config.setting['use_genres']: self._convert_folksonomy_tags_to_genre() # Convert Unicode punctuation if config.setting['convert_punctuation']: tm.apply_func(asciipunct) def _convert_folksonomy_tags_to_genre(self): # Combine release and track tags tags = dict(self.genres) self.merge_genres(tags, self.album.genres) if self.album.release_group: self.merge_genres(tags, self.album.release_group.genres) if not tags and config.setting['artists_genres']: # For compilations use each track's artists to look up tags if self.metadata['musicbrainz_albumartistid'] == VARIOUS_ARTISTS_ID: for artist in self._track_artists: self.merge_genres(tags, artist.genres) else: for artist in self.album.get_album_artists(): self.merge_genres(tags, artist.genres) # Ignore tags with zero or lower score tags = dict((name, count) for name, count in tags.items() if count > 0) if not tags: return # Convert counts to values from 0 to 100 maxcount = max(tags.values()) taglist = [] for name, count in tags.items(): taglist.append((100 * count // maxcount, name)) taglist.sort(reverse=True) # And generate the genre metadata tag maxtags = config.setting['max_genres'] minusage = config.setting['min_genre_usage'] tag_filter = TagGenreFilter(config.setting['genres_filter']) genre = [] for usage, name in taglist[:maxtags]: if tag_filter.skip(name): continue if usage < minusage: break name = _TRANSLATE_TAGS.get(name, name.title()) genre.append(name) join_genres = config.setting['join_genres'] if join_genres: genre = [join_genres.join(genre)] self.metadata['genre'] = genre def update_orig_metadata_images(self): update_metadata_images(self) def keep_original_images(self): for file in self.linked_files: file.keep_original_images() self.update_orig_metadata_images() if self.linked_files: self.metadata.images = self.orig_metadata.images.copy() else: self.metadata.images = ImageList() self.update() class NonAlbumTrack(Track): def __init__(self, nat_id): super().__init__(nat_id, self.tagger.nats) self.callback = None self.loaded = False self.status = None def can_refresh(self): return True def column(self, column): if column == "title": if self.status is not None: return self.status else: return self.metadata['title'] return super().column(column) def load(self, priority=False, refresh=False): self.metadata.copy(self.album.metadata, copy_images=False) self.status = _("[loading recording information]") self.error = None self.loaded = False self.album.update(True) mblogin = False inc = ["artist-credits", "artists", "aliases"] if config.setting["track_ars"]: inc += ["artist-rels", "url-rels", "recording-rels", "work-rels", "work-level-rels"] mblogin = self.set_genre_inc_params(inc) or mblogin if config.setting["enable_ratings"]: mblogin = True inc += ["user-ratings"] self.tagger.mb_api.get_track_by_id(self.id, partial(self._recording_request_finished), inc, mblogin=mblogin, priority=priority, refresh=refresh) def can_remove(self): return True def _recording_request_finished(self, recording, http, error): if error: self._set_error(http.errorString()) return try: self._parse_recording(recording) for file in self.linked_files: self.update_file_metadata(file) except Exception: self._set_error(traceback.format_exc()) def _set_error(self, error): log.error("%r", error) self.status = _("[could not load recording %s]") % self.id self.error = error self.album.update(True) def _parse_recording(self, recording): m = self.metadata recording_to_metadata(recording, m, self) self.orig_metadata.copy(m) self._customize_metadata() run_track_metadata_processors(self.album, m, recording) for s_name, s_text in enabled_tagger_scripts_texts(): parser = ScriptParser() try: parser.eval(s_text, m) except ScriptError: log.exception("Failed to run tagger script %s on track", s_name) m.strip_whitespace() self.loaded = True self.status = None if self.callback: self.callback() self.callback = None self.album.update(True) def _customize_metadata(self): super()._customize_metadata() self.metadata['album'] = self.album.metadata['album'] def run_when_loaded(self, func): if self.loaded: func() else: self.callback = func picard-release-2.3.1/picard/ui/000077500000000000000000000000001362601763300162635ustar00rootroot00000000000000picard-release-2.3.1/picard/ui/__init__.py000066400000000000000000000071751362601763300204060ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2014 Sophist-UK # Copyright (C) 2014, 2018 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2019-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import uuid from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import config from picard.util import restore_method class PreserveGeometry: defaultsize = None autorestore = True def __init__(self): config.Option("persist", self.opt_name(), QtCore.QByteArray()) if self.autorestore: self.restore_geometry() if getattr(self, 'finished', None): self.finished.connect(self.save_geometry) def opt_name(self): return 'geometry_' + self.__class__.__name__ @restore_method def restore_geometry(self): geometry = config.persist[self.opt_name()] if not geometry.isNull(): self.restoreGeometry(geometry) elif self.defaultsize: self.resize(self.defaultsize) def save_geometry(self): config.persist[self.opt_name()] = self.saveGeometry() class SingletonDialog: _instance = None @classmethod def get_instance(cls, *args, **kwargs): if not cls._instance: cls._instance = cls(*args, **kwargs) cls._instance.finished.connect(cls._on_dialog_finished) return cls._instance @classmethod def show_instance(cls, *args, **kwargs): instance = cls.get_instance(*args, **kwargs) instance.show() instance.raise_() instance.activateWindow() return instance @classmethod def _on_dialog_finished(cls): cls._instance = None class PicardDialog(QtWidgets.QDialog, PreserveGeometry): flags = QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowCloseButtonHint def __init__(self, parent=None): super().__init__(parent, self.flags) def keyPressEvent(self, event): if event.matches(QtGui.QKeySequence.Close): self.close() else: super().keyPressEvent(event) # With py3, QObjects are no longer hashable unless they have # an explicit __hash__ implemented. # See: http://python.6.x6.nabble.com/QTreeWidgetItem-is-not-hashable-in-Py3-td5212216.html class HashableTreeWidgetItem(QtWidgets.QTreeWidgetItem): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.id = uuid.uuid4() def __eq__(self, other): return self.id == other.id def __hash__(self): return hash(str(self.id)) class HashableListWidgetItem(QtWidgets.QListWidgetItem): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.id = uuid.uuid4() def __eq__(self, other): return self.id == other.id def __hash__(self): return hash(str(self.id)) picard-release-2.3.1/picard/ui/cdlookup.py000066400000000000000000000122171362601763300204600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2009, 2018-2019 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2013-2014, 2018 Laurent Monin # Copyright (C) 2014 Sophist-UK # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import ( config, log, ) from picard.mbjson import ( artist_credit_from_node, label_info_from_node, release_dates_and_countries_from_node, ) from picard.util import ( compare_barcodes, restore_method, ) from picard.ui import PicardDialog from picard.ui.ui_cdlookup import Ui_Dialog class CDLookupDialog(PicardDialog): autorestore = False dialog_header_state = "cdlookupdialog_header_state" options = [ config.Option("persist", dialog_header_state, QtCore.QByteArray()) ] def __init__(self, releases, disc, parent=None): super().__init__(parent) self.releases = releases self.disc = disc self.ui = Ui_Dialog() self.ui.setupUi(self) release_list = self.ui.release_list release_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) release_list.setSortingEnabled(True) release_list.setAlternatingRowColors(True) release_list.setHeaderLabels([_("Album"), _("Artist"), _("Date"), _("Country"), _("Labels"), _("Catalog #s"), _("Barcode")]) self.ui.submit_button.setIcon(QtGui.QIcon(":/images/cdrom.png")) if self.releases: def myjoin(l): return "\n".join(l) self.ui.results_view.setCurrentIndex(0) selected = None for release in self.releases: labels, catalog_numbers = label_info_from_node(release['label-info']) dates, countries = release_dates_and_countries_from_node(release) barcode = release['barcode'] if "barcode" in release else "" item = QtWidgets.QTreeWidgetItem(release_list) if disc.mcn and compare_barcodes(barcode, disc.mcn): selected = item item.setText(0, release['title']) item.setText(1, artist_credit_from_node(release['artist-credit'])[0]) item.setText(2, myjoin(dates)) item.setText(3, myjoin(countries)) item.setText(4, myjoin(labels)) item.setText(5, myjoin(catalog_numbers)) item.setText(6, barcode) item.setData(0, QtCore.Qt.UserRole, release['id']) release_list.setCurrentItem(selected or release_list.topLevelItem(0)) self.ui.ok_button.setEnabled(True) for i in range(release_list.columnCount() - 1): release_list.resizeColumnToContents(i) # Sort by descending date, then ascending country release_list.sortByColumn(3, QtCore.Qt.AscendingOrder) release_list.sortByColumn(2, QtCore.Qt.DescendingOrder) else: self.ui.results_view.setCurrentIndex(1) self.ui.lookup_button.clicked.connect(self.lookup) self.ui.submit_button.clicked.connect(self.lookup) self.restore_geometry() self.restore_header_state() self.finished.connect(self.save_header_state) def accept(self): release_list = self.ui.release_list for index in release_list.selectionModel().selectedRows(): release_id = release_list.itemFromIndex(index).data(0, QtCore.Qt.UserRole) self.tagger.load_album(release_id, discid=self.disc.id) super().accept() def lookup(self): lookup = self.tagger.get_file_lookup() lookup.disc_lookup(self.disc.submission_url) super().accept() @restore_method def restore_header_state(self): if self.ui.release_list: header = self.ui.release_list.header() state = config.persist[self.dialog_header_state] if state: header.restoreState(state) log.debug("restore_state: %s" % self.dialog_header_state) def save_header_state(self): if self.ui.release_list: state = self.ui.release_list.header().saveState() config.persist[self.dialog_header_state] = state log.debug("save_state: %s" % self.dialog_header_state) picard-release-2.3.1/picard/ui/checkbox_list_item.py000066400000000000000000000024561362601763300225030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QListWidgetItem class CheckboxListItem(QListWidgetItem): def __init__(self, text='', checked=False, data=None): super().__init__() self.setText(text) self.setFlags(self.flags() | Qt.ItemIsUserCheckable) self.setCheckState(Qt.Checked if checked else Qt.Unchecked) self.data = data @property def checked(self): return self.checkState() == Qt.Checked picard-release-2.3.1/picard/ui/collectionmenu.py000066400000000000000000000136551362601763300216670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013 Michael Wiencek # Copyright (C) 2014-2015, 2018 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Philipp Wolfer # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import locale from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard.collection import ( load_user_collections, user_collections, ) class CollectionMenu(QtWidgets.QMenu): def __init__(self, albums, *args): super().__init__(*args) self.ids = set(a.id for a in albums) self._ignore_update = False self.update_collections() def update_collections(self): self._ignore_update = True self.clear() self.actions = [] for id_, collection in sorted(user_collections.items(), key=lambda k_v: (locale.strxfrm(str(k_v[1])), k_v[0])): action = QtWidgets.QWidgetAction(self) action.setDefaultWidget(CollectionMenuItem(self, collection)) self.addAction(action) self.actions.append(action) self._ignore_update = False self.addSeparator() self.refresh_action = self.addAction(_("Refresh List")) self.hovered.connect(self.update_highlight) def refresh_list(self): self.refresh_action.setEnabled(False) load_user_collections(self.update_collections) def mouseReleaseEvent(self, event): # Not using self.refresh_action.triggered because it closes the menu if self.actionAt(event.pos()) == self.refresh_action and self.refresh_action.isEnabled(): self.refresh_list() def update_highlight(self, action): if self._ignore_update: return for a in self.actions: a.defaultWidget().set_active(a == action) def update_active_action_for_widget(self, widget): if self._ignore_update: return for action in self.actions: action_widget = action.defaultWidget() is_active = action_widget == widget if is_active: self._ignore_hover = True self.setActiveAction(action) self._ignore_hover = False action_widget.set_active(is_active) class CollectionMenuItem(QtWidgets.QWidget): def __init__(self, menu, collection): super().__init__() self.menu = menu self.active = False self._setup_layout(menu, collection) self._setup_colors() def _setup_layout(self, menu, collection): layout = QtWidgets.QVBoxLayout(self) style = self.style() layout.setContentsMargins( style.pixelMetric(QtWidgets.QStyle.PM_LayoutLeftMargin), style.pixelMetric(QtWidgets.QStyle.PM_FocusFrameVMargin), style.pixelMetric(QtWidgets.QStyle.PM_LayoutRightMargin), style.pixelMetric(QtWidgets.QStyle.PM_FocusFrameVMargin)) self.checkbox = CollectionCheckBox(self, menu, collection) layout.addWidget(self.checkbox) def _setup_colors(self): palette = self.palette() self.text_color = palette.text().color() self.highlight_color = palette.highlightedText().color() def set_active(self, active): self.active = active palette = self.palette() textcolor = self.highlight_color if active else self.text_color palette.setColor(QtGui.QPalette.WindowText, textcolor) self.checkbox.setPalette(palette) def enterEvent(self, e): self.menu.update_active_action_for_widget(self) def leaveEvent(self, e): self.set_active(False) def paintEvent(self, e): painter = QtWidgets.QStylePainter(self) option = QtWidgets.QStyleOptionMenuItem() option.initFrom(self) option.state = QtWidgets.QStyle.State_None if self.isEnabled(): option.state |= QtWidgets.QStyle.State_Enabled if self.active: option.state |= QtWidgets.QStyle.State_Selected painter.drawControl(QtWidgets.QStyle.CE_MenuItem, option) class CollectionCheckBox(QtWidgets.QCheckBox): def __init__(self, parent, menu, collection): self.menu = menu self.collection = collection super().__init__(self.label(), parent) releases = collection.releases & menu.ids if len(releases) == len(menu.ids): self.setCheckState(QtCore.Qt.Checked) elif not releases: self.setCheckState(QtCore.Qt.Unchecked) else: self.setCheckState(QtCore.Qt.PartiallyChecked) def nextCheckState(self): ids = self.menu.ids if ids & self.collection.pending: return diff = ids - self.collection.releases if diff: self.collection.add_releases(diff, self.updateText) self.setCheckState(QtCore.Qt.Checked) else: self.collection.remove_releases(ids & self.collection.releases, self.updateText) self.setCheckState(QtCore.Qt.Unchecked) def updateText(self): self.setText(self.label()) def label(self): c = self.collection return ngettext("%s (%i release)", "%s (%i releases)", c.size) % (c.name, c.size) picard-release-2.3.1/picard/ui/colors.py000066400000000000000000000065611362601763300201460ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Laurent Monin # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import QtGui from picard import config class DefaultColor: def __init__(self, value, description): self.value = value self.description = description _DEFAULT_COLORS = { 'entity_error': DefaultColor('#C80000', N_("Errored entity")), 'entity_pending': DefaultColor('#808080', N_("Pending entity")), 'entity_saved': DefaultColor('#00AA00', N_("Saved entity")), 'log_debug': DefaultColor('purple', N_('Log view text (debug)')), 'log_error': DefaultColor('red', N_('Log view text (error)')), 'log_info': DefaultColor('black', N_('Log view text (info)')), 'log_warning': DefaultColor('darkorange', N_('Log view text (warning)')), 'tagstatus_added': DefaultColor('green', N_("Tag added")), 'tagstatus_changed': DefaultColor('darkgoldenrod', N_("Tag changed")), 'tagstatus_removed': DefaultColor('red', N_("Tag removed")), } class InterfaceColors: def __init__(self): self.default_colors() def default_colors(self): self._colors = dict() for color_key in _DEFAULT_COLORS: color_value = _DEFAULT_COLORS[color_key].value self.set_color(color_key, color_value) def set_colors(self, colors_dict): for color_key in _DEFAULT_COLORS: if color_key in colors_dict: color_value = colors_dict[color_key] else: color_value = _DEFAULT_COLORS[color_key].value self.set_color(color_key, color_value) def load_from_config(self): self.set_colors(config.setting['interface_colors']) def get_colors(self): return self._colors def get_color(self, color_key): try: return self._colors[color_key] except KeyError: if color_key in _DEFAULT_COLORS: return _DEFAULT_COLORS[color_key].value raise Exception("Unknown color key: %s" % color_key) def get_qcolor(self, color_key): return QtGui.QColor(self.get_color(color_key)) @staticmethod def get_color_description(color_key): return _(_DEFAULT_COLORS[color_key].description) def set_color(self, color_key, color_value): if color_key in _DEFAULT_COLORS: qcolor = QtGui.QColor(color_value) if qcolor.isValid(): color = qcolor.name() else: color = _DEFAULT_COLORS[color_key].value self._colors[color_key] = color else: raise Exception("Unknown color key: %s" % color_key) interface_colors = InterfaceColors() picard-release-2.3.1/picard/ui/coverartbox.py000066400000000000000000000553161362601763300212050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2011 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009, 2018-2020 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2012-2014 Wieland Hoffmann # Copyright (C) 2013-2014, 2017-2019 Laurent Monin # Copyright (C) 2014 Francois Ferrand # Copyright (C) 2015 Sophist-UK # Copyright (C) 2016 Ville Skyttä # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Paul Roub # Copyright (C) 2017-2019 Antonio Larrosa # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import os import re from PyQt5 import ( QtCore, QtGui, QtNetwork, QtWidgets, ) from picard import ( config, log, ) from picard.album import Album from picard.cluster import Cluster from picard.const import MAX_COVERS_TO_STACK from picard.coverart.image import ( CoverArtImage, CoverArtImageError, ) from picard.file import File from picard.track import Track from picard.util import imageinfo from picard.util.lrucache import LRUCache class ActiveLabel(QtWidgets.QLabel): """Clickable QLabel.""" clicked = QtCore.pyqtSignal() image_dropped = QtCore.pyqtSignal(QtCore.QUrl, bytes) def __init__(self, active=True, drops=False, *args): super().__init__(*args) self.setMargin(0) self.setActive(active) self.setAcceptDrops(drops) def setActive(self, active): self.active = active if self.active: self.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) else: self.setCursor(QtGui.QCursor()) def mouseReleaseEvent(self, event): if self.active and event.button() == QtCore.Qt.LeftButton: self.clicked.emit() @staticmethod def dragEnterEvent(event): event.acceptProposedAction() @staticmethod def dragMoveEvent(event): event.acceptProposedAction() def dropEvent(self, event): accepted = False # Chromium includes the actual data of the dragged image in the drop event. This # is useful for Google Images, where the url links to the page that contains the image # so we use it if the downloaded url is not an image. mime_data = event.mimeData() dropped_data = bytes(mime_data.data('application/octet-stream')) if not dropped_data: dropped_data = bytes(mime_data.data('application/x-qt-image')) if not dropped_data: # Maybe we can get something useful from a dropped HTML snippet. dropped_data = bytes(mime_data.data('text/html')) if not accepted: for url in mime_data.urls(): if url.scheme() in ('https', 'http', 'file'): accepted = True log.debug("Dropped %s url (with %d bytes of data)", url.toString(), len(dropped_data or '')) self.image_dropped.emit(url, dropped_data) if not accepted: if mime_data.hasImage(): image_bytes = QtCore.QByteArray() image_buffer = QtCore.QBuffer(image_bytes) mime_data.imageData().save(image_buffer, 'JPEG') dropped_data = bytes(image_bytes) accepted = True log.debug("Dropped %d bytes of Qt image data", len(dropped_data)) self.image_dropped.emit(QtCore.QUrl(''), dropped_data) if accepted: event.acceptProposedAction() class CoverArtThumbnail(ActiveLabel): def __init__(self, active=False, drops=False, pixmap_cache=None, *args, **kwargs): super().__init__(active, drops, *args, **kwargs) self.data = None self.has_common_images = None self.shadow = QtGui.QPixmap(":/images/CoverArtShadow.png") self.pixel_ratio = self.tagger.primaryScreen().devicePixelRatio() w, h = self.scaled(128, 128) self.shadow = self.shadow.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) self.shadow.setDevicePixelRatio(self.pixel_ratio) self.release = None self.setPixmap(self.shadow) self.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignHCenter) self.clicked.connect(self.open_release_page) self.related_images = [] self._pixmap_cache = pixmap_cache self.current_pixmap_key = None def __eq__(self, other): if len(self.data) or len(other.data): return self.current_pixmap_key == other.current_pixmap_key else: return True def scaled(self, *dimensions): return (self.pixel_ratio * dimension for dimension in dimensions) def show(self): self.set_data(self.data, True) def decorate_cover(self, pixmap): offx, offy, w, h = self.scaled(1, 1, 121, 121) cover = QtGui.QPixmap(self.shadow) pixmap = pixmap.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) pixmap.setDevicePixelRatio(self.pixel_ratio) painter = QtGui.QPainter(cover) bgcolor = QtGui.QColor.fromRgb(0, 0, 0, 128) painter.fillRect(QtCore.QRectF(offx, offy, w, h), bgcolor) x = offx + (w - pixmap.width()) // 2 y = offy + (h - pixmap.height()) // 2 painter.drawPixmap(x, y, pixmap) painter.end() return cover def set_data(self, data, force=False, has_common_images=True): if not force and self.data == data and self.has_common_images == has_common_images: return self.data = data self.has_common_images = has_common_images if not force and self.parent().isHidden(): return if not self.data: self.setPixmap(self.shadow) self.current_pixmap_key = None return if len(self.data) == 1: has_common_images = True w, h, displacements = self.scaled(128, 128, 20) key = hash(tuple(sorted(self.data, key=lambda x: x.types_as_string())) + (has_common_images,)) try: pixmap = self._pixmap_cache[key] except KeyError: if len(self.data) == 1: pixmap = QtGui.QPixmap() pixmap.loadFromData(self.data[0].data) pixmap = self.decorate_cover(pixmap) else: limited = len(self.data) > MAX_COVERS_TO_STACK if limited: data_to_paint = data[:MAX_COVERS_TO_STACK - 1] offset = displacements * len(data_to_paint) else: data_to_paint = data offset = displacements * (len(data_to_paint) - 1) stack_width, stack_height = (w + offset, h + offset) pixmap = QtGui.QPixmap(stack_width, stack_height) bgcolor = self.palette().color(QtGui.QPalette.Window) painter = QtGui.QPainter(pixmap) painter.fillRect(QtCore.QRectF(0, 0, stack_width, stack_height), bgcolor) cx = stack_width - w // 2 cy = h // 2 if limited: x, y = (cx - self.shadow.width() // 2, cy - self.shadow.height() // 2) for i in range(3): painter.drawPixmap(x, y, self.shadow) x -= displacements // 3 y += displacements // 3 cx -= displacements cy += displacements else: cx = stack_width - w // 2 cy = h // 2 for image in reversed(data_to_paint): if isinstance(image, QtGui.QPixmap): thumb = image else: thumb = QtGui.QPixmap() thumb.loadFromData(image.data) thumb = self.decorate_cover(thumb) x, y = (cx - thumb.width() // 2, cy - thumb.height() // 2) painter.drawPixmap(x, y, thumb) cx -= displacements cy += displacements if not has_common_images: color = QtGui.QColor("darkgoldenrod") border_length = 10 for k in range(border_length): color.setAlpha(255 - k * 255 // border_length) painter.setPen(color) painter.drawLine(x, y - k - 1, x + 121 + k + 1, y - k - 1) painter.drawLine(x + 121 + k + 2, y - 1 - k, x + 121 + k + 2, y + 121 + 4) for k in range(5): bgcolor.setAlpha(80 + k * 255 // 7) painter.setPen(bgcolor) painter.drawLine(x + 121 + 2, y + 121 + 2 + k, x + 121 + border_length + 2, y + 121 + 2 + k) painter.end() pixmap = pixmap.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) self._pixmap_cache[key] = pixmap pixmap.setDevicePixelRatio(self.pixel_ratio) self.setPixmap(pixmap) self.current_pixmap_key = key def set_metadata(self, metadata): data = None self.related_images = [] if metadata and metadata.images: self.related_images = metadata.images data = [image for image in metadata.images if image.is_front_image()] if not data: # There's no front image, choose the first one available data = [metadata.images[0]] has_common_images = getattr(metadata, 'has_common_images', True) self.set_data(data, has_common_images=has_common_images) release = None if metadata: release = metadata.get("musicbrainz_albumid", None) if release: self.setActive(True) text = _("View release on MusicBrainz") else: self.setActive(False) text = "" if hasattr(metadata, 'has_common_images'): if has_common_images: note = _('Common images on all tracks') else: note = _('Tracks contain different images') if text: text += '
' text += '%s' % note self.setToolTip(text) self.release = release def open_release_page(self): lookup = self.tagger.get_file_lookup() lookup.album_lookup(self.release) def set_image_replace(obj, coverartimage): obj.metadata.images.strip_front_images() obj.metadata.images.append(coverartimage) def set_image_append(obj, coverartimage): obj.metadata.images.append(coverartimage) HTML_IMG_SRC_REGEX = re.compile(r' 0: self._move_row(row, -1) def move_row_down(self): row = self.value_list.currentRow() if row + 1 < self.value_list.count(): self._move_row(row, 1) def _move_row(self, row, direction): value_list = self.value_list item = value_list.takeItem(row) new_row = row + direction value_list.insertItem(new_row, item) value_list.setCurrentRow(new_row) def disable_all(self): self.value_list.clear() self.value_list.setEnabled(False) self.ui.add_value.setEnabled(False) def enable_all(self): self.value_list.setEnabled(True) self.ui.add_value.setEnabled(True) def tag_changed(self, tag): tag_names = self.ui.tag_names tag_names.editTextChanged.disconnect(self.tag_changed) line_edit = tag_names.lineEdit() cursor_pos = line_edit.cursorPosition() flags = QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive # if the previous tag was new and has no value, remove it from the QComboBox. # e.g. typing "XYZ" should not leave "X" or "XY" in the QComboBox. if self.tag and self.tag not in self.default_tags and self._modified_tag() == [""]: tag_names.removeItem(tag_names.findText(self.tag, flags)) row = tag_names.findText(tag, flags) self.tag = tag if row <= 0: if tag: # add custom tags to the QComboBox immediately tag_names.addItem(tag) tag_names.model().sort(0) row = tag_names.findText(tag, flags) else: # the QLineEdit is empty, disable everything self.disable_all() tag_names.setCurrentIndex(0) tag_names.editTextChanged.connect(self.tag_changed) return self.enable_all() tag_names.setCurrentIndex(row) line_edit.setCursorPosition(cursor_pos) self.value_list.clear() values = self.modified_tags.get(self.tag, None) if values is None: new_tags = self.metadata_box.tag_diff.new display_value, self.different = new_tags.display_value(self.tag) values = [display_value] if self.different else new_tags[self.tag] self.ui.add_value.setEnabled(not self.different) self.value_list.model().rowsInserted.disconnect(self.on_rows_inserted) self._add_value_items(values) self.value_list.model().rowsInserted.connect(self.on_rows_inserted) self.value_list.setCurrentItem(self.value_list.item(0), QtCore.QItemSelectionModel.SelectCurrent) tag_names.editTextChanged.connect(self.tag_changed) def _add_value_items(self, values): values = [v for v in values if v] or [""] for value in values: item = QtWidgets.QListWidgetItem(value) item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsDragEnabled) font = item.font() font.setItalic(self.different) item.setFont(font) self.value_list.addItem(item) def value_edited(self, item): row = self.value_list.row(item) value = item.text() if row == 0 and self.different: self.modified_tags[self.tag] = [value] self.different = False font = item.font() font.setItalic(False) item.setFont(font) self.ui.add_value.setEnabled(True) else: self._modified_tag()[row] = value # add tags to the completer model once they get values cm = self.completer.model() if self.tag not in cm.stringList(): cm.insertRows(0, 1) cm.setData(cm.index(0, 0), self.tag) cm.sort(0) def value_selection_changed(self): selection = len(self.value_list.selectedItems()) > 0 self.ui.edit_value.setEnabled(selection) self.ui.remove_value.setEnabled(selection) self.ui.move_value_up.setEnabled(selection) self.ui.move_value_down.setEnabled(selection) def _modified_tag(self): return self.modified_tags.setdefault(self.tag, list(self.metadata_box.tag_diff.new[self.tag]) or [""]) def accept(self): self.window.ignore_selection_changes = True for tag, values in self.modified_tags.items(): self.modified_tags[tag] = [v for v in values if v] modified_tags = self.modified_tags.items() for obj in self.metadata_box.objects: for tag, values in modified_tags: obj.metadata[tag] = list(values) obj.update() self.window.ignore_selection_changes = False self.window.update_selection() super().accept() picard-release-2.3.1/picard/ui/filebrowser.py000066400000000000000000000161641362601763300211700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2008 Hendrik van Antwerpen # Copyright (C) 2008-2009, 2019 Philipp Wolfer # Copyright (C) 2011 Andrew Barnert # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013 Wieland Hoffmann # Copyright (C) 2013, 2017 Sophist-UK # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2015 Jeroen Kromwijk # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os from PyQt5 import ( QtCore, QtWidgets, ) from PyQt5.QtCore import QStandardPaths from picard import config from picard.const.sys import IS_MACOS from picard.formats import supported_formats from picard.util import find_existing_path _default_current_browser_path = QStandardPaths.writableLocation(QStandardPaths.HomeLocation) class FileBrowser(QtWidgets.QTreeView): options = [ config.TextOption("persist", "current_browser_path", _default_current_browser_path), config.BoolOption("persist", "show_hidden_files", False), ] def __init__(self, parent): super().__init__(parent) self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setDragEnabled(True) self.move_files_here_action = QtWidgets.QAction(_("&Move Tagged Files Here"), self) self.move_files_here_action.triggered.connect(self.move_files_here) self.addAction(self.move_files_here_action) self.toggle_hidden_action = QtWidgets.QAction(_("Show &Hidden Files"), self) self.toggle_hidden_action.setCheckable(True) self.toggle_hidden_action.setChecked(config.persist["show_hidden_files"]) self.toggle_hidden_action.toggled.connect(self.show_hidden) self.addAction(self.toggle_hidden_action) self.set_as_starting_directory_action = QtWidgets.QAction(_("&Set as starting directory"), self) self.set_as_starting_directory_action.triggered.connect(self.set_as_starting_directory) self.addAction(self.set_as_starting_directory_action) self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.focused = False self._set_model() def _set_model(self): self.model = QtWidgets.QFileSystemModel() self.model.layoutChanged.connect(self._layout_changed) self.model.setRootPath("") self._set_model_filter() filters = [] for exts, name in supported_formats(): filters.extend("*" + e for e in exts) self.model.setNameFilters(filters) # Hide unsupported files completely self.model.setNameFilterDisables(False) self.model.sort(0, QtCore.Qt.AscendingOrder) self.setModel(self.model) if IS_MACOS: self.setRootIndex(self.model.index("/Volumes")) header = self.header() header.hideSection(1) header.hideSection(2) header.hideSection(3) header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) header.setStretchLastSection(False) header.setVisible(False) def _set_model_filter(self): model_filter = QtCore.QDir.AllDirs | QtCore.QDir.Files | QtCore.QDir.Drives | QtCore.QDir.NoDotAndDotDot if config.persist["show_hidden_files"]: model_filter |= QtCore.QDir.Hidden self.model.setFilter(model_filter) def _layout_changed(self): def scroll(): # XXX The currentIndex seems to change while QFileSystemModel is # populating itself (so setCurrentIndex in __init__ won't last). # The time it takes to load varies and there are no signals to find # out when it's done. As a workaround, keep restoring the state as # long as the layout is updating, and the user hasn't focused yet. if not self.focused: self._restore_state() self.scrollTo(self.currentIndex()) QtCore.QTimer.singleShot(0, scroll) def scrollTo(self, index, scrolltype=QtWidgets.QAbstractItemView.EnsureVisible): # QTreeView.scrollTo resets the horizontal scroll position to 0. # Reimplemented to instead scroll to horizontal parent position. level = -1 super().scrollTo(index, scrolltype) parent = self.currentIndex().parent() root = self.rootIndex() while parent.isValid() and parent != root: parent = parent.parent() level += 1 pos_x = max(self.indentation() * level, 0) self.horizontalScrollBar().setValue(pos_x) def mousePressEvent(self, event): index = self.indexAt(event.pos()) if index.isValid(): self.selectionModel().setCurrentIndex(index, QtCore.QItemSelectionModel.NoUpdate) super().mousePressEvent(event) def focusInEvent(self, event): self.focused = True super().focusInEvent(event) def show_hidden(self, state): config.persist["show_hidden_files"] = state self._set_model_filter() def save_state(self): indexes = self.selectedIndexes() if indexes: path = self.model.filePath(indexes[0]) config.persist["current_browser_path"] = os.path.normpath(path) def restore_state(self): pass def _restore_state(self): if config.setting["starting_directory"]: path = config.setting["starting_directory_path"] scrolltype = QtWidgets.QAbstractItemView.PositionAtTop else: path = config.persist["current_browser_path"] scrolltype = QtWidgets.QAbstractItemView.PositionAtCenter if path: index = self.model.index(find_existing_path(path)) self.setCurrentIndex(index) self.expand(index) self.scrollTo(index, scrolltype) def _get_destination_from_path(self, path): destination = os.path.normpath(path) if not os.path.isdir(destination): destination = os.path.dirname(destination) return destination def move_files_here(self): indexes = self.selectedIndexes() if not indexes: return path = self.model.filePath(indexes[0]) config.setting["move_files_to"] = self._get_destination_from_path(path) def set_as_starting_directory(self): indexes = self.selectedIndexes() if indexes: path = self.model.filePath(indexes[0]) config.setting["starting_directory_path"] = self._get_destination_from_path(path) picard-release-2.3.1/picard/ui/infodialog.py000066400000000000000000000360411362601763300207540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2012-2014, 2017, 2019 Wieland Hoffmann # Copyright (C) 2013-2014, 2018-2019 Laurent Monin # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017-2019 Antonio Larrosa # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import namedtuple import os.path import re import traceback from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import log from picard.album import Album from picard.coverart.image import CoverArtImageIOError from picard.file import File from picard.track import Track from picard.util import ( bytes2human, encode_filename, format_time, htmlescape, union_sorted_lists, ) from picard.ui import PicardDialog from picard.ui.ui_infodialog import Ui_InfoDialog from picard.ui.util import StandardButton class ArtworkCoverWidget(QtWidgets.QWidget): """A QWidget that can be added to artwork column cell of ArtworkTable.""" SIZE = 170 def __init__(self, pixmap=None, text=None, parent=None): super().__init__(parent=parent) layout = QtWidgets.QVBoxLayout() if pixmap is not None: image_label = QtWidgets.QLabel() image_label.setPixmap(pixmap.scaled(self.SIZE, self.SIZE, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)) image_label.setAlignment(QtCore.Qt.AlignCenter) layout.addWidget(image_label) if text is not None: text_label = QtWidgets.QLabel() text_label.setText(text) text_label.setAlignment(QtCore.Qt.AlignCenter) text_label.setWordWrap(True) layout.addWidget(text_label) self.setLayout(layout) class ArtworkTable(QtWidgets.QTableWidget): def __init__(self, display_existing_art): super().__init__(0, 2) self.display_existing_art = display_existing_art h_header = self.horizontalHeader() v_header = self.verticalHeader() h_header.setDefaultSectionSize(200) v_header.setDefaultSectionSize(230) if self.display_existing_art: self._existing_cover_col = 0 self._type_col = 1 self._new_cover_col = 2 self.insertColumn(2) self.setHorizontalHeaderLabels([_("Existing Cover"), _("Type"), _("New Cover")]) else: self._type_col = 0 self._new_cover_col = 1 self.setHorizontalHeaderLabels([_("Type"), _("Cover")]) self.setColumnWidth(self._type_col, 140) class InfoDialog(PicardDialog): autorestore = False def __init__(self, obj, parent=None): super().__init__(parent) self.obj = obj self.images = [] self.existing_images = [] self.ui = Ui_InfoDialog() self.display_existing_artwork = False if (isinstance(obj, File) and isinstance(obj.parent, Track) or isinstance(obj, Track) or (isinstance(obj, Album) and obj.get_num_total_files() > 0)): # Display existing artwork only if selected object is track object # or linked to a track object or it's an album with files if (getattr(obj, 'orig_metadata', None) is not None and obj.orig_metadata.images and obj.orig_metadata.images != obj.metadata.images): self.display_existing_artwork = True self.existing_images = obj.orig_metadata.images if obj.metadata.images: self.images = obj.metadata.images if not self.images and self.existing_images: self.images = self.existing_images self.existing_images = [] self.display_existing_artwork = False self.ui.setupUi(self) self.ui.buttonBox.addButton( StandardButton(StandardButton.CLOSE), QtWidgets.QDialogButtonBox.AcceptRole) self.ui.buttonBox.accepted.connect(self.accept) # Add the ArtworkTable to the ui self.ui.artwork_table = ArtworkTable(self.display_existing_artwork) self.ui.artwork_table.setObjectName("artwork_table") self.ui.vboxlayout1.addWidget(self.ui.artwork_table) self.setTabOrder(self.ui.tabWidget, self.ui.artwork_table) self.setTabOrder(self.ui.artwork_table, self.ui.buttonBox) self.setWindowTitle(_("Info")) self.artwork_table = self.ui.artwork_table self._display_tabs() self.restore_geometry() def _display_tabs(self): self._display_info_tab() self._display_artwork_tab() def _display_artwork(self, images, col): """Draw artwork in corresponding cell if image type matches type in Type column. Arguments: images -- The images to be drawn. col -- Column in which images are to be drawn. Can be _new_cover_col or _existing_cover_col. """ row = 0 row_count = self.artwork_table.rowCount() for image in images: while row != row_count: image_type = self.artwork_table.item(row, self.artwork_table._type_col) if image_type and image_type.data(QtCore.Qt.UserRole) == image.types_as_string(): break row += 1 if row == row_count: continue data = None try: if image.thumbnail: try: data = image.thumbnail.data except CoverArtImageIOError as e: log.warning(e) else: data = image.data except CoverArtImageIOError: log.error(traceback.format_exc()) continue item = QtWidgets.QTableWidgetItem() item.setData(QtCore.Qt.UserRole, image) pixmap = QtGui.QPixmap() if data is not None: pixmap.loadFromData(data) item.setToolTip( _("Double-click to open in external viewer\n" "Temporary file: %s\n" "Source: %s") % (image.tempfile_filename, image.source)) infos = [] if image.comment: infos.append(image.comment) infos.append("%s (%s)" % (bytes2human.decimal(image.datalength), bytes2human.binary(image.datalength))) if image.width and image.height: infos.append("%d x %d" % (image.width, image.height)) infos.append(image.mimetype) img_wgt = ArtworkCoverWidget(pixmap=pixmap, text="\n".join(infos)) self.artwork_table.setCellWidget(row, col, img_wgt) self.artwork_table.setItem(row, col, item) row += 1 def _display_artwork_type(self): """Display image type in Type column. If both existing covers and new covers are to be displayed, take union of both cover types list. """ types = [image.types_as_string() for image in self.images] if self.display_existing_artwork: existing_types = [image.types_as_string() for image in self.existing_images] # Merge both types and existing types list in sorted order. types = union_sorted_lists(types, existing_types) pixmap_arrow = QtGui.QPixmap(":/images/arrow.png") else: pixmap_arrow = None for row, artwork_type in enumerate(types): self.artwork_table.insertRow(row) item = QtWidgets.QTableWidgetItem() item.setData(QtCore.Qt.UserRole, artwork_type) type_wgt = ArtworkCoverWidget(pixmap=pixmap_arrow, text=artwork_type) self.artwork_table.setCellWidget(row, self.artwork_table._type_col, type_wgt) self.artwork_table.setItem(row, self.artwork_table._type_col, item) def _display_artwork_tab(self): if not self.images: self.tab_hide(self.ui.artwork_tab) self._display_artwork_type() self._display_artwork(self.images, self.artwork_table._new_cover_col) if self.existing_images: self._display_artwork(self.existing_images, self.artwork_table._existing_cover_col) self.artwork_table.itemDoubleClicked.connect(self.show_item) self.artwork_table.verticalHeader().resizeSections(QtWidgets.QHeaderView.ResizeToContents) def tab_hide(self, widget): tab = self.ui.tabWidget index = tab.indexOf(widget) tab.removeTab(index) def show_item(self, item): data = item.data(QtCore.Qt.UserRole) # Check if this function isn't triggered by cell in Type column if isinstance(data, str): return filename = data.tempfile_filename if filename: url = QtCore.QUrl.fromLocalFile(filename) QtGui.QDesktopServices.openUrl(url) def format_file_info(file_): info = [] info.append((_('Filename:'), file_.filename)) if '~format' in file_.orig_metadata: info.append((_('Format:'), file_.orig_metadata['~format'])) try: size = os.path.getsize(encode_filename(file_.filename)) sizestr = "%s (%s)" % (bytes2human.decimal(size), bytes2human.binary(size)) info.append((_('Size:'), sizestr)) except BaseException: pass if file_.orig_metadata.length: info.append((_('Length:'), format_time(file_.orig_metadata.length))) if '~bitrate' in file_.orig_metadata: info.append((_('Bitrate:'), '%s kbps' % file_.orig_metadata['~bitrate'])) if '~sample_rate' in file_.orig_metadata: info.append((_('Sample rate:'), '%s Hz' % file_.orig_metadata['~sample_rate'])) if '~bits_per_sample' in file_.orig_metadata: info.append((_('Bits per sample:'), str(file_.orig_metadata['~bits_per_sample']))) if '~channels' in file_.orig_metadata: ch = file_.orig_metadata['~channels'] if ch == '1': ch = _('Mono') elif ch == '2': ch = _('Stereo') info.append((_('Channels:'), ch)) return '
'.join(map(lambda i: '%s %s' % (htmlescape(i[0]), htmlescape(i[1])), info)) class FileInfoDialog(InfoDialog): def __init__(self, file_, parent=None): super().__init__(file_, parent) self.setWindowTitle(_("Info") + " - " + file_.base_filename) def _display_info_tab(self): file_ = self.obj text = format_file_info(file_) self.ui.info.setText(text) class AlbumInfoDialog(InfoDialog): def __init__(self, album, parent=None): super().__init__(album, parent) self.setWindowTitle(_("Album Info")) def _display_info_tab(self): tab = self.ui.info_tab album = self.obj tabWidget = self.ui.tabWidget tab_index = tabWidget.indexOf(tab) if album.errors: tabWidget.setTabText(tab_index, _("&Errors")) text = '
'.join(map(lambda s: '%s' % '
'.join(htmlescape(str(s)) .replace('\t', ' ') .replace(' ', ' ') .splitlines() ), album.errors) ) self.ui.info.setText(text + '


') else: tabWidget.setTabText(tab_index, _("&Info")) self.tab_hide(tab) class TrackInfoDialog(InfoDialog): def __init__(self, track, parent=None): super().__init__(track, parent) self.setWindowTitle(_("Track Info")) def _display_info_tab(self): track = self.obj tab = self.ui.info_tab tabWidget = self.ui.tabWidget tab_index = tabWidget.indexOf(tab) if track.num_linked_files == 0: tabWidget.setTabText(tab_index, _("&Info")) self.tab_hide(tab) return tabWidget.setTabText(tab_index, _("&Info")) text = ngettext("%i file in this track", "%i files in this track", track.num_linked_files) % track.num_linked_files info_files = [format_file_info(file_) for file_ in track.linked_files] text += '
' + '
'.join(info_files) self.ui.info.setText(text) class ClusterInfoDialog(InfoDialog): def __init__(self, cluster, parent=None): super().__init__(cluster, parent) self.setWindowTitle(_("Cluster Info")) def _display_info_tab(self): tab = self.ui.info_tab cluster = self.obj tabWidget = self.ui.tabWidget tab_index = tabWidget.indexOf(tab) tabWidget.setTabText(tab_index, _("&Info")) info = [] info.append("%s %s" % (_('Album:'), htmlescape(cluster.metadata["album"]))) info.append("%s %s" % (_('Artist:'), htmlescape(cluster.metadata["albumartist"]))) info.append("") TrackListItem = namedtuple('TrackListItem', 'tracknumber, title, artist, length') tracklist = [] for file_ in cluster.iterfiles(False): m = file_.metadata artist = m["artist"] or m["albumartist"] or cluster.metadata["albumartist"] tracklist.append(TrackListItem(m["tracknumber"], m["title"], artist, m["~length"])) def sorttracknum(item): try: return int(item.tracknumber) except ValueError: try: # This allows to parse values like '3' but also '3/10' m = re.search(r'^\d+', item.tracknumber) return int(m.group(0)) except AttributeError: return 0 lines = ["%s %s - %s (%s)" % item for item in sorted(tracklist, key=sorttracknum)] info.append("%s
%s" % (_('Tracklist:'), '
'.join([htmlescape(s).replace(' ', ' ') for s in lines]))) self.ui.info.setText('
'.join(info)) picard-release-2.3.1/picard/ui/infostatus.py000066400000000000000000000061131362601763300210350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard.util import icontheme from picard.ui.ui_infostatus import Ui_InfoStatus class InfoStatus(QtWidgets.QWidget, Ui_InfoStatus): def __init__(self, parent): QtWidgets.QWidget.__init__(self, parent) Ui_InfoStatus.__init__(self) self.setupUi(self) self._size = QtCore.QSize(16, 16) self._create_icons() self._init_labels() def _init_labels(self): size = self._size self.label1.setPixmap(self.icon_file.pixmap(size)) self.label2.setPixmap(self.icon_cd.pixmap(size)) self.label3.setPixmap(self.icon_file_pending.pixmap(size)) self.label4.setPixmap(self.icon_download.pixmap(size, QtGui.QIcon.Disabled)) self._init_tooltips() def _create_icons(self): self.icon_cd = icontheme.lookup('media-optical') self.icon_file = QtGui.QIcon(":/images/file.png") self.icon_file_pending = QtGui.QIcon(":/images/file-pending.png") self.icon_download = QtGui.QIcon(":/images/16x16/action-go-down-16.png") def _init_tooltips(self): t1 = _("Files") t2 = _("Albums") t3 = _("Pending files") t4 = _("Pending requests") self.val1.setToolTip(t1) self.label1.setToolTip(t1) self.val2.setToolTip(t2) self.label2.setToolTip(t2) self.val3.setToolTip(t3) self.label3.setToolTip(t3) self.val4.setToolTip(t4) self.label4.setToolTip(t4) def update(self, files=0, albums=0, pending_files=0, pending_requests=0): self.set_files(files) self.set_albums(albums) self.set_pending_files(pending_files) self.set_pending_requests(pending_requests) def set_files(self, num): self.val1.setText(str(num)) def set_albums(self, num): self.val2.setText(str(num)) def set_pending_files(self, num): self.val3.setText(str(num)) def set_pending_requests(self, num): if num <= 0: enabled = QtGui.QIcon.Disabled else: enabled = QtGui.QIcon.Normal self.label4.setPixmap(self.icon_download.pixmap(self._size, enabled)) self.val4.setText(str(num)) picard-release-2.3.1/picard/ui/item.py000066400000000000000000000037371362601763300176050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2010, 2018 Philipp Wolfer # Copyright (C) 2011-2012 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2013 Laurent Monin # Copyright (C) 2014 Sophist-UK # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class Item(object): def can_save(self): """Return if this object can be saved.""" return False def can_remove(self): """Return if this object can be removed.""" return False def can_edit_tags(self): """Return if this object supports tag editing.""" return False def can_analyze(self): """Return if this object can be fingerprinted.""" return False def can_autotag(self): """Return if this object can be autotagged.""" return False def can_refresh(self): """Return if this object can be refreshed.""" return False def can_view_info(self): return False @property def can_show_coverart(self): """Return if this object supports cover art.""" return self.can_edit_tags() def can_browser_lookup(self): return True def is_album_like(self): return False def load(self, priority=False, refresh=False): pass picard-release-2.3.1/picard/ui/itemviews.py000066400000000000000000001267431362601763300206660ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011-2012 Lukáš Lalinský # Copyright (C) 2007 Robert Kaye # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2008 Hendrik van Antwerpen # Copyright (C) 2008-2011, 2014-2015, 2018-2020 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009 Nikolai Prokoschenko # Copyright (C) 2011 Tim Blechmann # Copyright (C) 2011-2012 Chad Wilson # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012 Your Name # Copyright (C) 2012-2013 Wieland Hoffmann # Copyright (C) 2013-2014, 2016, 2018-2019 Laurent Monin # Copyright (C) 2013-2014, 2017 Sophist-UK # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 Simon Legner # Copyright (C) 2016 Suhas # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict from functools import partial from heapq import ( heappop, heappush, ) import os import re from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import ( config, log, ) from picard.album import ( Album, NatAlbum, ) from picard.cluster import ( Cluster, ClusterList, UnclusteredFiles, ) from picard.file import File from picard.plugin import ExtensionPoint from picard.track import ( NonAlbumTrack, Track, ) from picard.util import ( encode_filename, icontheme, natsort, restore_method, ) from picard.ui.collectionmenu import CollectionMenu from picard.ui.colors import interface_colors from picard.ui.ratingwidget import RatingWidget from picard.ui.scriptsmenu import ScriptsMenu from picard.ui.widgets.tristatesortheaderview import TristateSortHeaderView COLUMN_ICON_SIZE = 16 class BaseAction(QtWidgets.QAction): NAME = "Unknown" MENU = [] def __init__(self): super().__init__(self.NAME, None) self.triggered.connect(self.__callback) def __callback(self): objs = self.tagger.window.selected_objects self.callback(objs) def callback(self, objs): raise NotImplementedError _album_actions = ExtensionPoint(label='album_actions') _cluster_actions = ExtensionPoint(label='cluster_actions') _clusterlist_actions = ExtensionPoint(label='clusterlist_actions') _track_actions = ExtensionPoint(label='track_actions') _file_actions = ExtensionPoint(label='file_actions') def register_album_action(action): _album_actions.register(action.__module__, action) def register_cluster_action(action): _cluster_actions.register(action.__module__, action) def register_clusterlist_action(action): _clusterlist_actions.register(action.__module__, action) def register_track_action(action): _track_actions.register(action.__module__, action) def register_file_action(action): _file_actions.register(action.__module__, action) def get_match_color(similarity, basecolor): c1 = (basecolor.red(), basecolor.green(), basecolor.blue()) c2 = (223, 125, 125) return QtGui.QColor( c2[0] + (c1[0] - c2[0]) * similarity, c2[1] + (c1[1] - c2[1]) * similarity, c2[2] + (c1[2] - c2[2]) * similarity) class MainPanel(QtWidgets.QSplitter): options = [ config.Option("persist", "splitter_state", QtCore.QByteArray()), ] columns = [ (N_('Title'), 'title'), (N_('Length'), '~length'), (N_('Artist'), 'artist'), (N_('Album Artist'), 'albumartist'), (N_('Composer'), 'composer'), (N_('Album'), 'album'), (N_('Disc Subtitle'), 'discsubtitle'), (N_('Track No.'), 'tracknumber'), (N_('Disc No.'), 'discnumber'), (N_('Catalog No.'), 'catalognumber'), (N_('Barcode'), 'barcode'), (N_('Media'), 'media'), (N_('Genre'), 'genre'), (N_('Fingerprint status'), '~fingerprint'), ] TITLE_COLUMN = 0 FINGERPRINT_COLUMN = 13 def __init__(self, window, parent=None): super().__init__(parent) self.window = window self.create_icons() self.views = [FileTreeView(window, self), AlbumTreeView(window, self)] self.views[0].itemSelectionChanged.connect(self.update_selection_0) self.views[1].itemSelectionChanged.connect(self.update_selection_1) self._selected_view = 0 self._ignore_selection_changes = False TreeItem.window = window TreeItem.base_color = self.palette().base().color() TreeItem.text_color = self.palette().text().color() TreeItem.text_color_secondary = self.palette() \ .brush(QtGui.QPalette.Disabled, QtGui.QPalette.Text).color() TrackItem.track_colors = defaultdict(lambda: TreeItem.text_color, { File.NORMAL: interface_colors.get_qcolor('entity_saved'), File.CHANGED: TreeItem.text_color, File.PENDING: interface_colors.get_qcolor('entity_pending'), File.ERROR: interface_colors.get_qcolor('entity_error'), }) FileItem.file_colors = defaultdict(lambda: TreeItem.text_color, { File.NORMAL: TreeItem.text_color, File.CHANGED: TreeItem.text_color, File.PENDING: interface_colors.get_qcolor('entity_pending'), File.ERROR: interface_colors.get_qcolor('entity_error'), }) def save_state(self): config.persist["splitter_state"] = self.saveState() for view in self.views: view.save_state() @restore_method def restore_state(self): self.restoreState(config.persist["splitter_state"]) def create_icons(self): if hasattr(QtWidgets.QStyle, 'SP_DirIcon'): ClusterItem.icon_dir = self.style().standardIcon(QtWidgets.QStyle.SP_DirIcon) else: ClusterItem.icon_dir = icontheme.lookup('folder', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd = icontheme.lookup('media-optical', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd_modified = icontheme.lookup('media-optical-modified', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd_saved = icontheme.lookup('media-optical-saved', icontheme.ICON_SIZE_MENU) AlbumItem.icon_cd_saved_modified = icontheme.lookup('media-optical-saved-modified', icontheme.ICON_SIZE_MENU) AlbumItem.icon_error = icontheme.lookup('media-optical-error', icontheme.ICON_SIZE_MENU) TrackItem.icon_audio = QtGui.QIcon(":/images/track-audio.png") TrackItem.icon_video = QtGui.QIcon(":/images/track-video.png") TrackItem.icon_data = QtGui.QIcon(":/images/track-data.png") TrackItem.icon_error = icontheme.lookup('dialog-error', icontheme.ICON_SIZE_MENU) FileItem.icon_file = QtGui.QIcon(":/images/file.png") FileItem.icon_file_pending = QtGui.QIcon(":/images/file-pending.png") FileItem.icon_error = icontheme.lookup('dialog-error', icontheme.ICON_SIZE_MENU) FileItem.icon_saved = QtGui.QIcon(":/images/track-saved.png") FileItem.icon_fingerprint = icontheme.lookup('fingerprint', icontheme.ICON_SIZE_MENU) FileItem.icon_fingerprint_gray = icontheme.lookup('fingerprint-gray', icontheme.ICON_SIZE_MENU) FileItem.match_icons = [ QtGui.QIcon(":/images/match-50.png"), QtGui.QIcon(":/images/match-60.png"), QtGui.QIcon(":/images/match-70.png"), QtGui.QIcon(":/images/match-80.png"), QtGui.QIcon(":/images/match-90.png"), QtGui.QIcon(":/images/match-100.png"), ] FileItem.match_icons_info = [ N_("Bad match"), N_("Poor match"), N_("Ok match"), N_("Good match"), N_("Great match"), N_("Excellent match"), ] FileItem.match_pending_icons = [ QtGui.QIcon(":/images/match-pending-50.png"), QtGui.QIcon(":/images/match-pending-60.png"), QtGui.QIcon(":/images/match-pending-70.png"), QtGui.QIcon(":/images/match-pending-80.png"), QtGui.QIcon(":/images/match-pending-90.png"), QtGui.QIcon(":/images/match-pending-100.png"), ] self.icon_plugins = icontheme.lookup('applications-system', icontheme.ICON_SIZE_MENU) def update_selection(self, i, j): self._selected_view = i self.views[j].clearSelection() self.window.update_selection( [item.obj for item in self.views[i].selectedItems()]) def update_selection_0(self): if not self._ignore_selection_changes: self._ignore_selection_changes = True self.update_selection(0, 1) self._ignore_selection_changes = False def update_selection_1(self): if not self._ignore_selection_changes: self._ignore_selection_changes = True self.update_selection(1, 0) self._ignore_selection_changes = False def update_current_view(self): self.update_selection(self._selected_view, abs(self._selected_view - 1)) def remove(self, objects): self._ignore_selection_changes = True self.tagger.remove(objects) self._ignore_selection_changes = False view = self.views[self._selected_view] index = view.currentIndex() if index.isValid(): # select the current index view.setCurrentIndex(index) else: self.update_current_view() def paint_fingerprint_icon(painter, rect, icon): if not icon: return size = COLUMN_ICON_SIZE padding_h = (rect.width() - size) / 2 padding_v = (rect.height() - size) / 2 target_rect = QtCore.QRect(rect.x() + padding_h, rect.y() + padding_v, size, size) painter.drawPixmap(target_rect, icon.pixmap(size, size)) class FingerprintColumnWidget(QtWidgets.QWidget): def __init__(self, file, parent=None): super().__init__(parent=parent) self._file = file def paintEvent(self, event=None): painter = QtGui.QPainter(self) paint_fingerprint_icon(painter, self.rect(), self.decide_icon()) def decide_icon(self): if getattr(self._file, 'acoustid_fingerprint', None): if self.tagger.acoustidmanager.is_submitted(self._file): return FileItem.icon_fingerprint_gray else: return FileItem.icon_fingerprint else: return None class ConfigurableColumnsHeader(TristateSortHeaderView): def __init__(self, parent=None): super().__init__(QtCore.Qt.Horizontal, parent) self._visible_columns = set([0]) # The following are settings applied to default headers # of QTreeView and QTreeWidget. self.setSectionsMovable(True) self.setStretchLastSection(True) self.setDefaultAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) self.setSectionsClickable(False) self.sortIndicatorChanged.connect(self.on_sort_indicator_changed) # enable sorting, but don't actually use it by default # XXX it would be nice to be able to go to the 'no sort' mode, but the # internal model that QTreeWidget uses doesn't support it self.setSortIndicator(-1, QtCore.Qt.AscendingOrder) self.setDefaultSectionSize(100) def show_column(self, column, show): if column == 0: # The first column is fixed return self.parent().setColumnHidden(column, not show) if show: if self.sectionSize(column) == 0: self.resizeSection(column, self.defaultSectionSize()) self._visible_columns.add(column) if column == MainPanel.FINGERPRINT_COLUMN: self.setSectionResizeMode(column, QtWidgets.QHeaderView.Fixed) self.parent().resizeColumnToContents(column) else: self.setSectionResizeMode(column, QtWidgets.QHeaderView.Interactive) elif column in self._visible_columns: self._visible_columns.remove(column) def update_visible_columns(self, columns): for i, column in enumerate(MainPanel.columns): self.show_column(i, i in columns) @property def visible_columns(self): return self._visible_columns def contextMenuEvent(self, event): menu = QtWidgets.QMenu(self) for i, column in enumerate(MainPanel.columns): if i == 0: continue action = QtWidgets.QAction(_(column[0]), self.parent()) action.setCheckable(True) action.setChecked(i in self._visible_columns) action.triggered.connect(partial(self.show_column, i)) menu.addAction(action) menu.addSeparator() restore_action = QtWidgets.QAction(_('Restore default columns'), self.parent()) restore_action.triggered.connect(self.restore_defaults) menu.addAction(restore_action) menu.exec_(event.globalPos()) event.accept() def restore_defaults(self): self.parent().restore_default_columns() def paintSection(self, painter, rect, index): if index == MainPanel.FINGERPRINT_COLUMN: painter.save() super().paintSection(painter, rect, index) painter.restore() paint_fingerprint_icon(painter, rect, FileItem.icon_fingerprint_gray) else: super().paintSection(painter, rect, index) def on_sort_indicator_changed(self, index, order): if index == MainPanel.FINGERPRINT_COLUMN: self.setSortIndicator(-1, QtCore.Qt.AscendingOrder) class BaseTreeView(QtWidgets.QTreeWidget): def __init__(self, window, parent=None): super().__init__(parent) self.setHeader(ConfigurableColumnsHeader(self)) self.window = window self.panel = parent self.setHeaderLabels([_(h) if n != '~fingerprint' else '' for h, n in MainPanel.columns]) self.restore_state() self.setAcceptDrops(True) self.setDragEnabled(True) self.setDropIndicatorShown(True) self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setSortingEnabled(True) self.expand_all_action = QtWidgets.QAction(_("&Expand all"), self) self.expand_all_action.triggered.connect(self.expandAll) self.collapse_all_action = QtWidgets.QAction(_("&Collapse all"), self) self.collapse_all_action.triggered.connect(self.collapseAll) self.select_all_action = QtWidgets.QAction(_("Select &all"), self) self.select_all_action.triggered.connect(self.selectAll) self.select_all_action.setShortcut(QtGui.QKeySequence(_("Ctrl+A"))) self.doubleClicked.connect(self.activate_item) def contextMenuEvent(self, event): item = self.itemAt(event.pos()) if not item: return obj = item.obj plugin_actions = None can_view_info = self.window.view_info_action.isEnabled() menu = QtWidgets.QMenu(self) if isinstance(obj, Track): if can_view_info: menu.addAction(self.window.view_info_action) plugin_actions = list(_track_actions) if obj.num_linked_files == 1: menu.addAction(self.window.play_file_action) menu.addAction(self.window.open_folder_action) menu.addAction(self.window.track_search_action) plugin_actions.extend(_file_actions) menu.addAction(self.window.browser_lookup_action) if obj.num_linked_files > 0: menu.addAction(self.window.generate_fingerprints_action) menu.addSeparator() if isinstance(obj, NonAlbumTrack): menu.addAction(self.window.refresh_action) elif isinstance(obj, Cluster): if can_view_info: menu.addAction(self.window.view_info_action) menu.addAction(self.window.browser_lookup_action) menu.addSeparator() menu.addAction(self.window.autotag_action) menu.addAction(self.window.analyze_action) if isinstance(obj, UnclusteredFiles): menu.addAction(self.window.cluster_action) else: menu.addAction(self.window.album_search_action) menu.addAction(self.window.generate_fingerprints_action) plugin_actions = list(_cluster_actions) elif isinstance(obj, ClusterList): menu.addAction(self.window.autotag_action) menu.addAction(self.window.analyze_action) menu.addAction(self.window.generate_fingerprints_action) plugin_actions = list(_clusterlist_actions) elif isinstance(obj, File): if can_view_info: menu.addAction(self.window.view_info_action) menu.addAction(self.window.play_file_action) menu.addAction(self.window.open_folder_action) menu.addAction(self.window.browser_lookup_action) menu.addSeparator() menu.addAction(self.window.autotag_action) menu.addAction(self.window.analyze_action) menu.addAction(self.window.track_search_action) menu.addAction(self.window.generate_fingerprints_action) plugin_actions = list(_file_actions) elif isinstance(obj, Album): if can_view_info: menu.addAction(self.window.view_info_action) menu.addAction(self.window.browser_lookup_action) if obj.get_num_total_files() > 0: menu.addAction(self.window.generate_fingerprints_action) menu.addSeparator() menu.addAction(self.window.refresh_action) plugin_actions = list(_album_actions) menu.addAction(self.window.save_action) menu.addAction(self.window.remove_action) bottom_separator = False if isinstance(obj, Album) and not isinstance(obj, NatAlbum) and obj.loaded: releases_menu = QtWidgets.QMenu(_("&Other versions"), menu) menu.addSeparator() menu.addMenu(releases_menu) loading = releases_menu.addAction(_('Loading...')) loading.setDisabled(True) bottom_separator = True if len(self.selectedItems()) == 1: def _add_other_versions(): releases_menu.removeAction(loading) heading = releases_menu.addAction(obj.release_group.version_headings) heading.setDisabled(True) font = heading.font() font.setBold(True) heading.setFont(font) versions = obj.release_group.versions album_tracks_count = obj.get_num_total_files() or len(obj.tracks) preferred_countries = set(config.setting["preferred_release_countries"]) preferred_formats = set(config.setting["preferred_release_formats"]) ORDER_BEFORE, ORDER_AFTER = 0, 1 alternatives = [] for version in versions: trackmatch = countrymatch = formatmatch = ORDER_BEFORE if version['totaltracks'] != album_tracks_count: trackmatch = ORDER_AFTER if preferred_countries: countries = set(version['countries']) if not countries or not countries.intersection(preferred_countries): countrymatch = ORDER_AFTER if preferred_formats: formats = set(version['formats']) if not formats or not formats.intersection(preferred_formats): formatmatch = ORDER_AFTER group = (trackmatch, countrymatch, formatmatch) # order by group, name, and id on push heappush(alternatives, (group, version['name'], version['id'])) prev_group = None while alternatives: group, action_text, release_id = heappop(alternatives) if group != prev_group: if prev_group is not None: releases_menu.addSeparator() prev_group = group action = releases_menu.addAction(action_text) action.setCheckable(True) if obj.id == release_id: action.setChecked(True) action.triggered.connect(partial(obj.switch_release_version, release_id)) versions_count = len(versions) if versions_count > 1: releases_menu.setTitle(_("&Other versions (%d)") % versions_count) if obj.release_group.loaded: _add_other_versions() else: obj.release_group.load_versions(_add_other_versions) releases_menu.setEnabled(True) else: releases_menu.setEnabled(False) if config.setting["enable_ratings"] and \ len(self.window.selected_objects) == 1 and isinstance(obj, Track): menu.addSeparator() action = QtWidgets.QWidgetAction(menu) action.setDefaultWidget(RatingWidget(menu, obj)) menu.addAction(action) menu.addSeparator() # Using type here is intentional. isinstance will return true for the # NatAlbum instance, which can't be part of a collection. # pylint: disable=C0123 selected_albums = [a for a in self.window.selected_objects if type(a) == Album] if selected_albums: if not bottom_separator: menu.addSeparator() menu.addMenu(CollectionMenu(selected_albums, _("Collections"), menu)) scripts = config.setting["list_of_scripts"] if plugin_actions or scripts: menu.addSeparator() if plugin_actions: plugin_menu = QtWidgets.QMenu(_("P&lugins"), menu) plugin_menu.setIcon(self.panel.icon_plugins) menu.addMenu(plugin_menu) plugin_menus = {} for action in plugin_actions: action_menu = plugin_menu for index in range(1, len(action.MENU) + 1): key = tuple(action.MENU[:index]) if key in plugin_menus: action_menu = plugin_menus[key] else: action_menu = plugin_menus[key] = action_menu.addMenu(key[-1]) action_menu.addAction(action) if scripts: scripts_menu = ScriptsMenu(scripts, _("&Run scripts"), menu) scripts_menu.setIcon(self.panel.icon_plugins) menu.addMenu(scripts_menu) if isinstance(obj, Cluster) or isinstance(obj, ClusterList) or isinstance(obj, Album): menu.addSeparator() menu.addAction(self.expand_all_action) menu.addAction(self.collapse_all_action) menu.addAction(self.select_all_action) menu.exec_(event.globalPos()) event.accept() @restore_method def restore_state(self): self._restore_state(config.persist[self.header_state.name]) def save_state(self): config.persist[self.header_state.name] = self.header().saveState() def restore_default_columns(self): self._restore_state(None) def _restore_state(self, header_state): header = self.header() if header_state: header.restoreState(header_state) for i in range(0, self.columnCount()): header.show_column(i, not self.isColumnHidden(i)) else: header.update_visible_columns([0, 1, 2]) for i, size in enumerate([250, 50, 100]): header.resizeSection(i, size) self.sortByColumn(-1, QtCore.Qt.AscendingOrder) def supportedDropActions(self): return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction def mimeTypes(self): """List of MIME types accepted by this view.""" return ["text/uri-list", "application/picard.album-list"] def dragEnterEvent(self, event): if event.mimeData().hasUrls(): event.setDropAction(QtCore.Qt.CopyAction) event.accept() else: event.acceptProposedAction() def startDrag(self, supportedActions): """Start drag, *without* using pixmap.""" items = self.selectedItems() if items: drag = QtGui.QDrag(self) drag.setMimeData(self.mimeData(items)) # Render the first selected element as drag representation rectangle = self.visualItemRect(items[0]) pixmap = QtGui.QPixmap(rectangle.width(), rectangle.height()) self.viewport().render(pixmap, QtCore.QPoint(), QtGui.QRegion(rectangle)) drag.setPixmap(pixmap) drag.exec_(QtCore.Qt.MoveAction) def mimeData(self, items): """Return MIME data for specified items.""" album_ids = [] files = [] url = QtCore.QUrl.fromLocalFile for item in items: obj = item.obj if isinstance(obj, Album): album_ids.append(obj.id) elif obj.iterfiles: files.extend([url(f.filename) for f in obj.iterfiles()]) mimeData = QtCore.QMimeData() mimeData.setData("application/picard.album-list", "\n".join(album_ids).encode()) if files: mimeData.setUrls(files) return mimeData def scrollTo(self, index, scrolltype=QtWidgets.QAbstractItemView.EnsureVisible): # QTreeView.scrollTo resets the horizontal scroll position to 0. # Reimplemented to maintain current horizontal scroll position. hscrollbar = self.horizontalScrollBar() xpos = hscrollbar.value() super().scrollTo(index, scrolltype) hscrollbar.setValue(xpos) @staticmethod def drop_urls(urls, target): files = [] new_files = [] for url in urls: log.debug("Dropped the URL: %r", url.toString(QtCore.QUrl.RemoveUserInfo)) if url.scheme() == "file" or not url.scheme(): filename = os.path.normpath(os.path.realpath(url.toLocalFile().rstrip("\0"))) file = BaseTreeView.tagger.files.get(filename) if file: files.append(file) elif os.path.isdir(encode_filename(filename)): BaseTreeView.tagger.add_directory(filename) else: new_files.append(filename) elif url.scheme() in ("http", "https"): path = url.path() match = re.search(r"/(release|recording)/([0-9a-z\-]{36})", path) if match: entity = match.group(1) mbid = match.group(2) if entity == "release": BaseTreeView.tagger.load_album(mbid) elif entity == "recording": BaseTreeView.tagger.load_nat(mbid) if files: BaseTreeView.tagger.move_files(files, target) if new_files: BaseTreeView.tagger.add_files(new_files, target=target) def dropEvent(self, event): return QtWidgets.QTreeView.dropEvent(self, event) def dropMimeData(self, parent, index, data, action): target = None if parent: if index == parent.childCount(): item = parent else: item = parent.child(index) if item is not None: target = item.obj if isinstance(self, FileTreeView) and target is None: target = self.tagger.unclustered_files log.debug("Drop target = %r", target) handled = False # text/uri-list urls = data.urls() if urls: # Use QTimer.singleShot to run expensive processing outside of the drop handler. QtCore.QTimer.singleShot(0, partial(self.drop_urls, urls, target)) handled = True # application/picard.album-list albums = data.data("application/picard.album-list") if albums: albums = [self.tagger.load_album(id) for id in bytes(albums).decode().split("\n")] # Use QTimer.singleShot to run expensive processing outside of the drop handler. QtCore.QTimer.singleShot(0, partial(self.tagger.move_files, self.tagger.get_files_from_objects(albums), target)) handled = True return handled def activate_item(self, index): obj = self.itemFromIndex(index).obj # Double-clicking albums or clusters should expand them. The album info can be # viewed by using the toolbar button. if not isinstance(obj, (Album, Cluster)) and obj.can_view_info(): self.window.view_info() def add_cluster(self, cluster, parent_item=None): if parent_item is None: parent_item = self.clusters cluster_item = ClusterItem(cluster, not cluster.special, parent_item) if cluster.hide_if_empty and not cluster.files: cluster_item.update() cluster_item.setHidden(True) else: cluster_item.add_files(cluster.files) def moveCursor(self, action, modifiers): if action in (QtWidgets.QAbstractItemView.MoveUp, QtWidgets.QAbstractItemView.MoveDown): item = self.currentItem() if item and not item.isSelected(): self.setCurrentItem(item) return QtWidgets.QTreeWidget.moveCursor(self, action, modifiers) class FileTreeView(BaseTreeView): header_state = config.Option("persist", "file_view_header_state", QtCore.QByteArray()) def __init__(self, window, parent=None): super().__init__(window, parent) self.setAccessibleName(_("file view")) self.setAccessibleDescription(_("Contains unmatched files and clusters")) self.unmatched_files = ClusterItem(self.tagger.unclustered_files, False, self) self.unmatched_files.update() self.unmatched_files.setExpanded(True) self.clusters = ClusterItem(self.tagger.clusters, False, self) self.set_clusters_text() self.clusters.setExpanded(True) self.tagger.cluster_added.connect(self.add_file_cluster) self.tagger.cluster_removed.connect(self.remove_file_cluster) def add_file_cluster(self, cluster, parent_item=None): self.add_cluster(cluster, parent_item) self.set_clusters_text() def remove_file_cluster(self, cluster): cluster.item.setSelected(False) self.clusters.removeChild(cluster.item) self.set_clusters_text() def set_clusters_text(self): self.clusters.setText(MainPanel.TITLE_COLUMN, '%s (%d)' % (_("Clusters"), len(self.tagger.clusters))) class AlbumTreeView(BaseTreeView): header_state = config.Option("persist", "album_view_header_state", QtCore.QByteArray()) def __init__(self, window, parent=None): super().__init__(window, parent) self.setAccessibleName(_("album view")) self.setAccessibleDescription(_("Contains albums and matched files")) self.tagger.album_added.connect(self.add_album) self.tagger.album_removed.connect(self.remove_album) def add_album(self, album): if isinstance(album, NatAlbum): item = NatAlbumItem(album, True) self.insertTopLevelItem(0, item) else: item = AlbumItem(album, True, self) item.setIcon(MainPanel.TITLE_COLUMN, AlbumItem.icon_cd) for i, column in enumerate(MainPanel.columns): font = item.font(i) font.setBold(True) item.setFont(i, font) item.setText(i, album.column(column[1])) self.add_cluster(album.unmatched_files, item) def remove_album(self, album): album.item.setSelected(False) self.takeTopLevelItem(self.indexOfTopLevelItem(album.item)) class TreeItem(QtWidgets.QTreeWidgetItem): def __init__(self, obj, sortable, *args): super().__init__(*args) self.obj = obj if obj is not None: obj.item = self self.sortable = sortable self.setTextAlignment(1, QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.setTextAlignment(7, QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.setTextAlignment(8, QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) def __lt__(self, other): if not self.sortable: return False column = self.treeWidget().sortColumn() return self.sortkey(column) < other.sortkey(column) def sortkey(self, column): if column == 1: return self.obj.metadata.length or 0 return natsort.natkey(self.text(column).lower()) class ClusterItem(TreeItem): def __init__(self, *args): super().__init__(*args) self.setIcon(MainPanel.TITLE_COLUMN, ClusterItem.icon_dir) def update(self): for i, column in enumerate(MainPanel.columns): self.setText(i, self.obj.column(column[1])) album = self.obj.related_album if self.obj.special and album and album.loaded: album.item.update(update_tracks=False) if self.isSelected(): TreeItem.window.update_selection() def add_file(self, file): self.add_files([file]) def add_files(self, files): if self.obj.hide_if_empty and self.obj.files: self.setHidden(False) self.update() # addChild used (rather than building an items list and adding with addChildren) # to be certain about item order in the cluster (addChildren adds in reverse order). # Benchmarked performance was not noticeably different. for file in files: item = FileItem(file, True) item.update() self.addChild(item) def remove_file(self, file): file.item.setSelected(False) self.removeChild(file.item) self.update() if self.obj.hide_if_empty and not self.obj.files: self.setHidden(True) class AlbumItem(TreeItem): def update(self, update_tracks=True): album = self.obj selection_changed = self.isSelected() if update_tracks: oldnum = self.childCount() - 1 newnum = len(album.tracks) if oldnum > newnum: # remove old items for i in range(oldnum - newnum): item = self.child(newnum) selection_changed |= item.isSelected() self.takeChild(newnum) oldnum = newnum # update existing items for i in range(oldnum): item = self.child(i) track = album.tracks[i] selection_changed |= item.isSelected() and item.obj != track item.obj = track track.item = item item.update(update_album=False) if newnum > oldnum: # add new items items = [] for i in range(newnum - 1, oldnum - 1, -1): # insertChildren is backwards item = TrackItem(album.tracks[i], False) item.setHidden(False) # Workaround to make sure the parent state gets updated items.append(item) self.insertChildren(oldnum, items) for item in items: # Update after insertChildren so that setExpanded works item.update(update_album=False) if album.errors: self.setIcon(MainPanel.TITLE_COLUMN, AlbumItem.icon_error) self.setToolTip(MainPanel.TITLE_COLUMN, _("Error")) elif album.is_complete(): if album.is_modified(): self.setIcon(MainPanel.TITLE_COLUMN, AlbumItem.icon_cd_saved_modified) self.setToolTip(MainPanel.TITLE_COLUMN, _("Album modified and complete")) else: self.setIcon(MainPanel.TITLE_COLUMN, AlbumItem.icon_cd_saved) self.setToolTip(MainPanel.TITLE_COLUMN, _("Album unchanged and complete")) else: if album.is_modified(): self.setIcon(MainPanel.TITLE_COLUMN, AlbumItem.icon_cd_modified) self.setToolTip(MainPanel.TITLE_COLUMN, _("Album modified")) else: self.setIcon(MainPanel.TITLE_COLUMN, AlbumItem.icon_cd) self.setToolTip(MainPanel.TITLE_COLUMN, _("Album unchanged")) for i, column in enumerate(MainPanel.columns): self.setText(i, album.column(column[1])) if selection_changed: TreeItem.window.panel.update_current_view() # Workaround for PICARD-1446: Expand/collapse indicator for the release # is briefly missing on Windows self.emitDataChanged() def __lt__(self, other): # Always show NAT entry on top, see also NatAlbumItem.__lt__ if isinstance(other, NatAlbumItem): return not other.__lt__(self) return super().__lt__(other) class NatAlbumItem(AlbumItem): def __lt__(self, other): # Always show NAT entry on top order = self.treeWidget().header().sortIndicatorOrder() return order == QtCore.Qt.AscendingOrder class TrackItem(TreeItem): def update(self, update_album=True, update_files=True): track = self.obj tree_widget = self.treeWidget() if track.num_linked_files == 1: file = track.linked_files[0] file.item = self color = TrackItem.track_colors[file.state] bgcolor = get_match_color(file.similarity, TreeItem.base_color) icon = FileItem.decide_file_icon(file) self.setToolTip(MainPanel.TITLE_COLUMN, _(FileItem.decide_file_icon_info(file))) self.takeChildren() self.setExpanded(False) self.setToolTip(MainPanel.FINGERPRINT_COLUMN, FileItem.decide_fingerprint_icon_info(file)) if tree_widget: if not tree_widget.itemWidget(self, MainPanel.FINGERPRINT_COLUMN): tree_widget.setItemWidget(self, MainPanel.FINGERPRINT_COLUMN, FingerprintColumnWidget(file=file)) else: self.setToolTip(MainPanel.TITLE_COLUMN, "") self.setToolTip(MainPanel.FINGERPRINT_COLUMN, "") if tree_widget: tree_widget.setItemWidget(self, MainPanel.FINGERPRINT_COLUMN, None) if track.ignored_for_completeness(): color = TreeItem.text_color_secondary else: color = TreeItem.text_color bgcolor = get_match_color(1, TreeItem.base_color) if track.is_video(): icon = TrackItem.icon_video elif track.is_data(): icon = TrackItem.icon_data else: icon = TrackItem.icon_audio if update_files: oldnum = self.childCount() newnum = track.num_linked_files if oldnum > newnum: # remove old items for i in range(oldnum - newnum): self.takeChild(newnum - 1).obj.item = None oldnum = newnum for i in range(oldnum): # update existing items item = self.child(i) file = track.linked_files[i] item.obj = file file.item = item item.update(update_track=False) if newnum > oldnum: # add new items items = [] for i in range(newnum - 1, oldnum - 1, -1): item = FileItem(track.linked_files[i], False) item.update(update_track=False) items.append(item) self.addChildren(items) self.setExpanded(True) if track.error: self.setIcon(MainPanel.TITLE_COLUMN, TrackItem.icon_error) self.setToolTip(MainPanel.TITLE_COLUMN, track.error) else: self.setIcon(MainPanel.TITLE_COLUMN, icon) for i, column in enumerate(MainPanel.columns): self.setText(i, track.column(column[1])) self.setForeground(i, color) self.setBackground(i, bgcolor) if self.isSelected(): TreeItem.window.update_selection() if update_album: self.parent().update(update_tracks=False) class FileItem(TreeItem): def update(self, update_track=True): file = self.obj self.setIcon(MainPanel.TITLE_COLUMN, FileItem.decide_file_icon(file)) self.setToolTip(MainPanel.FINGERPRINT_COLUMN, self.decide_fingerprint_icon_info(file)) color = FileItem.file_colors[file.state] bgcolor = get_match_color(file.similarity, TreeItem.base_color) for i, column in enumerate(MainPanel.columns): self.setText(i, file.column(column[1])) self.setForeground(i, color) self.setBackground(i, bgcolor) tree_widget = self.treeWidget() if tree_widget: if not tree_widget.itemWidget(self, MainPanel.FINGERPRINT_COLUMN): tree_widget.setItemWidget(self, MainPanel.FINGERPRINT_COLUMN, FingerprintColumnWidget(file=file)) if self.isSelected(): TreeItem.window.update_selection() parent = self.parent() if isinstance(parent, TrackItem) and update_track: parent.update(update_files=False) @staticmethod def decide_file_icon(file): if file.state == File.ERROR: return FileItem.icon_error elif isinstance(file.parent, Track): if file.state == File.NORMAL: return FileItem.icon_saved elif file.state == File.PENDING: return FileItem.match_pending_icons[int(file.similarity * 5 + 0.5)] else: return FileItem.match_icons[int(file.similarity * 5 + 0.5)] elif file.state == File.PENDING: return FileItem.icon_file_pending else: return FileItem.icon_file @staticmethod def decide_file_icon_info(file): # Note error state info is already handled if isinstance(file.parent, Track): if file.state == File.NORMAL: return N_("Track saved") elif file.state == File.PENDING: # unsure how to use int(file.similarity * 5 + 0.5) return N_("Pending") else: # returns description of the match ranging from bad to excellent return FileItem.match_icons_info[int(file.similarity * 5 + 0.5)] elif file.state == File.PENDING: return N_("Pending") @staticmethod def decide_fingerprint_icon_info(file): if file.acoustid_fingerprint: if QtCore.QObject.tagger.acoustidmanager.is_submitted(file): return _('Fingerprint has already been submitted') else: return _('Unsubmitted fingerprint') else: return _('No fingerprint was calculated for this file, use "Scan" or "Generate AcoustID Fingerprints" to calculate the fingerprint.') picard-release-2.3.1/picard/ui/logview.py000066400000000000000000000247401362601763300203200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2008-2009, 2019-2020 Philipp Wolfer # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013-2014, 2018-2019 Laurent Monin # Copyright (C) 2014 Sophist-UK # Copyright (C) 2016, 2018 Sambhav Kothari # Copyright (C) 2018 Wieland Hoffmann # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import os from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import ( config, log, ) from picard.util import reconnect from picard.ui import PicardDialog from picard.ui.colors import interface_colors class LogViewDialog(PicardDialog): defaultsize = QtCore.QSize(570, 400) def __init__(self, title, parent=None): super().__init__(parent) self.setWindowFlags(QtCore.Qt.Window) self.setWindowTitle(title) self.doc = QtGui.QTextDocument() self.textCursor = QtGui.QTextCursor(self.doc) self.browser = QtWidgets.QTextBrowser() self.browser.setDocument(self.doc) self.vbox = QtWidgets.QVBoxLayout() self.setLayout(self.vbox) self.vbox.addWidget(self.browser) class LogViewCommon(LogViewDialog): def __init__(self, log_tail, *args, **kwargs): super().__init__(*args, **kwargs) self.displaying = False self.log_tail = log_tail self._init_doc() def _init_doc(self): self.prev = -1 self.doc.clear() self.textCursor.movePosition(QtGui.QTextCursor.Start) def closeEvent(self, event): event.ignore() self.hide() def hideEvent(self, event): reconnect(self.log_tail.updated, None) super().hideEvent(event) def showEvent(self, event): self.display() reconnect(self.log_tail.updated, self._updated) super().showEvent(event) def _updated(self): if self.displaying: return self.display() def display(self, clear=False): self.displaying = True if clear: self._init_doc() for logitem in self.log_tail.contents(self.prev): self._add_entry(logitem) self.prev = logitem.pos self.displaying = False def _add_entry(self, logitem): self.textCursor.movePosition(QtGui.QTextCursor.End) self.textCursor.insertText(logitem.message) self.textCursor.insertBlock() sb = self.browser.verticalScrollBar() sb.setValue(sb.maximum()) class Highlighter(QtGui.QSyntaxHighlighter): def __init__(self, string, parent=None): super().__init__(parent) self.fmt = QtGui.QTextCharFormat() self.fmt.setBackground(QtCore.Qt.lightGray) self.reg = QtCore.QRegExp() self.reg.setPatternSyntax(QtCore.QRegExp.Wildcard) self.reg.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.reg.setPattern(string) def highlightBlock(self, text): expression = self.reg index = expression.indexIn(text) while index >= 0: length = expression.matchedLength() self.setFormat(index, length, self.fmt) index = expression.indexIn(text, index + length) class VerbosityMenu(QtWidgets.QMenu): verbosity_changed = QtCore.pyqtSignal(int) def __init__(self, parent=None): super().__init__(parent=parent) self.action_group = QtWidgets.QActionGroup(self) self.actions = {} for level, feat in log.levels_features.items(): action = QtWidgets.QAction(_(feat.name), self) action.setCheckable(True) action.triggered.connect(partial(self.verbosity_changed.emit, level)) self.action_group.addAction(action) self.addAction(action) self.actions[level] = action def set_verbosity(self, level): self.actions[level].setChecked(True) class LogView(LogViewCommon): options = [ config.IntOption("setting", "log_verbosity", log.VERBOSITY_DEFAULT), ] def __init__(self, parent=None): super().__init__(log.main_tail, _("Log"), parent=parent) self.verbosity = log.get_effective_level() self._setup_formats() self.hl_text = '' self.hl = None self.hbox = QtWidgets.QHBoxLayout() self.vbox.addLayout(self.hbox) self.verbosity_menu_button = QtWidgets.QPushButton(_("Verbosity")) self.hbox.addWidget(self.verbosity_menu_button) self.verbosity_menu = VerbosityMenu() self.verbosity_menu.set_verbosity(self.verbosity) self.verbosity_menu.verbosity_changed.connect(self._verbosity_changed) self.verbosity_menu_button.setMenu(self.verbosity_menu) # highlight input self.highlight_text = QtWidgets.QLineEdit() self.highlight_text.setPlaceholderText(_("String to highlight")) self.highlight_text.textEdited.connect(self._highlight_text_edited) self.hbox.addWidget(self.highlight_text) # highlight button self.highlight_button = QtWidgets.QPushButton(_("Highlight")) self.hbox.addWidget(self.highlight_button) self.highlight_button.setDefault(True) self.highlight_button.setEnabled(False) self.highlight_button.clicked.connect(self._highlight_do) self.highlight_text.returnPressed.connect(self.highlight_button.click) # clear highlight button self.clear_highlight_button = QtWidgets.QPushButton(_("Clear Highlight")) self.hbox.addWidget(self.clear_highlight_button) self.clear_highlight_button.setEnabled(False) self.clear_highlight_button.clicked.connect(self._clear_highlight_do) # clear log self.clear_log_button = QtWidgets.QPushButton(_("Clear Log")) self.hbox.addWidget(self.clear_log_button) self.clear_log_button.clicked.connect(self._clear_log_do) # save as self.save_log_as_button = QtWidgets.QPushButton(_("Save As...")) self.hbox.addWidget(self.save_log_as_button) self.save_log_as_button.clicked.connect(self._save_log_as_do) def _clear_highlight_do(self): self.highlight_text.setText('') self.highlight_button.setEnabled(False) self._highlight_do() def _highlight_text_edited(self, text): if text and self.hl_text != text: self.highlight_button.setEnabled(True) else: self.highlight_button.setEnabled(False) if not text: self.clear_highlight_button.setEnabled(bool(self.hl)) def _highlight_do(self): new_hl_text = self.highlight_text.text() if new_hl_text != self.hl_text: self.hl_text = new_hl_text if self.hl is not None: self.hl.setDocument(None) self.hl = None if self.hl_text: self.hl = Highlighter(self.hl_text, parent=self.doc) self.clear_highlight_button.setEnabled(bool(self.hl)) def _setup_formats(self): interface_colors.load_from_config() self.formats = {} font = QtGui.QFont() font.setFamily("Monospace") for level, feat in log.levels_features.items(): text_fmt = QtGui.QTextCharFormat() text_fmt.setFont(font) text_fmt.setForeground(interface_colors.get_qcolor(feat.color_key)) self.formats[level] = text_fmt def _format(self, level): return self.formats[level] def _save_log_as_do(self): path, ok = QtWidgets.QFileDialog.getSaveFileName( self, caption=_("Save Log View to File"), options=QtWidgets.QFileDialog.DontConfirmOverwrite ) if ok and path: if os.path.isfile(path): reply = QtWidgets.QMessageBox.question( self, _("Save Log View to File"), _("File already exists, do you really want to save to this file?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No ) if reply != QtWidgets.QMessageBox.Yes: return writer = QtGui.QTextDocumentWriter(path) writer.setFormat(b"plaintext") success = writer.write(self.doc) if not success: QtWidgets.QMessageBox.critical( self, _("Failed to save Log View to file"), _("Something prevented data to be written to '%s'") % writer.fileName() ) def show(self): self.highlight_text.setFocus(QtCore.Qt.OtherFocusReason) super().show() def _clear_log_do(self): reply = QtWidgets.QMessageBox.question( self, _("Clear Log"), _("Are you sure you want to clear the log?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No ) if reply != QtWidgets.QMessageBox.Yes: return self.log_tail.clear() self.display(clear=True) def is_shown(self, logitem): return logitem.level >= self.verbosity def _add_entry(self, logitem): if not self.is_shown(logitem): return fmt = self.textCursor.blockCharFormat() self.textCursor.setBlockCharFormat(self._format(logitem.level)) super()._add_entry(logitem) self.textCursor.setBlockCharFormat(fmt) def _set_verbosity(self, level): self.verbosity = level self.verbosity_menu.set_verbosity(self.verbosity) def _verbosity_changed(self, level): if level != self.verbosity: config.setting['log_verbosity'] = level QtCore.QObject.tagger.set_log_level(level) self.verbosity = level self.display(clear=True) class HistoryView(LogViewCommon): def __init__(self, parent=None): super().__init__(log.history_tail, _("Activity History"), parent=parent) picard-release-2.3.1/picard/ui/mainwindow.py000066400000000000000000001526301362601763300210200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011-2012, 2014 Lukáš Lalinský # Copyright (C) 2007 Nikolai Prokoschenko # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2008 Robert Kaye # Copyright (C) 2008 Will # Copyright (C) 2008-2010, 2015, 2018-2020 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009 David Hilton # Copyright (C) 2011-2012 Chad Wilson # Copyright (C) 2011-2013, 2015-2017 Wieland Hoffmann # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2013-2014, 2017 Sophist-UK # Copyright (C) 2013-2020 Laurent Monin # Copyright (C) 2015 Ohm Patel # Copyright (C) 2015 samithaj # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 Simon Legner # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 Kartik Ohri # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2018 virusMac # Copyright (C) 2019 Timur Enikeev # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import OrderedDict import datetime from functools import partial import os.path from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import ( PICARD_APP_ID, config, log, ) from picard.album import Album from picard.cluster import Cluster from picard.const import PROGRAM_UPDATE_LEVELS from picard.const.sys import IS_MACOS from picard.file import File from picard.formats import supported_formats from picard.plugin import ExtensionPoint from picard.track import Track from picard.util import ( icontheme, restore_method, thread, throttle, webbrowser2, ) from picard.util.cdrom import ( discid, get_cdrom_drives, ) from picard.ui import PreserveGeometry from picard.ui.coverartbox import CoverArtBox from picard.ui.filebrowser import FileBrowser from picard.ui.infodialog import ( AlbumInfoDialog, ClusterInfoDialog, FileInfoDialog, TrackInfoDialog, ) from picard.ui.infostatus import InfoStatus from picard.ui.itemviews import MainPanel from picard.ui.logview import ( HistoryView, LogView, ) from picard.ui.metadatabox import MetadataBox from picard.ui.options.dialog import OptionsDialog from picard.ui.passworddialog import ( PasswordDialog, ProxyDialog, ) from picard.ui.playertoolbar import Player from picard.ui.searchdialog.album import AlbumSearchDialog from picard.ui.searchdialog.track import TrackSearchDialog from picard.ui.statusindicator import DesktopStatusIndicator from picard.ui.tagsfromfilenames import TagsFromFileNamesDialog from picard.ui.util import ( MultiDirsSelectDialog, find_starting_directory, ) ui_init = ExtensionPoint(label='ui_init') def register_ui_init(function): ui_init.register(function.__module__, function) class MainWindow(QtWidgets.QMainWindow, PreserveGeometry): defaultsize = QtCore.QSize(780, 560) autorestore = False selection_updated = QtCore.pyqtSignal(object) options = [ config.Option("persist", "window_state", QtCore.QByteArray()), config.Option("persist", "bottom_splitter_state", QtCore.QByteArray()), config.BoolOption("persist", "window_maximized", False), config.BoolOption("persist", "view_cover_art", True), config.BoolOption("persist", "view_toolbar", True), config.BoolOption("persist", "view_file_browser", False), config.TextOption("persist", "current_directory", ""), config.FloatOption("persist", "mediaplayer_playback_rate", 1.0), config.IntOption("persist", "mediaplayer_volume", 50), ] def __init__(self, parent=None): super().__init__(parent) self.selected_objects = [] self.ignore_selection_changes = False self.toolbar = None self.player = None self.status_indicators = [] player = Player(self) if player.available: self.player = player self.player.error.connect(self._on_player_error) self.setupUi() def setupUi(self): self.setWindowTitle(_("MusicBrainz Picard")) icon = QtGui.QIcon() for size in (16, 24, 32, 48, 128, 256): icon.addFile( ":/images/{size}x{size}/{app_id}.png".format( size=size, app_id=PICARD_APP_ID), QtCore.QSize(size, size) ) self.setWindowIcon(icon) self.show_close_window = IS_MACOS self.create_actions() self.create_statusbar() self.create_toolbar() self.create_menus() if IS_MACOS: self.setUnifiedTitleAndToolBarOnMac(True) self.toolbar.setMovable(False) self.search_toolbar.setMovable(False) mainLayout = QtWidgets.QSplitter(QtCore.Qt.Vertical) mainLayout.setContentsMargins(0, 0, 0, 0) mainLayout.setHandleWidth(1) self.panel = MainPanel(self, mainLayout) self.file_browser = FileBrowser(self.panel) if not self.show_file_browser_action.isChecked(): self.file_browser.hide() self.panel.insertWidget(0, self.file_browser) self.panel.restore_state() self.metadata_box = MetadataBox(self) self.cover_art_box = CoverArtBox(self) if not self.show_cover_art_action.isChecked(): self.cover_art_box.hide() self.log_dialog = LogView(self) self.history_dialog = HistoryView(self) bottomLayout = QtWidgets.QHBoxLayout() bottomLayout.setContentsMargins(0, 0, 0, 0) bottomLayout.setSpacing(0) bottomLayout.addWidget(self.metadata_box, 1) bottomLayout.addWidget(self.cover_art_box, 0) bottom = QtWidgets.QWidget() bottom.setLayout(bottomLayout) mainLayout.addWidget(self.panel) mainLayout.addWidget(bottom) self.setCentralWidget(mainLayout) # accessibility self.set_tab_order() for function in ui_init: function(self) def keyPressEvent(self, event): # On macOS Command+Backspace triggers the so called "Forward Delete". # It should be treated the same as the Delete button. is_forward_delete = IS_MACOS and \ event.key() == QtCore.Qt.Key_Backspace and \ event.modifiers() & QtCore.Qt.ControlModifier if event.matches(QtGui.QKeySequence.Delete) or is_forward_delete: if self.metadata_box.hasFocus(): self.metadata_box.remove_selected_tags() else: self.remove() elif event.matches(QtGui.QKeySequence.Find): self.search_edit.setFocus(True) else: super().keyPressEvent(event) def show(self): self.restoreWindowState() super().show() if self.tagger.autoupdate_enabled: self.auto_update_check() self.metadata_box.restore_state() def showEvent(self, event): super().showEvent(event) if DesktopStatusIndicator: self.register_status_indicator(DesktopStatusIndicator(self.windowHandle())) def closeEvent(self, event): if config.setting["quit_confirmation"] and not self.show_quit_confirmation(): event.ignore() return if self.player: config.persist['mediaplayer_playback_rate'] = self.player.playback_rate() config.persist['mediaplayer_volume'] = self.player.volume() self.saveWindowState() event.accept() def register_status_indicator(self, indicator): self.status_indicators.append(indicator) def show_quit_confirmation(self): unsaved_files = sum(a.get_num_unsaved_files() for a in self.tagger.albums.values()) QMessageBox = QtWidgets.QMessageBox if unsaved_files > 0: msg = QMessageBox(self) msg.setIcon(QMessageBox.Question) msg.setWindowModality(QtCore.Qt.WindowModal) msg.setWindowTitle(_("Unsaved Changes")) msg.setText(_("Are you sure you want to quit Picard?")) txt = ngettext( "There is %d unsaved file. Closing Picard will lose all unsaved changes.", "There are %d unsaved files. Closing Picard will lose all unsaved changes.", unsaved_files) % unsaved_files msg.setInformativeText(txt) cancel = msg.addButton(QMessageBox.Cancel) msg.setDefaultButton(cancel) msg.addButton(_("&Quit Picard"), QMessageBox.YesRole) ret = msg.exec_() if ret == QMessageBox.Cancel: return False return True def saveWindowState(self): config.persist["window_state"] = self.saveState() isMaximized = int(self.windowState()) & QtCore.Qt.WindowMaximized != 0 self.save_geometry() self.log_dialog.save_geometry() self.history_dialog.save_geometry() config.persist["window_maximized"] = isMaximized config.persist["view_cover_art"] = self.show_cover_art_action.isChecked() config.persist["view_toolbar"] = self.show_toolbar_action.isChecked() config.persist["view_file_browser"] = self.show_file_browser_action.isChecked() config.persist["bottom_splitter_state"] = self.centralWidget().saveState() self.file_browser.save_state() self.panel.save_state() self.metadata_box.save_state() @restore_method def restoreWindowState(self): self.restoreState(config.persist["window_state"]) self.restore_geometry() if config.persist["window_maximized"]: self.setWindowState(QtCore.Qt.WindowMaximized) bottom_splitter_state = config.persist["bottom_splitter_state"] if bottom_splitter_state.isEmpty(): self.centralWidget().setSizes([366, 194]) else: self.centralWidget().restoreState(bottom_splitter_state) self.file_browser.restore_state() def create_statusbar(self): """Creates a new status bar.""" self.statusBar().showMessage(_("Ready")) infostatus = InfoStatus(self) self.listening_label = QtWidgets.QLabel() self.listening_label.setVisible(False) self.listening_label.setToolTip("" + _( "Picard listens on this port to integrate with your browser. When " "you \"Search\" or \"Open in Browser\" from Picard, clicking the " "\"Tagger\" button on the web page loads the release into Picard." )) self.statusBar().addPermanentWidget(infostatus) self.statusBar().addPermanentWidget(self.listening_label) self.tagger.tagger_stats_changed.connect(self.update_statusbar_stats) self.tagger.listen_port_changed.connect(self.update_statusbar_listen_port) self.register_status_indicator(infostatus) self.update_statusbar_stats() @throttle(100) def update_statusbar_stats(self): """Updates the status bar information.""" total_files = len(self.tagger.files) total_albums = len(self.tagger.albums) pending_files = File.num_pending_files pending_requests = self.tagger.webservice.num_pending_web_requests for indicator in self.status_indicators: indicator.update(files=total_files, albums=total_albums, pending_files=pending_files, pending_requests=pending_requests) def update_statusbar_listen_port(self, listen_port): if listen_port: self.listening_label.setVisible(True) self.listening_label.setText(_(" Listening on port %(port)d ") % {"port": listen_port}) else: self.listening_label.setVisible(False) def set_statusbar_message(self, message, *args, **kwargs): """Set the status bar message. *args are passed to % operator, if args[0] is a mapping it is used for named place holders values >>> w.set_statusbar_message("File %(filename)s", {'filename': 'x.txt'}) Keyword arguments: `echo` parameter defaults to `log.debug`, called before message is translated, it can be disabled passing None or replaced by ie. `log.error`. If None, skipped. `translate` is a method called on message before it is sent to history log and status bar, it defaults to `_()`. If None, skipped. `timeout` defines duration of the display in milliseconds `history` is a method called with translated message as argument, it defaults to `log.history_info`. If None, skipped. Empty messages are never passed to echo and history functions but they are sent to status bar (ie. to clear it). """ def isdict(obj): return hasattr(obj, 'keys') and hasattr(obj, '__getitem__') echo = kwargs.get('echo', log.debug) # _ is defined using builtins.__dict__, so setting it as default named argument # value doesn't work as expected translate = kwargs.get('translate', _) timeout = kwargs.get('timeout', 0) history = kwargs.get('history', log.history_info) if len(args) == 1 and isdict(args[0]): # named place holders mparms = args[0] else: # simple place holders, ensure compatibility mparms = args if message: if echo: echo(message % mparms) if translate: message = translate(message) message = message % mparms if history: history(message) thread.to_main(self.statusBar().showMessage, message, timeout) def _on_submit_acoustid(self): if self.tagger.use_acoustid: if not config.setting["acoustid_apikey"]: QtWidgets.QMessageBox.warning(self, _("Submission Error"), _("You need to configure your AcoustID API key before you can submit fingerprints.")) else: self.tagger.acoustidmanager.submit() def create_actions(self): self.options_action = QtWidgets.QAction(icontheme.lookup('preferences-desktop'), _("&Options..."), self) self.options_action.setMenuRole(QtWidgets.QAction.PreferencesRole) self.options_action.triggered.connect(self.show_options) self.cut_action = QtWidgets.QAction(icontheme.lookup('edit-cut', icontheme.ICON_SIZE_MENU), _("&Cut"), self) self.cut_action.setShortcut(QtGui.QKeySequence.Cut) self.cut_action.setEnabled(False) self.cut_action.triggered.connect(self.cut) self.paste_action = QtWidgets.QAction(icontheme.lookup('edit-paste', icontheme.ICON_SIZE_MENU), _("&Paste"), self) self.paste_action.setShortcut(QtGui.QKeySequence.Paste) self.paste_action.setEnabled(False) self.paste_action.triggered.connect(self.paste) self.help_action = QtWidgets.QAction(_("&Help..."), self) self.help_action.setShortcut(QtGui.QKeySequence.HelpContents) self.help_action.triggered.connect(self.show_help) self.about_action = QtWidgets.QAction(_("&About..."), self) self.about_action.setMenuRole(QtWidgets.QAction.AboutRole) self.about_action.triggered.connect(self.show_about) self.donate_action = QtWidgets.QAction(_("&Donate..."), self) self.donate_action.triggered.connect(self.open_donation_page) self.report_bug_action = QtWidgets.QAction(_("&Report a Bug..."), self) self.report_bug_action.triggered.connect(self.open_bug_report) self.support_forum_action = QtWidgets.QAction(_("&Support Forum..."), self) self.support_forum_action.triggered.connect(self.open_support_forum) self.add_files_action = QtWidgets.QAction(icontheme.lookup('document-open'), _("&Add Files..."), self) self.add_files_action.setStatusTip(_("Add files to the tagger")) # TR: Keyboard shortcut for "Add Files..." self.add_files_action.setShortcut(QtGui.QKeySequence.Open) self.add_files_action.triggered.connect(self.add_files) self.add_directory_action = QtWidgets.QAction(icontheme.lookup('folder'), _("Add Fold&er..."), self) self.add_directory_action.setStatusTip(_("Add a folder to the tagger")) # TR: Keyboard shortcut for "Add Directory..." self.add_directory_action.setShortcut(QtGui.QKeySequence(_("Ctrl+E"))) self.add_directory_action.triggered.connect(self.add_directory) if self.show_close_window: self.close_window_action = QtWidgets.QAction(_("Close Window"), self) self.close_window_action.setShortcut(QtGui.QKeySequence(_("Ctrl+W"))) self.close_window_action.triggered.connect(self.close_active_window) self.save_action = QtWidgets.QAction(icontheme.lookup('document-save'), _("&Save"), self) self.save_action.setStatusTip(_("Save selected files")) # TR: Keyboard shortcut for "Save" self.save_action.setShortcut(QtGui.QKeySequence.Save) self.save_action.setEnabled(False) self.save_action.triggered.connect(self.save) self.submit_acoustid_action = QtWidgets.QAction(icontheme.lookup('acoustid-fingerprinter'), _("S&ubmit AcoustIDs"), self) self.submit_acoustid_action.setStatusTip(_("Submit acoustic fingerprints")) self.submit_acoustid_action.setEnabled(False) self.submit_acoustid_action.triggered.connect(self._on_submit_acoustid) self.exit_action = QtWidgets.QAction(_("E&xit"), self) self.exit_action.setMenuRole(QtWidgets.QAction.QuitRole) # TR: Keyboard shortcut for "Exit" self.exit_action.setShortcut(QtGui.QKeySequence(_("Ctrl+Q"))) self.exit_action.triggered.connect(self.close) self.remove_action = QtWidgets.QAction(icontheme.lookup('list-remove'), _("&Remove"), self) self.remove_action.setStatusTip(_("Remove selected files/albums")) self.remove_action.setEnabled(False) self.remove_action.triggered.connect(self.remove) self.browser_lookup_action = QtWidgets.QAction(icontheme.lookup('lookup-musicbrainz'), _("Lookup in &Browser"), self) self.browser_lookup_action.setStatusTip(_("Lookup selected item on MusicBrainz website")) self.browser_lookup_action.setEnabled(False) # TR: Keyboard shortcut for "Lookup in Browser" self.browser_lookup_action.setShortcut(QtGui.QKeySequence(_("Ctrl+Shift+L"))) self.browser_lookup_action.triggered.connect(self.browser_lookup) self.album_search_action = QtWidgets.QAction(icontheme.lookup('system-search'), _("Search for similar albums..."), self) self.album_search_action.setStatusTip(_("View similar releases and optionally choose a different release")) self.album_search_action.triggered.connect(self.show_more_albums) self.track_search_action = QtWidgets.QAction(icontheme.lookup('system-search'), _("Search for similar tracks..."), self) self.track_search_action.setStatusTip(_("View similar tracks and optionally choose a different release")) self.track_search_action.triggered.connect(self.show_more_tracks) self.show_file_browser_action = QtWidgets.QAction(_("File &Browser"), self) self.show_file_browser_action.setCheckable(True) if config.persist["view_file_browser"]: self.show_file_browser_action.setChecked(True) self.show_file_browser_action.setShortcut(QtGui.QKeySequence(_("Ctrl+B"))) self.show_file_browser_action.triggered.connect(self.show_file_browser) self.show_cover_art_action = QtWidgets.QAction(_("&Cover Art"), self) self.show_cover_art_action.setCheckable(True) if config.persist["view_cover_art"]: self.show_cover_art_action.setChecked(True) self.show_cover_art_action.triggered.connect(self.show_cover_art) self.show_toolbar_action = QtWidgets.QAction(_("&Actions"), self) self.show_toolbar_action.setCheckable(True) if config.persist["view_toolbar"]: self.show_toolbar_action.setChecked(True) self.show_toolbar_action.triggered.connect(self.show_toolbar) self.search_action = QtWidgets.QAction(icontheme.lookup('system-search'), _("Search"), self) self.search_action.setEnabled(False) self.search_action.triggered.connect(self.search) self.cd_lookup_action = QtWidgets.QAction(icontheme.lookup('media-optical'), _("Lookup &CD..."), self) self.cd_lookup_action.setStatusTip(_("Lookup the details of the CD in your drive")) # TR: Keyboard shortcut for "Lookup CD" self.cd_lookup_action.setShortcut(QtGui.QKeySequence(_("Ctrl+K"))) self.cd_lookup_action.triggered.connect(self.tagger.lookup_cd) self.cd_lookup_menu = QtWidgets.QMenu(_("Lookup &CD...")) self.cd_lookup_menu.triggered.connect(self.tagger.lookup_cd) self.cd_lookup_action.setEnabled(False) if discid is None: log.warning("CDROM: discid library not found - Lookup CD functionality disabled") else: thread.run_task(get_cdrom_drives, self._update_cd_lookup_actions) self.analyze_action = QtWidgets.QAction(icontheme.lookup('picard-analyze'), _("&Scan"), self) self.analyze_action.setStatusTip(_("Use AcoustID audio fingerprint to identify the files by the actual music, even if they have no metadata")) self.analyze_action.setEnabled(False) self.analyze_action.setToolTip(_('Identify the file using its AcoustID audio fingerprint')) # TR: Keyboard shortcut for "Analyze" self.analyze_action.setShortcut(QtGui.QKeySequence(_("Ctrl+Y"))) self.analyze_action.triggered.connect(self.analyze) self.generate_fingerprints_action = QtWidgets.QAction(icontheme.lookup('fingerprint'), _("&Generate AcoustID Fingerprints"), self) self.generate_fingerprints_action.setIconText(_("Generate Fingerprints")) self.generate_fingerprints_action.setStatusTip(_("Generate the AcoustID audio fingerprints for the selected files without doing a lookup")) self.generate_fingerprints_action.setEnabled(False) self.generate_fingerprints_action.setToolTip(_('Generate the AcoustID audio fingerprints for the selected files')) self.generate_fingerprints_action.setShortcut(QtGui.QKeySequence(_("Ctrl+Shift+Y"))) self.generate_fingerprints_action.triggered.connect(self.generate_fingerprints) self.cluster_action = QtWidgets.QAction(icontheme.lookup('picard-cluster'), _("Cl&uster"), self) self.cluster_action.setStatusTip(_("Cluster files into album clusters")) self.cluster_action.setEnabled(False) # TR: Keyboard shortcut for "Cluster" self.cluster_action.setShortcut(QtGui.QKeySequence(_("Ctrl+U"))) self.cluster_action.triggered.connect(self.cluster) self.autotag_action = QtWidgets.QAction(icontheme.lookup('picard-auto-tag'), _("&Lookup"), self) tip = _("Lookup selected items in MusicBrainz") self.autotag_action.setToolTip(tip) self.autotag_action.setStatusTip(tip) self.autotag_action.setEnabled(False) # TR: Keyboard shortcut for "Lookup" self.autotag_action.setShortcut(QtGui.QKeySequence(_("Ctrl+L"))) self.autotag_action.triggered.connect(self.autotag) self.view_info_action = QtWidgets.QAction(icontheme.lookup('picard-edit-tags'), _("&Info..."), self) self.view_info_action.setEnabled(False) # TR: Keyboard shortcut for "Info" self.view_info_action.setShortcut(QtGui.QKeySequence(_("Ctrl+I"))) self.view_info_action.triggered.connect(self.view_info) self.refresh_action = QtWidgets.QAction(icontheme.lookup('view-refresh', icontheme.ICON_SIZE_MENU), _("&Refresh"), self) self.refresh_action.setShortcut(QtGui.QKeySequence(_("Ctrl+R"))) self.refresh_action.triggered.connect(self.refresh) self.enable_renaming_action = QtWidgets.QAction(_("&Rename Files"), self) self.enable_renaming_action.setCheckable(True) self.enable_renaming_action.setChecked(config.setting["rename_files"]) self.enable_renaming_action.triggered.connect(self.toggle_rename_files) self.enable_moving_action = QtWidgets.QAction(_("&Move Files"), self) self.enable_moving_action.setCheckable(True) self.enable_moving_action.setChecked(config.setting["move_files"]) self.enable_moving_action.triggered.connect(self.toggle_move_files) self.enable_tag_saving_action = QtWidgets.QAction(_("Save &Tags"), self) self.enable_tag_saving_action.setCheckable(True) self.enable_tag_saving_action.setChecked(not config.setting["dont_write_tags"]) self.enable_tag_saving_action.triggered.connect(self.toggle_tag_saving) self.tags_from_filenames_action = QtWidgets.QAction(_("Tags From &File Names..."), self) self.tags_from_filenames_action.triggered.connect(self.open_tags_from_filenames) self.tags_from_filenames_action.setEnabled(False) self.open_collection_in_browser_action = QtWidgets.QAction(_("&Open My Collections in Browser"), self) self.open_collection_in_browser_action.triggered.connect(self.open_collection_in_browser) self.open_collection_in_browser_action.setEnabled(config.setting["username"] != '') self.view_log_action = QtWidgets.QAction(_("View &Error/Debug Log"), self) self.view_log_action.triggered.connect(self.show_log) # TR: Keyboard shortcut for "View Error/Debug Log" self.view_log_action.setShortcut(QtGui.QKeySequence(_("Ctrl+G"))) self.view_history_action = QtWidgets.QAction(_("View Activity &History"), self) self.view_history_action.triggered.connect(self.show_history) # TR: Keyboard shortcut for "View Activity History" self.view_history_action.setShortcut(QtGui.QKeySequence(_("Ctrl+H"))) webservice_manager = self.tagger.webservice.manager webservice_manager.authenticationRequired.connect(self.show_password_dialog) webservice_manager.proxyAuthenticationRequired.connect(self.show_proxy_dialog) self.play_file_action = QtWidgets.QAction(icontheme.lookup('play-music'), _("Open in &Player"), self) self.play_file_action.setStatusTip(_("Play the file in your default media player")) self.play_file_action.setEnabled(False) self.play_file_action.triggered.connect(self.play_file) self.open_folder_action = QtWidgets.QAction(icontheme.lookup('folder', icontheme.ICON_SIZE_MENU), _("Open Containing &Folder"), self) self.open_folder_action.setStatusTip(_("Open the containing folder in your file explorer")) self.open_folder_action.setEnabled(False) self.open_folder_action.triggered.connect(self.open_folder) if self.tagger.autoupdate_enabled: self.check_update_action = QtWidgets.QAction(_("&Check for Update…"), self) self.check_update_action.setMenuRole(QtWidgets.QAction.ApplicationSpecificRole) self.check_update_action.triggered.connect(self.do_update_check) def _update_cd_lookup_actions(self, result=None, error=None): if error: log.error("CDROM: Error on CD-ROM drive detection: %r", error) else: self.update_cd_lookup_drives(result) def update_cd_lookup_drives(self, drives): if not drives: log.warning("CDROM: No CD-ROM drives found - Lookup CD functionality disabled") else: shortcut_drive = config.setting["cd_lookup_device"].split(",")[0] if len(drives) > 1 else "" self.cd_lookup_action.setEnabled(discid is not None) self.cd_lookup_menu.clear() for drive in drives: action = self.cd_lookup_menu.addAction(drive) action.setData(drive) if drive == shortcut_drive: # Clear existing shortcode on main action and assign it to sub-action self.cd_lookup_action.setShortcut(QtGui.QKeySequence()) action.setShortcut(QtGui.QKeySequence(_("Ctrl+K"))) self._update_cd_lookup_button() def _update_cd_lookup_button(self): if len(self.cd_lookup_menu.actions()) > 1: button = self.toolbar.widgetForAction(self.cd_lookup_action) if button: button.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) self.cd_lookup_action.setMenu(self.cd_lookup_menu) else: self.cd_lookup_action.setMenu(None) def toggle_rename_files(self, checked): config.setting["rename_files"] = checked def toggle_move_files(self, checked): config.setting["move_files"] = checked def toggle_tag_saving(self, checked): config.setting["dont_write_tags"] = not checked def get_selected_or_unmatched_files(self): files = self.tagger.get_files_from_objects(self.selected_objects) if not files: files = self.tagger.unclustered_files.files return files def open_tags_from_filenames(self): files = self.get_selected_or_unmatched_files() if files: dialog = TagsFromFileNamesDialog(files, self) dialog.exec_() def open_collection_in_browser(self): self.tagger.collection_lookup() def create_menus(self): menu = self.menuBar().addMenu(_("&File")) menu.addAction(self.add_directory_action) menu.addAction(self.add_files_action) if self.show_close_window: menu.addAction(self.close_window_action) menu.addSeparator() menu.addAction(self.play_file_action) menu.addAction(self.open_folder_action) menu.addSeparator() menu.addAction(self.save_action) menu.addAction(self.submit_acoustid_action) menu.addSeparator() menu.addAction(self.exit_action) menu = self.menuBar().addMenu(_("&Edit")) menu.addAction(self.cut_action) menu.addAction(self.paste_action) menu.addSeparator() menu.addAction(self.view_info_action) menu.addAction(self.remove_action) menu = self.menuBar().addMenu(_("&View")) menu.addAction(self.show_file_browser_action) menu.addAction(self.show_cover_art_action) menu.addSeparator() menu.addAction(self.show_toolbar_action) menu.addAction(self.search_toolbar_toggle_action) if self.player: menu.addAction(self.player_toolbar_toggle_action) menu = self.menuBar().addMenu(_("&Options")) menu.addAction(self.enable_renaming_action) menu.addAction(self.enable_moving_action) menu.addAction(self.enable_tag_saving_action) menu.addSeparator() menu.addAction(self.options_action) menu = self.menuBar().addMenu(_("&Tools")) menu.addAction(self.refresh_action) menu.addAction(self.cd_lookup_action) menu.addAction(self.autotag_action) menu.addAction(self.analyze_action) menu.addAction(self.cluster_action) menu.addAction(self.browser_lookup_action) menu.addSeparator() menu.addAction(self.generate_fingerprints_action) menu.addAction(self.tags_from_filenames_action) menu.addAction(self.open_collection_in_browser_action) self.menuBar().addSeparator() menu = self.menuBar().addMenu(_("&Help")) menu.addAction(self.help_action) menu.addSeparator() menu.addAction(self.view_history_action) menu.addSeparator() if self.tagger.autoupdate_enabled: menu.addAction(self.check_update_action) menu.addSeparator() menu.addAction(self.support_forum_action) menu.addAction(self.report_bug_action) menu.addAction(self.view_log_action) menu.addSeparator() menu.addAction(self.donate_action) menu.addAction(self.about_action) def update_toolbar_style(self): if config.setting["toolbar_show_labels"]: self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) if self.player: self.player.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) else: self.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) if self.player: self.player.toolbar.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) def create_toolbar(self): self.create_search_toolbar() if self.player: self.create_player_toolbar() self.create_action_toolbar() def create_action_toolbar(self): if self.toolbar: self.toolbar.clear() self.removeToolBar(self.toolbar) self.toolbar = toolbar = QtWidgets.QToolBar(_("Actions")) self.insertToolBar(self.search_toolbar, self.toolbar) self.update_toolbar_style() toolbar.setObjectName("main_toolbar") def add_toolbar_action(action): toolbar.addAction(action) widget = toolbar.widgetForAction(action) widget.setFocusPolicy(QtCore.Qt.TabFocus) widget.setAttribute(QtCore.Qt.WA_MacShowFocusRect) for action in config.setting['toolbar_layout']: if action == 'cd_lookup_action': add_toolbar_action(self.cd_lookup_action) self._update_cd_lookup_button() elif action == 'separator': toolbar.addSeparator() else: try: add_toolbar_action(getattr(self, action)) except AttributeError: log.warning('Warning: Unknown action name "%r" found in config. Ignored.', action) self.show_toolbar() def create_player_toolbar(self): """"Create a toolbar with internal player control elements""" toolbar = self.player.create_toolbar() self.addToolBar(QtCore.Qt.BottomToolBarArea, toolbar) self.player_toolbar_toggle_action = toolbar.toggleViewAction() toolbar.hide() # Hide by default def create_search_toolbar(self): self.search_toolbar = toolbar = self.addToolBar(_("Search")) self.search_toolbar_toggle_action = self.search_toolbar.toggleViewAction() toolbar.setObjectName("search_toolbar") search_panel = QtWidgets.QWidget(toolbar) hbox = QtWidgets.QHBoxLayout(search_panel) self.search_combo = QtWidgets.QComboBox(search_panel) self.search_combo.addItem(_("Album"), "album") self.search_combo.addItem(_("Artist"), "artist") self.search_combo.addItem(_("Track"), "track") hbox.addWidget(self.search_combo, 0) self.search_edit = QtWidgets.QLineEdit(search_panel) self.search_edit.setClearButtonEnabled(True) self.search_edit.returnPressed.connect(self.trigger_search_action) self.search_edit.textChanged.connect(self.enable_search) hbox.addWidget(self.search_edit, 0) self.search_button = QtWidgets.QToolButton(search_panel) self.search_button.setAutoRaise(True) self.search_button.setDefaultAction(self.search_action) self.search_button.setIconSize(QtCore.QSize(22, 22)) self.search_button.setAttribute(QtCore.Qt.WA_MacShowFocusRect) # search button contextual menu, shortcut to toggle search options def search_button_menu(position): menu = QtWidgets.QMenu() opts = OrderedDict([ ('use_adv_search_syntax', N_("&Advanced search")), ('builtin_search', N_("&Builtin search")) ]) def toggle_opt(opt, checked): config.setting[opt] = checked for opt, label in opts.items(): action = QtWidgets.QAction(_(label), menu) action.setCheckable(True) action.setChecked(config.setting[opt]) action.triggered.connect(partial(toggle_opt, opt)) menu.addAction(action) menu.exec_(self.search_button.mapToGlobal(position)) self.search_button.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.search_button.customContextMenuRequested.connect(search_button_menu) hbox.addWidget(self.search_button) toolbar.addWidget(search_panel) def set_tab_order(self): tab_order = self.setTabOrder tw = self.toolbar.widgetForAction prev_action = None current_action = None # Setting toolbar widget tab-orders for accessibility for action in config.setting['toolbar_layout']: if action != 'separator': try: current_action = tw(getattr(self, action)) except AttributeError: # No need to log warnings since we have already # done it once in create_toolbar pass if prev_action is not None and prev_action != current_action: tab_order(prev_action, current_action) prev_action = current_action tab_order(prev_action, self.search_combo) tab_order(self.search_combo, self.search_edit) tab_order(self.search_edit, self.search_button) # Panels tab_order(self.search_button, self.file_browser) tab_order(self.file_browser, self.panel.views[0]) tab_order(self.panel.views[0], self.panel.views[1]) tab_order(self.panel.views[1], self.metadata_box) def enable_submit(self, enabled): """Enable/disable the 'Submit fingerprints' action.""" self.submit_acoustid_action.setEnabled(enabled) def enable_cluster(self, enabled): """Enable/disable the 'Cluster' action.""" self.cluster_action.setEnabled(enabled) def enable_search(self): """Enable/disable the 'Search' action.""" if self.search_edit.text(): self.search_action.setEnabled(True) else: self.search_action.setEnabled(False) def trigger_search_action(self): if self.search_action.isEnabled(): self.search_action.trigger() def search_mbid_found(self, entity, mbid): self.search_edit.setText('%s:%s' % (entity, mbid)) def search(self): """Search for album, artist or track on the MusicBrainz website.""" text = self.search_edit.text() entity = self.search_combo.itemData(self.search_combo.currentIndex()) self.tagger.search(text, entity, config.setting["use_adv_search_syntax"], mbid_matched_callback=self.search_mbid_found) def add_files(self): """Add files to the tagger.""" current_directory = find_starting_directory() formats = [] extensions = [] for exts, name in supported_formats(): exts = ["*" + e for e in exts] formats.append("%s (%s)" % (name, " ".join(exts))) extensions.extend(exts) formats.sort() extensions.sort() formats.insert(0, _("All Supported Formats") + " (%s)" % " ".join(extensions)) files, _filter = QtWidgets.QFileDialog.getOpenFileNames(self, "", current_directory, ";;".join(formats)) if files: config.persist["current_directory"] = os.path.dirname(files[0]) self.tagger.add_files(files) def add_directory(self): """Add directory to the tagger.""" current_directory = find_starting_directory() dir_list = [] if not config.setting["toolbar_multiselect"]: directory = QtWidgets.QFileDialog.getExistingDirectory(self, "", current_directory) if directory: dir_list.append(directory) else: file_dialog = MultiDirsSelectDialog(self, "", current_directory) if file_dialog.exec_() == QtWidgets.QDialog.Accepted: dir_list = file_dialog.selectedFiles() dir_count = len(dir_list) if dir_count: parent = os.path.dirname(dir_list[0]) if dir_count > 1 else dir_list[0] config.persist["current_directory"] = parent if dir_count > 1: self.set_statusbar_message( N_("Adding multiple directories from '%(directory)s' ..."), {'directory': parent} ) else: self.set_statusbar_message( N_("Adding directory: '%(directory)s' ..."), {'directory': dir_list[0]} ) for directory in dir_list: self.tagger.add_directory(directory) def close_active_window(self): self.tagger.activeWindow().close() def show_about(self): return self.show_options("about") def show_options(self, page=None): return OptionsDialog.show_instance(page, self) def show_help(self): webbrowser2.goto('documentation') def show_log(self): self.log_dialog.show() self.log_dialog.raise_() self.log_dialog.activateWindow() def show_history(self): self.history_dialog.show() self.history_dialog.raise_() self.history_dialog.activateWindow() def open_bug_report(self): webbrowser2.goto('troubleshooting') def open_support_forum(self): webbrowser2.goto('forum') def open_donation_page(self): webbrowser2.goto('donate') def save(self): """Tell the tagger to save the selected objects.""" self.tagger.save(self.selected_objects) def remove(self): """Tell the tagger to remove the selected objects.""" self.panel.remove(self.selected_objects) def analyze(self): def callback(fingerprinting_system): if fingerprinting_system: self.tagger.analyze(self.selected_objects) self._ensure_fingerprinting_configured(callback) def generate_fingerprints(self): def callback(fingerprinting_system): if fingerprinting_system: self.tagger.generate_fingerprints(self.selected_objects) self._ensure_fingerprinting_configured(callback) def _openUrl(self, url): return QtCore.QUrl.fromLocalFile(url) def play_file(self): files = self.tagger.get_files_from_objects(self.selected_objects) for file in files: QtGui.QDesktopServices.openUrl(self._openUrl(file.filename)) def _on_player_error(self, error, msg): self.set_statusbar_message(msg, echo=log.warning, translate=None) def open_folder(self): files = self.tagger.get_files_from_objects(self.selected_objects) folders = set([os.path.dirname(f.filename) for f in files]) for folder in folders: QtGui.QDesktopServices.openUrl(self._openUrl(folder)) def _ensure_fingerprinting_configured(self, callback): def on_finished(result): callback(config.setting['fingerprinting_system']) if not config.setting['fingerprinting_system']: if self._show_analyze_settings_info(): dialog = self.show_options("fingerprinting") dialog.finished.connect(on_finished) else: callback(config.setting['fingerprinting_system']) def _show_analyze_settings_info(self): ret = QtWidgets.QMessageBox.question(self, _("Configuration Required"), _("Audio fingerprinting is not yet configured. Would you like to configure it now?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.Yes) return ret == QtWidgets.QMessageBox.Yes def show_more_tracks(self): obj = self.selected_objects[0] if isinstance(obj, Track): obj = obj.linked_files[0] dialog = TrackSearchDialog(self) dialog.load_similar_tracks(obj) dialog.exec_() def show_more_albums(self): obj = self.selected_objects[0] dialog = AlbumSearchDialog(self) dialog.show_similar_albums(obj) dialog.exec_() def view_info(self, default_tab=0): if isinstance(self.selected_objects[0], Album): album = self.selected_objects[0] dialog = AlbumInfoDialog(album, self) elif isinstance(self.selected_objects[0], Cluster): cluster = self.selected_objects[0] dialog = ClusterInfoDialog(cluster, self) elif isinstance(self.selected_objects[0], Track): track = self.selected_objects[0] dialog = TrackInfoDialog(track, self) else: file = self.tagger.get_files_from_objects(self.selected_objects)[0] dialog = FileInfoDialog(file, self) dialog.ui.tabWidget.setCurrentIndex(default_tab) dialog.exec_() def cluster(self): self.tagger.cluster(self.selected_objects) self.update_actions() def refresh(self): self.tagger.refresh(self.selected_objects) def browser_lookup(self): self.tagger.browser_lookup(self.selected_objects[0]) @throttle(100) def update_actions(self): can_remove = False can_save = False can_analyze = False can_refresh = False can_autotag = False single = self.selected_objects[0] if len(self.selected_objects) == 1 else None can_view_info = bool(single and single.can_view_info()) can_browser_lookup = bool(single and single.can_browser_lookup()) have_files = bool(self.tagger.get_files_from_objects(self.selected_objects)) have_objects = bool(self.selected_objects) for obj in self.selected_objects: if obj is None: continue if obj.can_analyze(): can_analyze = True if obj.can_save(): can_save = True if obj.can_remove(): can_remove = True if obj.can_refresh(): can_refresh = True if obj.can_autotag(): can_autotag = True # Skip further loops if all values now True. if can_analyze and can_save and can_remove and can_refresh and can_autotag: break self.remove_action.setEnabled(can_remove) self.save_action.setEnabled(can_save) self.view_info_action.setEnabled(can_view_info) self.analyze_action.setEnabled(can_analyze) self.generate_fingerprints_action.setEnabled(have_files) self.refresh_action.setEnabled(can_refresh) self.autotag_action.setEnabled(can_autotag) self.browser_lookup_action.setEnabled(can_browser_lookup) self.play_file_action.setEnabled(have_files) self.open_folder_action.setEnabled(have_files) self.cut_action.setEnabled(have_objects) files = self.get_selected_or_unmatched_files() self.tags_from_filenames_action.setEnabled(bool(files)) self.track_search_action.setEnabled(have_objects) def update_selection(self, objects=None): if self.ignore_selection_changes: return if objects is not None: self.selected_objects = objects else: objects = self.selected_objects self.update_actions() metadata = None orig_metadata = None obj = None # Clear any existing status bar messages self.set_statusbar_message("") if self.player: self.player.set_objects(self.selected_objects) if len(objects) == 1: obj = list(objects)[0] if isinstance(obj, File): metadata = obj.metadata orig_metadata = obj.orig_metadata if obj.state == obj.ERROR: msg = N_("%(filename)s (error: %(error)s)") mparms = { 'filename': obj.filename, 'error': obj.error } else: msg = N_("%(filename)s") mparms = { 'filename': obj.filename, } self.set_statusbar_message(msg, mparms, echo=None, history=None) elif isinstance(obj, Track): metadata = obj.metadata if obj.num_linked_files == 1: file = obj.linked_files[0] orig_metadata = file.orig_metadata if file.state == File.ERROR: msg = N_("%(filename)s (%(similarity)d%%) (error: %(error)s)") mparms = { 'filename': file.filename, 'similarity': file.similarity * 100, 'error': file.error } else: msg = N_("%(filename)s (%(similarity)d%%)") mparms = { 'filename': file.filename, 'similarity': file.similarity * 100, } self.set_statusbar_message(msg, mparms, echo=None, history=None) elif isinstance(obj, Album): metadata = obj.metadata orig_metadata = obj.orig_metadata elif obj.can_show_coverart: metadata = obj.metadata self.metadata_box.selection_dirty = True self.metadata_box.update() self.cover_art_box.set_metadata(metadata, orig_metadata, obj) self.selection_updated.emit(objects) def show_cover_art(self): """Show/hide the cover art box.""" if self.show_cover_art_action.isChecked(): self.cover_art_box.show() else: self.cover_art_box.hide() def show_toolbar(self): """Show/hide the Action toolbar.""" if self.show_toolbar_action.isChecked(): self.toolbar.show() else: self.toolbar.hide() def show_file_browser(self): """Show/hide the file browser.""" if self.show_file_browser_action.isChecked(): sizes = self.panel.sizes() if sizes[0] == 0: sizes[0] = sum(sizes) // 4 self.panel.setSizes(sizes) self.file_browser.show() else: self.file_browser.hide() def show_password_dialog(self, reply, authenticator): if reply.url().host() == config.setting['server_host']: ret = QtWidgets.QMessageBox.question(self, _("Authentication Required"), _("Picard needs authorization to access your personal data on the MusicBrainz server. Would you like to log in now?"), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.Yes) if ret == QtWidgets.QMessageBox.Yes: self.tagger.mb_login(self.on_mb_login_finished) else: dialog = PasswordDialog(authenticator, reply, parent=self) dialog.exec_() @classmethod def on_mb_login_finished(self, successful): log.debug('MusicBrainz authentication finished: %s', successful) def show_proxy_dialog(self, proxy, authenticator): dialog = ProxyDialog(authenticator, proxy, parent=self) dialog.exec_() def autotag(self): self.tagger.autotag(self.selected_objects) def cut(self): self.tagger.copy_files(self.selected_objects) self.paste_action.setEnabled(bool(self.selected_objects)) def paste(self): selected_objects = self.selected_objects if not selected_objects: target = self.tagger.unclustered_files else: target = selected_objects[0] self.tagger.paste_files(target) self.paste_action.setEnabled(False) def do_update_check(self): self.check_for_update(True) def auto_update_check(self): check_for_updates = config.setting['check_for_updates'] update_check_days = config.setting['update_check_days'] last_update_check = config.persist['last_update_check'] update_level = config.setting['update_level'] today = datetime.date.today().toordinal() do_auto_update_check = check_for_updates and update_check_days > 0 and today >= last_update_check + update_check_days log.debug('{check_status} start-up check for program updates. Today: {today_date}, Last check: {last_check} (Check interval: {check_interval} days), Update level: {update_level} ({update_level_name})'.format( check_status='Initiating' if do_auto_update_check else 'Skipping', today_date=datetime.date.today(), last_check=str(datetime.date.fromordinal(last_update_check)) if last_update_check > 0 else 'never', check_interval=update_check_days, update_level=update_level, update_level_name=PROGRAM_UPDATE_LEVELS[update_level]['name'] if update_level in PROGRAM_UPDATE_LEVELS else 'unknown', )) if do_auto_update_check: self.check_for_update(False) def check_for_update(self, show_always): self.tagger.updatecheckmanager.check_update( show_always=show_always, update_level=config.setting['update_level'], callback=update_last_check_date ) def update_last_check_date(is_success): if is_success: config.persist['last_update_check'] = datetime.date.today().toordinal() else: log.debug('The update check was unsuccessful. The last update date will not be changed.') picard-release-2.3.1/picard/ui/metadatabox.py000066400000000000000000000600741362601763300211350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2007, 2012 Lukáš Lalinský # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2012 Nikolai Prokoschenko # Copyright (C) 2013-2014 Sophist-UK # Copyright (C) 2013-2014, 2017-2019 Laurent Monin # Copyright (C) 2015 Ohm Patel # Copyright (C) 2015 Wieland Hoffmann # Copyright (C) 2015, 2018-2020 Philipp Wolfer # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict from functools import partial from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import config from picard.album import Album from picard.browser.browser import BrowserIntegration from picard.browser.filelookup import FileLookup from picard.cluster import Cluster from picard.file import File from picard.metadata import MULTI_VALUED_JOINER from picard.track import Track from picard.util import ( format_time, restore_method, thread, throttle, ) from picard.util.preservedtags import PreservedTags from picard.util.tags import display_tag_name from picard.ui.colors import interface_colors from picard.ui.edittagdialog import ( EditTagDialog, TagEditorDelegate, ) class TagStatus: NOCHANGE = 1 ADDED = 2 REMOVED = 4 CHANGED = ADDED | REMOVED EMPTY = 8 NOTREMOVABLE = 16 class TagCounter(dict): __slots__ = ("parent", "counts", "different") def __init__(self, parent): self.parent = parent self.counts = defaultdict(lambda: 0) self.different = set() def __getitem__(self, tag): return super().get(tag, [""]) def add(self, tag, values): if tag not in self.different: if tag not in self: self[tag] = values elif self[tag] != values: self.different.add(tag) self[tag] = [""] self.counts[tag] += 1 def display_value(self, tag): count = self.counts[tag] missing = self.parent.objects - count if tag in self.different: return (ngettext("(different across %d item)", "(different across %d items)", count) % count, True) else: if tag == "~length": msg = format_time(self.get(tag, 0)) else: msg = MULTI_VALUED_JOINER.join(self[tag]) if count > 0 and missing > 0: return (msg + " " + (ngettext("(missing from %d item)", "(missing from %d items)", missing) % missing), True) else: return (msg, False) class TagDiff(object): __slots__ = ("tag_names", "new", "orig", "status", "objects", "max_length_delta_ms") def __init__(self, max_length_diff=2): self.tag_names = [] self.new = TagCounter(self) self.orig = TagCounter(self) self.status = defaultdict(lambda: 0) self.objects = 0 self.max_length_delta_ms = max_length_diff * 1000 def __tag_ne(self, tag, orig, new): if tag == "~length": return abs(float(orig) - float(new)) > self.max_length_delta_ms else: return orig != new def add(self, tag, orig_values, new_values, removable, removed=False): if orig_values: self.orig.add(tag, orig_values) if new_values: self.new.add(tag, new_values) if (orig_values and not new_values) or removed: self.status[tag] |= TagStatus.REMOVED elif new_values and not orig_values: self.status[tag] |= TagStatus.ADDED removable = True elif orig_values and new_values and self.__tag_ne(tag, orig_values, new_values): self.status[tag] |= TagStatus.CHANGED elif not (orig_values or new_values or tag in config.setting['metadatabox_top_tags']): self.status[tag] |= TagStatus.EMPTY else: self.status[tag] |= TagStatus.NOCHANGE if not removable: self.status[tag] |= TagStatus.NOTREMOVABLE def tag_status(self, tag): status = self.status[tag] for s in (TagStatus.CHANGED, TagStatus.ADDED, TagStatus.REMOVED, TagStatus.EMPTY): if status & s == s: return s return TagStatus.NOCHANGE class TableTagEditorDelegate(TagEditorDelegate): def createEditor(self, parent, option, index): editor = super().createEditor(parent, option, index) if editor and isinstance(editor, QtWidgets.QPlainTextEdit): table = self.parent() # Set the editor to the row height, but at least 80 pixel # to allow for proper multiline editing. height = max(80, table.rowHeight(index.row()) - 1) editor.setMinimumSize(QtCore.QSize(0, height)) # Resize the row so the editor fits in. Add 1 pixel, otherwise the # frame gets hidden. table.setRowHeight(index.row(), editor.frameSize().height() + 1) return editor def sizeHint(self, option, index): # Expand the row for multiline content, but limit the maximum row height. size_hint = super().sizeHint(option, index) return QtCore.QSize(size_hint.width(), min(160, size_hint.height())) def get_tag_name(self, index): return index.data(QtCore.Qt.UserRole) class MetadataBox(QtWidgets.QTableWidget): options = ( config.Option("persist", "metadatabox_header_state", QtCore.QByteArray()), config.BoolOption("persist", "show_changes_first", False) ) def __init__(self, parent): super().__init__(parent) self.parent = parent self.setAccessibleName(_("metadata view")) self.setAccessibleDescription(_("Displays original and new tags for the selected files")) self.setColumnCount(3) self.setHorizontalHeaderLabels((_("Tag"), _("Original Value"), _("New Value"))) self.horizontalHeader().setStretchLastSection(True) self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self.horizontalHeader().setSectionsClickable(False) self.verticalHeader().setDefaultSectionSize(21) self.verticalHeader().setVisible(False) self.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setTabKeyNavigation(False) self.setStyleSheet("QTableWidget {border: none;}") self.setAttribute(QtCore.Qt.WA_MacShowFocusRect, 1) self.setItemDelegate(TableTagEditorDelegate(self)) self.setWordWrap(False) self.files = set() self.tracks = set() self.objects = set() self.selection_mutex = QtCore.QMutex() self.selection_dirty = False self.editing = None # the QTableWidgetItem being edited self.clipboard = [""] self.add_tag_action = QtWidgets.QAction(_("Add New Tag..."), parent) self.add_tag_action.triggered.connect(partial(self.edit_tag, "")) self.changes_first_action = QtWidgets.QAction(_("Show Changes First"), parent) self.changes_first_action.setCheckable(True) self.changes_first_action.setChecked(config.persist["show_changes_first"]) self.changes_first_action.toggled.connect(self.toggle_changes_first) self.browser_integration = BrowserIntegration() # TR: Keyboard shortcut for "Add New Tag..." self.add_tag_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(_("Alt+Shift+A")), self, partial(self.edit_tag, "")) self.add_tag_action.setShortcut(self.add_tag_shortcut.key()) # TR: Keyboard shortcut for "Edit..." (tag) self.edit_tag_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(_("Alt+Shift+E")), self, partial(self.edit_selected_tag)) # TR: Keyboard shortcut for "Remove" (tag) self.remove_tag_shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(_("Alt+Shift+R")), self, self.remove_selected_tags) self.preserved_tags = PreservedTags() def get_file_lookup(self): """Return a FileLookup object.""" return FileLookup(self, config.setting["server_host"], config.setting["server_port"], self.browser_integration.port) def lookup_tags(self): lookup = self.get_file_lookup() LOOKUP_TAGS = { "musicbrainz_recordingid": lookup.recording_lookup, "musicbrainz_trackid": lookup.track_lookup, "musicbrainz_albumid": lookup.album_lookup, "musicbrainz_workid": lookup.work_lookup, "musicbrainz_artistid": lookup.artist_lookup, "musicbrainz_albumartistid": lookup.artist_lookup, "musicbrainz_releasegroupid": lookup.release_group_lookup, "acoustid_id": lookup.acoust_lookup } return LOOKUP_TAGS def open_link(self, values, tag): lookup = self.lookup_tags() lookup_func = lookup[tag] for v in values: lookup_func(v) def edit(self, index, trigger, event): if index.column() != 2: return False item = self.itemFromIndex(index) if item.flags() & QtCore.Qt.ItemIsEditable and \ trigger in (QtWidgets.QAbstractItemView.DoubleClicked, QtWidgets.QAbstractItemView.EditKeyPressed, QtWidgets.QAbstractItemView.AnyKeyPressed): tag = self.tag_diff.tag_names[item.row()] values = self.tag_diff.new[tag] if len(values) > 1: self.edit_tag(tag) return False else: self.editing = item item.setText(values[0]) return super().edit(index, trigger, event) return False def event(self, e): item = self.currentItem() if (item and e.type() == QtCore.QEvent.KeyPress and e.modifiers() == QtCore.Qt.ControlModifier): column = item.column() tag = self.tag_diff.tag_names[item.row()] if e.key() == QtCore.Qt.Key_C: if column == 1: self.clipboard = list(self.tag_diff.orig[tag]) elif column == 2: self.clipboard = list(self.tag_diff.new[tag]) elif e.key() == QtCore.Qt.Key_V and column == 2 and tag != "~length": self.set_tag_values(tag, list(self.clipboard)) return super().event(e) def closeEditor(self, editor, hint): super().closeEditor(editor, hint) tag = self.tag_diff.tag_names[self.editing.row()] old = self.tag_diff.new[tag] new = [self._get_editor_value(editor)] if old == new: self.editing.setText(old[0]) else: self.set_tag_values(tag, new) self.editing = None self.update() @staticmethod def _get_editor_value(editor): if hasattr(editor, 'text'): return editor.text() elif hasattr(editor, 'toPlainText'): return editor.toPlainText() return '' def contextMenuEvent(self, event): menu = QtWidgets.QMenu(self) if self.objects: tags = self.selected_tags(discard=('~length',)) if len(tags) == 1: selected_tag = tags[0] edit_tag_action = QtWidgets.QAction(_("Edit..."), self.parent) edit_tag_action.triggered.connect(partial(self.edit_tag, selected_tag)) edit_tag_action.setShortcut(self.edit_tag_shortcut.key()) menu.addAction(edit_tag_action) if selected_tag not in self.preserved_tags: add_to_preserved_tags_action = QtWidgets.QAction(_("Add to 'Preserve Tags' List"), self.parent) add_to_preserved_tags_action.triggered.connect(partial(self.preserved_tags.add, selected_tag)) menu.addAction(add_to_preserved_tags_action) else: remove_from_preserved_tags_action = QtWidgets.QAction(_("Remove from 'Preserve Tags' List"), self.parent) remove_from_preserved_tags_action.triggered.connect(partial(self.preserved_tags.discard, selected_tag)) menu.addAction(remove_from_preserved_tags_action) removals = [] useorigs = [] item = self.currentItem() if item: column = item.column() for tag in tags: if tag in self.lookup_tags().keys(): if (column == 1 or column == 2) and len(tags) == 1 and item.text(): if column == 1: values = self.tag_diff.orig[tag] else: values = self.tag_diff.new[tag] lookup_action = QtWidgets.QAction(_("Lookup in &Browser"), self.parent) lookup_action.triggered.connect(partial(self.open_link, values, tag)) menu.addAction(lookup_action) if self.tag_is_removable(tag): removals.append(partial(self.remove_tag, tag)) status = self.tag_diff.status[tag] & TagStatus.CHANGED if status == TagStatus.CHANGED or status == TagStatus.REMOVED: for file in self.files: objects = [file] if file.parent in self.tracks and len(self.files & set(file.parent.linked_files)) == 1: objects.append(file.parent) orig_values = list(file.orig_metadata.getall(tag)) or [""] useorigs.append(partial(self.set_tag_values, tag, orig_values, objects)) if removals: remove_tag_action = QtWidgets.QAction(_("Remove"), self.parent) remove_tag_action.triggered.connect(lambda: [f() for f in removals]) remove_tag_action.setShortcut(self.remove_tag_shortcut.key()) menu.addAction(remove_tag_action) if useorigs: name = ngettext("Use Original Value", "Use Original Values", len(useorigs)) use_orig_value_action = QtWidgets.QAction(name, self.parent) use_orig_value_action.triggered.connect(lambda: [f() for f in useorigs]) menu.addAction(use_orig_value_action) menu.addSeparator() if len(tags) == 1 or removals or useorigs: menu.addSeparator() menu.addAction(self.add_tag_action) menu.addSeparator() menu.addAction(self.changes_first_action) menu.exec_(event.globalPos()) event.accept() def edit_tag(self, tag): EditTagDialog(self.parent, tag).exec_() def edit_selected_tag(self): tags = self.selected_tags(discard=('~length',)) if len(tags) == 1: self.edit_tag(tags[0]) def toggle_changes_first(self, checked): config.persist["show_changes_first"] = checked self.update() def set_tag_values(self, tag, values, objects=None): if objects is None: objects = self.objects self.parent.ignore_selection_changes = True if values == [""]: values = [] if not values and self.tag_is_removable(tag): for obj in objects: del obj.metadata[tag] elif values: for obj in objects: obj.metadata[tag] = values obj.update() self.update() self.parent.ignore_selection_changes = False def remove_tag(self, tag): self.set_tag_values(tag, []) def remove_selected_tags(self): for tag in self.selected_tags(discard=('~length',)): if self.tag_is_removable(tag): self.remove_tag(tag) def tag_is_removable(self, tag): return self.tag_diff.status[tag] & TagStatus.NOTREMOVABLE == 0 def selected_tags(self, discard=None): if discard is None: discard = set() tags = set(self.tag_diff.tag_names[item.row()] for item in self.selectedItems()) return list(tags.difference(discard)) def _update_selection(self): files = set() tracks = set() objects = set() for obj in self.parent.selected_objects: if isinstance(obj, File): files.add(obj) elif isinstance(obj, Track): tracks.add(obj) files.update(obj.linked_files) elif isinstance(obj, Cluster) and obj.can_edit_tags(): objects.add(obj) files.update(obj.files) elif isinstance(obj, Album): objects.add(obj) tracks.update(obj.tracks) for track in obj.tracks: files.update(track.linked_files) objects.update(files) objects.update(tracks) self.selection_dirty = False self.selection_mutex.lock() self.files = files self.tracks = tracks self.objects = objects self.selection_mutex.unlock() @throttle(100) def update(self): if self.editing: return if self.selection_dirty: self._update_selection() thread.run_task(self._update_tags, self._update_items, thread_pool=self.tagger.priority_thread_pool) def _update_tags(self): self.selection_mutex.lock() files = self.files tracks = self.tracks self.selection_mutex.unlock() if not (files or tracks): return None self.colors = { TagStatus.NOCHANGE: self.palette().color(QtGui.QPalette.Text), TagStatus.REMOVED: QtGui.QBrush(interface_colors.get_qcolor('tagstatus_removed')), TagStatus.ADDED: QtGui.QBrush(interface_colors.get_qcolor('tagstatus_added')), TagStatus.CHANGED: QtGui.QBrush(interface_colors.get_qcolor('tagstatus_changed')) } tag_diff = TagDiff(max_length_diff=config.setting["ignore_track_duration_difference_under"]) orig_tags = tag_diff.orig new_tags = tag_diff.new # existing_tags are orig_tags that would not be overwritten by # any new_tags, assuming clear_existing_tags is disabled. existing_tags = set() tag_diff.objects = len(files) clear_existing_tags = config.setting["clear_existing_tags"] for file in files: new_metadata = file.new_metadata orig_metadata = file.orig_metadata tags = set(list(new_metadata.keys()) + list(orig_metadata.keys())) for name in filter(lambda x: not x.startswith("~") and file.supports_tag(x), tags): new_values = new_metadata.getall(name) orig_values = orig_metadata.getall(name) if not ((new_values and name not in existing_tags) or clear_existing_tags): new_values = list(orig_values or [""]) existing_tags.add(name) removed = name in new_metadata.deleted_tags tag_diff.add(name, orig_values, new_values, True, removed) tag_diff.add("~length", str(orig_metadata.length), str(new_metadata.length), False) for track in tracks: if track.num_linked_files == 0: for name, values in track.metadata.rawitems(): if not name.startswith("~"): tag_diff.add(name, values, values, True) length = str(track.metadata.length) tag_diff.add("~length", length, length, False) tag_diff.objects += 1 all_tags = set(list(orig_tags.keys()) + list(new_tags.keys())) common_tags = [tag for tag in config.setting['metadatabox_top_tags'] if tag in all_tags] tag_names = common_tags + sorted(all_tags.difference(common_tags), key=lambda x: display_tag_name(x).lower()) if config.persist["show_changes_first"]: tags_by_status = {} for tag in tag_names: tags_by_status.setdefault(tag_diff.tag_status(tag), []).append(tag) for status in (TagStatus.CHANGED, TagStatus.ADDED, TagStatus.REMOVED, TagStatus.NOCHANGE): tag_diff.tag_names += tags_by_status.pop(status, []) else: tag_diff.tag_names = [ tag for tag in tag_names if tag_diff.status[tag] != TagStatus.EMPTY] return tag_diff def _update_items(self, result=None, error=None): if self.editing: return if not (self.files or self.tracks): result = None self.tag_diff = result if result is None: self.setRowCount(0) return self.setRowCount(len(result.tag_names)) orig_flags = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled new_flags = orig_flags | QtCore.Qt.ItemIsEditable for i, name in enumerate(result.tag_names): tag_item = self.item(i, 0) orig_item = self.item(i, 1) new_item = self.item(i, 2) if not tag_item: tag_item = QtWidgets.QTableWidgetItem() tag_item.setFlags(orig_flags) font = tag_item.font() font.setBold(True) tag_item.setFont(font) self.setItem(i, 0, tag_item) if not orig_item: orig_item = QtWidgets.QTableWidgetItem() orig_item.setFlags(orig_flags) self.setItem(i, 1, orig_item) if not new_item: new_item = QtWidgets.QTableWidgetItem() self.setItem(i, 2, new_item) tag_item.setText(display_tag_name(name)) self.set_item_value(orig_item, self.tag_diff.orig, name) if name == "~length": new_item.setFlags(orig_flags) else: new_item.setFlags(new_flags) self.set_item_value(new_item, self.tag_diff.new, name) font = new_item.font() if result.tag_status(name) == TagStatus.REMOVED: font.setStrikeOut(True) else: font.setStrikeOut(False) new_item.setFont(font) color = self.colors.get(result.tag_status(name), self.colors[TagStatus.NOCHANGE]) orig_item.setForeground(color) new_item.setForeground(color) alignment = QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop tag_item.setTextAlignment(alignment) orig_item.setTextAlignment(alignment) new_item.setTextAlignment(alignment) # Adjust row height to content size self.setRowHeight(i, self.sizeHintForRow(i)) def set_item_value(self, item, tags, name): text, italic = tags.display_value(name) item.setData(QtCore.Qt.UserRole, name) item.setText(text) font = item.font() font.setItalic(italic) item.setFont(font) @restore_method def restore_state(self): state = config.persist["metadatabox_header_state"] header = self.horizontalHeader() header.restoreState(state) header.setSectionResizeMode(QtWidgets.QHeaderView.Interactive) def save_state(self): header = self.horizontalHeader() state = header.saveState() config.persist["metadatabox_header_state"] = state picard-release-2.3.1/picard/ui/moveable_list_view.py000066400000000000000000000043441362601763300225210ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import ( QtCore, QtWidgets, ) class MoveableListView: def __init__(self, list_widget, up_button, down_button, callback=None): self.list_widget = list_widget self.up_button = up_button self.down_button = down_button self.update_callback = callback self.up_button.clicked.connect(partial(self.move_item, 1)) self.down_button.clicked.connect(partial(self.move_item, -1)) self.list_widget.currentRowChanged.connect(self.update_buttons) self.list_widget.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) self.list_widget.setDefaultDropAction(QtCore.Qt.MoveAction) def move_item(self, offset): current_index = self.list_widget.currentRow() offset_index = current_index - offset offset_item = self.list_widget.item(offset_index) if offset_item: current_item = self.list_widget.takeItem(current_index) self.list_widget.insertItem(offset_index, current_item) self.list_widget.setCurrentItem(current_item) self.update_buttons() def update_buttons(self): current_row = self.list_widget.currentRow() self.up_button.setEnabled(current_row > 0) self.down_button.setEnabled(current_row < self.list_widget.count() - 1) if self.update_callback: self.update_callback() picard-release-2.3.1/picard/ui/options/000077500000000000000000000000001362601763300177565ustar00rootroot00000000000000picard-release-2.3.1/picard/ui/options/__init__.py000066400000000000000000000075221362601763300220750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2009 Nikolai Prokoschenko # Copyright (C) 2009, 2019-2020 Philipp Wolfer # Copyright (C) 2013, 2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from PyQt5 import QtWidgets from picard import config from picard.plugin import ExtensionPoint class OptionsCheckError(Exception): def __init__(self, title, info): self.title = title self.info = info class OptionsPage(QtWidgets.QWidget): PARENT = None SORT_ORDER = 1000 ACTIVE = True STYLESHEET_ERROR = "QWidget { background-color: #f55; color: white; font-weight:bold }" STYLESHEET = "QLabel { qproperty-wordWrap: true; }" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setStyleSheet(self.STYLESHEET) # Keep track whether the options page has been destroyed to avoid # trying to update deleted UI widgets after plugin list refresh. self.deleted = False # The on destroyed cannot be created as a method on this class or it will never get called. # See https://stackoverflow.com/questions/16842955/widgets-destroyed-signal-is-not-fired-pyqt def on_destroyed(obj=None): self.deleted = True self.destroyed.connect(on_destroyed) def check(self): pass def load(self): pass def save(self): pass def restore_defaults(self): try: options = self.options except AttributeError: return old_options = {} for option in options: if option.section == 'setting': old_options[option.name] = config.setting[option.name] config.setting[option.name] = option.default self.load() # Restore the config values incase the user doesn't save after restoring defaults for key in old_options: config.setting[key] = old_options[key] def display_error(self, error): dialog = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, error.title, error.info, QtWidgets.QMessageBox.Ok, self) dialog.exec_() def init_regex_checker(self, regex_edit, regex_error): """ regex_edit : a widget supporting text() and textChanged() methods, ie QLineEdit regex_error : a widget supporting setStyleSheet() and setText() methods, ie. QLabel """ def check(): try: re.compile(regex_edit.text()) except re.error as e: raise OptionsCheckError(_("Regex Error"), str(e)) def live_checker(text): regex_error.setStyleSheet("") regex_error.setText("") try: check() except OptionsCheckError as e: regex_error.setStyleSheet(self.STYLESHEET_ERROR) regex_error.setText(e.info) regex_edit.textChanged.connect(live_checker) _pages = ExtensionPoint(label='pages') def register_options_page(page_class): _pages.register(page_class.__module__, page_class) picard-release-2.3.1/picard/ui/options/about.py000066400000000000000000000111041362601763300214370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2014 Lukáš Lalinský # Copyright (C) 2008, 2013, 2018-2019 Philipp Wolfer # Copyright (C) 2011 Pavan Chander # Copyright (C) 2011, 2013 Wieland Hoffmann # Copyright (C) 2013 Michael Wiencek # Copyright (C) 2013-2015, 2018 Laurent Monin # Copyright (C) 2014 Ismael Olea # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.const import PICARD_URLS from picard.formats import supported_extensions from picard.util import versions from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_about import Ui_AboutOptionsPage class AboutOptionsPage(OptionsPage): NAME = "about" TITLE = N_("About") PARENT = None SORT_ORDER = 100 ACTIVE = True def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_AboutOptionsPage() self.ui.setupUi(self) def load(self): args = { "picard_doc_url": PICARD_URLS['home'], "picard_donate_url": PICARD_URLS['donate'], } args.update(versions.as_dict(i18n=True)) args["formats"] = ", ".join(map(lambda x: x[1:], supported_extensions())) # TR: Replace this with your name to have it appear in the "About" dialog. args["translator_credits"] = _("translator-credits") if args["translator_credits"] != "translator-credits": # TR: Replace LANG with language you are translating to. args["translator_credits"] = _("
Translated to LANG by %s") % args["translator_credits"].replace("\n", "
") else: args["translator_credits"] = "" args['third_parties_versions'] = '
'.join(["%s %s" % (versions.version_name(name), value) for name, value in versions.as_dict(i18n=True).items() if name != 'version']) args['authors_credits'] = ", ".join([ 'Robert Kaye', 'Lukáš Lalinský', 'Laurent Monin', 'Sambhav Kothari', 'Philipp Wolfer', ]) args['copyright_years'] = '2004-2019' args['icons_credits'] = _("""Icons made by Sambhav Kothari and Madebyoliver, Pixel Buddha, Nikita Golubev, Maxim Basinski, Smashicons from www.flaticon.com""") text = _("""

MusicBrainz Picard
Version %(version)s

%(third_parties_versions)s

Supported formats
%(formats)s

Please donate
Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

Donate now!

Credits
Copyright © %(copyright_years)s %(authors_credits)s and others%(translator_credits)s

%(icons_credits)s

Official website
%(picard_doc_url)s

""") % args self.ui.label.setOpenExternalLinks(True) self.ui.label.setText(text) register_options_page(AboutOptionsPage) picard-release-2.3.1/picard/ui/options/advanced.py000066400000000000000000000101661362601763300221010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2013-2015, 2018 Laurent Monin # Copyright (C) 2014, 2019 Philipp Wolfer # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_advanced import Ui_AdvancedOptionsPage class AdvancedOptionsPage(OptionsPage): NAME = "advanced" TITLE = N_("Advanced") PARENT = None SORT_ORDER = 90 ACTIVE = True options = [ config.TextOption("setting", "ignore_regex", ""), config.BoolOption("setting", "ignore_hidden_files", False), config.BoolOption("setting", "recursively_add_files", True), config.IntOption("setting", "ignore_track_duration_difference_under", 2), config.BoolOption("setting", "completeness_ignore_videos", False), config.BoolOption("setting", "completeness_ignore_pregap", False), config.BoolOption("setting", "completeness_ignore_data", False), config.BoolOption("setting", "completeness_ignore_silence", False), config.ListOption("setting", "compare_ignore_tags", []), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_AdvancedOptionsPage() self.ui.setupUi(self) self.init_regex_checker(self.ui.ignore_regex, self.ui.regex_error) def load(self): self.ui.ignore_regex.setText(config.setting["ignore_regex"]) self.ui.ignore_hidden_files.setChecked(config.setting["ignore_hidden_files"]) self.ui.recursively_add_files.setChecked(config.setting["recursively_add_files"]) self.ui.ignore_track_duration_difference_under.setValue(config.setting["ignore_track_duration_difference_under"]) self.ui.completeness_ignore_videos.setChecked(config.setting["completeness_ignore_videos"]) self.ui.completeness_ignore_pregap.setChecked(config.setting["completeness_ignore_pregap"]) self.ui.completeness_ignore_data.setChecked(config.setting["completeness_ignore_data"]) self.ui.completeness_ignore_silence.setChecked(config.setting["completeness_ignore_silence"]) self.ui.compare_ignore_tags.update(config.setting["compare_ignore_tags"]) self.ui.compare_ignore_tags.set_user_sortable(False) def save(self): config.setting["ignore_regex"] = self.ui.ignore_regex.text() config.setting["ignore_hidden_files"] = self.ui.ignore_hidden_files.isChecked() config.setting["recursively_add_files"] = self.ui.recursively_add_files.isChecked() config.setting["ignore_track_duration_difference_under"] = self.ui.ignore_track_duration_difference_under.value() config.setting["completeness_ignore_videos"] = self.ui.completeness_ignore_videos.isChecked() config.setting["completeness_ignore_pregap"] = self.ui.completeness_ignore_pregap.isChecked() config.setting["completeness_ignore_data"] = self.ui.completeness_ignore_data.isChecked() config.setting["completeness_ignore_silence"] = self.ui.completeness_ignore_silence.isChecked() tags = list(self.ui.compare_ignore_tags.tags) if tags != config.setting["compare_ignore_tags"]: config.setting["compare_ignore_tags"] = tags def restore_defaults(self): self.ui.compare_ignore_tags.clear() super().restore_defaults() register_options_page(AdvancedOptionsPage) picard-release-2.3.1/picard/ui/options/cdlookup.py000066400000000000000000000052231362601763300221520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2008, 2019 Philipp Wolfer # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.util.cdrom import ( AUTO_DETECT_DRIVES, DEFAULT_DRIVES, get_cdrom_drives, ) from picard.ui.options import ( OptionsPage, register_options_page, ) if AUTO_DETECT_DRIVES: from picard.ui.ui_options_cdlookup_select import Ui_CDLookupOptionsPage else: from picard.ui.ui_options_cdlookup import Ui_CDLookupOptionsPage class CDLookupOptionsPage(OptionsPage): NAME = "cdlookup" TITLE = N_("CD Lookup") PARENT = None SORT_ORDER = 50 ACTIVE = True options = [ config.TextOption("setting", "cd_lookup_device", ",".join(DEFAULT_DRIVES)), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_CDLookupOptionsPage() self.ui.setupUi(self) if AUTO_DETECT_DRIVES: self._device_list = get_cdrom_drives() self.ui.cd_lookup_device.addItems(self._device_list) def load(self): device = config.setting["cd_lookup_device"] if AUTO_DETECT_DRIVES: try: self.ui.cd_lookup_device.setCurrentIndex(self._device_list.index(device)) except ValueError: pass else: self.ui.cd_lookup_device.setText(device) def save(self): if AUTO_DETECT_DRIVES: device = self.ui.cd_lookup_device.currentText() device_list = self._device_list else: device = self.ui.cd_lookup_device.text() device_list = [device] config.setting["cd_lookup_device"] = device self.tagger.window.update_cd_lookup_drives(device_list) register_options_page(CDLookupOptionsPage) picard-release-2.3.1/picard/ui/options/cover.py000066400000000000000000000122421362601763300214470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2010, 2018-2019 Philipp Wolfer # Copyright (C) 2012, 2014 Wieland Hoffmann # Copyright (C) 2012-2014 Michael Wiencek # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Suhas # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.coverart.providers import cover_art_providers from picard.ui.checkbox_list_item import CheckboxListItem from picard.ui.moveable_list_view import MoveableListView from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_cover import Ui_CoverOptionsPage class CoverOptionsPage(OptionsPage): NAME = "cover" TITLE = N_("Cover Art") PARENT = None SORT_ORDER = 35 ACTIVE = True options = [ config.BoolOption("setting", "save_images_to_tags", True), config.BoolOption("setting", "embed_only_one_front_image", True), config.BoolOption("setting", "save_images_to_files", False), config.TextOption("setting", "cover_image_filename", "cover"), config.BoolOption("setting", "save_images_overwrite", False), config.ListOption("setting", "ca_providers", [ ('Cover Art Archive', True), ('Amazon', True), ('Whitelist', True), ('CaaReleaseGroup', False), ('Local', False), ]), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_CoverOptionsPage() self.ui.setupUi(self) self.ui.save_images_to_files.clicked.connect(self.update_filename) self.ui.save_images_to_tags.clicked.connect(self.update_save_images_to_tags) self.move_view = MoveableListView(self.ui.ca_providers_list, self.ui.up_button, self.ui.down_button) def load_cover_art_providers(self): """Load available providers, initialize provider-specific options, restore state of each """ for p in cover_art_providers(): self.ui.ca_providers_list.addItem(CheckboxListItem(_(p.title), checked=p.enabled, data=p.name)) def restore_defaults(self): # Remove previous entries self.ui.ca_providers_list.clear() super().restore_defaults() def ca_providers(self): items = [] for i in range(self.ui.ca_providers_list.count()): item = self.ui.ca_providers_list.item(i) items.append((item.data, item.checked)) return items def load(self): self.ui.save_images_to_tags.setChecked(config.setting["save_images_to_tags"]) self.ui.cb_embed_front_only.setChecked(config.setting["embed_only_one_front_image"]) self.ui.save_images_to_files.setChecked(config.setting["save_images_to_files"]) self.ui.cover_image_filename.setText(config.setting["cover_image_filename"]) self.ui.save_images_overwrite.setChecked(config.setting["save_images_overwrite"]) self.load_cover_art_providers() self.ui.ca_providers_list.setCurrentRow(0) self.update_all() def save(self): config.setting["save_images_to_tags"] = self.ui.save_images_to_tags.isChecked() config.setting["embed_only_one_front_image"] = self.ui.cb_embed_front_only.isChecked() config.setting["save_images_to_files"] = self.ui.save_images_to_files.isChecked() config.setting["cover_image_filename"] = self.ui.cover_image_filename.text() config.setting["save_images_overwrite"] = self.ui.save_images_overwrite.isChecked() config.setting["ca_providers"] = self.ca_providers() def update_all(self): self.update_filename() self.update_save_images_to_tags() def update_ca_providers_groupbox_state(self): files_enabled = self.ui.save_images_to_files.isChecked() tags_enabled = self.ui.save_images_to_tags.isChecked() self.ui.ca_providers_groupbox.setEnabled(files_enabled or tags_enabled) def update_filename(self): enabled = self.ui.save_images_to_files.isChecked() self.ui.cover_image_filename.setEnabled(enabled) self.ui.save_images_overwrite.setEnabled(enabled) self.update_ca_providers_groupbox_state() def update_save_images_to_tags(self): enabled = self.ui.save_images_to_tags.isChecked() self.ui.cb_embed_front_only.setEnabled(enabled) self.update_ca_providers_groupbox_state() register_options_page(CoverOptionsPage) picard-release-2.3.1/picard/ui/options/dialog.py000066400000000000000000000206471362601763300216000ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2008-2009 Nikolai Prokoschenko # Copyright (C) 2008-2009, 2018-2019 Philipp Wolfer # Copyright (C) 2011 Pavan Chander # Copyright (C) 2011-2012, 2019 Wieland Hoffmann # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013, 2017-2019 Laurent Monin # Copyright (C) 2014 Sophist-UK # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Suhas # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtWidgets, ) from picard import ( config, log, ) from picard.const import PICARD_URLS from picard.util import ( restore_method, webbrowser2, ) from picard.ui import ( HashableTreeWidgetItem, PicardDialog, SingletonDialog, ) from picard.ui.options import ( # noqa: F401 # pylint: disable=unused-import OptionsCheckError, _pages as page_classes, about, advanced, cdlookup, cover, fingerprinting, general, genres, interface, interface_colors, interface_top_tags, matching, metadata, network, plugins, ratings, releases, renaming, scripting, tags, tags_compatibility, ) from picard.ui.util import StandardButton class OptionsDialog(PicardDialog, SingletonDialog): autorestore = False options = [ config.Option("persist", "options_splitter", QtCore.QByteArray()), ] def add_pages(self, parent, default_page, parent_item): pages = [(p.SORT_ORDER, p.NAME, p) for p in self.pages if p.PARENT == parent] items = [] for foo, bar, page in sorted(pages): item = HashableTreeWidgetItem(parent_item) item.setText(0, _(page.TITLE)) if page.ACTIVE: self.item_to_page[item] = page self.page_to_item[page.NAME] = item self.ui.pages_stack.addWidget(page) else: item.setFlags(QtCore.Qt.ItemIsEnabled) self.add_pages(page.NAME, default_page, item) if page.NAME == default_page: self.default_item = item items.append(item) if not self.default_item and not parent: self.default_item = items[0] def __init__(self, default_page=None, parent=None): super().__init__(parent) self.setWindowModality(QtCore.Qt.ApplicationModal) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) from picard.ui.ui_options import Ui_Dialog self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.reset_all_button = QtWidgets.QPushButton(_("&Restore all Defaults")) self.ui.reset_all_button.setToolTip(_("Reset all of Picard's settings")) self.ui.reset_button = QtWidgets.QPushButton(_("Restore &Defaults")) self.ui.reset_button.setToolTip(_("Reset all settings for current option page")) ok = StandardButton(StandardButton.OK) ok.setText(_("Make It So!")) self.ui.buttonbox.addButton(ok, QtWidgets.QDialogButtonBox.AcceptRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtWidgets.QDialogButtonBox.RejectRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.HELP), QtWidgets.QDialogButtonBox.HelpRole) self.ui.buttonbox.addButton(self.ui.reset_all_button, QtWidgets.QDialogButtonBox.ActionRole) self.ui.buttonbox.addButton(self.ui.reset_button, QtWidgets.QDialogButtonBox.ActionRole) self.ui.buttonbox.accepted.connect(self.accept) self.ui.buttonbox.rejected.connect(self.reject) self.ui.reset_all_button.clicked.connect(self.confirm_reset_all) self.ui.reset_button.clicked.connect(self.confirm_reset) self.ui.buttonbox.helpRequested.connect(self.help) self.pages = [] for Page in page_classes: try: page = Page(self.ui.pages_stack) self.pages.append(page) except Exception: log.exception('Failed initializing options page %r', page) self.item_to_page = {} self.page_to_item = {} self.default_item = None self.add_pages(None, default_page, self.ui.pages_tree) # work-around to set optimal option pane width self.ui.pages_tree.expandAll() max_page_name = self.ui.pages_tree.sizeHintForColumn(0) + 2*self.ui.pages_tree.frameWidth() self.ui.pages_tree.collapseAll() self.ui.splitter.setSizes([max_page_name, self.geometry().width() - max_page_name]) self.ui.pages_tree.setHeaderLabels([""]) self.ui.pages_tree.header().hide() self.ui.pages_tree.itemSelectionChanged.connect(self.switch_page) self.restoreWindowState() self.finished.connect(self.saveWindowState) for page in self.pages: try: page.load() except Exception: log.exception('Failed loading options page %r', page) self.disable_page(page.NAME) self.ui.pages_tree.setCurrentItem(self.default_item) def switch_page(self): items = self.ui.pages_tree.selectedItems() if items: page = self.item_to_page[items[0]] self.ui.pages_stack.setCurrentWidget(page) def disable_page(self, name): item = self.page_to_item[name] item.setDisabled(True) def help(self): current_page = self.ui.pages_stack.currentWidget() url = "{}#{}".format(PICARD_URLS['doc_options'], current_page.NAME) webbrowser2.open(url) def accept(self): for page in self.pages: try: page.check() except OptionsCheckError as e: self._show_page_error(page, e) return except Exception as e: log.exception('Failed checking options page %r', page) self._show_page_error(page, e) return for page in self.pages: try: page.save() except Exception as e: log.exception('Failed saving options page %r', page) self._show_page_error(page, e) return super().accept() def _show_page_error(self, page, error): if not isinstance(error, OptionsCheckError): error = OptionsCheckError(_('Unexpected error'), str(error)) self.ui.pages_tree.setCurrentItem(self.page_to_item[page.NAME]) page.display_error(error) def saveWindowState(self): config.persist["options_splitter"] = self.ui.splitter.saveState() @restore_method def restoreWindowState(self): self.restore_geometry() self.ui.splitter.restoreState(config.persist["options_splitter"]) def restore_all_defaults(self): for page in self.pages: page.restore_defaults() def restore_page_defaults(self): self.ui.pages_stack.currentWidget().restore_defaults() def confirm_reset(self): msg = _("You are about to reset your options for this page.") self._show_dialog(msg, self.restore_page_defaults) def confirm_reset_all(self): msg = _("Warning! This will reset all of your settings.") self._show_dialog(msg, self.restore_all_defaults) def _show_dialog(self, msg, function): message_box = QtWidgets.QMessageBox(self) message_box.setIcon(QtWidgets.QMessageBox.Warning) message_box.setWindowModality(QtCore.Qt.WindowModal) message_box.setWindowTitle(_("Confirm Reset")) message_box.setText(_("Are you sure?") + "\n\n" + msg) message_box.setStandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) if message_box.exec_() == QtWidgets.QMessageBox.Yes: function() picard-release-2.3.1/picard/ui/options/fingerprinting.py000066400000000000000000000140521362601763300233570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2011-2012 Lukáš Lalinský # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2015 Philipp Wolfer # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os from PyQt5 import ( QtCore, QtWidgets, ) from picard import config from picard.const import FPCALC_NAMES from picard.util import ( find_executable, webbrowser2, ) from picard.ui.options import ( OptionsCheckError, OptionsPage, register_options_page, ) from picard.ui.ui_options_fingerprinting import Ui_FingerprintingOptionsPage class FingerprintingOptionsPage(OptionsPage): NAME = "fingerprinting" TITLE = N_("Fingerprinting") PARENT = None SORT_ORDER = 45 ACTIVE = True options = [ config.BoolOption("setting", "ignore_existing_acoustid_fingerprints", False), config.TextOption("setting", "fingerprinting_system", "acoustid"), config.TextOption("setting", "acoustid_fpcalc", ""), config.TextOption("setting", "acoustid_apikey", ""), ] def __init__(self, parent=None): super().__init__(parent) self._fpcalc_valid = True self.ui = Ui_FingerprintingOptionsPage() self.ui.setupUi(self) self.ui.disable_fingerprinting.clicked.connect(self.update_groupboxes) self.ui.use_acoustid.clicked.connect(self.update_groupboxes) self.ui.acoustid_fpcalc.textChanged.connect(self._acoustid_fpcalc_check) self.ui.acoustid_fpcalc_browse.clicked.connect(self.acoustid_fpcalc_browse) self.ui.acoustid_fpcalc_download.clicked.connect(self.acoustid_fpcalc_download) self.ui.acoustid_apikey_get.clicked.connect(self.acoustid_apikey_get) def load(self): if config.setting["fingerprinting_system"] == "acoustid": self.ui.use_acoustid.setChecked(True) else: self.ui.disable_fingerprinting.setChecked(True) self.ui.acoustid_fpcalc.setText(config.setting["acoustid_fpcalc"]) self.ui.acoustid_apikey.setText(config.setting["acoustid_apikey"]) self.ui.ignore_existing_acoustid_fingerprints.setChecked(config.setting["ignore_existing_acoustid_fingerprints"]) self.update_groupboxes() def save(self): if self.ui.use_acoustid.isChecked(): config.setting["fingerprinting_system"] = "acoustid" else: config.setting["fingerprinting_system"] = "" config.setting["acoustid_fpcalc"] = self.ui.acoustid_fpcalc.text() config.setting["acoustid_apikey"] = self.ui.acoustid_apikey.text() config.setting["ignore_existing_acoustid_fingerprints"] = self.ui.ignore_existing_acoustid_fingerprints.isChecked() def update_groupboxes(self): if self.ui.use_acoustid.isChecked(): self.ui.acoustid_settings.setEnabled(True) if not self.ui.acoustid_fpcalc.text(): fpcalc_path = find_executable(*FPCALC_NAMES) if fpcalc_path: self.ui.acoustid_fpcalc.setText(fpcalc_path) else: self.ui.acoustid_settings.setEnabled(False) self._acoustid_fpcalc_check() def acoustid_fpcalc_browse(self): path, _filter = QtWidgets.QFileDialog.getOpenFileName(self, "", self.ui.acoustid_fpcalc.text()) if path: path = os.path.normpath(path) self.ui.acoustid_fpcalc.setText(path) def acoustid_fpcalc_download(self): webbrowser2.goto('chromaprint') def acoustid_apikey_get(self): webbrowser2.goto('acoustid_apikey') def _acoustid_fpcalc_check(self): if not self.ui.use_acoustid.isChecked(): self._acoustid_fpcalc_set_success("") return fpcalc = self.ui.acoustid_fpcalc.text() if not fpcalc: self._acoustid_fpcalc_set_success("") return self._fpcalc_valid = False process = QtCore.QProcess(self) process.finished.connect(self._on_acoustid_fpcalc_check_finished) process.error.connect(self._on_acoustid_fpcalc_check_error) process.start(fpcalc, ["-v"]) def _on_acoustid_fpcalc_check_finished(self, exit_code, exit_status): process = self.sender() if exit_code == 0 and exit_status == 0: output = bytes(process.readAllStandardOutput()).decode() if output.startswith("fpcalc version"): self._acoustid_fpcalc_set_success(output.strip()) else: self._acoustid_fpcalc_set_error() else: self._acoustid_fpcalc_set_error() def _on_acoustid_fpcalc_check_error(self, error): self._acoustid_fpcalc_set_error() def _acoustid_fpcalc_set_success(self, version): self._fpcalc_valid = True self.ui.acoustid_fpcalc_info.setStyleSheet("") self.ui.acoustid_fpcalc_info.setText(version) def _acoustid_fpcalc_set_error(self): self._fpcalc_valid = False self.ui.acoustid_fpcalc_info.setStyleSheet(self.STYLESHEET_ERROR) self.ui.acoustid_fpcalc_info.setText(_("Please select a valid fpcalc executable.")) def check(self): if not self._fpcalc_valid: raise OptionsCheckError(_("Invalid fpcalc executable"), _("Please select a valid fpcalc executable.")) def display_error(self, error): pass register_options_page(FingerprintingOptionsPage) picard-release-2.3.1/picard/ui/options/general.py000066400000000000000000000130041362601763300217430ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2014 Lukáš Lalinský # Copyright (C) 2008, 2018-2019 Philipp Wolfer # Copyright (C) 2011, 2013 Michael Wiencek # Copyright (C) 2011, 2019 Wieland Hoffmann # Copyright (C) 2013-2014 Sophist-UK # Copyright (C) 2013-2014, 2018 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 virusMac # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import QtCore from picard import config from picard.const import ( MUSICBRAINZ_SERVERS, PROGRAM_UPDATE_LEVELS, ) from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_general import Ui_GeneralOptionsPage class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 443), config.TextOption("persist", "oauth_refresh_token", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), config.TextOption("persist", "oauth_refresh_token", ""), config.TextOption("persist", "oauth_refresh_token_scopes", ""), config.TextOption("persist", "oauth_access_token", ""), config.IntOption("persist", "oauth_access_token_expires", 0), config.TextOption("persist", "oauth_username", ""), config.BoolOption("setting", "check_for_updates", True), config.IntOption("setting", "update_check_days", 7), config.IntOption("setting", "update_level", 0), config.IntOption("persist", "last_update_check", 0), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.update_login_logout() def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.analyze_new_files.setChecked(config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked(config.setting["ignore_file_mbids"]) if self.tagger.autoupdate_enabled: self.ui.check_for_updates.setChecked(config.setting["check_for_updates"]) self.ui.update_level.clear() for level, description in PROGRAM_UPDATE_LEVELS.items(): # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround = description['title'] self.ui.update_level.addItem(_(babel_415_workaround), level) self.ui.update_level.setCurrentIndex(self.ui.update_level.findData(config.setting["update_level"])) self.ui.update_check_days.setValue(config.setting["update_check_days"]) else: self.ui.update_check_groupbox.hide() def save(self): config.setting["server_host"] = self.ui.server_host.currentText().strip() config.setting["server_port"] = self.ui.server_port.value() config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() if self.tagger.autoupdate_enabled: config.setting["check_for_updates"] = self.ui.check_for_updates.isChecked() config.setting["update_level"] = self.ui.update_level.currentData(QtCore.Qt.UserRole) config.setting["update_check_days"] = self.ui.update_check_days.value() def update_login_logout(self): if self.tagger.webservice.oauth_manager.is_logged_in(): self.ui.logged_in.setText(_("Logged in as %s.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login.hide() self.ui.logout.show() else: self.ui.logged_in.hide() self.ui.login.show() self.ui.logout.hide() # Workaround for Qt not repainting the view on macOS after the changes. # See https://tickets.metabrainz.org/browse/PICARD-1654 self.ui.vboxlayout.parentWidget().repaint() def login(self): self.tagger.mb_login(self.on_login_finished, self) def restore_defaults(self): super().restore_defaults() self.logout() def on_login_finished(self, successful): self.update_login_logout() def logout(self): self.tagger.mb_logout() self.update_login_logout() register_options_page(GeneralOptionsPage) picard-release-2.3.1/picard/ui/options/genres.py000066400000000000000000000143361362601763300216220ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2008 Lukáš Lalinský # Copyright (C) 2018 Philipp Wolfer # Copyright (C) 2019 Laurent Monin # Copyright (C) 2019 Wieland Hoffmann # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5.QtCore import Qt from PyQt5.QtGui import ( QTextBlockFormat, QTextCursor, ) from picard import config from picard.track import TagGenreFilter from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_genres import Ui_GenresOptionsPage TOOLTIP_GENRES_FILTER = N_("""

Lines not starting with - or + are ignored.

One expression per line, case-insensitive

Examples:

#comment
!comment
comment

Strict filtering:

-word: exclude word
+word: include word

Wildcard filtering:

-*word: exclude all genres ending with word
+word*: include all genres starting with word
-w*rd: exclude all genres starting with w and ending with rd

Regular expressions filtering (Python re syntax):

-/^w.rd+/: exclude genres starting with w followed by any character, then r followed by at least one d

""") TOOLTIP_TEST_GENRES_FILTER = N_("""

You can add genres to test filters against, one per line.
This playground will not be preserved on Options exit.

Red background means the tag will be skipped.
Green background means the tag will be kept.

""") class GenresOptionsPage(OptionsPage): NAME = "genres" TITLE = N_("Genres") PARENT = "metadata" SORT_ORDER = 20 ACTIVE = True options = [ config.BoolOption("setting", "use_genres", False), config.IntOption("setting", "max_genres", 5), config.IntOption("setting", "min_genre_usage", 90), config.TextOption("setting", "genres_filter", "-seen live\n-favorites\n-fixme\n-owned"), config.TextOption("setting", "join_genres", ""), config.BoolOption("setting", "only_my_genres", False), config.BoolOption("setting", "artists_genres", False), config.BoolOption("setting", "folksonomy_tags", False), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_GenresOptionsPage() self.ui.setupUi(self) self.ui.genres_filter.setToolTip(_(TOOLTIP_GENRES_FILTER)) self.ui.genres_filter.textChanged.connect(self.update_test_genres_filter) self.ui.test_genres_filter.setToolTip(_(TOOLTIP_TEST_GENRES_FILTER)) self.ui.test_genres_filter.textChanged.connect(self.update_test_genres_filter) #FIXME: colors aren't great from accessibility POV self.fmt_keep = QTextBlockFormat() self.fmt_keep.setBackground(Qt.green) self.fmt_skip = QTextBlockFormat() self.fmt_skip.setBackground(Qt.red) self.fmt_clear = QTextBlockFormat() self.fmt_clear.clearBackground() def load(self): self.ui.use_genres.setChecked(config.setting["use_genres"]) self.ui.max_genres.setValue(config.setting["max_genres"]) self.ui.min_genre_usage.setValue(config.setting["min_genre_usage"]) self.ui.join_genres.setEditText(config.setting["join_genres"]) self.ui.genres_filter.setPlainText(config.setting["genres_filter"]) self.ui.only_my_genres.setChecked(config.setting["only_my_genres"]) self.ui.artists_genres.setChecked(config.setting["artists_genres"]) self.ui.folksonomy_tags.setChecked(config.setting["folksonomy_tags"]) def save(self): config.setting["use_genres"] = self.ui.use_genres.isChecked() config.setting["max_genres"] = self.ui.max_genres.value() config.setting["min_genre_usage"] = self.ui.min_genre_usage.value() config.setting["join_genres"] = self.ui.join_genres.currentText() config.setting["genres_filter"] = self.ui.genres_filter.toPlainText() config.setting["only_my_genres"] = self.ui.only_my_genres.isChecked() config.setting["artists_genres"] = self.ui.artists_genres.isChecked() config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked() def update_test_genres_filter(self): test_text = self.ui.test_genres_filter.toPlainText() filters = self.ui.genres_filter.toPlainText() tagfilter = TagGenreFilter(filters) #FIXME: very simple error reporting, improve self.ui.label_test_genres_filter_error.setText( "\n".join( [_("Error line %d: %s") % (lineno + 1, error) for lineno, error in tagfilter.errors.items()] ) ) def set_line_fmt(lineno, textformat): obj = self.ui.test_genres_filter if lineno < 0: #use current cursor position cursor = obj.textCursor() else: cursor = QTextCursor(obj.document().findBlockByNumber(lineno)) obj.blockSignals(True) cursor.setBlockFormat(textformat) obj.blockSignals(False) set_line_fmt(-1, self.fmt_clear) for lineno, line in enumerate(test_text.splitlines()): line = line.strip() fmt = self.fmt_clear if line: if tagfilter.skip(line): fmt = self.fmt_skip else: fmt = self.fmt_keep set_line_fmt(lineno, fmt) register_options_page(GenresOptionsPage) picard-release-2.3.1/picard/ui/options/interface.py000066400000000000000000000321721362601763300222750ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007-2008 Lukáš Lalinský # Copyright (C) 2008 Will # Copyright (C) 2009, 2019-2020 Philipp Wolfer # Copyright (C) 2011, 2013 Michael Wiencek # Copyright (C) 2013, 2019 Wieland Hoffmann # Copyright (C) 2013-2014, 2018 Laurent Monin # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2018 Bob Swift # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import locale import os.path from PyQt5 import ( QtCore, QtWidgets, ) from PyQt5.QtCore import QStandardPaths from picard import config from picard.const import UI_LANGUAGES from picard.util import icontheme from picard.ui import PicardDialog from picard.ui.moveable_list_view import MoveableListView from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_interface import Ui_InterfaceOptionsPage from picard.ui.util import enabledSlot _default_starting_dir = QStandardPaths.writableLocation(QStandardPaths.HomeLocation) class InterfaceOptionsPage(OptionsPage): NAME = "interface" TITLE = N_("User Interface") PARENT = None SORT_ORDER = 80 ACTIVE = True SEPARATOR = '—' * 5 TOOLBAR_BUTTONS = { 'add_directory_action': { 'label': N_('Add Folder'), 'icon': 'folder' }, 'add_files_action': { 'label': N_('Add Files'), 'icon': 'document-open' }, 'cluster_action': { 'label': N_('Cluster'), 'icon': 'picard-cluster' }, 'autotag_action': { 'label': N_('Lookup'), 'icon': 'picard-auto-tag' }, 'analyze_action': { 'label': N_('Scan'), 'icon': 'picard-analyze' }, 'browser_lookup_action': { 'label': N_('Lookup in Browser'), 'icon': 'lookup-musicbrainz' }, 'save_action': { 'label': N_('Save'), 'icon': 'document-save' }, 'view_info_action': { 'label': N_('Info'), 'icon': 'picard-edit-tags' }, 'remove_action': { 'label': N_('Remove'), 'icon': 'list-remove' }, 'submit_acoustid_action': { 'label': N_('Submit AcoustIDs'), 'icon': 'acoustid-fingerprinter' }, 'generate_fingerprints_action': { 'label': N_("Generate Fingerprints"), 'icon': 'fingerprint' }, 'play_file_action': { 'label': N_('Open in Player'), 'icon': 'play-music' }, 'cd_lookup_action': { 'label': N_('Lookup CD...'), 'icon': 'media-optical' }, } ACTION_NAMES = set(TOOLBAR_BUTTONS.keys()) options = [ config.BoolOption("setting", "toolbar_show_labels", True), config.BoolOption("setting", "toolbar_multiselect", False), config.BoolOption("setting", "builtin_search", False), config.BoolOption("setting", "use_adv_search_syntax", False), config.BoolOption("setting", "quit_confirmation", True), config.TextOption("setting", "ui_language", ""), config.BoolOption("setting", "starting_directory", False), config.TextOption("setting", "starting_directory_path", _default_starting_dir), config.TextOption("setting", "load_image_behavior", "append"), config.ListOption("setting", "toolbar_layout", [ 'add_directory_action', 'add_files_action', 'separator', 'cluster_action', 'separator', 'autotag_action', 'analyze_action', 'browser_lookup_action', 'separator', 'save_action', 'view_info_action', 'remove_action', 'separator', 'cd_lookup_action', 'separator', 'submit_acoustid_action', ]), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceOptionsPage() self.ui.setupUi(self) self.ui.ui_language.addItem(_('System default'), '') language_list = [(l[0], l[1], _(l[2])) for l in UI_LANGUAGES] def fcmp(x): return locale.strxfrm(x[2]) for lang_code, native, translation in sorted(language_list, key=fcmp): if native and native != translation: name = '%s (%s)' % (translation, native) else: name = translation self.ui.ui_language.addItem(name, lang_code) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_path.setEnabled ) ) self.ui.starting_directory.stateChanged.connect( partial( enabledSlot, self.ui.starting_directory_browse.setEnabled ) ) self.ui.starting_directory_browse.clicked.connect(self.starting_directory_browse) self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons def load(self): self.ui.toolbar_show_labels.setChecked(config.setting["toolbar_show_labels"]) self.ui.toolbar_multiselect.setChecked(config.setting["toolbar_multiselect"]) self.ui.builtin_search.setChecked(config.setting["builtin_search"]) self.ui.use_adv_search_syntax.setChecked(config.setting["use_adv_search_syntax"]) self.ui.quit_confirmation.setChecked(config.setting["quit_confirmation"]) current_ui_language = config.setting["ui_language"] self.ui.ui_language.setCurrentIndex(self.ui.ui_language.findData(current_ui_language)) self.ui.starting_directory.setChecked(config.setting["starting_directory"]) self.ui.starting_directory_path.setText(config.setting["starting_directory_path"]) self.populate_action_list() self.ui.toolbar_layout_list.setCurrentRow(0) self.update_buttons() def save(self): config.setting["toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting["toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["builtin_search"] = self.ui.builtin_search.isChecked() config.setting["use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked() config.setting["quit_confirmation"] = self.ui.quit_confirmation.isChecked() self.tagger.window.update_toolbar_style() new_language = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()) if new_language != config.setting["ui_language"]: config.setting["ui_language"] = self.ui.ui_language.itemData(self.ui.ui_language.currentIndex()) dialog = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Information, _('Language changed'), _('You have changed the interface language. You have to restart Picard in order for the change to take effect.'), QtWidgets.QMessageBox.Ok, self) dialog.exec_() config.setting["starting_directory"] = self.ui.starting_directory.isChecked() config.setting["starting_directory_path"] = os.path.normpath(self.ui.starting_directory_path.text()) self.update_layout_config() def restore_defaults(self): super().restore_defaults() self.update_buttons() def starting_directory_browse(self): item = self.ui.starting_directory_path path = QtWidgets.QFileDialog.getExistingDirectory(self, "", item.text()) if path: path = os.path.normpath(path) item.setText(path) def _get_icon_from_name(self, name): return self.TOOLBAR_BUTTONS[name]['icon'] def _insert_item(self, action, index=None): list_item = ToolbarListItem(action) list_item.setToolTip(_('Drag and Drop to re-order')) if action in self.TOOLBAR_BUTTONS: # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround = self.TOOLBAR_BUTTONS[action]['label'] list_item.setText(_(babel_415_workaround)) list_item.setIcon(icontheme.lookup(self._get_icon_from_name(action), icontheme.ICON_SIZE_MENU)) else: list_item.setText(self.SEPARATOR) if index is not None: self.ui.toolbar_layout_list.insertItem(index, list_item) else: self.ui.toolbar_layout_list.addItem(list_item) return list_item def _all_list_items(self): return [self.ui.toolbar_layout_list.item(i).action_name for i in range(self.ui.toolbar_layout_list.count())] def _added_actions(self): actions = self._all_list_items() return set(action for action in actions if action != 'separator') def populate_action_list(self): self.ui.toolbar_layout_list.clear() for name in config.setting['toolbar_layout']: if name in self.ACTION_NAMES or name == 'separator': self._insert_item(name) def update_action_buttons(self): self.ui.add_button.setEnabled(self._added_actions() != self.ACTION_NAMES) def add_to_toolbar(self): display_list = set.difference(self.ACTION_NAMES, self._added_actions()) selected_action, ok = AddActionDialog.get_selected_action(display_list, self) if ok: list_item = self._insert_item(selected_action, self.ui.toolbar_layout_list.currentRow() + 1) self.ui.toolbar_layout_list.setCurrentItem(list_item) self.update_buttons() def insert_separator(self): insert_index = self.ui.toolbar_layout_list.currentRow() + 1 self._insert_item('separator', insert_index) def remove_action(self): item = self.ui.toolbar_layout_list.takeItem(self.ui.toolbar_layout_list.currentRow()) del item self.update_buttons() def update_layout_config(self): config.setting['toolbar_layout'] = self._all_list_items() self._update_toolbar() def _update_toolbar(self): widget = self.parent() while not isinstance(widget, QtWidgets.QMainWindow): widget = widget.parent() # Call the main window's create toolbar method widget.create_action_toolbar() widget.set_tab_order() class ToolbarListItem(QtWidgets.QListWidgetItem): def __init__(self, action_name, *args, **kwargs): super().__init__(*args, **kwargs) self.action_name = action_name class AddActionDialog(PicardDialog): def __init__(self, action_list, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowModality(QtCore.Qt.WindowModal) layout = QtWidgets.QVBoxLayout(self) layout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround_list = [] for action in action_list: babel_415_workaround = self.parent().TOOLBAR_BUTTONS[action]['label'] babel_415_workaround_list.append([_(babel_415_workaround), action]) self.action_list = sorted(babel_415_workaround_list) self.combo_box = QtWidgets.QComboBox(self) self.combo_box.addItems([label for label, action in self.action_list]) layout.addWidget(self.combo_box) buttons = QtWidgets.QDialogButtonBox( QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self) buttons.accepted.connect(self.accept) buttons.rejected.connect(self.reject) layout.addWidget(buttons) def selected_action(self): return self.action_list[self.combo_box.currentIndex()][1] @staticmethod def get_selected_action(action_list, parent=None): dialog = AddActionDialog(action_list, parent) result = dialog.exec_() selected_action = dialog.selected_action() return (selected_action, result == QtWidgets.QDialog.Accepted) register_options_page(InterfaceOptionsPage) picard-release-2.3.1/picard/ui/options/interface_colors.py000066400000000000000000000115471362601763300236610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Laurent Monin # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import config from picard.ui.colors import interface_colors from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_interface_colors import Ui_InterfaceColorsOptionsPage class ColorButton(QtWidgets.QPushButton): color_changed = QtCore.pyqtSignal(str) def __init__(self, initial_color=None, parent=None): super().__init__(' ', parent=parent) color = QtGui.QColor(initial_color) if not color.isValid(): color = QtGui.QColor("black") self.color = color self.clicked.connect(self.open_color_dialog) self.update_color() def update_color(self): self.setStyleSheet("QPushButton { background-color: %s; }" % self.color.name()) def open_color_dialog(self): new_color = QtWidgets.QColorDialog.getColor( self.color, title=_("Choose a color"), parent=self.parent()) if new_color.isValid(): self.color = new_color self.update_color() self.color_changed.emit(self.color.name()) def delete_items_of_layout(layout): # Credits: # https://stackoverflow.com/a/45790404 # https://riverbankcomputing.com/pipermail/pyqt/2009-November/025214.html if layout is not None: while layout.count(): item = layout.takeAt(0) widget = item.widget() if widget is not None: widget.setParent(None) else: delete_items_of_layout(item.layout()) class InterfaceColorsOptionsPage(OptionsPage): NAME = "interface_colors" TITLE = N_("Colors") PARENT = "interface" SORT_ORDER = 30 ACTIVE = True options = [ config.Option("setting", "interface_colors", interface_colors.get_colors()), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceColorsOptionsPage() self.ui.setupUi(self) self.new_colors = {} self.colors_list = QtWidgets.QVBoxLayout() self.ui.colors.setLayout(self.colors_list) def update_color_selectors(self): if self.colors_list: delete_items_of_layout(self.colors_list) def color_changed(color_key, color_value): interface_colors.set_color(color_key, color_value) for color_key, color_value in interface_colors.get_colors().items(): widget = QtWidgets.QWidget() hlayout = QtWidgets.QHBoxLayout() hlayout.setContentsMargins(0, 0, 0, 0) label = QtWidgets.QLabel(interface_colors.get_color_description(color_key)) label.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) hlayout.addWidget(label) button = ColorButton(color_value) button.color_changed.connect(partial(color_changed, color_key)) hlayout.addWidget(button, 0, QtCore.Qt.AlignRight) widget.setLayout(hlayout) self.colors_list.addWidget(widget) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.colors_list.addItem(spacerItem1) def load(self): interface_colors.load_from_config() self.update_color_selectors() def save(self): new_colors = interface_colors.get_colors() if new_colors != config.setting['interface_colors']: config.setting['interface_colors'] = new_colors dialog = QtWidgets.QMessageBox( QtWidgets.QMessageBox.Information, _('Colors changed'), _('You have changed the interface colors. You may have to restart Picard in order for the changes to take effect.'), QtWidgets.QMessageBox.Ok, self) dialog.exec_() def restore_defaults(self): interface_colors.default_colors() self.update_color_selectors() register_options_page(InterfaceColorsOptionsPage) picard-release-2.3.1/picard/ui/options/interface_top_tags.py000066400000000000000000000040541362601763300241730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_interface_top_tags import ( Ui_InterfaceTopTagsOptionsPage, ) class InterfaceTopTagsOptionsPage(OptionsPage): NAME = "interface_top_tags" TITLE = N_("Top Tags") PARENT = "interface" SORT_ORDER = 30 ACTIVE = True options = [ config.ListOption("setting", "metadatabox_top_tags", [ "title", "artist", "album", "tracknumber", "~length", "date", ]), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_InterfaceTopTagsOptionsPage() self.ui.setupUi(self) def load(self): tags = config.setting["metadatabox_top_tags"] self.ui.top_tags_list.update(tags) def save(self): tags = list(self.ui.top_tags_list.tags) if tags != config.setting["metadatabox_top_tags"]: config.setting["metadatabox_top_tags"] = tags self.tagger.window.metadata_box.update() def restore_defaults(self): self.ui.top_tags_list.clear() super().restore_defaults() register_options_page(InterfaceTopTagsOptionsPage) picard-release-2.3.1/picard/ui/options/matching.py000066400000000000000000000045561362601763300221340ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2009, 2011, 2019 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2018 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_matching import Ui_MatchingOptionsPage class MatchingOptionsPage(OptionsPage): NAME = "matching" TITLE = N_("Matching") PARENT = "advanced" SORT_ORDER = 30 ACTIVE = True options = [ config.FloatOption("setting", "file_lookup_threshold", 0.7), config.FloatOption("setting", "cluster_lookup_threshold", 0.7), config.FloatOption("setting", "track_matching_threshold", 0.4), ] _release_type_sliders = {} def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_MatchingOptionsPage() self.ui.setupUi(self) def load(self): self.ui.file_lookup_threshold.setValue(int(config.setting["file_lookup_threshold"] * 100)) self.ui.cluster_lookup_threshold.setValue(int(config.setting["cluster_lookup_threshold"] * 100)) self.ui.track_matching_threshold.setValue(int(config.setting["track_matching_threshold"] * 100)) def save(self): config.setting["file_lookup_threshold"] = float(self.ui.file_lookup_threshold.value()) / 100.0 config.setting["cluster_lookup_threshold"] = float(self.ui.cluster_lookup_threshold.value()) / 100.0 config.setting["track_matching_threshold"] = float(self.ui.track_matching_threshold.value()) / 100.0 register_options_page(MatchingOptionsPage) picard-release-2.3.1/picard/ui/options/metadata.py000066400000000000000000000120541362601763300221120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2008-2009, 2018-2019 Philipp Wolfer # Copyright (C) 2011 Johannes Weißl # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2014 Wieland Hoffmann # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.const import ALIAS_LOCALES from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_metadata import Ui_MetadataOptionsPage def iter_sorted_locales(locales): generic_names = [] grouped_locales = {} for locale, name in locales.items(): name = _(name) generic_locale = locale.split('_', 1)[0] if generic_locale == locale: generic_names.append((name, locale)) else: grouped_locales.setdefault(generic_locale, []).append((name, locale)) for name, locale in sorted(generic_names): yield (locale, name, 0) for name, locale in sorted(grouped_locales.get(locale, [])): yield (locale, name, 1) class MetadataOptionsPage(OptionsPage): NAME = "metadata" TITLE = N_("Metadata") PARENT = None SORT_ORDER = 20 ACTIVE = True options = [ config.TextOption("setting", "va_name", "Various Artists"), config.TextOption("setting", "nat_name", "[non-album tracks]"), config.TextOption("setting", "artist_locale", "en"), config.BoolOption("setting", "translate_artist_names", False), config.BoolOption("setting", "release_ars", True), config.BoolOption("setting", "track_ars", False), config.BoolOption("setting", "convert_punctuation", True), config.BoolOption("setting", "standardize_artists", False), config.BoolOption("setting", "standardize_instruments", True), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_MetadataOptionsPage() self.ui.setupUi(self) self.ui.va_name_default.clicked.connect(self.set_va_name_default) self.ui.nat_name_default.clicked.connect(self.set_nat_name_default) def load(self): self.ui.translate_artist_names.setChecked(config.setting["translate_artist_names"]) combo_box = self.ui.artist_locale current_locale = config.setting["artist_locale"] for i, (locale, name, level) in enumerate(iter_sorted_locales(ALIAS_LOCALES)): label = " " * level + name combo_box.addItem(label, locale) if locale == current_locale: combo_box.setCurrentIndex(i) self.ui.convert_punctuation.setChecked(config.setting["convert_punctuation"]) self.ui.release_ars.setChecked(config.setting["release_ars"]) self.ui.track_ars.setChecked(config.setting["track_ars"]) self.ui.va_name.setText(config.setting["va_name"]) self.ui.nat_name.setText(config.setting["nat_name"]) self.ui.standardize_artists.setChecked(config.setting["standardize_artists"]) self.ui.standardize_instruments.setChecked(config.setting["standardize_instruments"]) def save(self): config.setting["translate_artist_names"] = self.ui.translate_artist_names.isChecked() config.setting["artist_locale"] = self.ui.artist_locale.itemData(self.ui.artist_locale.currentIndex()) config.setting["convert_punctuation"] = self.ui.convert_punctuation.isChecked() config.setting["release_ars"] = self.ui.release_ars.isChecked() config.setting["track_ars"] = self.ui.track_ars.isChecked() config.setting["va_name"] = self.ui.va_name.text() nat_name = self.ui.nat_name.text() if nat_name != config.setting["nat_name"]: config.setting["nat_name"] = nat_name if self.tagger.nats is not None: self.tagger.nats.update() config.setting["standardize_artists"] = self.ui.standardize_artists.isChecked() config.setting["standardize_instruments"] = self.ui.standardize_instruments.isChecked() def set_va_name_default(self): self.ui.va_name.setText(self.options[0].default) self.ui.va_name.setCursorPosition(0) def set_nat_name_default(self): self.ui.nat_name.setText(self.options[1].default) self.ui.nat_name.setCursorPosition(0) register_options_page(MetadataOptionsPage) picard-release-2.3.1/picard/ui/options/network.py000066400000000000000000000074331362601763300220300ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2013 Philipp Wolfer # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_network import Ui_NetworkOptionsPage class NetworkOptionsPage(OptionsPage): NAME = "network" TITLE = N_("Network") PARENT = "advanced" SORT_ORDER = 10 ACTIVE = True options = [ config.BoolOption("setting", "use_proxy", False), config.TextOption("setting", "proxy_server_host", ""), config.IntOption("setting", "proxy_server_port", 80), config.TextOption("setting", "proxy_username", ""), config.TextOption("setting", "proxy_password", ""), config.BoolOption("setting", "browser_integration", True), config.IntOption("setting", "browser_integration_port", 8000), config.BoolOption("setting", "browser_integration_localhost_only", True) ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_NetworkOptionsPage() self.ui.setupUi(self) def load(self): self.ui.web_proxy.setChecked(config.setting["use_proxy"]) self.ui.server_host.setText(config.setting["proxy_server_host"]) self.ui.server_port.setValue(config.setting["proxy_server_port"]) self.ui.username.setText(config.setting["proxy_username"]) self.ui.password.setText(config.setting["proxy_password"]) self.ui.browser_integration.setChecked(config.setting["browser_integration"]) self.ui.browser_integration_port.setValue(config.setting["browser_integration_port"]) self.ui.browser_integration_localhost_only.setChecked( config.setting["browser_integration_localhost_only"]) self.ui.browser_integration_port.valueChanged.connect(self.change_browser_integration_port) def save(self): config.setting["use_proxy"] = self.ui.web_proxy.isChecked() config.setting["proxy_server_host"] = self.ui.server_host.text() config.setting["proxy_server_port"] = self.ui.server_port.value() config.setting["proxy_username"] = self.ui.username.text() config.setting["proxy_password"] = self.ui.password.text() self.tagger.webservice.setup_proxy() config.setting["browser_integration"] = self.ui.browser_integration.isChecked() config.setting["browser_integration_port"] = self.ui.browser_integration_port.value() config.setting["browser_integration_localhost_only"] = \ self.ui.browser_integration_localhost_only.isChecked() self.update_browser_integration() def update_browser_integration(self): if self.ui.browser_integration.isChecked(): self.tagger.browser_integration.start() else: self.tagger.browser_integration.stop() def change_browser_integration_port(self, port): config.setting["browser_integration_port"] = port register_options_page(NetworkOptionsPage) picard-release-2.3.1/picard/ui/options/plugins.py000066400000000000000000000566671362601763300220350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009, 2018-2020 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013, 2015, 2018-2019 Laurent Monin # Copyright (C) 2013, 2017 Sophist-UK # Copyright (C) 2014 Shadab Zafar # Copyright (C) 2015, 2017 Wieland Hoffmann # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Suhas # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2018 yagyanshbhatia # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from operator import attrgetter import os.path from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from PyQt5.QtWidgets import QTreeWidgetItemIterator from picard import ( config, log, ) from picard.const import ( PLUGINS_API, USER_PLUGIN_DIR, ) from picard.util import reconnect from picard.ui import HashableTreeWidgetItem from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_plugins import Ui_PluginsOptionsPage COLUMN_NAME, COLUMN_VERSION, COLUMN_ACTIONS = range(3) class PluginActionButton(QtWidgets.QToolButton): def __init__(self, icon=None, tooltip=None, retain_space=False, switch_method=None, *args, **kwargs): super().__init__(*args, **kwargs) if tooltip is not None: self.setToolTip(tooltip) if icon is not None: self.set_icon(self, icon) if retain_space is True: sp_retain = self.sizePolicy() sp_retain.setRetainSizeWhenHidden(True) self.setSizePolicy(sp_retain) if switch_method is not None: self.switch_method = switch_method def mode(self, mode): if self.switch_method is not None: self.switch_method(self, mode) class PluginTreeWidgetItem(HashableTreeWidgetItem): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._sortData = {} self.upgrade_to_version = None self.new_version = None self.is_enabled = False self.is_installed = False self.installed_font = None self.enabled_font = None self.available_font = None self.buttons = {} self.buttons_widget = QtWidgets.QWidget() layout = QtWidgets.QHBoxLayout() layout.setContentsMargins(0, 0, 5, 0) layout.addStretch(1) self.buttons_widget.setLayout(layout) def add_button(name, method): button = PluginActionButton(switch_method=method) layout.addWidget(button) self.buttons[name] = button button.mode('hide') add_button('update', self.show_update) add_button('uninstall', self.show_uninstall) add_button('enable', self.show_enable) add_button('install', self.show_install) self.treeWidget().setItemWidget(self, COLUMN_ACTIONS, self.buttons_widget) @staticmethod def set_icon(button, stdicon): button.setIcon(button.style().standardIcon(getattr(QtWidgets.QStyle, stdicon))) # Workaround for Qt sometimes not updating the icon. # See https://tickets.metabrainz.org/browse/PICARD-1647 button.repaint() def show_install(self, button, mode): if mode == 'hide': button.hide() else: button.show() button.setToolTip(_("Download and install plugin")) self.set_icon(button, 'SP_ArrowDown') def show_update(self, button, mode): if mode == 'hide': button.hide() else: button.show() button.setToolTip(_("Download and upgrade plugin to version %s") % self.new_version.to_string(short=True)) self.set_icon(button, 'SP_BrowserReload') def show_enable(self, button, mode): if mode == 'enabled': button.show() button.setToolTip(_("Enabled")) self.set_icon(button, 'SP_DialogApplyButton') elif mode == 'disabled': button.show() button.setToolTip(_("Disabled")) self.set_icon(button, 'SP_DialogCancelButton') else: button.hide() def show_uninstall(self, button, mode): if mode == 'hide': button.hide() else: button.show() button.setToolTip(_("Uninstall plugin")) self.set_icon(button, 'SP_TrashIcon') def save_state(self): return { 'is_enabled': self.is_enabled, 'upgrade_to_version': self.upgrade_to_version, 'new_version': self.new_version, 'is_installed': self.is_installed, } def restore_state(self, states): self.upgrade_to_version = states['upgrade_to_version'] self.new_version = states['new_version'] self.is_enabled = states['is_enabled'] self.is_installed = states['is_installed'] def __lt__(self, other): if not isinstance(other, PluginTreeWidgetItem): return super().__lt__(other) tree = self.treeWidget() if not tree: column = 0 else: column = tree.sortColumn() return self.sortData(column) < other.sortData(column) def sortData(self, column): return self._sortData.get(column, self.text(column)) def setSortData(self, column, data): self._sortData[column] = data @property def plugin(self): return self.data(COLUMN_NAME, QtCore.Qt.UserRole) def enable(self, boolean, greyout=None): if boolean is not None: self.is_enabled = boolean if self.is_enabled: self.buttons['enable'].mode('enabled') else: self.buttons['enable'].mode('disabled') if greyout is not None: self.buttons['enable'].setEnabled(not greyout) class PluginsOptionsPage(OptionsPage): NAME = "plugins" TITLE = N_("Plugins") PARENT = None SORT_ORDER = 70 ACTIVE = True options = [ config.ListOption("setting", "enabled_plugins", []), config.Option("persist", "plugins_list_state", QtCore.QByteArray()), config.Option("persist", "plugins_list_sort_section", 0), config.Option("persist", "plugins_list_sort_order", QtCore.Qt.AscendingOrder), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_PluginsOptionsPage() self.ui.setupUi(self) plugins = self.ui.plugins # fix for PICARD-1226, QT bug (https://bugreports.qt.io/browse/QTBUG-22572) workaround plugins.setStyleSheet('') plugins.itemSelectionChanged.connect(self.change_details) plugins.mimeTypes = self.mimeTypes plugins.dropEvent = self.dropEvent plugins.dragEnterEvent = self.dragEnterEvent self.ui.install_plugin.clicked.connect(self.open_plugins) self.ui.folder_open.clicked.connect(self.open_plugin_dir) self.ui.reload_list_of_plugins.clicked.connect(self.reload_list_of_plugins) self.manager = self.tagger.pluginmanager self.manager.plugin_installed.connect(self.plugin_installed) self.manager.plugin_updated.connect(self.plugin_updated) self.manager.plugin_removed.connect(self.plugin_removed) self.manager.plugin_errored.connect(self.plugin_loading_error) self._preserve = {} self._preserve_selected = None def items(self): iterator = QTreeWidgetItemIterator(self.ui.plugins, QTreeWidgetItemIterator.All) while iterator.value(): item = iterator.value() iterator += 1 yield item def find_item_by_plugin_name(self, plugin_name): for item in self.items(): if plugin_name == item.plugin.module_name: return item return None def selected_item(self): try: return self.ui.plugins.selectedItems()[COLUMN_NAME] except IndexError: return None def save_state(self): header = self.ui.plugins.header() config.persist["plugins_list_state"] = header.saveState() config.persist["plugins_list_sort_section"] = header.sortIndicatorSection() config.persist["plugins_list_sort_order"] = header.sortIndicatorOrder() def set_current_item(self, item, scroll=False): if scroll: self.ui.plugins.scrollToItem(item) self.ui.plugins.setCurrentItem(item) self.refresh_details(item) def restore_state(self): header = self.ui.plugins.header() header.restoreState(config.persist["plugins_list_state"]) idx = config.persist["plugins_list_sort_section"] order = config.persist["plugins_list_sort_order"] header.setSortIndicator(idx, order) self.ui.plugins.sortByColumn(idx, order) @staticmethod def is_plugin_enabled(plugin): return bool(plugin.module_name in config.setting["enabled_plugins"]) def available_plugins_name_version(self): return dict([(p.module_name, p.version) for p in self.manager.available_plugins]) def installable_plugins(self): if self.manager.available_plugins is not None: installed_plugins = [plugin.module_name for plugin in self.installed_plugins()] for plugin in sorted(self.manager.available_plugins, key=attrgetter('name')): if plugin.module_name not in installed_plugins: yield plugin def installed_plugins(self): return sorted(self.manager.plugins, key=attrgetter('name')) def enabled_plugins(self): return [item.plugin.module_name for item in self.items() if item.is_enabled] def _populate(self): self._user_interaction(False) if self.manager.available_plugins is None: available_plugins = {} self.manager.query_available_plugins(self._reload) else: available_plugins = self.available_plugins_name_version() self.ui.details.setText("") self.ui.plugins.setSortingEnabled(False) for plugin in self.installed_plugins(): new_version = None if plugin.module_name in available_plugins: latest = available_plugins[plugin.module_name] if latest > plugin.version: new_version = latest self.update_plugin_item(None, plugin, enabled=self.is_plugin_enabled(plugin), new_version=new_version, is_installed=True ) for plugin in self.installable_plugins(): self.update_plugin_item(None, plugin, enabled=False, is_installed=False) self.ui.plugins.setSortingEnabled(True) self._user_interaction(True) header = self.ui.plugins.header() header.setStretchLastSection(False) header.setSectionResizeMode(QtWidgets.QHeaderView.Fixed) header.setSectionResizeMode(COLUMN_NAME, QtWidgets.QHeaderView.Stretch) header.setSectionResizeMode(COLUMN_VERSION, QtWidgets.QHeaderView.ResizeToContents) header.setSectionResizeMode(COLUMN_ACTIONS, QtWidgets.QHeaderView.ResizeToContents) def _remove_all(self): for item in self.items(): idx = self.ui.plugins.indexOfTopLevelItem(item) self.ui.plugins.takeTopLevelItem(idx) def restore_defaults(self): self._user_interaction(False) self._remove_all() super().restore_defaults() self.set_current_item(self.ui.plugins.topLevelItem(0), scroll=True) def load(self): self._populate() self.restore_state() def _preserve_plugins_states(self): self._preserve = {item.plugin.module_name: item.save_state() for item in self.items()} item = self.selected_item() if item: self._preserve_selected = item.plugin.module_name else: self._preserve_selected = None def _restore_plugins_states(self): for item in self.items(): plugin = item.plugin if plugin.module_name in self._preserve: item.restore_state(self._preserve[plugin.module_name]) if self._preserve_selected == plugin.module_name: self.set_current_item(item, scroll=True) def _reload(self): if self.deleted: return self._remove_all() self._populate() self._restore_plugins_states() def _user_interaction(self, enabled): self.ui.plugins.blockSignals(not enabled) self.ui.plugins_container.setEnabled(enabled) def reload_list_of_plugins(self): self.ui.details.setText(_("Reloading list of available plugins...")) self._user_interaction(False) self._preserve_plugins_states() self.manager.query_available_plugins(callback=self._reload) def plugin_loading_error(self, plugin_name, error): QtWidgets.QMessageBox.critical( self, _("Plugin '%s'") % plugin_name, _("An error occurred while loading the plugin '%s':\n\n%s") % (plugin_name, error) ) def plugin_installed(self, plugin): log.debug("Plugin %r installed", plugin.name) if not plugin.compatible: QtWidgets.QMessageBox.warning( self, _("Plugin '%s'") % plugin.name, _("The plugin '%s' is not compatible with this version of Picard.") % plugin.name ) return item = self.find_item_by_plugin_name(plugin.module_name) if item: self.update_plugin_item(item, plugin, make_current=True, enabled=True, is_installed=True) else: self._reload() item = self.find_item_by_plugin_name(plugin.module_name) if item: self.set_current_item(item, scroll=True) def plugin_updated(self, plugin_name): log.debug("Plugin %r updated", plugin_name) item = self.find_item_by_plugin_name(plugin_name) if item: plugin = item.plugin QtWidgets.QMessageBox.information( self, _("Plugin '%s'") % plugin_name, _("The plugin '%s' will be upgraded to version %s on next run of Picard.") % (plugin.name, item.new_version) ) item.upgrade_to_version = item.new_version self.update_plugin_item(item, plugin, make_current=True) def plugin_removed(self, plugin_name): log.debug("Plugin %r removed", plugin_name) item = self.find_item_by_plugin_name(plugin_name) if item: if self.manager.is_available(plugin_name): self.update_plugin_item(item, None, make_current=True, is_installed=False) else: # Remove local plugin self.ui.plugins.invisibleRootItem().removeChild(item) def uninstall_plugin(self, item): plugin = item.plugin buttonReply = QtWidgets.QMessageBox.question( self, _("Uninstall plugin '%s'?") % plugin.name, _("Do you really want to uninstall the plugin '%s' ?") % plugin.name, QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No ) if buttonReply == QtWidgets.QMessageBox.Yes: self.manager.remove_plugin(plugin.module_name, with_update=True) def update_plugin_item(self, item, plugin, make_current=False, enabled=None, new_version=None, is_installed=None ): if item is None: item = PluginTreeWidgetItem(self.ui.plugins) if plugin is not None: item.setData(COLUMN_NAME, QtCore.Qt.UserRole, plugin) else: plugin = item.plugin if new_version is not None: item.new_version = new_version if is_installed is not None: item.is_installed = is_installed if enabled is None: enabled = item.is_enabled def update_text(): if item.new_version is not None: version = "%s → %s" % (plugin.version.to_string(short=True), item.new_version.to_string(short=True)) else: version = plugin.version.to_string(short=True) if item.installed_font is None: item.installed_font = item.font(COLUMN_NAME) if item.enabled_font is None: item.enabled_font = QtGui.QFont(item.installed_font) item.enabled_font.setBold(True) if item.available_font is None: item.available_font = QtGui.QFont(item.installed_font) if item.is_enabled: item.setFont(COLUMN_NAME, item.enabled_font) else: if item.is_installed: item.setFont(COLUMN_NAME, item.installed_font) else: item.setFont(COLUMN_NAME, item.available_font) item.setText(COLUMN_NAME, plugin.name) item.setText(COLUMN_VERSION, version) def toggle_enable(): item.enable(not item.is_enabled, greyout=not item.is_installed) log.debug("Plugin %r enabled: %r", item.plugin.name, item.is_enabled) update_text() reconnect(item.buttons['enable'].clicked, toggle_enable) install_enabled = not item.is_installed or bool(item.new_version) if item.upgrade_to_version: if item.upgrade_to_version != item.new_version: # case when a new version is known after a plugin was marked for update install_enabled = True else: install_enabled = False if install_enabled: if item.new_version is not None: def download_and_update(): self.download_plugin(item, update=True) reconnect(item.buttons['update'].clicked, download_and_update) item.buttons['install'].mode('hide') item.buttons['update'].mode('show') else: def download_and_install(): self.download_plugin(item) reconnect(item.buttons['install'].clicked, download_and_install) item.buttons['install'].mode('show') item.buttons['update'].mode('hide') if item.is_installed: item.buttons['install'].mode('hide') item.buttons['uninstall'].mode( 'show' if plugin.is_user_installed else 'hide') item.enable(enabled, greyout=False) def uninstall_processor(): self.uninstall_plugin(item) reconnect(item.buttons['uninstall'].clicked, uninstall_processor) else: item.buttons['uninstall'].mode('hide') item.enable(False) item.buttons['enable'].mode('hide') update_text() if make_current: self.set_current_item(item) actions_sort_score = 2 if item.is_installed: if item.is_enabled: actions_sort_score = 0 else: actions_sort_score = 1 item.setSortData(COLUMN_ACTIONS, actions_sort_score) item.setSortData(COLUMN_NAME, plugin.name.lower()) def v2int(elem): try: return int(elem) except ValueError: return 0 item.setSortData(COLUMN_VERSION, plugin.version) return item def save(self): config.setting["enabled_plugins"] = self.enabled_plugins() self.save_state() def refresh_details(self, item): plugin = item.plugin text = [] if item.new_version is not None: if item.upgrade_to_version: label = _("Restart Picard to upgrade to new version") else: label = _("New version available") text.append("" + label + ": " + item.new_version + "") if plugin.description: text.append(plugin.description + "
") if plugin.name: text.append("" + _("Name") + ": " + plugin.name) if plugin.author: text.append("" + _("Authors") + ": " + plugin.author) if plugin.license: text.append("" + _("License") + ": " + plugin.license) text.append("" + _("Files") + ": " + plugin.files_list) self.ui.details.setText("

%s

" % "
\n".join(text)) def change_details(self): item = self.selected_item() if item: self.refresh_details(item) def open_plugins(self): files, _filter = QtWidgets.QFileDialog.getOpenFileNames( self, "", QtCore.QDir.homePath(), "Picard plugin (*.py *.pyc *.zip)" ) if files: for path in files: self.manager.install_plugin(path) def download_plugin(self, item, update=False): plugin = item.plugin self.tagger.webservice.get( PLUGINS_API['host'], PLUGINS_API['port'], PLUGINS_API['endpoint']['download'], partial(self.download_handler, update, plugin=plugin), parse_response_type=None, priority=True, important=True, queryargs={"id": plugin.module_name} ) def download_handler(self, update, response, reply, error, plugin): if error: msgbox = QtWidgets.QMessageBox(self) msgbox.setText(_("The plugin '%s' could not be downloaded.") % plugin.module_name) msgbox.setInformativeText(_("Please try again later.")) msgbox.setStandardButtons(QtWidgets.QMessageBox.Ok) msgbox.setDefaultButton(QtWidgets.QMessageBox.Ok) msgbox.exec_() log.error("Error occurred while trying to download the plugin: '%s'" % plugin.module_name) return self.manager.install_plugin( None, update=update, plugin_name=plugin.module_name, plugin_data=response, ) @staticmethod def open_plugin_dir(): QtGui.QDesktopServices.openUrl(QtCore.QUrl.fromLocalFile(USER_PLUGIN_DIR)) def mimeTypes(self): return ["text/uri-list"] def dragEnterEvent(self, event): event.setDropAction(QtCore.Qt.CopyAction) event.accept() def dropEvent(self, event): for path in [os.path.normpath(u.toLocalFile()) for u in event.mimeData().urls()]: self.manager.install_plugin(path) register_options_page(PluginsOptionsPage) picard-release-2.3.1/picard/ui/options/ratings.py000066400000000000000000000042361362601763300220040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2008-2009 Philipp Wolfer # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2018 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_ratings import Ui_RatingsOptionsPage class RatingsOptionsPage(OptionsPage): NAME = "ratings" TITLE = N_("Ratings") PARENT = "metadata" SORT_ORDER = 20 ACTIVE = True options = [ config.BoolOption("setting", "enable_ratings", False), config.TextOption("setting", "rating_user_email", "users@musicbrainz.org"), config.BoolOption("setting", "submit_ratings", True), config.IntOption("setting", "rating_steps", 6), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_RatingsOptionsPage() self.ui.setupUi(self) def load(self): self.ui.enable_ratings.setChecked(config.setting["enable_ratings"]) self.ui.rating_user_email.setText(config.setting["rating_user_email"]) self.ui.submit_ratings.setChecked(config.setting["submit_ratings"]) def save(self): config.setting["enable_ratings"] = self.ui.enable_ratings.isChecked() config.setting["rating_user_email"] = self.ui.rating_user_email.text() config.setting["submit_ratings"] = self.ui.submit_ratings.isChecked() register_options_page(RatingsOptionsPage) picard-release-2.3.1/picard/ui/options/releases.py000066400000000000000000000253041362601763300221370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2011-2014 Michael Wiencek # Copyright (C) 2012 Frederik “Freso” S. Olesen # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Suhas # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from locale import strxfrm from operator import itemgetter from PyQt5 import ( QtCore, QtWidgets, ) from picard import config from picard.const import ( RELEASE_COUNTRIES, RELEASE_FORMATS, RELEASE_PRIMARY_GROUPS, RELEASE_SECONDARY_GROUPS, ) from picard.const.sys import IS_WIN from picard.i18n import gettext_attr from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_releases import Ui_ReleasesOptionsPage from picard.ui.widgets import ClickableSlider _DEFAULT_SCORE = 0.5 _release_type_scores = [(g, _DEFAULT_SCORE) for g in list(RELEASE_PRIMARY_GROUPS.keys()) + list(RELEASE_SECONDARY_GROUPS.keys())] class TipSlider(ClickableSlider): _offset = QtCore.QPoint(0, -30) _step = 5 _pagestep = 25 _minimum = 0 _maximum = 100 def __init__(self, *args): super().__init__(*args) self.style = QtWidgets.QApplication.style() self.opt = QtWidgets.QStyleOptionSlider() self.setMinimum(self._minimum) self.setMaximum(self._maximum) self.setOrientation(QtCore.Qt.Horizontal) self.setSingleStep(self._step) self.setTickInterval(self._step) self.setPageStep(self._pagestep) def showEvent(self, event): super().showEvent(event) if not IS_WIN: self.valueChanged.connect(self.show_tip) def hideEvent(self, event): super().hideEvent(event) if not IS_WIN: try: self.valueChanged.disconnect(self.show_tip) except TypeError: pass def show_tip(self, value): self.round_value(value) self.initStyleOption(self.opt) rectHandle = self.style.subControlRect(self.style.CC_Slider, self.opt, self.style.SC_SliderHandle) offset = self._offset * self.tagger.primaryScreen().devicePixelRatio() pos_local = rectHandle.topLeft() + offset pos_global = self.mapToGlobal(pos_local) QtWidgets.QToolTip.showText(pos_global, str(self.value()), self) def round_value(self, value): step = max(1, int(self._step)) if step > 1: super().setValue(int(value / step) * step) class ReleaseTypeScore: def __init__(self, group, layout, label, cell): row, column = cell # it uses 2 cells (r,c and r,c+1) self.group = group self.layout = layout self.label = QtWidgets.QLabel(self.group) self.label.setText(label) self.layout.addWidget(self.label, row, column, 1, 1) self.slider = TipSlider(self.group) self.layout.addWidget(self.slider, row, column + 1, 1, 1) self.reset() def setValue(self, value): self.slider.setValue(int(value * 100)) def value(self): return float(self.slider.value()) / 100.0 def reset(self): self.setValue(_DEFAULT_SCORE) class RowColIter: def __init__(self, max_cells, max_cols=6, step=2): assert(max_cols % step == 0) self.step = step self.cols = max_cols self.rows = int((max_cells - 1) / (self.cols / step)) + 1 self.current = (-1, 0) def __iter__(self): return self def __next__(self): row, col = self.current row += 1 if row == self.rows: col += self.step row = 0 self.current = (row, col) return self.current class ReleasesOptionsPage(OptionsPage): NAME = "releases" TITLE = N_("Preferred Releases") PARENT = "metadata" SORT_ORDER = 10 ACTIVE = True options = [ config.ListOption("setting", "release_type_scores", _release_type_scores), config.ListOption("setting", "preferred_release_countries", []), config.ListOption("setting", "preferred_release_formats", []), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_ReleasesOptionsPage() self.ui.setupUi(self) self._release_type_sliders = {} def add_slider(name, griditer, context): label = gettext_attr(name, context) self._release_type_sliders[name] = \ ReleaseTypeScore(self.ui.type_group, self.ui.gridLayout, label, next(griditer)) griditer = RowColIter(len(RELEASE_PRIMARY_GROUPS) + len(RELEASE_SECONDARY_GROUPS) + 1) # +1 for Reset button for name in RELEASE_PRIMARY_GROUPS: add_slider(name, griditer, context='release_group_primary_type') for name in sorted(RELEASE_SECONDARY_GROUPS, key=lambda v: gettext_attr(v, 'release_group_secondary_type')): add_slider(name, griditer, context='release_group_secondary_type') self.reset_preferred_types_btn = QtWidgets.QPushButton(self.ui.type_group) self.reset_preferred_types_btn.setText(_("Reset all")) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.reset_preferred_types_btn.sizePolicy().hasHeightForWidth()) self.reset_preferred_types_btn.setSizePolicy(sizePolicy) r, c = next(griditer) self.ui.gridLayout.addWidget(self.reset_preferred_types_btn, r, c, 1, 2) self.reset_preferred_types_btn.clicked.connect(self.reset_preferred_types) self.ui.add_countries.clicked.connect(self.add_preferred_countries) self.ui.remove_countries.clicked.connect(self.remove_preferred_countries) self.ui.add_formats.clicked.connect(self.add_preferred_formats) self.ui.remove_formats.clicked.connect(self.remove_preferred_formats) self.ui.country_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.ui.preferred_country_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.ui.format_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.ui.preferred_format_list.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) def restore_defaults(self): # Clear lists self.ui.preferred_country_list.clear() self.ui.preferred_format_list.clear() self.ui.country_list.clear() self.ui.format_list.clear() super().restore_defaults() def load(self): scores = dict(config.setting["release_type_scores"]) for (release_type, release_type_slider) in self._release_type_sliders.items(): release_type_slider.setValue(scores.get(release_type, _DEFAULT_SCORE)) self._load_list_items("preferred_release_countries", RELEASE_COUNTRIES, self.ui.country_list, self.ui.preferred_country_list) self._load_list_items("preferred_release_formats", RELEASE_FORMATS, self.ui.format_list, self.ui.preferred_format_list) def save(self): scores = [] for (release_type, release_type_slider) in self._release_type_sliders.items(): scores.append((release_type, release_type_slider.value())) config.setting["release_type_scores"] = scores self._save_list_items("preferred_release_countries", self.ui.preferred_country_list) self._save_list_items("preferred_release_formats", self.ui.preferred_format_list) def reset_preferred_types(self): for release_type_slider in self._release_type_sliders.values(): release_type_slider.reset() def add_preferred_countries(self): self._move_selected_items(self.ui.country_list, self.ui.preferred_country_list) def remove_preferred_countries(self): self._move_selected_items(self.ui.preferred_country_list, self.ui.country_list) self.ui.country_list.sortItems() def add_preferred_formats(self): self._move_selected_items(self.ui.format_list, self.ui.preferred_format_list) def remove_preferred_formats(self): self._move_selected_items(self.ui.preferred_format_list, self.ui.format_list) self.ui.format_list.sortItems() def _move_selected_items(self, list1, list2): for item in list1.selectedItems(): clone = item.clone() list2.addItem(clone) list1.takeItem(list1.row(item)) def _load_list_items(self, setting, source, list1, list2): if setting == "preferred_release_countries": source_list = [(c[0], gettext_countries(c[1])) for c in source.items()] elif setting == "preferred_release_formats": source_list = [(c[0], gettext_attr(c[1], "medium_format")) for c in source.items()] else: source_list = [(c[0], _(c[1])) for c in source.items()] def fcmp(x): return strxfrm(x[1]) source_list.sort(key=fcmp) saved_data = config.setting[setting] move = [] for data, name in source_list: item = QtWidgets.QListWidgetItem(name) item.setData(QtCore.Qt.UserRole, data) try: i = saved_data.index(data) move.append((i, item)) except BaseException: list1.addItem(item) move.sort(key=itemgetter(0)) for i, item in move: list2.addItem(item) def _save_list_items(self, setting, list1): data = [] for i in range(list1.count()): item = list1.item(i) data.append(item.data(QtCore.Qt.UserRole)) config.setting[setting] = data register_options_page(ReleasesOptionsPage) picard-release-2.3.1/picard/ui/options/renaming.py000066400000000000000000000337611362601763300221420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008, 2011 Lukáš Lalinský # Copyright (C) 2008-2009 Nikolai Prokoschenko # Copyright (C) 2009-2010, 2014-2015, 2018-2019 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2011-2013 Wieland Hoffmann # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013 Ionuț Ciocîrlan # Copyright (C) 2013-2014 Sophist-UK # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2015 Alex Berman # Copyright (C) 2015 Ohm Patel # Copyright (C) 2016 Suhas # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial import os.path from PyQt5 import QtWidgets from PyQt5.QtCore import QStandardPaths from PyQt5.QtGui import ( QFont, QPalette, ) from picard import config from picard.const import ( DEFAULT_FILE_NAMING_FORMAT, PICARD_URLS, ) from picard.const.sys import IS_WIN from picard.file import File from picard.script import ( ScriptError, ScriptParser, ) from picard.util.settingsoverride import SettingsOverride from picard.ui.options import ( OptionsCheckError, OptionsPage, register_options_page, ) from picard.ui.options.scripting import ( ScriptCheckError, TaggerScriptSyntaxHighlighter, ) from picard.ui.ui_options_renaming import Ui_RenamingOptionsPage from picard.ui.util import enabledSlot _default_music_dir = QStandardPaths.writableLocation(QStandardPaths.MusicLocation) class RenamingOptionsPage(OptionsPage): NAME = "filerenaming" TITLE = N_("File Naming") PARENT = None SORT_ORDER = 40 ACTIVE = True options = [ config.BoolOption("setting", "windows_compatibility", True), config.BoolOption("setting", "ascii_filenames", False), config.BoolOption("setting", "rename_files", False), config.TextOption( "setting", "file_naming_format", DEFAULT_FILE_NAMING_FORMAT, ), config.BoolOption("setting", "move_files", False), config.TextOption("setting", "move_files_to", _default_music_dir), config.BoolOption("setting", "move_additional_files", False), config.TextOption("setting", "move_additional_files_pattern", "*.jpg *.png"), config.BoolOption("setting", "delete_empty_dirs", True), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_RenamingOptionsPage() self.ui.setupUi(self) self.ui.ascii_filenames.clicked.connect(self.update_examples) self.ui.windows_compatibility.clicked.connect(self.update_examples) self.ui.rename_files.clicked.connect(self.update_examples) self.ui.move_files.clicked.connect(self.update_examples) self.ui.move_files_to.editingFinished.connect(self.update_examples) self.ui.move_files.toggled.connect( partial( enabledSlot, self.toggle_file_moving ) ) self.ui.rename_files.toggled.connect( partial( enabledSlot, self.toggle_file_renaming ) ) self.ui.file_naming_format.textChanged.connect(self.check_formats) self.ui.file_naming_format_default.clicked.connect(self.set_file_naming_format_default) self.highlighter = TaggerScriptSyntaxHighlighter(self.ui.file_naming_format.document()) self.ui.move_files_to_browse.clicked.connect(self.move_files_to_browse) script_edit = self.ui.file_naming_format font = QFont('Monospace') font.setStyleHint(QFont.TypeWriter) script_edit.setFont(font) self.script_palette_normal = script_edit.palette() self.script_palette_readonly = QPalette(self.script_palette_normal) disabled_color = self.script_palette_normal.color(QPalette.Inactive, QPalette.Window) self.script_palette_readonly.setColor(QPalette.Disabled, QPalette.Base, disabled_color) def toggle_file_moving(self, state): self.toggle_file_naming_format() self.ui.delete_empty_dirs.setEnabled(state) self.ui.move_files_to.setEnabled(state) self.ui.move_files_to_browse.setEnabled(state) self.ui.move_additional_files.setEnabled(state) self.ui.move_additional_files_pattern.setEnabled(state) def toggle_file_renaming(self, state): self.toggle_file_naming_format() def toggle_file_naming_format(self): active = self.ui.move_files.isChecked() or self.ui.rename_files.isChecked() self.ui.file_naming_format.setEnabled(active) self.ui.file_naming_format_default.setEnabled(active) palette = self.script_palette_normal if active else self.script_palette_readonly self.ui.file_naming_format.setPalette(palette) self.ui.ascii_filenames.setEnabled(active) if not IS_WIN: self.ui.windows_compatibility.setEnabled(active) def check_formats(self): self.test() self.update_examples() def _example_to_filename(self, file): settings = SettingsOverride(config.setting, { 'ascii_filenames': self.ui.ascii_filenames.isChecked(), 'file_naming_format': self.ui.file_naming_format.toPlainText(), 'move_files': self.ui.move_files.isChecked(), 'move_files_to': os.path.normpath(self.ui.move_files_to.text()), 'rename_files': self.ui.rename_files.isChecked(), 'windows_compatibility': self.ui.windows_compatibility.isChecked(), }) try: if config.setting["enable_tagger_scripts"]: for s_pos, s_name, s_enabled, s_text in config.setting["list_of_scripts"]: if s_enabled and s_text: parser = ScriptParser() parser.eval(s_text, file.metadata) filename = file.make_filename(file.filename, file.metadata, settings) if not settings["move_files"]: return os.path.basename(filename) return filename except ScriptError: return "" except TypeError: return "" def update_examples(self): # TODO: Here should be more examples etc. # TODO: Would be nice to show diffs too.... example1 = self._example_to_filename(self.example_1()) example2 = self._example_to_filename(self.example_2()) self.ui.example_filename.setText(example1) self.ui.example_filename_va.setText(example2) def load(self): if IS_WIN: self.ui.windows_compatibility.setChecked(True) self.ui.windows_compatibility.setEnabled(False) else: self.ui.windows_compatibility.setChecked(config.setting["windows_compatibility"]) self.ui.rename_files.setChecked(config.setting["rename_files"]) self.ui.move_files.setChecked(config.setting["move_files"]) self.ui.ascii_filenames.setChecked(config.setting["ascii_filenames"]) self.ui.file_naming_format.setPlainText(config.setting["file_naming_format"]) args = { "picard-doc-scripting-url": PICARD_URLS['doc_scripting'], } text = _('Open Scripting' ' Documentation in your browser') % args self.ui.file_naming_format_documentation.setText(text) self.ui.move_files_to.setText(config.setting["move_files_to"]) self.ui.move_files_to.setCursorPosition(0) self.ui.move_additional_files.setChecked(config.setting["move_additional_files"]) self.ui.move_additional_files_pattern.setText(config.setting["move_additional_files_pattern"]) self.ui.delete_empty_dirs.setChecked(config.setting["delete_empty_dirs"]) self.update_examples() def check(self): self.check_format() if self.ui.move_files.isChecked() and not self.ui.move_files_to.text().strip(): raise OptionsCheckError(_("Error"), _("The location to move files to must not be empty.")) def check_format(self): parser = ScriptParser() try: parser.eval(self.ui.file_naming_format.toPlainText()) except Exception as e: raise ScriptCheckError("", str(e)) if self.ui.rename_files.isChecked(): if not self.ui.file_naming_format.toPlainText().strip(): raise ScriptCheckError("", _("The file naming format must not be empty.")) def save(self): config.setting["windows_compatibility"] = self.ui.windows_compatibility.isChecked() config.setting["ascii_filenames"] = self.ui.ascii_filenames.isChecked() config.setting["rename_files"] = self.ui.rename_files.isChecked() config.setting["file_naming_format"] = self.ui.file_naming_format.toPlainText() self.tagger.window.enable_renaming_action.setChecked(config.setting["rename_files"]) config.setting["move_files"] = self.ui.move_files.isChecked() config.setting["move_files_to"] = os.path.normpath(self.ui.move_files_to.text()) config.setting["move_additional_files"] = self.ui.move_additional_files.isChecked() config.setting["move_additional_files_pattern"] = self.ui.move_additional_files_pattern.text() config.setting["delete_empty_dirs"] = self.ui.delete_empty_dirs.isChecked() self.tagger.window.enable_moving_action.setChecked(config.setting["move_files"]) def display_error(self, error): # Ignore scripting errors, those are handled inline if not isinstance(error, ScriptCheckError): super().display_error(error) def set_file_naming_format_default(self): self.ui.file_naming_format.setText(self.options[3].default) # self.ui.file_naming_format.setCursorPosition(0) def example_1(self): file = File("ticket_to_ride.mp3") file.state = File.NORMAL file.metadata['album'] = 'Help!' file.metadata['title'] = 'Ticket to Ride' file.metadata['artist'] = 'The Beatles' file.metadata['artistsort'] = 'Beatles, The' file.metadata['albumartist'] = 'The Beatles' file.metadata['albumartistsort'] = 'Beatles, The' file.metadata['tracknumber'] = '7' file.metadata['totaltracks'] = '14' file.metadata['discnumber'] = '1' file.metadata['totaldiscs'] = '1' file.metadata['date'] = '1965-08-06' file.metadata['releasetype'] = ['album', 'soundtrack'] file.metadata['~primaryreleasetype'] = ['album'] file.metadata['~secondaryreleasetype'] = ['soundtrack'] file.metadata['releasestatus'] = 'official' file.metadata['releasecountry'] = 'US' file.metadata['~extension'] = 'mp3' file.metadata['musicbrainz_albumid'] = '2c053984-4645-4699-9474-d2c35c227028' file.metadata['musicbrainz_albumartistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d' file.metadata['musicbrainz_artistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d' file.metadata['musicbrainz_recordingid'] = 'ed052ae1-c950-47f2-8d2b-46e1b58ab76c' file.metadata['musicbrainz_releasetrackid'] = '7668a62a-2fac-3151-a744-5707ac8c883c' return file def example_2(self): file = File("track05.mp3") file.state = File.NORMAL file.metadata['album'] = "Coup d'État, Volume 1: Ku De Ta / Prologue" file.metadata['title'] = "I've Got to Learn the Mambo" file.metadata['artist'] = "Snowboy feat. James Hunter" file.metadata['artistsort'] = "Snowboy feat. Hunter, James" file.metadata['albumartist'] = config.setting['va_name'] file.metadata['albumartistsort'] = config.setting['va_name'] file.metadata['tracknumber'] = '5' file.metadata['totaltracks'] = '13' file.metadata['discnumber'] = '2' file.metadata['totaldiscs'] = '2' file.metadata['discsubtitle'] = "Beat Up" file.metadata['date'] = '2005-07-04' file.metadata['releasetype'] = ['album', 'compilation'] file.metadata['~primaryreleasetype'] = 'album' file.metadata['~secondaryreleasetype'] = 'compilation' file.metadata['releasestatus'] = 'official' file.metadata['releasecountry'] = 'AU' file.metadata['compilation'] = '1' file.metadata['~multiartist'] = '1' file.metadata['~extension'] = 'mp3' file.metadata['musicbrainz_albumid'] = '4b50c71e-0a07-46ac-82e4-cb85dc0c9bdd' file.metadata['musicbrainz_recordingid'] = 'b3c487cb-0e55-477d-8df3-01ec6590f099' file.metadata['musicbrainz_releasetrackid'] = 'f8649a05-da39-39ba-957c-7abf8f9012be' file.metadata['musicbrainz_albumartistid'] = '89ad4ac3-39f7-470e-963a-56509c546377' file.metadata['musicbrainz_artistid'] = ['7b593455-d207-482c-8c6f-19ce22c94679', '9e082466-2390-40d1-891e-4803531f43fd'] return file def move_files_to_browse(self): path = QtWidgets.QFileDialog.getExistingDirectory(self, "", self.ui.move_files_to.text()) if path: path = os.path.normpath(path) self.ui.move_files_to.setText(path) def test(self): self.ui.renaming_error.setStyleSheet("") self.ui.renaming_error.setText("") try: self.check_format() except ScriptCheckError as e: self.ui.renaming_error.setStyleSheet(self.STYLESHEET_ERROR) self.ui.renaming_error.setText(e.info) return register_options_page(RenamingOptionsPage) picard-release-2.3.1/picard/ui/options/scripting.py000066400000000000000000000213451362601763300223370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2009 Lukáš Lalinský # Copyright (C) 2009 Nikolai Prokoschenko # Copyright (C) 2009-2010, 2019 Philipp Wolfer # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013-2015, 2017-2019 Laurent Monin # Copyright (C) 2014 m42i # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2016-2017 Suhas # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtGui, ) from picard import config from picard.const import PICARD_URLS from picard.script import ScriptParser from picard.util import restore_method from picard.ui.moveable_list_view import MoveableListView from picard.ui.options import ( OptionsCheckError, OptionsPage, register_options_page, ) from picard.ui.ui_options_script import Ui_ScriptingOptionsPage from picard.ui.widgets.scriptlistwidget import ScriptListWidgetItem class ScriptCheckError(OptionsCheckError): pass class TaggerScriptSyntaxHighlighter(QtGui.QSyntaxHighlighter): def __init__(self, document): super().__init__(document) self.func_re = QtCore.QRegExp(r"\$(?!noop)[a-zA-Z][_a-zA-Z0-9]*\(") self.func_fmt = QtGui.QTextCharFormat() self.func_fmt.setFontWeight(QtGui.QFont.Bold) self.func_fmt.setForeground(QtCore.Qt.blue) self.var_re = QtCore.QRegExp(r"%[_a-zA-Z0-9:]*%") self.var_fmt = QtGui.QTextCharFormat() self.var_fmt.setForeground(QtCore.Qt.darkCyan) self.escape_re = QtCore.QRegExp(r"\\.") self.escape_fmt = QtGui.QTextCharFormat() self.escape_fmt.setForeground(QtCore.Qt.darkRed) self.special_re = QtCore.QRegExp(r"[^\\][(),]") self.special_fmt = QtGui.QTextCharFormat() self.special_fmt.setForeground(QtCore.Qt.blue) self.bracket_re = QtCore.QRegExp(r"[()]") self.noop_re = QtCore.QRegExp(r"\$noop\(") self.noop_fmt = QtGui.QTextCharFormat() self.noop_fmt.setFontWeight(QtGui.QFont.Bold) self.noop_fmt.setFontItalic(True) self.noop_fmt.setForeground(QtCore.Qt.darkGray) self.rules = [ (self.func_re, self.func_fmt, 0, -1), (self.var_re, self.var_fmt, 0, 0), (self.escape_re, self.escape_fmt, 0, 0), (self.special_re, self.special_fmt, 1, -1), ] def highlightBlock(self, text): self.setCurrentBlockState(0) for expr, fmt, a, b in self.rules: index = expr.indexIn(text) while index >= 0: length = expr.matchedLength() self.setFormat(index + a, length + b, fmt) index = expr.indexIn(text, index + length + b) # Ignore everything if we're already in a noop function index = self.noop_re.indexIn(text) if self.previousBlockState() <= 0 else 0 open_brackets = self.previousBlockState() if self.previousBlockState() > 0 else 0 while index >= 0: next_index = self.bracket_re.indexIn(text, index) # Skip escaped brackets if (next_index > 0) and text[next_index - 1] == '\\': next_index += 1 if (next_index > -1) and text[next_index] == '(': open_brackets += 1 elif (next_index > -1) and text[next_index] == ')': open_brackets -= 1 if next_index > -1: self.setFormat(index, next_index - index + 1, self.noop_fmt) elif (next_index == -1) and (open_brackets > 0): self.setFormat(index, len(text) - index, self.noop_fmt) # Check for next noop operation, necessary for multiple noops in one line if open_brackets == 0: next_index = self.noop_re.indexIn(text, next_index) index = next_index + 1 if (next_index > -1) and (next_index < len(text)) else -1 self.setCurrentBlockState(open_brackets) class ScriptingOptionsPage(OptionsPage): NAME = "scripting" TITLE = N_("Scripting") PARENT = None SORT_ORDER = 85 ACTIVE = True options = [ config.BoolOption("setting", "enable_tagger_scripts", False), config.ListOption("setting", "list_of_scripts", []), config.IntOption("persist", "last_selected_script_pos", 0), config.Option("persist", "scripting_splitter", QtCore.QByteArray()), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_ScriptingOptionsPage() self.ui.setupUi(self) self.highlighter = TaggerScriptSyntaxHighlighter(self.ui.tagger_script.document()) self.ui.tagger_script.setEnabled(False) self.ui.splitter.setStretchFactor(0, 1) self.ui.splitter.setStretchFactor(1, 2) font = QtGui.QFont('Monospace') font.setStyleHint(QtGui.QFont.TypeWriter) self.ui.tagger_script.setFont(font) self.move_view = MoveableListView(self.ui.script_list, self.ui.move_up_button, self.ui.move_down_button) def script_selected(self): items = self.ui.script_list.selectedItems() if items: item = items[0] self.ui.tagger_script.setEnabled(True) self.ui.tagger_script.setText(item.script) else: self.ui.tagger_script.setEnabled(False) self.ui.tagger_script.setText("") def live_update_and_check(self): items = self.ui.script_list.selectedItems() if items: script = items[0] script.script = self.ui.tagger_script.toPlainText() self.ui.script_error.setStyleSheet("") self.ui.script_error.setText("") try: self.check() except OptionsCheckError as e: self.ui.script_error.setStyleSheet(self.STYLESHEET_ERROR) self.ui.script_error.setText(e.info) return def check(self): parser = ScriptParser() try: parser.eval(self.ui.tagger_script.toPlainText()) except Exception as e: raise ScriptCheckError(_("Script Error"), str(e)) def restore_defaults(self): # Remove existing scripts self.ui.script_list.clear() self.ui.tagger_script.setText("") super().restore_defaults() def load(self): self.ui.enable_tagger_scripts.setChecked(config.setting["enable_tagger_scripts"]) for pos, name, enabled, text in config.setting["list_of_scripts"]: list_item = ScriptListWidgetItem(name, enabled, text) self.ui.script_list.addItem(list_item) # Select the last selected script item last_selected_script_pos = config.persist["last_selected_script_pos"] last_selected_script = self.ui.script_list.item(last_selected_script_pos) if last_selected_script: self.ui.script_list.setCurrentItem(last_selected_script) last_selected_script.setSelected(True) self.restore_state() args = { "picard-doc-scripting-url": PICARD_URLS['doc_scripting'], } text = _('Open Scripting' ' Documentation in your browser') % args self.ui.scripting_doc_link.setText(text) def _all_scripts(self): for row in range(0, self.ui.script_list.count()): item = self.ui.script_list.item(row) yield item.get_all() @restore_method def restore_state(self): # Preserve previous splitter position self.ui.splitter.restoreState(config.persist["scripting_splitter"]) def save(self): config.setting["enable_tagger_scripts"] = self.ui.enable_tagger_scripts.isChecked() config.setting["list_of_scripts"] = list(self._all_scripts()) config.persist["last_selected_script_pos"] = self.ui.script_list.currentRow() config.persist["scripting_splitter"] = self.ui.splitter.saveState() def display_error(self, error): # Ignore scripting errors, those are handled inline if not isinstance(error, ScriptCheckError): super().display_error(error) register_options_page(ScriptingOptionsPage) picard-release-2.3.1/picard/ui/options/tags.py000066400000000000000000000114321362601763300212670ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007, 2011 Lukáš Lalinský # Copyright (C) 2009 Nikolai Prokoschenko # Copyright (C) 2009-2010, 2018-2019 Philipp Wolfer # Copyright (C) 2012 Erik Wasser # Copyright (C) 2012 Johannes Weißl # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013, 2017 Sophist-UK # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017-2018 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from PyQt5 import ( QtCore, QtWidgets, ) from picard import config from picard.util.tags import TAG_NAMES from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_tags import Ui_TagsOptionsPage class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "dont_write_tags", False), config.BoolOption("setting", "preserve_timestamps", False), config.BoolOption("setting", "clear_existing_tags", False), config.BoolOption("setting", "remove_id3_from_flac", False), config.BoolOption("setting", "remove_ape_from_mp3", False), config.TextOption("setting", "preserved_tags", ""), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.completer = QtWidgets.QCompleter(sorted(TAG_NAMES.keys()), self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setWidget(self.ui.preserved_tags) self.ui.preserved_tags.textEdited.connect(self.preserved_tags_edited) self.completer.activated.connect(self.completer_activated) def load(self): self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked(config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked(config.setting["clear_existing_tags"]) self.ui.remove_ape_from_mp3.setChecked(config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked(config.setting["remove_id3_from_flac"]) self.ui.preserved_tags.setText(config.setting["preserved_tags"]) def save(self): config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting["preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting["remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting["remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting["preserved_tags"] = re.sub(r"[,\s]+$", "", self.ui.preserved_tags.text()) self.tagger.window.enable_tag_saving_action.setChecked(not config.setting["dont_write_tags"]) def preserved_tags_edited(self, text): prefix = text[:self.ui.preserved_tags.cursorPosition()].split(",")[-1] self.completer.setCompletionPrefix(prefix.strip()) if prefix: self.completer.complete() else: self.completer.popup().hide() def completer_activated(self, text): input_field = self.ui.preserved_tags current = input_field.text() cursor_pos = input_field.cursorPosition() prefix_len = len(self.completer.completionPrefix()) leading_text = current[:cursor_pos - prefix_len].rstrip() trailing_text = current[cursor_pos:].lstrip() # Replace the autocompletion prefix with the autocompleted text, # append a comma so the user can easily enter the next entry replacement = ("%s %s, " % (leading_text, text)).lstrip() input_field.setText(replacement + trailing_text) # Set cursor position to end of autocompleted input input_field.setCursorPosition(len(replacement)) register_options_page(TagsOptionsPage) picard-release-2.3.1/picard/ui/options/tags_compatibility.py000066400000000000000000000123501362601763300242200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from picard import config from picard.ui.options import ( OptionsPage, register_options_page, ) from picard.ui.ui_options_tags_compatibility import ( Ui_TagsCompatibilityOptionsPage, ) class TagsCompatibilityOptionsPage(OptionsPage): NAME = "tags_compatibility" TITLE = N_("Tag Compatibility") PARENT = "tags" SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "write_id3v1", True), config.BoolOption("setting", "write_id3v23", True), config.TextOption("setting", "id3v2_encoding", "utf-16"), config.TextOption("setting", "id3v23_join_with", "/"), config.BoolOption("setting", "itunes_compatible_grouping", False), config.BoolOption("setting", "aac_save_ape", True), config.BoolOption("setting", "remove_ape_from_aac", False), config.BoolOption("setting", "ac3_save_ape", True), config.BoolOption("setting", "remove_ape_from_ac3", False), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_TagsCompatibilityOptionsPage() self.ui.setupUi(self) self.ui.write_id3v23.clicked.connect(self.update_encodings) self.ui.write_id3v24.clicked.connect(partial(self.update_encodings, force_utf8=True)) self.ui.aac_no_tags.toggled.connect(self.ui.remove_ape_from_aac.setEnabled) self.ui.ac3_no_tags.toggled.connect(self.ui.remove_ape_from_ac3.setEnabled) def load(self): self.ui.write_id3v1.setChecked(config.setting["write_id3v1"]) if config.setting["write_id3v23"]: self.ui.write_id3v23.setChecked(True) else: self.ui.write_id3v24.setChecked(True) if config.setting["id3v2_encoding"] == "iso-8859-1": self.ui.enc_iso88591.setChecked(True) elif config.setting["id3v2_encoding"] == "utf-16": self.ui.enc_utf16.setChecked(True) else: self.ui.enc_utf8.setChecked(True) self.ui.id3v23_join_with.setEditText(config.setting["id3v23_join_with"]) self.ui.itunes_compatible_grouping.setChecked(config.setting["itunes_compatible_grouping"]) if config.setting["aac_save_ape"]: self.ui.aac_save_ape.setChecked(True) else: self.ui.aac_no_tags.setChecked(True) self.ui.remove_ape_from_aac.setChecked(config.setting["remove_ape_from_aac"]) self.ui.remove_ape_from_aac.setEnabled(not config.setting["aac_save_ape"]) if config.setting["ac3_save_ape"]: self.ui.ac3_save_ape.setChecked(True) else: self.ui.ac3_no_tags.setChecked(True) self.ui.remove_ape_from_ac3.setChecked(config.setting["remove_ape_from_ac3"]) self.ui.remove_ape_from_ac3.setEnabled(not config.setting["ac3_save_ape"]) self.update_encodings() def save(self): config.setting["write_id3v1"] = self.ui.write_id3v1.isChecked() config.setting["write_id3v23"] = self.ui.write_id3v23.isChecked() config.setting["id3v23_join_with"] = self.ui.id3v23_join_with.currentText() if self.ui.enc_iso88591.isChecked(): config.setting["id3v2_encoding"] = "iso-8859-1" elif self.ui.enc_utf16.isChecked(): config.setting["id3v2_encoding"] = "utf-16" else: config.setting["id3v2_encoding"] = "utf-8" config.setting["itunes_compatible_grouping"] = self.ui.itunes_compatible_grouping.isChecked() config.setting["aac_save_ape"] = self.ui.aac_save_ape.isChecked() config.setting["remove_ape_from_aac"] = self.ui.remove_ape_from_aac.isChecked() config.setting["ac3_save_ape"] = self.ui.ac3_save_ape.isChecked() config.setting["remove_ape_from_ac3"] = self.ui.remove_ape_from_ac3.isChecked() def update_encodings(self, force_utf8=False): if self.ui.write_id3v23.isChecked(): if self.ui.enc_utf8.isChecked(): self.ui.enc_utf16.setChecked(True) self.ui.enc_utf8.setEnabled(False) self.ui.label_id3v23_join_with.setEnabled(True) self.ui.id3v23_join_with.setEnabled(True) else: self.ui.enc_utf8.setEnabled(True) if force_utf8: self.ui.enc_utf8.setChecked(True) self.ui.label_id3v23_join_with.setEnabled(False) self.ui.id3v23_join_with.setEnabled(False) register_options_page(TagsCompatibilityOptionsPage) picard-release-2.3.1/picard/ui/passworddialog.py000066400000000000000000000056261362601763300216700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2008 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2012, 2014 Lukáš Lalinský # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2013-2014, 2018 Laurent Monin # Copyright (C) 2014 Sophist-UK # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.ui import PicardDialog from picard.ui.ui_passworddialog import Ui_PasswordDialog class PasswordDialog(PicardDialog): def __init__(self, authenticator, reply, parent=None): super().__init__(parent) self._authenticator = authenticator self.ui = Ui_PasswordDialog() self.ui.setupUi(self) self.ui.info_text.setText( _("The server %s requires you to login. Please enter your username and password.") % reply.url().host()) self.ui.username.setText(reply.url().userName()) self.ui.password.setText(reply.url().password()) self.ui.buttonbox.accepted.connect(self.set_new_password) def set_new_password(self): self._authenticator.setUser(self.ui.username.text()) self._authenticator.setPassword(self.ui.password.text()) self.accept() class ProxyDialog(PicardDialog): def __init__(self, authenticator, proxy, parent=None): super().__init__(parent) self._authenticator = authenticator self._proxy = proxy self.ui = Ui_PasswordDialog() self.ui.setupUi(self) self.ui.info_text.setText(_("The proxy %s requires you to login. Please enter your username and password.") % config.setting["proxy_server_host"]) self.ui.username.setText(config.setting["proxy_username"]) self.ui.password.setText(config.setting["proxy_password"]) self.ui.buttonbox.accepted.connect(self.set_proxy_password) def set_proxy_password(self): config.setting["proxy_username"] = self.ui.username.text() config.setting["proxy_password"] = self.ui.password.text() self._authenticator.setUser(self.ui.username.text()) self._authenticator.setPassword(self.ui.password.text()) self.accept() picard-release-2.3.1/picard/ui/playertoolbar.py000066400000000000000000000407241362601763300215230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Laurent Monin # Copyright (C) 2019 Philipp Wolfer # Copyright (C) 2019 Timur Enikeev # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import ( config, log, ) from picard.const.sys import IS_MACOS from picard.util import ( format_time, icontheme, ) from picard.ui.widgets import ( ClickableSlider, ElidedLabel, SliderPopover, ) try: from PyQt5 import QtMultimedia except ImportError as e: qt_multimedia_available = False qt_multimedia_errmsg = e.msg else: qt_multimedia_available = True def get_logarithmic_volume(player_value): """Return logarithmic scale volume to set slider position""" logarithmic_volume = QtMultimedia.QAudio.convertVolume( player_value / 100., QtMultimedia.QAudio.LinearVolumeScale, QtMultimedia.QAudio.LogarithmicVolumeScale) return QtCore.qRound(logarithmic_volume * 100) def get_linear_volume(slider_value): """Return linear scale volume from slider position""" linear_volume = QtMultimedia.QAudio.convertVolume( slider_value / 100., QtMultimedia.QAudio.LogarithmicVolumeScale, QtMultimedia.QAudio.LinearVolumeScale) return QtCore.qRound(linear_volume * 100) def get_text_width(font, text): metrics = QtGui.QFontMetrics(font) size = metrics.size(QtCore.Qt.TextSingleLine, text) return size.width() class Player(QtCore.QObject): error = QtCore.pyqtSignal(object, str) def __init__(self, parent): super().__init__(parent) self._player = None self._toolbar = None self._selected_objects = [] if qt_multimedia_available: log.debug('Internal player: QtMultimedia available, initializing QMediaPlayer') player = QtMultimedia.QMediaPlayer(parent) player.setAudioRole(QtMultimedia.QAudio.MusicRole) self.state_changed = player.stateChanged self._logarithmic_volume = get_logarithmic_volume(player.volume()) availability = player.availability() if availability == QtMultimedia.QMultimedia.Available: log.debug('Internal player: available, QMediaPlayer set up') self._player = player self._player.error.connect(self._on_error) elif availability == QtMultimedia.QMultimedia.ServiceMissing: log.warning("Internal player: unavailable, service is missing") else: log.warning("Internal player: unavailable, status=%d", availability) else: log.warning("Internal player: unavailable, %s", qt_multimedia_errmsg) @property def available(self): return self._player is not None @property def toolbar(self): return self._toolbar def volume(self): return self._logarithmic_volume def playback_rate(self): return self._player.playbackRate() def create_toolbar(self): self._toolbar = PlayerToolbar(self.parent(), self) return self._toolbar def set_objects(self, objects): self._selected_objects = objects self._toolbar.play_action.setEnabled(bool(objects)) def play(self): """Play selected tracks with an internal player""" self._player.stop() playlist = QtMultimedia.QMediaPlaylist(self) playlist.setPlaybackMode(QtMultimedia.QMediaPlaylist.Sequential) playlist.addMedia([QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(file.filename)) for file in self.tagger.get_files_from_objects(self._selected_objects)]) self._player.setPlaylist(playlist) self._player.play() def pause(self, is_paused): """Toggle pause of an internal player""" if is_paused: self._player.pause() else: self._player.play() def set_volume(self, logarithmic_volume): """Convert to linear scale and set""" self._logarithmic_volume = logarithmic_volume self._player.setVolume(get_linear_volume(logarithmic_volume)) def set_position(self, position): self._player.setPosition(position) def set_playback_rate(self, playback_rate): player = self._player player.setPlaybackRate(playback_rate) if not IS_MACOS: # Playback rate changes do not affect the current media playback on # Linux and does work unreliable on Windows. # Force playback restart to have the rate change applied immediately. player_state = player.state() if player_state != QtMultimedia.QMediaPlayer.StoppedState: position = player.position() player.stop() player.setPosition(position) if player_state == QtMultimedia.QMediaPlayer.PlayingState: player.play() elif player_state == QtMultimedia.QMediaPlayer.PausedState: player.pause() def _on_error(self, error): if error == QtMultimedia.QMediaPlayer.FormatError: msg = _("Internal player: The format of a media resource isn't (fully) supported") elif error == QtMultimedia.QMediaPlayer.AccessDeniedError: msg = _("Internal player: There are not the appropriate permissions to play a media resource") elif error == QtMultimedia.QMediaPlayer.ServiceMissingError: msg = _("Internal player: A valid playback service was not found, playback cannot proceed") else: msg = _("Internal player: error, code=%d, msg=%s") % (error, self._player.errorString()) self.error.emit(error, msg) class PlayerToolbar(QtWidgets.QToolBar): def __init__(self, parent, player): super().__init__(_("Player"), parent) self.setObjectName("player_toolbar") self.setAllowedAreas(QtCore.Qt.TopToolBarArea | QtCore.Qt.BottomToolBarArea | QtCore.Qt.NoToolBarArea) self.player = player self.play_action = QtWidgets.QAction(icontheme.lookup('play'), _("Play"), self) play_tip = _("Play selected files") self.play_action.setToolTip(play_tip) self.play_action.setStatusTip(play_tip) self.play_action.setEnabled(False) self.play_action.triggered.connect(self.play) self.pause_action = QtWidgets.QAction(icontheme.lookup('pause'), _("Pause"), self) pause_tip = _("Pause or resume current playback") self.pause_action.setToolTip(pause_tip) self.pause_action.setStatusTip(pause_tip) self.pause_action.setCheckable(True) self.pause_action.setChecked(False) self.pause_action.setEnabled(False) self.pause_action.triggered.connect(self.player.pause) self.player.state_changed.connect(self.pause_action.setEnabled) self._add_toolbar_action(self.play_action) self._add_toolbar_action(self.pause_action) self.progress_widget = PlaybackProgressSlider(self, self.player) self.addWidget(self.progress_widget) volume = config.persist["mediaplayer_volume"] self.player.set_volume(volume) self.volume_button = VolumeControlButton(self, volume) self.volume_button.volume_changed.connect(self.player.set_volume) self.volume_button.setToolButtonStyle(self.toolButtonStyle()) self.addWidget(self.volume_button) playback_rate = config.persist["mediaplayer_playback_rate"] self.player.set_playback_rate(playback_rate) self.playback_rate_button = PlaybackRateButton(self, playback_rate) self.playback_rate_button.playback_rate_changed.connect(self.player.set_playback_rate) self.playback_rate_button.setToolButtonStyle(self.toolButtonStyle()) self.addWidget(self.playback_rate_button) def _add_toolbar_action(self, action): self.addAction(action) widget = self.widgetForAction(action) widget.setFocusPolicy(QtCore.Qt.TabFocus) widget.setAttribute(QtCore.Qt.WA_MacShowFocusRect) def play(self): self.player.play() self.pause_action.setChecked(False) def setToolButtonStyle(self, style): super().setToolButtonStyle(style) self.playback_rate_button.setToolButtonStyle(style) self.volume_button.setToolButtonStyle(style) def showEvent(self, event): super().showEvent(event) self._update_popover_position() def _update_popover_position(self): popover_position = self._get_popover_position() self.playback_rate_button.popover_position = popover_position self.volume_button.popover_position = popover_position def _get_popover_position(self): if self.isFloating(): return 'bottom' pos = self.mapToParent(QtCore.QPoint(0, 0)) half_main_window_height = self.parent().height() / 2 if pos.y() <= half_main_window_height: return 'bottom' else: return 'top' class PlaybackProgressSlider(QtWidgets.QWidget): def __init__(self, parent, player): super().__init__(parent) self.player = player self._position_update = False tool_font = QtWidgets.QApplication.font("QToolButton") self.progress_slider = ClickableSlider(self) self.progress_slider.setOrientation(QtCore.Qt.Horizontal) self.progress_slider.setEnabled(False) self.progress_slider.setMinimumWidth(30) self.progress_slider.setSingleStep(1000) self.progress_slider.setPageStep(3000) self.progress_slider.valueChanged.connect(self.on_value_changed) self.media_name_label = ElidedLabel(self) self.media_name_label.setAlignment(QtCore.Qt.AlignCenter) self.media_name_label.setFont(tool_font) slider_container = QtWidgets.QWidget(self) hbox = QtWidgets.QHBoxLayout(slider_container) hbox.setContentsMargins(0, 0, 0, 0) self.position_label = QtWidgets.QLabel("0:00", self) self.duration_label = QtWidgets.QLabel(format_time(0), self) min_duration_width = get_text_width(self.position_label.font(), "8:88") self.position_label.setMinimumWidth(min_duration_width) self.duration_label.setMinimumWidth(min_duration_width) self.position_label.setFont(tool_font) self.duration_label.setFont(tool_font) hbox.addWidget(self.position_label) hbox.addWidget(self.progress_slider) hbox.addWidget(self.duration_label) vbox = QtWidgets.QVBoxLayout(self) vbox.setSpacing(0) vbox.addWidget(slider_container) vbox.addWidget(self.media_name_label) self.player._player.durationChanged.connect(self.on_duration_changed) self.player._player.positionChanged.connect(self.on_position_changed) self.player._player.currentMediaChanged.connect(self.on_media_changed) def on_duration_changed(self, duration): self.progress_slider.setMaximum(duration) self.duration_label.setText(format_time(duration)) def on_position_changed(self, position): self._position_update = True self.progress_slider.setValue(position) self._position_update = False self.position_label.setText(format_time(position, display_zero=True)) def on_media_changed(self, media): if media.isNull(): self.progress_slider.setEnabled(False) else: url = media.canonicalUrl().toString() self.media_name_label.setText(os.path.basename(url)) self.progress_slider.setEnabled(True) def on_value_changed(self, value): if not self._position_update: # Avoid circular events self.player.set_position(value) class PlaybackRateButton(QtWidgets.QToolButton): playback_rate_changed = QtCore.pyqtSignal(float) multiplier = 10.0 def __init__(self, parent, playback_rate): super().__init__(parent) self.popover_position = 'bottom' self.rate_fmt = N_('%1.1f ×') button_margin = self.style().pixelMetric(QtWidgets.QStyle.PM_ButtonMargin) min_width = get_text_width(self.font(), _(self.rate_fmt) % 8.8) self.setMinimumWidth(min_width + (2 * button_margin) + 2) self.set_playback_rate(playback_rate) self.clicked.connect(self.show_popover) tooltip = _('Change playback speed') self.setToolTip(tooltip) self.setStatusTip(tooltip) def show_popover(self): slider_value = self.playback_rate * self.multiplier popover = SliderPopover( self, self.popover_position, _('Playback speed'), slider_value) # In 0.1 steps from 0.5 to 1.5 popover.slider.setMinimum(5) popover.slider.setMaximum(15) popover.slider.setSingleStep(1) popover.slider.setPageStep(1) popover.slider.setTickInterval(1) popover.slider.setTickPosition(QtWidgets.QSlider.TicksBelow) popover.value_changed.connect(self.on_slider_value_changed) popover.show() def on_slider_value_changed(self, value): playback_rate = value / self.multiplier self.set_playback_rate(playback_rate) self.playback_rate_changed.emit(self.playback_rate) def set_playback_rate(self, playback_rate): self.playback_rate = playback_rate label = _(self.rate_fmt) % playback_rate self.setText(label) def wheelEvent(self, event): delta = event.angleDelta().y() # Incrementing repeatedly in 0.1 steps would cause floating point # rounding issues. Do the calculation in whole numbers to prevent this. new_rate = int(self.playback_rate * 10) if delta > 0: new_rate += 1 elif delta < 0: new_rate -= 1 new_rate = min(max(new_rate, 5), 15) / 10.0 if new_rate != self.playback_rate: self.set_playback_rate(new_rate) self.playback_rate_changed.emit(new_rate) class VolumeControlButton(QtWidgets.QToolButton): volume_changed = QtCore.pyqtSignal(int) def __init__(self, parent, volume): super().__init__(parent) self.popover_position = 'bottom' self.step = 3 self.volume_fmt = N_('%d%%') self.set_volume(volume) button_margin = self.style().pixelMetric(QtWidgets.QStyle.PM_ButtonMargin) min_width = get_text_width(self.font(), _(self.volume_fmt) % 888) self.setMinimumWidth(min_width + (2 * button_margin) + 2) self.clicked.connect(self.show_popover) tooltip = _('Change audio volume') self.setToolTip(tooltip) self.setStatusTip(tooltip) def show_popover(self): popover = SliderPopover( self, self.popover_position, _('Audio volume'), self.volume) popover.slider.setMinimum(0) popover.slider.setMaximum(100) popover.slider.setPageStep(self.step) popover.value_changed.connect(self.on_slider_value_changed) popover.show() def on_slider_value_changed(self, value): self.set_volume(value) self.volume_changed.emit(self.volume) def set_volume(self, volume): self.volume = volume label = _(self.volume_fmt) % volume self.setText(label) self.update_icon() def update_icon(self): if self.volume == 0: icon = 'speaker-0' elif self.volume <= 33: icon = 'speaker-33' elif self.volume <= 66: icon = 'speaker-66' else: icon = 'speaker-100' icon = icontheme.lookup(icon) self.setIcon(icon) def wheelEvent(self, event): delta = event.angleDelta().y() volume = self.volume if delta > 0: volume += self.step elif delta < 0: volume -= self.step volume = min(max(volume, 0), 100) if volume != self.volume: self.set_volume(volume) self.volume_changed.emit(volume) picard-release-2.3.1/picard/ui/ratingwidget.py000066400000000000000000000076521362601763300213370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2008, 2018-2019 Philipp Wolfer # Copyright (C) 2011, 2013 Michael Wiencek # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard import config class RatingWidget(QtWidgets.QWidget): def __init__(self, parent, track): super().__init__(parent) self._track = track self._maximum = config.setting["rating_steps"] - 1 try: self._rating = int(track.metadata["~rating"] or 0) except ValueError: self._rating = 0 self._highlight = 0 self._star_pixmap = QtGui.QPixmap(":/images/star.png") self._star_gray_pixmap = QtGui.QPixmap(":/images/star-gray.png") self._star_size = 16 self._star_spacing = 2 self._offset = 16 self._width = self._maximum * (self._star_size + self._star_spacing) + self._offset self._height = self._star_size + 6 self.setMaximumSize(self._width, self._height) self.setMinimumSize(self._width, self._height) self.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)) self.setMouseTracking(True) def sizeHint(self): return QtCore.QSize(self._width, self._height) def _setHighlight(self, highlight): assert 0 <= highlight <= self._maximum if highlight != self._highlight: self._highlight = highlight self.update() def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: x = event.x() if x < self._offset: return rating = self._getRatingFromPosition(x) if self._rating == rating: rating = 0 self._rating = rating self._update_track() self.update() event.accept() def mouseMoveEvent(self, event): self._setHighlight(self._getRatingFromPosition(event.x())) event.accept() def leaveEvent(self, event): self._setHighlight(0) event.accept() def _getRatingFromPosition(self, position): rating = int((position - self._offset) / (self._star_size + self._star_spacing)) + 1 if rating > self._maximum: rating = self._maximum return rating def _update_track(self): track = self._track rating = str(self._rating) track.metadata["~rating"] = rating for file in track.linked_files: file.metadata["~rating"] = rating if config.setting["submit_ratings"]: ratings = {("recording", track.id): self._rating} self.tagger.mb_api.submit_ratings(ratings, None) def paintEvent(self, event=None): painter = QtGui.QPainter(self) offset = self._offset for i in range(1, self._maximum + 1): if i <= self._rating or i <= self._highlight: pixmap = self._star_pixmap else: pixmap = self._star_gray_pixmap painter.drawPixmap(offset, 3, pixmap) offset += self._star_size + self._star_spacing picard-release-2.3.1/picard/ui/scriptsmenu.py000066400000000000000000000055551362601763300212230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018 Philipp Wolfer # Copyright (C) 2018 Yvan Rivière # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import QtWidgets from picard import log from picard.album import Album from picard.cluster import ( Cluster, ClusterList, ) from picard.script import ( ScriptError, ScriptParser, ) from picard.track import Track from picard.util import uniqify class ScriptsMenu(QtWidgets.QMenu): def __init__(self, scripts, *args): super().__init__(*args) for script in scripts: action = self.addAction(script[1]) action.triggered.connect(partial(self._run_script, script)) def _run_script(self, script): s_name = script[1] s_text = script[3] parser = ScriptParser() for obj in self._get_unique_metadata_objects(): try: parser.eval(s_text, obj.metadata) obj.update() except ScriptError as e: log.exception('Error running tagger script "%s" on object %r', s_name, obj) msg = N_('Script error in "%(script)s": %(message)s') mparms = { 'script': s_name, 'message': str(e), } self.tagger.window.set_statusbar_message(msg, mparms) def _get_unique_metadata_objects(self): objs = self._get_metadata_objects(self.tagger.window.selected_objects) return uniqify(objs) def _get_metadata_objects(self, objs): for obj in objs: if hasattr(obj, 'metadata'): yield obj if isinstance(obj, Cluster): yield from self._get_metadata_objects(obj.files) if isinstance(obj, ClusterList): yield from self._get_metadata_objects(obj) if isinstance(obj, Album): yield from self._get_metadata_objects(obj.tracks) yield from self._get_metadata_objects(obj.unmatched_files.iterfiles()) if isinstance(obj, Track): yield from self._get_metadata_objects(obj.linked_files) picard-release-2.3.1/picard/ui/searchdialog/000077500000000000000000000000001362601763300207105ustar00rootroot00000000000000picard-release-2.3.1/picard/ui/searchdialog/__init__.py000066400000000000000000000377151362601763300230360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2018-2019 Laurent Monin # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import ( OrderedDict, namedtuple, ) from PyQt5 import ( QtCore, QtGui, QtNetwork, QtWidgets, ) from PyQt5.QtCore import pyqtSignal from picard import ( config, log, ) from picard.util import ( icontheme, natsort, restore_method, throttle, ) from picard.ui import PicardDialog from picard.ui.util import StandardButton class ResultTable(QtWidgets.QTableWidget): def __init__(self, parent): super().__init__(parent) self.setSelectionMode( QtWidgets.QAbstractItemView.ExtendedSelection) self.setSelectionBehavior( QtWidgets.QAbstractItemView.SelectRows) self.setEditTriggers( QtWidgets.QAbstractItemView.NoEditTriggers) self.horizontalHeader().setStretchLastSection(True) self.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Stretch) self.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Interactive) @throttle(1000) # only emit scrolled signal once per second def emit_scrolled(x): parent.scrolled.emit() self.horizontalScrollBar().valueChanged.connect(emit_scrolled) self.verticalScrollBar().valueChanged.connect(emit_scrolled) self.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel) def prepare(self, headers): self.clear() self.setColumnCount(len(headers)) self.setHorizontalHeaderLabels(headers) self.setRowCount(0) self.setSortingEnabled(False) class SearchBox(QtWidgets.QWidget): def __init__(self, parent): super().__init__(parent) self.search_action = QtWidgets.QAction(icontheme.lookup('system-search'), _("Search"), self) self.search_action.setEnabled(False) self.search_action.triggered.connect(self.search) self.setupUi() def focus_in_event(self, event): # When focus is on search edit box, need to disable # dialog's accept button. This would avoid closing of dialog when user # hits enter. parent = self.parent() if parent.table: parent.table.clearSelection() parent.accept_button.setEnabled(False) def setupUi(self): self.layout = QtWidgets.QVBoxLayout(self) self.search_row_widget = QtWidgets.QWidget(self) self.search_row_layout = QtWidgets.QHBoxLayout(self.search_row_widget) self.search_row_layout.setContentsMargins(1, 1, 1, 1) self.search_row_layout.setSpacing(1) self.search_edit = QtWidgets.QLineEdit(self.search_row_widget) self.search_edit.setClearButtonEnabled(True) self.search_edit.returnPressed.connect(self.trigger_search_action) self.search_edit.textChanged.connect(self.enable_search) self.search_edit.setFocusPolicy(QtCore.Qt.StrongFocus) self.search_edit.focusInEvent = self.focus_in_event self.search_row_layout.addWidget(self.search_edit) self.search_button = QtWidgets.QToolButton(self.search_row_widget) self.search_button.setAutoRaise(True) self.search_button.setDefaultAction(self.search_action) self.search_button.setIconSize(QtCore.QSize(22, 22)) self.search_row_layout.addWidget(self.search_button) self.search_row_widget.setLayout(self.search_row_layout) self.layout.addWidget(self.search_row_widget) self.adv_opt_row_widget = QtWidgets.QWidget(self) self.adv_opt_row_layout = QtWidgets.QHBoxLayout(self.adv_opt_row_widget) self.adv_opt_row_layout.setAlignment(QtCore.Qt.AlignLeft) self.adv_opt_row_layout.setContentsMargins(1, 1, 1, 1) self.adv_opt_row_layout.setSpacing(1) self.use_adv_search_syntax = QtWidgets.QCheckBox(self.adv_opt_row_widget) self.use_adv_search_syntax.setText(_("Use advanced query syntax")) self.use_adv_search_syntax.stateChanged.connect(self.update_advanced_syntax_setting) self.adv_opt_row_layout.addWidget(self.use_adv_search_syntax) self.adv_syntax_help = QtWidgets.QLabel(self.adv_opt_row_widget) self.adv_syntax_help.setOpenExternalLinks(True) self.adv_syntax_help.setText(_( " (" "Syntax Help)")) self.adv_opt_row_layout.addWidget(self.adv_syntax_help) self.adv_opt_row_widget.setLayout(self.adv_opt_row_layout) self.layout.addWidget(self.adv_opt_row_widget) self.layout.setContentsMargins(1, 1, 1, 1) self.layout.setSpacing(1) self.setMaximumHeight(60) def search(self): self.parent().search(self.query) def restore_checkbox_state(self): self.use_adv_search_syntax.setChecked(config.setting["use_adv_search_syntax"]) def update_advanced_syntax_setting(self): config.setting["use_adv_search_syntax"] = self.use_adv_search_syntax.isChecked() def enable_search(self): if self.query: self.search_action.setEnabled(True) else: self.search_action.setEnabled(False) def trigger_search_action(self): if self.search_action.isEnabled(): self.search_action.trigger() def get_query(self): return self.search_edit.text() def set_query(self, query): return self.search_edit.setText(query) query = property(get_query, set_query) Retry = namedtuple("Retry", ["function", "query"]) class SortableTableWidgetItem(QtWidgets.QTableWidgetItem): def __init__(self, sort_key): super().__init__() self.sort_key = sort_key def __lt__(self, other): return self.sort_key < other.sort_key class SearchDialog(PicardDialog): defaultsize = QtCore.QSize(720, 360) autorestore = False scrolled = pyqtSignal() def __init__(self, parent, accept_button_title, show_search=True, search_type=None): super().__init__(parent) self.search_results = [] self.show_search = show_search self.search_type = search_type self.search_box = None self.setupUi(accept_button_title) self.restore_state() # self.columns has to be an ordered dict, with column name as keys, and # matching label as values self.columns = None self.sorting_enabled = True self.create_table() self.finished.connect(self.save_state) @property def columns(self): return self.__columns @columns.setter def columns(self, list_of_tuples): if not list_of_tuples: list_of_tuples = [] self.__columns = OrderedDict(list_of_tuples) self.__colkeys = list(self.columns.keys()) @property def table_headers(self): return list(self.columns.values()) def colpos(self, colname): return self.__colkeys.index(colname) def set_table_item(self, row, colname, obj, key, default="", sortkey=None): # QVariant remembers the original type of the data # matching comparison operator will be used when sorting # get() will return a string, force conversion if asked to value = obj.get(key, default) if sortkey is None: sortkey = natsort.natkey(value) item = SortableTableWidgetItem(sortkey) item.setData(QtCore.Qt.DisplayRole, value) pos = self.colpos(colname) if pos == 0: item.setData(QtCore.Qt.UserRole, row) self.table.setItem(row, pos, item) def setupUi(self, accept_button_title): self.verticalLayout = QtWidgets.QVBoxLayout(self) self.verticalLayout.setObjectName("vertical_layout") if self.show_search: self.search_box = SearchBox(self) self.search_box.setObjectName("search_box") self.verticalLayout.addWidget(self.search_box) self.center_widget = QtWidgets.QWidget(self) self.center_widget.setObjectName("center_widget") self.center_layout = QtWidgets.QVBoxLayout(self.center_widget) self.center_layout.setObjectName("center_layout") self.center_layout.setContentsMargins(1, 1, 1, 1) self.center_widget.setLayout(self.center_layout) self.verticalLayout.addWidget(self.center_widget) self.buttonBox = QtWidgets.QDialogButtonBox(self) if self.show_search and self.search_type: self.search_browser_button = QtWidgets.QPushButton( _("Search in browser"), self.buttonBox) self.buttonBox.addButton( self.search_browser_button, QtWidgets.QDialogButtonBox.ActionRole) self.search_browser_button.clicked.connect(self.search_browser) self.accept_button = QtWidgets.QPushButton( accept_button_title, self.buttonBox) self.accept_button.setEnabled(False) self.buttonBox.addButton( self.accept_button, QtWidgets.QDialogButtonBox.AcceptRole) self.buttonBox.addButton( StandardButton(StandardButton.CANCEL), QtWidgets.QDialogButtonBox.RejectRole) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.verticalLayout.addWidget(self.buttonBox) def add_widget_to_center_layout(self, widget): """Update center widget with new child. If child widget exists, schedule it for deletion.""" widget_item = self.center_layout.takeAt(0) if widget_item: current_widget = widget_item.widget() current_widget.hide() self.center_layout.removeWidget(current_widget) if current_widget != self.table: current_widget.deleteLater() self.center_layout.addWidget(widget) widget.show() def show_progress(self): progress_widget = QtWidgets.QWidget(self) progress_widget.setObjectName("progress_widget") layout = QtWidgets.QVBoxLayout(progress_widget) text_label = QtWidgets.QLabel(_('Loading...'), progress_widget) text_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom) gif_label = QtWidgets.QLabel(progress_widget) movie = QtGui.QMovie(":/images/loader.gif") gif_label.setMovie(movie) movie.start() gif_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop) layout.addWidget(text_label) layout.addWidget(gif_label) layout.setContentsMargins(1, 1, 1, 1) progress_widget.setLayout(layout) self.add_widget_to_center_layout(progress_widget) def show_error(self, error, show_retry_button=False): """Display the error string. Args: error -- Error string show_retry_button -- Whether to display retry button or not """ error_widget = QtWidgets.QWidget(self) error_widget.setObjectName("error_widget") layout = QtWidgets.QVBoxLayout(error_widget) error_label = QtWidgets.QLabel(error, error_widget) error_label.setWordWrap(True) error_label.setAlignment(QtCore.Qt.AlignCenter) error_label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) layout.addWidget(error_label) if show_retry_button: retry_widget = QtWidgets.QWidget(error_widget) retry_layout = QtWidgets.QHBoxLayout(retry_widget) retry_button = QtWidgets.QPushButton(_("Retry"), error_widget) retry_button.clicked.connect(self.retry) retry_button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed)) retry_layout.addWidget(retry_button) retry_layout.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop) retry_widget.setLayout(retry_layout) layout.addWidget(retry_widget) error_widget.setLayout(layout) self.add_widget_to_center_layout(error_widget) def create_table(self): self.table = ResultTable(self) self.table.verticalHeader().setDefaultSectionSize(100) self.table.setSortingEnabled(False) self.table.cellDoubleClicked.connect(self.accept) self.table.hide() def enable_accept_button(): self.accept_button.setEnabled(True) self.table.itemSelectionChanged.connect( enable_accept_button) def prepare_table(self): self.table.prepare(self.table_headers) self.restore_table_header_state() def show_table(self, sort_column=None, sort_order=QtCore.Qt.DescendingOrder): self.add_widget_to_center_layout(self.table) self.table.horizontalHeader().setSortIndicatorShown(self.sorting_enabled) self.table.setSortingEnabled(self.sorting_enabled) if self.sorting_enabled and sort_column: self.table.sortItems(self.colpos(sort_column), sort_order) self.table.resizeColumnsToContents() self.table.resizeRowsToContents() self.table.setAlternatingRowColors(True) def network_error(self, reply, error): error_msg = _("Following error occurred while fetching results:

" "Network request error for %s:
%s (QT code %d, HTTP code %s)
") % ( reply.request().url().toString(QtCore.QUrl.RemoveUserInfo), reply.errorString(), error, repr(reply.attribute( QtNetwork.QNetworkRequest.HttpStatusCodeAttribute)) ) self.show_error(error_msg, show_retry_button=True) def no_results_found(self): error_msg = _("No results found. Please try a different search query.") self.show_error(error_msg) def search_browser(self): self.tagger.search(self.search_box.query, self.search_type, adv=config.setting["use_adv_search_syntax"], force_browser=True) def accept(self): if self.table: selected_rows = [] for idx in self.table.selectionModel().selectedRows(): row = self.table.itemFromIndex(idx).data(QtCore.Qt.UserRole) selected_rows.append(row) self.accept_event(selected_rows) super().accept() @restore_method def restore_state(self): self.restore_geometry() if self.show_search: self.search_box.restore_checkbox_state() @restore_method def restore_table_header_state(self): header = self.table.horizontalHeader() state = config.persist[self.dialog_header_state] if state: header.restoreState(state) header.setSectionResizeMode(QtWidgets.QHeaderView.Interactive) log.debug("restore_state: %s" % self.dialog_header_state) def save_state(self): if self.table: self.save_table_header_state() def save_table_header_state(self): state = self.table.horizontalHeader().saveState() config.persist[self.dialog_header_state] = state log.debug("save_state: %s" % self.dialog_header_state) def search_box_text(self, text): if self.search_box: self.search_box.query = text picard-release-2.3.1/picard/ui/searchdialog/album.py000066400000000000000000000310241362601763300223620ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2018-2019 Laurent Monin # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from PyQt5.QtCore import pyqtSignal from picard import ( config, log, ) from picard.const import ( CAA_HOST, CAA_PORT, QUERY_LIMIT, ) from picard.coverart.image import CaaThumbnailCoverArtImage from picard.mbjson import ( countries_from_node, media_formats_from_node, release_group_to_metadata, release_to_metadata, ) from picard.metadata import Metadata from picard.webservice.api_helpers import escape_lucene_query from picard.ui.searchdialog import ( Retry, SearchDialog, ) class CoverWidget(QtWidgets.QWidget): shown = pyqtSignal() def __init__(self, parent, width=100, height=100): super().__init__(parent) self.layout = QtWidgets.QVBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setAlignment(QtCore.Qt.AlignCenter) self.loading_gif_label = QtWidgets.QLabel(self) self.loading_gif_label.setAlignment(QtCore.Qt.AlignCenter) loading_gif = QtGui.QMovie(":/images/loader.gif") self.loading_gif_label.setMovie(loading_gif) loading_gif.start() self.layout.addWidget(self.loading_gif_label) self.__sizehint = self.__size = QtCore.QSize(width, height) self.setStyleSheet("padding: 0") def set_pixmap(self, pixmap): wid = self.layout.takeAt(0) if wid: wid.widget().deleteLater() cover_label = QtWidgets.QLabel(self) pixmap = pixmap.scaled(self.__size, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) self.__sizehint = pixmap.size() cover_label.setPixmap(pixmap) self.layout.addWidget(cover_label) def not_found(self): """Update the widget with a blank image.""" shadow = QtGui.QPixmap(":/images/CoverArtShadow.png") self.set_pixmap(shadow) def sizeHint(self): return self.__sizehint def showEvent(self, event): super().showEvent(event) self.shown.emit() class CoverCell: def __init__(self, parent, release, row, colname, on_show=None): self.parent = parent self.release = release self.fetched = False self.fetch_task = None self.row = row self.column = self.parent.colpos(colname) widget = CoverWidget(self.parent.table) if on_show is not None: widget.shown.connect(partial(on_show, self)) self.parent.table.setCellWidget(row, self.column, widget) def widget(self): if not self.parent.table: return None return self.parent.table.cellWidget(self.row, self.column) def is_visible(self): widget = self.widget() if not widget: return False return not widget.visibleRegion().isEmpty() def set_pixmap(self, pixmap): widget = self.widget() if widget: widget.set_pixmap(pixmap) def not_found(self): widget = self.widget() if widget: widget.not_found() class AlbumSearchDialog(SearchDialog): dialog_header_state = "albumsearchdialog_header_state" options = [ config.Option("persist", dialog_header_state, QtCore.QByteArray()) ] def __init__(self, parent): super().__init__( parent, accept_button_title=_("Load into Picard"), search_type="album") self.cluster = None self.setWindowTitle(_("Album Search Results")) self.columns = [ ('name', _("Name")), ('artist', _("Artist")), ('format', _("Format")), ('tracks', _("Tracks")), ('date', _("Date")), ('country', _("Country")), ('labels', _("Labels")), ('catnums', _("Catalog #s")), ('barcode', _("Barcode")), ('language', _("Language")), ('type', _("Type")), ('status', _("Status")), ('cover', _("Cover")), ('score', _("Score")), ] self.cover_cells = [] self.fetching = False self.scrolled.connect(self.fetch_coverarts) def search(self, text): """Perform search using query provided by the user.""" self.retry_params = Retry(self.search, text) self.search_box_text(text) self.show_progress() self.tagger.mb_api.find_releases(self.handle_reply, query=text, search=True, limit=QUERY_LIMIT) def show_similar_albums(self, cluster): """Perform search by using existing metadata information from the cluster as query.""" self.retry_params = Retry(self.show_similar_albums, cluster) self.cluster = cluster metadata = cluster.metadata query = { "artist": metadata["albumartist"], "release": metadata["album"], "tracks": str(len(cluster.files)) } # Generate query to be displayed to the user (in search box). # If advanced query syntax setting is enabled by user, display query in # advanced syntax style. Otherwise display only album title. if config.setting["use_adv_search_syntax"]: query_str = ' '.join(['%s:(%s)' % (item, escape_lucene_query(value)) for item, value in query.items() if value]) else: query_str = query["release"] query["limit"] = QUERY_LIMIT self.search_box_text(query_str) self.show_progress() self.tagger.mb_api.find_releases( self.handle_reply, **query) def retry(self): self.retry_params.function(self.retry_params.query) def handle_reply(self, document, http, error): if error: self.network_error(http, error) return try: releases = document['releases'] except (KeyError, TypeError): self.no_results_found() return del self.search_results[:] self.parse_releases(releases) self.display_results() self.fetch_coverarts() def fetch_coverarts(self): if self.fetching: return self.fetching = True for cell in self.cover_cells: self.fetch_coverart(cell) self.fetching = False def fetch_coverart(self, cell): """Queue cover art jsons from CAA server for each album in search results. """ if cell.fetched: return if not cell.is_visible(): return cell.fetched = True caa_path = "/release/%s" % cell.release["musicbrainz_albumid"] cell.fetch_task = self.tagger.webservice.get( CAA_HOST, CAA_PORT, caa_path, partial(self._caa_json_downloaded, cell) ) def _caa_json_downloaded(self, cover_cell, data, http, error): """Handle json reply from CAA server. If server replies without error, try to get small thumbnail of front coverart of the release. """ cover_cell.fetch_task = None if error: cover_cell.not_found() return front = None try: for image in data["images"]: if image["front"]: front = image break if front: url = front["thumbnails"]["small"] coverartimage = CaaThumbnailCoverArtImage(url=url) cover_cell.fetch_task = self.tagger.webservice.download( coverartimage.host, coverartimage.port, coverartimage.path, partial(self._cover_downloaded, cover_cell) ) else: cover_cell.not_found() except (AttributeError, KeyError, TypeError): log.error("Error reading CAA response", exc_info=True) cover_cell.not_found() def _cover_downloaded(self, cover_cell, data, http, error): """Handle cover art query reply from CAA server. If server returns the cover image successfully, update the cover art cell of particular release. Args: row -- Album's row in results table """ cover_cell.fetch_task = None if error: cover_cell.not_found() else: pixmap = QtGui.QPixmap() try: pixmap.loadFromData(data) cover_cell.set_pixmap(pixmap) except Exception as e: cover_cell.not_found() log.error(e) def fetch_cleanup(self): for cell in self.cover_cells: if cell.fetch_task is not None: log.debug("Removing cover art fetch task for %s", cell.release['musicbrainz_albumid']) self.tagger.webservice.remove_task(cell.fetch_task) def closeEvent(self, event): if self.cover_cells: self.fetch_cleanup() super().closeEvent(event) def parse_releases(self, releases): for node in releases: release = Metadata() release_to_metadata(node, release) release['score'] = node['score'] rg_node = node['release-group'] release_group_to_metadata(rg_node, release) if "media" in node: media = node['media'] release["format"] = media_formats_from_node(media) release["tracks"] = node['track-count'] countries = countries_from_node(node) if countries: release["country"] = ", ".join(countries) self.search_results.append(release) def display_results(self): self.prepare_table() self.cover_cells = [] for row, release in enumerate(self.search_results): self.table.insertRow(row) self.set_table_item(row, 'name', release, "album") self.set_table_item(row, 'artist', release, "albumartist") self.set_table_item(row, 'format', release, "format") self.set_table_item(row, 'tracks', release, "tracks") self.set_table_item(row, 'date', release, "date") self.set_table_item(row, 'country', release, "country") self.set_table_item(row, 'labels', release, "label") self.set_table_item(row, 'catnums', release, "catalognumber") self.set_table_item(row, 'barcode', release, "barcode") self.set_table_item(row, 'language', release, "~releaselanguage") self.set_table_item(row, 'type', release, "releasetype") self.set_table_item(row, 'status', release, "releasestatus") self.set_table_item(row, 'score', release, "score") self.cover_cells.append(CoverCell(self, release, row, 'cover', on_show=self.fetch_coverart)) self.show_table(sort_column='score') def accept_event(self, rows): for row in rows: self.load_selection(row) def load_selection(self, row): release = self.search_results[row] self.tagger.get_release_group_by_id( release["musicbrainz_releasegroupid"]).loaded_albums.add( release["musicbrainz_albumid"]) album = self.tagger.load_album(release["musicbrainz_albumid"]) if self.cluster: files = self.tagger.get_files_from_objects([self.cluster]) self.tagger.move_files_to_album(files, release["musicbrainz_albumid"], album) picard-release-2.3.1/picard/ui/searchdialog/artist.py000066400000000000000000000077471362601763300226070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import QtCore from picard import config from picard.const import QUERY_LIMIT from picard.mbjson import artist_to_metadata from picard.metadata import Metadata from picard.ui.searchdialog import ( Retry, SearchDialog, ) class ArtistSearchDialog(SearchDialog): dialog_header_state = "artistsearchdialog_header_state" options = [ config.Option("persist", dialog_header_state, QtCore.QByteArray()) ] def __init__(self, parent): super().__init__( parent, accept_button_title=_("Show in browser"), search_type="artist") self.setWindowTitle(_("Artist Search Dialog")) self.columns = [ ('name', _("Name")), ('type', _("Type")), ('gender', _("Gender")), ('area', _("Area")), ('begindate', _("Begin")), ('beginarea', _("Begin Area")), ('enddate', _("End")), ('endarea', _("End Area")), ('score', _("Score")), ] def search(self, text): self.retry_params = Retry(self.search, text) self.search_box_text(text) self.show_progress() self.tagger.mb_api.find_artists(self.handle_reply, query=text, search=True, limit=QUERY_LIMIT) def retry(self): self.retry_params.function(self.retry_params.query) def handle_reply(self, document, http, error): if error: self.network_error(http, error) return try: artists = document['artists'] except (KeyError, TypeError): self.no_results() return del self.search_results[:] self.parse_artists(artists) self.display_results() def parse_artists(self, artists): for node in artists: artist = Metadata() artist_to_metadata(node, artist) artist['score'] = node['score'] self.search_results.append(artist) def display_results(self): self.prepare_table() for row, artist in enumerate(self.search_results): self.table.insertRow(row) self.set_table_item(row, 'name', artist, "name") self.set_table_item(row, 'type', artist, "type") self.set_table_item(row, 'gender', artist, "gender") self.set_table_item(row, 'area', artist, "area") self.set_table_item(row, 'begindate', artist, "begindate") self.set_table_item(row, 'beginarea', artist, "beginarea") self.set_table_item(row, 'enddate', artist, "enddate") self.set_table_item(row, 'endarea', artist, "endarea") self.set_table_item(row, 'score', artist, "score") self.show_table(sort_column='score') def accept_event(self, rows): for row in rows: self.load_in_browser(row) def load_in_browser(self, row): self.tagger.search(self.search_results[row]["musicbrainz_artistid"], "artist") picard-release-2.3.1/picard/ui/searchdialog/track.py000066400000000000000000000205701362601763300223720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2018 Antonio Larrosa # Copyright (C) 2018-2019 Laurent Monin # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import QtCore from picard import config from picard.const import QUERY_LIMIT from picard.file import File from picard.mbjson import ( countries_from_node, recording_to_metadata, release_group_to_metadata, release_to_metadata, ) from picard.metadata import Metadata from picard.track import Track from picard.util import sort_by_similarity from picard.webservice.api_helpers import escape_lucene_query from picard.ui.searchdialog import ( Retry, SearchDialog, ) class TrackSearchDialog(SearchDialog): dialog_header_state = "tracksearchdialog_header_state" options = [ config.Option("persist", dialog_header_state, QtCore.QByteArray()) ] def __init__(self, parent): super().__init__( parent, accept_button_title=_("Load into Picard"), search_type="track") self.file_ = None self.setWindowTitle(_("Track Search Results")) self.columns = [ ('name', _("Name")), ('length', _("Length")), ('artist', _("Artist")), ('release', _("Release")), ('date', _("Date")), ('country', _("Country")), ('type', _("Type")), ('score', _("Score")), ] def search(self, text): """Perform search using query provided by the user.""" self.retry_params = Retry(self.search, text) self.search_box_text(text) self.show_progress() self.tagger.mb_api.find_tracks(self.handle_reply, query=text, search=True, limit=QUERY_LIMIT) def load_similar_tracks(self, file_): """Perform search using existing metadata information from the file as query.""" self.retry_params = Retry(self.load_similar_tracks, file_) self.file_ = file_ metadata = file_.orig_metadata query = { 'track': metadata['title'], 'artist': metadata['artist'], 'release': metadata['album'], 'tnum': metadata['tracknumber'], 'tracks': metadata['totaltracks'], 'qdur': str(metadata.length // 2000), 'isrc': metadata['isrc'], } # Generate query to be displayed to the user (in search box). # If advanced query syntax setting is enabled by user, display query in # advanced syntax style. Otherwise display only track title. if config.setting["use_adv_search_syntax"]: query_str = ' '.join(['%s:(%s)' % (item, escape_lucene_query(value)) for item, value in query.items() if value]) else: query_str = query["track"] query["limit"] = QUERY_LIMIT self.search_box_text(query_str) self.show_progress() self.tagger.mb_api.find_tracks( self.handle_reply, **query) def retry(self): self.retry_params.function(self.retry_params.query) def handle_reply(self, document, http, error): if error: self.network_error(http, error) return try: tracks = document['recordings'] except (KeyError, TypeError): self.no_results_found() return if self.file_: metadata = self.file_.orig_metadata def candidates(): for track in tracks: yield metadata.compare_to_track(track, File.comparison_weights) tracks = [result.track for result in sort_by_similarity(candidates)] del self.search_results[:] # Clear existing data self.parse_tracks(tracks) self.display_results() def display_results(self): self.prepare_table() for row, obj in enumerate(self.search_results): track = obj[0] self.table.insertRow(row) self.set_table_item(row, 'name', track, "title") self.set_table_item(row, 'length', track, "~length", sortkey=track.length) self.set_table_item(row, 'artist', track, "artist") self.set_table_item(row, 'release', track, "album") self.set_table_item(row, 'date', track, "date") self.set_table_item(row, 'country', track, "country") self.set_table_item(row, 'type', track, "releasetype") self.set_table_item(row, 'score', track, "score") self.show_table(sort_column='score') def parse_tracks(self, tracks): for node in tracks: if "releases" in node: for rel_node in node['releases']: track = Metadata() recording_to_metadata(node, track) track['score'] = node['score'] release_to_metadata(rel_node, track) rg_node = rel_node['release-group'] release_group_to_metadata(rg_node, track) countries = countries_from_node(rel_node) if countries: track["country"] = ", ".join(countries) self.search_results.append((track, node)) else: # This handles the case when no release is associated with a track # i.e. the track is an NAT track = Metadata() recording_to_metadata(node, track) track['score'] = node['score'] track["album"] = _("Standalone Recording") self.search_results.append((track, node)) def accept_event(self, rows): for row in rows: self.load_selection(row) def load_selection(self, row): """Load the album corresponding to the selected track. If the search is performed for a file, also associate the file to corresponding track in the album. """ track, node = self.search_results[row] if track.get("musicbrainz_albumid"): # The track is not an NAT self.tagger.get_release_group_by_id(track["musicbrainz_releasegroupid"]).loaded_albums.add( track["musicbrainz_albumid"]) if self.file_: # Search is performed for a file. # Have to move that file from its existing album to the new one. if isinstance(self.file_.parent, Track): album = self.file_.parent.album self.tagger.move_file_to_track(self.file_, track["musicbrainz_albumid"], track["musicbrainz_recordingid"]) if album._files == 0: # Remove album if it has no more files associated self.tagger.remove_album(album) else: self.tagger.move_file_to_track(self.file_, track["musicbrainz_albumid"], track["musicbrainz_recordingid"]) else: # No files associated. Just a normal search. self.tagger.load_album(track["musicbrainz_albumid"]) else: if self.file_ and getattr(self.file_.parent, 'album', None): album = self.file_.parent.album self.tagger.move_file_to_nat(self.file_, track["musicbrainz_recordingid"], node) if album._files == 0: self.tagger.remove_album(album) else: self.tagger.load_nat(track["musicbrainz_recordingid"], node) self.tagger.move_file_to_nat(self.file_, track["musicbrainz_recordingid"], node) picard-release-2.3.1/picard/ui/statusindicator.py000066400000000000000000000133371362601763300220640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard.const.sys import ( IS_HAIKU, IS_MACOS, IS_WIN, ) DesktopStatusIndicator = None class AbstractProgressStatusIndicator: def __init__(self): self._max_pending = 0 self._last_pending = 0 def update(self, files=0, albums=0, pending_files=0, pending_requests=0): if not self.is_available: return total_pending = pending_files + pending_requests if total_pending == self._last_pending: return # No changes, avoid update previous_done = self._max_pending - self._last_pending self._max_pending = max(self._max_pending, previous_done + total_pending) self._last_pending = total_pending if total_pending == 0 or self._max_pending <= 1: # No need to show progress for single item self._max_pending = 0 self.hide_progress() return progress = 1 - (total_pending / self._max_pending) self.set_progress(progress) @property def is_available(self): return True def hide_progress(self): raise NotImplementedError def set_progress(self, progress): raise NotImplementedError if IS_WIN: from PyQt5.QtWinExtras import QWinTaskbarButton class WindowsTaskbarStatusIndicator(AbstractProgressStatusIndicator): def __init__(self, window): super().__init__() taskbar_button = QWinTaskbarButton(window) taskbar_button.setWindow(window) self._progress = taskbar_button.progress() @property def is_available(self): return bool(self._progress) def hide_progress(self): self._progress.hide() def set_progress(self, progress): self._progress.setValue(int(progress * 100)) self._progress.show() DesktopStatusIndicator = WindowsTaskbarStatusIndicator elif not (IS_MACOS or IS_HAIKU): from PyQt5.QtCore import ( Q_CLASSINFO, QObject, pyqtSlot, ) from PyQt5.QtDBus import ( QDBusAbstractAdaptor, QDBusConnection, QDBusMessage, ) from picard import PICARD_DESKTOP_NAME DBUS_INTERFACE = 'com.canonical.Unity.LauncherEntry' class UnityLauncherEntryService(QObject): def __init__(self, bus, app_id): QObject.__init__(self) self._bus = bus self._app_id = app_id self._path = '/' self._progress = 0 self._visible = False self._dbus_adaptor = UnityLauncherEntryAdaptor(self) self._available = bus.registerObject(self._path, self) @property def current_progress(self): return { "progress": self._progress, "progress-visible": self._visible, } @property def is_available(self): return self._available def update(self, progress, visible=True): self._progress = progress self._visible = visible # Automatic forwarding of Qt signals does not work in this case # since Qt cannot handle the complex "a{sv}" type. # Create the signal message manually. message = QDBusMessage.createSignal(self._path, DBUS_INTERFACE, 'Update') message.setArguments([self._app_id, self.current_progress]) self._bus.send(message) def query(self): return [self._app_id, self.current_progress] class UnityLauncherEntryAdaptor(QDBusAbstractAdaptor): """ This provides the DBus adaptor to the outside world""" Q_CLASSINFO("D-Bus Interface", DBUS_INTERFACE) Q_CLASSINFO("D-Bus Introspection", '\n' ' \n' ' \n' ' \n' ' \n' ' \n' ' \n' ' \n' ' \n' '' % DBUS_INTERFACE) def __init__(self, parent): super().__init__(parent) @pyqtSlot(name="Query", result=list) def query(self): return self.parent().query() class UnityLauncherEntryStatusIndicator(AbstractProgressStatusIndicator): def __init__(self, window): super().__init__() bus = QDBusConnection.sessionBus() self._service = UnityLauncherEntryService(bus, PICARD_DESKTOP_NAME) @property def is_available(self): return self._service.is_available def hide_progress(self): self._service.update(0, False) def set_progress(self, progress): self._service.update(progress) DesktopStatusIndicator = UnityLauncherEntryStatusIndicator picard-release-2.3.1/picard/ui/tagsfromfilenames.py000066400000000000000000000126641362601763300223540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2009, 2014, 2019 Philipp Wolfer # Copyright (C) 2012-2013 Michael Wiencek # Copyright (C) 2014, 2017 Sophist-UK # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Ville Skyttä # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path import re from PyQt5 import QtWidgets from picard import config from picard.util.tags import display_tag_name from picard.ui import PicardDialog from picard.ui.ui_tagsfromfilenames import Ui_TagsFromFileNamesDialog from picard.ui.util import StandardButton class TagsFromFileNamesDialog(PicardDialog): options = [ config.TextOption("persist", "tags_from_filenames_format", ""), ] def __init__(self, files, parent=None): super().__init__(parent) self.ui = Ui_TagsFromFileNamesDialog() self.ui.setupUi(self) items = [ "%artist%/%album%/%title%", "%artist%/%album%/%tracknumber% %title%", "%artist%/%album%/%tracknumber% - %title%", "%artist%/%album% - %tracknumber% - %title%", "%artist% - %album%/%title%", "%artist% - %album%/%tracknumber% %title%", "%artist% - %album%/%tracknumber% - %title%", ] tff_format = config.persist["tags_from_filenames_format"] if tff_format not in items: selected_index = 0 if tff_format: items.insert(0, tff_format) else: selected_index = items.index(tff_format) self.ui.format.addItems(items) self.ui.format.setCurrentIndex(selected_index) self.ui.buttonbox.addButton(StandardButton(StandardButton.OK), QtWidgets.QDialogButtonBox.AcceptRole) self.ui.buttonbox.addButton(StandardButton(StandardButton.CANCEL), QtWidgets.QDialogButtonBox.RejectRole) self.ui.buttonbox.accepted.connect(self.accept) self.ui.buttonbox.rejected.connect(self.reject) self.ui.preview.clicked.connect(self.preview) self.ui.files.setHeaderLabels([_("File Name")]) self.files = files self.items = [] for file in files: item = QtWidgets.QTreeWidgetItem(self.ui.files) item.setText(0, os.path.basename(file.filename)) self.items.append(item) self._tag_re = re.compile(r"(%\w+%)") self.numeric_tags = ('tracknumber', 'totaltracks', 'discnumber', 'totaldiscs') def parse_response(self): tff_format = self.ui.format.currentText() columns = [] format_re = ['(?:^|/)'] for part in self._tag_re.split(tff_format): if part.startswith('%') and part.endswith('%'): name = part[1:-1] columns.append(name) if name in self.numeric_tags: format_re.append('(?P<' + name + r'>\d+)') elif name == 'date': format_re.append('(?P<' + name + r'>\d+(?:-\d+(?:-\d+)?)?)') else: format_re.append('(?P<' + name + '>[^/]*?)') else: format_re.append(re.escape(part)) format_re.append(r'\.(\w+)$') format_re = re.compile("".join(format_re)) return format_re, columns def match_file(self, file, tff_format): match = tff_format.search(file.filename.replace('\\', '/')) if match: result = {} for name, value in match.groupdict().items(): value = value.strip() if name in self.numeric_tags: value = value.lstrip("0") if self.ui.replace_underscores.isChecked(): value = value.replace('_', ' ') result[name] = value return result else: return {} def preview(self): tff_format, columns = self.parse_response() self.ui.files.setHeaderLabels([_("File Name")] + list(map(display_tag_name, columns))) for item, file in zip(self.items, self.files): matches = self.match_file(file, tff_format) for i, column in enumerate(columns): item.setText(i + 1, matches.get(column, '')) self.ui.files.header().resizeSections(QtWidgets.QHeaderView.ResizeToContents) self.ui.files.header().setStretchLastSection(True) def accept(self): tff_format, columns = self.parse_response() for file in self.files: metadata = self.match_file(file, tff_format) for name, value in metadata.items(): file.metadata[name] = value file.update() config.persist["tags_from_filenames_format"] = self.ui.format.currentText() super().accept() picard-release-2.3.1/picard/ui/ui_cdlookup.py000066400000000000000000000113261362601763300211550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(720, 320) self.vboxlayout = QtWidgets.QVBoxLayout(Dialog) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.results_view = QtWidgets.QStackedWidget(Dialog) self.results_view.setObjectName("results_view") self.results_page = QtWidgets.QWidget() self.results_page.setObjectName("results_page") self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.results_page) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.verticalLayout_4.setObjectName("verticalLayout_4") self.label = QtWidgets.QLabel(self.results_page) self.label.setObjectName("label") self.verticalLayout_4.addWidget(self.label) self.release_list = QtWidgets.QTreeWidget(self.results_page) self.release_list.setObjectName("release_list") self.release_list.headerItem().setText(0, "1") self.verticalLayout_4.addWidget(self.release_list) self.results_view.addWidget(self.results_page) self.no_results_page = QtWidgets.QWidget() self.no_results_page.setObjectName("no_results_page") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.no_results_page) self.verticalLayout_3.setObjectName("verticalLayout_3") spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem) self.no_results_label = QtWidgets.QLabel(self.no_results_page) self.no_results_label.setStyleSheet("margin-bottom: 9px;") self.no_results_label.setObjectName("no_results_label") self.verticalLayout_3.addWidget(self.no_results_label, 0, QtCore.Qt.AlignHCenter) self.submit_button = QtWidgets.QToolButton(self.no_results_page) self.submit_button.setStyleSheet("") icon = QtGui.QIcon.fromTheme("media-optical") self.submit_button.setIcon(icon) self.submit_button.setIconSize(QtCore.QSize(128, 128)) self.submit_button.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) self.submit_button.setObjectName("submit_button") self.verticalLayout_3.addWidget(self.submit_button, 0, QtCore.Qt.AlignHCenter) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem1) self.results_view.addWidget(self.no_results_page) self.vboxlayout.addWidget(self.results_view) self.hboxlayout = QtWidgets.QHBoxLayout() self.hboxlayout.setContentsMargins(0, 0, 0, 0) self.hboxlayout.setSpacing(6) self.hboxlayout.setObjectName("hboxlayout") spacerItem2 = QtWidgets.QSpacerItem(111, 31, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.hboxlayout.addItem(spacerItem2) self.ok_button = QtWidgets.QPushButton(Dialog) self.ok_button.setEnabled(False) self.ok_button.setObjectName("ok_button") self.hboxlayout.addWidget(self.ok_button) self.lookup_button = QtWidgets.QPushButton(Dialog) self.lookup_button.setObjectName("lookup_button") self.hboxlayout.addWidget(self.lookup_button) self.cancel_button = QtWidgets.QPushButton(Dialog) self.cancel_button.setObjectName("cancel_button") self.hboxlayout.addWidget(self.cancel_button) self.vboxlayout.addLayout(self.hboxlayout) self.retranslateUi(Dialog) self.results_view.setCurrentIndex(0) self.ok_button.clicked.connect(Dialog.accept) self.cancel_button.clicked.connect(Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.submit_button, self.release_list) Dialog.setTabOrder(self.release_list, self.ok_button) Dialog.setTabOrder(self.ok_button, self.lookup_button) Dialog.setTabOrder(self.lookup_button, self.cancel_button) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_("CD Lookup")) self.label.setText(_("The following releases on MusicBrainz match the CD:")) self.no_results_label.setText(_("No matching releases found for this disc.")) self.submit_button.setText(_("Submit disc ID")) self.ok_button.setText(_("&Load into Picard")) self.lookup_button.setText(_("Lookup in &Browser")) self.cancel_button.setText(_("&Cancel")) picard-release-2.3.1/picard/ui/ui_edittagdialog.py000066400000000000000000000154301362601763300221360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_EditTagDialog(object): def setupUi(self, EditTagDialog): EditTagDialog.setObjectName("EditTagDialog") EditTagDialog.setWindowModality(QtCore.Qt.ApplicationModal) EditTagDialog.resize(400, 250) EditTagDialog.setFocusPolicy(QtCore.Qt.StrongFocus) EditTagDialog.setModal(True) self.verticalLayout_2 = QtWidgets.QVBoxLayout(EditTagDialog) self.verticalLayout_2.setObjectName("verticalLayout_2") self.tag_names = QtWidgets.QComboBox(EditTagDialog) self.tag_names.setEditable(True) self.tag_names.setObjectName("tag_names") self.verticalLayout_2.addWidget(self.tag_names) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.value_list = QtWidgets.QListWidget(EditTagDialog) self.value_list.setFocusPolicy(QtCore.Qt.StrongFocus) self.value_list.setTabKeyNavigation(False) self.value_list.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.value_list.setMovement(QtWidgets.QListView.Free) self.value_list.setObjectName("value_list") self.horizontalLayout.addWidget(self.value_list) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.edit_value = QtWidgets.QPushButton(EditTagDialog) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.edit_value.sizePolicy().hasHeightForWidth()) self.edit_value.setSizePolicy(sizePolicy) self.edit_value.setMinimumSize(QtCore.QSize(100, 0)) self.edit_value.setAutoDefault(False) self.edit_value.setObjectName("edit_value") self.verticalLayout.addWidget(self.edit_value) self.add_value = QtWidgets.QPushButton(EditTagDialog) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.add_value.sizePolicy().hasHeightForWidth()) self.add_value.setSizePolicy(sizePolicy) self.add_value.setMinimumSize(QtCore.QSize(100, 0)) self.add_value.setAutoDefault(False) self.add_value.setObjectName("add_value") self.verticalLayout.addWidget(self.add_value) self.remove_value = QtWidgets.QPushButton(EditTagDialog) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(120) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.remove_value.sizePolicy().hasHeightForWidth()) self.remove_value.setSizePolicy(sizePolicy) self.remove_value.setMinimumSize(QtCore.QSize(120, 0)) self.remove_value.setAutoDefault(False) self.remove_value.setObjectName("remove_value") self.verticalLayout.addWidget(self.remove_value) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum) self.verticalLayout.addItem(spacerItem) self.move_value_up = QtWidgets.QPushButton(EditTagDialog) self.move_value_up.setText("") icon = QtGui.QIcon.fromTheme(":/images/16x16/go-up.png") self.move_value_up.setIcon(icon) self.move_value_up.setObjectName("move_value_up") self.verticalLayout.addWidget(self.move_value_up) self.move_value_down = QtWidgets.QPushButton(EditTagDialog) self.move_value_down.setText("") icon = QtGui.QIcon.fromTheme(":/images/16x16/go-down.png") self.move_value_down.setIcon(icon) self.move_value_down.setObjectName("move_value_down") self.verticalLayout.addWidget(self.move_value_down) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.horizontalLayout.addLayout(self.verticalLayout) self.verticalLayout_2.addLayout(self.horizontalLayout) self.buttonbox = QtWidgets.QDialogButtonBox(EditTagDialog) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(150) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.buttonbox.sizePolicy().hasHeightForWidth()) self.buttonbox.setSizePolicy(sizePolicy) self.buttonbox.setMinimumSize(QtCore.QSize(150, 0)) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Save) self.buttonbox.setObjectName("buttonbox") self.verticalLayout_2.addWidget(self.buttonbox) self.retranslateUi(EditTagDialog) self.buttonbox.accepted.connect(EditTagDialog.accept) self.buttonbox.rejected.connect(EditTagDialog.reject) self.move_value_up.clicked.connect(EditTagDialog.move_row_up) self.move_value_down.clicked.connect(EditTagDialog.move_row_down) self.edit_value.clicked.connect(EditTagDialog.edit_value) self.add_value.clicked.connect(EditTagDialog.add_value) self.value_list.itemChanged['QListWidgetItem*'].connect(EditTagDialog.value_edited) self.remove_value.clicked.connect(EditTagDialog.remove_value) self.value_list.itemSelectionChanged.connect(EditTagDialog.value_selection_changed) self.tag_names.editTextChanged['QString'].connect(EditTagDialog.tag_changed) QtCore.QMetaObject.connectSlotsByName(EditTagDialog) EditTagDialog.setTabOrder(self.tag_names, self.value_list) EditTagDialog.setTabOrder(self.value_list, self.edit_value) EditTagDialog.setTabOrder(self.edit_value, self.add_value) EditTagDialog.setTabOrder(self.add_value, self.remove_value) EditTagDialog.setTabOrder(self.remove_value, self.buttonbox) def retranslateUi(self, EditTagDialog): _translate = QtCore.QCoreApplication.translate EditTagDialog.setWindowTitle(_("Edit Tag")) self.edit_value.setText(_("Edit value")) self.add_value.setText(_("Add value")) self.remove_value.setText(_("Remove value")) self.move_value_up.setToolTip(_("Move selected value up")) self.move_value_up.setAccessibleDescription(_("Move selected value up")) self.move_value_down.setToolTip(_("Move selected value down")) self.move_value_down.setAccessibleDescription(_("Move selected value down")) picard-release-2.3.1/picard/ui/ui_infodialog.py000066400000000000000000000057251362601763300214560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_InfoDialog(object): def setupUi(self, InfoDialog): InfoDialog.setObjectName("InfoDialog") InfoDialog.resize(665, 436) self.verticalLayout = QtWidgets.QVBoxLayout(InfoDialog) self.verticalLayout.setObjectName("verticalLayout") self.tabWidget = QtWidgets.QTabWidget(InfoDialog) self.tabWidget.setObjectName("tabWidget") self.info_tab = QtWidgets.QWidget() self.info_tab.setObjectName("info_tab") self.vboxlayout = QtWidgets.QVBoxLayout(self.info_tab) self.vboxlayout.setObjectName("vboxlayout") self.info_scroll = QtWidgets.QScrollArea(self.info_tab) self.info_scroll.setWidgetResizable(True) self.info_scroll.setObjectName("info_scroll") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setEnabled(True) self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 493, 358)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayoutLabel = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayoutLabel.setObjectName("verticalLayoutLabel") self.info = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.info.setText("") self.info.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.info.setWordWrap(True) self.info.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.info.setObjectName("info") self.verticalLayoutLabel.addWidget(self.info) self.info_scroll.setWidget(self.scrollAreaWidgetContents) self.vboxlayout.addWidget(self.info_scroll) self.tabWidget.addTab(self.info_tab, "") self.artwork_tab = QtWidgets.QWidget() self.artwork_tab.setObjectName("artwork_tab") self.vboxlayout1 = QtWidgets.QVBoxLayout(self.artwork_tab) self.vboxlayout1.setObjectName("vboxlayout1") self.tabWidget.addTab(self.artwork_tab, "") self.verticalLayout.addWidget(self.tabWidget) self.buttonBox = QtWidgets.QDialogButtonBox(InfoDialog) self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.NoButton) self.buttonBox.setObjectName("buttonBox") self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(InfoDialog) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(InfoDialog) InfoDialog.setTabOrder(self.tabWidget, self.buttonBox) def retranslateUi(self, InfoDialog): _translate = QtCore.QCoreApplication.translate self.tabWidget.setTabText(self.tabWidget.indexOf(self.info_tab), _("&Info")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.artwork_tab), _("A&rtwork")) picard-release-2.3.1/picard/ui/ui_infostatus.py000066400000000000000000000110151362601763300215270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_InfoStatus(object): def setupUi(self, InfoStatus): InfoStatus.setObjectName("InfoStatus") InfoStatus.resize(350, 24) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(InfoStatus.sizePolicy().hasHeightForWidth()) InfoStatus.setSizePolicy(sizePolicy) InfoStatus.setMinimumSize(QtCore.QSize(0, 0)) self.horizontalLayout = QtWidgets.QHBoxLayout(InfoStatus) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setSpacing(2) self.horizontalLayout.setObjectName("horizontalLayout") self.val1 = QtWidgets.QLabel(InfoStatus) self.val1.setMinimumSize(QtCore.QSize(40, 0)) self.val1.setText("") self.val1.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val1.setObjectName("val1") self.horizontalLayout.addWidget(self.val1) self.label1 = QtWidgets.QLabel(InfoStatus) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label1.sizePolicy().hasHeightForWidth()) self.label1.setSizePolicy(sizePolicy) self.label1.setFrameShape(QtWidgets.QFrame.NoFrame) self.label1.setTextFormat(QtCore.Qt.AutoText) self.label1.setScaledContents(False) self.label1.setObjectName("label1") self.horizontalLayout.addWidget(self.label1) self.val2 = QtWidgets.QLabel(InfoStatus) self.val2.setMinimumSize(QtCore.QSize(40, 0)) self.val2.setText("") self.val2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val2.setObjectName("val2") self.horizontalLayout.addWidget(self.val2) self.label2 = QtWidgets.QLabel(InfoStatus) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label2.sizePolicy().hasHeightForWidth()) self.label2.setSizePolicy(sizePolicy) self.label2.setText("") self.label2.setObjectName("label2") self.horizontalLayout.addWidget(self.label2) self.val3 = QtWidgets.QLabel(InfoStatus) self.val3.setMinimumSize(QtCore.QSize(40, 0)) self.val3.setText("") self.val3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val3.setObjectName("val3") self.horizontalLayout.addWidget(self.val3) self.label3 = QtWidgets.QLabel(InfoStatus) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label3.sizePolicy().hasHeightForWidth()) self.label3.setSizePolicy(sizePolicy) self.label3.setText("") self.label3.setObjectName("label3") self.horizontalLayout.addWidget(self.label3) self.val4 = QtWidgets.QLabel(InfoStatus) self.val4.setMinimumSize(QtCore.QSize(40, 0)) self.val4.setText("") self.val4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.val4.setObjectName("val4") self.horizontalLayout.addWidget(self.val4) self.label4 = QtWidgets.QLabel(InfoStatus) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label4.sizePolicy().hasHeightForWidth()) self.label4.setSizePolicy(sizePolicy) self.label4.setText("") self.label4.setScaledContents(False) self.label4.setObjectName("label4") self.horizontalLayout.addWidget(self.label4) self.retranslateUi(InfoStatus) QtCore.QMetaObject.connectSlotsByName(InfoStatus) def retranslateUi(self, InfoStatus): _translate = QtCore.QCoreApplication.translate InfoStatus.setWindowTitle(_("Form")) picard-release-2.3.1/picard/ui/ui_options.py000066400000000000000000000037631362601763300210360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") Dialog.resize(800, 450) self.vboxlayout = QtWidgets.QVBoxLayout(Dialog) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.splitter = QtWidgets.QSplitter(Dialog) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setObjectName("splitter") self.pages_tree = QtWidgets.QTreeWidget(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pages_tree.sizePolicy().hasHeightForWidth()) self.pages_tree.setSizePolicy(sizePolicy) self.pages_tree.setObjectName("pages_tree") self.pages_stack = QtWidgets.QStackedWidget(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pages_stack.sizePolicy().hasHeightForWidth()) self.pages_stack.setSizePolicy(sizePolicy) self.pages_stack.setObjectName("pages_stack") self.vboxlayout.addWidget(self.splitter) self.buttonbox = QtWidgets.QDialogButtonBox(Dialog) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setObjectName("buttonbox") self.vboxlayout.addWidget(self.buttonbox) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_("Options")) picard-release-2.3.1/picard/ui/ui_options_about.py000066400000000000000000000043261362601763300222240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_AboutOptionsPage(object): def setupUi(self, AboutOptionsPage): AboutOptionsPage.setObjectName("AboutOptionsPage") AboutOptionsPage.resize(171, 137) self.vboxlayout = QtWidgets.QVBoxLayout(AboutOptionsPage) self.vboxlayout.setContentsMargins(0, 0, 0, 0) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.scrollArea = QtWidgets.QScrollArea(AboutOptionsPage) self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) self.scrollArea.setFrameShadow(QtWidgets.QFrame.Plain) self.scrollArea.setLineWidth(0) self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.scrollArea.setWidgetResizable(True) self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 171, 137)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label.setText("") self.label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) self.label.setWordWrap(True) self.label.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.vboxlayout.addWidget(self.scrollArea) self.retranslateUi(AboutOptionsPage) QtCore.QMetaObject.connectSlotsByName(AboutOptionsPage) def retranslateUi(self, AboutOptionsPage): pass picard-release-2.3.1/picard/ui/ui_options_advanced.py000066400000000000000000000204401362601763300226520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_AdvancedOptionsPage(object): def setupUi(self, AdvancedOptionsPage): AdvancedOptionsPage.setObjectName("AdvancedOptionsPage") AdvancedOptionsPage.resize(570, 435) self.vboxlayout = QtWidgets.QVBoxLayout(AdvancedOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.groupBox = QtWidgets.QGroupBox(AdvancedOptionsPage) self.groupBox.setObjectName("groupBox") self.gridlayout = QtWidgets.QGridLayout(self.groupBox) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.recursively_add_files = QtWidgets.QCheckBox(self.groupBox) self.recursively_add_files.setObjectName("recursively_add_files") self.gridlayout.addWidget(self.recursively_add_files, 5, 0, 1, 1) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) self.horizontalLayout.setObjectName("horizontalLayout") self.label_track_duration_diff = QtWidgets.QLabel(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_track_duration_diff.sizePolicy().hasHeightForWidth()) self.label_track_duration_diff.setSizePolicy(sizePolicy) self.label_track_duration_diff.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.label_track_duration_diff.setObjectName("label_track_duration_diff") self.horizontalLayout.addWidget(self.label_track_duration_diff) self.ignore_track_duration_difference_under = QtWidgets.QSpinBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.ignore_track_duration_difference_under.sizePolicy().hasHeightForWidth()) self.ignore_track_duration_difference_under.setSizePolicy(sizePolicy) self.ignore_track_duration_difference_under.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows) self.ignore_track_duration_difference_under.setAccelerated(True) self.ignore_track_duration_difference_under.setSuffix("") self.ignore_track_duration_difference_under.setMinimum(1) self.ignore_track_duration_difference_under.setMaximum(7200) self.ignore_track_duration_difference_under.setProperty("value", 2) self.ignore_track_duration_difference_under.setObjectName("ignore_track_duration_difference_under") self.horizontalLayout.addWidget(self.ignore_track_duration_difference_under) self.gridlayout.addLayout(self.horizontalLayout, 6, 0, 2, 1) self.label_ignore_regex = QtWidgets.QLabel(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_ignore_regex.sizePolicy().hasHeightForWidth()) self.label_ignore_regex.setSizePolicy(sizePolicy) self.label_ignore_regex.setWordWrap(True) self.label_ignore_regex.setObjectName("label_ignore_regex") self.gridlayout.addWidget(self.label_ignore_regex, 1, 0, 1, 1) self.regex_error = QtWidgets.QLabel(self.groupBox) self.regex_error.setText("") self.regex_error.setObjectName("regex_error") self.gridlayout.addWidget(self.regex_error, 3, 0, 1, 1) self.ignore_hidden_files = QtWidgets.QCheckBox(self.groupBox) self.ignore_hidden_files.setObjectName("ignore_hidden_files") self.gridlayout.addWidget(self.ignore_hidden_files, 4, 0, 1, 1) self.ignore_regex = QtWidgets.QLineEdit(self.groupBox) self.ignore_regex.setObjectName("ignore_regex") self.gridlayout.addWidget(self.ignore_regex, 2, 0, 1, 1) self.vboxlayout.addWidget(self.groupBox) self.groupBox_completeness = QtWidgets.QGroupBox(AdvancedOptionsPage) self.groupBox_completeness.setObjectName("groupBox_completeness") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_completeness) self.verticalLayout_2.setObjectName("verticalLayout_2") self.completeness_ignore_videos = QtWidgets.QCheckBox(self.groupBox_completeness) self.completeness_ignore_videos.setObjectName("completeness_ignore_videos") self.verticalLayout_2.addWidget(self.completeness_ignore_videos) self.completeness_ignore_pregap = QtWidgets.QCheckBox(self.groupBox_completeness) self.completeness_ignore_pregap.setObjectName("completeness_ignore_pregap") self.verticalLayout_2.addWidget(self.completeness_ignore_pregap) self.completeness_ignore_data = QtWidgets.QCheckBox(self.groupBox_completeness) self.completeness_ignore_data.setCheckable(True) self.completeness_ignore_data.setObjectName("completeness_ignore_data") self.verticalLayout_2.addWidget(self.completeness_ignore_data) self.completeness_ignore_silence = QtWidgets.QCheckBox(self.groupBox_completeness) self.completeness_ignore_silence.setObjectName("completeness_ignore_silence") self.verticalLayout_2.addWidget(self.completeness_ignore_silence) self.vboxlayout.addWidget(self.groupBox_completeness) self.groupBox_2 = QtWidgets.QGroupBox(AdvancedOptionsPage) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout.setObjectName("verticalLayout") self.compare_ignore_tags = TagListEditor(self.groupBox_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.compare_ignore_tags.sizePolicy().hasHeightForWidth()) self.compare_ignore_tags.setSizePolicy(sizePolicy) self.compare_ignore_tags.setObjectName("compare_ignore_tags") self.verticalLayout.addWidget(self.compare_ignore_tags) self.vboxlayout.addWidget(self.groupBox_2) self.retranslateUi(AdvancedOptionsPage) QtCore.QMetaObject.connectSlotsByName(AdvancedOptionsPage) AdvancedOptionsPage.setTabOrder(self.ignore_regex, self.ignore_hidden_files) AdvancedOptionsPage.setTabOrder(self.ignore_hidden_files, self.recursively_add_files) AdvancedOptionsPage.setTabOrder(self.recursively_add_files, self.ignore_track_duration_difference_under) AdvancedOptionsPage.setTabOrder(self.ignore_track_duration_difference_under, self.completeness_ignore_videos) AdvancedOptionsPage.setTabOrder(self.completeness_ignore_videos, self.completeness_ignore_pregap) AdvancedOptionsPage.setTabOrder(self.completeness_ignore_pregap, self.completeness_ignore_data) AdvancedOptionsPage.setTabOrder(self.completeness_ignore_data, self.completeness_ignore_silence) def retranslateUi(self, AdvancedOptionsPage): _translate = QtCore.QCoreApplication.translate self.groupBox.setTitle(_("Advanced options")) self.recursively_add_files.setText(_("Include sub-folders when adding files from folder")) self.label_track_duration_diff.setText(_("Ignore track duration difference under this number of seconds")) self.label_ignore_regex.setText(_("Ignore file paths matching the following regular expression:")) self.ignore_hidden_files.setText(_("Ignore hidden files")) self.groupBox_completeness.setTitle(_("Ignore the following tracks when determining whether a release is complete")) self.completeness_ignore_videos.setText(_("Video tracks")) self.completeness_ignore_pregap.setText(_("Pregap tracks")) self.completeness_ignore_data.setText(_("Data tracks")) self.completeness_ignore_silence.setText(_("Silent tracks")) self.groupBox_2.setTitle(_("Tags to ignore for comparison:")) from picard.ui.widgets.taglisteditor import TagListEditor picard-release-2.3.1/picard/ui/ui_options_cdlookup.py000066400000000000000000000035261362601763300227330ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_CDLookupOptionsPage(object): def setupUi(self, CDLookupOptionsPage): CDLookupOptionsPage.setObjectName("CDLookupOptionsPage") CDLookupOptionsPage.resize(224, 176) self.vboxlayout = QtWidgets.QVBoxLayout(CDLookupOptionsPage) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.rename_files = QtWidgets.QGroupBox(CDLookupOptionsPage) self.rename_files.setObjectName("rename_files") self.gridlayout = QtWidgets.QGridLayout(self.rename_files) self.gridlayout.setContentsMargins(9, 9, 9, 9) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.cd_lookup_device = QtWidgets.QLineEdit(self.rename_files) self.cd_lookup_device.setObjectName("cd_lookup_device") self.gridlayout.addWidget(self.cd_lookup_device, 1, 0, 1, 1) self.label_3 = QtWidgets.QLabel(self.rename_files) self.label_3.setObjectName("label_3") self.gridlayout.addWidget(self.label_3, 0, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) spacerItem = QtWidgets.QSpacerItem(161, 81, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_3.setBuddy(self.cd_lookup_device) self.retranslateUi(CDLookupOptionsPage) QtCore.QMetaObject.connectSlotsByName(CDLookupOptionsPage) def retranslateUi(self, CDLookupOptionsPage): _translate = QtCore.QCoreApplication.translate self.rename_files.setTitle(_("CD Lookup")) self.label_3.setText(_("CD-ROM device to use for lookups:")) picard-release-2.3.1/picard/ui/ui_options_cdlookup_select.py000066400000000000000000000044061362601763300242700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_CDLookupOptionsPage(object): def setupUi(self, CDLookupOptionsPage): CDLookupOptionsPage.setObjectName("CDLookupOptionsPage") CDLookupOptionsPage.resize(255, 155) self.vboxlayout = QtWidgets.QVBoxLayout(CDLookupOptionsPage) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.rename_files = QtWidgets.QGroupBox(CDLookupOptionsPage) self.rename_files.setObjectName("rename_files") self.gridlayout = QtWidgets.QGridLayout(self.rename_files) self.gridlayout.setContentsMargins(9, 9, 9, 9) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.cd_lookup_ = QtWidgets.QLabel(self.rename_files) self.cd_lookup_.setObjectName("cd_lookup_") self.gridlayout.addWidget(self.cd_lookup_, 0, 0, 1, 1) self.hboxlayout = QtWidgets.QHBoxLayout() self.hboxlayout.setContentsMargins(0, 0, 0, 0) self.hboxlayout.setSpacing(6) self.hboxlayout.setObjectName("hboxlayout") self.cd_lookup_device = QtWidgets.QComboBox(self.rename_files) self.cd_lookup_device.setObjectName("cd_lookup_device") self.hboxlayout.addWidget(self.cd_lookup_device) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.hboxlayout.addItem(spacerItem) self.gridlayout.addLayout(self.hboxlayout, 1, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) spacerItem1 = QtWidgets.QSpacerItem(161, 81, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.cd_lookup_.setBuddy(self.cd_lookup_device) self.retranslateUi(CDLookupOptionsPage) QtCore.QMetaObject.connectSlotsByName(CDLookupOptionsPage) def retranslateUi(self, CDLookupOptionsPage): _translate = QtCore.QCoreApplication.translate self.rename_files.setTitle(_("CD Lookup")) self.cd_lookup_.setText(_("Default CD-ROM drive to use for lookups:")) picard-release-2.3.1/picard/ui/ui_options_cover.py000066400000000000000000000133121362601763300222230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_CoverOptionsPage(object): def setupUi(self, CoverOptionsPage): CoverOptionsPage.setObjectName("CoverOptionsPage") CoverOptionsPage.resize(632, 560) self.verticalLayout = QtWidgets.QVBoxLayout(CoverOptionsPage) self.verticalLayout.setObjectName("verticalLayout") self.location = QtWidgets.QGroupBox(CoverOptionsPage) self.location.setObjectName("location") self.vboxlayout = QtWidgets.QVBoxLayout(self.location) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(2) self.vboxlayout.setObjectName("vboxlayout") self.save_images_to_tags = QtWidgets.QCheckBox(self.location) self.save_images_to_tags.setObjectName("save_images_to_tags") self.vboxlayout.addWidget(self.save_images_to_tags) self.cb_embed_front_only = QtWidgets.QCheckBox(self.location) self.cb_embed_front_only.setObjectName("cb_embed_front_only") self.vboxlayout.addWidget(self.cb_embed_front_only) self.save_images_to_files = QtWidgets.QCheckBox(self.location) self.save_images_to_files.setObjectName("save_images_to_files") self.vboxlayout.addWidget(self.save_images_to_files) self.label_use_filename = QtWidgets.QLabel(self.location) self.label_use_filename.setObjectName("label_use_filename") self.vboxlayout.addWidget(self.label_use_filename) self.cover_image_filename = QtWidgets.QLineEdit(self.location) self.cover_image_filename.setObjectName("cover_image_filename") self.vboxlayout.addWidget(self.cover_image_filename) self.save_images_overwrite = QtWidgets.QCheckBox(self.location) self.save_images_overwrite.setObjectName("save_images_overwrite") self.vboxlayout.addWidget(self.save_images_overwrite) self.verticalLayout.addWidget(self.location) self.ca_providers_groupbox = QtWidgets.QGroupBox(CoverOptionsPage) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.ca_providers_groupbox.sizePolicy().hasHeightForWidth()) self.ca_providers_groupbox.setSizePolicy(sizePolicy) self.ca_providers_groupbox.setObjectName("ca_providers_groupbox") self.ca_providers_layout = QtWidgets.QVBoxLayout(self.ca_providers_groupbox) self.ca_providers_layout.setObjectName("ca_providers_layout") self.ca_providers_list = QtWidgets.QListWidget(self.ca_providers_groupbox) self.ca_providers_list.setObjectName("ca_providers_list") self.ca_providers_layout.addWidget(self.ca_providers_list) self.ca_layout = QtWidgets.QHBoxLayout() self.ca_layout.setObjectName("ca_layout") self.move_label = QtWidgets.QLabel(self.ca_providers_groupbox) self.move_label.setObjectName("move_label") self.ca_layout.addWidget(self.move_label) self.up_button = QtWidgets.QToolButton(self.ca_providers_groupbox) self.up_button.setLayoutDirection(QtCore.Qt.LeftToRight) self.up_button.setText("") icon = QtGui.QIcon.fromTheme(":/images/16x16/go-up.png") self.up_button.setIcon(icon) self.up_button.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.up_button.setAutoRaise(False) self.up_button.setObjectName("up_button") self.ca_layout.addWidget(self.up_button) self.down_button = QtWidgets.QToolButton(self.ca_providers_groupbox) self.down_button.setText("") icon = QtGui.QIcon.fromTheme(":/images/16x16/go-down.png") self.down_button.setIcon(icon) self.down_button.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.down_button.setObjectName("down_button") self.ca_layout.addWidget(self.down_button) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.ca_layout.addItem(spacerItem) self.ca_providers_layout.addLayout(self.ca_layout) self.verticalLayout.addWidget(self.ca_providers_groupbox, 0, QtCore.Qt.AlignTop) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.retranslateUi(CoverOptionsPage) QtCore.QMetaObject.connectSlotsByName(CoverOptionsPage) CoverOptionsPage.setTabOrder(self.save_images_to_tags, self.cb_embed_front_only) CoverOptionsPage.setTabOrder(self.cb_embed_front_only, self.save_images_to_files) CoverOptionsPage.setTabOrder(self.save_images_to_files, self.cover_image_filename) CoverOptionsPage.setTabOrder(self.cover_image_filename, self.save_images_overwrite) def retranslateUi(self, CoverOptionsPage): _translate = QtCore.QCoreApplication.translate self.location.setTitle(_("Location")) self.save_images_to_tags.setText(_("Embed cover images into tags")) self.cb_embed_front_only.setText(_("Only embed a front image")) self.save_images_to_files.setText(_("Save cover images as separate files")) self.label_use_filename.setText(_("Use the following file name for images:")) self.save_images_overwrite.setText(_("Overwrite the file if it already exists")) self.ca_providers_groupbox.setTitle(_("Cover Art Providers")) self.move_label.setText(_("Reorder Priority: ")) self.up_button.setToolTip(_("Move selected item up")) self.down_button.setToolTip(_("Move selected item down")) picard-release-2.3.1/picard/ui/ui_options_fingerprinting.py000066400000000000000000000116751362601763300241440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_FingerprintingOptionsPage(object): def setupUi(self, FingerprintingOptionsPage): FingerprintingOptionsPage.setObjectName("FingerprintingOptionsPage") FingerprintingOptionsPage.resize(371, 408) self.verticalLayout = QtWidgets.QVBoxLayout(FingerprintingOptionsPage) self.verticalLayout.setObjectName("verticalLayout") self.fingerprinting = QtWidgets.QGroupBox(FingerprintingOptionsPage) self.fingerprinting.setCheckable(False) self.fingerprinting.setObjectName("fingerprinting") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.fingerprinting) self.verticalLayout_3.setObjectName("verticalLayout_3") self.disable_fingerprinting = QtWidgets.QRadioButton(self.fingerprinting) self.disable_fingerprinting.setObjectName("disable_fingerprinting") self.verticalLayout_3.addWidget(self.disable_fingerprinting) self.use_acoustid = QtWidgets.QRadioButton(self.fingerprinting) self.use_acoustid.setObjectName("use_acoustid") self.verticalLayout_3.addWidget(self.use_acoustid) self.verticalLayout.addWidget(self.fingerprinting) self.acoustid_settings = QtWidgets.QGroupBox(FingerprintingOptionsPage) self.acoustid_settings.setObjectName("acoustid_settings") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.acoustid_settings) self.verticalLayout_2.setObjectName("verticalLayout_2") self.ignore_existing_acoustid_fingerprints = QtWidgets.QCheckBox(self.acoustid_settings) self.ignore_existing_acoustid_fingerprints.setObjectName("ignore_existing_acoustid_fingerprints") self.verticalLayout_2.addWidget(self.ignore_existing_acoustid_fingerprints) self.label = QtWidgets.QLabel(self.acoustid_settings) self.label.setObjectName("label") self.verticalLayout_2.addWidget(self.label) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.acoustid_fpcalc = QtWidgets.QLineEdit(self.acoustid_settings) self.acoustid_fpcalc.setObjectName("acoustid_fpcalc") self.horizontalLayout_2.addWidget(self.acoustid_fpcalc) self.acoustid_fpcalc_browse = QtWidgets.QPushButton(self.acoustid_settings) self.acoustid_fpcalc_browse.setObjectName("acoustid_fpcalc_browse") self.horizontalLayout_2.addWidget(self.acoustid_fpcalc_browse) self.acoustid_fpcalc_download = QtWidgets.QPushButton(self.acoustid_settings) self.acoustid_fpcalc_download.setObjectName("acoustid_fpcalc_download") self.horizontalLayout_2.addWidget(self.acoustid_fpcalc_download) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.acoustid_fpcalc_info = QtWidgets.QLabel(self.acoustid_settings) self.acoustid_fpcalc_info.setText("") self.acoustid_fpcalc_info.setObjectName("acoustid_fpcalc_info") self.verticalLayout_2.addWidget(self.acoustid_fpcalc_info) self.label_2 = QtWidgets.QLabel(self.acoustid_settings) self.label_2.setObjectName("label_2") self.verticalLayout_2.addWidget(self.label_2) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.acoustid_apikey = QtWidgets.QLineEdit(self.acoustid_settings) self.acoustid_apikey.setObjectName("acoustid_apikey") self.horizontalLayout.addWidget(self.acoustid_apikey) self.acoustid_apikey_get = QtWidgets.QPushButton(self.acoustid_settings) self.acoustid_apikey_get.setObjectName("acoustid_apikey_get") self.horizontalLayout.addWidget(self.acoustid_apikey_get) self.verticalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.acoustid_settings) spacerItem = QtWidgets.QSpacerItem(181, 21, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.retranslateUi(FingerprintingOptionsPage) QtCore.QMetaObject.connectSlotsByName(FingerprintingOptionsPage) def retranslateUi(self, FingerprintingOptionsPage): _translate = QtCore.QCoreApplication.translate self.fingerprinting.setTitle(_("Audio Fingerprinting")) self.disable_fingerprinting.setText(_("Do not use audio fingerprinting")) self.use_acoustid.setText(_("Use AcoustID")) self.acoustid_settings.setTitle(_("AcoustID Settings")) self.ignore_existing_acoustid_fingerprints.setText(_("Ignore existing AcoustID fingerprints")) self.label.setText(_("Fingerprint calculator:")) self.acoustid_fpcalc_browse.setText(_("Browse...")) self.acoustid_fpcalc_download.setText(_("Download...")) self.label_2.setText(_("API key:")) self.acoustid_apikey_get.setText(_("Get API key...")) picard-release-2.3.1/picard/ui/ui_options_general.py000066400000000000000000000201661362601763300225270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_GeneralOptionsPage(object): def setupUi(self, GeneralOptionsPage): GeneralOptionsPage.setObjectName("GeneralOptionsPage") GeneralOptionsPage.resize(283, 435) self.vboxlayout = QtWidgets.QVBoxLayout(GeneralOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.groupBox = QtWidgets.QGroupBox(GeneralOptionsPage) self.groupBox.setObjectName("groupBox") self.gridlayout = QtWidgets.QGridLayout(self.groupBox) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.server_host = QtWidgets.QComboBox(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.server_host.sizePolicy().hasHeightForWidth()) self.server_host.setSizePolicy(sizePolicy) self.server_host.setEditable(True) self.server_host.setObjectName("server_host") self.gridlayout.addWidget(self.server_host, 1, 0, 1, 1) self.label_7 = QtWidgets.QLabel(self.groupBox) self.label_7.setObjectName("label_7") self.gridlayout.addWidget(self.label_7, 0, 1, 1, 1) self.server_port = QtWidgets.QSpinBox(self.groupBox) self.server_port.setMinimum(1) self.server_port.setMaximum(65535) self.server_port.setProperty("value", 80) self.server_port.setObjectName("server_port") self.gridlayout.addWidget(self.server_port, 1, 1, 1, 1) self.label = QtWidgets.QLabel(self.groupBox) self.label.setObjectName("label") self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.vboxlayout.addWidget(self.groupBox) self.rename_files_2 = QtWidgets.QGroupBox(GeneralOptionsPage) self.rename_files_2.setObjectName("rename_files_2") self.gridlayout1 = QtWidgets.QGridLayout(self.rename_files_2) self.gridlayout1.setSpacing(2) self.gridlayout1.setObjectName("gridlayout1") self.login = QtWidgets.QPushButton(self.rename_files_2) self.login.setObjectName("login") self.gridlayout1.addWidget(self.login, 1, 0, 1, 1) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridlayout1.addItem(spacerItem, 1, 2, 1, 1) self.logout = QtWidgets.QPushButton(self.rename_files_2) self.logout.setObjectName("logout") self.gridlayout1.addWidget(self.logout, 1, 1, 1, 1) self.logged_in = QtWidgets.QLabel(self.rename_files_2) self.logged_in.setText("") self.logged_in.setObjectName("logged_in") self.gridlayout1.addWidget(self.logged_in, 0, 0, 1, 3) self.vboxlayout.addWidget(self.rename_files_2) self.groupBox_2 = QtWidgets.QGroupBox(GeneralOptionsPage) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout.setObjectName("verticalLayout") self.analyze_new_files = QtWidgets.QCheckBox(self.groupBox_2) self.analyze_new_files.setObjectName("analyze_new_files") self.verticalLayout.addWidget(self.analyze_new_files) self.ignore_file_mbids = QtWidgets.QCheckBox(self.groupBox_2) self.ignore_file_mbids.setObjectName("ignore_file_mbids") self.verticalLayout.addWidget(self.ignore_file_mbids) self.vboxlayout.addWidget(self.groupBox_2) self.update_check_groupbox = QtWidgets.QGroupBox(GeneralOptionsPage) self.update_check_groupbox.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.update_check_groupbox.sizePolicy().hasHeightForWidth()) self.update_check_groupbox.setSizePolicy(sizePolicy) self.update_check_groupbox.setObjectName("update_check_groupbox") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.update_check_groupbox) self.verticalLayout_2.setObjectName("verticalLayout_2") self.check_for_updates = QtWidgets.QCheckBox(self.update_check_groupbox) self.check_for_updates.setObjectName("check_for_updates") self.verticalLayout_2.addWidget(self.check_for_updates) self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setContentsMargins(-1, -1, -1, 0) self.gridLayout.setObjectName("gridLayout") self.label_2 = QtWidgets.QLabel(self.update_check_groupbox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) self.label_2.setSizePolicy(sizePolicy) self.label_2.setObjectName("label_2") self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1) self.update_check_days = QtWidgets.QSpinBox(self.update_check_groupbox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.update_check_days.sizePolicy().hasHeightForWidth()) self.update_check_days.setSizePolicy(sizePolicy) self.update_check_days.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.update_check_days.setMinimum(1) self.update_check_days.setObjectName("update_check_days") self.gridLayout.addWidget(self.update_check_days, 0, 1, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout) self.gridLayout_2 = QtWidgets.QGridLayout() self.gridLayout_2.setContentsMargins(-1, -1, -1, 0) self.gridLayout_2.setObjectName("gridLayout_2") self.label_3 = QtWidgets.QLabel(self.update_check_groupbox) self.label_3.setObjectName("label_3") self.gridLayout_2.addWidget(self.label_3, 0, 0, 1, 1) self.update_level = QtWidgets.QComboBox(self.update_check_groupbox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.update_level.sizePolicy().hasHeightForWidth()) self.update_level.setSizePolicy(sizePolicy) self.update_level.setEditable(False) self.update_level.setObjectName("update_level") self.gridLayout_2.addWidget(self.update_level, 0, 1, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout_2) self.vboxlayout.addWidget(self.update_check_groupbox) spacerItem1 = QtWidgets.QSpacerItem(181, 21, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.retranslateUi(GeneralOptionsPage) QtCore.QMetaObject.connectSlotsByName(GeneralOptionsPage) GeneralOptionsPage.setTabOrder(self.server_host, self.server_port) def retranslateUi(self, GeneralOptionsPage): _translate = QtCore.QCoreApplication.translate self.groupBox.setTitle(_("MusicBrainz Server")) self.label_7.setText(_("Port:")) self.label.setText(_("Server address:")) self.rename_files_2.setTitle(_("MusicBrainz Account")) self.login.setText(_("Log in")) self.logout.setText(_("Log out")) self.groupBox_2.setTitle(_("General")) self.analyze_new_files.setText(_("Automatically scan all new files")) self.ignore_file_mbids.setText(_("Ignore MBIDs when loading new files")) self.update_check_groupbox.setTitle(_("Update Checking")) self.check_for_updates.setText(_("Check for updates during start-up")) self.label_2.setText(_("Days between checks:")) self.label_3.setText(_("Updates to check:")) picard-release-2.3.1/picard/ui/ui_options_genres.py000066400000000000000000000162621362601763300223770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_GenresOptionsPage(object): def setupUi(self, GenresOptionsPage): GenresOptionsPage.setObjectName("GenresOptionsPage") GenresOptionsPage.resize(590, 471) self.verticalLayout_2 = QtWidgets.QVBoxLayout(GenresOptionsPage) self.verticalLayout_2.setObjectName("verticalLayout_2") self.use_genres = QtWidgets.QGroupBox(GenresOptionsPage) self.use_genres.setFlat(False) self.use_genres.setCheckable(True) self.use_genres.setChecked(False) self.use_genres.setObjectName("use_genres") self.verticalLayout = QtWidgets.QVBoxLayout(self.use_genres) self.verticalLayout.setObjectName("verticalLayout") self.only_my_genres = QtWidgets.QCheckBox(self.use_genres) self.only_my_genres.setObjectName("only_my_genres") self.verticalLayout.addWidget(self.only_my_genres) self.artists_genres = QtWidgets.QCheckBox(self.use_genres) self.artists_genres.setObjectName("artists_genres") self.verticalLayout.addWidget(self.artists_genres) self.folksonomy_tags = QtWidgets.QCheckBox(self.use_genres) self.folksonomy_tags.setObjectName("folksonomy_tags") self.verticalLayout.addWidget(self.folksonomy_tags) self.hboxlayout = QtWidgets.QHBoxLayout() self.hboxlayout.setContentsMargins(0, 0, 0, 0) self.hboxlayout.setSpacing(6) self.hboxlayout.setObjectName("hboxlayout") self.label_5 = QtWidgets.QLabel(self.use_genres) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth()) self.label_5.setSizePolicy(sizePolicy) self.label_5.setObjectName("label_5") self.hboxlayout.addWidget(self.label_5) self.min_genre_usage = QtWidgets.QSpinBox(self.use_genres) self.min_genre_usage.setMaximum(100) self.min_genre_usage.setObjectName("min_genre_usage") self.hboxlayout.addWidget(self.min_genre_usage) self.verticalLayout.addLayout(self.hboxlayout) self.hboxlayout1 = QtWidgets.QHBoxLayout() self.hboxlayout1.setContentsMargins(0, 0, 0, 0) self.hboxlayout1.setSpacing(6) self.hboxlayout1.setObjectName("hboxlayout1") self.label_6 = QtWidgets.QLabel(self.use_genres) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) self.label_6.setSizePolicy(sizePolicy) self.label_6.setObjectName("label_6") self.hboxlayout1.addWidget(self.label_6) self.max_genres = QtWidgets.QSpinBox(self.use_genres) self.max_genres.setMaximum(100) self.max_genres.setObjectName("max_genres") self.hboxlayout1.addWidget(self.max_genres) self.verticalLayout.addLayout(self.hboxlayout1) self.hboxlayout2 = QtWidgets.QHBoxLayout() self.hboxlayout2.setContentsMargins(0, 0, 0, 0) self.hboxlayout2.setSpacing(6) self.hboxlayout2.setObjectName("hboxlayout2") self.ignore_genres_4 = QtWidgets.QLabel(self.use_genres) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.ignore_genres_4.sizePolicy().hasHeightForWidth()) self.ignore_genres_4.setSizePolicy(sizePolicy) self.ignore_genres_4.setObjectName("ignore_genres_4") self.hboxlayout2.addWidget(self.ignore_genres_4) self.join_genres = QtWidgets.QComboBox(self.use_genres) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.join_genres.sizePolicy().hasHeightForWidth()) self.join_genres.setSizePolicy(sizePolicy) self.join_genres.setEditable(True) self.join_genres.setObjectName("join_genres") self.join_genres.addItem("") self.join_genres.setItemText(0, "") self.join_genres.addItem("") self.join_genres.addItem("") self.hboxlayout2.addWidget(self.join_genres) self.verticalLayout.addLayout(self.hboxlayout2) self.label_genres_filter = QtWidgets.QLabel(self.use_genres) self.label_genres_filter.setObjectName("label_genres_filter") self.verticalLayout.addWidget(self.label_genres_filter) self.genres_filter = QtWidgets.QPlainTextEdit(self.use_genres) self.genres_filter.setObjectName("genres_filter") self.verticalLayout.addWidget(self.genres_filter) self.label_test_genres_filter = QtWidgets.QLabel(self.use_genres) self.label_test_genres_filter.setObjectName("label_test_genres_filter") self.verticalLayout.addWidget(self.label_test_genres_filter) self.test_genres_filter = QtWidgets.QPlainTextEdit(self.use_genres) self.test_genres_filter.setObjectName("test_genres_filter") self.verticalLayout.addWidget(self.test_genres_filter) self.label_test_genres_filter_error = QtWidgets.QLabel(self.use_genres) self.label_test_genres_filter_error.setText("") self.label_test_genres_filter_error.setObjectName("label_test_genres_filter_error") self.verticalLayout.addWidget(self.label_test_genres_filter_error) self.verticalLayout_2.addWidget(self.use_genres) spacerItem = QtWidgets.QSpacerItem(181, 31, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem) self.label_5.setBuddy(self.min_genre_usage) self.label_6.setBuddy(self.min_genre_usage) self.retranslateUi(GenresOptionsPage) QtCore.QMetaObject.connectSlotsByName(GenresOptionsPage) def retranslateUi(self, GenresOptionsPage): _translate = QtCore.QCoreApplication.translate self.use_genres.setTitle(_("Use genres from MusicBrainz")) self.only_my_genres.setText(_("Only use my genres")) self.artists_genres.setText(_("Fall back on album\'s artists genres if no genres are found for the release or release group")) self.folksonomy_tags.setText(_("Use folksonomy tags as genre")) self.label_5.setText(_("Minimal genre usage:")) self.min_genre_usage.setSuffix(_(" %")) self.label_6.setText(_("Maximum number of genres:")) self.ignore_genres_4.setText(_("Join multiple genres with:")) self.join_genres.setItemText(1, _(" / ")) self.join_genres.setItemText(2, _(", ")) self.label_genres_filter.setText(_("Genres or folksonomy tags to include or exclude, one per line:")) self.label_test_genres_filter.setText(_("Playground for genres or folksonomy tags filters (cleared on exit):")) picard-release-2.3.1/picard/ui/ui_options_interface.py000066400000000000000000000217331362601763300230530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_InterfaceOptionsPage(object): def setupUi(self, InterfaceOptionsPage): InterfaceOptionsPage.setObjectName("InterfaceOptionsPage") InterfaceOptionsPage.resize(466, 500) self.vboxlayout = QtWidgets.QVBoxLayout(InterfaceOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.groupBox_2 = QtWidgets.QGroupBox(InterfaceOptionsPage) self.groupBox_2.setObjectName("groupBox_2") self.vboxlayout1 = QtWidgets.QVBoxLayout(self.groupBox_2) self.vboxlayout1.setObjectName("vboxlayout1") self.toolbar_show_labels = QtWidgets.QCheckBox(self.groupBox_2) self.toolbar_show_labels.setObjectName("toolbar_show_labels") self.vboxlayout1.addWidget(self.toolbar_show_labels) self.toolbar_multiselect = QtWidgets.QCheckBox(self.groupBox_2) self.toolbar_multiselect.setObjectName("toolbar_multiselect") self.vboxlayout1.addWidget(self.toolbar_multiselect) self.builtin_search = QtWidgets.QCheckBox(self.groupBox_2) self.builtin_search.setObjectName("builtin_search") self.vboxlayout1.addWidget(self.builtin_search) self.use_adv_search_syntax = QtWidgets.QCheckBox(self.groupBox_2) self.use_adv_search_syntax.setObjectName("use_adv_search_syntax") self.vboxlayout1.addWidget(self.use_adv_search_syntax) self.quit_confirmation = QtWidgets.QCheckBox(self.groupBox_2) self.quit_confirmation.setObjectName("quit_confirmation") self.vboxlayout1.addWidget(self.quit_confirmation) self.starting_directory = QtWidgets.QCheckBox(self.groupBox_2) self.starting_directory.setObjectName("starting_directory") self.vboxlayout1.addWidget(self.starting_directory) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setSpacing(2) self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.starting_directory_path = QtWidgets.QLineEdit(self.groupBox_2) self.starting_directory_path.setEnabled(False) self.starting_directory_path.setObjectName("starting_directory_path") self.horizontalLayout_4.addWidget(self.starting_directory_path) self.starting_directory_browse = QtWidgets.QPushButton(self.groupBox_2) self.starting_directory_browse.setEnabled(False) self.starting_directory_browse.setObjectName("starting_directory_browse") self.horizontalLayout_4.addWidget(self.starting_directory_browse) self.vboxlayout1.addLayout(self.horizontalLayout_4) self.label = QtWidgets.QLabel(self.groupBox_2) self.label.setObjectName("label") self.vboxlayout1.addWidget(self.label) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.ui_language = QtWidgets.QComboBox(self.groupBox_2) self.ui_language.setObjectName("ui_language") self.horizontalLayout.addWidget(self.ui_language) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.vboxlayout1.addLayout(self.horizontalLayout) self.vboxlayout.addWidget(self.groupBox_2) self.customize_toolbar_box = QtWidgets.QGroupBox(InterfaceOptionsPage) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.customize_toolbar_box.sizePolicy().hasHeightForWidth()) self.customize_toolbar_box.setSizePolicy(sizePolicy) self.customize_toolbar_box.setObjectName("customize_toolbar_box") self.verticalLayout = QtWidgets.QVBoxLayout(self.customize_toolbar_box) self.verticalLayout.setObjectName("verticalLayout") self.toolbar_layout_list = QtWidgets.QListWidget(self.customize_toolbar_box) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.toolbar_layout_list.sizePolicy().hasHeightForWidth()) self.toolbar_layout_list.setSizePolicy(sizePolicy) self.toolbar_layout_list.setObjectName("toolbar_layout_list") self.verticalLayout.addWidget(self.toolbar_layout_list) self.edit_button_box = QtWidgets.QWidget(self.customize_toolbar_box) self.edit_button_box.setObjectName("edit_button_box") self.edit_box_layout = QtWidgets.QHBoxLayout(self.edit_button_box) self.edit_box_layout.setContentsMargins(0, 0, 0, 0) self.edit_box_layout.setObjectName("edit_box_layout") self.add_button = QtWidgets.QToolButton(self.edit_button_box) self.add_button.setObjectName("add_button") self.edit_box_layout.addWidget(self.add_button) self.insert_separator_button = QtWidgets.QToolButton(self.edit_button_box) self.insert_separator_button.setObjectName("insert_separator_button") self.edit_box_layout.addWidget(self.insert_separator_button) spacerItem1 = QtWidgets.QSpacerItem(50, 20, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum) self.edit_box_layout.addItem(spacerItem1) self.up_button = QtWidgets.QToolButton(self.edit_button_box) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-up.png") self.up_button.setIcon(icon) self.up_button.setObjectName("up_button") self.edit_box_layout.addWidget(self.up_button) self.down_button = QtWidgets.QToolButton(self.edit_button_box) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-down.png") self.down_button.setIcon(icon) self.down_button.setObjectName("down_button") self.edit_box_layout.addWidget(self.down_button) self.remove_button = QtWidgets.QToolButton(self.edit_button_box) self.remove_button.setObjectName("remove_button") self.edit_box_layout.addWidget(self.remove_button) self.verticalLayout.addWidget(self.edit_button_box) self.vboxlayout.addWidget(self.customize_toolbar_box) self.retranslateUi(InterfaceOptionsPage) QtCore.QMetaObject.connectSlotsByName(InterfaceOptionsPage) InterfaceOptionsPage.setTabOrder(self.toolbar_show_labels, self.toolbar_multiselect) InterfaceOptionsPage.setTabOrder(self.toolbar_multiselect, self.builtin_search) InterfaceOptionsPage.setTabOrder(self.builtin_search, self.use_adv_search_syntax) InterfaceOptionsPage.setTabOrder(self.use_adv_search_syntax, self.quit_confirmation) InterfaceOptionsPage.setTabOrder(self.quit_confirmation, self.starting_directory) InterfaceOptionsPage.setTabOrder(self.starting_directory, self.starting_directory_path) InterfaceOptionsPage.setTabOrder(self.starting_directory_path, self.starting_directory_browse) InterfaceOptionsPage.setTabOrder(self.starting_directory_browse, self.ui_language) InterfaceOptionsPage.setTabOrder(self.ui_language, self.toolbar_layout_list) InterfaceOptionsPage.setTabOrder(self.toolbar_layout_list, self.add_button) InterfaceOptionsPage.setTabOrder(self.add_button, self.insert_separator_button) InterfaceOptionsPage.setTabOrder(self.insert_separator_button, self.up_button) InterfaceOptionsPage.setTabOrder(self.up_button, self.down_button) InterfaceOptionsPage.setTabOrder(self.down_button, self.remove_button) def retranslateUi(self, InterfaceOptionsPage): _translate = QtCore.QCoreApplication.translate self.groupBox_2.setTitle(_("Miscellaneous")) self.toolbar_show_labels.setText(_("Show text labels under icons")) self.toolbar_multiselect.setText(_("Allow selection of multiple directories")) self.builtin_search.setText(_("Use builtin search rather than looking in browser")) self.use_adv_search_syntax.setText(_("Use advanced query syntax")) self.quit_confirmation.setText(_("Show a quit confirmation dialog for unsaved changes")) self.starting_directory.setText(_("Begin browsing in the following directory:")) self.starting_directory_browse.setText(_("Browse...")) self.label.setText(_("User interface language:")) self.customize_toolbar_box.setTitle(_("Customize Action Toolbar")) self.add_button.setToolTip(_("Add a new button to Toolbar")) self.add_button.setText(_("Add Action")) self.insert_separator_button.setToolTip(_("Insert a separator")) self.insert_separator_button.setText(_("Add Separator")) self.up_button.setToolTip(_("Move selected item up")) self.down_button.setToolTip(_("Move selected item down")) self.remove_button.setToolTip(_("Remove button from toolbar")) self.remove_button.setText(_("Remove")) picard-release-2.3.1/picard/ui/ui_options_interface_colors.py000066400000000000000000000047021362601763300244310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_InterfaceColorsOptionsPage(object): def setupUi(self, InterfaceColorsOptionsPage): InterfaceColorsOptionsPage.setObjectName("InterfaceColorsOptionsPage") InterfaceColorsOptionsPage.resize(171, 137) self.vboxlayout = QtWidgets.QVBoxLayout(InterfaceColorsOptionsPage) self.vboxlayout.setContentsMargins(0, 0, 0, 0) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.scrollArea = QtWidgets.QScrollArea(InterfaceColorsOptionsPage) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) self.scrollArea.setFrameShadow(QtWidgets.QFrame.Plain) self.scrollArea.setLineWidth(0) self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.scrollArea.setWidgetResizable(True) self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 199, 137)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setContentsMargins(9, 9, 9, 9) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName("verticalLayout") self.colors = QtWidgets.QGroupBox(self.scrollAreaWidgetContents) self.colors.setObjectName("colors") self.verticalLayout.addWidget(self.colors) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.vboxlayout.addWidget(self.scrollArea) self.retranslateUi(InterfaceColorsOptionsPage) QtCore.QMetaObject.connectSlotsByName(InterfaceColorsOptionsPage) def retranslateUi(self, InterfaceColorsOptionsPage): _translate = QtCore.QCoreApplication.translate self.colors.setTitle(_("Colors")) picard-release-2.3.1/picard/ui/ui_options_interface_top_tags.py000066400000000000000000000034371362601763300247540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_InterfaceTopTagsOptionsPage(object): def setupUi(self, InterfaceTopTagsOptionsPage): InterfaceTopTagsOptionsPage.setObjectName("InterfaceTopTagsOptionsPage") InterfaceTopTagsOptionsPage.resize(418, 310) self.vboxlayout = QtWidgets.QVBoxLayout(InterfaceTopTagsOptionsPage) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.groupBox = QtWidgets.QGroupBox(InterfaceTopTagsOptionsPage) self.groupBox.setObjectName("groupBox") self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout.setObjectName("verticalLayout") self.top_tags_list = TagListEditor(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.top_tags_list.sizePolicy().hasHeightForWidth()) self.top_tags_list.setSizePolicy(sizePolicy) self.top_tags_list.setObjectName("top_tags_list") self.verticalLayout.addWidget(self.top_tags_list) self.vboxlayout.addWidget(self.groupBox) self.retranslateUi(InterfaceTopTagsOptionsPage) QtCore.QMetaObject.connectSlotsByName(InterfaceTopTagsOptionsPage) def retranslateUi(self, InterfaceTopTagsOptionsPage): _translate = QtCore.QCoreApplication.translate self.groupBox.setTitle(_("Show the below tags above all other tags in the metadata view")) from picard.ui.widgets.taglisteditor import TagListEditor picard-release-2.3.1/picard/ui/ui_options_matching.py000066400000000000000000000103541362601763300227020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MatchingOptionsPage(object): def setupUi(self, MatchingOptionsPage): MatchingOptionsPage.setObjectName("MatchingOptionsPage") MatchingOptionsPage.resize(413, 612) self.vboxlayout = QtWidgets.QVBoxLayout(MatchingOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.rename_files = QtWidgets.QGroupBox(MatchingOptionsPage) self.rename_files.setObjectName("rename_files") self.gridlayout = QtWidgets.QGridLayout(self.rename_files) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.label_6 = QtWidgets.QLabel(self.rename_files) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) self.label_6.setSizePolicy(sizePolicy) self.label_6.setObjectName("label_6") self.gridlayout.addWidget(self.label_6, 2, 0, 1, 1) self.track_matching_threshold = QtWidgets.QSpinBox(self.rename_files) self.track_matching_threshold.setMaximum(100) self.track_matching_threshold.setObjectName("track_matching_threshold") self.gridlayout.addWidget(self.track_matching_threshold, 2, 1, 1, 1) self.cluster_lookup_threshold = QtWidgets.QSpinBox(self.rename_files) self.cluster_lookup_threshold.setMaximum(100) self.cluster_lookup_threshold.setObjectName("cluster_lookup_threshold") self.gridlayout.addWidget(self.cluster_lookup_threshold, 1, 1, 1, 1) self.file_lookup_threshold = QtWidgets.QSpinBox(self.rename_files) self.file_lookup_threshold.setMaximum(100) self.file_lookup_threshold.setObjectName("file_lookup_threshold") self.gridlayout.addWidget(self.file_lookup_threshold, 0, 1, 1, 1) self.label_4 = QtWidgets.QLabel(self.rename_files) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_4.sizePolicy().hasHeightForWidth()) self.label_4.setSizePolicy(sizePolicy) self.label_4.setObjectName("label_4") self.gridlayout.addWidget(self.label_4, 0, 0, 1, 1) self.label_5 = QtWidgets.QLabel(self.rename_files) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth()) self.label_5.setSizePolicy(sizePolicy) self.label_5.setObjectName("label_5") self.gridlayout.addWidget(self.label_5, 1, 0, 1, 1) self.vboxlayout.addWidget(self.rename_files) spacerItem = QtWidgets.QSpacerItem(20, 41, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_6.setBuddy(self.file_lookup_threshold) self.label_4.setBuddy(self.file_lookup_threshold) self.label_5.setBuddy(self.file_lookup_threshold) self.retranslateUi(MatchingOptionsPage) QtCore.QMetaObject.connectSlotsByName(MatchingOptionsPage) MatchingOptionsPage.setTabOrder(self.file_lookup_threshold, self.cluster_lookup_threshold) MatchingOptionsPage.setTabOrder(self.cluster_lookup_threshold, self.track_matching_threshold) def retranslateUi(self, MatchingOptionsPage): _translate = QtCore.QCoreApplication.translate self.rename_files.setTitle(_("Thresholds")) self.label_6.setText(_("Minimal similarity for matching files to tracks:")) self.track_matching_threshold.setSuffix(_(" %")) self.cluster_lookup_threshold.setSuffix(_(" %")) self.file_lookup_threshold.setSuffix(_(" %")) self.label_4.setText(_("Minimal similarity for file lookups:")) self.label_5.setText(_("Minimal similarity for cluster lookups:")) picard-release-2.3.1/picard/ui/ui_options_metadata.py000066400000000000000000000152011362601763300226640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MetadataOptionsPage(object): def setupUi(self, MetadataOptionsPage): MetadataOptionsPage.setObjectName("MetadataOptionsPage") MetadataOptionsPage.resize(423, 553) self.verticalLayout = QtWidgets.QVBoxLayout(MetadataOptionsPage) self.verticalLayout.setObjectName("verticalLayout") self.metadata_groupbox = QtWidgets.QGroupBox(MetadataOptionsPage) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.metadata_groupbox.sizePolicy().hasHeightForWidth()) self.metadata_groupbox.setSizePolicy(sizePolicy) self.metadata_groupbox.setMinimumSize(QtCore.QSize(397, 135)) self.metadata_groupbox.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.metadata_groupbox.setObjectName("metadata_groupbox") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.metadata_groupbox) self.verticalLayout_3.setObjectName("verticalLayout_3") self.translate_artist_names = QtWidgets.QCheckBox(self.metadata_groupbox) self.translate_artist_names.setObjectName("translate_artist_names") self.verticalLayout_3.addWidget(self.translate_artist_names) self.artist_locale = QtWidgets.QComboBox(self.metadata_groupbox) self.artist_locale.setObjectName("artist_locale") self.verticalLayout_3.addWidget(self.artist_locale) self.standardize_artists = QtWidgets.QCheckBox(self.metadata_groupbox) self.standardize_artists.setObjectName("standardize_artists") self.verticalLayout_3.addWidget(self.standardize_artists) self.standardize_instruments = QtWidgets.QCheckBox(self.metadata_groupbox) self.standardize_instruments.setObjectName("standardize_instruments") self.verticalLayout_3.addWidget(self.standardize_instruments) self.convert_punctuation = QtWidgets.QCheckBox(self.metadata_groupbox) self.convert_punctuation.setObjectName("convert_punctuation") self.verticalLayout_3.addWidget(self.convert_punctuation) self.release_ars = QtWidgets.QCheckBox(self.metadata_groupbox) self.release_ars.setObjectName("release_ars") self.verticalLayout_3.addWidget(self.release_ars) self.track_ars = QtWidgets.QCheckBox(self.metadata_groupbox) self.track_ars.setObjectName("track_ars") self.verticalLayout_3.addWidget(self.track_ars) self.verticalLayout.addWidget(self.metadata_groupbox) self.custom_fields_groupbox = QtWidgets.QGroupBox(MetadataOptionsPage) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.custom_fields_groupbox.sizePolicy().hasHeightForWidth()) self.custom_fields_groupbox.setSizePolicy(sizePolicy) self.custom_fields_groupbox.setMinimumSize(QtCore.QSize(397, 0)) self.custom_fields_groupbox.setObjectName("custom_fields_groupbox") self.gridlayout = QtWidgets.QGridLayout(self.custom_fields_groupbox) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.label_6 = QtWidgets.QLabel(self.custom_fields_groupbox) self.label_6.setObjectName("label_6") self.gridlayout.addWidget(self.label_6, 0, 0, 1, 2) self.label_7 = QtWidgets.QLabel(self.custom_fields_groupbox) self.label_7.setObjectName("label_7") self.gridlayout.addWidget(self.label_7, 2, 0, 1, 2) self.nat_name = QtWidgets.QLineEdit(self.custom_fields_groupbox) self.nat_name.setObjectName("nat_name") self.gridlayout.addWidget(self.nat_name, 3, 0, 1, 1) self.nat_name_default = QtWidgets.QPushButton(self.custom_fields_groupbox) self.nat_name_default.setObjectName("nat_name_default") self.gridlayout.addWidget(self.nat_name_default, 3, 1, 1, 1) self.va_name_default = QtWidgets.QPushButton(self.custom_fields_groupbox) self.va_name_default.setObjectName("va_name_default") self.gridlayout.addWidget(self.va_name_default, 1, 1, 1, 1) self.va_name = QtWidgets.QLineEdit(self.custom_fields_groupbox) self.va_name.setObjectName("va_name") self.gridlayout.addWidget(self.va_name, 1, 0, 1, 1) self.verticalLayout.addWidget(self.custom_fields_groupbox) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.MinimumExpanding) self.verticalLayout.addItem(spacerItem) self.label_6.setBuddy(self.va_name_default) self.label_7.setBuddy(self.nat_name_default) self.retranslateUi(MetadataOptionsPage) QtCore.QMetaObject.connectSlotsByName(MetadataOptionsPage) MetadataOptionsPage.setTabOrder(self.translate_artist_names, self.artist_locale) MetadataOptionsPage.setTabOrder(self.artist_locale, self.standardize_artists) MetadataOptionsPage.setTabOrder(self.standardize_artists, self.convert_punctuation) MetadataOptionsPage.setTabOrder(self.convert_punctuation, self.release_ars) MetadataOptionsPage.setTabOrder(self.release_ars, self.track_ars) MetadataOptionsPage.setTabOrder(self.track_ars, self.va_name) MetadataOptionsPage.setTabOrder(self.va_name, self.va_name_default) MetadataOptionsPage.setTabOrder(self.va_name_default, self.nat_name) MetadataOptionsPage.setTabOrder(self.nat_name, self.nat_name_default) def retranslateUi(self, MetadataOptionsPage): _translate = QtCore.QCoreApplication.translate self.metadata_groupbox.setTitle(_("Metadata")) self.translate_artist_names.setText(_("Translate artist names to this locale where possible:")) self.standardize_artists.setText(_("Use standardized artist names")) self.standardize_instruments.setText(_("Use standardized instrument and vocal credits")) self.convert_punctuation.setText(_("Convert Unicode punctuation characters to ASCII")) self.release_ars.setText(_("Use release relationships")) self.track_ars.setText(_("Use track relationships")) self.custom_fields_groupbox.setTitle(_("Custom Fields")) self.label_6.setText(_("Various artists:")) self.label_7.setText(_("Non-album tracks:")) self.nat_name_default.setText(_("Default")) self.va_name_default.setText(_("Default")) picard-release-2.3.1/picard/ui/ui_options_network.py000066400000000000000000000145271362601763300226070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_NetworkOptionsPage(object): def setupUi(self, NetworkOptionsPage): NetworkOptionsPage.setObjectName("NetworkOptionsPage") NetworkOptionsPage.resize(316, 337) self.vboxlayout = QtWidgets.QVBoxLayout(NetworkOptionsPage) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.web_proxy = QtWidgets.QGroupBox(NetworkOptionsPage) self.web_proxy.setCheckable(True) self.web_proxy.setObjectName("web_proxy") self.gridlayout = QtWidgets.QGridLayout(self.web_proxy) self.gridlayout.setContentsMargins(9, 9, 9, 9) self.gridlayout.setSpacing(2) self.gridlayout.setObjectName("gridlayout") self.password = QtWidgets.QLineEdit(self.web_proxy) self.password.setEchoMode(QtWidgets.QLineEdit.Password) self.password.setObjectName("password") self.gridlayout.addWidget(self.password, 5, 0, 1, 2) self.username = QtWidgets.QLineEdit(self.web_proxy) self.username.setObjectName("username") self.gridlayout.addWidget(self.username, 3, 0, 1, 2) self.label_5 = QtWidgets.QLabel(self.web_proxy) self.label_5.setObjectName("label_5") self.gridlayout.addWidget(self.label_5, 4, 0, 1, 2) self.label_6 = QtWidgets.QLabel(self.web_proxy) self.label_6.setObjectName("label_6") self.gridlayout.addWidget(self.label_6, 2, 0, 1, 2) self.server_host = QtWidgets.QLineEdit(self.web_proxy) self.server_host.setObjectName("server_host") self.gridlayout.addWidget(self.server_host, 1, 0, 1, 1) self.label_7 = QtWidgets.QLabel(self.web_proxy) self.label_7.setObjectName("label_7") self.gridlayout.addWidget(self.label_7, 0, 1, 1, 1) self.server_port = QtWidgets.QSpinBox(self.web_proxy) self.server_port.setMinimum(1) self.server_port.setMaximum(65535) self.server_port.setProperty("value", 80) self.server_port.setObjectName("server_port") self.gridlayout.addWidget(self.server_port, 1, 1, 1, 1) self.label = QtWidgets.QLabel(self.web_proxy) self.label.setObjectName("label") self.gridlayout.addWidget(self.label, 0, 0, 1, 1) self.vboxlayout.addWidget(self.web_proxy) self.browser_integration = QtWidgets.QGroupBox(NetworkOptionsPage) self.browser_integration.setCheckable(True) self.browser_integration.setChecked(True) self.browser_integration.setObjectName("browser_integration") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.browser_integration) self.verticalLayout_2.setObjectName("verticalLayout_2") self.widget = QtWidgets.QWidget(self.browser_integration) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth()) self.widget.setSizePolicy(sizePolicy) self.widget.setObjectName("widget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) self.horizontalLayout.setContentsMargins(6, 0, 0, 0) self.horizontalLayout.setObjectName("horizontalLayout") self.label_2 = QtWidgets.QLabel(self.widget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) self.label_2.setSizePolicy(sizePolicy) self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.label_2.setObjectName("label_2") self.horizontalLayout.addWidget(self.label_2) self.browser_integration_port = QtWidgets.QSpinBox(self.widget) self.browser_integration_port.setMinimum(1) self.browser_integration_port.setMaximum(65535) self.browser_integration_port.setProperty("value", 8000) self.browser_integration_port.setObjectName("browser_integration_port") self.horizontalLayout.addWidget(self.browser_integration_port) self.verticalLayout_2.addWidget(self.widget) self.browser_integration_localhost_only = QtWidgets.QCheckBox(self.browser_integration) self.browser_integration_localhost_only.setChecked(False) self.browser_integration_localhost_only.setObjectName("browser_integration_localhost_only") self.verticalLayout_2.addWidget(self.browser_integration_localhost_only) self.vboxlayout.addWidget(self.browser_integration) spacerItem = QtWidgets.QSpacerItem(101, 31, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.label_5.setBuddy(self.password) self.label_6.setBuddy(self.username) self.label.setBuddy(self.server_host) self.retranslateUi(NetworkOptionsPage) QtCore.QMetaObject.connectSlotsByName(NetworkOptionsPage) NetworkOptionsPage.setTabOrder(self.web_proxy, self.server_host) NetworkOptionsPage.setTabOrder(self.server_host, self.server_port) NetworkOptionsPage.setTabOrder(self.server_port, self.username) NetworkOptionsPage.setTabOrder(self.username, self.password) NetworkOptionsPage.setTabOrder(self.password, self.browser_integration) NetworkOptionsPage.setTabOrder(self.browser_integration, self.browser_integration_port) NetworkOptionsPage.setTabOrder(self.browser_integration_port, self.browser_integration_localhost_only) def retranslateUi(self, NetworkOptionsPage): _translate = QtCore.QCoreApplication.translate self.web_proxy.setTitle(_("Web Proxy")) self.label_5.setText(_("Password:")) self.label_6.setText(_("Username:")) self.label_7.setText(_("Port:")) self.label.setText(_("Server address:")) self.browser_integration.setTitle(_("Browser Integration")) self.label_2.setText(_("Default listening port:")) self.browser_integration_localhost_only.setText(_("Listen only on localhost")) picard-release-2.3.1/picard/ui/ui_options_plugins.py000066400000000000000000000176171362601763300226020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_PluginsOptionsPage(object): def setupUi(self, PluginsOptionsPage): PluginsOptionsPage.setObjectName("PluginsOptionsPage") PluginsOptionsPage.resize(697, 441) self.vboxlayout = QtWidgets.QVBoxLayout(PluginsOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.plugins_container = QtWidgets.QSplitter(PluginsOptionsPage) self.plugins_container.setEnabled(True) self.plugins_container.setOrientation(QtCore.Qt.Vertical) self.plugins_container.setHandleWidth(2) self.plugins_container.setObjectName("plugins_container") self.groupBox_2 = QtWidgets.QGroupBox(self.plugins_container) self.groupBox_2.setObjectName("groupBox_2") self.vboxlayout1 = QtWidgets.QVBoxLayout(self.groupBox_2) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setObjectName("vboxlayout1") self.plugins = QtWidgets.QTreeWidget(self.groupBox_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.plugins.sizePolicy().hasHeightForWidth()) self.plugins.setSizePolicy(sizePolicy) self.plugins.setAcceptDrops(True) self.plugins.setDragDropMode(QtWidgets.QAbstractItemView.DropOnly) self.plugins.setRootIsDecorated(False) self.plugins.setObjectName("plugins") self.plugins.headerItem().setTextAlignment(2, QtCore.Qt.AlignCenter) self.vboxlayout1.addWidget(self.plugins) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.install_plugin = QtWidgets.QPushButton(self.groupBox_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.install_plugin.sizePolicy().hasHeightForWidth()) self.install_plugin.setSizePolicy(sizePolicy) self.install_plugin.setObjectName("install_plugin") self.horizontalLayout.addWidget(self.install_plugin) self.folder_open = QtWidgets.QPushButton(self.groupBox_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.folder_open.sizePolicy().hasHeightForWidth()) self.folder_open.setSizePolicy(sizePolicy) self.folder_open.setObjectName("folder_open") self.horizontalLayout.addWidget(self.folder_open) self.reload_list_of_plugins = QtWidgets.QPushButton(self.groupBox_2) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.reload_list_of_plugins.sizePolicy().hasHeightForWidth()) self.reload_list_of_plugins.setSizePolicy(sizePolicy) self.reload_list_of_plugins.setObjectName("reload_list_of_plugins") self.horizontalLayout.addWidget(self.reload_list_of_plugins) self.vboxlayout1.addLayout(self.horizontalLayout) self.groupBox = QtWidgets.QGroupBox(self.plugins_container) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy) self.groupBox.setObjectName("groupBox") self.vboxlayout2 = QtWidgets.QVBoxLayout(self.groupBox) self.vboxlayout2.setSpacing(0) self.vboxlayout2.setObjectName("vboxlayout2") self.scrollArea = QtWidgets.QScrollArea(self.groupBox) self.scrollArea.setEnabled(True) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setFrameShape(QtWidgets.QFrame.HLine) self.scrollArea.setFrameShadow(QtWidgets.QFrame.Plain) self.scrollArea.setLineWidth(0) self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) self.scrollArea.setWidgetResizable(True) self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 655, 82)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollAreaWidgetContents.sizePolicy().hasHeightForWidth()) self.scrollAreaWidgetContents.setSizePolicy(sizePolicy) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) self.verticalLayout.setContentsMargins(0, 0, 6, 0) self.verticalLayout.setObjectName("verticalLayout") self.details = QtWidgets.QLabel(self.scrollAreaWidgetContents) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.details.sizePolicy().hasHeightForWidth()) self.details.setSizePolicy(sizePolicy) self.details.setMinimumSize(QtCore.QSize(0, 0)) self.details.setFrameShape(QtWidgets.QFrame.Box) self.details.setLineWidth(0) self.details.setText("") self.details.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.details.setWordWrap(True) self.details.setIndent(0) self.details.setOpenExternalLinks(True) self.details.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) self.details.setObjectName("details") self.verticalLayout.addWidget(self.details) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.vboxlayout2.addWidget(self.scrollArea) self.vboxlayout.addWidget(self.plugins_container) self.retranslateUi(PluginsOptionsPage) QtCore.QMetaObject.connectSlotsByName(PluginsOptionsPage) PluginsOptionsPage.setTabOrder(self.plugins, self.install_plugin) PluginsOptionsPage.setTabOrder(self.install_plugin, self.folder_open) PluginsOptionsPage.setTabOrder(self.folder_open, self.reload_list_of_plugins) PluginsOptionsPage.setTabOrder(self.reload_list_of_plugins, self.scrollArea) def retranslateUi(self, PluginsOptionsPage): _translate = QtCore.QCoreApplication.translate self.groupBox_2.setTitle(_("Plugins")) self.plugins.headerItem().setText(0, _("Name")) self.plugins.headerItem().setText(1, _("Version")) self.plugins.headerItem().setText(2, _("Actions")) self.install_plugin.setText(_("Install plugin...")) self.folder_open.setText(_("Open plugin folder")) self.reload_list_of_plugins.setText(_("Reload List of Plugins")) self.groupBox.setTitle(_("Details")) picard-release-2.3.1/picard/ui/ui_options_ratings.py000066400000000000000000000050361362601763300225600ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RatingsOptionsPage(object): def setupUi(self, RatingsOptionsPage): RatingsOptionsPage.setObjectName("RatingsOptionsPage") RatingsOptionsPage.resize(397, 267) self.vboxlayout = QtWidgets.QVBoxLayout(RatingsOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.enable_ratings = QtWidgets.QGroupBox(RatingsOptionsPage) self.enable_ratings.setCheckable(True) self.enable_ratings.setChecked(True) self.enable_ratings.setObjectName("enable_ratings") self.vboxlayout1 = QtWidgets.QVBoxLayout(self.enable_ratings) self.vboxlayout1.setObjectName("vboxlayout1") self.label = QtWidgets.QLabel(self.enable_ratings) self.label.setWordWrap(True) self.label.setObjectName("label") self.vboxlayout1.addWidget(self.label) self.ignore_tags_2 = QtWidgets.QLabel(self.enable_ratings) self.ignore_tags_2.setEnabled(True) self.ignore_tags_2.setWordWrap(True) self.ignore_tags_2.setObjectName("ignore_tags_2") self.vboxlayout1.addWidget(self.ignore_tags_2) self.rating_user_email = QtWidgets.QLineEdit(self.enable_ratings) self.rating_user_email.setReadOnly(False) self.rating_user_email.setObjectName("rating_user_email") self.vboxlayout1.addWidget(self.rating_user_email) self.submit_ratings = QtWidgets.QCheckBox(self.enable_ratings) self.submit_ratings.setObjectName("submit_ratings") self.vboxlayout1.addWidget(self.submit_ratings) self.vboxlayout.addWidget(self.enable_ratings) spacerItem = QtWidgets.QSpacerItem(181, 31, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.retranslateUi(RatingsOptionsPage) QtCore.QMetaObject.connectSlotsByName(RatingsOptionsPage) def retranslateUi(self, RatingsOptionsPage): _translate = QtCore.QCoreApplication.translate self.enable_ratings.setTitle(_("Enable track ratings")) self.label.setText(_("Picard saves the ratings together with an e-mail address identifying the user who did the rating. That way different ratings for different users can be stored in the files. Please specify the e-mail you want to use to save your ratings.")) self.ignore_tags_2.setText(_("E-mail:")) self.submit_ratings.setText(_("Submit ratings to MusicBrainz")) picard-release-2.3.1/picard/ui/ui_options_releases.py000066400000000000000000000163471362601763300227230ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ReleasesOptionsPage(object): def setupUi(self, ReleasesOptionsPage): ReleasesOptionsPage.setObjectName("ReleasesOptionsPage") ReleasesOptionsPage.resize(551, 497) self.verticalLayout_3 = QtWidgets.QVBoxLayout(ReleasesOptionsPage) self.verticalLayout_3.setObjectName("verticalLayout_3") self.type_group = QtWidgets.QGroupBox(ReleasesOptionsPage) self.type_group.setObjectName("type_group") self.gridLayout = QtWidgets.QGridLayout(self.type_group) self.gridLayout.setVerticalSpacing(6) self.gridLayout.setObjectName("gridLayout") self.verticalLayout_3.addWidget(self.type_group) self.country_group = QtWidgets.QGroupBox(ReleasesOptionsPage) self.country_group.setObjectName("country_group") self.horizontalLayout = QtWidgets.QHBoxLayout(self.country_group) self.horizontalLayout.setSpacing(4) self.horizontalLayout.setObjectName("horizontalLayout") self.country_list = QtWidgets.QListWidget(self.country_group) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.country_list.sizePolicy().hasHeightForWidth()) self.country_list.setSizePolicy(sizePolicy) self.country_list.setObjectName("country_list") self.horizontalLayout.addWidget(self.country_list) self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.add_countries = QtWidgets.QPushButton(self.country_group) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-next.png") self.add_countries.setIcon(icon) self.add_countries.setObjectName("add_countries") self.verticalLayout.addWidget(self.add_countries) self.remove_countries = QtWidgets.QPushButton(self.country_group) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-previous.png") self.remove_countries.setIcon(icon) self.remove_countries.setObjectName("remove_countries") self.verticalLayout.addWidget(self.remove_countries) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.horizontalLayout.addLayout(self.verticalLayout) self.preferred_country_list = QtWidgets.QListWidget(self.country_group) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.preferred_country_list.sizePolicy().hasHeightForWidth()) self.preferred_country_list.setSizePolicy(sizePolicy) self.preferred_country_list.setDragEnabled(True) self.preferred_country_list.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.preferred_country_list.setObjectName("preferred_country_list") self.horizontalLayout.addWidget(self.preferred_country_list) self.verticalLayout_3.addWidget(self.country_group) self.format_group = QtWidgets.QGroupBox(ReleasesOptionsPage) self.format_group.setObjectName("format_group") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.format_group) self.horizontalLayout_2.setSpacing(4) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.format_list = QtWidgets.QListWidget(self.format_group) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.format_list.sizePolicy().hasHeightForWidth()) self.format_list.setSizePolicy(sizePolicy) self.format_list.setObjectName("format_list") self.horizontalLayout_2.addWidget(self.format_list) self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem2) self.add_formats = QtWidgets.QPushButton(self.format_group) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-next.png") self.add_formats.setIcon(icon) self.add_formats.setObjectName("add_formats") self.verticalLayout_2.addWidget(self.add_formats) self.remove_formats = QtWidgets.QPushButton(self.format_group) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-previous.png") self.remove_formats.setIcon(icon) self.remove_formats.setObjectName("remove_formats") self.verticalLayout_2.addWidget(self.remove_formats) spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem3) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.preferred_format_list = QtWidgets.QListWidget(self.format_group) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.preferred_format_list.sizePolicy().hasHeightForWidth()) self.preferred_format_list.setSizePolicy(sizePolicy) self.preferred_format_list.setDragEnabled(True) self.preferred_format_list.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.preferred_format_list.setObjectName("preferred_format_list") self.horizontalLayout_2.addWidget(self.preferred_format_list) self.verticalLayout_3.addWidget(self.format_group) self.retranslateUi(ReleasesOptionsPage) QtCore.QMetaObject.connectSlotsByName(ReleasesOptionsPage) def retranslateUi(self, ReleasesOptionsPage): _translate = QtCore.QCoreApplication.translate self.type_group.setTitle(_("Preferred release types")) self.country_group.setTitle(_("Preferred release countries")) self.add_countries.setToolTip(_("Add to preferred release countries")) self.add_countries.setAccessibleDescription(_("Add to preferred release countries")) self.remove_countries.setToolTip(_("Remove from preferred release countries")) self.remove_countries.setAccessibleDescription(_("Remove from preferred release countries")) self.format_group.setTitle(_("Preferred release formats")) self.add_formats.setToolTip(_("Add to preferred release formats")) self.add_formats.setAccessibleName(_("Add to preferred release formats")) self.remove_formats.setToolTip(_("Remove from preferred release formats")) self.remove_formats.setAccessibleDescription(_("Remove from preferred release formats")) picard-release-2.3.1/picard/ui/ui_options_renaming.py000066400000000000000000000224741362601763300227160ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_RenamingOptionsPage(object): def setupUi(self, RenamingOptionsPage): RenamingOptionsPage.setObjectName("RenamingOptionsPage") RenamingOptionsPage.setEnabled(True) RenamingOptionsPage.resize(453, 540) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(RenamingOptionsPage.sizePolicy().hasHeightForWidth()) RenamingOptionsPage.setSizePolicy(sizePolicy) self.verticalLayout_5 = QtWidgets.QVBoxLayout(RenamingOptionsPage) self.verticalLayout_5.setObjectName("verticalLayout_5") self.move_files = QtWidgets.QGroupBox(RenamingOptionsPage) self.move_files.setFlat(False) self.move_files.setCheckable(True) self.move_files.setChecked(False) self.move_files.setObjectName("move_files") self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.move_files) self.verticalLayout_4.setObjectName("verticalLayout_4") self.label = QtWidgets.QLabel(self.move_files) self.label.setObjectName("label") self.verticalLayout_4.addWidget(self.label) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setSpacing(2) self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.move_files_to = QtWidgets.QLineEdit(self.move_files) self.move_files_to.setEnabled(False) self.move_files_to.setObjectName("move_files_to") self.horizontalLayout_4.addWidget(self.move_files_to) self.move_files_to_browse = QtWidgets.QPushButton(self.move_files) self.move_files_to_browse.setEnabled(False) self.move_files_to_browse.setObjectName("move_files_to_browse") self.horizontalLayout_4.addWidget(self.move_files_to_browse) self.verticalLayout_4.addLayout(self.horizontalLayout_4) self.move_additional_files = QtWidgets.QCheckBox(self.move_files) self.move_additional_files.setEnabled(False) self.move_additional_files.setObjectName("move_additional_files") self.verticalLayout_4.addWidget(self.move_additional_files) self.move_additional_files_pattern = QtWidgets.QLineEdit(self.move_files) self.move_additional_files_pattern.setEnabled(False) self.move_additional_files_pattern.setObjectName("move_additional_files_pattern") self.verticalLayout_4.addWidget(self.move_additional_files_pattern) self.delete_empty_dirs = QtWidgets.QCheckBox(self.move_files) self.delete_empty_dirs.setEnabled(False) self.delete_empty_dirs.setObjectName("delete_empty_dirs") self.verticalLayout_4.addWidget(self.delete_empty_dirs) self.verticalLayout_5.addWidget(self.move_files) self.rename_files = QtWidgets.QCheckBox(RenamingOptionsPage) self.rename_files.setObjectName("rename_files") self.verticalLayout_5.addWidget(self.rename_files) self.ascii_filenames = QtWidgets.QCheckBox(RenamingOptionsPage) self.ascii_filenames.setObjectName("ascii_filenames") self.verticalLayout_5.addWidget(self.ascii_filenames) self.windows_compatibility = QtWidgets.QCheckBox(RenamingOptionsPage) self.windows_compatibility.setObjectName("windows_compatibility") self.verticalLayout_5.addWidget(self.windows_compatibility) self.file_naming_format_label = QtWidgets.QLabel(RenamingOptionsPage) self.file_naming_format_label.setObjectName("file_naming_format_label") self.verticalLayout_5.addWidget(self.file_naming_format_label) self.file_naming_format = QtWidgets.QTextEdit(RenamingOptionsPage) self.file_naming_format.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.file_naming_format.sizePolicy().hasHeightForWidth()) self.file_naming_format.setSizePolicy(sizePolicy) self.file_naming_format.setMinimumSize(QtCore.QSize(0, 0)) self.file_naming_format.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.IBeamCursor)) self.file_naming_format.setTabChangesFocus(False) self.file_naming_format.setLineWrapMode(QtWidgets.QTextEdit.NoWrap) self.file_naming_format.setTabStopWidth(20) self.file_naming_format.setAcceptRichText(False) self.file_naming_format.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction) self.file_naming_format.setObjectName("file_naming_format") self.verticalLayout_5.addWidget(self.file_naming_format) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setSpacing(2) self.horizontalLayout.setObjectName("horizontalLayout") self.renaming_error = QtWidgets.QLabel(RenamingOptionsPage) self.renaming_error.setText("") self.renaming_error.setAlignment(QtCore.Qt.AlignCenter) self.renaming_error.setObjectName("renaming_error") self.horizontalLayout.addWidget(self.renaming_error) self.file_naming_format_default = QtWidgets.QPushButton(RenamingOptionsPage) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.file_naming_format_default.sizePolicy().hasHeightForWidth()) self.file_naming_format_default.setSizePolicy(sizePolicy) self.file_naming_format_default.setMinimumSize(QtCore.QSize(0, 0)) self.file_naming_format_default.setObjectName("file_naming_format_default") self.horizontalLayout.addWidget(self.file_naming_format_default) self.verticalLayout_5.addLayout(self.horizontalLayout) self.file_naming_format_documentation = QtWidgets.QLabel(RenamingOptionsPage) self.file_naming_format_documentation.setText("") self.file_naming_format_documentation.setTextFormat(QtCore.Qt.RichText) self.file_naming_format_documentation.setWordWrap(True) self.file_naming_format_documentation.setOpenExternalLinks(True) self.file_naming_format_documentation.setObjectName("file_naming_format_documentation") self.verticalLayout_5.addWidget(self.file_naming_format_documentation) self.groupBox = QtWidgets.QGroupBox(RenamingOptionsPage) self.groupBox.setObjectName("groupBox") self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout.setContentsMargins(2, 0, 2, 0) self.verticalLayout.setObjectName("verticalLayout") self.example_filename = QtWidgets.QLabel(self.groupBox) self.example_filename.setText("") self.example_filename.setTextFormat(QtCore.Qt.RichText) self.example_filename.setWordWrap(True) self.example_filename.setObjectName("example_filename") self.verticalLayout.addWidget(self.example_filename) self.example_filename_va = QtWidgets.QLabel(self.groupBox) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.example_filename_va.sizePolicy().hasHeightForWidth()) self.example_filename_va.setSizePolicy(sizePolicy) self.example_filename_va.setText("") self.example_filename_va.setWordWrap(True) self.example_filename_va.setObjectName("example_filename_va") self.verticalLayout.addWidget(self.example_filename_va) self.verticalLayout_5.addWidget(self.groupBox) self.retranslateUi(RenamingOptionsPage) QtCore.QMetaObject.connectSlotsByName(RenamingOptionsPage) RenamingOptionsPage.setTabOrder(self.move_files, self.move_files_to) RenamingOptionsPage.setTabOrder(self.move_files_to, self.move_files_to_browse) RenamingOptionsPage.setTabOrder(self.move_files_to_browse, self.move_additional_files) RenamingOptionsPage.setTabOrder(self.move_additional_files, self.move_additional_files_pattern) RenamingOptionsPage.setTabOrder(self.move_additional_files_pattern, self.delete_empty_dirs) RenamingOptionsPage.setTabOrder(self.delete_empty_dirs, self.file_naming_format_default) def retranslateUi(self, RenamingOptionsPage): _translate = QtCore.QCoreApplication.translate self.move_files.setTitle(_("Move files when saving")) self.label.setText(_("Destination directory:")) self.move_files_to_browse.setText(_("Browse...")) self.move_additional_files.setText(_("Move additional files (case insensitive):")) self.delete_empty_dirs.setText(_("Delete empty directories")) self.rename_files.setText(_("Rename files when saving")) self.ascii_filenames.setText(_("Replace non-ASCII characters")) self.windows_compatibility.setText(_("Windows compatibility")) self.file_naming_format_label.setText(_("Name files like this")) self.file_naming_format_default.setText(_("Default")) self.groupBox.setTitle(_("Examples")) picard-release-2.3.1/picard/ui/ui_options_script.py000066400000000000000000000133611362601763300224150ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ScriptingOptionsPage(object): def setupUi(self, ScriptingOptionsPage): ScriptingOptionsPage.setObjectName("ScriptingOptionsPage") ScriptingOptionsPage.resize(605, 551) self.vboxlayout = QtWidgets.QVBoxLayout(ScriptingOptionsPage) self.vboxlayout.setContentsMargins(9, 9, 9, 9) self.vboxlayout.setSpacing(6) self.vboxlayout.setObjectName("vboxlayout") self.enable_tagger_scripts = QtWidgets.QGroupBox(ScriptingOptionsPage) self.enable_tagger_scripts.setCheckable(True) self.enable_tagger_scripts.setObjectName("enable_tagger_scripts") self.verticalLayout = QtWidgets.QVBoxLayout(self.enable_tagger_scripts) self.verticalLayout.setObjectName("verticalLayout") self.splitter = QtWidgets.QSplitter(self.enable_tagger_scripts) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.splitter.sizePolicy().hasHeightForWidth()) self.splitter.setSizePolicy(sizePolicy) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setChildrenCollapsible(False) self.splitter.setObjectName("splitter") self.script_list = ScriptListWidget(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.script_list.sizePolicy().hasHeightForWidth()) self.script_list.setSizePolicy(sizePolicy) self.script_list.setMinimumSize(QtCore.QSize(120, 0)) self.script_list.setObjectName("script_list") self.formWidget = QtWidgets.QWidget(self.splitter) self.formWidget.setObjectName("formWidget") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.formWidget) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.tagger_script = QtWidgets.QTextEdit(self.formWidget) self.tagger_script.setAcceptRichText(False) self.tagger_script.setObjectName("tagger_script") self.verticalLayout_2.addWidget(self.tagger_script) self.verticalLayout.addWidget(self.splitter) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.add_button = QtWidgets.QToolButton(self.enable_tagger_scripts) self.add_button.setObjectName("add_button") self.horizontalLayout.addWidget(self.add_button) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.move_up_button = QtWidgets.QToolButton(self.enable_tagger_scripts) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-up.png") self.move_up_button.setIcon(icon) self.move_up_button.setObjectName("move_up_button") self.horizontalLayout.addWidget(self.move_up_button) self.move_down_button = QtWidgets.QToolButton(self.enable_tagger_scripts) icon = QtGui.QIcon.fromTheme(":/images/16x16/go-down.png") self.move_down_button.setIcon(icon) self.move_down_button.setObjectName("move_down_button") self.horizontalLayout.addWidget(self.move_down_button) self.remove_button = QtWidgets.QToolButton(self.enable_tagger_scripts) self.remove_button.setObjectName("remove_button") self.horizontalLayout.addWidget(self.remove_button) self.verticalLayout.addLayout(self.horizontalLayout) self.script_error = QtWidgets.QLabel(self.enable_tagger_scripts) self.script_error.setText("") self.script_error.setAlignment(QtCore.Qt.AlignCenter) self.script_error.setObjectName("script_error") self.verticalLayout.addWidget(self.script_error) self.scripting_doc_link = QtWidgets.QLabel(self.enable_tagger_scripts) self.scripting_doc_link.setText("") self.scripting_doc_link.setWordWrap(True) self.scripting_doc_link.setOpenExternalLinks(True) self.scripting_doc_link.setObjectName("scripting_doc_link") self.verticalLayout.addWidget(self.scripting_doc_link) self.vboxlayout.addWidget(self.enable_tagger_scripts) self.retranslateUi(ScriptingOptionsPage) self.add_button.clicked.connect(self.script_list.add_script) self.tagger_script.textChanged.connect(ScriptingOptionsPage.live_update_and_check) self.script_list.itemSelectionChanged.connect(ScriptingOptionsPage.script_selected) self.remove_button.clicked.connect(self.script_list.remove_selected_script) QtCore.QMetaObject.connectSlotsByName(ScriptingOptionsPage) ScriptingOptionsPage.setTabOrder(self.enable_tagger_scripts, self.add_button) ScriptingOptionsPage.setTabOrder(self.add_button, self.script_list) ScriptingOptionsPage.setTabOrder(self.script_list, self.tagger_script) def retranslateUi(self, ScriptingOptionsPage): _translate = QtCore.QCoreApplication.translate self.enable_tagger_scripts.setTitle(_("Tagger Script(s)")) self.add_button.setToolTip(_("Add new script")) self.add_button.setText(_("Add new script")) self.move_up_button.setToolTip(_("Move script up")) self.move_down_button.setToolTip(_("Move script down")) self.remove_button.setText(_("Remove script")) from picard.ui.widgets.scriptlistwidget import ScriptListWidget picard-release-2.3.1/picard/ui/ui_options_tags.py000066400000000000000000000077231362601763300220540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_TagsOptionsPage(object): def setupUi(self, TagsOptionsPage): TagsOptionsPage.setObjectName("TagsOptionsPage") TagsOptionsPage.resize(539, 525) self.vboxlayout = QtWidgets.QVBoxLayout(TagsOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.write_tags = QtWidgets.QCheckBox(TagsOptionsPage) self.write_tags.setObjectName("write_tags") self.vboxlayout.addWidget(self.write_tags) self.preserve_timestamps = QtWidgets.QCheckBox(TagsOptionsPage) self.preserve_timestamps.setObjectName("preserve_timestamps") self.vboxlayout.addWidget(self.preserve_timestamps) self.before_tagging = QtWidgets.QGroupBox(TagsOptionsPage) self.before_tagging.setObjectName("before_tagging") self.vboxlayout1 = QtWidgets.QVBoxLayout(self.before_tagging) self.vboxlayout1.setContentsMargins(-1, 6, -1, 7) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setObjectName("vboxlayout1") self.clear_existing_tags = QtWidgets.QCheckBox(self.before_tagging) self.clear_existing_tags.setObjectName("clear_existing_tags") self.vboxlayout1.addWidget(self.clear_existing_tags) self.remove_id3_from_flac = QtWidgets.QCheckBox(self.before_tagging) self.remove_id3_from_flac.setObjectName("remove_id3_from_flac") self.vboxlayout1.addWidget(self.remove_id3_from_flac) self.remove_ape_from_mp3 = QtWidgets.QCheckBox(self.before_tagging) self.remove_ape_from_mp3.setObjectName("remove_ape_from_mp3") self.vboxlayout1.addWidget(self.remove_ape_from_mp3) spacerItem = QtWidgets.QSpacerItem(20, 6, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.vboxlayout1.addItem(spacerItem) self.preserved_tags_label = QtWidgets.QLabel(self.before_tagging) self.preserved_tags_label.setObjectName("preserved_tags_label") self.vboxlayout1.addWidget(self.preserved_tags_label) self.preserved_tags = QtWidgets.QLineEdit(self.before_tagging) self.preserved_tags.setObjectName("preserved_tags") self.vboxlayout1.addWidget(self.preserved_tags) self.preserved_tags_help = QtWidgets.QLabel(self.before_tagging) self.preserved_tags_help.setObjectName("preserved_tags_help") self.vboxlayout1.addWidget(self.preserved_tags_help) self.vboxlayout.addWidget(self.before_tagging) spacerItem1 = QtWidgets.QSpacerItem(274, 41, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.retranslateUi(TagsOptionsPage) QtCore.QMetaObject.connectSlotsByName(TagsOptionsPage) TagsOptionsPage.setTabOrder(self.write_tags, self.preserve_timestamps) TagsOptionsPage.setTabOrder(self.preserve_timestamps, self.clear_existing_tags) TagsOptionsPage.setTabOrder(self.clear_existing_tags, self.remove_id3_from_flac) TagsOptionsPage.setTabOrder(self.remove_id3_from_flac, self.remove_ape_from_mp3) TagsOptionsPage.setTabOrder(self.remove_ape_from_mp3, self.preserved_tags) def retranslateUi(self, TagsOptionsPage): _translate = QtCore.QCoreApplication.translate self.write_tags.setText(_("Write tags to files")) self.preserve_timestamps.setText(_("Preserve timestamps of tagged files")) self.before_tagging.setTitle(_("Before Tagging")) self.clear_existing_tags.setText(_("Clear existing tags")) self.remove_id3_from_flac.setText(_("Remove ID3 tags from FLAC files")) self.remove_ape_from_mp3.setText(_("Remove APEv2 tags from MP3 files")) self.preserved_tags_label.setText(_("Preserve these tags from being cleared or overwritten with MusicBrainz data:")) self.preserved_tags_help.setText(_("Tags are separated by commas and are case-insensitive.")) picard-release-2.3.1/picard/ui/ui_options_tags_compatibility.py000066400000000000000000000231541362601763300250010ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_TagsCompatibilityOptionsPage(object): def setupUi(self, TagsCompatibilityOptionsPage): TagsCompatibilityOptionsPage.setObjectName("TagsCompatibilityOptionsPage") TagsCompatibilityOptionsPage.resize(539, 525) self.vboxlayout = QtWidgets.QVBoxLayout(TagsCompatibilityOptionsPage) self.vboxlayout.setObjectName("vboxlayout") self.tag_compatibility = QtWidgets.QGroupBox(TagsCompatibilityOptionsPage) self.tag_compatibility.setObjectName("tag_compatibility") self.vboxlayout1 = QtWidgets.QVBoxLayout(self.tag_compatibility) self.vboxlayout1.setContentsMargins(-1, 6, -1, 7) self.vboxlayout1.setSpacing(2) self.vboxlayout1.setObjectName("vboxlayout1") self.id3v2_version = QtWidgets.QGroupBox(self.tag_compatibility) self.id3v2_version.setFlat(False) self.id3v2_version.setCheckable(False) self.id3v2_version.setObjectName("id3v2_version") self.horizontalLayout = QtWidgets.QHBoxLayout(self.id3v2_version) self.horizontalLayout.setContentsMargins(-1, 6, -1, 7) self.horizontalLayout.setObjectName("horizontalLayout") self.write_id3v24 = QtWidgets.QRadioButton(self.id3v2_version) self.write_id3v24.setChecked(True) self.write_id3v24.setObjectName("write_id3v24") self.horizontalLayout.addWidget(self.write_id3v24) self.write_id3v23 = QtWidgets.QRadioButton(self.id3v2_version) self.write_id3v23.setChecked(False) self.write_id3v23.setObjectName("write_id3v23") self.horizontalLayout.addWidget(self.write_id3v23) self.label = QtWidgets.QLabel(self.id3v2_version) self.label.setText("") self.label.setWordWrap(True) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.vboxlayout1.addWidget(self.id3v2_version) self.id3v2_text_encoding = QtWidgets.QGroupBox(self.tag_compatibility) self.id3v2_text_encoding.setObjectName("id3v2_text_encoding") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.id3v2_text_encoding) self.horizontalLayout_2.setContentsMargins(-1, 6, -1, 7) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.enc_utf8 = QtWidgets.QRadioButton(self.id3v2_text_encoding) self.enc_utf8.setObjectName("enc_utf8") self.horizontalLayout_2.addWidget(self.enc_utf8) self.enc_utf16 = QtWidgets.QRadioButton(self.id3v2_text_encoding) self.enc_utf16.setObjectName("enc_utf16") self.horizontalLayout_2.addWidget(self.enc_utf16) self.enc_iso88591 = QtWidgets.QRadioButton(self.id3v2_text_encoding) self.enc_iso88591.setObjectName("enc_iso88591") self.horizontalLayout_2.addWidget(self.enc_iso88591) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) self.label_2 = QtWidgets.QLabel(self.id3v2_text_encoding) self.label_2.setText("") self.label_2.setWordWrap(True) self.label_2.setObjectName("label_2") self.horizontalLayout_2.addWidget(self.label_2) self.vboxlayout1.addWidget(self.id3v2_text_encoding) self.hbox_id3v23_join_with = QtWidgets.QHBoxLayout() self.hbox_id3v23_join_with.setObjectName("hbox_id3v23_join_with") self.label_id3v23_join_with = QtWidgets.QLabel(self.tag_compatibility) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(4) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_id3v23_join_with.sizePolicy().hasHeightForWidth()) self.label_id3v23_join_with.setSizePolicy(sizePolicy) self.label_id3v23_join_with.setObjectName("label_id3v23_join_with") self.hbox_id3v23_join_with.addWidget(self.label_id3v23_join_with) self.id3v23_join_with = QtWidgets.QComboBox(self.tag_compatibility) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.id3v23_join_with.sizePolicy().hasHeightForWidth()) self.id3v23_join_with.setSizePolicy(sizePolicy) self.id3v23_join_with.setEditable(True) self.id3v23_join_with.setObjectName("id3v23_join_with") self.id3v23_join_with.addItem("") self.id3v23_join_with.setItemText(0, "/") self.id3v23_join_with.addItem("") self.id3v23_join_with.setItemText(1, "; ") self.id3v23_join_with.addItem("") self.id3v23_join_with.setItemText(2, " / ") self.hbox_id3v23_join_with.addWidget(self.id3v23_join_with) self.vboxlayout1.addLayout(self.hbox_id3v23_join_with) self.itunes_compatible_grouping = QtWidgets.QCheckBox(self.tag_compatibility) self.itunes_compatible_grouping.setObjectName("itunes_compatible_grouping") self.vboxlayout1.addWidget(self.itunes_compatible_grouping) self.write_id3v1 = QtWidgets.QCheckBox(self.tag_compatibility) self.write_id3v1.setObjectName("write_id3v1") self.vboxlayout1.addWidget(self.write_id3v1) self.vboxlayout.addWidget(self.tag_compatibility) self.aac_tags = QtWidgets.QGroupBox(TagsCompatibilityOptionsPage) self.aac_tags.setObjectName("aac_tags") self.verticalLayout = QtWidgets.QVBoxLayout(self.aac_tags) self.verticalLayout.setObjectName("verticalLayout") self.aac_save_ape = QtWidgets.QRadioButton(self.aac_tags) self.aac_save_ape.setChecked(True) self.aac_save_ape.setObjectName("aac_save_ape") self.verticalLayout.addWidget(self.aac_save_ape) self.aac_no_tags = QtWidgets.QRadioButton(self.aac_tags) self.aac_no_tags.setObjectName("aac_no_tags") self.verticalLayout.addWidget(self.aac_no_tags) self.remove_ape_from_aac = QtWidgets.QCheckBox(self.aac_tags) self.remove_ape_from_aac.setObjectName("remove_ape_from_aac") self.verticalLayout.addWidget(self.remove_ape_from_aac) self.vboxlayout.addWidget(self.aac_tags) self.ac3_files = QtWidgets.QGroupBox(TagsCompatibilityOptionsPage) self.ac3_files.setObjectName("ac3_files") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.ac3_files) self.verticalLayout_2.setObjectName("verticalLayout_2") self.ac3_save_ape = QtWidgets.QRadioButton(self.ac3_files) self.ac3_save_ape.setChecked(True) self.ac3_save_ape.setObjectName("ac3_save_ape") self.verticalLayout_2.addWidget(self.ac3_save_ape) self.ac3_no_tags = QtWidgets.QRadioButton(self.ac3_files) self.ac3_no_tags.setObjectName("ac3_no_tags") self.verticalLayout_2.addWidget(self.ac3_no_tags) self.remove_ape_from_ac3 = QtWidgets.QCheckBox(self.ac3_files) self.remove_ape_from_ac3.setObjectName("remove_ape_from_ac3") self.verticalLayout_2.addWidget(self.remove_ape_from_ac3) self.vboxlayout.addWidget(self.ac3_files) spacerItem2 = QtWidgets.QSpacerItem(274, 41, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem2) self.retranslateUi(TagsCompatibilityOptionsPage) QtCore.QMetaObject.connectSlotsByName(TagsCompatibilityOptionsPage) TagsCompatibilityOptionsPage.setTabOrder(self.write_id3v24, self.write_id3v23) TagsCompatibilityOptionsPage.setTabOrder(self.write_id3v23, self.enc_utf8) TagsCompatibilityOptionsPage.setTabOrder(self.enc_utf8, self.enc_utf16) TagsCompatibilityOptionsPage.setTabOrder(self.enc_utf16, self.enc_iso88591) TagsCompatibilityOptionsPage.setTabOrder(self.enc_iso88591, self.id3v23_join_with) TagsCompatibilityOptionsPage.setTabOrder(self.id3v23_join_with, self.write_id3v1) def retranslateUi(self, TagsCompatibilityOptionsPage): _translate = QtCore.QCoreApplication.translate self.tag_compatibility.setTitle(_("ID3")) self.id3v2_version.setTitle(_("ID3v2 Version")) self.write_id3v24.setText(_("2.4")) self.write_id3v23.setText(_("2.3")) self.id3v2_text_encoding.setTitle(_("ID3v2 Text Encoding")) self.enc_utf8.setText(_("UTF-8")) self.enc_utf16.setText(_("UTF-16")) self.enc_iso88591.setText(_("ISO-8859-1")) self.label_id3v23_join_with.setText(_("Join multiple ID3v2.3 tags with:")) self.id3v23_join_with.setToolTip(_("

Default is \'/\' to maintain compatibility with previous Picard releases.

New alternatives are \';_\' or \'_/_\' or type your own.

")) self.itunes_compatible_grouping.setText(_("Save iTunes compatible grouping and work")) self.write_id3v1.setText(_("Also include ID3v1 tags in the files")) self.aac_tags.setTitle(_("AAC files")) self.aac_save_ape.setText(_("Save APEv2 tags")) self.aac_no_tags.setText(_("Do not save tags")) self.remove_ape_from_aac.setText(_("Remove APEv2 tags from AAC files")) self.ac3_files.setTitle(_("AC3 files")) self.ac3_save_ape.setText(_("Save APEv2 tags")) self.ac3_no_tags.setText(_("Do not save tags")) self.remove_ape_from_ac3.setText(_("Remove APEv2 tags from AC3 files")) picard-release-2.3.1/picard/ui/ui_passworddialog.py000066400000000000000000000062541362601763300223630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_PasswordDialog(object): def setupUi(self, PasswordDialog): PasswordDialog.setObjectName("PasswordDialog") PasswordDialog.setWindowModality(QtCore.Qt.WindowModal) PasswordDialog.resize(378, 246) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(PasswordDialog.sizePolicy().hasHeightForWidth()) PasswordDialog.setSizePolicy(sizePolicy) self.verticalLayout = QtWidgets.QVBoxLayout(PasswordDialog) self.verticalLayout.setObjectName("verticalLayout") self.info_text = QtWidgets.QLabel(PasswordDialog) self.info_text.setText("") self.info_text.setWordWrap(True) self.info_text.setObjectName("info_text") self.verticalLayout.addWidget(self.info_text) spacerItem = QtWidgets.QSpacerItem(20, 60, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.label = QtWidgets.QLabel(PasswordDialog) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.username = QtWidgets.QLineEdit(PasswordDialog) self.username.setWindowModality(QtCore.Qt.NonModal) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.username.sizePolicy().hasHeightForWidth()) self.username.setSizePolicy(sizePolicy) self.username.setObjectName("username") self.verticalLayout.addWidget(self.username) self.label_2 = QtWidgets.QLabel(PasswordDialog) self.label_2.setObjectName("label_2") self.verticalLayout.addWidget(self.label_2) self.password = QtWidgets.QLineEdit(PasswordDialog) self.password.setEchoMode(QtWidgets.QLineEdit.Password) self.password.setObjectName("password") self.verticalLayout.addWidget(self.password) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem1) self.buttonbox = QtWidgets.QDialogButtonBox(PasswordDialog) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) self.buttonbox.setObjectName("buttonbox") self.verticalLayout.addWidget(self.buttonbox) self.retranslateUi(PasswordDialog) self.buttonbox.rejected.connect(PasswordDialog.reject) QtCore.QMetaObject.connectSlotsByName(PasswordDialog) def retranslateUi(self, PasswordDialog): _translate = QtCore.QCoreApplication.translate PasswordDialog.setWindowTitle(_("Authentication required")) self.label.setText(_("Username:")) self.label_2.setText(_("Password:")) picard-release-2.3.1/picard/ui/ui_provider_options_caa.py000066400000000000000000000121761362601763300235520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_CaaOptions(object): def setupUi(self, CaaOptions): CaaOptions.setObjectName("CaaOptions") CaaOptions.resize(660, 194) self.verticalLayout = QtWidgets.QVBoxLayout(CaaOptions) self.verticalLayout.setObjectName("verticalLayout") self.select_caa_types_group = QtWidgets.QHBoxLayout() self.select_caa_types_group.setObjectName("select_caa_types_group") self.restrict_images_types = QtWidgets.QCheckBox(CaaOptions) self.restrict_images_types.setObjectName("restrict_images_types") self.select_caa_types_group.addWidget(self.restrict_images_types) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.select_caa_types_group.addItem(spacerItem) self.select_caa_types = QtWidgets.QPushButton(CaaOptions) self.select_caa_types.setEnabled(False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(100) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.select_caa_types.sizePolicy().hasHeightForWidth()) self.select_caa_types.setSizePolicy(sizePolicy) self.select_caa_types.setObjectName("select_caa_types") self.select_caa_types_group.addWidget(self.select_caa_types) self.verticalLayout.addLayout(self.select_caa_types_group) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtWidgets.QLabel(CaaOptions) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) self.label.setSizePolicy(sizePolicy) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.cb_image_size = QtWidgets.QComboBox(CaaOptions) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cb_image_size.sizePolicy().hasHeightForWidth()) self.cb_image_size.setSizePolicy(sizePolicy) self.cb_image_size.setObjectName("cb_image_size") self.horizontalLayout.addWidget(self.cb_image_size) self.verticalLayout.addLayout(self.horizontalLayout) self.cb_save_single_front_image = QtWidgets.QCheckBox(CaaOptions) self.cb_save_single_front_image.setObjectName("cb_save_single_front_image") self.verticalLayout.addWidget(self.cb_save_single_front_image) self.cb_approved_only = QtWidgets.QCheckBox(CaaOptions) self.cb_approved_only.setObjectName("cb_approved_only") self.verticalLayout.addWidget(self.cb_approved_only) self.cb_type_as_filename = QtWidgets.QCheckBox(CaaOptions) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cb_type_as_filename.sizePolicy().hasHeightForWidth()) self.cb_type_as_filename.setSizePolicy(sizePolicy) self.cb_type_as_filename.setObjectName("cb_type_as_filename") self.verticalLayout.addWidget(self.cb_type_as_filename) spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem2) self.retranslateUi(CaaOptions) QtCore.QMetaObject.connectSlotsByName(CaaOptions) CaaOptions.setTabOrder(self.restrict_images_types, self.select_caa_types) CaaOptions.setTabOrder(self.select_caa_types, self.cb_image_size) CaaOptions.setTabOrder(self.cb_image_size, self.cb_save_single_front_image) CaaOptions.setTabOrder(self.cb_save_single_front_image, self.cb_approved_only) CaaOptions.setTabOrder(self.cb_approved_only, self.cb_type_as_filename) def retranslateUi(self, CaaOptions): _translate = QtCore.QCoreApplication.translate CaaOptions.setWindowTitle(_("Form")) self.restrict_images_types.setText(_("Download only cover art images matching selected types")) self.select_caa_types.setText(_("Select types...")) self.label.setText(_("Only use images of the following size:")) self.cb_save_single_front_image.setText(_("Save only one front image as separate file")) self.cb_approved_only.setText(_("Download only approved images")) self.cb_type_as_filename.setText(_("Use the first image type as the filename. This will not change the filename of front images.")) picard-release-2.3.1/picard/ui/ui_provider_options_local.py000066400000000000000000000056431362601763300241210ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_LocalOptions(object): def setupUi(self, LocalOptions): LocalOptions.setObjectName("LocalOptions") LocalOptions.resize(472, 215) self.verticalLayout = QtWidgets.QVBoxLayout(LocalOptions) self.verticalLayout.setObjectName("verticalLayout") self.local_cover_regex_label = QtWidgets.QLabel(LocalOptions) self.local_cover_regex_label.setObjectName("local_cover_regex_label") self.verticalLayout.addWidget(self.local_cover_regex_label) self.local_cover_regex_edit = QtWidgets.QLineEdit(LocalOptions) self.local_cover_regex_edit.setObjectName("local_cover_regex_edit") self.verticalLayout.addWidget(self.local_cover_regex_edit) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.local_cover_regex_error = QtWidgets.QLabel(LocalOptions) self.local_cover_regex_error.setText("") self.local_cover_regex_error.setObjectName("local_cover_regex_error") self.horizontalLayout_2.addWidget(self.local_cover_regex_error) self.local_cover_regex_default = QtWidgets.QPushButton(LocalOptions) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.local_cover_regex_default.sizePolicy().hasHeightForWidth()) self.local_cover_regex_default.setSizePolicy(sizePolicy) self.local_cover_regex_default.setObjectName("local_cover_regex_default") self.horizontalLayout_2.addWidget(self.local_cover_regex_default) self.verticalLayout.addLayout(self.horizontalLayout_2) self.note = QtWidgets.QLabel(LocalOptions) font = QtGui.QFont() font.setItalic(True) self.note.setFont(font) self.note.setWordWrap(True) self.note.setObjectName("note") self.verticalLayout.addWidget(self.note) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.retranslateUi(LocalOptions) QtCore.QMetaObject.connectSlotsByName(LocalOptions) def retranslateUi(self, LocalOptions): _translate = QtCore.QCoreApplication.translate LocalOptions.setWindowTitle(_("Form")) self.local_cover_regex_label.setText(_("Local cover art files match the following regular expression:")) self.local_cover_regex_default.setText(_("Default")) self.note.setText(_("First group in the regular expression, if any, will be used as type, ie. cover-back-spine.jpg will be set as types Back + Spine. If no type is found, it will default to Front type.")) picard-release-2.3.1/picard/ui/ui_tagsfromfilenames.py000066400000000000000000000054021362601763300230410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_TagsFromFileNamesDialog(object): def setupUi(self, TagsFromFileNamesDialog): TagsFromFileNamesDialog.setObjectName("TagsFromFileNamesDialog") TagsFromFileNamesDialog.resize(560, 400) self.gridlayout = QtWidgets.QGridLayout(TagsFromFileNamesDialog) self.gridlayout.setContentsMargins(9, 9, 9, 9) self.gridlayout.setSpacing(6) self.gridlayout.setObjectName("gridlayout") self.files = QtWidgets.QTreeWidget(TagsFromFileNamesDialog) self.files.setAlternatingRowColors(True) self.files.setRootIsDecorated(False) self.files.setObjectName("files") self.files.headerItem().setText(0, "1") self.gridlayout.addWidget(self.files, 1, 0, 1, 2) self.replace_underscores = QtWidgets.QCheckBox(TagsFromFileNamesDialog) self.replace_underscores.setObjectName("replace_underscores") self.gridlayout.addWidget(self.replace_underscores, 2, 0, 1, 2) self.buttonbox = QtWidgets.QDialogButtonBox(TagsFromFileNamesDialog) self.buttonbox.setOrientation(QtCore.Qt.Horizontal) self.buttonbox.setObjectName("buttonbox") self.gridlayout.addWidget(self.buttonbox, 3, 0, 1, 2) self.preview = QtWidgets.QPushButton(TagsFromFileNamesDialog) self.preview.setObjectName("preview") self.gridlayout.addWidget(self.preview, 0, 1, 1, 1) self.format = QtWidgets.QComboBox(TagsFromFileNamesDialog) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.format.sizePolicy().hasHeightForWidth()) self.format.setSizePolicy(sizePolicy) self.format.setEditable(True) self.format.setObjectName("format") self.gridlayout.addWidget(self.format, 0, 0, 1, 1) self.retranslateUi(TagsFromFileNamesDialog) QtCore.QMetaObject.connectSlotsByName(TagsFromFileNamesDialog) TagsFromFileNamesDialog.setTabOrder(self.format, self.preview) TagsFromFileNamesDialog.setTabOrder(self.preview, self.files) TagsFromFileNamesDialog.setTabOrder(self.files, self.replace_underscores) TagsFromFileNamesDialog.setTabOrder(self.replace_underscores, self.buttonbox) def retranslateUi(self, TagsFromFileNamesDialog): _translate = QtCore.QCoreApplication.translate TagsFromFileNamesDialog.setWindowTitle(_("Convert File Names to Tags")) self.replace_underscores.setText(_("Replace underscores with spaces")) self.preview.setText(_("&Preview")) picard-release-2.3.1/picard/ui/ui_widget_taglisteditor.py000066400000000000000000000103161362601763300235540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Automatically generated - don't edit. # Use `python setup.py build_ui` to update it. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_TagListEditor(object): def setupUi(self, TagListEditor): TagListEditor.setObjectName("TagListEditor") TagListEditor.resize(400, 300) self.horizontalLayout = QtWidgets.QHBoxLayout(TagListEditor) self.horizontalLayout.setContentsMargins(0, 0, 0, 0) self.horizontalLayout.setSpacing(6) self.horizontalLayout.setObjectName("horizontalLayout") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.tag_list_view = UniqueEditableListView(TagListEditor) self.tag_list_view.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.tag_list_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.tag_list_view.setObjectName("tag_list_view") self.verticalLayout.addWidget(self.tag_list_view) self.edit_buttons = QtWidgets.QWidget(TagListEditor) self.edit_buttons.setObjectName("edit_buttons") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.edit_buttons) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.tags_add_btn = QtWidgets.QToolButton(self.edit_buttons) self.tags_add_btn.setObjectName("tags_add_btn") self.horizontalLayout_2.addWidget(self.tags_add_btn) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem) self.sort_buttons = QtWidgets.QWidget(self.edit_buttons) self.sort_buttons.setObjectName("sort_buttons") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.sort_buttons) self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.tags_move_up_btn = QtWidgets.QToolButton(self.sort_buttons) self.tags_move_up_btn.setText("") icon = QtGui.QIcon.fromTheme(":/images/16x16/go-up.png") self.tags_move_up_btn.setIcon(icon) self.tags_move_up_btn.setObjectName("tags_move_up_btn") self.horizontalLayout_3.addWidget(self.tags_move_up_btn) self.tags_move_down_btn = QtWidgets.QToolButton(self.sort_buttons) self.tags_move_down_btn.setText("") icon = QtGui.QIcon.fromTheme(":/images/16x16/go-down.png") self.tags_move_down_btn.setIcon(icon) self.tags_move_down_btn.setObjectName("tags_move_down_btn") self.horizontalLayout_3.addWidget(self.tags_move_down_btn) self.horizontalLayout_2.addWidget(self.sort_buttons) self.tags_remove_btn = QtWidgets.QToolButton(self.edit_buttons) self.tags_remove_btn.setObjectName("tags_remove_btn") self.horizontalLayout_2.addWidget(self.tags_remove_btn) self.verticalLayout.addWidget(self.edit_buttons) self.horizontalLayout.addLayout(self.verticalLayout) self.retranslateUi(TagListEditor) self.tags_add_btn.clicked.connect(self.tag_list_view.add_empty_row) self.tags_remove_btn.clicked.connect(self.tag_list_view.remove_selected_rows) self.tags_move_up_btn.clicked.connect(self.tag_list_view.move_selected_rows_up) self.tags_move_down_btn.clicked.connect(self.tag_list_view.move_selected_rows_down) QtCore.QMetaObject.connectSlotsByName(TagListEditor) def retranslateUi(self, TagListEditor): _translate = QtCore.QCoreApplication.translate TagListEditor.setWindowTitle(_("Form")) self.tags_add_btn.setText(_("Add new tag")) self.tags_move_up_btn.setToolTip(_("Move tag up")) self.tags_move_up_btn.setAccessibleName(_("Move tag up")) self.tags_move_down_btn.setToolTip(_("Move tag down")) self.tags_move_down_btn.setAccessibleName(_("Move tag down")) self.tags_remove_btn.setToolTip(_("Remove selected tags")) self.tags_remove_btn.setAccessibleName(_("Remove selected tags")) self.tags_remove_btn.setText(_("Remove tags")) from picard.ui.widgets.editablelistview import UniqueEditableListView picard-release-2.3.1/picard/ui/util.py000066400000000000000000000064501362601763300176170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2013-2015, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2017 Sophist-UK # Copyright (C) 2018 Vishal Choudhary # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtWidgets, ) from picard import config from picard.const.sys import ( IS_MACOS, IS_WIN, ) from picard.util import find_existing_path class StandardButton(QtWidgets.QPushButton): OK = 0 CANCEL = 1 HELP = 2 CLOSE = 4 __types = { OK: (N_('&Ok'), 'SP_DialogOkButton'), CANCEL: (N_('&Cancel'), 'SP_DialogCancelButton'), HELP: (N_('&Help'), 'SP_DialogHelpButton'), CLOSE: (N_('Clos&e'), 'SP_DialogCloseButton'), } def __init__(self, btntype): label = _(self.__types[btntype][0]) args = [label] if not IS_WIN and not IS_MACOS: iconname = self.__types[btntype][1] if hasattr(QtWidgets.QStyle, iconname): icon = self.tagger.style().standardIcon(getattr(QtWidgets.QStyle, iconname)) args = [icon, label] super().__init__(*args) # The following code is there to fix # https://tickets.metabrainz.org/browse/PICARD-417 # In some older version of PyQt/sip it's impossible to connect a signal # emitting an `int` to a slot expecting a `bool`. # By using `enabledSlot` instead we can force python to do the # conversion from int (`state`) to bool. def enabledSlot(func, state): """Calls `func` with `state`.""" func(state) def find_starting_directory(): if config.setting["starting_directory"]: path = config.setting["starting_directory_path"] else: path = config.persist["current_directory"] or QtCore.QDir.homePath() return find_existing_path(path) class MultiDirsSelectDialog(QtWidgets.QFileDialog): """Custom file selection dialog which allows the selection of multiple directories. Depending on the platform, dialog may fallback on non-native. """ def __init__(self, *args): super().__init__(*args) self.setFileMode(self.Directory) self.setOption(self.ShowDirsOnly) # The native dialog doesn't allow selecting >1 directory self.setOption(self.DontUseNativeDialog) for view in self.findChildren((QtWidgets.QListView, QtWidgets.QTreeView)): if isinstance(view.model(), QtWidgets.QFileSystemModel): view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) picard-release-2.3.1/picard/ui/widgets/000077500000000000000000000000001362601763300177315ustar00rootroot00000000000000picard-release-2.3.1/picard/ui/widgets/__init__.py000066400000000000000000000104701362601763300220440ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtGui, QtWidgets, ) class ElidedLabel(QtWidgets.QLabel): """A QLabel that elides the displayed text with ellipsis when resized.""" def __init__(self, parent=None): self._full_label = "" super().__init__(parent) def setText(self, text): self._full_label = text self._update_text() def resizeEvent(self, event): self._update_text() def _update_text(self): metrics = QtGui.QFontMetrics(self.font()) # Elide the text. On some setups, e.g. using the Breeze theme, the # text does not properly fit into width(), as a workaround subtract # 2 pixels from the available width. elided_label = metrics.elidedText(self._full_label, QtCore.Qt.ElideRight, self.width() - 2) super().setText(elided_label) if self._full_label and elided_label != self._full_label: self.setToolTip(self._full_label) else: self.setToolTip("") class ClickableSlider(QtWidgets.QSlider): """A slider implementation where the user can select any slider position by clicking.""" def mousePressEvent(self, event): self._set_position_from_mouse_event(event) def mouseMoveEvent(self, event): self._set_position_from_mouse_event(event) def _set_position_from_mouse_event(self, event): value = QtWidgets.QStyle.sliderValueFromPosition( self.minimum(), self.maximum(), event.x(), self.width()) self.setValue(value) class Popover(QtWidgets.QFrame): """A generic popover implementation. The popover opens relative to its parent, either above or below the parent. Subclass this widget and add child widgets for a custom popover. """ def __init__(self, parent, position='bottom'): super().__init__(parent) self.setWindowFlags(QtCore.Qt.Popup | QtCore.Qt.FramelessWindowHint) self.position = position def show(self): super().show() self.update_position() def update_position(self): parent = self.parent() x = -(self.width() - parent.width()) / 2 if self.position == 'top': y = -self.height() else: # bottom y = parent.height() pos = parent.mapToGlobal(QtCore.QPoint(x, y)) screen_number = QtWidgets.QApplication.desktop().screenNumber() screen = QtGui.QGuiApplication.screens()[screen_number] screen_size = screen.availableVirtualSize() if pos.x() < 0: pos.setX(0) if pos.x() + self.width() > screen_size.width(): pos.setX(screen_size.width() - self.width()) if pos.y() < 0: pos.setY(0) if pos.y() + self.height() > screen_size.height(): pos.setY(screen_size.height() - self.height()) self.move(pos) class SliderPopover(Popover): """A popover containing a single slider.""" value_changed = QtCore.pyqtSignal(int) def __init__(self, parent, position, label, value): super().__init__(parent, position) vbox = QtWidgets.QVBoxLayout(self) self.label = QtWidgets.QLabel(label, self) self.label.setAlignment(QtCore.Qt.AlignCenter) vbox.addWidget(self.label) self.slider = ClickableSlider(self) self.slider.setOrientation(QtCore.Qt.Horizontal) self.slider.setValue(value) self.slider.valueChanged.connect(self.value_changed) vbox.addWidget(self.slider) picard-release-2.3.1/picard/ui/widgets/editablelistview.py000066400000000000000000000240621362601763300236470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtGui, QtWidgets, ) class EditableListView(QtWidgets.QListView): def __init__(self, parent=None): super().__init__(parent) self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) def keyPressEvent(self, event): if event.matches(QtGui.QKeySequence.Delete): self.remove_selected_rows() else: super().keyPressEvent(event) def mouseDoubleClickEvent(self, event): index = self.indexAt(QtCore.QPoint(event.x(), event.y())) if index.isValid(): super().mouseDoubleClickEvent(event) else: self.add_empty_row() def closeEditor(self, editor, hint): model = self.model() index = self.currentIndex() if not editor.text(): row = index.row() model.removeRow(row) self.select_row(row) editor.parent().setFocus() else: super().closeEditor(editor, hint) if not model.user_sortable: data = index.data(QtCore.Qt.EditRole) model.sort(0) self.select_key(data) def add_item(self, value=""): model = self.model() row = model.rowCount() model.insertRow(row) index = model.createIndex(row, 0) model.setData(index, value) return index def clear(self): self.model().update([]) def update(self, values): self.model().update(values) @property def items(self): return self.model().items def add_empty_row(self): index = self.add_item() self.setCurrentIndex(index) self.edit(index) def remove_selected_rows(self): rows = self.get_selected_rows() if not rows: return model = self.model() for row in sorted(rows, reverse=True): model.removeRow(row) first_selected_row = rows[0] self.select_row(first_selected_row) def move_selected_rows_up(self): rows = self.get_selected_rows() if not rows: return first_selected_row = min(rows) if first_selected_row > 0: self._move_rows_relative(rows, -1) def move_selected_rows_down(self): rows = self.get_selected_rows() if not rows: return last_selected_row = max(rows) if last_selected_row < self.model().rowCount() - 1: self._move_rows_relative(rows, 1) def select_row(self, row): index = self.model().index(row, 0) self.setCurrentIndex(index) def select_key(self, value): model = self.model() for row in range(0, model.rowCount()): index = model.createIndex(row, 0) if value == index.data(QtCore.Qt.EditRole): self.setCurrentIndex(index) break def get_selected_rows(self): return [index.row() for index in self.selectedIndexes()] def _move_rows_relative(self, rows, direction): model = self.model() current_index = self.currentIndex() selection = self.selectionModel() for row in sorted(rows, reverse=direction > 0): new_index = model.index(row + direction, 0) model.move_row(row, new_index.row()) selection.select(new_index, QtCore.QItemSelectionModel.Select) if row == current_index.row(): selection.setCurrentIndex(new_index, QtCore.QItemSelectionModel.Current) class UniqueEditableListView(EditableListView): def __init__(self, parent=None): super().__init__(parent) self._is_drag_drop = False def setModel(self, model): current_model = self.model() if current_model: current_model.dataChanged.disconnect(self.on_data_changed) super().setModel(model) model.dataChanged.connect(self.on_data_changed) def dropEvent(self, event): self._is_drag_drop = True super().dropEvent(event) self._is_drag_drop = False def on_data_changed(self, top_left, bottom_right, roles): # Do not drop duplicates during drag and drop as there is always # a duplicate in the list for a short time in this case. if self._is_drag_drop: return model = self.model() if QtCore.Qt.EditRole in roles: value = model.data(top_left, QtCore.Qt.EditRole) if not value: return # Remove duplicate entries from the model changed_row = top_left.row() row = 0 for item in model.items: if item == value and row != changed_row: model.removeRow(row) row -= 1 if changed_row > row: changed_row -= 1 row += 1 self.select_row(changed_row) class EditableListModel(QtCore.QAbstractListModel): user_sortable_changed = QtCore.pyqtSignal(bool) def __init__(self, items=None, parent=None): super().__init__(parent) self._items = [(item, self.get_display_name(item)) for item in items or []] self._user_sortable = True @property def user_sortable(self): return self._user_sortable @user_sortable.setter def user_sortable(self, user_sortable): self._user_sortable = user_sortable if not user_sortable: self.sort(0) self.user_sortable_changed.emit(user_sortable) def sort(self, column, order=QtCore.Qt.AscendingOrder): self.beginResetModel() self._items.sort(key=lambda t: t[1], reverse=(order == QtCore.Qt.DescendingOrder)) self.endResetModel() def get_display_name(self, item): # pylint: disable=no-self-use return item def rowCount(self, parent=QtCore.QModelIndex()): return len(self._items) def data(self, index, role=QtCore.Qt.DisplayRole): if not index.isValid() or role not in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): return None field = 1 if role == QtCore.Qt.DisplayRole else 0 try: return self._items[index.row()][field] except IndexError: return None def setData(self, index, value, role=QtCore.Qt.EditRole): if not index.isValid() or role not in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): return False i = index.row() try: if role == QtCore.Qt.EditRole: display_name = self.get_display_name(value) if value else value self._items[i] = (value, display_name) elif role == QtCore.Qt.DisplayRole: current = self._items[i] self._items[i] = (current[0], value) self.dataChanged.emit(index, index, [role]) return True except IndexError: return False def flags(self, index): if index.isValid(): flags = (QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemNeverHasChildren) if self.user_sortable: flags |= QtCore.Qt.ItemIsDragEnabled return flags elif self.user_sortable: return QtCore.Qt.ItemIsDropEnabled else: return QtCore.Qt.NoItemFlags def insertRows(self, row, count, parent=QtCore.QModelIndex()): super().beginInsertRows(parent, row, row + count - 1) for i in range(count): self._items.insert(row, ("", "")) super().endInsertRows() return True def removeRows(self, row, count, parent=QtCore.QModelIndex()): super().beginRemoveRows(parent, row, row + count - 1) self._items = self._items[:row] + self._items[row + count:] super().endRemoveRows() return True @staticmethod def supportedDragActions(): return QtCore.Qt.MoveAction @staticmethod def supportedDropActions(): return QtCore.Qt.MoveAction def update(self, items): self.beginResetModel() self._items = [(item, self.get_display_name(item)) for item in items] self.endResetModel() def move_row(self, row, new_row): item = self._items[row] self.removeRow(row) self.insertRow(new_row) index = self.index(new_row, 0) self.setData(index, item[0], QtCore.Qt.EditRole) self.setData(index, item[1], QtCore.Qt.DisplayRole) @property def items(self): return (t[0] for t in self._items) class AutocompleteItemDelegate(QtWidgets.QItemDelegate): def __init__(self, completions, parent=None): super().__init__(parent) self._completions = completions def createEditor(self, parent, option, index): if not index.isValid(): return None def complete(text): parent.setFocus() editor = super().createEditor(parent, option, index) completer = QtWidgets.QCompleter(self._completions, parent) completer.setCompletionMode(QtWidgets.QCompleter.UnfilteredPopupCompletion) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) completer.activated.connect(complete) editor.setCompleter(completer) return editor picard-release-2.3.1/picard/ui/widgets/scriptlistwidget.py000066400000000000000000000072361362601763300237170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import ( QtCore, QtGui, QtWidgets, ) from picard.const import ( DEFAULT_NUMBERED_SCRIPT_NAME, DEFAULT_SCRIPT_NAME, ) from picard.ui import HashableListWidgetItem class ScriptListWidget(QtWidgets.QListWidget): def __init__(self, parent): super().__init__(parent=parent) self.delete_shortcut = QtWidgets.QShortcut(self) self.delete_shortcut.setKey(QtGui.QKeySequence.Delete) self.delete_shortcut.activated.connect(self.remove_selected_script) def contextMenuEvent(self, event): item = self.itemAt(event.x(), event.y()) if item: menu = QtWidgets.QMenu(self) rename_action = QtWidgets.QAction(_("Rename script"), self) rename_action.triggered.connect(partial(self.editItem, item)) menu.addAction(rename_action) remove_action = QtWidgets.QAction(_("Remove script"), self) remove_action.triggered.connect(partial(self.remove_script, item)) menu.addAction(remove_action) menu.exec_(event.globalPos()) def add_script(self): count = self.count() numbered_name = _(DEFAULT_NUMBERED_SCRIPT_NAME) % (count + 1) list_item = ScriptListWidgetItem(name=numbered_name) list_item.setCheckState(QtCore.Qt.Checked) self.addItem(list_item) self.setCurrentItem(list_item, QtCore.QItemSelectionModel.Clear | QtCore.QItemSelectionModel.SelectCurrent) def remove_selected_script(self): items = self.selectedItems() if items: self.remove_script(items[0]) def remove_script(self, item): row = self.row(item) msg = _("Are you sure you want to remove this script?") reply = QtWidgets.QMessageBox.question(self, _('Confirm Remove'), msg, QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if item and reply == QtWidgets.QMessageBox.Yes: item = self.takeItem(row) del item class ScriptListWidgetItem(HashableListWidgetItem): """Holds a script's list and text widget properties""" def __init__(self, name=None, enabled=True, script=""): super().__init__(name) self.setFlags(self.flags() | QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEditable) if name is None: name = _(DEFAULT_SCRIPT_NAME) self.setText(name) self.setCheckState(QtCore.Qt.Checked if enabled else QtCore.Qt.Unchecked) self.script = script @property def pos(self): return self.listWidget().row(self) @property def name(self): return self.text() @property def enabled(self): return self.checkState() == QtCore.Qt.Checked def get_all(self): # tuples used to get pickle dump of settings to work return (self.pos, self.name, self.enabled, self.script) picard-release-2.3.1/picard/ui/widgets/taglisteditor.py000066400000000000000000000053161362601763300231660ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import QtWidgets from picard.util.tags import TAG_NAMES from picard.ui.ui_widget_taglisteditor import Ui_TagListEditor from picard.ui.widgets.editablelistview import ( AutocompleteItemDelegate, EditableListModel, ) class TagListEditor(QtWidgets.QWidget): def __init__(self, parent): super().__init__(parent) self.ui = Ui_TagListEditor() self.ui.setupUi(self) list_view = self.ui.tag_list_view model = EditableListModel() model.user_sortable_changed.connect(self.on_user_sortable_changed) self.ui.sort_buttons.setVisible(model.user_sortable) list_view.setModel(model) list_view.setItemDelegate(AutocompleteItemDelegate( sorted(TAG_NAMES.keys()))) selection = list_view.selectionModel() selection.selectionChanged.connect(self.on_selection_changed) self.on_selection_changed([], []) def on_selection_changed(self, selected, deselected): indexes = self.ui.tag_list_view.selectedIndexes() last_row = self.ui.tag_list_view.model().rowCount() - 1 buttons_enabled = len(indexes) > 0 move_up_enabled = buttons_enabled and all(i.row() != 0 for i in indexes) move_down_enabled = buttons_enabled and all(i.row() != last_row for i in indexes) self.ui.tags_remove_btn.setEnabled(buttons_enabled) self.ui.tags_move_up_btn.setEnabled(move_up_enabled) self.ui.tags_move_down_btn.setEnabled(move_down_enabled) def clear(self): self.ui.tag_list_view.update([]) def update(self, tags): self.ui.tag_list_view.update(tags) @property def tags(self): return self.ui.tag_list_view.items def on_user_sortable_changed(self, user_sortable): self.ui.sort_buttons.setVisible(user_sortable) def set_user_sortable(self, user_sortable): self.ui.tag_list_view.model().user_sortable = user_sortable picard-release-2.3.1/picard/ui/widgets/tristatesortheaderview.py000066400000000000000000000054351362601763300251250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5 import ( QtCore, QtWidgets, ) class TristateSortHeaderView(QtWidgets.QHeaderView): """A QHeaderView implementation supporting tristate sorting. A column can either be sorted ascending, descending or not sorted. The view toggles through these states by clicking on a section header. """ STATE_NONE = 0 STATE_SECTION_MOVED_OR_RESIZED = 1 def __init__(self, orientation, parent=None): super().__init__(orientation, parent) # Remember if resize / move event just happened self._section_moved_or_resized = False def update_state(i, o, n): self._section_moved_or_resized = True self.sectionResized.connect(update_state) self.sectionMoved.connect(update_state) def mouseReleaseEvent(self, event): if event.button() == QtCore.Qt.LeftButton: index = self.logicalIndexAt(event.pos()) if (index != -1 and index == self.sortIndicatorSection() and self.sortIndicatorOrder() == QtCore.Qt.DescendingOrder): # After a column was sorted descending we want to reset it # to no sorting state. But we need to call the parent # implementation of mouseReleaseEvent in order to handle # other events, such as column move and resize. # Disable clickable sections temporarily so the parent # implementation will not do the normal click behavior. self.setSectionsClickable(False) self._section_moved_or_resized = False super().mouseReleaseEvent(event) self.setSectionsClickable(True) # Only treat this as an actual click if no move # or resize event occurred. if not self._section_moved_or_resized: self.setSortIndicator(-1, self.sortIndicatorOrder()) return # Normal handling of events super().mouseReleaseEvent(event) picard-release-2.3.1/picard/util/000077500000000000000000000000001362601763300166235ustar00rootroot00000000000000picard-release-2.3.1/picard/util/__init__.py000066400000000000000000000456521362601763300207500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006-2009, 2011-2012, 2014 Lukáš Lalinský # Copyright (C) 2008-2011, 2014, 2018-2020 Philipp Wolfer # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2009 david # Copyright (C) 2010 fatih # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012, 2014-2015 Wieland Hoffmann # Copyright (C) 2013 Ionuț Ciocîrlan # Copyright (C) 2013-2014 Sophist-UK # Copyright (C) 2013-2014, 2018-2020 Laurent Monin # Copyright (C) 2014 Johannes Dewender # Copyright (C) 2016 Rahul Raturi # Copyright (C) 2016 barami # Copyright (C) 2016-2018 Sambhav Kothari # Copyright (C) 2017 Frederik “Freso” S. Olesen # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import builtins from collections import namedtuple import html import json import ntpath from operator import attrgetter import os import re import sys from time import time import unicodedata from PyQt5 import QtCore # Required for compatibility with lastfmplus which imports this from here rather than loading it direct. from picard.const import MUSICBRAINZ_SERVERS from picard.const.sys import ( FROZEN_TEMP_PATH, IS_FROZEN, IS_WIN, ) if IS_WIN: from ctypes import windll class LockableObject(QtCore.QObject): """Read/write lockable object.""" def __init__(self): super().__init__() self.__lock = QtCore.QReadWriteLock() def lock_for_read(self): """Lock the object for read operations.""" self.__lock.lockForRead() def lock_for_write(self): """Lock the object for write operations.""" self.__lock.lockForWrite() def unlock(self): """Unlock the object.""" self.__lock.unlock() _io_encoding = sys.getfilesystemencoding() # The following was adapted from k3b's source code: #// On a glibc system the system locale defaults to ANSI_X3.4-1968 #// It is very unlikely that one would set the locale to ANSI_X3.4-1968 #// intentionally def check_io_encoding(): if _io_encoding == "ANSI_X3.4-1968": from picard import log log.warning(""" System locale charset is ANSI_X3.4-1968 Your system's locale charset (i.e. the charset used to encode filenames) is set to ANSI_X3.4-1968. It is highly unlikely that this has been done intentionally. Most likely the locale is not set at all. An invalid setting will result in problems when creating data projects. To properly set the locale charset make sure the LC_* environment variables are set. Normally the distribution setup tools take care of this. Translation: Picard will have problems with non-english characters in filenames until you change your charset. """) def encode_filename(filename): """Encode unicode strings to filesystem encoding.""" if isinstance(filename, str): if os.path.supports_unicode_filenames and sys.platform != "darwin": return filename else: return filename.encode(_io_encoding, 'replace') else: return filename def decode_filename(filename): """Decode strings from filesystem encoding to unicode.""" if isinstance(filename, str): return filename else: return filename.decode(_io_encoding) def pathcmp(a, b): return os.path.normcase(a) == os.path.normcase(b) def format_time(ms, display_zero=False): """Formats time in milliseconds to a string representation.""" ms = float(ms) if ms == 0 and not display_zero: return "?:??" duration_seconds = round(ms / 1000) if duration_seconds < 3600: minutes, seconds = divmod(duration_seconds, 60) return "%d:%02d" % (minutes, seconds) else: hours, remainder = divmod(duration_seconds, 3600) minutes, seconds = divmod(remainder, 60) return "%d:%02d:%02d" % (hours, minutes, seconds) def sanitize_date(datestr): """Sanitize date format. e.g.: "YYYY-00-00" -> "YYYY" "YYYY- - " -> "YYYY" ... """ date = [] for num in datestr.split("-"): try: num = int(num.strip()) except ValueError: break if num: date.append(num) return ("", "%04d", "%04d-%02d", "%04d-%02d-%02d")[len(date)] % tuple(date) _re_win32_incompat = re.compile(r'["*:<>?|]', re.UNICODE) def replace_win32_incompat(string, repl="_"): # noqa: E302 """Replace win32 filename incompatible characters from ``string`` by ``repl``.""" # Don't replace : with _ for windows drive if IS_WIN and os.path.isabs(string): drive, rest = ntpath.splitdrive(string) return drive + _re_win32_incompat.sub(repl, rest) else: return _re_win32_incompat.sub(repl, string) _re_non_alphanum = re.compile(r'\W+', re.UNICODE) def strip_non_alnum(string): # noqa: E302 """Remove all non-alphanumeric characters from ``string``.""" return _re_non_alphanum.sub(" ", string).strip() def sanitize_filename(string, repl="_", win_compat=False): string = string.replace(os.sep, repl) if os.altsep: string = string.replace(os.altsep, repl) if win_compat and os.altsep != '\\': string = string.replace('\\', repl) return string def _reverse_sortname(sortname): """Reverse sortnames.""" chunks = [a.strip() for a in sortname.split(",")] if len(chunks) == 2: return "%s %s" % (chunks[1], chunks[0]) elif len(chunks) == 3: return "%s %s %s" % (chunks[2], chunks[1], chunks[0]) elif len(chunks) == 4: return "%s %s, %s %s" % (chunks[1], chunks[0], chunks[3], chunks[2]) else: return sortname.strip() def translate_from_sortname(name, sortname): """'Translate' the artist name by reversing the sortname.""" for c in name: ctg = unicodedata.category(c) if ctg[0] == "L" and unicodedata.name(c).find("LATIN") == -1: for separator in (" & ", "; ", " and ", " vs. ", " with ", " y "): if separator in sortname: parts = sortname.split(separator) break else: parts = [sortname] separator = "" return separator.join(map(_reverse_sortname, parts)) return name def find_existing_path(path): path = encode_filename(path) while path and not os.path.isdir(path): head, tail = os.path.split(path) if head == path: break path = head return decode_filename(path) def find_executable(*executables): if IS_WIN: executables = [e + '.exe' for e in executables] paths = [os.path.dirname(sys.executable)] if sys.executable else [] paths += os.environ.get('PATH', '').split(os.pathsep) # This is for searching for executables bundled in packaged builds if IS_FROZEN: paths += [FROZEN_TEMP_PATH] for path in paths: for executable in executables: f = os.path.join(path, executable) if os.path.isfile(f): return f _mbid_format = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' _re_mbid_val = re.compile(_mbid_format, re.IGNORECASE) def mbid_validate(string): # noqa: E302 """Test if passed string is a valid mbid """ return _re_mbid_val.match(string) is not None def parse_amazon_url(url): """Extract host and asin from an amazon url. It returns a dict with host and asin keys on success, None else """ r = re.compile(r'^https?://(?:www.)?(?P.*?)(?:\:[0-9]+)?/.*/(?P[0-9B][0-9A-Z]{9})(?:[^0-9A-Z]|$)') match = r.match(url) if match is not None: return match.groupdict() return None def throttle(interval): """ Throttle a function so that it will only execute once per ``interval`` (specified in milliseconds). """ mutex = QtCore.QMutex() def decorator(func): def later(): mutex.lock() func(*decorator.args, **decorator.kwargs) decorator.prev = time() decorator.is_ticking = False mutex.unlock() def throttled_func(*args, **kwargs): if decorator.is_ticking: mutex.lock() decorator.args = args decorator.kwargs = kwargs mutex.unlock() return mutex.lock() now = time() r = interval - (now-decorator.prev)*1000.0 if r <= 0: func(*args, **kwargs) decorator.prev = now else: decorator.args = args decorator.kwargs = kwargs QtCore.QTimer.singleShot(r, later) decorator.is_ticking = True mutex.unlock() return throttled_func decorator.prev = 0 decorator.is_ticking = False return decorator def uniqify(seq): """Uniqify a list, preserving order""" # Courtesy of Dave Kirby # See http://www.peterbe.com/plog/uniqifiers-benchmark seen = set() add_seen = seen.add return [x for x in seq if x not in seen and not add_seen(x)] # order is important _tracknum_regexps = ( # search for explicit track number (prefix "track") r"track[\s_-]*(?:no|nr)?[\s_-]*(\d+)", # search for 2-digit number at start of string r"^(\d{2})\D?", # search for 2-digit number at end of string r"\D?(\d{2})$", ) def tracknum_from_filename(base_filename): """Guess and extract track number from filename Returns -1 if none found, the number as integer else """ filename, _ = os.path.splitext(base_filename) for r in _tracknum_regexps: match = re.search(r, filename, re.I) if match: n = int(match.group(1)) if n > 0: return n # find all numbers between 1 and 99 # 4-digit or more numbers are very unlikely to be a track number # smaller number is preferred in any case numbers = sorted([int(n) for n in re.findall(r'\d+', filename) if 0 < int(n) <= 99]) if numbers: return numbers[0] return -1 # Provide os.path.samefile equivalent which is missing in Python under Windows if IS_WIN: def os_path_samefile(p1, p2): ap1 = os.path.abspath(p1) ap2 = os.path.abspath(p2) return ap1 == ap2 else: os_path_samefile = os.path.samefile def is_hidden(filepath): """Test whether a file or directory is hidden. A file is considered hidden if it starts with a dot on non-Windows systems or if it has the "hidden" flag set on Windows.""" name = os.path.basename(os.path.abspath(filepath)) return (not IS_WIN and name.startswith('.')) \ or _has_hidden_attribute(filepath) def _has_hidden_attribute(filepath): if not IS_WIN: return False # FIXME: On OSX detecting hidden files involves more # than just checking for dot files, see # https://stackoverflow.com/questions/284115/cross-platform-hidden-file-detection try: attrs = windll.kernel32.GetFileAttributesW(filepath) assert attrs != -1 return bool(attrs & 2) except (AttributeError, AssertionError): return False def linear_combination_of_weights(parts): """Produces a probability as a linear combination of weights Parts should be a list of tuples in the form: [(v0, w0), (v1, w1), ..., (vn, wn)] where vn is a value between 0.0 and 1.0 and wn corresponding weight as a positive number """ total = 0.0 sum_of_products = 0.0 for value, weight in parts: if value < 0.0: raise ValueError("Value must be greater than or equal to 0.0") if value > 1.0: raise ValueError("Value must be lesser than or equal to 1.0") if weight < 0: raise ValueError("Weight must be greater than or equal to 0.0") total += weight sum_of_products += value * weight if total == 0.0: return 0.0 return sum_of_products / total def album_artist_from_path(filename, album, artist): """If album is not set, try to extract album and artist from path """ if not album: dirs = os.path.dirname(filename).replace('\\', '/').lstrip('/').split('/') # Strip disc subdirectory from list if re.search(r'\b(?:CD|DVD|Disc)\s*\d+\b', dirs[-1], re.I): del dirs[-1] if dirs: # For clustering assume %artist%/%album%/file or %artist% - %album%/file album = dirs[-1] if ' - ' in album: new_artist, album = album.split(' - ', 1) if not artist: artist = new_artist elif not artist and len(dirs) >= 2: artist = dirs[-2] return album, artist def build_qurl(host, port=80, path=None, queryargs=None): """ Builds and returns a QUrl object from `host`, `port` and `path` and automatically enables HTTPS if necessary. Encoded query arguments can be provided in `queryargs`, a dictionary mapping field names to values. """ url = QtCore.QUrl() url.setHost(host) url.setPort(port) if host in MUSICBRAINZ_SERVERS or port == 443: url.setScheme("https") url.setPort(443) else: url.setScheme("http") if path is not None: url.setPath(path) if queryargs is not None: url_query = QtCore.QUrlQuery() for k, v in queryargs.items(): url_query.addQueryItem(k, str(v)) url.setQuery(url_query) return url def union_sorted_lists(list1, list2): """ Returns union of two sorted lists. >> list1 = [1, 2, 2, 2, 3] >> list2 = [2, 3, 4] >> union_sorted_lists(list1, list2) >> [1, 2, 2, 2, 3, 4] """ union = [] i = 0 j = 0 while i != len(list1) and j != len(list2): if list1[i] > list2[j]: union.append(list2[j]) j += 1 elif list1[i] < list2[j]: union.append(list1[i]) i += 1 else: union.append(list1[i]) i += 1 j += 1 if i == len(list1): union.extend(list2[j:]) else: union.extend(list1[i:]) return union def __convert_to_string(obj): """Appropriately converts the input `obj` to a string. Args: obj (QByteArray, bytes, bytearray, ...): The input object Returns: string: The appropriately decoded string """ if isinstance(obj, QtCore.QByteArray): return bytes(obj).decode() elif isinstance(obj, (bytes, bytearray)): return obj.decode() else: return str(obj) def convert_to_string(obj): from picard import log log.warning("string_() and convert_to_string() are deprecated, do not use") return __convert_to_string(obj) builtins.__dict__['string_'] = convert_to_string def htmlescape(string): return html.escape(string, quote=False) def load_json(data): """Deserializes a string or bytes like json response and converts it to a python object. Args: data (QByteArray, bytes, bytearray, ...): The json response Returns: dict: Response data as a python dict """ return json.loads(__convert_to_string(data)) def parse_json(reply): return load_json(reply.readAll()) def restore_method(func): def func_wrapper(*args, **kwargs): if not QtCore.QObject.tagger._no_restore: return func(*args, **kwargs) return func_wrapper def reconnect(signal, newhandler=None, oldhandler=None): """ Reconnect an handler to a signal It disconnects all previous handlers before connecting new one Credits: https://stackoverflow.com/a/21589403 """ while True: try: if oldhandler is not None: signal.disconnect(oldhandler) else: signal.disconnect() except TypeError: break if newhandler is not None: signal.connect(newhandler) def compare_barcodes(barcode1, barcode2): """ Compares two barcodes. Returns True if they are the same, False otherwise. Tries to normalize UPC barcodes to EAN barcodes so e.g. "727361379704" and "0727361379704" are considered the same. """ barcode1 = barcode1 or '' barcode2 = barcode2 or '' if barcode1 == barcode2: return True if not barcode1 or not barcode2: return False return barcode1.zfill(13) == barcode2.zfill(13) BestMatch = namedtuple('BestMatch', 'similarity result num_results') def sort_by_similarity(candidates): return sorted( candidates(), reverse=True, key=attrgetter('similarity') ) def find_best_match(candidates, no_match): sorted_results = sort_by_similarity(candidates) if sorted_results: result = sorted_results[0] else: result = no_match return BestMatch(similarity=result.similarity, result=result, num_results=len(sorted_results)) def get_qt_enum(cls, enum): """ List all the names of attributes inside a Qt enum. Example: >>> from PyQt5.Qt import Qt >>> print(get_qt_enum(Qt, Qt.CoordinateSystem)) ['DeviceCoordinates', 'LogicalCoordinates'] """ values = [] for key in dir(cls): value = getattr(cls, key) if isinstance(value, enum): values.append(key) return values def limited_join(a_list, limit, join_string='+', middle_string='…'): """Join elements of a list with `join_string` If list is longer than `limit`, middle elements will be dropped, and replaced by `middle_string`. Args: a_list: list of strings to join limit: maximum number of elements to join before limiting join_string: string used to join elements middle_string: string to insert in the middle if limited Returns: A string Example: >>> limited_join(['a', 'b', 'c', 'd', 'e', 'f'], 2) 'a+…+f' >>> limited_join(['a', 'b', 'c', 'd', 'e', 'f'], 3) 'a+…+f' >>> limited_join(['a', 'b', 'c', 'd', 'e', 'f'], 4) 'a+b+…+e+f' >>> limited_join(['a', 'b', 'c', 'd', 'e', 'f'], 6) 'a+b+c+d+e+f' >>> limited_join(['a', 'b', 'c', 'd', 'e', 'f'], 2, ',', '?') 'a,?,f' """ length = len(a_list) if limit <= 1 or limit >= length: return join_string.join(a_list) half = limit // 2 start = a_list[:half] end = a_list[-half:] return join_string.join(start + [middle_string] + end) picard-release-2.3.1/picard/util/_astrcmp.c000066400000000000000000000117141362601763300206030ustar00rootroot00000000000000/* * Picard, the next-generation MusicBrainz tagger * Copyright (C) 2018 Philipp Wolfer * Copyright (C) 2006 Lukáš Lalinský * Copyright (C) 2003 Benbuck Nason * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*** * * Approximate string comparison * * This work is based on the Levenshtein Metric or "edit distance", which is * well known, simple, and seems to be unencumbered by any usage restrictions. * For more information on the Levenshtein Distance you can refer to the web, * e.g. http://www.merriampark.com/ld.htm * * Accuracy and speed enhancements could probably be made to this algorithm by * implementing the improvements suggested by such people as Esko Ukkonen, Hal * Berghel & David Roach, and Sun Wu and Udi Manber. * * This has been successfully compiled using: * Microsoft Visual C++ 6 SP 5 * GNU gcc 3.2 & Cygwin * GNU gcc 3.2 & MinGW * * Benbuck Nason, February 28th, 2003 * ***/ #include #include #include #include /*** * Compute Levenshtein distance. Levenshtein distance, also known as * "edit distance," is a measure of the cost to transform one string * into another. ***/ #define MIN(x, y) (((x) > (y)) ? (y) : (x)) #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define MATRIX(a, b) matrix[(b) * (len1 + 1) + (a)] float LevenshteinDistance(const Py_UCS4 * s1, Py_ssize_t len1, const Py_UCS4 * s2, Py_ssize_t len2) { int *matrix, index1, index2; float result; /* Step 1 */ /* Check string lengths */ if (len1 == 0) return 0.0f; if (len2 == 0) return 0.0f; /* Step 2 */ /* Allocate matrix for algorithm and fill it with default values */ matrix = malloc(sizeof(int) * (len1 + 1) * (len2 + 1)); for (index1 = 0; index1 <= len1; index1++) MATRIX(index1, 0) = index1; for (index2 = 0; index2 <= len2; index2++) MATRIX(0, index2) = index2; /* Step 3 */ /* Loop through first string */ for (index1 = 1; index1 <= len1; index1++) { Py_UCS4 s1_current = s1[index1 - 1]; /* Step 4 */ /* Loop through second string */ for (index2 = 1; index2 <= len2; index2++) { Py_UCS4 s2_current = s2[index2 - 1]; /* Step 5 */ /* Calculate cost of this iteration (handles deletion, insertion, and substitution) */ int cost = (s1_current == s2_current) ? 0 : 1; /* Step 6 */ /* Calculate the total cost up to this point */ int above = MATRIX(index1 - 1, index2); int left = MATRIX(index1, index2 - 1); int diagonal = MATRIX(index1 - 1, index2 - 1); int cell = MIN(MIN(above + 1, left + 1), diagonal + cost); /* Step 6a */ /* Also cover transposition. This step is taken from: Berghel, Hal ; Roach, David : "An Extension of Ukkonen's Enhanced Dynamic Programming ASM Algorithm" (http://berghel.net/publications/asm/asm.php) */ if (index1 > 2 && index2 > 2) { int trans = MATRIX(index1 - 2, index2 - 2) + 1; if (s1[index1 - 2] != s2_current) trans++; if (s1_current != s2[index2 - 2]) trans++; if (cell > trans) cell = trans; } MATRIX(index1, index2) = cell; } } /* Step 7 */ /* Return result */ result = ((float)1 - ((float)MATRIX(len1, len2) / (float)MAX(len1, len2))); free(matrix); return result; } static PyObject * astrcmp(PyObject *self, PyObject *args) { PyObject *s1, *s2; float d; Py_UCS4 *us1, *us2; Py_ssize_t len1, len2; PyThreadState *_save; if (!PyArg_ParseTuple(args, "UU", &s1, &s2)) return NULL; if (PyUnicode_READY(s1) == -1 || PyUnicode_READY(s2) == -1) return NULL; len1 = PyUnicode_GetLength(s1); len2 = PyUnicode_GetLength(s2); us1 = PyUnicode_AsUCS4Copy(s1); us2 = PyUnicode_AsUCS4Copy(s2); Py_UNBLOCK_THREADS d = LevenshteinDistance(us1, len1, us2, len2); Py_BLOCK_THREADS PyMem_Free(us1); PyMem_Free(us2); return Py_BuildValue("f", d); } static PyMethodDef AstrcmpMethods[] = { {"astrcmp", astrcmp, METH_VARARGS, "Compute Levenshtein distance"}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef AstrcmpModule = { PyModuleDef_HEAD_INIT, "astrcmp", /* name of module */ NULL, /* module documentation, may be NULL */ -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ AstrcmpMethods }; PyMODINIT_FUNC PyInit__astrcmp(void) { return PyModule_Create(&AstrcmpModule); } picard-release-2.3.1/picard/util/astrcmp.py000066400000000000000000000026611362601763300206530ustar00rootroot00000000000000# fix-header: skip # http://hetland.org/coding/python/levenshtein.py # This is a straightforward implementation of a well-known algorithm, and thus # probably shouldn't be covered by copyright to begin with. But in case it is, # the author (Magnus Lie Hetland) has, to the extent possible under law, # dedicated all copyright and related and neighboring rights to this software # to the public domain worldwide, by distributing it under the CC0 license, # version 1.0. This software is distributed without any warranty. For more # information, see def astrcmp_py(a, b): """Calculates the Levenshtein distance between a and b.""" n, m = len(a), len(b) if n > m: # Make sure n <= m, to use O(min(n,m)) space a, b = b, a n, m = m, n if n == 0 or m == 0.0: return 0.0 current = range(n+1) for i in range(1, m+1): previous, current = current, [i]+[0]*n for j in range(1, n+1): add, delete = previous[j]+1, current[j-1]+1 change = previous[j-1] if a[j-1] != b[i-1]: change = change + 1 current[j] = min(add, delete, change) return 1.0 - current[n] / max(m, n) try: from picard.util._astrcmp import astrcmp as astrcmp_c astrcmp = astrcmp_c astrcmp_implementation = "C" except ImportError: astrcmp = astrcmp_py astrcmp_implementation = "Python" picard-release-2.3.1/picard/util/bytes2human.py000066400000000000000000000065541362601763300214500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013, 2019-2020 Laurent Monin # Copyright (C) 2018 Wieland Hoffmann # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """Helper class to convert bytes to human-readable form It supports l10n through gettext, decimal and binary units. >>> n = 1572864 >>> [binary(n), decimal(n)] ['1.5 MiB', '1.6 MB'] """ import locale # used to force gettextization _BYTES_STRINGS_I18N = ( N_('%s B'), N_('%s kB'), N_('%s KiB'), N_('%s MB'), N_('%s MiB'), N_('%s GB'), N_('%s GiB'), N_('%s TB'), N_('%s TiB'), N_('%s PB'), N_('%s PiB'), ) def decimal(number, scale=1, l10n=True): """ Convert bytes to short human-readable string, decimal mode >>> [decimal(n) for n in [1000, 1024, 15500]] ['1 kB', '1 kB', '15.5 kB'] """ return short_string(int(number), 1000, scale=scale, l10n=l10n) def binary(number, scale=1, l10n=True): """ Convert bytes to short human-readable string, binary mode >>> [binary(n) for n in [1000, 1024, 15500]] ['1000 B', '1 KiB', '15.1 KiB'] """ return short_string(int(number), 1024, scale=scale, l10n=l10n) def short_string(number, multiple, scale=1, l10n=True): """ Returns short human-readable string for `number` bytes >>> [short_string(n, 1024, 2) for n in [1000, 1100, 15500]] ['1000 B', '1.07 KiB', '15.14 KiB'] >>> [short_string(n, 1000, 1) for n in [10000, 11000, 1550000]] ['10 kB', '11 kB', '1.6 MB'] """ num, unit = calc_unit(number, multiple) n = int(num) nr = round(num, scale) if n == nr or unit == 'B': fmt = '%d' num = n else: fmt = '%%0.%df' % scale num = nr if l10n: fmtnum = locale.format_string(fmt, num) return _("%s " + unit) % fmtnum else: return fmt % num + " " + unit def calc_unit(number, multiple=1000): """ Calculate rounded number of multiple * bytes, finding best unit >>> calc_unit(12456, 1024) (12.1640625, 'KiB') >>> calc_unit(-12456, 1000) (-12.456, 'kB') >>> calc_unit(0, 1001) Traceback (most recent call last): ... ValueError: multiple parameter has to be 1000 or 1024 """ if number < 0: sign = -1 number = -number else: sign = 1 n = float(number) if multiple == 1000: k, b = 'k', 'B' elif multiple == 1024: k, b = 'K', 'iB' else: raise ValueError('multiple parameter has to be 1000 or 1024') suffixes = ["B"] + [i + b for i in k + "MGTP"] for suffix in suffixes: if n < multiple or suffix == suffixes[-1]: return (sign * n, suffix) else: n /= multiple picard-release-2.3.1/picard/util/cdrom.py000066400000000000000000000101451362601763300203020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2008 Will # Copyright (C) 2008, 2018-2019 Philipp Wolfer # Copyright (C) 2009 david # Copyright (C) 2013 Johannes Dewender # Copyright (C) 2013 Sebastian Ramacher # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2013-2014 Michael Wiencek # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2017 Sophist-UK # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from PyQt5.QtCore import ( QFile, QIODevice, ) from picard import config from picard.const.sys import ( IS_LINUX, IS_WIN, ) from picard.util import uniqify if IS_WIN: from ctypes import windll try: from libdiscid.compat import discid except ImportError: try: import discid except (ImportError, OSError): discid = None DEFAULT_DRIVES = [] if discid is not None: device = discid.get_default_device() if device: DEFAULT_DRIVES.append(device) LINUX_CDROM_INFO = '/proc/sys/dev/cdrom/info' # if get_cdrom_drives() lists ALL drives available on the machine if IS_WIN: AUTO_DETECT_DRIVES = True elif IS_LINUX and QFile.exists(LINUX_CDROM_INFO): AUTO_DETECT_DRIVES = True else: # There might be more drives we couldn't detect # setting uses a text field instead of a drop-down AUTO_DETECT_DRIVES = False def get_cdrom_drives(): """List available disc drives on the machine """ # add default drive from libdiscid to the list drives = list(DEFAULT_DRIVES) if IS_WIN: GetLogicalDrives = windll.kernel32.GetLogicalDrives GetDriveType = windll.kernel32.GetDriveTypeW DRIVE_CDROM = 5 mask = GetLogicalDrives() for i in range(26): if mask >> i & 1: drive = chr(i + ord("A")) + ":" if GetDriveType(drive) == DRIVE_CDROM: drives.append(drive) elif IS_LINUX and AUTO_DETECT_DRIVES: # Read info from /proc/sys/dev/cdrom/info cdinfo = QFile(LINUX_CDROM_INFO) if cdinfo.open(QIODevice.ReadOnly | QIODevice.Text): drive_names = [] drive_audio_caps = [] while True: line = bytes(cdinfo.readLine()).decode() if not line: break if ":" in line: key, values = line.split(':') if key == 'drive name': drive_names = values.split() elif key == 'Can play audio': drive_audio_caps = [v == '1' for v in values.split()] break # no need to continue past this line # Show only drives that are capable of playing audio for index, drive in enumerate(drive_names): if drive_audio_caps[index]: device = '/dev/%s' % drive symlink_target = QFile.symLinkTarget(device) if symlink_target != '': device = symlink_target drives.append(device) else: for device in config.setting["cd_lookup_device"].split(","): # Need to filter out empty strings, # particularly if the device list is empty if device.strip() != '': drives.append(device.strip()) # make sure no drive is listed twice (given by multiple sources) return sorted(uniqify(drives)) picard-release-2.3.1/picard/util/checkupdate.py000066400000000000000000000155601362601763300214640ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Bob Swift # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018, 2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from functools import partial from PyQt5 import QtCore from PyQt5.QtWidgets import QMessageBox from picard import ( PICARD_FANCY_VERSION_STR, PICARD_VERSION, log, ) from picard.const import ( PLUGINS_API, PROGRAM_UPDATE_LEVELS, ) from picard.util import webbrowser2 from picard.version import ( Version, VersionError, ) class UpdateCheckManager(QtCore.QObject): def __init__(self, parent=None): super().__init__(parent=parent) self._parent = parent self._available_versions = {} self._show_always = False self._update_level = 0 def check_update(self, show_always=False, update_level=0, callback=None): """Checks if an update is available. Compares the version number of the currently running instance of Picard and displays a dialog box informing the user if an update is available, with an option of opening the download site in their browser. If there is no update available, no dialog will be shown unless the "show_always" parameter has been set to True. This allows for silent checking during startup if so configured. Args: show_always: Boolean value indicating whether the results dialog should be shown even when there is no update available. update_level: Determines what type of updates to check. Options are: 0 = only stable release versions are checked. 1 = stable and beta releases are checked. 2 = stable, beta and dev releases are checked. Returns: none. Raises: none. """ self._show_always = show_always self._update_level = update_level if self._available_versions: # Release information already acquired from specified website api. self._display_results() else: # Gets list of releases from specified website api. self._query_available_updates(callback=callback) def _query_available_updates(self, callback=None): """Gets list of releases from specified website api.""" log.debug("Getting Picard release information from {host_url}".format(host_url=PLUGINS_API['host'],)) self.tagger.webservice.get( PLUGINS_API['host'], PLUGINS_API['port'], PLUGINS_API['endpoint']['releases'], partial(self._releases_json_loaded, callback=callback), priority=True, important=True ) def _releases_json_loaded(self, response, reply, error, callback=None): """Processes response from specified website api query.""" if error: log.error(_("Error loading Picard releases list: {error_message}").format(error_message=reply.errorString(),)) if self._show_always: QMessageBox.information( self._parent, _("Picard Update"), _("Unable to retrieve the latest version information from the website.\n(https://{url}{endpoint})").format( url=PLUGINS_API['host'], endpoint=PLUGINS_API['endpoint']['releases'], ), QMessageBox.Ok, QMessageBox.Ok) else: if response and 'versions' in response: self._available_versions = response['versions'] else: self._available_versions = {} for key in self._available_versions: log.debug("Version key '{version_key}' --> {version_information}".format( version_key=key, version_information=self._available_versions[key],)) self._display_results() if callback: callback(not error) def _display_results(self): # Display results to user. key = '' high_version = PICARD_VERSION for test_key in PROGRAM_UPDATE_LEVELS: update_level = PROGRAM_UPDATE_LEVELS[test_key]['name'] version_tuple = self._available_versions.get(update_level, {}).get('version', (0, 0, 0, '')) try: test_version = Version(*version_tuple) except (TypeError, VersionError): log.error('Invalid version %r for update level %s.' % (version_tuple, update_level)) continue if self._update_level >= test_key and test_version > high_version: key = PROGRAM_UPDATE_LEVELS[test_key]['name'] high_version = test_version if key: if QMessageBox.information( self._parent, _("Picard Update"), _("A new version of Picard is available.\n\n" "This version: {picard_old_version}\n" "New version: {picard_new_version}\n\n" "Would you like to download the new version?").format( picard_old_version=PICARD_FANCY_VERSION_STR, picard_new_version=self._available_versions[key]['tag'] ), QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Cancel ) == QMessageBox.Ok: webbrowser2.open(self._available_versions[key]['urls']['download']) else: if self._show_always: if self._update_level in PROGRAM_UPDATE_LEVELS: update_level = PROGRAM_UPDATE_LEVELS[self._update_level]['title'] else: update_level = N_('unknown') QMessageBox.information( self._parent, _("Picard Update"), _("There is no update currently available for your subscribed update level: {update_level}\n\n" "Your version: {picard_old_version}\n").format( update_level=_(update_level), picard_old_version=PICARD_FANCY_VERSION_STR, ), QMessageBox.Ok, QMessageBox.Ok ) picard-release-2.3.1/picard/util/emptydir.py000066400000000000000000000055321362601763300210370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os import os.path import shutil from PyQt5.QtCore import QStandardPaths from picard.util import get_qt_enum # Files not considered relevant for a directory. If a directory has only # some of these files inside it is still considered empty and can be deleted. JUNK_FILES = set([".DS_Store", "desktop.ini", "Desktop.ini", "Thumbs.db"]) # Special file system locations Picard should never delete. PROTECTED_DIRECTORIES = set() for location in get_qt_enum(QStandardPaths, QStandardPaths.StandardLocation): value = getattr(QStandardPaths, location) for path in QStandardPaths.standardLocations(value): PROTECTED_DIRECTORIES.add(os.path.realpath(path)) class SkipRemoveDir(Exception): pass def is_empty_dir(path, ignored_files=None): """ Checks if a directory is considered empty. Args: path: Path to directory to check. ignored_files: List of files to ignore. I only some of those files is inside the directory it is still considered empty. Returns: True if path is considered an empty directory False if path is not considered an empty directory Raises: NotADirectoryError: path is not a directory """ if ignored_files is None: ignored_files = JUNK_FILES return not set(os.listdir(path)) - set(ignored_files) def rm_empty_dir(path): """ Delete a directory if it is considered empty by is_empty_dir and if it is not considered a special directory (e.g. the users home dir or ~/Desktop). Args: path: Path to directory to remove. Raises: NotADirectoryError: path is not a directory SkipRemoveDir: path was not deleted because it is either not empty or considered a special directory. """ if os.path.realpath(path) in PROTECTED_DIRECTORIES: raise SkipRemoveDir('%s is a protected directory' % path) elif not is_empty_dir(path): raise SkipRemoveDir('%s is not empty' % path) else: shutil.rmtree(path) picard-release-2.3.1/picard/util/filenaming.py000066400000000000000000000337061362601763300213170ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2013-2014 Ionuț Ciocîrlan # Copyright (C) 2013-2014, 2018-2019 Laurent Monin # Copyright (C) 2014 Michael Wiencek # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2017 Ville Skyttä # Copyright (C) 2018 Antonio Larrosa # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import math import os import re import struct import sys import unicodedata from PyQt5.QtCore import QStandardPaths from picard.const.sys import ( IS_MACOS, IS_WIN, ) from picard.util import ( _io_encoding, decode_filename, encode_filename, ) def _get_utf16_length(text): """Returns the number of code points used by a unicode object in its UTF-16 representation. """ if isinstance(text, bytes): return len(text) # if this is a narrow Python build, len will in fact return exactly # what we're looking for if sys.maxunicode == 0xFFFF: return len(text) # otherwise, encode the string in UTF-16 using the system's endianness, # and divide the resulting length by 2 return len(text.encode("utf-16%ce" % sys.byteorder[0])) // 2 def _shorten_to_utf16_length(text, length): """Truncates a str object to the given number of UTF-16 code points. """ assert isinstance(text, str), "This function only works on unicode" # if this is a narrow Python build, regular slicing will do exactly # what we're looking for if sys.maxunicode == 0xFFFF: shortened = text[:length] # before returning, we need to check if we didn't cut in the middle # of a surrogate pair last = shortened[-1:] if last and 0xD800 <= ord(last) <= 0xDBFF: # it's a leading surrogate alright return shortened[:-1] # else... return shortened # otherwise, encode the string in UTF-16 using the system's endianness, # and shorten by twice the length enc = "utf-16%ce" % sys.byteorder[0] shortened = text.encode(enc)[:length * 2] # if we hit a surrogate pair, get rid of the last codepoint last = shortened[-2:] if last and 0xD800 <= struct.unpack("=H", last)[0] <= 0xDBFF: shortened = shortened[:-2] return shortened.decode(enc) def _shorten_to_utf16_nfd_length(text, length): text = unicodedata.normalize('NFD', text) newtext = _shorten_to_utf16_length(text, length) # if the first cut-off character was a combining one, remove our last try: if unicodedata.combining(text[len(newtext)]): newtext = newtext[:-1] except IndexError: pass return unicodedata.normalize('NFC', newtext) _re_utf8 = re.compile(r'^utf([-_]?8)$', re.IGNORECASE) def _shorten_to_bytes_length(text, length): # noqa: E302 """Truncates a unicode object to the given number of bytes it would take when encoded in the "filesystem encoding". """ assert isinstance(text, str), "This function only works on unicode" raw = encode_filename(text) # maybe there's no need to truncate anything if len(raw) <= length: return text # or maybe there's nothing multi-byte here if len(raw) == len(text): return text[:length] # if we're dealing with utf-8, we can use an efficient algorithm # to deal with character boundaries if _re_utf8.match(_io_encoding): i = length # a UTF-8 intermediate byte starts with the bits 10xxxxxx, # so ord(char) & 0b11000000 = 0b10000000 while i > 0 and (raw[i] & 0xC0) == 0x80: i -= 1 return decode_filename(raw[:i]) # finally, a brute force approach i = length while i > 0: try: return decode_filename(raw[:i]) except UnicodeDecodeError: pass i -= 1 # hmm. we got here? return "" SHORTEN_BYTES, SHORTEN_UTF16, SHORTEN_UTF16_NFD = 0, 1, 2 def shorten_filename(filename, length, mode): # noqa: E302 """Truncates a filename to the given number of thingies, as implied by `mode`. """ if isinstance(filename, bytes): return filename[:length] if mode == SHORTEN_BYTES: return _shorten_to_bytes_length(filename, length) if mode == SHORTEN_UTF16: return _shorten_to_utf16_length(filename, length) if mode == SHORTEN_UTF16_NFD: return _shorten_to_utf16_nfd_length(filename, length) def shorten_path(path, length, mode): """Reduce path nodes' length to given limit(s). path: Absolute or relative path to shorten. length: Maximum number of code points / bytes allowed in a node. mode: One of SHORTEN_BYTES, SHORTEN_UTF16, SHORTEN_UTF16_NFD. """ def shorten(n, l): return n and shorten_filename(n, l, mode).strip() or "" dirpath, filename = os.path.split(path) fileroot, ext = os.path.splitext(filename) return os.path.join( os.path.join(*[shorten(node, length) for node in dirpath.split(os.path.sep)]), shorten(fileroot, length - len(ext)) + ext ) def _shorten_to_utf16_ratio(text, ratio): """Shortens the string to the given ratio (and strips it).""" length = _get_utf16_length(text) limit = max(1, int(math.floor(length / ratio))) if isinstance(text, bytes): return text[:limit].strip() else: return _shorten_to_utf16_length(text, limit).strip() def _make_win_short_filename(relpath, reserved=0): r"""Shorten a relative file path according to WinAPI quirks. relpath: The file's path. reserved: Number of characters reserved for the parent path to be joined with, e.g. 3 if it will be joined with "X:\", respectively 5 for "X:\y\". (note the inclusion of the final backslash) """ # See: # http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx # # The MAX_PATH is 260 characters, with this possible format for a file: # "X:\<244-char dir path>\<11-char filename>". # Our constraints: # the entire path's length MAX_FILEPATH_LEN = 259 # the entire parent directory path's length, *excluding* the final separator MAX_DIRPATH_LEN = 247 # a single node's length (this seems to be the case for older NTFS) MAX_NODE_LEN = 226 # to make predictable directory paths we need to fit the directories in # MAX_DIRPATH_LEN, and truncate the filename to whatever's left remaining = MAX_DIRPATH_LEN - reserved # to make things more readable... def shorten(p, l): return shorten_path(p, l, mode=SHORTEN_UTF16) xlength = _get_utf16_length # shorten to MAX_NODE_LEN from the beginning relpath = shorten(relpath, MAX_NODE_LEN) dirpath, filename = os.path.split(relpath) # what if dirpath is already the right size? dplen = xlength(dirpath) if dplen <= remaining: filename_max = MAX_FILEPATH_LEN - (reserved + dplen + 1) # the final separator filename = shorten(filename, filename_max) return os.path.join(dirpath, filename) # compute the directory path and the maximum number of characters # in a filename, and cache them try: computed = _make_win_short_filename._computed except AttributeError: computed = _make_win_short_filename._computed = {} try: finaldirpath, filename_max = computed[(dirpath, reserved)] except KeyError: dirnames = dirpath.split(os.path.sep) # allocate space for the separators, # but don't include the final one remaining -= len(dirnames) - 1 # make sure we can have at least single-character dirnames average = float(remaining) / len(dirnames) if average < 1: # TODO: a nice exception raise IOError("Path too long. You need to move renamed files \ to a different directory.") # try to reduce directories exceeding average with a ratio proportional # to how much they exceed with; if not possible, reduce all dirs # proportionally to their initial length shortdirnames = [dn for dn in dirnames if len(dn) <= average] totalchars = sum(map(xlength, dirnames)) shortdirchars = sum(map(xlength, shortdirnames)) # do we have at least 1 char for longdirs? if remaining > shortdirchars + len(dirnames) - len(shortdirnames): ratio = float(totalchars - shortdirchars) / (remaining - shortdirchars) for i, dn in enumerate(dirnames): if len(dn) > average: dirnames[i] = _shorten_to_utf16_ratio(dn, ratio) else: ratio = float(totalchars) / remaining dirnames = [_shorten_to_utf16_ratio(dn, ratio) for dn in dirnames] # here it is: finaldirpath = os.path.join(*dirnames) # did we win back some chars from .floor()s and .strip()s? recovered = remaining - sum(map(xlength, dirnames)) # so how much do we have left for the filename? filename_max = MAX_FILEPATH_LEN - MAX_DIRPATH_LEN - 1 + recovered # ^ the final separator # and don't forget to cache computed[(dirpath, reserved)] = (finaldirpath, filename_max) # finally... filename = shorten(filename, filename_max) return os.path.join(finaldirpath, filename) def _get_mount_point(target): """Finds the target's mountpoint.""" # and caches it for future lookups try: mounts = _get_mount_point._mounts except AttributeError: mounts = _get_mount_point._mounts = {} try: mount = mounts[target] except KeyError: mount = target while mount and not os.path.ismount(mount): mount = os.path.dirname(mount) mounts[target] = mount return mount # NOTE: this could be merged with the function above, and get all needed info # in a single call, returning the filesystem type as well. (but python's # posix.statvfs_result doesn't implement f_fsid) def _get_filename_limit(target): """Finds the maximum filename length under the given directory.""" # and caches it try: limits = _get_filename_limit._limits except AttributeError: limits = _get_filename_limit._limits = {} try: limit = limits[target] except KeyError: # we need to call statvfs on an existing target d = target while not os.path.exists(d): d = os.path.dirname(d) # XXX http://bugs.python.org/issue18695 try: limit = os.statvfs(d).f_namemax except UnicodeEncodeError: limit = os.statvfs(d.encode(_io_encoding)).f_namemax limits[target] = limit return limit def make_short_filename(basedir, relpath, win_compat=False, relative_to=""): """Shorten a filename's path to proper limits. basedir: Absolute path of the base directory where files will be moved. relpath: File path, relative from the base directory. win_compat: Windows is quirky. relative_to: An ancestor directory of basedir, against which win_compat will be applied. """ # only deal with absolute paths. it saves a lot of grief, # and is the right thing to do, even for renames. try: basedir = os.path.abspath(basedir) except FileNotFoundError: # os.path.abspath raises an exception if basedir is a relative path and # cwd doesn't exist anymore basedir = QStandardPaths.writableLocation(QStandardPaths.MusicLocation) # also, make sure the relative path is clean relpath = os.path.normpath(relpath) if win_compat and relative_to: relative_to = os.path.abspath(relative_to) assert basedir.startswith(relative_to) and \ basedir.split(relative_to)[1][:1] in (os.path.sep, ''), \ "`relative_to` must be an ancestor of `basedir`" # always strip the relpath parts relpath = os.path.join(*[part.strip() for part in relpath.split(os.path.sep)]) # if we're on windows, delegate the work to a windows-specific function if IS_WIN: reserved = len(basedir) if not basedir.endswith(os.path.sep): reserved += 1 return _make_win_short_filename(relpath, reserved) # if we're being windows compatible, figure out how much # needs to be reserved for the basedir part if win_compat: # if a relative ancestor wasn't provided, # use the basedir's mount point if not relative_to: relative_to = _get_mount_point(basedir) # if it's root, presume the parent will be copied over # to windows, and hope for the best if relative_to == os.path.sep: relative_to = os.path.dirname(basedir) reserved = len(basedir) - len(relative_to) + 3 + 1 # the drive name ^ + ^ the final separator relpath = _make_win_short_filename(relpath, reserved) # on *nix we can consider there is no path limit, but there is # a filename length limit. if IS_MACOS: # on OS X (i.e. HFS+), this is expressed in UTF-16 code points, # in NFD normalization form relpath = shorten_path(relpath, 255, mode=SHORTEN_UTF16_NFD) else: # on everything else the limit is expressed in bytes, # and filesystem-dependent limit = _get_filename_limit(basedir) relpath = shorten_path(relpath, limit, mode=SHORTEN_BYTES) return relpath picard-release-2.3.1/picard/util/icontheme.py000066400000000000000000000046301362601763300211530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2008 Lukáš Lalinský # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import os.path from PyQt5 import QtGui from picard.const.sys import IS_WIN if IS_WIN: _search_paths = [] else: _search_paths = [ os.path.expanduser('~/.icons'), os.path.join(os.environ.get('XDG_DATA_DIRS', '/usr/share'), 'icons'), '/usr/share/pixmaps', ] _current_theme = None if 'XDG_CURRENT_DESKTOP' in os.environ: desktop = os.environ['XDG_CURRENT_DESKTOP'].lower() if desktop in ('gnome', 'unity'): _current_theme = (os.popen('gsettings get org.gnome.desktop.interface icon-theme').read().strip()[1:-1] or None) elif os.environ.get('KDE_FULL_SESSION'): _current_theme = (os.popen("kreadconfig --file kdeglobals --group Icons --key Theme --default crystalsvg").read().strip() or None) ICON_SIZE_MENU = ('16x16',) ICON_SIZE_TOOLBAR = ('22x22',) ICON_SIZE_ALL = ('22x22', '16x16') def lookup(name, size=ICON_SIZE_ALL): icon = QtGui.QIcon() if _current_theme: for path in _search_paths: for subdir in ('actions', 'places', 'devices'): fullpath = os.path.join(path, _current_theme, size[0], subdir, name) if os.path.exists(fullpath + '.png'): icon.addFile(fullpath + '.png') for s in size[1:]: icon.addFile(os.path.join(path, _current_theme, s, subdir, name) + '.png') return icon for s in size: icon.addFile('/'.join([':', 'images', s, name]) + '.png') return icon picard-release-2.3.1/picard/util/imageinfo.py000066400000000000000000000075451362601763300211460ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2014, 2018, 2020 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from io import BytesIO import struct class IdentificationError(Exception): pass class NotEnoughData(IdentificationError): pass class UnrecognizedFormat(IdentificationError): pass class UnexpectedError(IdentificationError): pass def identify(data): """Parse data for jpg, gif, png metadata If successfully recognized, it returns a tuple with: - width - height - mimetype - extension - data length Exceptions: - `NotEnoughData` if data has less than 16 bytes. - `UnrecognizedFormat` if data isn't recognized as a known format. - `UnexpectedError` if unhandled cases (shouldn't happen). - `IdentificationError` is parent class for all preceding exceptions. """ datalen = len(data) if datalen < 16: raise NotEnoughData('Not enough data') w = -1 h = -1 mime = '' extension = '' # http://en.wikipedia.org/wiki/Graphics_Interchange_Format if data[:6] in (b'GIF87a', b'GIF89a'): w, h = struct.unpack('LL', data[16:24]) mime = 'image/png' extension = '.png' # http://en.wikipedia.org/wiki/JPEG elif data[:2] == b'\xFF\xD8': # Start Of Image (SOI) marker jpeg = BytesIO(data) # skip SOI jpeg.read(2) b = jpeg.read(1) try: while b and ord(b) != 0xDA: # Start Of Scan (SOS) while ord(b) != 0xFF: b = jpeg.read(1) while ord(b) == 0xFF: b = jpeg.read(1) if ord(b) in (0xC0, 0xC1, 0xC2, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF): jpeg.read(2) # parameter length (2 bytes) jpeg.read(1) # data precision (1 byte) h, w = struct.unpack('>HH', jpeg.read(4)) mime = 'image/jpeg' extension = '.jpg' break else: # read 2 bytes as integer length = int(struct.unpack('>H', jpeg.read(2))[0]) # skip data jpeg.read(length - 2) b = jpeg.read(1) except struct.error: pass except ValueError: pass # PDF elif data[:4] == b'%PDF': h, w = 0, 0 mime = 'application/pdf' extension = '.pdf' else: raise UnrecognizedFormat('Unrecognized image data') # this shouldn't happen if w == -1 or h == -1 or mime == '' or extension == '': raise UnexpectedError("Unexpected error: w=%d h=%d mime=%s extension=%s" % (w, h, mime, extension)) return (int(w), int(h), mime, extension, datalen) picard-release-2.3.1/picard/util/imagelist.py000066400000000000000000000226201362601763300211550ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Philipp Wolfer # Copyright (C) 2019 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections.abc import MutableSequence from picard import config class ImageList(MutableSequence): def __init__(self, iterable=()): self._images = list(iterable) def __len__(self): return len(self._images) def __getitem__(self, index): return self._images[index] def __setitem__(self, index, value): self._images[index] = value def __delitem__(self, index): del self._images[index] def insert(self, index, value): return self._images.insert(index, value) def __repr__(self): return '%s(%r)' % (self.__class__.__name__, self._images) def _sorted(self): return sorted(self, key=lambda image: image.normalized_types()) def __eq__(self, other): return self._sorted() == other._sorted() def copy(self): return self.__class__(self._images) def get_front_image(self): for img in self: if img.is_front_image(): return img return None def to_be_saved_to_tags(self, settings=None): """Generator returning images to be saved to tags according to passed settings or config.setting """ if settings is None: settings = config.setting if settings['save_images_to_tags']: only_one_front = settings['embed_only_one_front_image'] for image in self: if not image.can_be_saved_to_tags: continue if only_one_front: if not image.is_front_image(): continue yield image break else: yield image def strip_front_images(self): self._images = [image for image in self._images if not image.is_front_image()] class ImageListState: def __init__(self): self.new_images = set() self.orig_images = set() self.sources = [] self.has_common_new_images = True self.has_common_orig_images = True self.first_new_obj = True self.first_orig_obj = True # The next variables specify what will be updated self.update_new_metadata = False self.update_orig_metadata = False def _process_images(state, src_obj): from picard.track import Track # Check new images if state.update_new_metadata: if state.new_images != set(src_obj.metadata.images): if not state.first_new_obj: state.has_common_new_images = False state.new_images = state.new_images.union(src_obj.metadata.images) if state.first_new_obj: state.first_new_obj = False if state.update_orig_metadata and not isinstance(src_obj, Track): # Check orig images, but not for Tracks (which don't have a useful orig_metadata) if state.orig_images != set(src_obj.orig_metadata.images): if not state.first_orig_obj: state.has_common_orig_images = False state.orig_images = state.orig_images.union(src_obj.orig_metadata.images) if state.first_orig_obj: state.first_orig_obj = False def _update_state(obj, state): for src_obj in state.sources: _process_images(state, src_obj) if state.update_new_metadata: obj.metadata.images = ImageList(state.new_images) obj.metadata.has_common_images = state.has_common_new_images if state.update_orig_metadata: obj.orig_metadata.images = ImageList(state.orig_images) obj.orig_metadata.has_common_images = state.has_common_orig_images # TODO: use functools.singledispatch when py3 is supported def _get_state(obj): from picard.album import Album from picard.cluster import Cluster from picard.track import Track state = ImageListState() if isinstance(obj, Album): for track in obj.tracks: state.sources.append(track) state.sources += track.linked_files state.sources += obj.unmatched_files.files state.update_new_metadata = True state.update_orig_metadata = True elif isinstance(obj, Track): state.sources = obj.linked_files state.update_orig_metadata = True elif isinstance(obj, Cluster): state.sources = obj.files state.update_new_metadata = True return state def _get_metadata_images(state, sources): new_images = set() orig_images = set() for s in sources: if state.update_new_metadata: new_images = new_images.union(s.metadata.images) if state.update_orig_metadata: orig_images = orig_images.union(s.orig_metadata.images) return (new_images, orig_images) def update_metadata_images(obj): """Update the metadata images `obj` based on its children. Based on the type of `obj` this will update `obj.metadata.images` to represent the metadata images of all children (`Track` or `File` objects). This method will iterate over all children and completely rebuild `obj.metadata.images`. Whenever possible the more specific functions `add_metadata_images` or `remove_metadata_images` should be used. Args: obj: A `Cluster`, `Album` or `Track` object with `metadata` property """ _update_state(obj, _get_state(obj)) def _add_images(metadata, added_images): if not added_images: return current_images = set(metadata.images) if added_images != current_images: metadata.images = ImageList(current_images.union(added_images)) metadata.has_common_images = False def add_metadata_images(obj, added_sources): """Add the images in the metadata of `added_sources` to the metadata of `obj`. Args: obj: A `Cluster`, `Album` or `Track` object with `metadata` property added_sources: List of child objects (`Track` or `File`) which's metadata images should be added to `obj` """ state = _get_state(obj) (added_new_images, added_orig_images) = _get_metadata_images(state, added_sources) if state.update_new_metadata: _add_images(obj.metadata, added_new_images) if state.update_orig_metadata: _add_images(obj.orig_metadata, added_orig_images) def _remove_images(metadata, sources, removed_images): """Removes `removed_images` from metadata `images`, but only if they are not included in `sources`. Args: metadata: `Metadata` object from which images should be removed sources: List of source `Metadata` objects removed_images: Set of `CoverArt` proposed for removal from `metadata` """ if not metadata.images or not removed_images: return if not sources: metadata.images = ImageList() metadata.has_common_images = True return current_images = set(metadata.images) if metadata.has_common_images and current_images == removed_images: return common_images = True # True, if all children share the same images previous_images = None # Iterate over all sources and check whether the images proposed to be # removed are used in any sources. Images used in existing sources # must not be removed. for source_metadata in sources: source_images = set(source_metadata.images) if previous_images and common_images and previous_images != source_images: common_images = False previous_images = set(source_metadata.images) # Remember for next iteration removed_images = removed_images.difference(source_images) if not removed_images and not common_images: return # No images left to remove, abort immediatelly metadata.images = ImageList(current_images.difference(removed_images)) metadata.has_common_images = common_images def remove_metadata_images(obj, removed_sources): """Remove the images in the metadata of `removed_sources` from the metadata of `obj`. Args: obj: A `Cluster`, `Album` or `Track` object with `metadata` property removed_sources: List of child objects (`Track` or `File`) which's metadata images should be removed from `obj` """ from picard.track import Track state = _get_state(obj) (removed_new_images, removed_orig_images) = _get_metadata_images(state, removed_sources) if state.update_new_metadata: sources = [s.metadata for s in state.sources] _remove_images(obj.metadata, sources, removed_new_images) if state.update_orig_metadata: sources = [s.orig_metadata for s in state.sources if not isinstance(s, Track)] _remove_images(obj.orig_metadata, sources, removed_orig_images) picard-release-2.3.1/picard/util/lrucache.py000066400000000000000000000057411362601763300207720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2017 Antonio Larrosa # Copyright (C) 2018-2019 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections.abc import MutableMapping class LRUCache(MutableMapping): """ Helper class to cache items using a Least Recently Used policy. It's originally used to cache generated pixmaps in the CoverArtBox object but it's generic enough to be used for other purposes if necessary. The cache will never hold more than max_size items and the item least recently used will be discarded. >>> cache = LRUCache(3) >>> cache['item1'] = 'some value' >>> cache['item2'] = 'some other value' >>> cache['item3'] = 'yet another value' >>> cache['item1'] 'some value' >>> cache['item4'] = 'This will push item 2 out of the cache' >>> cache['item2'] Traceback (most recent call last): File "", line 1, in File "lrucache.py", line 48, in __getitem__ return super().__getitem__(key) KeyError: 'item2' >>> cache['item5'] = 'This will push item3 out of the cache' >>> cache['item3'] Traceback (most recent call last): File "", line 1, in File "lrucache.py", line 48, in __getitem__ return super().__getitem__(key) KeyError: 'item3' >>> cache['item1'] 'some value' """ def __init__(self, max_size, *args, **kwargs): self._ordered_keys = [] self._max_size = max_size self._dict = dict() for k, v in dict(*args, **kwargs).items(): self[k] = v def __getitem__(self, key): value = self._dict[key] self._ordered_keys.remove(key) self._ordered_keys.insert(0, key) return value def __setitem__(self, key, value): if key in self: self._ordered_keys.remove(key) self._ordered_keys.insert(0, key) self._dict[key] = value if len(self) > self._max_size: item = self._ordered_keys.pop() del self._dict[item] def __delitem__(self, key): del self._dict[key] self._ordered_keys.remove(key) def __len__(self): return len(self._dict) def __iter__(self): return iter(self._dict) def __repr__(self): return repr(self._dict) picard-release-2.3.1/picard/util/natsort.py000066400000000000000000000025401362601763300206700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """Functions for natural sorting of strings containing numbers. """ from locale import strxfrm import re RE_NUMBER = re.compile(r'(\d+)') def natkey(text): """ Return a sort key for a string for natural sort order. """ return [int(s) if s.isdigit() else strxfrm(s) for s in RE_NUMBER.split(str(text))] def natsorted(values): """ Returns a copy of the given list sorted naturally. >>> sort(['track02', 'track10', 'track1']) ['track1', 'track02', 'track10'] """ return sorted(values, key=natkey) picard-release-2.3.1/picard/util/preservedtags.py000066400000000000000000000031501362601763300220520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2018 Laurent Monin # Copyright (C) 2019-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config class PreservedTags: opt_name = 'preserved_tags' def __init__(self): self._tags = self._from_config() def _to_config(self): config.setting[self.opt_name] = ", ".join(sorted(self._tags)) def _from_config(self): tags = config.setting[self.opt_name].split(',') return set(filter(bool, map(self._normalize_tag, tags))) @staticmethod def _normalize_tag(tag): return tag.strip().lower() def add(self, name): self._tags.add(self._normalize_tag(name)) self._to_config() def discard(self, name): self._tags.discard(self._normalize_tag(name)) self._to_config() def __contains__(self, key): return self._normalize_tag(key) in self._tags picard-release-2.3.1/picard/util/scripttofilename.py000066400000000000000000000064241362601763300225530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2018-2020 Philipp Wolfer # Copyright (C) 2019 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from picard import config from picard.const.sys import IS_WIN from picard.metadata import Metadata from picard.script import ScriptParser from picard.util import ( replace_win32_incompat, sanitize_filename, ) from picard.util.textencoding import replace_non_ascii def script_to_filename_with_metadata(naming_format, metadata, file=None, settings=None): """Creates a valid filename from a script with the given metadata. Args: naming_format: A string containing the tagger script. The result of executing this script will be the filename. metadata: A Metadata object. The metadata will not be modified. file: A File object (optional) settings: The settings. If not set config.setting will be used. Returns: A tuple with the filename as first element and the updated metadata with changes from the script as second. """ if settings is None: settings = config.setting # make sure every metadata can safely be used in a path name win_compat = IS_WIN or settings["windows_compatibility"] new_metadata = Metadata() for name in metadata: new_metadata[name] = [sanitize_filename(str(v), win_compat=win_compat) for v in metadata.getall(name)] naming_format = naming_format.replace("\t", "").replace("\n", "") filename = ScriptParser().eval(naming_format, new_metadata, file) if settings["ascii_filenames"]: filename = replace_non_ascii(filename, pathsave=True, win_compat=win_compat) # replace incompatible characters if win_compat: filename = replace_win32_incompat(filename) # remove null characters filename = filename.replace("\x00", "") return (filename, new_metadata) def script_to_filename(naming_format, metadata, file=None, settings=None): """Creates a valid filename from a script with the given metadata. Args: naming_format: A string containing the tagger script. The result of executing this script will be the filename. metadata: A Metadata object. The metadata will not be modified. file: A File object (optional) settings: The settings. If not set config.setting will be used. Returns: The filename. """ (filename, _unused) = script_to_filename_with_metadata( naming_format, metadata, file, settings) return filename picard-release-2.3.1/picard/util/settingsoverride.py000066400000000000000000000036211362601763300225770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections.abc import MutableMapping class SettingsOverride(MutableMapping): """ This class can be used to override config temporarly Basically it returns config[key] if key isn't found in internal dict Typical usage: settings = SettingsOverride(config.setting) settings["option"] = "value" """ def __init__(self, orig_settings, *args, **kwargs): self.orig_settings = orig_settings self._dict = dict() for k, v in dict(*args, **kwargs).items(): self[k] = v def __getitem__(self, key): try: return self._dict[key] except KeyError: return self.orig_settings[key] def __setitem__(self, key, value): self._dict[key] = value def __delitem__(self, key): try: del self._dict[key] except KeyError: pass def __len__(self): return len(self._dict) def __iter__(self): return iter(self._dict) def __repr__(self): d = self.orig_settings.copy() d.update(self._dict) return repr(d) picard-release-2.3.1/picard/util/tags.py000066400000000000000000000130711362601763300201350ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007-2008, 2011 Lukáš Lalinský # Copyright (C) 2008-2009, 2018-2020 Philipp Wolfer # Copyright (C) 2011 Johannes Weißl # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2012 Chad Wilson # Copyright (C) 2013 Calvin Walton # Copyright (C) 2013-2014, 2019 Laurent Monin # Copyright (C) 2013-2015, 2017 Sophist-UK # Copyright (C) 2019 Zenara Daley # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re TAG_NAMES = { 'acoustid_fingerprint': N_('AcoustID Fingerprint'), 'acoustid_id': N_('AcoustID'), 'albumartist': N_('Album Artist'), 'albumartistsort': N_('Album Artist Sort Order'), 'album': N_('Album'), 'albumsort': N_('Album Sort Order'), 'arranger': N_('Arranger'), 'artist': N_('Artist'), 'artists': N_('Artists'), 'artistsort': N_('Artist Sort Order'), 'asin': N_('ASIN'), 'barcode': N_('Barcode'), 'bpm': N_('BPM'), 'catalognumber': N_('Catalog Number'), 'comment': N_('Comment'), 'compilation': N_('Compilation (iTunes)'), 'composer': N_('Composer'), 'composersort': N_('Composer Sort Order'), 'conductor': N_('Conductor'), 'copyright': N_('Copyright'), 'date': N_('Date'), 'discid': N_('Disc Id'), 'discnumber': N_('Disc Number'), 'discsubtitle': N_('Disc Subtitle'), 'djmixer': N_('DJ-Mixer'), 'encodedby': N_('Encoded By'), 'encodersettings': N_('Encoder Settings'), 'engineer': N_('Engineer'), 'genre': N_('Genre'), 'grouping': N_('Grouping'), 'isrc': N_('ISRC'), 'key': N_('Key'), 'label': N_('Record Label'), 'language': N_('Language'), '~length': N_('Length'), 'license': N_('License'), 'lyricist': N_('Lyricist'), 'lyrics': N_('Lyrics'), 'media': N_('Media'), 'mixer': N_('Mixer'), 'mood': N_('Mood'), 'movement': N_('Movement'), 'movementnumber': N_('Movement Number'), 'movementtotal': N_('Movement Count'), 'musicbrainz_albumartistid': N_('MusicBrainz Release Artist Id'), 'musicbrainz_albumid': N_('MusicBrainz Release Id'), 'musicbrainz_artistid': N_('MusicBrainz Artist Id'), 'musicbrainz_discid': N_('MusicBrainz Disc Id'), 'musicbrainz_originalalbumid': N_('MusicBrainz Original Release Id'), 'musicbrainz_originalartistid': N_('MusicBrainz Original Artist Id'), 'musicbrainz_recordingid': N_('MusicBrainz Recording Id'), 'musicbrainz_releasegroupid': N_('MusicBrainz Release Group Id'), 'musicbrainz_trackid': N_('MusicBrainz Track Id'), 'musicbrainz_workid': N_('MusicBrainz Work Id'), 'musicip_fingerprint': N_('MusicIP Fingerprint'), 'musicip_puid': N_('MusicIP PUID'), 'originalalbum': N_('Original Album'), 'originalartist': N_('Original Artist'), 'originaldate': N_('Original Release Date'), 'originalfilename': N_('Original Filename'), 'originalyear': N_('Original Year'), 'performer': N_('Performer'), 'producer': N_('Producer'), 'r128_album_gain': N_('R128 Album Gain'), 'r128_track_gain': N_('R128 Track Gain'), '~rating': N_('Rating'), 'releasecountry': N_('Release Country'), 'releasestatus': N_('Release Status'), 'releasetype': N_('Release Type'), 'remixer': N_('Remixer'), 'replaygain_album_gain': N_('ReplayGain Album Gain'), 'replaygain_album_peak': N_('ReplayGain Album Peak'), 'replaygain_album_range': N_('ReplayGain Album Range'), 'replaygain_reference_loudness': N_('ReplayGain Reference Loudness'), 'replaygain_track_gain': N_('ReplayGain Track Gain'), 'replaygain_track_peak': N_('ReplayGain Track Peak'), 'replaygain_track_range': N_('ReplayGain Track Range'), 'script': N_('Script'), 'showmovement': N_('Show Work & Movement'), 'subtitle': N_('Subtitle'), 'title': N_('Title'), 'titlesort': N_('Title Sort Order'), 'totaldiscs': N_('Total Discs'), 'totaltracks': N_('Total Tracks'), 'tracknumber': N_('Track Number'), 'website': N_('Artist Website'), 'work': N_('Work'), 'writer': N_('Writer'), } PRESERVED_TAGS = ( '~bitrate', '~bits_per_sample', '~channels', '~dirname', '~extension', '~filename', '~format', '~sample_rate', '~video', ) def display_tag_name(name): if ':' in name: name, desc = name.split(':', 1) if desc: return '%s [%s]' % (_(TAG_NAMES.get(name, name)), desc) return _(TAG_NAMES.get(name, name)) RE_COMMENT_LANG = re.compile('^([a-zA-Z]{3}):') def parse_comment_tag(name): # noqa: E302 """ Parses a tag name like "comment:XXX:desc", where XXX is the language. If language is not set ("comment:desc") "eng" is assumed as default. Returns a (lang, desc) tuple. """ try: desc = name.split(':', 1)[1] except IndexError: desc = '' lang = 'eng' match = RE_COMMENT_LANG.match(desc) if match: lang = match.group(1) desc = desc[4:] return (lang, desc) picard-release-2.3.1/picard/util/textencoding.py000066400000000000000000000616251362601763300217020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2004 Robert Kaye # Copyright (C) 2006 Lukáš Lalinský # Copyright (C) 2014 Sophist-UK # Copyright (C) 2014, 2018 Laurent Monin # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # This modules provides functionality for simplifying unicode strings. # The unicode character set (of over 1m codepoints and 24,000 characters) includes: # Normal ascii (latin) non-accented characters # Combined latin characters e.g. ae in normal usage # Compatibility combined latin characters (retained for compatibility with other character sets) # These can look very similar to normal characters and can be confusing for searches, sort orders etc. # Non-latin (e.g. japanese, greek, hebrew etc.) characters # Both latin and non-latin characters can be accented. Accents can be either: # Provided by separate nonspacing_mark characters which are visually overlaid (visually 1 character is actually 2); or # Integrated accented characters (i.e. non-accented characters combined with a nonspace_mark into a single character) # Again these can be confusing for searches, sort orders etc. # Punctuation can also be confusing in unicode e.g. several types of single or double quote mark. # For latin script: # Combined characters, accents and punctuation can be visually similar but look different to search engines, # sort orders etc. and the number of ways to use similar looking characters can (does) result in inconsistent # usage inside Music metadata. # # Simplifying # the unicode character sets by many-to-one mappings can improve consistency and reduce confusion, # however sometimes the choice of specific characters can be a deliberate part of an album, song title or artist name # (and should not therefore be changed without careful thought) and occasionally the choice of characters can be # malicious (i.e. to defeat firewalls or spam filters or to appear to be something else). # # Finally, given the size of the unicode character set, fonts are unlikely to display all characters, # making simplification a necessity. # # Simplification may also be needed to make tags conform to ISO-8859-1 (extended ascii) or to make tags or filenames # into ascii, perhaps because the file system or player cannot support unicode. # # Non-latin scripts may also need to be converted to latin scripts through: # Translation (e.g. hebrew word for mother is translated to "mother"); or # Transliteration (e.g. the SOUND of the hebrew letter or word is spelt out in latin) # These are non-trivial, and the software to do these is far from comprehensive. # This module provides utility functions to enable simplification of latin and punctuation unicode: # 1. simplify compatibility characters; # 2. split combined characters; # 3. remove accents (entirely or if not in ISO-8859-1 as applicable); # 4. replace remaining non-ascii or non-ISO-8859-1 characters with a default character # This module also provides an extension infrastructure to allow translation and / or transliteration plugins to be added. import codecs from functools import partial import unicodedata from picard.util import sanitize_filename # LATIN SIMPLIFICATION # The translation tables for punctuation and latin combined-characters are taken from # http://unicode.org/repos/cldr/trunk/common/transforms/Latin-ASCII.xml # Various bugs and mistakes in this have been ironed out during testing. _additional_compatibility = { "\u0276": "Œ", # LATIN LETTER SMALL CAPITAL OE "\u1D00": "A", # LATIN LETTER SMALL CAPITAL A "\u1D01": "Æ", # LATIN LETTER SMALL CAPITAL AE "\u1D04": "C", # LATIN LETTER SMALL CAPITAL C "\u1D05": "D", # LATIN LETTER SMALL CAPITAL D "\u1D07": "E", # LATIN LETTER SMALL CAPITAL E "\u1D0A": "J", # LATIN LETTER SMALL CAPITAL J "\u1D0B": "K", # LATIN LETTER SMALL CAPITAL K "\u1D0D": "M", # LATIN LETTER SMALL CAPITAL M "\u1D0F": "O", # LATIN LETTER SMALL CAPITAL O "\u1D18": "P", # LATIN LETTER SMALL CAPITAL P "\u1D1B": "T", # LATIN LETTER SMALL CAPITAL T "\u1D1C": "U", # LATIN LETTER SMALL CAPITAL U "\u1D20": "V", # LATIN LETTER SMALL CAPITAL V "\u1D21": "W", # LATIN LETTER SMALL CAPITAL W "\u1D22": "Z", # LATIN LETTER SMALL CAPITAL Z "\u3007": "0", # IDEOGRAPHIC NUMBER ZERO "\u00A0": " ", # NO-BREAK SPACE "\u3000": " ", # IDEOGRAPHIC SPACE (from ‹character-fallback›) "\u2033": "”", # DOUBLE PRIME } def unicode_simplify_compatibility(string): interim = ''.join(_additional_compatibility.get(c, c) for c in string) return unicodedata.normalize("NFKC", interim) _simplify_punctuation = { "\u013F": "L", # LATIN CAPITAL LETTER L WITH MIDDLE DOT (compat) "\u0140": "l", # LATIN SMALL LETTER L WITH MIDDLE DOT (compat) "\u2018": "'", # LEFT SINGLE QUOTATION MARK (from ‹character-fallback›) "\u2019": "'", # RIGHT SINGLE QUOTATION MARK (from ‹character-fallback›) "\u201A": "'", # SINGLE LOW-9 QUOTATION MARK (from ‹character-fallback›) "\u201B": "'", # SINGLE HIGH-REVERSED-9 QUOTATION MARK (from ‹character-fallback›) "\u201C": "\"", # LEFT DOUBLE QUOTATION MARK (from ‹character-fallback›) "\u201D": "\"", # RIGHT DOUBLE QUOTATION MARK (from ‹character-fallback›) "\u201E": "\"", # DOUBLE LOW-9 QUOTATION MARK (from ‹character-fallback›) "\u201F": "\"", # DOUBLE HIGH-REVERSED-9 QUOTATION MARK (from ‹character-fallback›) "\u2032": "'", # PRIME "\u2033": "\"", # DOUBLE PRIME "\u301D": "\"", # REVERSED DOUBLE PRIME QUOTATION MARK "\u301E": "\"", # DOUBLE PRIME QUOTATION MARK "\u00AB": "<<", # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK (from ‹character-fallback›) "\u00BB": ">>", # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK (from ‹character-fallback›) "\u2039": "<", # SINGLE LEFT-POINTING ANGLE QUOTATION MARK "\u203A": ">", # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK "\u00AD": "", # SOFT HYPHEN (from ‹character-fallback›) "\u2010": "-", # HYPHEN (from ‹character-fallback›) "\u2011": "-", # NON-BREAKING HYPHEN (from ‹character-fallback›) "\u2012": "-", # FIGURE DASH (from ‹character-fallback›) "\u2013": "-", # EN DASH (from ‹character-fallback›) "\u2014": "-", # EM DASH (from ‹character-fallback›) "\u2015": "-", # HORIZONTAL BAR (from ‹character-fallback›) "\uFE31": "|", # PRESENTATION FORM FOR VERTICAL EM DASH (compat) "\uFE32": "|", # PRESENTATION FORM FOR VERTICAL EN DASH (compat) "\uFE58": "-", # SMALL EM DASH (compat) "\u2016": "||", # DOUBLE VERTICAL LINE "\u2044": "/", # FRACTION SLASH (from ‹character-fallback›) "\u2045": "[", # LEFT SQUARE BRACKET WITH QUILL "\u2046": "]", # RIGHT SQUARE BRACKET WITH QUILL "\u204E": "*", # LOW ASTERISK "\u3008": "<", # LEFT ANGLE BRACKET "\u3009": ">", # RIGHT ANGLE BRACKET "\u300A": "<<", # LEFT DOUBLE ANGLE BRACKET "\u300B": ">>", # RIGHT DOUBLE ANGLE BRACKET "\u3014": "[", # LEFT TORTOISE SHELL BRACKET "\u3015": "]", # RIGHT TORTOISE SHELL BRACKET "\u3018": "[", # LEFT WHITE TORTOISE SHELL BRACKET "\u3019": "]", # RIGHT WHITE TORTOISE SHELL BRACKET "\u301A": "[", # LEFT WHITE SQUARE BRACKET "\u301B": "]", # RIGHT WHITE SQUARE BRACKET "\uFE11": ",", # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA (compat) "\uFE12": ".", # PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP (compat) "\uFE39": "[", # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET (compat) "\uFE3A": "]", # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET (compat) "\uFE3D": "<<", # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET (compat) "\uFE3E": ">>", # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET (compat) "\uFE3F": "<", # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET (compat) "\uFE40": ">", # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET (compat) "\uFE51": ",", # SMALL IDEOGRAPHIC COMMA (compat) "\uFE5D": "[", # SMALL LEFT TORTOISE SHELL BRACKET (compat) "\uFE5E": "]", # SMALL RIGHT TORTOISE SHELL BRACKET (compat) "\uFF5F": "((", # FULLWIDTH LEFT WHITE PARENTHESIS (compat)(from ‹character-fallback›) "\uFF60": "))", # FULLWIDTH RIGHT WHITE PARENTHESIS (compat)(from ‹character-fallback›) "\uFF61": ".", # HALFWIDTH IDEOGRAPHIC FULL STOP (compat) "\uFF64": ",", # HALFWIDTH IDEOGRAPHIC COMMA (compat) "\u2212": "-", # MINUS SIGN (from ‹character-fallback›) "\u2215": "/", # DIVISION SLASH (from ‹character-fallback›) "\u2216": "\\", # SET MINUS (from ‹character-fallback›) "\u2223": "|", # DIVIDES (from ‹character-fallback›) "\u2225": "||", # PARALLEL TO (from ‹character-fallback›) "\u226A": "<<", # MUCH LESS-THAN "\u226B": ">>", # MUCH GREATER-THAN "\u2985": "((", # LEFT WHITE PARENTHESIS "\u2986": "))", # RIGHT WHITE PARENTHESIS "\u200B": "", # Zero Width Space } def _replace_unicode_simplify_punctuation(char, pathsave, win_compat): result = _simplify_punctuation.get(char) if result is None: return char elif not pathsave: return result else: return sanitize_filename(result, win_compat=win_compat) def unicode_simplify_punctuation(string, pathsave=False, win_compat=False): return ''.join( _replace_unicode_simplify_punctuation(c, pathsave, win_compat) for c in string) _simplify_combinations = { "\u00C6": "AE", # LATIN CAPITAL LETTER AE (from ‹character-fallback›) "\u00D0": "D", # LATIN CAPITAL LETTER ETH "\u00D8": "OE", # LATIN CAPITAL LETTER O WITH STROKE (see https://en.wikipedia.org/wiki/%C3%98) "\u00DE": "TH", # LATIN CAPITAL LETTER THORN "\u00DF": "ss", # LATIN SMALL LETTER SHARP S (from ‹character-fallback›) "\u00E6": "ae", # LATIN SMALL LETTER AE (from ‹character-fallback›) "\u00F0": "d", # LATIN SMALL LETTER ETH "\u00F8": "oe", # LATIN SMALL LETTER O WITH STROKE (see https://en.wikipedia.org/wiki/%C3%98) "\u00FE": "th", # LATIN SMALL LETTER THORN "\u0110": "D", # LATIN CAPITAL LETTER D WITH STROKE "\u0111": "d", # LATIN SMALL LETTER D WITH STROKE "\u0126": "H", # LATIN CAPITAL LETTER H WITH STROKE "\u0127": "h", # LATIN CAPITAL LETTER H WITH STROKE "\u0131": "i", # LATIN SMALL LETTER DOTLESS I "\u0138": "q", # LATIN SMALL LETTER KRA (collates with q in DUCET) "\u0141": "L", # LATIN CAPITAL LETTER L WITH STROKE "\u0142": "l", # LATIN SMALL LETTER L WITH STROKE "\u0149": "'n", # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE (from ‹character-fallback›) "\u014A": "N", # LATIN CAPITAL LETTER ENG "\u014B": "n", # LATIN SMALL LETTER ENG "\u0152": "OE", # LATIN CAPITAL LIGATURE OE (from ‹character-fallback›) "\u0153": "oe", # LATIN SMALL LIGATURE OE (from ‹character-fallback›) "\u0166": "T", # LATIN CAPITAL LETTER T WITH STROKE "\u0167": "t", # LATIN SMALL LETTER T WITH STROKE "\u0180": "b", # LATIN SMALL LETTER B WITH STROKE "\u0181": "B", # LATIN CAPITAL LETTER B WITH HOOK "\u0182": "B", # LATIN CAPITAL LETTER B WITH TOPBAR "\u0183": "b", # LATIN SMALL LETTER B WITH TOPBAR "\u0187": "C", # LATIN CAPITAL LETTER C WITH HOOK "\u0188": "c", # LATIN SMALL LETTER C WITH HOOK "\u0189": "D", # LATIN CAPITAL LETTER AFRICAN D "\u018A": "D", # LATIN CAPITAL LETTER D WITH HOOK "\u018B": "D", # LATIN CAPITAL LETTER D WITH TOPBAR "\u018C": "d", # LATIN SMALL LETTER D WITH TOPBAR "\u0190": "E", # LATIN CAPITAL LETTER OPEN E "\u0191": "F", # LATIN CAPITAL LETTER F WITH HOOK "\u0192": "f", # LATIN SMALL LETTER F WITH HOOK "\u0193": "G", # LATIN CAPITAL LETTER G WITH HOOK "\u0195": "hv", # LATIN SMALL LETTER HV "\u0196": "I", # LATIN CAPITAL LETTER IOTA "\u0197": "I", # LATIN CAPITAL LETTER I WITH STROKE "\u0198": "K", # LATIN CAPITAL LETTER K WITH HOOK "\u0199": "k", # LATIN SMALL LETTER K WITH HOOK "\u019A": "l", # LATIN SMALL LETTER L WITH BAR "\u019D": "N", # LATIN CAPITAL LETTER N WITH LEFT HOOK "\u019E": "n", # LATIN SMALL LETTER N WITH LONG RIGHT LEG "\u01A2": "GH", # LATIN CAPITAL LETTER GHA (see http://unicode.org/notes/tn27/) "\u01A3": "gh", # LATIN SMALL LETTER GHA (see http://unicode.org/notes/tn27/) "\u01A4": "P", # LATIN CAPITAL LETTER P WITH HOOK "\u01A5": "p", # LATIN SMALL LETTER P WITH HOOK "\u01AB": "t", # LATIN SMALL LETTER T WITH PALATAL HOOK "\u01AC": "T", # LATIN CAPITAL LETTER T WITH HOOK "\u01AD": "t", # LATIN SMALL LETTER T WITH HOOK "\u01AE": "T", # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK "\u01B2": "V", # LATIN CAPITAL LETTER V WITH HOOK "\u01B3": "Y", # LATIN CAPITAL LETTER Y WITH HOOK "\u01B4": "y", # LATIN SMALL LETTER Y WITH HOOK "\u01B5": "Z", # LATIN CAPITAL LETTER Z WITH STROKE "\u01B6": "z", # LATIN SMALL LETTER Z WITH STROKE "\u01C4": "DZ", # LATIN CAPITAL LETTER DZ WITH CARON (compat) "\u01C5": "Dz", # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON (compat) "\u01C6": "dz", # LATIN SMALL LETTER DZ WITH CARON (compat) "\u01E4": "G", # LATIN CAPITAL LETTER G WITH STROKE "\u01E5": "g", # LATIN SMALL LETTER G WITH STROKE "\u0221": "d", # LATIN SMALL LETTER D WITH CURL "\u0224": "Z", # LATIN CAPITAL LETTER Z WITH HOOK "\u0225": "z", # LATIN SMALL LETTER Z WITH HOOK "\u0234": "l", # LATIN SMALL LETTER L WITH CURL "\u0235": "n", # LATIN SMALL LETTER N WITH CURL "\u0236": "t", # LATIN SMALL LETTER T WITH CURL "\u0237": "j", # LATIN SMALL LETTER DOTLESS J "\u0238": "db", # LATIN SMALL LETTER DB DIGRAPH "\u0239": "qp", # LATIN SMALL LETTER QP DIGRAPH "\u023A": "A", # LATIN CAPITAL LETTER A WITH STROKE "\u023B": "C", # LATIN CAPITAL LETTER C WITH STROKE "\u023C": "c", # LATIN SMALL LETTER C WITH STROKE "\u023D": "L", # LATIN CAPITAL LETTER L WITH BAR "\u023E": "T", # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE "\u023F": "s", # LATIN SMALL LETTER S WITH SWASH TAIL "\u0240": "z", # LATIN SMALL LETTER Z WITH SWASH TAIL "\u0243": "B", # LATIN CAPITAL LETTER B WITH STROKE "\u0244": "U", # LATIN CAPITAL LETTER U BAR "\u0246": "E", # LATIN CAPITAL LETTER E WITH STROKE "\u0247": "e", # LATIN SMALL LETTER E WITH STROKE "\u0248": "J", # LATIN CAPITAL LETTER J WITH STROKE "\u0249": "j", # LATIN SMALL LETTER J WITH STROKE "\u024C": "R", # LATIN CAPITAL LETTER R WITH STROKE "\u024D": "r", # LATIN SMALL LETTER R WITH STROKE "\u024E": "Y", # LATIN CAPITAL LETTER Y WITH STROKE "\u024F": "y", # LATIN SMALL LETTER Y WITH STROKE "\u0253": "b", # LATIN SMALL LETTER B WITH HOOK "\u0255": "c", # LATIN SMALL LETTER C WITH CURL "\u0256": "d", # LATIN SMALL LETTER D WITH TAIL "\u0257": "d", # LATIN SMALL LETTER D WITH HOOK "\u025B": "e", # LATIN SMALL LETTER OPEN E "\u025F": "j", # LATIN SMALL LETTER DOTLESS J WITH STROKE "\u0260": "g", # LATIN SMALL LETTER G WITH HOOK "\u0261": "g", # LATIN SMALL LETTER SCRIPT G "\u0262": "G", # LATIN LETTER SMALL CAPITAL G "\u0266": "h", # LATIN SMALL LETTER H WITH HOOK "\u0267": "h", # LATIN SMALL LETTER HENG WITH HOOK "\u0268": "i", # LATIN SMALL LETTER I WITH STROKE "\u026A": "I", # LATIN LETTER SMALL CAPITAL I "\u026B": "l", # LATIN SMALL LETTER L WITH MIDDLE TILDE "\u026C": "l", # LATIN SMALL LETTER L WITH BELT "\u026D": "l", # LATIN SMALL LETTER L WITH RETROFLEX HOOK "\u0271": "m", # LATIN SMALL LETTER M WITH HOOK "\u0272": "n", # LATIN SMALL LETTER N WITH LEFT HOOK "\u0273": "n", # LATIN SMALL LETTER N WITH RETROFLEX HOOK "\u0274": "N", # LATIN LETTER SMALL CAPITAL N "\u0276": "OE", # LATIN LETTER SMALL CAPITAL OE "\u027C": "r", # LATIN SMALL LETTER R WITH LONG LEG "\u027D": "r", # LATIN SMALL LETTER R WITH TAIL "\u027E": "r", # LATIN SMALL LETTER R WITH FISHHOOK "\u0280": "R", # LATIN LETTER SMALL CAPITAL R "\u0282": "s", # LATIN SMALL LETTER S WITH HOOK "\u0288": "t", # LATIN SMALL LETTER T WITH RETROFLEX HOOK "\u0289": "u", # LATIN SMALL LETTER U BAR "\u028B": "v", # LATIN SMALL LETTER V WITH HOOK "\u028F": "Y", # LATIN LETTER SMALL CAPITAL Y "\u0290": "z", # LATIN SMALL LETTER Z WITH RETROFLEX HOOK "\u0291": "z", # LATIN SMALL LETTER Z WITH CURL "\u0299": "B", # LATIN LETTER SMALL CAPITAL B "\u029B": "G", # LATIN LETTER SMALL CAPITAL G WITH HOOK "\u029C": "H", # LATIN LETTER SMALL CAPITAL H "\u029D": "j", # LATIN SMALL LETTER J WITH CROSSED-TAIL "\u029F": "L", # LATIN LETTER SMALL CAPITAL L "\u02A0": "q", # LATIN SMALL LETTER Q WITH HOOK "\u02A3": "dz", # LATIN SMALL LETTER DZ DIGRAPH "\u02A5": "dz", # LATIN SMALL LETTER DZ DIGRAPH WITH CURL "\u02A6": "ts", # LATIN SMALL LETTER TS DIGRAPH "\u02AA": "ls", # LATIN SMALL LETTER LS DIGRAPH "\u02AB": "lz", # LATIN SMALL LETTER LZ DIGRAPH "\u1D01": "AE", # LATIN LETTER SMALL CAPITAL AE "\u1D03": "B", # LATIN LETTER SMALL CAPITAL BARRED B "\u1D06": "D", # LATIN LETTER SMALL CAPITAL ETH "\u1D0C": "L", # LATIN LETTER SMALL CAPITAL L WITH STROKE "\u1D6B": "ue", # LATIN SMALL LETTER UE "\u1D6C": "b", # LATIN SMALL LETTER B WITH MIDDLE TILDE "\u1D6D": "d", # LATIN SMALL LETTER D WITH MIDDLE TILDE "\u1D6E": "f", # LATIN SMALL LETTER F WITH MIDDLE TILDE "\u1D6F": "m", # LATIN SMALL LETTER M WITH MIDDLE TILDE "\u1D70": "n", # LATIN SMALL LETTER N WITH MIDDLE TILDE "\u1D71": "p", # LATIN SMALL LETTER P WITH MIDDLE TILDE "\u1D72": "r", # LATIN SMALL LETTER R WITH MIDDLE TILDE "\u1D73": "r", # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE "\u1D74": "s", # LATIN SMALL LETTER S WITH MIDDLE TILDE "\u1D75": "t", # LATIN SMALL LETTER T WITH MIDDLE TILDE "\u1D76": "z", # LATIN SMALL LETTER Z WITH MIDDLE TILDE "\u1D7A": "th", # LATIN SMALL LETTER TH WITH STRIKETHROUGH "\u1D7B": "I", # LATIN SMALL CAPITAL LETTER I WITH STROKE "\u1D7D": "p", # LATIN SMALL LETTER P WITH STROKE "\u1D7E": "U", # LATIN SMALL CAPITAL LETTER U WITH STROKE "\u1D80": "b", # LATIN SMALL LETTER B WITH PALATAL HOOK "\u1D81": "d", # LATIN SMALL LETTER D WITH PALATAL HOOK "\u1D82": "f", # LATIN SMALL LETTER F WITH PALATAL HOOK "\u1D83": "g", # LATIN SMALL LETTER G WITH PALATAL HOOK "\u1D84": "k", # LATIN SMALL LETTER K WITH PALATAL HOOK "\u1D85": "l", # LATIN SMALL LETTER L WITH PALATAL HOOK "\u1D86": "m", # LATIN SMALL LETTER M WITH PALATAL HOOK "\u1D87": "n", # LATIN SMALL LETTER N WITH PALATAL HOOK "\u1D88": "p", # LATIN SMALL LETTER P WITH PALATAL HOOK "\u1D89": "r", # LATIN SMALL LETTER R WITH PALATAL HOOK "\u1D8A": "s", # LATIN SMALL LETTER S WITH PALATAL HOOK "\u1D8C": "v", # LATIN SMALL LETTER V WITH PALATAL HOOK "\u1D8D": "x", # LATIN SMALL LETTER X WITH PALATAL HOOK "\u1D8E": "z", # LATIN SMALL LETTER Z WITH PALATAL HOOK "\u1D8F": "a", # LATIN SMALL LETTER A WITH RETROFLEX HOOK "\u1D91": "d", # LATIN SMALL LETTER D WITH HOOK AND TAIL "\u1D92": "e", # LATIN SMALL LETTER E WITH RETROFLEX HOOK "\u1D93": "e", # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK "\u1D96": "i", # LATIN SMALL LETTER I WITH RETROFLEX HOOK "\u1D99": "u", # LATIN SMALL LETTER U WITH RETROFLEX HOOK "\u1E9A": "a", # LATIN SMALL LETTER A WITH RIGHT HALF RING "\u1E9C": "s", # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE "\u1E9D": "s", # LATIN SMALL LETTER LONG S WITH HIGH STROKE "\u1E9E": "SS", # LATIN CAPITAL LETTER SHARP S "\u1EFA": "LL", # LATIN CAPITAL LETTER MIDDLE-WELSH LL "\u1EFB": "ll", # LATIN SMALL LETTER MIDDLE-WELSH LL "\u1EFC": "V", # LATIN CAPITAL LETTER MIDDLE-WELSH V "\u1EFD": "v", # LATIN SMALL LETTER MIDDLE-WELSH V "\u1EFE": "Y", # LATIN CAPITAL LETTER Y WITH LOOP "\u1EFF": "y", # LATIN SMALL LETTER Y WITH LOOP "\u00A9": "(C)", # COPYRIGHT SIGN (from ‹character-fallback›) "\u00AE": "(R)", # REGISTERED SIGN (from ‹character-fallback›) "\u20A0": "CE", # EURO-CURRENCY SIGN (from ‹character-fallback›) "\u20A2": "Cr", # CRUZEIRO SIGN (from ‹character-fallback›) "\u20A3": "Fr.", # FRENCH FRANC SIGN (from ‹character-fallback›) "\u20A4": "L.", # LIRA SIGN (from ‹character-fallback›) "\u20A7": "Pts", # PESETA SIGN (from ‹character-fallback›) "\u20BA": "TL", # TURKISH LIRA SIGN (from ‹character-fallback›) "\u20B9": "Rs", # INDIAN RUPEE SIGN (from ‹character-fallback›) "\u211E": "Rx", # PRESCRIPTION TAKE (from ‹character-fallback›) "\u33A7": "m/s", # SQUARE M OVER S (compat) (from ‹character-fallback›) "\u33AE": "rad/s", # SQUARE RAD OVER S (compat) (from ‹character-fallback›) "\u33C6": "C/kg", # SQUARE C OVER KG (compat) (from ‹character-fallback›) "\u33DE": "V/m", # SQUARE V OVER M (compat) (from ‹character-fallback›) "\u33DF": "A/m", # SQUARE A OVER M (compat) (from ‹character-fallback›) "\u00BC": " 1/4", # VULGAR FRACTION ONE QUARTER (from ‹character-fallback›) "\u00BD": " 1/2", # VULGAR FRACTION ONE HALF (from ‹character-fallback›) "\u00BE": " 3/4", # VULGAR FRACTION THREE QUARTERS (from ‹character-fallback›) "\u2153": " 1/3", # VULGAR FRACTION ONE THIRD (from ‹character-fallback›) "\u2154": " 2/3", # VULGAR FRACTION TWO THIRDS (from ‹character-fallback›) "\u2155": " 1/5", # VULGAR FRACTION ONE FIFTH (from ‹character-fallback›) "\u2156": " 2/5", # VULGAR FRACTION TWO FIFTHS (from ‹character-fallback›) "\u2157": " 3/5", # VULGAR FRACTION THREE FIFTHS (from ‹character-fallback›) "\u2158": " 4/5", # VULGAR FRACTION FOUR FIFTHS (from ‹character-fallback›) "\u2159": " 1/6", # VULGAR FRACTION ONE SIXTH (from ‹character-fallback›) "\u215A": " 5/6", # VULGAR FRACTION FIVE SIXTHS (from ‹character-fallback›) "\u215B": " 1/8", # VULGAR FRACTION ONE EIGHTH (from ‹character-fallback›) "\u215C": " 3/8", # VULGAR FRACTION THREE EIGHTHS (from ‹character-fallback›) "\u215D": " 5/8", # VULGAR FRACTION FIVE EIGHTHS (from ‹character-fallback›) "\u215E": " 7/8", # VULGAR FRACTION SEVEN EIGHTHS (from ‹character-fallback›) "\u215F": " 1/", # FRACTION NUMERATOR ONE (from ‹character-fallback›) "\u3001": ",", # IDEOGRAPHIC COMMA "\u3002": ".", # IDEOGRAPHIC FULL STOP "\u00D7": "x", # MULTIPLICATION SIGN "\u00F7": "/", # DIVISION SIGN "\u00B7": ".", # MIDDLE DOT "\u1E9F": "dd", # LATIN SMALL LETTER DELTA "\u0184": "H", # LATIN CAPITAL LETTER TONE SIX "\u0185": "h", # LATIN SMALL LETTER TONE SIX "\u01BE": "ts", # LATIN LETTER TS LIGATION (see http://unicode.org/notes/tn27/) } def _replace_unicode_simplify_combinations(char, pathsave, win_compat): result = _simplify_combinations.get(char) if result is None: return char elif not pathsave: return result else: return sanitize_filename(result, win_compat=win_compat) def unicode_simplify_combinations(string, pathsave=False, win_compat=False): return ''.join( _replace_unicode_simplify_combinations(c, pathsave, win_compat) for c in string) def unicode_simplify_accents(string): result = ''.join(c for c in unicodedata.normalize('NFKD', string) if not unicodedata.combining(c)) return result def asciipunct(string): interim = unicode_simplify_compatibility(string) return unicode_simplify_punctuation(interim) def unaccent(string): """Remove accents ``string``.""" return unicode_simplify_accents(string) def replace_non_ascii(string, repl="_", pathsave=False, win_compat=False): """Replace non-ASCII characters from ``string`` by ``repl``.""" interim = unicode_simplify_combinations(string, pathsave, win_compat) interim = unicode_simplify_accents(interim) interim = unicode_simplify_punctuation(interim, pathsave, win_compat) interim = unicode_simplify_compatibility(interim) def error_repl(e, repl="_"): return (repl, e.start + 1) codecs.register_error('repl', partial(error_repl, repl=repl)) # Decoding and encoding to allow replacements return interim.encode('ascii', 'repl').decode('ascii') picard-release-2.3.1/picard/util/thread.py000066400000000000000000000045231362601763300204500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2008 Gary van der Merwe # Copyright (C) 2011-2013 Michael Wiencek # Copyright (C) 2013, 2018 Laurent Monin # Copyright (C) 2016 Sambhav Kothari # Copyright (C) 2017 Sophist-UK # Copyright (C) 2018 Vishal Choudhary # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import sys import traceback from PyQt5.QtCore import ( QCoreApplication, QEvent, QRunnable, ) class ProxyToMainEvent(QEvent): def __init__(self, func, *args, **kwargs): super().__init__(QEvent.User) self.func = func self.args = args self.kwargs = kwargs def run(self): self.func(*self.args, **self.kwargs) class Runnable(QRunnable): def __init__(self, func, next_func, traceback=True): super().__init__() self.func = func self.next_func = next_func self.traceback = traceback def run(self): try: result = self.func() except BaseException: from picard import log if self.traceback: log.error(traceback.format_exc()) to_main(self.next_func, error=sys.exc_info()[1]) else: to_main(self.next_func, result=result) def run_task(func, next_func, priority=0, thread_pool=None, traceback=True): if thread_pool is None: thread_pool = QCoreApplication.instance().thread_pool thread_pool.start(Runnable(func, next_func, traceback), priority) def to_main(func, *args, **kwargs): QCoreApplication.postEvent(QCoreApplication.instance(), ProxyToMainEvent(func, *args, **kwargs)) picard-release-2.3.1/picard/util/versions.py000066400000000000000000000047271362601763300210570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2014 Lukáš Lalinský # Copyright (C) 2014-2015, 2017-2018 Laurent Monin # Copyright (C) 2016 Sambhav Kothari # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import OrderedDict from platform import python_version from mutagen import version_string as mutagen_version from PyQt5.QtCore import ( PYQT_VERSION_STR as pyqt_version, qVersion, ) from PyQt5.QtNetwork import QSslSocket from picard import PICARD_FANCY_VERSION_STR from picard.disc import discid_version from picard.util.astrcmp import astrcmp_implementation _versions = OrderedDict([ ("version", PICARD_FANCY_VERSION_STR), ("python-version", python_version()), ("pyqt-version", pyqt_version), ("qt-version", qVersion()), ("mutagen-version", mutagen_version), ("discid-version", discid_version), ("astrcmp", astrcmp_implementation), ("ssl-version", QSslSocket.sslLibraryVersionString()) ]) _names = { "version": "Picard", "python-version": "Python", "pyqt-version": "PyQt", "qt-version": "Qt", "mutagen-version": "Mutagen", "discid-version": "Discid", "astrcmp": "astrcmp", "ssl-version": "SSL", } def _value_as_text(value, i18n=False): if not value: value = N_("is not installed") if i18n: return _(value) return value def version_name(key): return _names[key] def as_dict(i18n=False): return OrderedDict([(key, _value_as_text(value, i18n)) for key, value in _versions.items()]) def as_string(i18n=False, separator=", "): values = as_dict(i18n) return separator.join([_names[key] + " " + value for key, value in values.items()]) picard-release-2.3.1/picard/util/webbrowser2.py000066400000000000000000000042111362601763300214360ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2006-2007 Lukáš Lalinský # Copyright (C) 2011 Calvin Walton # Copyright (C) 2013, 2018-2019 Laurent Monin # Copyright (C) 2016-2017 Sambhav Kothari # Copyright (C) 2018 Wieland Hoffmann # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """A webbrowser extension for Picard. It handles and displays errors in PyQt and also adds a utility function for opening Picard URLS. """ from sys import version_info import webbrowser from PyQt5 import QtWidgets from picard import log from picard.const import PICARD_URLS def open(url): try: webbrowser.open(url) except webbrowser.Error as e: QtWidgets.QMessageBox.critical(None, _("Web Browser Error"), _("Error while launching a web browser:\n\n%s") % (e,)) except TypeError: if version_info.major == 3 and version_info.minor == 7 and version_info.micro == 0: # See https://bugs.python.org/issue31014, webbrowser.open doesn't # work on 3.7.0 the first time it's called. The initialization code # in it will be skipped after the first call, making it possibly to # use it, although it might not accurately identify the users # preferred browser. log.info("Working around https://bugs.python.org/issue31014 - URLs might not be opened in the correct browser") webbrowser.open(url) def goto(url_id): open(PICARD_URLS[url_id]) picard-release-2.3.1/picard/util/xml.py000066400000000000000000000046761362601763300200120ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Laurent Monin # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from PyQt5.QtCore import QXmlStreamReader _node_name_re = re.compile('[^a-zA-Z0-9]') class XmlNode(object): def __init__(self): self.text = '' self.children = {} self.attribs = {} def __repr__(self): return repr(self.__dict__) def append_child(self, name, node=None): if node is None: node = XmlNode() self.children.setdefault(name, []).append(node) return node def __getattr__(self, name): try: return self.children[name] except KeyError: try: return self.attribs[name] except KeyError: raise AttributeError(name) def _node_name(n): return _node_name_re.sub('_', n) def parse_xml(response): stream = QXmlStreamReader(response) document = XmlNode() current_node = document path = [] while not stream.atEnd(): stream.readNext() if stream.isStartElement(): node = XmlNode() attrs = stream.attributes() for i in range(attrs.count()): attr = attrs.at(i) node.attribs[_node_name(attr.name())] = attr.value() current_node.append_child(_node_name(stream.name()), node) path.append(current_node) current_node = node elif stream.isEndElement(): current_node = path.pop() elif stream.isCharacters(): current_node.text += stream.text() return document picard-release-2.3.1/picard/version.py000066400000000000000000000107041362601763300177070ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2019-2020 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import namedtuple import re class VersionError(Exception): pass class Version(namedtuple('VersionBase', 'major minor patch identifier revision')): _version_re = re.compile(r"(\d+)[._](\d+)(?:[._](\d+)[._]?(?:(dev|a|alpha|b|beta|rc|final)[._]?(\d+))?)?$") _identifiers = { 'dev': 0, 'alpha': 1, 'a': 1, 'beta': 2, 'b': 2, 'rc': 3, 'final': 4 } def __new__(cls, major, minor, patch=0, identifier='final', revision=0): if identifier not in cls.valid_identifiers(): raise VersionError("Should be either 'final', 'dev', 'alpha', 'beta' or 'rc'") identifier = {'a': 'alpha', 'b': 'beta'}.get(identifier, identifier) try: major = int(major) minor = int(minor) patch = int(patch) revision = int(revision) except (TypeError, ValueError): raise VersionError("major, minor, patch and revision must be integer values") return super(Version, cls).__new__(cls, major, minor, patch, identifier, revision) @classmethod def from_string(cls, version_str): match = cls._version_re.search(version_str) if match: (major, minor, patch, identifier, revision) = match.groups() major = int(major) minor = int(minor) if patch is None: return Version(major, minor) patch = int(patch) if identifier is None: return Version(major, minor, patch) revision = int(revision) return Version(major, minor, patch, identifier, revision) raise VersionError("String '%s' does not match regex '%s'" % (version_str, cls._version_re.pattern)) @classmethod def valid_identifiers(cls): return set(cls._identifiers.keys()) def to_string(self, short=False): if short and self.identifier in ('alpha', 'beta'): version = self._replace(identifier=self.identifier[0]) else: version = self if short and version.identifier == 'final': if version.patch == 0: version_str = '%d.%d' % version[:2] else: version_str = '%d.%d.%d' % version[:3] elif short and version.identifier in ('a', 'b', 'rc'): version_str = '%d.%d.%d%s%d' % version else: version_str = '%d.%d.%d.%s%d' % version return version_str @property def sortkey(self): return self[:3] + (self._identifiers.get(self.identifier, 0), self.revision) def __str__(self): return self.to_string() def __lt__(self, other): if not isinstance(other, Version): other = Version(*other) return self.sortkey < other.sortkey def __le__(self, other): if not isinstance(other, Version): other = Version(*other) return self.sortkey <= other.sortkey def __gt__(self, other): if not isinstance(other, Version): other = Version(*other) return self.sortkey > other.sortkey def __ge__(self, other): if not isinstance(other, Version): other = Version(*other) return self.sortkey >= other.sortkey def __eq__(self, other): if not isinstance(other, Version): other = Version(*other) return self.sortkey == other.sortkey def __ne__(self, other): if not isinstance(other, Version): other = Version(*other) return self.sortkey != other.sortkey def __hash__(self): return super().__hash__() picard-release-2.3.1/picard/webservice/000077500000000000000000000000001362601763300200045ustar00rootroot00000000000000picard-release-2.3.1/picard/webservice/__init__.py000066400000000000000000000541031362601763300221200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018-2019 Philipp Wolfer # Copyright (C) 2018-2020 Laurent Monin # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ Asynchronous web service. """ from collections import ( defaultdict, deque, namedtuple, ) from functools import partial import os.path import platform import sys from PyQt5 import ( QtCore, QtNetwork, ) from PyQt5.QtCore import ( QUrl, QUrlQuery, ) from PyQt5.QtNetwork import QNetworkRequest from picard import ( PICARD_APP_NAME, PICARD_ORG_NAME, PICARD_VERSION_STR, config, log, ) from picard.const import ( CACHE_DIR, CACHE_SIZE_IN_BYTES, ) from picard.oauth import OAuthManager from picard.util import ( build_qurl, bytes2human, parse_json, ) from picard.util.xml import parse_xml from picard.webservice import ratecontrol COUNT_REQUESTS_DELAY_MS = 250 TEMP_ERRORS_RETRIES = 5 USER_AGENT_STRING = '%s-%s/%s (%s;%s-%s)' % (PICARD_ORG_NAME, PICARD_APP_NAME, PICARD_VERSION_STR, platform.platform(), platform.python_implementation(), platform.python_version()) CLIENT_STRING = bytes(QUrl.toPercentEncoding('%s %s-%s' % (PICARD_ORG_NAME, PICARD_APP_NAME, PICARD_VERSION_STR))).decode() DEFAULT_RESPONSE_PARSER_TYPE = "json" Parser = namedtuple('Parser', 'mimetype parser') class UnknownResponseParserError(Exception): def __init__(self, response_type): message = "Unknown parser for response type '%s'. Parser for given response type does not exist." % response_type super().__init__(message) class WSRequest(QNetworkRequest): """Represents a single HTTP request.""" def __init__(self, method, host, port, path, handler, parse_response_type=None, data=None, mblogin=False, cacheloadcontrol=None, refresh=False, queryargs=None, priority=False, important=False, request_mimetype=None): """ Args: method: HTTP method. One of ``GET``, ``POST``, ``PUT``, or ``DELETE``. host: Hostname. port: TCP port number (80 or 443). path: Path component. handler: Callback which takes a 3-tuple of `(str:document, QNetworkReply:reply, QNetworkReply.Error:error)`. parse_response_type: Specifies that request either sends or accepts data as ``application/{{response_mimetype}}``. data: Data to include with ``PUT`` or ``POST`` requests. mblogin: Hints that this request should be tied to a MusicBrainz account, requiring that we obtain an OAuth token first. cacheloadcontrol: See `QNetworkRequest.CacheLoadControlAttribute`. refresh: Indicates a user-specified resource refresh, such as when the user wishes to reload a release. Marks the request as high priority and disables caching. queryargs: `dict` of query arguments. retries: Current retry attempt number. priority: Indicates that this is a high priority request. important: Indicates that this is an important request. request_mimetype: Set the Content-Type header. """ url = build_qurl(host, port, path=path, queryargs=queryargs) super().__init__(url) # These two are codependent (see _update_authorization_header) and must # be initialized explicitly. self._access_token = None self._mblogin = None self._retries = 0 self.method = method self.host = host self.port = port self.path = path self.handler = handler self.parse_response_type = parse_response_type self.response_parser = None self.response_mimetype = None self.request_mimetype = request_mimetype self.data = data self.mblogin = mblogin self.cacheloadcontrol = cacheloadcontrol self.refresh = refresh self.queryargs = queryargs self.priority = priority self.important = important self._high_prio_no_cache = False self.access_token = None self._init_headers() def _init_headers(self): self.setHeader(QNetworkRequest.UserAgentHeader, USER_AGENT_STRING) if self.mblogin or self._high_prio_no_cache: self.setPriority(QNetworkRequest.HighPriority) self.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.AlwaysNetwork) elif self.cacheloadcontrol is not None: self.setAttribute(QNetworkRequest.CacheLoadControlAttribute, self.cacheloadcontrol) if self.parse_response_type: try: self.response_mimetype = WebService.get_response_mimetype(self.parse_response_type) self.response_parser = WebService.get_response_parser(self.parse_response_type) except UnknownResponseParserError as e: log.error(e.args[0]) else: self.setRawHeader(b"Accept", self.response_mimetype.encode('utf-8')) if self.data: if not self.request_mimetype: self.request_mimetype = self.response_mimetype or "application/x-www-form-urlencoded" self.setHeader(QNetworkRequest.ContentTypeHeader, self.request_mimetype) def _update_authorization_header(self): authorization = b"" if self.mblogin and self.access_token: authorization = ("Bearer %s" % self.access_token).encode('utf-8') self.setRawHeader(b"Authorization", authorization) @property def access_token(self): return self._access_token @access_token.setter def access_token(self, access_token): self._access_token = access_token self._update_authorization_header() @property def mblogin(self): return self._mblogin @mblogin.setter def mblogin(self, mblogin): self._mblogin = mblogin self._update_authorization_header() def get_host_key(self): return (self.host, self.port) def max_retries_reached(self): return self._retries >= TEMP_ERRORS_RETRIES def mark_for_retry(self, important=True, priority=True): # Put retries at the head of the list in order to not penalize # the load an album unlucky enough to hit a temporary service # snag. self.important = important self.priority = priority self._retries += 1 return self._retries class WSGetRequest(WSRequest): def __init__(self, *args, **kwargs): super().__init__("GET", *args, **kwargs) def _init_headers(self): self._high_prio_no_cache = self.refresh super()._init_headers() self.setAttribute(QNetworkRequest.HttpPipeliningAllowedAttribute, True) class WSPutRequest(WSRequest): def __init__(self, *args, **kwargs): super().__init__("PUT", *args, **kwargs) def _init_headers(self): self._high_prio_no_cache = True super()._init_headers() class WSDeleteRequest(WSRequest): def __init__(self, *args, **kwargs): super().__init__("DELETE", *args, **kwargs) def _init_headers(self): self._high_prio_no_cache = True super()._init_headers() class WSPostRequest(WSRequest): def __init__(self, *args, **kwargs): super().__init__("POST", *args, **kwargs) def _init_headers(self): self._high_prio_no_cache = True super()._init_headers() class WebService(QtCore.QObject): PARSERS = dict() def __init__(self, parent=None): super().__init__(parent) self.manager = QtNetwork.QNetworkAccessManager() self.oauth_manager = OAuthManager(self) self.set_cache() self.setup_proxy() self.manager.finished.connect(self._process_reply) self._request_methods = { "GET": self.manager.get, "POST": self.manager.post, "PUT": self.manager.put, "DELETE": self.manager.deleteResource } self._init_queues() self._init_timers() def _init_queues(self): self._active_requests = {} self._queues = defaultdict(lambda: defaultdict(deque)) self.num_pending_web_requests = 0 self._last_num_pending_web_requests = -1 def _init_timers(self): self._timer_run_next_task = QtCore.QTimer(self) self._timer_run_next_task.setSingleShot(True) self._timer_run_next_task.timeout.connect(self._run_next_task) self._timer_count_pending_requests = QtCore.QTimer(self) self._timer_count_pending_requests.setSingleShot(True) self._timer_count_pending_requests.timeout.connect(self._count_pending_requests) def set_cache(self, cache_size_in_bytes=None): if cache_size_in_bytes is None: cache_size_in_bytes = CACHE_SIZE_IN_BYTES cache = QtNetwork.QNetworkDiskCache() cache.setCacheDirectory(os.path.join(CACHE_DIR, 'network')) cache.setMaximumCacheSize(cache_size_in_bytes) self.manager.setCache(cache) log.debug("NetworkDiskCache dir: %r current size: %s max size: %s", cache.cacheDirectory(), bytes2human.decimal(cache.cacheSize(), l10n=False), bytes2human.decimal(cache.maximumCacheSize(), l10n=False)) def setup_proxy(self): proxy = QtNetwork.QNetworkProxy() if config.setting["use_proxy"]: proxy.setType(QtNetwork.QNetworkProxy.HttpProxy) proxy.setHostName(config.setting["proxy_server_host"]) proxy.setPort(config.setting["proxy_server_port"]) proxy.setUser(config.setting["proxy_username"]) proxy.setPassword(config.setting["proxy_password"]) self.manager.setProxy(proxy) def _send_request(self, request, access_token=None): hostkey = request.get_host_key() ratecontrol.increment_requests(hostkey) request.access_token = access_token send = self._request_methods[request.method] data = request.data reply = send(request, data.encode('utf-8')) if data is not None else send(request) self._active_requests[reply] = request def _start_request(self, request): if request.mblogin and request.path != "/oauth2/token": self.oauth_manager.get_access_token(partial(self._send_request, request)) else: self._send_request(request) @staticmethod def urls_equivalent(leftUrl, rightUrl): """ Lazy method to determine whether two QUrls are equivalent. At the moment it assumes that if ports are unset that they are port 80 - in absence of a URL normalization function in QUrl or ability to use qHash from QT 4.7 """ return leftUrl.port(80) == rightUrl.port(80) and \ leftUrl.toString(QUrl.RemovePort) == rightUrl.toString(QUrl.RemovePort) @staticmethod def url_port(url): if url.scheme() == 'https': return url.port(443) return url.port(80) def _handle_redirect(self, reply, request, redirect): url = request.url() error = int(reply.error()) # merge with base url (to cover the possibility of the URL being relative) redirect = url.resolved(redirect) if not WebService.urls_equivalent(redirect, reply.request().url()): log.debug("Redirect to %s requested", redirect.toString(QUrl.RemoveUserInfo)) redirect_host = redirect.host() redirect_port = self.url_port(redirect) redirect_query = dict(QUrlQuery(redirect).queryItems(QUrl.FullyEncoded)) redirect_path = redirect.path() original_host = url.host() original_port = self.url_port(url) original_host_key = (original_host, original_port) redirect_host_key = (redirect_host, redirect_port) ratecontrol.copy_minimal_delay(original_host_key, redirect_host_key) self.get(redirect_host, redirect_port, redirect_path, request.handler, request.parse_response_type, priority=True, important=True, refresh=request.refresh, queryargs=redirect_query, mblogin=request.mblogin, cacheloadcontrol=request.attribute(QNetworkRequest.CacheLoadControlAttribute)) else: log.error("Redirect loop: %s", reply.request().url().toString(QUrl.RemoveUserInfo) ) request.handler(reply.readAll(), reply, error) def _handle_reply(self, reply, request): hostkey = request.get_host_key() ratecontrol.decrement_requests(hostkey) self._timer_run_next_task.start(0) slow_down = False error = int(reply.error()) handler = request.handler if error: code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) code = int(code) if code else 0 errstr = reply.errorString() url = reply.request().url().toString(QUrl.RemoveUserInfo) log.error("Network request error for %s: %s (QT code %d, HTTP code %d)", url, errstr, error, code) if (not request.max_retries_reached() and (code == 503 or code == 429 # Sometimes QT returns a http status code of 200 even when there # is a service unavailable error. But it returns a QT error code # of 403 when this happens or error == 403 )): slow_down = True retries = request.mark_for_retry() log.debug("Retrying %s (#%d)", url, retries) self.add_request(request) elif handler is not None: handler(reply.readAll(), reply, error) slow_down = (slow_down or code >= 500) else: redirect = reply.attribute(QNetworkRequest.RedirectionTargetAttribute) fromCache = reply.attribute(QNetworkRequest.SourceIsFromCacheAttribute) cached = ' (CACHED)' if fromCache else '' log.debug("Received reply for %s: HTTP %d (%s) %s", reply.request().url().toString(QUrl.RemoveUserInfo), reply.attribute(QNetworkRequest.HttpStatusCodeAttribute), reply.attribute(QNetworkRequest.HttpReasonPhraseAttribute), cached ) if handler is not None: # Redirect if found and not infinite if redirect: self._handle_redirect(reply, request, redirect) elif request.response_parser: try: document = request.response_parser(reply) except Exception as e: url = reply.request().url().toString(QUrl.RemoveUserInfo) log.error("Unable to parse the response for %s: %s", url, e) document = reply.readAll() error = e finally: handler(document, reply, error) else: handler(reply.readAll(), reply, error) ratecontrol.adjust(hostkey, slow_down) def _process_reply(self, reply): try: request = self._active_requests.pop(reply) except KeyError: log.error("Request not found for %s", reply.request().url().toString(QUrl.RemoveUserInfo)) return try: self._handle_reply(reply, request) finally: reply.close() reply.deleteLater() def get(self, host, port, path, handler, parse_response_type=DEFAULT_RESPONSE_PARSER_TYPE, priority=False, important=False, mblogin=False, cacheloadcontrol=None, refresh=False, queryargs=None): request = WSGetRequest(host, port, path, handler, parse_response_type=parse_response_type, mblogin=mblogin, cacheloadcontrol=cacheloadcontrol, refresh=refresh, queryargs=queryargs, priority=priority, important=important) return self.add_request(request) def post(self, host, port, path, data, handler, parse_response_type=DEFAULT_RESPONSE_PARSER_TYPE, priority=False, important=False, mblogin=True, queryargs=None, request_mimetype=None): request = WSPostRequest(host, port, path, handler, parse_response_type=parse_response_type, data=data, mblogin=mblogin, queryargs=queryargs, priority=priority, important=important, request_mimetype=request_mimetype) log.debug("POST-DATA %r", data) return self.add_request(request) def put(self, host, port, path, data, handler, priority=True, important=False, mblogin=True, queryargs=None, request_mimetype=None): request = WSPutRequest(host, port, path, handler, data=data, mblogin=mblogin, queryargs=queryargs, priority=priority, important=important, request_mimetype=request_mimetype) return self.add_request(request) def delete(self, host, port, path, handler, priority=True, important=False, mblogin=True, queryargs=None): request = WSDeleteRequest(host, port, path, handler, mblogin=mblogin, queryargs=queryargs, priority=priority, important=important) return self.add_request(request) def download(self, host, port, path, handler, priority=False, important=False, cacheloadcontrol=None, refresh=False, queryargs=None): return self.get(host, port, path, handler, parse_response_type=None, priority=priority, important=important, cacheloadcontrol=cacheloadcontrol, refresh=refresh, queryargs=queryargs) def stop(self): for reply in list(self._active_requests): reply.abort() self._init_queues() def _count_pending_requests(self): count = len(self._active_requests) for prio_queue in self._queues.values(): for queue in prio_queue.values(): count += len(queue) self.num_pending_web_requests = count if count != self._last_num_pending_web_requests: self._last_num_pending_web_requests = count self.tagger.tagger_stats_changed.emit() if count: self._timer_count_pending_requests.start(COUNT_REQUESTS_DELAY_MS) def _run_next_task(self): delay = sys.maxsize for prio in sorted(self._queues.keys(), reverse=True): prio_queue = self._queues[prio] if not prio_queue: del(self._queues[prio]) continue for hostkey in sorted(prio_queue.keys(), key=ratecontrol.current_delay): queue = self._queues[prio][hostkey] if not queue: del(self._queues[prio][hostkey]) continue wait, d = ratecontrol.get_delay_to_next_request(hostkey) if not wait: queue.popleft()() if d < delay: delay = d if delay < sys.maxsize: self._timer_run_next_task.start(delay) def add_task(self, func, request): hostkey = request.get_host_key() prio = int(request.priority) # priority is a boolean if request.important: self._queues[prio][hostkey].appendleft(func) else: self._queues[prio][hostkey].append(func) if not self._timer_run_next_task.isActive(): self._timer_run_next_task.start(0) if not self._timer_count_pending_requests.isActive(): self._timer_count_pending_requests.start(0) return (hostkey, func, prio) def add_request(self, request): return self.add_task(partial(self._start_request, request), request) def remove_task(self, task): hostkey, func, prio = task try: self._queues[prio][hostkey].remove(func) if not self._timer_count_pending_requests.isActive(): self._timer_count_pending_requests.start(0) except Exception as e: log.debug(e) @classmethod def add_parser(cls, response_type, mimetype, parser): cls.PARSERS[response_type] = Parser(mimetype=mimetype, parser=parser) @classmethod def get_response_mimetype(cls, response_type): if response_type in cls.PARSERS: return cls.PARSERS[response_type].mimetype else: raise UnknownResponseParserError(response_type) @classmethod def get_response_parser(cls, response_type): if response_type in cls.PARSERS: return cls.PARSERS[response_type].parser else: raise UnknownResponseParserError(response_type) WebService.add_parser('xml', 'application/xml', parse_xml) WebService.add_parser('json', 'application/json', parse_json) picard-release-2.3.1/picard/webservice/api_helpers.py000066400000000000000000000264001362601763300226530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Laurent Monin # Copyright (C) 2018-2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import re from PyQt5.QtCore import QUrl from picard import ( PICARD_VERSION_STR, config, ) from picard.const import ( ACOUSTID_HOST, ACOUSTID_KEY, ACOUSTID_PORT, CAA_HOST, CAA_PORT, ) from picard.webservice import ( CLIENT_STRING, DEFAULT_RESPONSE_PARSER_TYPE, ratecontrol, ) ratecontrol.set_minimum_delay((ACOUSTID_HOST, ACOUSTID_PORT), 333) ratecontrol.set_minimum_delay((CAA_HOST, CAA_PORT), 0) def escape_lucene_query(text): return re.sub(r'([+\-&|!(){}\[\]\^"~*?:\\/])', r'\\\1', text) def _wrap_xml_metadata(data): return ('' '%s' % data) class APIHelper(object): def __init__(self, host, port, api_path, webservice): self._host = host self._port = port self.api_path = api_path self._webservice = webservice @property def host(self): return self._host @property def port(self): return self._port def get(self, path_list, handler, priority=False, important=False, mblogin=False, cacheloadcontrol=None, refresh=False, queryargs=None, parse_response_type=DEFAULT_RESPONSE_PARSER_TYPE): path = self.api_path + "/".join(path_list) return self._webservice.get(self.host, self.port, path, handler, priority=priority, important=important, mblogin=mblogin, refresh=refresh, queryargs=queryargs, parse_response_type=parse_response_type) def post(self, path_list, data, handler, priority=False, important=False, mblogin=True, queryargs=None, parse_response_type=DEFAULT_RESPONSE_PARSER_TYPE, request_mimetype=None): path = self.api_path + "/".join(path_list) return self._webservice.post(self.host, self.port, path, data, handler, priority=priority, important=important, mblogin=mblogin, queryargs=queryargs, parse_response_type=parse_response_type, request_mimetype=request_mimetype) def put(self, path_list, data, handler, priority=True, important=False, mblogin=True, queryargs=None, request_mimetype=None): path = self.api_path + "/".join(path_list) return self._webservice.put(self.host, self.port, path, data, handler, priority=priority, important=important, mblogin=mblogin, queryargs=queryargs, request_mimetype=request_mimetype) def delete(self, path_list, handler, priority=True, important=False, mblogin=True, queryargs=None): path = self.api_path + "/".join(path_list) return self._webservice.delete(self.host, self.port, path, handler, priority=priority, important=important, mblogin=mblogin, queryargs=queryargs) class MBAPIHelper(APIHelper): def __init__(self, webservice): super().__init__(None, None, "/ws/2/", webservice) @property def host(self): return config.setting['server_host'] @property def port(self): return config.setting['server_port'] def _get_by_id(self, entitytype, entityid, handler, inc=None, queryargs=None, priority=False, important=False, mblogin=False, refresh=False): path_list = [entitytype, entityid] if queryargs is None: queryargs = {} if inc: queryargs["inc"] = "+".join(inc) return self.get(path_list, handler, priority=priority, important=important, mblogin=mblogin, refresh=refresh, queryargs=queryargs) def get_release_by_id(self, releaseid, handler, inc=None, priority=False, important=False, mblogin=False, refresh=False): if inc is None: inc = [] return self._get_by_id('release', releaseid, handler, inc, priority=priority, important=important, mblogin=mblogin, refresh=refresh) def get_track_by_id(self, trackid, handler, inc=None, priority=False, important=False, mblogin=False, refresh=False): if inc is None: inc = [] return self._get_by_id('recording', trackid, handler, inc, priority=priority, important=important, mblogin=mblogin, refresh=refresh) def lookup_discid(self, discid, handler, priority=True, important=True, refresh=False): inc = ['artist-credits', 'labels'] return self._get_by_id('discid', discid, handler, inc, queryargs={"cdstubs": "no"}, priority=priority, important=important, refresh=refresh) def _find(self, entitytype, handler, **kwargs): filters = [] limit = kwargs.pop("limit") if limit: filters.append(("limit", limit)) is_search = kwargs.pop("search", False) if is_search: if config.setting["use_adv_search_syntax"]: query = kwargs["query"] else: query = escape_lucene_query(kwargs["query"]).strip().lower() filters.append(("dismax", 'true')) else: query = [] for name, value in kwargs.items(): value = escape_lucene_query(value).strip().lower() if value: query.append('%s:(%s)' % (name, value)) query = ' '.join(query) if query: filters.append(("query", query)) queryargs = {} for name, value in filters: queryargs[name] = bytes(QUrl.toPercentEncoding(str(value))).decode() path_list = [entitytype] return self.get(path_list, handler, queryargs=queryargs, priority=True, important=True, mblogin=False, refresh=False) def find_releases(self, handler, **kwargs): return self._find('release', handler, **kwargs) def find_tracks(self, handler, **kwargs): return self._find('recording', handler, **kwargs) def find_artists(self, handler, **kwargs): return self._find('artist', handler, **kwargs) def _browse(self, entitytype, handler, inc=None, **kwargs): path_list = [entitytype] queryargs = kwargs if inc: queryargs["inc"] = "+".join(inc) return self.get(path_list, handler, queryargs=queryargs, priority=True, important=True, mblogin=False, refresh=False) def browse_releases(self, handler, **kwargs): inc = ["media", "labels"] return self._browse("release", handler, inc, **kwargs) def submit_ratings(self, ratings, handler): path_list = ['rating'] params = {"client": CLIENT_STRING} recordings = (''.join(['%s' % (i[1], j*20) for i, j in ratings.items() if i[0] == 'recording'])) data = _wrap_xml_metadata('%s' % recordings) return self.post(path_list, data, handler, priority=True, queryargs=params, parse_response_type="xml", request_mimetype="application/xml; charset=utf-8") def get_collection(self, collection_id, handler, limit=100, offset=0): path_list = ["collection"] queryargs = None if collection_id is not None: inc = ["releases", "artist-credits", "media"] path_list.extend([collection_id, "releases"]) queryargs = {} queryargs["inc"] = "+".join(inc) queryargs["limit"] = limit queryargs["offset"] = offset return self.get(path_list, handler, priority=True, important=True, mblogin=True, queryargs=queryargs) def get_collection_list(self, handler): return self.get_collection(None, handler) def _collection_request(self, collection_id, releases): while releases: ids = ";".join(releases if len(releases) <= 400 else releases[:400]) releases = releases[400:] yield ["collection", collection_id, "releases", ids] def _get_client_queryarg(self): return {"client": CLIENT_STRING} def put_to_collection(self, collection_id, releases, handler): for path_list in self._collection_request(collection_id, releases): self.put(path_list, "", handler, queryargs=self._get_client_queryarg()) def delete_from_collection(self, collection_id, releases, handler): for path_list in self._collection_request(collection_id, releases): self.delete(path_list, handler, queryargs=self._get_client_queryarg()) class AcoustIdAPIHelper(APIHelper): def __init__(self, webservice): super().__init__(ACOUSTID_HOST, ACOUSTID_PORT, '/v2/', webservice) def _encode_acoustid_args(self, args, format_='json'): filters = [] args['client'] = ACOUSTID_KEY args['clientversion'] = PICARD_VERSION_STR args['format'] = format_ for name, value in args.items(): value = bytes(QUrl.toPercentEncoding(value)).decode() filters.append('%s=%s' % (name, value)) return '&'.join(filters) def query_acoustid(self, handler, **args): path_list = ['lookup'] body = self._encode_acoustid_args(args) return self.post(path_list, body, handler, priority=False, important=False, mblogin=False, request_mimetype="application/x-www-form-urlencoded") def submit_acoustid_fingerprints(self, submissions, handler): path_list = ['submit'] args = {'user': config.setting["acoustid_apikey"]} for i, submission in enumerate(submissions): args['fingerprint.%d' % i] = submission.fingerprint args['duration.%d' % i] = str(submission.duration) args['mbid.%d' % i] = submission.recordingid if submission.puid: args['puid.%d' % i] = submission.puid body = self._encode_acoustid_args(args, format_='json') return self.post(path_list, body, handler, priority=True, important=False, mblogin=False, request_mimetype="application/x-www-form-urlencoded") picard-release-2.3.1/picard/webservice/ratecontrol.py000066400000000000000000000177711362601763300227270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Picard, the next-generation MusicBrainz tagger # # Copyright (C) 2007 Lukáš Lalinský # Copyright (C) 2009 Carlin Mangar # Copyright (C) 2017 Sambhav Kothari # Copyright (C) 2018 Laurent Monin # Copyright (C) 2019 Philipp Wolfer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from collections import defaultdict import math import sys import time from picard import log # ============================================================================ # Throttling/congestion avoidance # ============================================================================ # Throttles requests to a given hostkey by assigning a minimum delay between # requests in milliseconds. # # Plugins may assign limits to their associated service(s) like so: # # >>> from picard.webservice import ratecontrol # >>> ratecontrol.set_minimum_delay(('myservice.org', 80), 100) # 10 requests/second # Minimun delay for the given hostkey (in milliseconds), can be set using # set_minimum_delay() REQUEST_DELAY_MINIMUM = defaultdict(lambda: 1000) # Current delay (adaptive) between requests to a given hostkey. REQUEST_DELAY = defaultdict(lambda: 1000) # Conservative initial value. # Determines delay during exponential backoff phase. REQUEST_DELAY_EXPONENT = defaultdict(lambda: 0) # Unacknowledged request counter. # # Bump this when handing a request to QNetworkManager and trim when receiving # a response. CONGESTION_UNACK = defaultdict(lambda: 0) # Congestion window size in terms of unacked requests. # # We're allowed to send up to `int(this)` many requests at a time. CONGESTION_WINDOW_SIZE = defaultdict(lambda: 1.0) # Slow start threshold. # # After placing this many unacknowledged requests on the wire, switch from # slow start to congestion avoidance. (See `_adjust_throttle`.) Initialized # upon encountering a temporary error. CONGESTION_SSTHRESH = defaultdict(lambda: 0) # Storage of last request times per host key LAST_REQUEST_TIMES = defaultdict(lambda: 0) def set_minimum_delay(hostkey, delay_ms): """Set the minimun delay between requests hostkey is an unique key, for example (host, port) delay_ms is the delay in milliseconds """ REQUEST_DELAY_MINIMUM[hostkey] = delay_ms def current_delay(hostkey): """Returns the current delay (adaptive) between requests for this hostkey hostkey is an unique key, for example (host, port) """ return REQUEST_DELAY[hostkey] def get_delay_to_next_request(hostkey): """Calculate delay to next request to hostkey (host, port) returns a tuple (wait, delay) where: wait is True if a delay is needed delay is the delay in milliseconds to next request """ if CONGESTION_UNACK[hostkey] >= int(CONGESTION_WINDOW_SIZE[hostkey]): # We've maxed out the number of requests to `hostkey`, so wait # until responses begin to come back. (See `_timer_run_next_task` # strobe in `_handle_reply`.) return (True, sys.maxsize) interval = REQUEST_DELAY[hostkey] if not interval: log.debug("%s: Starting another request without delay", hostkey) return (False, 0) last_request = LAST_REQUEST_TIMES[hostkey] if not last_request: log.debug("%s: First request", hostkey) _remember_request_time(hostkey) # set it on first run return (False, interval) elapsed = (time.time() - last_request) * 1000 if elapsed >= interval: log.debug("%s: Last request was %d ms ago, starting another one", hostkey, elapsed) return (False, interval) delay = int(math.ceil(interval - elapsed)) log.debug("%s: Last request was %d ms ago, waiting %d ms before starting another one", hostkey, elapsed, delay) return (True, delay) def _remember_request_time(hostkey): if REQUEST_DELAY[hostkey]: LAST_REQUEST_TIMES[hostkey] = time.time() def increment_requests(hostkey): """Store the request time for this hostkey, and increment counter It has to be called on each request """ _remember_request_time(hostkey) # Increment the number of unack'd requests on sending a new one CONGESTION_UNACK[hostkey] += 1 log.debug("%s: Incrementing requests to: %d", hostkey, CONGESTION_UNACK[hostkey]) def decrement_requests(hostkey): """Decrement counter, it has to be called on each reply """ assert(CONGESTION_UNACK[hostkey] > 0) CONGESTION_UNACK[hostkey] -= 1 log.debug("%s: Decrementing requests to: %d", hostkey, CONGESTION_UNACK[hostkey]) def copy_minimal_delay(from_hostkey, to_hostkey): """Copy minimal delay from one hostkey to another Useful for redirections """ if (from_hostkey in REQUEST_DELAY_MINIMUM and to_hostkey not in REQUEST_DELAY_MINIMUM): REQUEST_DELAY_MINIMUM[to_hostkey] = REQUEST_DELAY_MINIMUM[from_hostkey] log.debug("%s: Copy minimun delay from %s, setting it to %dms", to_hostkey, from_hostkey, REQUEST_DELAY_MINIMUM[to_hostkey]) def adjust(hostkey, slow_down): """Adjust `REQUEST` and `CONGESTION` metrics when a HTTP request completes. Args: hostkey: `(host, port)`. slow_down: `True` if we encountered intermittent server trouble and need to slow down. """ if slow_down: _slow_down(hostkey) elif CONGESTION_UNACK[hostkey] <= CONGESTION_WINDOW_SIZE[hostkey]: # not in backoff phase anymore _out_of_backoff(hostkey) def _slow_down(hostkey): # Backoff exponentially until ~30 seconds between requests. delay = max(pow(2, REQUEST_DELAY_EXPONENT[hostkey]) * 1000, REQUEST_DELAY_MINIMUM[hostkey]) REQUEST_DELAY_EXPONENT[hostkey] = min( REQUEST_DELAY_EXPONENT[hostkey] + 1, 5) # Slow start threshold is ~1/2 of the window size up until we saw # trouble. Shrink the new window size back to 1. CONGESTION_SSTHRESH[hostkey] = int(CONGESTION_WINDOW_SIZE[hostkey] / 2.0) CONGESTION_WINDOW_SIZE[hostkey] = 1.0 log.debug( '%s: slowdown; delay: %dms -> %dms; ssthresh: %d; cws: %.3f', hostkey, REQUEST_DELAY[hostkey], delay, CONGESTION_SSTHRESH[hostkey], CONGESTION_WINDOW_SIZE[hostkey] ) REQUEST_DELAY[hostkey] = delay def _out_of_backoff(hostkey): REQUEST_DELAY_EXPONENT[hostkey] = 0 # Coming out of backoff, so reset. # Shrink the delay between requests with each successive reply to # converge on maximum throughput. delay = max(int(REQUEST_DELAY[hostkey] / 2), REQUEST_DELAY_MINIMUM[hostkey]) cws = CONGESTION_WINDOW_SIZE[hostkey] sst = CONGESTION_SSTHRESH[hostkey] if sst and cws >= sst: # Analogous to TCP's congestion avoidance phase. Window growth is linear. phase = 'congestion avoidance' cws = cws + (1.0 / cws) else: # Analogous to TCP's slow start phase. Window growth is exponential. phase = 'slow start' cws += 1 if (REQUEST_DELAY[hostkey] != delay or CONGESTION_WINDOW_SIZE[hostkey] != cws): log.debug( '%s: oobackoff; delay: %dms -> %dms; %s; window size %.3f -> %.3f', hostkey, REQUEST_DELAY[hostkey], delay, phase, CONGESTION_WINDOW_SIZE[hostkey], cws ) CONGESTION_WINDOW_SIZE[hostkey] = cws REQUEST_DELAY[hostkey] = delay picard-release-2.3.1/po/000077500000000000000000000000001362601763300150225ustar00rootroot00000000000000picard-release-2.3.1/po/README.md000066400000000000000000000036161362601763300163070ustar00rootroot00000000000000Translations ============ Picard translations are handled by [Transifex](https://www.transifex.com). _Please do not manually edit the PO files._ Required tools -------------- * [Transifex client](http://support.transifex.com/customer/portal/topics/440187-transifex-client/articles) * [Babel](http://babel.pocoo.org/) Picard source tree strings -------------------------- Their translations are handled at https://www.transifex.com/projects/p/musicbrainz/resource/picard/ One can update `picard.pot` using: ```bash $ python setup.py regen_pot_file ``` Transifex will _automatically_ pick `picard.pot` from [Picard git repository master branch](https://github.com/metabrainz/picard/tree/master) once per day. Attributes and countries strings -------------------------------- Their translations are handled at https://www.transifex.com/projects/p/musicbrainz/resource/attributes/ and https://www.transifex.com/projects/p/musicbrainz/resource/countries/ `attributes.pot` and `countries.pot` are updated by [musicbrainz-server project](https://bitbucket.org/metabrainz/musicbrainz-server/), outside the Picard project. Picard maintainers can regenerate `picard/const/attributes.py` and `picard/const/countries.py`, which are using `attributes.pot` and `countries.pot` as base, using the command: ```bash $ python setup.py update_constants ``` It will retrieve and parse latest `attributes.pot` and `countries.pot` to rebuild `picard/const/attributes.py` and `picard/const/countries.py`. To fetch latest translations from Transifex ------------------------------------------- Use the following command: ```bash $ python setup.py get_po_files ``` It will fetch all po files from Transifex, but the most incomplete ones. The minimum acceptable percentage of a translation in order to download it can be seen using: ```bash $ python setup.py get_po_files --help ``` The percentage value is passed to the `tx pull` command. picard-release-2.3.1/po/af.po000066400000000000000000001350321362601763300157540ustar00rootroot00000000000000# Translations template for PROJECT. # Copyright (C) 2012 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # # Translators: # FIRST AUTHOR , 2009. msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "Report-Msgid-Bugs-To: http://tickets.musicbrainz.org/\n" "POT-Creation-Date: 2012-08-28 15:50+0200\n" "PO-Revision-Date: 2012-08-29 08:53+0000\n" "Last-Translator: Lukáš Lalinský \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" "Language: af\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: contrib/plugins/no_release.py:48 msgid "Enable plugin for all releases by default" msgstr "" #: contrib/plugins/no_release.py:49 msgid "Tags to strip (comma-separated)" msgstr "" #: contrib/plugins/no_release.py:59 msgid "Remove specific release information..." msgstr "" #: contrib/plugins/open_in_gui.py:30 msgid "Open Error" msgstr "" #: contrib/plugins/open_in_gui.py:30 #, python-format msgid "" "Error while opening file:\n" "\n" "%s" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:115 msgid "Last.fm" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:116 msgid "Use track tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:117 msgid "Use artist tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:118 #: picard/ui/options/tags.py:30 msgid "Tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:119 #: picard/ui/ui_options_folksonomy.py:107 msgid "Ignore tags:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:120 #: picard/ui/ui_options_folksonomy.py:112 msgid "Join multiple tags with:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:121 #: picard/ui/ui_options_folksonomy.py:113 msgid " / " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:122 #: picard/ui/ui_options_folksonomy.py:114 msgid ", " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:123 #: picard/ui/ui_options_folksonomy.py:109 msgid "Minimal tag usage:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:124 #: picard/ui/ui_options_folksonomy.py:110 picard/ui/ui_options_matching.py:79 #: picard/ui/ui_options_matching.py:80 picard/ui/ui_options_matching.py:81 msgid " %" msgstr "" #: contrib/plugins/replaygain/__init__.py:48 msgid "Calculate replay &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:65 #, python-format msgid "Calculating replay gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:70 #, python-format msgid "Replay gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:72 #, python-format msgid "Could not calculate replay gain for \"%s\"." msgstr "" #: contrib/plugins/replaygain/__init__.py:75 msgid "Calculate album &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:98 #, python-format msgid "Calculating album gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:106 #, python-format msgid "Album gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:108 #, python-format msgid "Could not calculate album gain for \"%s\"." msgstr "" #: picard/acoustid.py:116 #, python-format msgid "Could not find AcoustID for file %s" msgstr "" #: picard/acoustid.py:120 picard/musicdns/__init__.py:103 #, python-format msgid "Looking up the fingerprint for file %s..." msgstr "" #: picard/acoustidmanager.py:78 msgid "Submitting AcoustIDs..." msgstr "" #: picard/acoustidmanager.py:83 #, python-format msgid "AcoustID submission failed: %s" msgstr "" #: picard/acoustidmanager.py:85 msgid "AcoustIDs successfully submitted!" msgstr "" #: picard/album.py:55 picard/cluster.py:260 msgid "Unmatched Files" msgstr "" #: picard/album.py:180 #, python-format msgid "[could not load album %s]" msgstr "" #: picard/album.py:266 #, python-format msgid "Album %s loaded" msgstr "" #: picard/album.py:282 msgid "[loading album information]" msgstr "" #: picard/cluster.py:177 picard/cluster.py:188 #, python-format msgid "No matching releases for cluster %s" msgstr "" #: picard/cluster.py:190 #, python-format msgid "Cluster %s identified!" msgstr "" #: picard/cluster.py:195 #, python-format msgid "Looking up the metadata for cluster %s..." msgstr "" #: picard/const.py:39 msgid "CD" msgstr "CD" #: picard/const.py:40 msgid "CD-R" msgstr "" #: picard/const.py:41 msgid "HDCD" msgstr "" #: picard/const.py:42 msgid "8cm CD" msgstr "" #: picard/const.py:43 msgid "Vinyl" msgstr "" #: picard/const.py:44 msgid "7\" Vinyl" msgstr "" #: picard/const.py:45 msgid "10\" Vinyl" msgstr "" #: picard/const.py:46 msgid "12\" Vinyl" msgstr "" #: picard/const.py:47 msgid "Digital Media" msgstr "" #: picard/const.py:48 msgid "USB Flash Drive" msgstr "" #: picard/const.py:49 msgid "slotMusic" msgstr "" #: picard/const.py:50 msgid "Cassette" msgstr "Kasset" #: picard/const.py:51 msgid "DVD" msgstr "DVD" #: picard/const.py:52 msgid "DVD-Audio" msgstr "" #: picard/const.py:53 msgid "DVD-Video" msgstr "" #: picard/const.py:54 msgid "SACD" msgstr "SACD" #: picard/const.py:55 msgid "DualDisc" msgstr "" #: picard/const.py:56 msgid "MiniDisc" msgstr "" #: picard/const.py:57 msgid "Blu-ray" msgstr "" #: picard/const.py:58 msgid "HD-DVD" msgstr "" #: picard/const.py:59 msgid "Videotape" msgstr "" #: picard/const.py:60 msgid "VHS" msgstr "" #: picard/const.py:61 msgid "Betamax" msgstr "" #: picard/const.py:62 msgid "VCD" msgstr "" #: picard/const.py:63 msgid "SVCD" msgstr "" #: picard/const.py:64 msgid "UMD" msgstr "" #: picard/const.py:65 picard/ui/ui_options_releases.py:226 msgid "Other" msgstr "" #: picard/const.py:66 msgid "LaserDisc" msgstr "Laser Skyf" #: picard/const.py:67 msgid "Cartridge" msgstr "" #: picard/const.py:68 msgid "Reel-to-reel" msgstr "" #: picard/const.py:69 msgid "DAT" msgstr "" #: picard/const.py:70 msgid "Wax Cylinder" msgstr "" #: picard/const.py:71 msgid "Piano Roll" msgstr "" #: picard/const.py:72 msgid "DCC" msgstr "" #: picard/const.py:77 msgid "Bangladesh" msgstr "" #: picard/const.py:78 msgid "Belgium" msgstr "" #: picard/const.py:79 msgid "Burkina Faso" msgstr "" #: picard/const.py:80 msgid "Bulgaria" msgstr "" #: picard/const.py:81 msgid "Barbados" msgstr "" #: picard/const.py:82 msgid "Wallis and Futuna Islands" msgstr "" #: picard/const.py:83 msgid "Bermuda" msgstr "" #: picard/const.py:84 msgid "Brunei Darussalam" msgstr "" #: picard/const.py:85 msgid "Bolivia" msgstr "" #: picard/const.py:86 msgid "Bahrain" msgstr "" #: picard/const.py:87 msgid "Burundi" msgstr "" #: picard/const.py:88 msgid "Benin" msgstr "" #: picard/const.py:89 msgid "Bhutan" msgstr "" #: picard/const.py:90 msgid "Jamaica" msgstr "" #: picard/const.py:91 msgid "Bouvet Island" msgstr "" #: picard/const.py:92 msgid "Botswana" msgstr "" #: picard/const.py:93 msgid "Samoa" msgstr "" #: picard/const.py:94 msgid "Brazil" msgstr "" #: picard/const.py:95 msgid "Bahamas" msgstr "" #: picard/const.py:96 msgid "Belarus" msgstr "" #: picard/const.py:97 msgid "Belize" msgstr "" #: picard/const.py:98 msgid "Russian Federation" msgstr "Russiese state bond" #: picard/const.py:99 msgid "Rwanda" msgstr "" #: picard/const.py:100 msgid "Reunion" msgstr "" #: picard/const.py:101 msgid "Turkmenistan" msgstr "" #: picard/const.py:102 msgid "Tajikistan" msgstr "" #: picard/const.py:103 msgid "Romania" msgstr "" #: picard/const.py:104 msgid "Tokelau" msgstr "" #: picard/const.py:105 msgid "Guinea-Bissa" msgstr "" #: picard/const.py:106 msgid "Guam" msgstr "" #: picard/const.py:107 msgid "Guatemala" msgstr "" #: picard/const.py:108 msgid "Greece" msgstr "" #: picard/const.py:109 msgid "Equatorial Guinea" msgstr "" #: picard/const.py:110 msgid "Guadeloupe" msgstr "" #: picard/const.py:111 msgid "Japan" msgstr "" #: picard/const.py:112 msgid "Guyana" msgstr "" #: picard/const.py:113 msgid "French Guiana" msgstr "" #: picard/const.py:114 msgid "Georgia" msgstr "" #: picard/const.py:115 msgid "Grenada" msgstr "" #: picard/const.py:116 msgid "United Kingdom" msgstr "" #: picard/const.py:117 msgid "Gabon" msgstr "" #: picard/const.py:118 msgid "El Salvador" msgstr "" #: picard/const.py:119 msgid "Guinea" msgstr "" #: picard/const.py:120 msgid "Gambia" msgstr "" #: picard/const.py:121 msgid "Greenland" msgstr "" #: picard/const.py:122 msgid "Gibraltar" msgstr "" #: picard/const.py:123 msgid "Ghana" msgstr "" #: picard/const.py:124 msgid "Oman" msgstr "" #: picard/const.py:125 msgid "Tunisia" msgstr "" #: picard/const.py:126 msgid "Jordan" msgstr "" #: picard/const.py:127 msgid "Haiti" msgstr "" #: picard/const.py:128 msgid "Hungary" msgstr "" #: picard/const.py:129 msgid "Hong Kong" msgstr "" #: picard/const.py:130 msgid "Honduras" msgstr "" #: picard/const.py:131 msgid "Heard and Mc Donald Islands" msgstr "" #: picard/const.py:132 msgid "Venezuela" msgstr "" #: picard/const.py:133 msgid "Puerto Rico" msgstr "" #: picard/const.py:134 msgid "Palau" msgstr "" #: picard/const.py:135 msgid "Portugal" msgstr "" #: picard/const.py:136 msgid "Svalbard and Jan Mayen Islands" msgstr "" #: picard/const.py:137 msgid "Paraguay" msgstr "" #: picard/const.py:138 msgid "Iraq" msgstr "" #: picard/const.py:139 msgid "Panama" msgstr "" #: picard/const.py:140 msgid "French Polynesia" msgstr "" #: picard/const.py:141 msgid "Papua New Guinea" msgstr "" #: picard/const.py:142 msgid "Peru" msgstr "" #: picard/const.py:143 msgid "Pakistan" msgstr "" #: picard/const.py:144 msgid "Philippines" msgstr "" #: picard/const.py:145 msgid "Pitcairn" msgstr "" #: picard/const.py:146 msgid "Poland" msgstr "" #: picard/const.py:147 msgid "St. Pierre and Miquelon" msgstr "" #: picard/const.py:148 msgid "Zambia" msgstr "" #: picard/const.py:149 msgid "Western Sahara" msgstr "" #: picard/const.py:150 msgid "Estonia" msgstr "" #: picard/const.py:151 msgid "Egypt" msgstr "" #: picard/const.py:152 msgid "South Africa" msgstr "Suid Afrika" #: picard/const.py:153 msgid "Ecuador" msgstr "" #: picard/const.py:154 msgid "Italy" msgstr "Italië" #: picard/const.py:155 msgid "Viet Nam" msgstr "" #: picard/const.py:156 msgid "Solomon Islands" msgstr "" #: picard/const.py:157 msgid "Ethiopia" msgstr "" #: picard/const.py:158 msgid "Somalia" msgstr "" #: picard/const.py:159 msgid "Zimbabwe" msgstr "" #: picard/const.py:160 msgid "Saudi Arabia" msgstr "" #: picard/const.py:161 msgid "Spain" msgstr "Spanje" #: picard/const.py:162 msgid "Eritrea" msgstr "" #: picard/const.py:163 msgid "Moldova, Republic of" msgstr "" #: picard/const.py:164 msgid "Madagascar" msgstr "" #: picard/const.py:165 msgid "Morocco" msgstr "" #: picard/const.py:166 msgid "Monaco" msgstr "" #: picard/const.py:167 msgid "Uzbekistan" msgstr "" #: picard/const.py:168 msgid "Myanmar" msgstr "" #: picard/const.py:169 msgid "Mali" msgstr "" #: picard/const.py:170 msgid "Macau" msgstr "" #: picard/const.py:171 msgid "Mongolia" msgstr "" #: picard/const.py:172 msgid "Marshall Islands" msgstr "" #: picard/const.py:173 msgid "Macedonia, The Former Yugoslav Republic of" msgstr "" #: picard/const.py:174 msgid "Mauritius" msgstr "" #: picard/const.py:175 msgid "Malta" msgstr "" #: picard/const.py:176 msgid "Malawi" msgstr "" #: picard/const.py:177 msgid "Maldives" msgstr "" #: picard/const.py:178 msgid "Martinique" msgstr "" #: picard/const.py:179 msgid "Northern Mariana Islands" msgstr "" #: picard/const.py:180 msgid "Montserrat" msgstr "" #: picard/const.py:181 msgid "Mauritania" msgstr "" #: picard/const.py:182 msgid "Uganda" msgstr "" #: picard/const.py:183 msgid "Malaysia" msgstr "" #: picard/const.py:184 msgid "Mexico" msgstr "" #: picard/const.py:185 msgid "Israel" msgstr "" #: picard/const.py:186 msgid "France" msgstr "Frankryk" #: picard/const.py:187 msgid "British Indian Ocean Territory" msgstr "" #: picard/const.py:188 msgid "St. Helena" msgstr "" #: picard/const.py:189 msgid "Finland" msgstr "" #: picard/const.py:190 msgid "Fiji" msgstr "" #: picard/const.py:191 msgid "Falkland Islands (Malvinas)" msgstr "" #: picard/const.py:192 msgid "Micronesia, Federated States of" msgstr "" #: picard/const.py:193 msgid "Faroe Islands" msgstr "" #: picard/const.py:194 msgid "Nicaragua" msgstr "" #: picard/const.py:195 msgid "Netherlands" msgstr "Nederland" #: picard/const.py:196 msgid "Norway" msgstr "Noorweë" #: picard/const.py:197 msgid "Namibia" msgstr "" #: picard/const.py:198 msgid "Vanuatu" msgstr "" #: picard/const.py:199 msgid "New Caledonia" msgstr "" #: picard/const.py:200 msgid "Niger" msgstr "" #: picard/const.py:201 msgid "Norfolk Island" msgstr "" #: picard/const.py:202 msgid "Nigeria" msgstr "Nigeria" #: picard/const.py:203 msgid "New Zealand" msgstr "" #: picard/const.py:204 msgid "Zaire" msgstr "" #: picard/const.py:205 msgid "Nepal" msgstr "" #: picard/const.py:206 msgid "Nauru" msgstr "" #: picard/const.py:207 msgid "Niue" msgstr "" #: picard/const.py:208 msgid "Cook Islands" msgstr "" #: picard/const.py:209 msgid "Cote d'Ivoire" msgstr "" #: picard/const.py:210 msgid "Switzerland" msgstr "" #: picard/const.py:211 msgid "Colombia" msgstr "" #: picard/const.py:212 msgid "China" msgstr "" #: picard/const.py:213 msgid "Cameroon" msgstr "" #: picard/const.py:214 msgid "Chile" msgstr "" #: picard/const.py:215 msgid "Cocos (Keeling) Islands" msgstr "" #: picard/const.py:216 msgid "Canada" msgstr "" #: picard/const.py:217 msgid "Congo" msgstr "" #: picard/const.py:218 msgid "Central African Republic" msgstr "" #: picard/const.py:219 msgid "Czech Republic" msgstr "" #: picard/const.py:220 msgid "Cyprus" msgstr "" #: picard/const.py:221 msgid "Christmas Island" msgstr "" #: picard/const.py:222 msgid "Costa Rica" msgstr "" #: picard/const.py:223 msgid "Cape Verde" msgstr "" #: picard/const.py:224 msgid "Cuba" msgstr "" #: picard/const.py:225 msgid "Swaziland" msgstr "" #: picard/const.py:226 msgid "Syrian Arab Republic" msgstr "" #: picard/const.py:227 msgid "Kyrgyzstan" msgstr "" #: picard/const.py:228 msgid "Kenya" msgstr "" #: picard/const.py:229 msgid "Suriname" msgstr "" #: picard/const.py:230 msgid "Kiribati" msgstr "" #: picard/const.py:231 msgid "Cambodia" msgstr "" #: picard/const.py:232 msgid "Saint Kitts and Nevis" msgstr "" #: picard/const.py:233 msgid "Comoros" msgstr "" #: picard/const.py:234 msgid "Sao Tome and Principe" msgstr "" #: picard/const.py:235 msgid "Slovenia" msgstr "" #: picard/const.py:236 msgid "Kuwait" msgstr "" #: picard/const.py:237 msgid "Senegal" msgstr "" #: picard/const.py:238 msgid "San Marino" msgstr "" #: picard/const.py:239 msgid "Sierra Leone" msgstr "" #: picard/const.py:240 msgid "Seychelles" msgstr "" #: picard/const.py:241 msgid "Kazakhstan" msgstr "" #: picard/const.py:242 msgid "Cayman Islands" msgstr "" #: picard/const.py:243 msgid "Singapore" msgstr "" #: picard/const.py:244 msgid "Sweden" msgstr "" #: picard/const.py:245 msgid "Sudan" msgstr "" #: picard/const.py:246 msgid "Dominican Republic" msgstr "" #: picard/const.py:247 msgid "Dominica" msgstr "" #: picard/const.py:248 msgid "Djibouti" msgstr "" #: picard/const.py:249 msgid "Denmark" msgstr "" #: picard/const.py:250 msgid "Virgin Islands (British)" msgstr "" #: picard/const.py:251 msgid "Germany" msgstr "" #: picard/const.py:252 msgid "Yemen" msgstr "" #: picard/const.py:253 msgid "Algeria" msgstr "" #: picard/const.py:254 msgid "United States" msgstr "" #: picard/const.py:255 msgid "Uruguay" msgstr "" #: picard/const.py:256 msgid "Mayotte" msgstr "" #: picard/const.py:257 msgid "United States Minor Outlying Islands" msgstr "" #: picard/const.py:258 msgid "Lebanon" msgstr "" #: picard/const.py:259 msgid "Saint Lucia" msgstr "" #: picard/const.py:260 msgid "Lao People's Democratic Republic" msgstr "" #: picard/const.py:261 msgid "Tuvalu" msgstr "" #: picard/const.py:262 msgid "Taiwan" msgstr "" #: picard/const.py:263 msgid "Trinidad and Tobago" msgstr "" #: picard/const.py:264 msgid "Turkey" msgstr "" #: picard/const.py:265 msgid "Sri Lanka" msgstr "" #: picard/const.py:266 msgid "Liechtenstein" msgstr "" #: picard/const.py:267 msgid "Latvia" msgstr "" #: picard/const.py:268 msgid "Tonga" msgstr "" #: picard/const.py:269 msgid "Lithuania" msgstr "" #: picard/const.py:270 msgid "Luxembourg" msgstr "" #: picard/const.py:271 msgid "Liberia" msgstr "" #: picard/const.py:272 msgid "Lesotho" msgstr "" #: picard/const.py:273 msgid "Thailand" msgstr "" #: picard/const.py:274 msgid "French Southern Territories" msgstr "" #: picard/const.py:275 msgid "Togo" msgstr "" #: picard/const.py:276 msgid "Chad" msgstr "" #: picard/const.py:277 msgid "Turks and Caicos Islands" msgstr "" #: picard/const.py:278 msgid "Libyan Arab Jamahiriya" msgstr "" #: picard/const.py:279 msgid "Vatican City State (Holy See)" msgstr "" #: picard/const.py:280 msgid "Saint Vincent and The Grenadines" msgstr "" #: picard/const.py:281 msgid "United Arab Emirates" msgstr "" #: picard/const.py:282 msgid "Andorra" msgstr "" #: picard/const.py:283 msgid "Antigua and Barbuda" msgstr "" #: picard/const.py:284 msgid "Afghanistan" msgstr "" #: picard/const.py:285 msgid "Anguilla" msgstr "" #: picard/const.py:286 msgid "Virgin Islands (U.S.)" msgstr "" #: picard/const.py:287 msgid "Iceland" msgstr "" #: picard/const.py:288 msgid "Iran (Islamic Republic of)" msgstr "" #: picard/const.py:289 msgid "Armenia" msgstr "" #: picard/const.py:290 msgid "Albania" msgstr "" #: picard/const.py:291 msgid "Angola" msgstr "" #: picard/const.py:292 msgid "Netherlands Antilles" msgstr "" #: picard/const.py:293 msgid "Antarctica" msgstr "" #: picard/const.py:294 msgid "American Samoa" msgstr "" #: picard/const.py:295 msgid "Argentina" msgstr "" #: picard/const.py:296 msgid "Australia" msgstr "" #: picard/const.py:297 msgid "Austria" msgstr "" #: picard/const.py:298 msgid "Aruba" msgstr "" #: picard/const.py:299 msgid "India" msgstr "" #: picard/const.py:300 msgid "Tanzania, United Republic of" msgstr "" #: picard/const.py:301 msgid "Azerbaijan" msgstr "" #: picard/const.py:302 msgid "Ireland" msgstr "" #: picard/const.py:303 msgid "Indonesia" msgstr "" #: picard/const.py:304 msgid "Ukraine" msgstr "" #: picard/const.py:305 msgid "Qatar" msgstr "" #: picard/const.py:306 msgid "Mozambique" msgstr "" #: picard/const.py:307 msgid "Bosnia and Herzegovina" msgstr "" #: picard/const.py:308 msgid "Congo, The Democratic Republic of the" msgstr "" #: picard/const.py:309 msgid "Serbia and Montenegro (historical, 2003-2006)" msgstr "" #: picard/const.py:310 msgid "Serbia" msgstr "" #: picard/const.py:311 msgid "Montenegro" msgstr "" #: picard/const.py:312 msgid "Croatia" msgstr "" #: picard/const.py:313 msgid "Korea (North), Democratic People's Republic of" msgstr "" #: picard/const.py:314 msgid "Korea (South), Republic of" msgstr "" #: picard/const.py:315 msgid "Slovakia" msgstr "" #: picard/const.py:316 msgid "Soviet Union (historical, 1922-1991)" msgstr "" #: picard/const.py:317 msgid "East Timor" msgstr "" #: picard/const.py:318 msgid "Czechoslovakia (historical, 1918-1992)" msgstr "" #: picard/const.py:319 msgid "Europe" msgstr "" #: picard/const.py:320 msgid "East Germany (historical, 1949-1990)" msgstr "" #: picard/const.py:321 msgid "[Unknown Country]" msgstr "" #: picard/const.py:322 msgid "[Worldwide]" msgstr "" #: picard/const.py:323 msgid "Yugoslavia (historical, 1918-1992)" msgstr "" #: picard/const.py:335 msgid "Danish" msgstr "" #: picard/const.py:336 msgid "German" msgstr "" #: picard/const.py:338 msgid "English" msgstr "" #: picard/const.py:339 msgid "English (Canada)" msgstr "" #: picard/const.py:340 msgid "English (UK)" msgstr "" #: picard/const.py:342 msgid "Spanish" msgstr "" #: picard/const.py:343 msgid "Estonian" msgstr "" #: picard/const.py:345 msgid "Finnish" msgstr "" #: picard/const.py:347 msgid "French" msgstr "" #: picard/const.py:356 msgid "Italian" msgstr "" #: picard/const.py:363 msgid "Dutch" msgstr "" #: picard/const.py:365 msgid "Polish" msgstr "" #: picard/const.py:367 msgid "Brazilian Portuguese" msgstr "" #: picard/const.py:374 msgid "Swedish" msgstr "" #: picard/file.py:589 #, python-format msgid "No matching tracks for file %s" msgstr "" #: picard/file.py:604 #, python-format msgid "No matching tracks above the threshold for file %s" msgstr "" #: picard/file.py:607 #, python-format msgid "File %s identified!" msgstr "" #: picard/file.py:623 #, python-format msgid "Looking up the PUID for file %s..." msgstr "" #: picard/file.py:629 #, python-format msgid "Looking up the metadata for file %s..." msgstr "" #: picard/puidmanager.py:62 msgid "Submitting PUIDs..." msgstr "" #: picard/puidmanager.py:68 #, python-format msgid "PUIDs submission failed: %d" msgstr "" #: picard/puidmanager.py:70 msgid "PUIDs successfully submitted!" msgstr "" #: picard/tagger.py:528 msgid "CD Lookup Error" msgstr "" #: picard/tagger.py:529 #, python-format msgid "" "Error while reading CD:\n" "\n" "%s" msgstr "" #: picard/tagger.py:555 #, python-format msgid "Could not find PUID for file %s" msgstr "" #: picard/ui/cdlookup.py:33 picard/ui/mainwindow.py:525 #: picard/ui/ui_options_releases.py:216 picard/util/tags.py:21 msgid "Album" msgstr "" #: picard/ui/cdlookup.py:33 picard/ui/itemviews.py:89 #: picard/ui/mainwindow.py:526 picard/util/tags.py:22 msgid "Artist" msgstr "" #: picard/ui/cdlookup.py:33 picard/util/tags.py:24 msgid "Date" msgstr "" #: picard/ui/cdlookup.py:33 msgid "Country" msgstr "" #: picard/ui/cdlookup.py:34 msgid "Labels" msgstr "" #: picard/ui/cdlookup.py:34 msgid "Catalog #s" msgstr "" #: picard/ui/cdlookup.py:34 picard/util/tags.py:75 msgid "Barcode" msgstr "" #: picard/ui/coverartbox.py:122 msgid "View release on MusicBrainz" msgstr "" #: picard/ui/filebrowser.py:38 msgid "&Move Tagged Files Here" msgstr "" #: picard/ui/filebrowser.py:41 msgid "Show &Hidden Files" msgstr "" #: picard/ui/infodialog.py:36 msgid "Info" msgstr "" #: picard/ui/infodialog.py:42 msgid "Filename:" msgstr "" #: picard/ui/infodialog.py:44 msgid "Format:" msgstr "" #: picard/ui/infodialog.py:53 msgid "Size:" msgstr "" #: picard/ui/infodialog.py:57 msgid "Length:" msgstr "" #: picard/ui/infodialog.py:59 msgid "Bitrate:" msgstr "" #: picard/ui/infodialog.py:61 msgid "Sample rate:" msgstr "" #: picard/ui/infodialog.py:63 msgid "Bits per sample:" msgstr "" #: picard/ui/infodialog.py:66 msgid "Mono" msgstr "" #: picard/ui/infodialog.py:67 msgid "Stereo" msgstr "" #: picard/ui/infodialog.py:69 msgid "Channels:" msgstr "" #: picard/ui/itemviews.py:87 picard/util/tags.py:23 msgid "Title" msgstr "" #: picard/ui/itemviews.py:88 picard/util/tags.py:84 msgid "Length" msgstr "" #: picard/ui/itemviews.py:214 msgid "&Expand all" msgstr "" #: picard/ui/itemviews.py:216 msgid "&Collapse all" msgstr "" #: picard/ui/itemviews.py:273 msgid "&Other versions" msgstr "" #: picard/ui/itemviews.py:276 msgid "Loading..." msgstr "" #: picard/ui/itemviews.py:286 msgid "[no release info]" msgstr "" #: picard/ui/itemviews.py:309 msgid "&Plugins" msgstr "" #: picard/ui/itemviews.py:527 msgid "Clusters" msgstr "" #: picard/ui/logview.py:30 msgid "Log" msgstr "" #: picard/ui/mainwindow.py:73 msgid "MusicBrainz Picard" msgstr "" #: picard/ui/mainwindow.py:151 msgid "Unsaved Changes" msgstr "" #: picard/ui/mainwindow.py:152 msgid "Are you sure you want to quit Picard?" msgstr "" #: picard/ui/mainwindow.py:153 #, python-format msgid "" "There is %d unsaved file. Closing Picard will lose all unsaved changes." msgid_plural "" "There are %d unsaved files. Closing Picard will lose all unsaved changes." msgstr[0] "" msgstr[1] "" #: picard/ui/mainwindow.py:160 msgid "&Quit Picard" msgstr "" #: picard/ui/mainwindow.py:210 msgid "Ready" msgstr "" #: picard/ui/mainwindow.py:214 msgid "" "Picard listens on a port to integrate with your browser and downloads " "release information when you click the \"Tagger\" buttons on the MusicBrainz" " website" msgstr "" #: picard/ui/mainwindow.py:224 #, python-format msgid " Files: %(files)d, Pending Files: %(pending)d " msgstr "" #: picard/ui/mainwindow.py:229 #, python-format msgid " Listening on port %(port)d " msgstr "" #: picard/ui/mainwindow.py:257 msgid "Submission Error" msgstr "" #: picard/ui/mainwindow.py:258 msgid "" "You need to configure your AcoustID API key before you can submit " "fingerprints." msgstr "" #: picard/ui/mainwindow.py:265 msgid "&Options..." msgstr "" #: picard/ui/mainwindow.py:268 msgid "&Cut" msgstr "" #: picard/ui/mainwindow.py:273 msgid "&Paste" msgstr "" #: picard/ui/mainwindow.py:278 msgid "&Help..." msgstr "" #: picard/ui/mainwindow.py:283 msgid "&About..." msgstr "" #: picard/ui/mainwindow.py:286 msgid "&Donate..." msgstr "" #: picard/ui/mainwindow.py:289 msgid "&Report a Bug..." msgstr "" #: picard/ui/mainwindow.py:292 msgid "&Support Forum..." msgstr "" #: picard/ui/mainwindow.py:295 msgid "&Add Files..." msgstr "" #: picard/ui/mainwindow.py:296 msgid "Add files to the tagger" msgstr "" #: picard/ui/mainwindow.py:301 msgid "A&dd Folder..." msgstr "" #: picard/ui/mainwindow.py:302 msgid "Add a folder to the tagger" msgstr "" #: picard/ui/mainwindow.py:304 msgid "Ctrl+D" msgstr "" #: picard/ui/mainwindow.py:308 msgid "&Save" msgstr "" #: picard/ui/mainwindow.py:309 msgid "Save selected files" msgstr "" #: picard/ui/mainwindow.py:315 msgid "S&ubmit" msgstr "" #: picard/ui/mainwindow.py:316 msgid "Submit fingerprints" msgstr "" #: picard/ui/mainwindow.py:320 msgid "E&xit" msgstr "" #: picard/ui/mainwindow.py:322 msgid "Ctrl+Q" msgstr "" #: picard/ui/mainwindow.py:325 msgid "&Remove" msgstr "" #: picard/ui/mainwindow.py:326 msgid "Remove selected files/albums" msgstr "" #: picard/ui/mainwindow.py:330 msgid "Lookup in &Browser" msgstr "" #: picard/ui/mainwindow.py:331 msgid "Lookup selected item on MusicBrainz website" msgstr "" #: picard/ui/mainwindow.py:335 msgid "File &Browser" msgstr "" #: picard/ui/mainwindow.py:339 msgid "Ctrl+B" msgstr "" #: picard/ui/mainwindow.py:342 msgid "&Cover Art" msgstr "" #: picard/ui/mainwindow.py:348 msgid "Search" msgstr "" #: picard/ui/mainwindow.py:351 msgid "&CD Lookup..." msgstr "" #: picard/ui/mainwindow.py:352 picard/ui/mainwindow.py:353 msgid "Lookup CD" msgstr "" #: picard/ui/mainwindow.py:355 msgid "Ctrl+K" msgstr "" #: picard/ui/mainwindow.py:358 msgid "&Scan" msgstr "" #: picard/ui/mainwindow.py:361 msgid "Ctrl+Y" msgstr "" #: picard/ui/mainwindow.py:364 msgid "Cl&uster" msgstr "" #: picard/ui/mainwindow.py:367 msgid "Ctrl+U" msgstr "" #: picard/ui/mainwindow.py:370 msgid "&Lookup" msgstr "" #: picard/ui/mainwindow.py:371 picard/ui/mainwindow.py:372 msgid "Lookup metadata" msgstr "" #: picard/ui/mainwindow.py:375 msgid "Ctrl+L" msgstr "" #: picard/ui/mainwindow.py:378 msgid "&Info..." msgstr "" #: picard/ui/mainwindow.py:381 msgid "Ctrl+I" msgstr "" #: picard/ui/mainwindow.py:384 msgid "&Refresh" msgstr "" #: picard/ui/mainwindow.py:385 msgid "Ctrl+R" msgstr "" #: picard/ui/mainwindow.py:388 msgid "&Rename Files" msgstr "" #: picard/ui/mainwindow.py:393 msgid "&Move Files" msgstr "" #: picard/ui/mainwindow.py:398 msgid "Save &Tags" msgstr "" #: picard/ui/mainwindow.py:403 msgid "Tags From &File Names..." msgstr "" #: picard/ui/mainwindow.py:406 msgid "View &Log..." msgstr "" #: picard/ui/mainwindow.py:412 msgid "&Open..." msgstr "" #: picard/ui/mainwindow.py:413 msgid "Open the file" msgstr "" #: picard/ui/mainwindow.py:416 msgid "Open &Folder..." msgstr "" #: picard/ui/mainwindow.py:417 msgid "Open the containing folder" msgstr "" #: picard/ui/mainwindow.py:438 msgid "&File" msgstr "" #: picard/ui/mainwindow.py:446 msgid "&Edit" msgstr "" #: picard/ui/mainwindow.py:452 msgid "&View" msgstr "" #: picard/ui/mainwindow.py:460 msgid "&Options" msgstr "" #: picard/ui/mainwindow.py:466 msgid "&Tools" msgstr "" #: picard/ui/mainwindow.py:475 picard/ui/util.py:33 msgid "&Help" msgstr "" #: picard/ui/mainwindow.py:493 msgid "&Toolbar" msgstr "" #: picard/ui/mainwindow.py:520 msgid "&Search Bar" msgstr "" #: picard/ui/mainwindow.py:527 picard/ui/puidsubmit.py:31 msgid "Track" msgstr "" #: picard/ui/mainwindow.py:566 msgid "All Supported Formats" msgstr "" #: picard/ui/mainwindow.py:624 picard/ui/mainwindow.py:633 msgid "Various Artists file naming scheme removal" msgstr "" #: picard/ui/mainwindow.py:625 msgid "" "The separate file naming scheme for various artists albums has been\n" "removed in this version of Picard. You currently do not use the this option,\n" "but have a separate file naming scheme defined. Do you want to remove it or\n" "merge it with your file naming scheme for single artist albums?" msgstr "" #: picard/ui/mainwindow.py:629 msgid "Merge" msgstr "" #: picard/ui/mainwindow.py:629 picard/ui/metadatabox.py:185 msgid "Remove" msgstr "" #: picard/ui/mainwindow.py:634 msgid "" "The separate file naming scheme for various artists albums has been\n" "removed in this version of Picard. Your file naming scheme has automatically\n" "been merged with that of single artist albums." msgstr "" #: picard/ui/mainwindow.py:682 msgid "Configuration Required" msgstr "" #: picard/ui/mainwindow.py:683 msgid "" "Audio fingerprinting is not yet configured. Would you like to configure it " "now?" msgstr "" #: picard/ui/mainwindow.py:756 picard/ui/mainwindow.py:763 #, python-format msgid " (Error: %s)" msgstr "" #: picard/ui/metadatabox.py:64 #, python-format msgid "(missing from %d item)" msgid_plural "(missing from %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:66 #, python-format msgid "(different across %d item)" msgid_plural "(different across %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:90 msgid "Tag" msgstr "" #: picard/ui/metadatabox.py:90 msgid "Original Value" msgstr "" #: picard/ui/metadatabox.py:90 msgid "New Value" msgstr "" #: picard/ui/metadatabox.py:117 msgid "Add New Tag..." msgstr "" #: picard/ui/metadatabox.py:119 msgid "Show Changes First" msgstr "" #: picard/ui/metadatabox.py:166 msgid "Edit..." msgstr "" #: picard/ui/metadatabox.py:189 msgid "Use Original Value" msgid_plural "Use Original Values" msgstr[0] "" msgstr[1] "" #: picard/ui/passworddialog.py:38 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "" #: picard/ui/passworddialog.py:76 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and password." msgstr "" #: picard/ui/puidsubmit.py:31 picard/ui/options/plugins.py:125 msgid "File" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "PUID" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "Release" msgstr "" #: picard/ui/puidsubmit.py:31 msgid "Release ID" msgstr "" #: picard/ui/tagsfromfilenames.py:54 picard/ui/tagsfromfilenames.py:99 msgid "File Name" msgstr "" #: picard/ui/ui_cdlookup.py:57 picard/ui/ui_options_cdlookup.py:46 #: picard/ui/ui_options_cdlookup_select.py:53 picard/ui/options/cdlookup.py:36 msgid "CD Lookup" msgstr "" #: picard/ui/ui_cdlookup.py:58 msgid "The following releases on MusicBrainz match the CD:" msgstr "" #: picard/ui/ui_cdlookup.py:59 picard/ui/ui_puidsubmit.py:52 msgid "OK" msgstr "" #: picard/ui/ui_cdlookup.py:60 msgid " Lookup manually " msgstr "" #: picard/ui/ui_cdlookup.py:61 picard/ui/ui_puidsubmit.py:53 msgid "Cancel" msgstr "" #: picard/ui/ui_edittagdialog.py:92 msgid "Edit Tag" msgstr "" #: picard/ui/ui_edittagdialog.py:93 msgid "Edit value" msgstr "" #: picard/ui/ui_edittagdialog.py:94 msgid "Add value" msgstr "" #: picard/ui/ui_edittagdialog.py:95 msgid "Remove value" msgstr "" #: picard/ui/ui_infodialog.py:66 msgid "&Info" msgstr "" #: picard/ui/ui_infodialog.py:67 msgid "A&rtwork" msgstr "" #: picard/ui/ui_options.py:42 msgid "Options" msgstr "" #: picard/ui/ui_options_cdlookup.py:47 msgid "CD-ROM device to use for lookups:" msgstr "" #: picard/ui/ui_options_cdlookup_select.py:54 msgid "Default CD-ROM drive to use for lookups:" msgstr "" #: picard/ui/ui_options_cover.py:53 msgid "Location" msgstr "" #: picard/ui/ui_options_cover.py:54 msgid "Embed cover images into tags" msgstr "" #: picard/ui/ui_options_cover.py:55 msgid "Save cover images as separate files" msgstr "" #: picard/ui/ui_options_cover.py:56 msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_fingerprinting.py:74 msgid "Audio Fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:75 msgid "Use AcoustID" msgstr "" #: picard/ui/ui_options_fingerprinting.py:76 msgid "Use AmpliFIND (formerly MusicDNS)" msgstr "" #: picard/ui/ui_options_fingerprinting.py:77 msgid "AcoustID Settings" msgstr "" #: picard/ui/ui_options_fingerprinting.py:78 msgid "Fingerprint calculator:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:79 #: picard/ui/ui_options_renaming.py:138 msgid "Browse..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:80 msgid "Download..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:81 msgid "API key:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:82 msgid "Get API key..." msgstr "" #: picard/ui/ui_options_folksonomy.py:106 picard/ui/options/folksonomy.py:29 msgid "Folksonomy Tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:108 msgid "Only use my tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:111 msgid "Maximum number of tags:" msgstr "" #: picard/ui/ui_options_general.py:92 msgid "MusicBrainz Server" msgstr "" #: picard/ui/ui_options_general.py:93 picard/ui/ui_options_proxy.py:77 msgid "Port:" msgstr "" #: picard/ui/ui_options_general.py:94 picard/ui/ui_options_proxy.py:78 msgid "Server address:" msgstr "" #: picard/ui/ui_options_general.py:95 msgid "Account Information" msgstr "" #: picard/ui/ui_options_general.py:96 picard/ui/ui_options_proxy.py:75 #: picard/ui/ui_passworddialog.py:74 msgid "Password:" msgstr "" #: picard/ui/ui_options_general.py:97 picard/ui/ui_options_proxy.py:76 #: picard/ui/ui_passworddialog.py:73 msgid "Username:" msgstr "" #: picard/ui/ui_options_general.py:98 picard/ui/options/general.py:29 msgid "General" msgstr "" #: picard/ui/ui_options_general.py:99 msgid "Automatically scan all new files" msgstr "" #: picard/ui/ui_options_general.py:100 msgid "Ignore MBIDs when loading new files" msgstr "" #: picard/ui/ui_options_interface.py:58 msgid "Miscellaneous" msgstr "" #: picard/ui/ui_options_interface.py:59 msgid "Show text labels under icons" msgstr "" #: picard/ui/ui_options_interface.py:60 msgid "Allow selection of multiple directories" msgstr "" #: picard/ui/ui_options_interface.py:61 msgid "Use advanced query syntax" msgstr "" #: picard/ui/ui_options_interface.py:62 msgid "Show a quit confirmation dialog for unsaved changes" msgstr "" #: picard/ui/ui_options_interface.py:63 msgid "User interface language:" msgstr "" #: picard/ui/ui_options_matching.py:77 msgid "Thresholds" msgstr "" #: picard/ui/ui_options_matching.py:78 msgid "Minimal similarity for matching files to tracks:" msgstr "" #: picard/ui/ui_options_matching.py:82 msgid "Minimal similarity for file lookups:" msgstr "" #: picard/ui/ui_options_matching.py:83 msgid "Minimal similarity for cluster lookups:" msgstr "" #: picard/ui/ui_options_metadata.py:101 picard/ui/options/metadata.py:30 msgid "Metadata" msgstr "" #: picard/ui/ui_options_metadata.py:102 msgid "Translate artist names to this locale where possible:" msgstr "" #: picard/ui/ui_options_metadata.py:103 msgid "Use standardized artist names" msgstr "" #: picard/ui/ui_options_metadata.py:104 msgid "Convert Unicode punctuation characters to ASCII" msgstr "" #: picard/ui/ui_options_metadata.py:105 msgid "Use release relationships" msgstr "" #: picard/ui/ui_options_metadata.py:106 msgid "Use track relationships" msgstr "" #: picard/ui/ui_options_metadata.py:107 msgid "Use folksonomy tags as genre" msgstr "" #: picard/ui/ui_options_metadata.py:108 msgid "Custom Fields" msgstr "" #: picard/ui/ui_options_metadata.py:109 msgid "Various artists:" msgstr "" #: picard/ui/ui_options_metadata.py:110 msgid "Non-album tracks:" msgstr "" #: picard/ui/ui_options_metadata.py:111 picard/ui/ui_options_metadata.py:112 #: picard/ui/ui_options_renaming.py:147 msgid "Default" msgstr "" #: picard/ui/ui_options_plugins.py:131 picard/ui/options/plugins.py:37 msgid "Plugins" msgstr "" #: picard/ui/ui_options_plugins.py:132 picard/ui/options/plugins.py:121 msgid "Name" msgstr "" #: picard/ui/ui_options_plugins.py:133 picard/util/tags.py:37 msgid "Version" msgstr "" #: picard/ui/ui_options_plugins.py:134 picard/ui/options/plugins.py:124 msgid "Author" msgstr "" #: picard/ui/ui_options_plugins.py:135 msgid "Install plugin..." msgstr "" #: picard/ui/ui_options_plugins.py:136 msgid "Open plugin folder" msgstr "" #: picard/ui/ui_options_plugins.py:137 msgid "Download plugins" msgstr "" #: picard/ui/ui_options_plugins.py:138 msgid "Details" msgstr "" #: picard/ui/ui_options_proxy.py:74 picard/ui/options/proxy.py:28 msgid "Web Proxy" msgstr "" #: picard/ui/ui_options_ratings.py:53 msgid "Enable track ratings" msgstr "" #: picard/ui/ui_options_ratings.py:54 msgid "" "Picard saves the ratings together with an e-mail address identifying the " "user who did the rating. That way different ratings for different users can " "be stored in the files. Please specify the e-mail you want to use to save " "your ratings." msgstr "" #: picard/ui/ui_options_ratings.py:55 msgid "E-mail:" msgstr "" #: picard/ui/ui_options_ratings.py:56 msgid "Submit ratings to MusicBrainz" msgstr "" #: picard/ui/ui_options_releases.py:215 msgid "Preferred release types" msgstr "" #: picard/ui/ui_options_releases.py:217 msgid "Single" msgstr "" #: picard/ui/ui_options_releases.py:218 msgid "EP" msgstr "" #: picard/ui/ui_options_releases.py:219 picard/util/tags.py:66 msgid "Compilation" msgstr "Kompilasie" #: picard/ui/ui_options_releases.py:220 msgid "Soundtrack" msgstr "" #: picard/ui/ui_options_releases.py:221 msgid "Spokenword" msgstr "" #: picard/ui/ui_options_releases.py:222 msgid "Interview" msgstr "" #: picard/ui/ui_options_releases.py:223 msgid "Audiobook" msgstr "" #: picard/ui/ui_options_releases.py:224 msgid "Live" msgstr "" #: picard/ui/ui_options_releases.py:225 msgid "Remix" msgstr "" #: picard/ui/ui_options_releases.py:227 msgid "Reset all" msgstr "" #: picard/ui/ui_options_releases.py:228 msgid "Preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:229 picard/ui/ui_options_releases.py:232 msgid ">" msgstr "" #: picard/ui/ui_options_releases.py:230 picard/ui/ui_options_releases.py:233 msgid "<" msgstr "" #: picard/ui/ui_options_releases.py:231 msgid "Preferred release formats" msgstr "" #: picard/ui/ui_options_renaming.py:134 msgid "Rename files when saving" msgstr "" #: picard/ui/ui_options_renaming.py:135 msgid "Replace non-ASCII characters" msgstr "" #: picard/ui/ui_options_renaming.py:136 msgid "Replace Windows-incompatible characters" msgstr "" #: picard/ui/ui_options_renaming.py:137 msgid "Move files to this directory when saving:" msgstr "" #: picard/ui/ui_options_renaming.py:139 msgid "Delete empty directories" msgstr "" #: picard/ui/ui_options_renaming.py:140 msgid "Move additional files:" msgstr "" #: picard/ui/ui_options_renaming.py:141 msgid "Name files like this" msgstr "" #: picard/ui/ui_options_renaming.py:148 msgid "Examples" msgstr "" #: picard/ui/ui_options_script.py:49 msgid "Tagger Script" msgstr "" #: picard/ui/ui_options_tags.py:114 msgid "Write tags to files" msgstr "" #: picard/ui/ui_options_tags.py:115 msgid "Preserve timestamps of tagged files" msgstr "" #: picard/ui/ui_options_tags.py:116 msgid "Before tagging" msgstr "" #: picard/ui/ui_options_tags.py:117 msgid "Clear existing tags" msgstr "" #: picard/ui/ui_options_tags.py:118 msgid "Remove ID3 tags from FLAC files" msgstr "" #: picard/ui/ui_options_tags.py:119 msgid "Remove APEv2 tags from MP3 files" msgstr "" #: picard/ui/ui_options_tags.py:120 msgid "" "Preserve these tags from being cleared or overwritten with MusicBrainz data:" msgstr "" #: picard/ui/ui_options_tags.py:121 msgid "Tags are separated by spaces, and are case-sensitive." msgstr "" #: picard/ui/ui_options_tags.py:122 msgid "Tag compatibility" msgstr "" #: picard/ui/ui_options_tags.py:123 msgid "ID3v2 version" msgstr "" #: picard/ui/ui_options_tags.py:124 msgid "2.4" msgstr "" #: picard/ui/ui_options_tags.py:125 msgid "2.3" msgstr "" #: picard/ui/ui_options_tags.py:126 msgid "Also include ID3v1 tags in the files" msgstr "" #: picard/ui/ui_options_tags.py:127 msgid "ID3v2 text encoding" msgstr "" #: picard/ui/ui_options_tags.py:128 msgid "UTF-8" msgstr "" #: picard/ui/ui_options_tags.py:129 msgid "UTF-16" msgstr "" #: picard/ui/ui_options_tags.py:130 msgid "ISO-8859-1" msgstr "" #: picard/ui/ui_passworddialog.py:72 msgid "Authentication required" msgstr "" #: picard/ui/ui_passworddialog.py:75 msgid "Save username and password" msgstr "" #: picard/ui/ui_puidsubmit.py:51 msgid "Submit PUIDs" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:54 msgid "Convert File Names to Tags" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:55 msgid "Replace underscores with spaces" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:56 msgid "&Preview" msgstr "" #: picard/ui/util.py:31 msgid "&Ok" msgstr "" #: picard/ui/util.py:32 msgid "&Cancel" msgstr "" #: picard/ui/options/about.py:29 msgid "About" msgstr "" #: picard/ui/options/about.py:48 msgid "translator-credits" msgstr "Launchpad Contributions:\n Darryl Smith https://launchpad.net/~semiintel" #: picard/ui/options/about.py:51 #, python-format msgid "
Translated to LANG by %s" msgstr "" #: picard/ui/options/about.py:55 #, python-format msgid "" "

MusicBrainz Picard
\n" "Version %(version)s

\n" "

Supported formats
%(formats)s

\n" "

Please donate
\n" "Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

\n" "

Donate now!

\n" "

Credits
\n" "Copyright © 2004-2011 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s

\n" "

http://musicbrainz.org/doc/MusicBrainz_Picard

\n" msgstr "" #: picard/ui/options/advanced.py:26 msgid "Advanced" msgstr "" #: picard/ui/options/cover.py:29 msgid "Cover Art" msgstr "" #: picard/ui/options/fingerprinting.py:32 msgid "Fingerprinting" msgstr "" #: picard/ui/options/interface.py:32 msgid "User Interface" msgstr "" #: picard/ui/options/interface.py:49 msgid "System default" msgstr "" #: picard/ui/options/interface.py:76 msgid "Language changed" msgstr "" #: picard/ui/options/interface.py:76 msgid "" "You have changed the interface language. You have to restart Picard in order" " for the change to take effect." msgstr "" #: picard/ui/options/matching.py:29 msgid "Matching" msgstr "" #: picard/ui/options/ratings.py:29 msgid "Ratings" msgstr "" #: picard/ui/options/releases.py:33 msgid "Preferred Releases" msgstr "" #: picard/ui/options/renaming.py:34 msgid "File naming" msgstr "" #: picard/ui/options/renaming.py:143 msgid "Error" msgstr "" #: picard/ui/options/renaming.py:143 msgid "The location to move files to must not be empty." msgstr "" #: picard/ui/options/renaming.py:153 msgid "The file naming format must not be empty." msgstr "" #: picard/ui/options/scripting.py:63 msgid "Scripting" msgstr "" #: picard/ui/options/scripting.py:97 msgid "Script Error" msgstr "" #: picard/util/tags.py:25 msgid "Original Release Date" msgstr "" #: picard/util/tags.py:26 msgid "Album Artist" msgstr "" #: picard/util/tags.py:27 msgid "Track Number" msgstr "" #: picard/util/tags.py:28 msgid "Total Tracks" msgstr "" #: picard/util/tags.py:29 msgid "Disc Number" msgstr "" #: picard/util/tags.py:30 msgid "Total Discs" msgstr "" #: picard/util/tags.py:31 msgid "Album Artist Sort Order" msgstr "" #: picard/util/tags.py:32 msgid "Artist Sort Order" msgstr "" #: picard/util/tags.py:33 msgid "Title Sort Order" msgstr "" #: picard/util/tags.py:34 msgid "Album Sort Order" msgstr "" #: picard/util/tags.py:35 msgid "ASIN" msgstr "" #: picard/util/tags.py:36 msgid "Grouping" msgstr "" #: picard/util/tags.py:38 msgid "ISRC" msgstr "" #: picard/util/tags.py:39 msgid "Mood" msgstr "" #: picard/util/tags.py:40 msgid "BPM" msgstr "" #: picard/util/tags.py:41 msgid "Copyright" msgstr "" #: picard/util/tags.py:42 msgid "License" msgstr "" #: picard/util/tags.py:43 msgid "Composer" msgstr "" #: picard/util/tags.py:44 msgid "Writer" msgstr "" #: picard/util/tags.py:45 msgid "Conductor" msgstr "" #: picard/util/tags.py:46 msgid "Lyricist" msgstr "" #: picard/util/tags.py:47 msgid "Arranger" msgstr "" #: picard/util/tags.py:48 msgid "Producer" msgstr "" #: picard/util/tags.py:49 msgid "Engineer" msgstr "" #: picard/util/tags.py:50 msgid "Subtitle" msgstr "" #: picard/util/tags.py:51 msgid "Disc Subtitle" msgstr "" #: picard/util/tags.py:52 msgid "Remixer" msgstr "" #: picard/util/tags.py:53 msgid "MusicBrainz Recording Id" msgstr "" #: picard/util/tags.py:54 msgid "MusicBrainz Release Id" msgstr "" #: picard/util/tags.py:55 msgid "MusicBrainz Artist Id" msgstr "" #: picard/util/tags.py:56 msgid "MusicBrainz Release Artist Id" msgstr "" #: picard/util/tags.py:57 msgid "MusicBrainz Work Id" msgstr "" #: picard/util/tags.py:58 msgid "MusicBrainz Disc Id" msgstr "" #: picard/util/tags.py:59 msgid "MusicBrainz Sort Name" msgstr "" #: picard/util/tags.py:60 msgid "MusicIP PUID" msgstr "" #: picard/util/tags.py:61 msgid "MusicIP Fingerprint" msgstr "" #: picard/util/tags.py:62 msgid "AcoustID" msgstr "" #: picard/util/tags.py:63 msgid "AcoustID Fingerprint" msgstr "" #: picard/util/tags.py:64 msgid "Disc Id" msgstr "" #: picard/util/tags.py:65 msgid "Website" msgstr "Webwerf" #: picard/util/tags.py:67 msgid "Comment" msgstr "Aanmerking" #: picard/util/tags.py:68 msgid "Genre" msgstr "" #: picard/util/tags.py:69 msgid "Encoded By" msgstr "" #: picard/util/tags.py:70 msgid "Performer" msgstr "" #: picard/util/tags.py:71 msgid "Release Type" msgstr "" #: picard/util/tags.py:72 msgid "Release Status" msgstr "" #: picard/util/tags.py:73 msgid "Release Country" msgstr "" #: picard/util/tags.py:74 msgid "Record Label" msgstr "" #: picard/util/tags.py:76 msgid "Catalog Number" msgstr "" #: picard/util/tags.py:77 msgid "Format" msgstr "" #: picard/util/tags.py:78 msgid "DJ-Mixer" msgstr "" #: picard/util/tags.py:79 msgid "Media" msgstr "Media" #: picard/util/tags.py:80 msgid "Lyrics" msgstr "" #: picard/util/tags.py:81 msgid "Mixer" msgstr "" #: picard/util/tags.py:82 msgid "Language" msgstr "Taal" #: picard/util/tags.py:83 msgid "Script" msgstr "" #: picard/util/tags.py:85 msgid "Rating" msgstr "" #: picard/util/webbrowser2.py:88 msgid "Web Browser Error" msgstr "" #: picard/util/webbrowser2.py:88 #, python-format msgid "" "Error while launching a web browser:\n" "\n" "%s" msgstr "" picard-release-2.3.1/po/appstream/000077500000000000000000000000001362601763300170165ustar00rootroot00000000000000picard-release-2.3.1/po/appstream/LINGUAS000066400000000000000000000000761362601763300200460ustar00rootroot00000000000000de es fi fr he it ms_MY nl pt pt_BR sq zh zh_CN zh_TW zh-Hans picard-release-2.3.1/po/appstream/bg.po000066400000000000000000000062641362601763300177560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Bulgarian (https://www.transifex.com/musicbrainz/teams/13846/bg/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/ca.po000066400000000000000000000062261362601763300177470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # t0n3t , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: t0n3t , 2020\n" "Language-Team: Catalan (https://www.transifex.com/musicbrainz/teams/13846/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/cs.po000066400000000000000000000064001362601763300177630ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Czech (https://www.transifex.com/musicbrainz/teams/13846/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/cy.po000066400000000000000000000063071362601763300177770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # cerdd83 , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: cerdd83 , 2020\n" "Language-Team: Welsh (https://www.transifex.com/musicbrainz/teams/13846/cy/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cy\n" "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/da.po000066400000000000000000000062611362601763300177470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Danish (https://www.transifex.com/musicbrainz/teams/13846/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/de.po000066400000000000000000000117501362601763300177520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Laurent Monin , 2018 # Wieland Hoffmann , 2019 # Lukáš Lalinský , 2020 # Philipp Wolfer , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Philipp Wolfer , 2020\n" "Language-Team: German (https://www.transifex.com/musicbrainz/teams/13846/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainz Musik-Tagger" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Musst du deine Musik-Sammlung aufräumen? Picard ist ein " "plattformübergreifender Open Source Musik-Tagger von MusicBrainz. Er kann " "Audio-Dateien selbst ohne vorhandene Metadaten identifizieren." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard hilft dir, deine Musik-Sammlung zu organisieren, indem es deine " "Musikdateien genauso wie du es möchtest umbenennt und in Ordner einsortiert." " Es steht eine Vielzahl an Plugins zur Verfügung und du kannst sogar deine " "eigenen schreiben. Picard unterstützt viele Audio-Formate und kann auch die " "gesamten Daten einer CD abfragen." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Audio-Dateien zu taggen war nie zuvor einfacher." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Funktionen:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Viele Formate: Picard unterstützt alle populären Musikformate, " "einschließlich MP3, FLAC, OGG, M4A, WMA, WAV und mehr." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard verwendet AcoustID Audio-Fingerabdrücke, um Dateien anhand " "der Musik zu identifizieren, ganz ohne vorhandene Metadaten." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Umfassende Datenbank: Picard verwendet die offene und von der Community " "betriebene MusicBrainz-Datenbank, um akkurate Informationen zu Millionen von" " Musik-Veröffentlichungen zu bieten." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "CD-Abfrage: Picard kann mit nur einem Klick die gesamten Daten einer Musik-" "CD abfragen." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Plugin-Unterstützung: Wenn du ein bestimmtes Feature benötigst, kannst du " "aus einer Vielzahl verfügbarer Plugins wählen oder dein eigenes schreiben." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Scripting: Eine flexible aber einfach zu erlernende Scriptsprache erlaubt " "dir genau festzulegen, wie deine Musikdateien benannt und wie die Tags " "aussehen werden." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Open Source: Picard ist unter der GNU General Public License 2.0 (oder " "höher) lizenziert und wird auf GitHub von großartigen Entwicklern " "weiterentwickelt." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz Foundation" picard-release-2.3.1/po/appstream/el.po000066400000000000000000000062601362601763300177620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Panos Bouklis , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Panos Bouklis , 2020\n" "Language-Team: Greek (https://www.transifex.com/musicbrainz/teams/13846/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/en_CA.po000066400000000000000000000062711362601763300203310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # kepstin , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: kepstin , 2020\n" "Language-Team: English (Canada) (https://www.transifex.com/musicbrainz/teams/13846/en_CA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_CA\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/es.po000066400000000000000000000121601362601763300177650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Jeremias Brown , 2018 # Ismael Olea , 2018 # Nicolás Tamargo , 2020 # Jefferson Alejandro Neira Rodriguez , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Jefferson Alejandro Neira Rodriguez , 2020\n" "Language-Team: Spanish (https://www.transifex.com/musicbrainz/teams/13846/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Etiquetador de música MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "¿Necesitas ordenar tu biblioteca de música? \n" "Picard es un etiquetador de música multiplataforma open source de MusicBrainz. Tiene la capacidad de identificar archivos de audio incluso sin metadatos disponibles." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard lo ayuda a organizar su colección de música cambiando el nombre de " "sus archivos de música y ordenándolos en una estructura de carpetas " "exactamente como lo desea. Hay una variedad de complementos disponibles e " "incluso puedes escribir los tuyos. Picard admite una amplia gama de formatos" " de audio y también puede buscar un CD completo por ti." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Etiquetar archivos de música nunca ha sido tan fácil." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Características:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Múltiples formatos: \n" "Picard es compatible con todos los formatos de música populares como MP3, FLAC, OGG, M4A, WMA, WAV y más." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: \n" "Picard utiliza las huellas digitales de audio de AcoustID que permiten identificar los archivos de audio incluso si no tienen metadatos." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Amplia base de datos: Picard utiliza la base de datos abierta y mantenida " "por la comunidad MusicBrainz para proporcionar información precisa sobre " "millones de lanzamientos musicales." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "Búsqueda de CD: \n" "Picard puede buscar un CD de música completo con solo un clic." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Compatible con complementos:\n" "Elije entre todos los complementos disponibles. O crea uno propio." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Secuencias de órdenes: \n" "Un lenguaje de secuencias de órdenes flexible pero fácil de aprender: permite especificar exactamente cómo se llamarán sus archivos de música y cómo se verán las etiquetas." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Open Source: Picard está licenciado bajo la Licencia Pública General GNU 2.0" " o posterior, y está alojado en GitHub, donde lo desarrollan activamente " "muchos magníficos desarrolladores." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "Fundación MetaBrainz" picard-release-2.3.1/po/appstream/et.po000066400000000000000000000062631362601763300177750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Estonian (https://www.transifex.com/musicbrainz/teams/13846/et/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/fi.po000066400000000000000000000117611362601763300177620ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Timo Martikainen , 2020 # Jaakko Perttilä , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Jaakko Perttilä , 2020\n" "Language-Team: Finnish (https://www.transifex.com/musicbrainz/teams/13846/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainzin musiikkitunnisteiden hallintaohjelma" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Haluaisitko järjestää musiikkikirjastosi? Picard on avoimen lähdekoodin " "alustariippumaton musiikkitunnisteiden hallintaohjelma MusicBrainzilta. Se " "pystyy tunnistaamaan äänitiedostoja jopa ilman niiden sisältämää metatietoa." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard auttaa sinua järjestelemään musiikkikirjastosi nimeämällä " "musiikkitiedostosi ja lajittelemalla ne hakemistorakenteeseen juuri niin " "kuin itse haluat. Useita liitännäisiä on myös saatavilla, ja voit kirjoittaa" " omiakin. Picard tukee monia äänitiedostomuotoja ja pystyy etsimään koko CD-" "levyn tiedotkin." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" "Äänitiedostojen tunnisteiden hallitseminen ei ole ollut koskaan näin " "helppoa." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Ominaisuudet:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Useita tiedostomuotoja: Picard tukee kaikkia suosittuja " "musiikkitiedostomuotoja, mukaan lukien MP3, FLAC, OGG, M4A, WMA, WAV ja " "monet muut." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard käyttää AcoustID-äänitunnisteita, joilla voidaan tunnistaa " "tiedosto sen sisältämän musiikin perusteella, vaikka tiedostossa ei olisi " "metatietoja." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Kattava tietokanta: Picard hyödyntää avointa ja yhteisön ylläpitämää " "MusicBrainz-tietokantaa, josta saa tietoa miljoonista musiikkijulkaisuista." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "CD-haku: Picard voi etsiä koko musiikki-CD:n yhdellä napinpainalluksella." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Liitännäiset: Tarvitessasi tiettyä ominaisuutta, voit valita jonkun " "valmiista liitännäisistä, tai tehdä omasi." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Komentojonot: Taipuisa mutta helposti omaksuttava komentojonokieli auttaa " "määrittämään tarkasti miten haluat musiikkitiedostosi nimettävän ja miltä " "niiden tiedot näyttävät." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Avoin lähdekoodi: Picard on lisensoitu GNU General Public License 2.0 tai " "uudempi lisenssillä, ja se on saatavilla GitHubista, jossa sitä aktiivisesti" " kehitetään." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz-säätiö" picard-release-2.3.1/po/appstream/fr.po000066400000000000000000000121221362601763300177630ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # AO , 2020 # Laurent Monin , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Laurent Monin , 2020\n" "Language-Team: French (https://www.transifex.com/musicbrainz/teams/13846/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Le baliseur de fichiers audio de MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Avez-vous besoin de nettoyer votre collection de musique ? Picard est un " "baliseur de fichiers musicaux libre et multi-plateformes par MusicBrainz. Il" " est capable d'identifier les fichiers audio même sans aucune métadonnée " "existante." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard vous aide à organiser votre collection musicale en renommant vos " "fichiers audio et en les triant dans une structure de répertoires exactement" " comme vous le souhaitez. Différents greffons sont disponibles et vous " "pouvez même créer le vôtre. Picard supporte une grande variété de formats " "audio et peut aussi rechercher un CD entier pour vous." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Baliser des fichiers audio n'a jamais été aussi facile." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Fonctionnalités :" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Formats multiples : Picard supporte la plupart des formats de fichiers audio" " courants, entre autres, MP3, FLAC, OGG, M4A, WMA, WAV." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard utilise les empreintes audio-acoustiques AcoustID, " "permettant l'identification des fichiers audio par la musique qu'ils " "contiennent, même s'ils n'ont aucune métadonnée." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Base de données riche : Picard utilise la base de données ouverte et " "maintenue par une communauté de MusicBrainz, pour fournir des informations " "précises à propos de millions de parutions musicales." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "Recherche de CD : Picard peut rechercher un CD musical en un clic." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Support de greffons : si vous avez besoin d'une fonctionnalité particulière," " vous pouvez choisir parmi une sélection de greffons disponibles ou écrire " "le vôtre." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Langage de script : Un langage de script, souple et simple à apprendre, vous" " permet de spécifier exactement comment vous voulez que vos fichiers soient " "nommés et à quoi les balises doivent ressembler." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Open Source : Picard est sous licence GNU General Public License 2.0 (ou " "plus), et est hébergé sur GitHub où il est activement maintenu par de " "formidables développeurs." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "Fondation MetaBrainz" picard-release-2.3.1/po/appstream/fr_CA.po000066400000000000000000000062631362601763300203370ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # murdos , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: murdos , 2020\n" "Language-Team: French (Canada) (https://www.transifex.com/musicbrainz/teams/13846/fr_CA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr_CA\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/ga.po000066400000000000000000000063301362601763300177470ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Seán de Búrca , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Seán de Búrca , 2020\n" "Language-Team: Irish (https://www.transifex.com/musicbrainz/teams/13846/ga/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ga\n" "Plural-Forms: nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "Picard MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/gl.po000066400000000000000000000062631362601763300177670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Galician (https://www.transifex.com/musicbrainz/teams/13846/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/he.po000066400000000000000000000130241362601763300177520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Avi Markovitz , 2020 # Philipp Wolfer , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Philipp Wolfer , 2020\n" "Language-Team: Hebrew (https://www.transifex.com/musicbrainz/teams/13846/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "מוזיקבריינז פיקארד" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "מתייג מוזיקה של מיוזיקבריינז" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "צריכים לנקות את ספריית המוזיקה שלכם? פיקארד הוא מתייג מוזיקה בקוד פתוח, חוצת" " פלטפורמת על ידי מיוזיקבריינז. בעל יכולת זיהוי קבצי שמע גם ללא מטא נתונים " "קיימים." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "פיקארד מסייע לך לארגן את אוסף המוסיקה שלך על-ידי שינוי שם קבצי המוסיקה שלך " "ומיון הקבצים למבנה תיקיות בדיוק כפי שאתה רוצה. זמינים מגוון של מִתְקָעים, " "תוכלו אפילו לכתוב משלכם. פיקארד תומך במגוון רחב של תבניות שמע ויכול גם לחפש " "תקליטור שלם." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "תיוג קובצי שמע מעולם לא היה קל יותר." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "תכונות:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "תבניות מרובות: פיקארד תומך בכל התבניות המוזיקה המקובלות לרבות MP3, FLAC, " "OGG, M4A, WMA, WAV, ועוד." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: פיקארד עושה שימוש טביעת אצבע אודיו AcoustID כדי לזהות את הקבצים על" " ידי המוסיקה עצמה, גם אם אין להם מטא-נתונים." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "מסד נתונים מקיף: פיקארד משתמש במסד הנתונים הפתוח המתוחזק על ידי קהילת " "מיוזיקבריינז על מנת לספק מידע מדויק על מיליוני הוצאות מוזיקה." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "חיפוש תקליטורים: פיקארד יכול לחפש תקליטורי מוזיקה שלמים בלחיצת כפתור." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "תמיכה מִתְקָעים: אם אתם צריכים תכונה מסוימת, תוכלו לבחור מתוך מבחר של " "מִתְקָעים זמין או לכתוב מִתְקָעים משלכם." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "תסרוט: שפת תסרוט גמישה אך קלה ללימוד מאפשרת להגדיר כיצד בדיוק קובצי המוזיקה" " יכונו וכיצד התגים יראו." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "קוד פתוח: פיקארד מרושה תחת הרישיון הציבורי הכללי של GNU 2.0 ואילך, ומתארח ב-" " GitHub, שם הוא מפותח באופן פעיל על ידי כמה מפתחים מדהימים." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "ממסד MetaBrainz" picard-release-2.3.1/po/appstream/hu.po000066400000000000000000000062641362601763300200020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Hungarian (https://www.transifex.com/musicbrainz/teams/13846/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/is.po000066400000000000000000000063121362601763300177730ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Icelandic (https://www.transifex.com/musicbrainz/teams/13846/is/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is\n" "Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/it.po000066400000000000000000000114371362601763300200000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Luca Salini , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Luca Salini , 2020\n" "Language-Team: Italian (https://www.transifex.com/musicbrainz/teams/13846/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Il tagger musicale di MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Vuoi riordinare la tua libreria musicale? Picard è un tagger musicale open-" "source e multipiattaforma di MusicBrainz. È in grado di identificare file " "audio anche in assenza di metadati." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard ti aiuta a organizzare la tua collezione musicale rinominando i file " "e ordinandoli in cartelle secondo la struttura che desideri. Diversi plugin " "sono già disponibili e puoi persino crearne di nuovi. Picard supporta una " "vasta gamma di formati audio e può anche cercare un intero CD per te." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Taggare file audio non è mai stato così facile." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Funzionalità:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Formati diversi: Picard supporta tutti i formati di musica più popolari, tra" " cui MP3, FLAC, OGG, M4A, WMA, WAV e altri." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard usa le impronte digitali audio AcoustID, che permettono di " "identificare i file a partire dalla musica, anche in assenza di metadati." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Database esauriente: Picard usa il database aperto e mantenuto dalla " "comunità di MusicBrainz per fornire informazioni accurate su milioni di " "pubblicazioni musicali." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "Ricerche CD: Picard può cercare interi CD musicali con un click." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Supporto plugin: Se hai bisogno di una funzionalità specifica, puoi " "scegliere da un elenco di plugin disponibili o creare il tuo." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Script: Un linguaggio di script flessibile ma facile da imparare ti permette" " di specificare con esattezza come rinominare i tuoi file musicali e come " "far apparire i tuoi tag." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Open source: Picard è rilasciato sotto la licenza GNU General Public License" " 2.0 o successive ed è ospitato su GitHub, dove è sviluppato attivamente da " "alcuni fantastici sviluppatori." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz Foundation" picard-release-2.3.1/po/appstream/ja.po000066400000000000000000000063241362601763300177550ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # 和田篤 , 2019 # Nozomu KURASAWA , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Nozomu KURASAWA , 2020\n" "Language-Team: Japanese (https://www.transifex.com/musicbrainz/teams/13846/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "特徴:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/ko.po000066400000000000000000000062521362601763300177740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Korean (https://www.transifex.com/musicbrainz/teams/13846/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/mr.po000066400000000000000000000061761362601763300200060ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Suraj Kawade, 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Suraj Kawade, 2020\n" "Language-Team: Marathi (https://www.transifex.com/musicbrainz/teams/13846/mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: mr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/ms_MY.po000066400000000000000000000117341362601763300204100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Muhammad Adli Ibrahim , 2020 # Philipp Wolfer , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Philipp Wolfer , 2020\n" "Language-Team: Malay (Malaysia) (https://www.transifex.com/musicbrainz/teams/13846/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "Picard MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Penanda muzik MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Pustaka muzik anda agak bersepah? Picard ialah sebuah penanda muzik sumber " "terbuka yang rentas pelantar oleh MusicBrainz. Picard mampu mengenal pasti " "fail audio biarpun tanpa mana-mana data meta yang sedia ada." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard mampu menyusun atur kumpulan muzik anda melalui penamaan semula dan " "pengisihan fail muzik ke dalam struktur pelipat yang dikehendaki. Anda boleh" " memilih antara pemalam yang tersedia ataupun menulis pemalam sendiri. " "Picard menyokong pelbagai jenis format audio. Di samping itu, Picard juga " "mampu mencari CD lengkap untuk anda." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Begitu mudah menanda fail-fail audio." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Ciri-ciri:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Beraneka format: Picard menyokong seluruh format muzik tenar. Antaranya " "termasuklah MP3, FLAC, OGG, M4A, WMA, WAV dan banyak lagi." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard menggunakan sidikan bunyi AcoustID untuk membolehkan fail-" "fail dikenal pasti oleh kandungan muziknya biarpun tanpa data meta." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Pangkalan data yang tuntas: Picard menggunakan pangkalan data MusicBrainz " "untuk membekalkan maklumat yang tepat berkenaan jutaan keluaran muzik. " "MusicBrainz ialah sebuah pangkalan data terbuka yang ditanggung oleh " "kelompok masyarakat." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "Carian CD: Picard boleh mencari CD muzik lengkap dengan hanya satu ketikan." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Sokongan pemalam: Anda boleh membuat pilihan antara pemalam yang tersedia " "ataupun tulis sendiri pemalam sekiranya terdapat ciri yang anda ingini." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Penskripan: Bahasa penskripan yang digunakan adalah anjal serta mudah " "dipelajari. Hal ini membolehkan anda menentukan penamaan fail muzik anda " "serta rupa tandanya." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Sumber Terbuka: Picard dilesenkan di bawah Lesen Awam Am GNU 2.0 atau yang " "terkemudian. Picard juga dihoskan di GitHub serta sedang giat dibangunkan " "oleh pembangun-pembangun yang hebat." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "Yayasan MetaBrainz" picard-release-2.3.1/po/appstream/nb.po000066400000000000000000000062541362601763300177640ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # CatQuest, The Endeavouring Cat, 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: CatQuest, The Endeavouring Cat, 2020\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/musicbrainz/teams/13846/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/nl.po000066400000000000000000000115021362601763300177660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # Maurits Meulenbelt , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Maurits Meulenbelt , 2020\n" "Language-Team: Dutch (https://www.transifex.com/musicbrainz/teams/13846/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainz’ muziektagger" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Wil je je muziekbibliotheek opschonen? Picard is een openbrontagger voor " "meerdere platformen van MusicBrainz. Het kan je audiobestanden zelfs zonder " "bestaande tags identificeren." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Met Picard kan je je muziekverzameling beheren door je muziekbestanden naar " "je eigen voorkeuren te hernoemen en op te slaan in een mapstructuur. Er zijn" " veel plug-ins beschikbaar en je kunt ook zelf plug-ins schrijven. Picard " "ondersteunt een breed scala audioformaten en kan ook een hele cd voor je " "opzoeken." #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Audiobestanden taggen was nog nooit zo makkelijk." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Functies:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Veel bestandsformaten: Picard ondersteunt alle populaire muziekformaten, " "waaronder mp3, FLAC, OGG, M4A, WMA, WAV en nog veel meer." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard gebruikt AcoustID-vingerafdrukken om bestanden aan de hand " "van het geluid te identificeren, zelfs als ze geen tags hebben." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Uitgebreide database: dankzij de open en door de gemeenschap onderhouden " "MusicBrainz-database geeft Picard je precieze informatie over miljoenen " "uitgaves." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "Cd’s opzoeken: Picard kan hele muziek-cd’s met een klik opzoeken." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Plug-inondersteuning: als je een bepaalde functie nodig hebt, kun je kiezen " "uit een brede selectie beschikbare plug-ins of er zelf een schrijven." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Scripts: een flexibele maar eenvoudig te leren scripttaal geeft je de " "mogelijkheid om de bestandsnamen en tags van je muziekbestanden aan je eigen" " wensen aan te passen." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Open bron: Picard heeft een GNU General Public License 2.0-licentie of hoger" " en wordt gehost op GitHub, waar het door geweldige ontwikkelaars wordt " "ontwikkeld." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz Foundation" picard-release-2.3.1/po/appstream/oc.po000066400000000000000000000062751362601763300177710ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Occitan (post 1500) (https://www.transifex.com/musicbrainz/teams/13846/oc/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: oc\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/picard-appstream.pot000066400000000000000000000057611362601763300230070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files " "and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music " "releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/pl.po000066400000000000000000000065031362601763300177750ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Polish (https://www.transifex.com/musicbrainz/teams/13846/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/pt.po000066400000000000000000000112321362601763300200000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Rui , 2019 # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Portuguese (https://www.transifex.com/musicbrainz/teams/13846/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Etiquetador de música do MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Precisa de limpar a sua biblioteca de música? O Picard é um etiquetador de " "música multiplataforma de código aberto do MusicBrainz. Tem a capacidade de " "identificar ficheiros de áudio mesmo sem metadados existentes." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Etiquetar ficheiros de áudio nunca foi tão fácil." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Funcionalidades:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Vários formatos: o Picard suporta vários formatos comuns, incluindo MP3, " "FLAC, OGG, M4A, WMA, WAV entre outros." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: o Picard usar as impressões digitais de áudio AcoustID, permitindo" " que os ficheiros sejam identificados exatamente pela música, mesmo que não " "contenha metadados." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Base de dados abrangente: o Picard usa a base de dados mantida pela " "comunidade para fornecer informação rigorosa sobre milhões de lançamentos de" " músicas." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "Procuras de CD: o Picard pode pesquisar CDs inteiros só com um clique." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Suporte a plug-ins: se precisar de uma funcionalidade em particular, pode " "escolher de uma variada seleção de plug-ins disponíveis ou criar o seu." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Scripts: tem disponível uma linguagem de scripts, fácil de aprender, que lhe" " permite especificar com exatidão como é que serão os nomes dos seus " "ficheiros de música e como as etiquetas irão aparecer." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Código-fonte aberto: o Picard é disponibilizado segundo a Licença Pública " "Geral GNU 2.0 ou posterior, sendo alojado no GitHub onde é desenvolvido " "ativamente por alguns programadores fantásticos." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz Foundation" picard-release-2.3.1/po/appstream/pt_BR.po000066400000000000000000000112761362601763300203730ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Jardel Alves , 2019 # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/musicbrainz/teams/13846/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Tagger de música do MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Você precisa limpar sua biblioteca de música? Picard é um tagger de música " "multiplataforma de código aberto da MusicBrainz. Ele tem a capacidade de " "identificar arquivos de áudio, mesmo sem qualquer metadado existente." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Marcação de arquivos de áudio nunca foi tão fácil." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Características:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Vários formatos: O Picard suporta todos os formatos de música populares, " "incluindo MP3, FLAC, OGG, M4A, WMA, WAV e muito mais." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: O Picard usa impressões digitais de áudio AcoustID, permitindo que" " os arquivos sejam identificados pela música real, mesmo que eles não tenham" " metadados." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Banco de dados abrangente: o Picard usa o banco de dados aberto e mantido " "pela comunidade do MusicBrainz para fornecer informações precisas sobre " "milhões de lançamentos musicais." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "Pesquisas de CD: Picard pode procurar CDs de música inteiros com um clique." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Suporte a plug-ins: se você precisar de um recurso específico, poderá " "escolher entre uma seleção de plug-ins disponíveis ou escrever seus " "próprios." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Scripting: Uma linguagem de script flexível, mas fácil de aprender, permite " "que você especifique exatamente como seus arquivos de música serão nomeados " "e como serão as etiquetas." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Open Source: O Picard é licenciado sob a GNU General Public License 2.0 ou " "posterior, e é hospedado no GitHub, onde é desenvolvido ativamente por " "alguns desenvolvedores incríveis." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz Foundation" picard-release-2.3.1/po/appstream/ro.po000066400000000000000000000063341362601763300200040ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Romanian (https://www.transifex.com/musicbrainz/teams/13846/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/ru.po000066400000000000000000000065341362601763300200140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Александр Жибарь , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Александр Жибарь , 2020\n" "Language-Team: Russian (https://www.transifex.com/musicbrainz/teams/13846/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/sk.po000066400000000000000000000063741362601763300200050ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Slovak (https://www.transifex.com/musicbrainz/teams/13846/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/sl.po000066400000000000000000000063501362601763300200000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Slovenian (https://www.transifex.com/musicbrainz/teams/13846/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/sq.po000066400000000000000000000112551362601763300200050ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Besnik , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Besnik , 2020\n" "Language-Team: Albanian (https://www.transifex.com/musicbrainz/teams/13846/sq/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "Etiketues muzike nga MusicBrainz" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "Keni nevojë të pastroni librarinë tuaj muzikore? Picard është një etiketues " "muzike, me burim të hapur, ndërplatformësh, nga MusicBrainz. Ka aftësinë të " "identifikojë kartela audio edhe pa ndonjë tejtëdhënë ekzistuese." #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "Etiketimi i kartelave audio s’ka qenë kurrë më i lehtë se sot." #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "Veçori:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" "Formate të shumtë: Picard-i mbulon krejt formatet popullorë të muzikës, " "përfshi MP3, FLAC, OGG, M4A, WMA, WAV, etj." #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard-i përdor shenja gishtash audio AcoustID, duke lejuar që " "kartelat të identifikohen nga muzika faktike, madje edhe kur nuk kanë " "tejtëdhëna." #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" "Bazë e plotë të dhënash: për të furnizuar informacion të saktë rreth miliona" " hedhjesh muzikore në qarkullim, Picard-i përdor bazën e të dhënave " "MusicBrainz, të hapur dhe të mirëmbajtur nga bashkësia." #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" "Kërkim CD-je: Picard-i mund të kërkojë me një klikim për CD të tëra " "muzikore." #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" "Mbulim shtojcash: Nëse ju duhet një veçori, mund të zgjidhni prej një " "përzgjedhje të shtojcave të gatshme ose të hartoni tuajën." #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" "Skriptim: Një gjuhë e zhdërvjellët, por e lehtë për t’u mësuar, ju lejon të " "specifikoni saktësisht se si do të emërtohen kartelat tuaja muzikore dhe se " "si do të duken etiketat." #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" "Me Burim të Hapur: Picard-i qarkullon sipas licencës GNU General Public " "License 2.0 ose të mëvonshme, dhe strehohet në GitHub, ku zhvillohet në " "mënyrë aktive nga disa programues të mrekullueshëm." #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz Foundation" picard-release-2.3.1/po/appstream/sv.po000066400000000000000000000062021362601763300200060ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Jonatan Nyberg, 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Jonatan Nyberg, 2020\n" "Language-Team: Swedish (https://www.transifex.com/musicbrainz/teams/13846/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/tr.po000066400000000000000000000062611362601763300200100ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Turkish (https://www.transifex.com/musicbrainz/teams/13846/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/uk.po000066400000000000000000000066221362601763300200030ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Ukrainian (https://www.transifex.com/musicbrainz/teams/13846/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "" picard-release-2.3.1/po/appstream/zh-Hans.po000066400000000000000000000104241362601763300206670ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Dian Li , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Dian Li , 2020\n" "Language-Team: Chinese Simplified (https://www.transifex.com/musicbrainz/teams/13846/zh-Hans/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh-Hans\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainz 出品的音乐标签软件" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "您的音乐库需要清理吗? Picard 是一款开源、跨平台的音乐标签软件,由 MusicBrainz " "出品。它甚至能够在没有任何元数据的情况下鉴别音频文件。" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "为音频文件添加标签从未如此简单。" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "功能:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "多格式: Picard 支持所有主流音乐格式,包括 MP3, FLAC, OGG, M4A, WMA, WAV 等。" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard 采用 AcoustID 音频指纹算法,可根据音频中实际存在的音乐来鉴别文件,即使文件无元数据信息也能做到。" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "数据库全面: Picard 采用开放的、由社区共同维护的 MusicBrainz 数据库提供数百万张专辑的精确信息。" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "CD 查询: Picard 可一键查询整张音乐 CD。" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "插件支持: 如果您需要特定的功能,可以从现有的插件库中挑选,也可以编写自己的插件。" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "脚本功能: 灵活简便的脚本功能允许您明确地指定音乐文件的命名方式,以及标签的显示方式。" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "开源: Picard 按照 GNU 通用公共许可证 (GPL) 2.0 或更高版本授权,托管于 GitHub,由许多超赞的开发者共同打造。" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz 基金会" picard-release-2.3.1/po/appstream/zh.po000066400000000000000000000103771362601763300200070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Dian Li , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Dian Li , 2020\n" "Language-Team: Chinese (https://www.transifex.com/musicbrainz/teams/13846/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainz 出品的音乐标签软件" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "您的音乐库需要清理吗? Picard 是一款开源、跨平台的音乐标签软件,由 MusicBrainz " "出品。它甚至能够在没有任何元数据的情况下鉴别音频文件。" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "为音频文件添加标签从未如此简单。" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "功能:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "多格式: Picard 支持所有主流音乐格式,包括 MP3, FLAC, OGG, M4A, WMA, WAV 等。" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard 采用 AcoustID 音频指纹算法,可根据音频中实际存在的音乐来鉴别文件,即使文件无元数据信息也能做到。" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "数据库全面: Picard 采用开放的、由社区共同维护的 MusicBrainz 数据库提供数百万张专辑的精确信息。" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "CD 查询: Picard 可一键查询整张音乐 CD。" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "插件支持: 如果您需要特定的功能,可以从现有的插件库中挑选,也可以编写自己的插件。" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "脚本功能: 灵活简便的脚本功能允许您明确地指定音乐文件的命名方式,以及标签的显示方式。" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "开源: Picard 按照 GNU 通用公共许可证 (GPL) 2.0 或更高版本授权,托管于 GitHub,由许多超赞的开发者共同打造。" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz 基金会" picard-release-2.3.1/po/appstream/zh_CN.po000066400000000000000000000105061362601763300203610ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Dian Li , 2019 # Lukáš Lalinský , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Lukáš Lalinský , 2020\n" "Language-Team: Chinese (China) (https://www.transifex.com/musicbrainz/teams/13846/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainz 出品的音乐标签软件" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "您的音乐库需要清理吗? Picard 是一款开源、跨平台的音乐标签软件,由 MusicBrainz " "出品。它甚至能够在没有任何元数据的情况下鉴别音频文件。" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "为音频文件添加标签从未如此简单。" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "功能:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "多格式: Picard 支持所有主流音乐格式,包括 MP3, FLAC, OGG, M4A, WMA, WAV 等。" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "" "AcoustID: Picard 采用 AcoustID 音频指纹算法,可根据音频中实际存在的音乐来鉴别文件,即使文件无元数据信息也能做到。" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "数据库全面: Picard 采用开放的、由社区共同维护的 MusicBrainz 数据库提供数百万张专辑的精确信息。" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "CD 查询: Picard 可一键查询整张音乐 CD。" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "插件支持: 如果您需要特定的功能,可以从现有的插件库中挑选,也可以编写自己的插件。" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "脚本功能: 灵活简便的脚本功能允许您明确地指定音乐文件的命名方式,以及标签的显示方式。" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "开源: Picard 按照 GNU 通用公共许可证 (GPL) 2.0 或更高版本授权,托管于 GitHub,由许多超赞的开发者共同打造。" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz 基金会" picard-release-2.3.1/po/appstream/zh_TW.po000066400000000000000000000111141362601763300204070ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # # Translators: # Shen-Ta Hsieh(BestSteve) , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-14 23:03+0100\n" "PO-Revision-Date: 2018-11-25 07:37+0000\n" "Last-Translator: Shen-Ta Hsieh(BestSteve) , 2020\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/musicbrainz/teams/13846/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0;\n" #: org.musicbrainz.Picard.appdata.xml.in:6 msgid "MusicBrainz Picard" msgstr "MusicBrainz Picard" #: org.musicbrainz.Picard.appdata.xml.in:7 msgid "MusicBrainz's music tagger" msgstr "MusicBrainz 的音樂標籤管理程式" #: org.musicbrainz.Picard.appdata.xml.in:10 msgid "" "Do you need to clean up your music library? Picard is an open-source cross-" "platform music tagger by MusicBrainz. It has the ability to identify audio " "files even without any existing metadata." msgstr "" "您需要整理您的音樂收藏庫?Picard 是開放源代碼且跨平臺的音樂標籤管理程式,由 MusicBrainz " "製作。就算沒有後設資料參考,它也有能力辨識音訊檔案。" #: org.musicbrainz.Picard.appdata.xml.in:15 msgid "" "Picard helps you organize your music collection by renaming your music files" " and sorting them into a folder structure exactly the way you want it. A " "variety of plugins are available and you can even write your own. Picard " "supports a wide range of audio formats and can also lookup an entire CD for " "you." msgstr "" "Picard 依照您指定的方式來重新命名音樂檔案,並整理進資料夾,藉此幫助您整理您的音樂收藏。Picard " "有多種插件可使用,您甚至可以撰寫自己的插件。Picard 支援多種音樂格式,也可以為您查找整張 CD。" #: org.musicbrainz.Picard.appdata.xml.in:22 msgid "Tagging audio files has never been easier." msgstr "管理音訊檔案的標籤從來沒有這麼簡單。" #: org.musicbrainz.Picard.appdata.xml.in:25 msgid "Features:" msgstr "功能:" #: org.musicbrainz.Picard.appdata.xml.in:27 msgid "" "Multiple formats: Picard supports all popular music formats, including MP3, " "FLAC, OGG, M4A, WMA, WAV, and more." msgstr "多種格式: Picard 支援所有流行的音樂格式,包含 MP3、FLAC、OGG、M4A、WMA、WAV,與其他。" #: org.musicbrainz.Picard.appdata.xml.in:31 msgid "" "AcoustID: Picard uses AcoustID audio fingerprints, allowing files to be " "identified by the actual music, even if they have no metadata." msgstr "AcoustID: Picard 使用 AcoustID 音訊特徵碼,來實際辨認音樂本體,即使它們缺少後設資料。" #: org.musicbrainz.Picard.appdata.xml.in:35 msgid "" "Comprehensive database: Picard uses the open and community-maintained " "MusicBrainz database to provide accurate information about millions of music" " releases." msgstr "綜合資料庫: Picard 使用開放且由社群維護的 MusicBrainz 資料庫來提供上百萬筆音樂發行品的準確資訊。" #: org.musicbrainz.Picard.appdata.xml.in:40 msgid "CD lookups: Picard can lookup entire music CDs with a click." msgstr "CD 查找: Picard 可以按一下就查找整張音樂 CD。" #: org.musicbrainz.Picard.appdata.xml.in:43 msgid "" "Plugin support: If you need a particular feature, you can choose from a " "selection of available plugins or write your own." msgstr "套件支援: 如果您需要特別功能,您可以從預先提供的套件中選擇,或是製作您自己的套件。" #: org.musicbrainz.Picard.appdata.xml.in:47 msgid "" "Scripting: A flexible but easy to learn scripting language allows you to " "exactly specify how your music files will be named and how the tags will " "look like." msgstr "腳本: 彈性但易學的腳本語言,讓您可以準確指定您的音樂檔案如何命名,與如何上標籤。" #: org.musicbrainz.Picard.appdata.xml.in:52 msgid "" "Open Source: Picard is licensed under the GNU General Public License 2.0 or " "later, and is hosted on GitHub where it is actively developed by some " "awesome developers." msgstr "開放源代碼: Picard 基於 GNU 通用公共授權條款 2.0 或其之後的版本,且在有優秀開發者所開發的 GitHub 上託管。" #: org.musicbrainz.Picard.appdata.xml.in:92 msgid "MetaBrainz Foundation" msgstr "MetaBrainz 基金會" picard-release-2.3.1/po/ar.po000066400000000000000000003236551362601763300160020ustar00rootroot00000000000000# Translations template for picard. # Copyright (C) 2020 ORGANIZATION # This file is distributed under the same license as the picard project. # # Translators: # FIRST AUTHOR , 2009 # Philipp Wolfer , 2019-2020 # صفا الفليج , 2018 msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2020-02-24 09:52+0100\n" "PO-Revision-Date: 2020-02-24 14:13+0000\n" "Last-Translator: Philipp Wolfer \n" "Language-Team: Arabic (http://www.transifex.com/musicbrainz/musicbrainz/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.6.0\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: picard/album.py:131 msgid "Unmatched Files" msgstr "الملفات غير المطابقة" #: picard/album.py:284 #, python-format msgid "[could not load album %s]" msgstr "[تعذّر تحميل الألبوم %s]" #: picard/album.py:386 #, python-format msgid "Album %(id)s loaded: %(artist)s - %(album)s" msgstr "حُمّل الألبوم %(id)s: ‏%(artist)s - ‏%(album)s" #: picard/album.py:441 #, python-format msgid "Loading album %(id)s ..." msgstr "يحمّل الألبوم %(id)s..." #: picard/album.py:445 msgid "[loading album information]" msgstr "[يحمّل معلومات الألبوم]" #: picard/album.py:653 #, python-format msgid "; %i image" msgid_plural "; %i images" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/album.py:656 #, python-format msgid "; %i image not in all tracks" msgid_plural "; %i different images among tracks" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/cluster.py:225 #, python-format msgid "No matching releases for cluster %(album)s" msgstr "" #: picard/cluster.py:227 #, python-format msgid "Cluster %(album)s identified!" msgstr "" #: picard/cluster.py:249 #, python-format msgid "Looking up the metadata for cluster %(album)s..." msgstr "" #: picard/cluster.py:332 msgid "Unclustered Files" msgstr "" #: picard/collection.py:80 #, python-format msgid "Added %(count)i release to collection \"%(name)s\"" msgid_plural "Added %(count)i releases to collection \"%(name)s\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/collection.py:88 #, python-format msgid "Removed %(count)i release from collection \"%(name)s\"" msgid_plural "Removed %(count)i releases from collection \"%(name)s\"" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/collection.py:99 #, python-format msgid "Error while modifying collections: %(error)s" msgstr "" #: picard/collection.py:121 #, python-format msgid "Error loading collections: %(error)s" msgstr "عُطل أثناء تحميل التجميعات: %(error)s" #: picard/config_upgrade.py:76 picard/config_upgrade.py:89 msgid "Various Artists file naming scheme removal" msgstr "" #: picard/config_upgrade.py:77 msgid "" "The separate file naming scheme for various artists albums has been removed in this version of Picard.\n" "Your file naming scheme has automatically been merged with that of single artist albums." msgstr "" #: picard/config_upgrade.py:90 msgid "" "The separate file naming scheme for various artists albums has been removed in this version of Picard.\n" "You currently do not use this option, but have a separate file naming scheme defined.\n" "Do you want to remove it or merge it with your file naming scheme for single artist albums?" msgstr "" #: picard/config_upgrade.py:97 msgid "Merge" msgstr "" #: picard/config_upgrade.py:98 picard/ui/metadatabox.py:359 #: picard/ui/options/interface.py:100 picard/ui/ui_options_interface.py:144 msgid "Remove" msgstr "أزِل" #: picard/file.py:716 #, python-format msgid "No matching tracks above the threshold for file '%(filename)s'" msgstr "" #: picard/file.py:718 #, python-format msgid "File '%(filename)s' identified!" msgstr "عُرّف الملف ”%(filename)s“!" #: picard/file.py:730 #, python-format msgid "No matching tracks for file '%(filename)s'" msgstr "لا مقطوعات تطابق الملف ”%(filename)s“" #: picard/file.py:762 #, python-format msgid "Looking up the metadata for file %(filename)s ..." msgstr "يبحث عن معلومات وصفية للملف %(filename)s..." #: picard/pluginmanager.py:226 #, python-format msgid "Unable to load plugin '%s'" msgstr "" #: picard/pluginmanager.py:241 #, python-format msgid "Failed loading zipped plugin %r from %r" msgstr "" #: picard/pluginmanager.py:251 #, python-format msgid "Failed loading plugin %r in %r" msgstr "" #: picard/pluginmanager.py:287 #, python-format msgid "Plugin '%s' from '%s' is not compatible with this version of Picard." msgstr "" #: picard/pluginmanager.py:291 #, python-format msgid "Plugin %r has an invalid API version string : %s" msgstr "" #: picard/pluginmanager.py:294 #, python-format msgid "Plugin %r" msgstr "" #: picard/pluginmanager.py:431 #, python-format msgid "Error loading plugins list: %(error)s" msgstr "عُطل أثناء تحميل قائمة الملحقات: %(error)s" #: picard/releasegroup.py:69 picard/ui/searchdialog/album.py:155 msgid "Tracks" msgstr "المقطوعات" #: picard/releasegroup.py:70 msgid "Year" msgstr "السنة" #: picard/releasegroup.py:71 picard/ui/cdlookup.py:72 #: picard/ui/searchdialog/album.py:157 picard/ui/searchdialog/track.py:68 msgid "Country" msgstr "البلد" #: picard/releasegroup.py:72 picard/ui/searchdialog/album.py:154 msgid "Format" msgstr "" #: picard/releasegroup.py:73 msgid "Label" msgstr "" #: picard/releasegroup.py:74 msgid "Cat No" msgstr "رقم الكتالوج" #: picard/releasegroup.py:106 msgid "[no barcode]" msgstr "[لا باركود]" #: picard/releasegroup.py:120 msgid "[no release info]" msgstr "[لا معلومات إصدار]" #: picard/tagger.py:313 picard/ui/ui_options_general.py:135 msgid "MusicBrainz Account" msgstr "حساب MusicBrainz" #: picard/tagger.py:314 msgid "Authorization code:" msgstr "رمز الاستيثاق:" #: picard/tagger.py:547 picard/tagger.py:580 #, python-format msgid "Adding %(count)d file from '%(directory)s' ..." msgid_plural "Adding %(count)d files from '%(directory)s' ..." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/tagger.py:767 #, python-format msgid "Removing album %(id)s: %(artist)s - %(album)s" msgstr "يُزيل الألبوم %(id)s: ‏%(artist)s - ‏%(album)s" #: picard/tagger.py:785 msgid "CD Lookup Error" msgstr "" #: picard/tagger.py:786 #, python-format msgid "" "Error while reading CD:\n" "\n" "%s" msgstr "عطل أثناء قراءة الأسطوانة:\n\n%s" #: picard/track.py:358 msgid "[loading recording information]" msgstr "" #: picard/track.py:393 #, python-format msgid "[could not load recording %s]" msgstr "" #: picard/acoustid/__init__.py:84 #, python-format msgid "AcoustID lookup network error for '%(filename)s'!" msgstr "" #: picard/acoustid/__init__.py:117 #, python-format msgid "AcoustID lookup failed for '%(filename)s'!" msgstr "" #: picard/acoustid/__init__.py:142 #, python-format msgid "AcoustID lookup returned no result for file '%(filename)s'" msgstr "" #: picard/acoustid/__init__.py:153 #, python-format msgid "Looking up the fingerprint for file '%(filename)s' ..." msgstr "" #: picard/acoustid/manager.py:102 msgid "AcoustIDs successfully submitted." msgstr "" #: picard/acoustid/manager.py:114 msgid "Submitting AcoustIDs ..." msgstr "" #: picard/acoustid/manager.py:136 #, python-format msgid "AcoustID submission failed with error '%(error)s': %(message)s" msgstr "" #: picard/const/__init__.py:146 msgid "Stable releases only" msgstr "" #: picard/const/__init__.py:152 msgid "Stable and Beta releases" msgstr "" #: picard/const/__init__.py:158 msgid "Stable, Beta and Dev releases" msgstr "" #: picard/const/__init__.py:173 #, python-format msgid "My script %d" msgstr "" #: picard/const/__init__.py:174 msgid "My script" msgstr "" #: picard/const/languages.py:29 picard/const/locales.py:41 msgid "Arabic" msgstr "" #: picard/const/languages.py:32 picard/const/locales.py:87 msgid "Catalan" msgstr "" #: picard/const/languages.py:33 picard/const/locales.py:109 msgid "Czech" msgstr "" #: picard/const/languages.py:35 picard/const/locales.py:111 msgid "Danish" msgstr "" #: picard/const/languages.py:36 picard/const/locales.py:182 msgid "German" msgstr "الألمانية" #: picard/const/languages.py:37 picard/const/locales.py:188 msgid "German (Switzerland)" msgstr "" #: picard/const/languages.py:38 picard/const/locales.py:189 #: picard/const/locales.py:190 msgid "Greek" msgstr "" #: picard/const/languages.py:39 picard/const/locales.py:120 msgid "English" msgstr "الإنجليزية" #: picard/const/languages.py:40 picard/const/locales.py:122 msgid "English (Australia)" msgstr "" #: picard/const/languages.py:41 picard/const/locales.py:126 msgid "English (Canada)" msgstr "الإنجليزية (كندا)" #: picard/const/languages.py:42 msgid "English (UK)" msgstr "الإنجليزية (المملكة المتحدة)" #: picard/const/languages.py:44 picard/const/locales.py:389 msgid "Spanish" msgstr "الإسبانية" #: picard/const/languages.py:45 picard/const/locales.py:152 msgid "Estonian" msgstr "" #: picard/const/languages.py:47 picard/const/locales.py:161 msgid "Finnish" msgstr "" #: picard/const/languages.py:49 picard/const/locales.py:163 msgid "French" msgstr "الفرنسية" #: picard/const/languages.py:50 picard/const/locales.py:165 msgid "French (Canada)" msgstr "" #: picard/const/languages.py:52 picard/const/locales.py:175 msgid "Galician" msgstr "" #: picard/const/languages.py:53 picard/const/locales.py:209 msgid "Hebrew" msgstr "" #: picard/const/languages.py:55 picard/const/locales.py:213 msgid "Hungarian" msgstr "" #: picard/const/languages.py:57 picard/const/locales.py:215 msgid "Icelandic" msgstr "" #: picard/const/languages.py:58 picard/const/locales.py:225 msgid "Italian" msgstr "الإيطالية" #: picard/const/languages.py:59 picard/const/locales.py:228 msgid "Japanese" msgstr "" #: picard/const/languages.py:61 picard/const/locales.py:250 msgid "Korean" msgstr "" #: picard/const/languages.py:63 picard/const/locales.py:283 msgid "Malay (Malaysia)" msgstr "" #: picard/const/languages.py:64 picard/const/locales.py:309 msgid "Norwegian Bokmål" msgstr "النرويجية البوكمالية" #: picard/const/languages.py:66 picard/const/locales.py:115 msgid "Dutch" msgstr "" #: picard/const/languages.py:67 picard/const/locales.py:315 msgid "Occitan" msgstr "" #: picard/const/languages.py:68 picard/const/locales.py:327 msgid "Polish" msgstr "" #: picard/const/languages.py:69 picard/const/locales.py:329 msgid "Portuguese" msgstr "" #: picard/const/languages.py:70 msgid "Brazilian Portuguese" msgstr "البرتغالية البرازيلية" #: picard/const/languages.py:71 picard/const/locales.py:339 msgid "Romanian" msgstr "" #: picard/const/languages.py:72 picard/const/locales.py:342 msgid "Russian" msgstr "" #: picard/const/languages.py:74 picard/const/locales.py:375 msgid "Slovak" msgstr "" #: picard/const/languages.py:75 picard/const/locales.py:377 msgid "Slovenian" msgstr "" #: picard/const/languages.py:76 picard/const/locales.py:37 msgid "Albanian" msgstr "" #: picard/const/languages.py:78 picard/const/locales.py:416 msgid "Swedish" msgstr "السويدية" #: picard/const/languages.py:80 picard/const/locales.py:452 msgid "Turkish" msgstr "" #: picard/const/languages.py:81 picard/const/locales.py:460 msgid "Ukrainian" msgstr "" #: picard/const/languages.py:82 picard/const/locales.py:90 msgid "Chinese (China)" msgstr "" #: picard/const/languages.py:83 picard/const/locales.py:99 msgid "Chinese (Taiwan)" msgstr "" #: picard/const/locales.py:27 msgid "Afar" msgstr "" #: picard/const/locales.py:28 msgid "Afar (Djibouti)" msgstr "" #: picard/const/locales.py:29 msgid "Afar (Eritrea)" msgstr "" #: picard/const/locales.py:30 msgid "Afar (Eritrea) (Saho)" msgstr "" #: picard/const/locales.py:31 msgid "Afar (Ethiopia)" msgstr "" #: picard/const/locales.py:32 msgid "Afrikaans" msgstr "" #: picard/const/locales.py:33 msgid "Afrikaans (Namibia)" msgstr "" #: picard/const/locales.py:34 msgid "Afrikaans (South Africa)" msgstr "" #: picard/const/locales.py:35 msgid "Akan" msgstr "" #: picard/const/locales.py:36 msgid "Akan (Ghana)" msgstr "" #: picard/const/locales.py:38 msgid "Albanian (Albania)" msgstr "" #: picard/const/locales.py:39 msgid "Amharic" msgstr "" #: picard/const/locales.py:40 msgid "Amharic (Ethiopia)" msgstr "" #: picard/const/locales.py:42 msgid "Arabic (Algeria)" msgstr "" #: picard/const/locales.py:43 msgid "Arabic (Bahrain)" msgstr "" #: picard/const/locales.py:44 msgid "Arabic (Egypt)" msgstr "" #: picard/const/locales.py:45 msgid "Arabic (Iraq)" msgstr "" #: picard/const/locales.py:46 msgid "Arabic (Jordan)" msgstr "" #: picard/const/locales.py:47 msgid "Arabic (Kuwait)" msgstr "" #: picard/const/locales.py:48 msgid "Arabic (Lebanon)" msgstr "" #: picard/const/locales.py:49 msgid "Arabic (Libya)" msgstr "" #: picard/const/locales.py:50 msgid "Arabic (Morocco)" msgstr "" #: picard/const/locales.py:51 msgid "Arabic (Oman)" msgstr "" #: picard/const/locales.py:52 msgid "Arabic (Qatar)" msgstr "" #: picard/const/locales.py:53 msgid "Arabic (Saudi Arabia)" msgstr "" #: picard/const/locales.py:54 msgid "Arabic (Sudan)" msgstr "" #: picard/const/locales.py:55 msgid "Arabic (Syria)" msgstr "" #: picard/const/locales.py:56 msgid "Arabic (Tunisia)" msgstr "" #: picard/const/locales.py:57 msgid "Arabic (United Arab Emirates)" msgstr "" #: picard/const/locales.py:58 msgid "Arabic (Yemen)" msgstr "" #: picard/const/locales.py:59 msgid "Armenian" msgstr "" #: picard/const/locales.py:60 msgid "Armenian (Armenia)" msgstr "" #: picard/const/locales.py:61 msgid "Armenian (Armenia) (Revised Orthography)" msgstr "" #: picard/const/locales.py:62 msgid "Assamese" msgstr "" #: picard/const/locales.py:63 msgid "Assamese (India)" msgstr "" #: picard/const/locales.py:64 msgid "Atsam" msgstr "" #: picard/const/locales.py:65 msgid "Atsam (Nigeria)" msgstr "" #: picard/const/locales.py:66 msgid "Azerbaijani" msgstr "" #: picard/const/locales.py:67 msgid "Azerbaijani (Azerbaijan)" msgstr "" #: picard/const/locales.py:68 msgid "Azerbaijani (Cyrillic)" msgstr "" #: picard/const/locales.py:69 msgid "Azerbaijani (Cyrillic) (Azerbaijan)" msgstr "" #: picard/const/locales.py:70 msgid "Azerbaijani (Latin)" msgstr "" #: picard/const/locales.py:71 msgid "Azerbaijani (Latin) (Azerbaijan)" msgstr "" #: picard/const/locales.py:72 msgid "Basque" msgstr "" #: picard/const/locales.py:73 msgid "Basque (Spain)" msgstr "" #: picard/const/locales.py:74 msgid "Belarusian" msgstr "" #: picard/const/locales.py:75 msgid "Belarusian (Belarus)" msgstr "" #: picard/const/locales.py:76 msgid "Bengali" msgstr "" #: picard/const/locales.py:77 msgid "Bengali (Bangladesh)" msgstr "" #: picard/const/locales.py:78 msgid "Bengali (India)" msgstr "" #: picard/const/locales.py:79 msgid "Blin" msgstr "" #: picard/const/locales.py:80 msgid "Blin (Eritrea)" msgstr "" #: picard/const/locales.py:81 msgid "Bosnian" msgstr "" #: picard/const/locales.py:82 msgid "Bosnian (Bosnia and Herzegovina)" msgstr "" #: picard/const/locales.py:83 msgid "Bulgarian" msgstr "" #: picard/const/locales.py:84 msgid "Bulgarian (Bulgaria)" msgstr "" #: picard/const/locales.py:85 msgid "Burmese" msgstr "" #: picard/const/locales.py:86 msgid "Burmese (Myanmar [Burma])" msgstr "" #: picard/const/locales.py:88 msgid "Catalan (Spain)" msgstr "" #: picard/const/locales.py:89 msgid "Chinese" msgstr "" #: picard/const/locales.py:91 msgid "Chinese (Hong Kong)" msgstr "" #: picard/const/locales.py:92 msgid "Chinese (Macau)" msgstr "" #: picard/const/locales.py:93 msgid "Chinese (Simplified Han)" msgstr "" #: picard/const/locales.py:94 msgid "Chinese (Simplified Han) (China)" msgstr "" #: picard/const/locales.py:95 msgid "Chinese (Simplified Han) (Hong Kong)" msgstr "" #: picard/const/locales.py:96 msgid "Chinese (Simplified Han) (Macau)" msgstr "" #: picard/const/locales.py:97 msgid "Chinese (Simplified Han) (Singapore)" msgstr "" #: picard/const/locales.py:98 msgid "Chinese (Singapore)" msgstr "" #: picard/const/locales.py:100 msgid "Chinese (Traditional Han)" msgstr "" #: picard/const/locales.py:101 msgid "Chinese (Traditional Han) (Hong Kong)" msgstr "" #: picard/const/locales.py:102 msgid "Chinese (Traditional Han) (Macau)" msgstr "" #: picard/const/locales.py:103 msgid "Chinese (Traditional Han) (Taiwan)" msgstr "" #: picard/const/locales.py:104 msgid "Coptic" msgstr "" #: picard/const/locales.py:105 msgid "Cornish" msgstr "" #: picard/const/locales.py:106 msgid "Cornish (United Kingdom)" msgstr "" #: picard/const/locales.py:107 msgid "Croatian" msgstr "" #: picard/const/locales.py:108 msgid "Croatian (Croatia)" msgstr "" #: picard/const/locales.py:110 msgid "Czech (Czech Republic)" msgstr "" #: picard/const/locales.py:112 msgid "Danish (Denmark)" msgstr "" #: picard/const/locales.py:113 msgid "Divehi" msgstr "" #: picard/const/locales.py:114 msgid "Divehi (Maldives)" msgstr "" #: picard/const/locales.py:116 msgid "Dutch (Belgium)" msgstr "" #: picard/const/locales.py:117 msgid "Dutch (Netherlands)" msgstr "" #: picard/const/locales.py:118 msgid "Dzongkha" msgstr "" #: picard/const/locales.py:119 msgid "Dzongkha (Bhutan)" msgstr "" #: picard/const/locales.py:121 msgid "English (American Samoa)" msgstr "" #: picard/const/locales.py:123 msgid "English (Belgium)" msgstr "" #: picard/const/locales.py:124 msgid "English (Belize)" msgstr "" #: picard/const/locales.py:125 msgid "English (Botswana)" msgstr "" #: picard/const/locales.py:127 msgid "English (Deseret)" msgstr "" #: picard/const/locales.py:128 msgid "English (Deseret) (United States)" msgstr "" #: picard/const/locales.py:129 msgid "English (Guam)" msgstr "" #: picard/const/locales.py:130 msgid "English (Hong Kong)" msgstr "" #: picard/const/locales.py:131 msgid "English (India)" msgstr "" #: picard/const/locales.py:132 msgid "English (Ireland)" msgstr "" #: picard/const/locales.py:133 msgid "English (Jamaica)" msgstr "" #: picard/const/locales.py:134 msgid "English (Malta)" msgstr "" #: picard/const/locales.py:135 msgid "English (Marshall Islands)" msgstr "" #: picard/const/locales.py:136 msgid "English (Namibia)" msgstr "" #: picard/const/locales.py:137 msgid "English (New Zealand)" msgstr "" #: picard/const/locales.py:138 msgid "English (Northern Mariana Islands)" msgstr "" #: picard/const/locales.py:139 msgid "English (Pakistan)" msgstr "" #: picard/const/locales.py:140 msgid "English (Philippines)" msgstr "" #: picard/const/locales.py:141 msgid "English (Shavian)" msgstr "" #: picard/const/locales.py:142 msgid "English (Singapore)" msgstr "" #: picard/const/locales.py:143 msgid "English (South Africa)" msgstr "" #: picard/const/locales.py:144 msgid "English (Trinidad and Tobago)" msgstr "" #: picard/const/locales.py:145 msgid "English (U.S. Minor Outlying Islands)" msgstr "" #: picard/const/locales.py:146 msgid "English (U.S. Virgin Islands)" msgstr "" #: picard/const/locales.py:147 msgid "English (United Kingdom)" msgstr "" #: picard/const/locales.py:148 msgid "English (United States)" msgstr "" #: picard/const/locales.py:149 msgid "English (United States) (Computer)" msgstr "" #: picard/const/locales.py:150 msgid "English (Zimbabwe)" msgstr "" #: picard/const/locales.py:151 msgid "Esperanto" msgstr "" #: picard/const/locales.py:153 msgid "Estonian (Estonia)" msgstr "" #: picard/const/locales.py:154 msgid "Ewe" msgstr "" #: picard/const/locales.py:155 msgid "Ewe (Ghana)" msgstr "" #: picard/const/locales.py:156 msgid "Ewe (Togo)" msgstr "" #: picard/const/locales.py:157 msgid "Faroese" msgstr "" #: picard/const/locales.py:158 msgid "Faroese (Faroe Islands)" msgstr "" #: picard/const/locales.py:159 msgid "Filipino" msgstr "" #: picard/const/locales.py:160 msgid "Filipino (Philippines)" msgstr "" #: picard/const/locales.py:162 msgid "Finnish (Finland)" msgstr "" #: picard/const/locales.py:164 msgid "French (Belgium)" msgstr "" #: picard/const/locales.py:166 msgid "French (France)" msgstr "" #: picard/const/locales.py:167 msgid "French (Luxembourg)" msgstr "" #: picard/const/locales.py:168 msgid "French (Monaco)" msgstr "" #: picard/const/locales.py:169 msgid "French (Senegal)" msgstr "" #: picard/const/locales.py:170 msgid "French (Switzerland)" msgstr "" #: picard/const/locales.py:171 msgid "Friulian" msgstr "" #: picard/const/locales.py:172 msgid "Friulian (Italy)" msgstr "" #: picard/const/locales.py:173 msgid "Ga" msgstr "" #: picard/const/locales.py:174 msgid "Ga (Ghana)" msgstr "" #: picard/const/locales.py:176 msgid "Galician (Spain)" msgstr "" #: picard/const/locales.py:177 msgid "Geez" msgstr "" #: picard/const/locales.py:178 msgid "Geez (Eritrea)" msgstr "" #: picard/const/locales.py:179 msgid "Geez (Ethiopia)" msgstr "" #: picard/const/locales.py:180 msgid "Georgian" msgstr "" #: picard/const/locales.py:181 msgid "Georgian (Georgia)" msgstr "" #: picard/const/locales.py:183 msgid "German (Austria)" msgstr "" #: picard/const/locales.py:184 msgid "German (Belgium)" msgstr "" #: picard/const/locales.py:185 msgid "German (Germany)" msgstr "" #: picard/const/locales.py:186 msgid "German (Liechtenstein)" msgstr "" #: picard/const/locales.py:187 msgid "German (Luxembourg)" msgstr "" #: picard/const/locales.py:191 msgid "Greek (Cyprus)" msgstr "" #: picard/const/locales.py:192 msgid "Greek (Greece)" msgstr "" #: picard/const/locales.py:193 msgid "Gujarati" msgstr "" #: picard/const/locales.py:194 msgid "Gujarati (India)" msgstr "" #: picard/const/locales.py:195 msgid "Hausa" msgstr "" #: picard/const/locales.py:196 msgid "Hausa (Arabic)" msgstr "" #: picard/const/locales.py:197 msgid "Hausa (Arabic) (Nigeria)" msgstr "" #: picard/const/locales.py:198 msgid "Hausa (Arabic) (Sudan)" msgstr "" #: picard/const/locales.py:199 msgid "Hausa (Ghana)" msgstr "" #: picard/const/locales.py:200 msgid "Hausa (Latin)" msgstr "" #: picard/const/locales.py:201 msgid "Hausa (Latin) (Ghana)" msgstr "" #: picard/const/locales.py:202 msgid "Hausa (Latin) (Niger)" msgstr "" #: picard/const/locales.py:203 msgid "Hausa (Latin) (Nigeria)" msgstr "" #: picard/const/locales.py:204 msgid "Hausa (Niger)" msgstr "" #: picard/const/locales.py:205 msgid "Hausa (Nigeria)" msgstr "" #: picard/const/locales.py:206 msgid "Hausa (Sudan)" msgstr "" #: picard/const/locales.py:207 msgid "Hawaiian" msgstr "" #: picard/const/locales.py:208 msgid "Hawaiian (United States)" msgstr "" #: picard/const/locales.py:210 msgid "Hebrew (Israel)" msgstr "" #: picard/const/locales.py:211 msgid "Hindi" msgstr "" #: picard/const/locales.py:212 msgid "Hindi (India)" msgstr "" #: picard/const/locales.py:214 msgid "Hungarian (Hungary)" msgstr "" #: picard/const/locales.py:216 msgid "Icelandic (Iceland)" msgstr "" #: picard/const/locales.py:217 msgid "Igbo" msgstr "" #: picard/const/locales.py:218 msgid "Igbo (Nigeria)" msgstr "" #: picard/const/locales.py:219 msgid "Indonesian" msgstr "" #: picard/const/locales.py:220 msgid "Indonesian (Indonesia)" msgstr "" #: picard/const/locales.py:221 msgid "Interlingua" msgstr "" #: picard/const/locales.py:222 msgid "Inuktitut" msgstr "" #: picard/const/locales.py:223 msgid "Irish" msgstr "" #: picard/const/locales.py:224 msgid "Irish (Ireland)" msgstr "" #: picard/const/locales.py:226 msgid "Italian (Italy)" msgstr "" #: picard/const/locales.py:227 msgid "Italian (Switzerland)" msgstr "" #: picard/const/locales.py:229 msgid "Japanese (Japan)" msgstr "" #: picard/const/locales.py:230 msgid "Jju" msgstr "" #: picard/const/locales.py:231 msgid "Jju (Nigeria)" msgstr "" #: picard/const/locales.py:232 msgid "Kalaallisut" msgstr "" #: picard/const/locales.py:233 msgid "Kalaallisut (Greenland)" msgstr "" #: picard/const/locales.py:234 msgid "Kamba" msgstr "" #: picard/const/locales.py:235 msgid "Kamba (Kenya)" msgstr "" #: picard/const/locales.py:236 msgid "Kannada" msgstr "" #: picard/const/locales.py:237 msgid "Kannada (India)" msgstr "" #: picard/const/locales.py:238 msgid "Kazakh" msgstr "" #: picard/const/locales.py:239 msgid "Kazakh (Cyrillic)" msgstr "" #: picard/const/locales.py:240 msgid "Kazakh (Cyrillic) (Kazakhstan)" msgstr "" #: picard/const/locales.py:241 msgid "Kazakh (Kazakhstan)" msgstr "" #: picard/const/locales.py:242 msgid "Khmer" msgstr "" #: picard/const/locales.py:243 msgid "Khmer (Cambodia)" msgstr "" #: picard/const/locales.py:244 msgid "Kinyarwanda" msgstr "" #: picard/const/locales.py:245 msgid "Kinyarwanda (Rwanda)" msgstr "" #: picard/const/locales.py:246 msgid "Kirghiz" msgstr "" #: picard/const/locales.py:247 msgid "Kirghiz (Kyrgyzstan)" msgstr "" #: picard/const/locales.py:248 msgid "Konkani" msgstr "" #: picard/const/locales.py:249 msgid "Konkani (India)" msgstr "" #: picard/const/locales.py:251 msgid "Korean (South Korea)" msgstr "" #: picard/const/locales.py:252 msgid "Koro" msgstr "" #: picard/const/locales.py:253 msgid "Koro (Côte d’Ivoire)" msgstr "" #: picard/const/locales.py:254 msgid "Kpelle" msgstr "" #: picard/const/locales.py:255 msgid "Kpelle (Guinea)" msgstr "" #: picard/const/locales.py:256 msgid "Kpelle (Liberia)" msgstr "" #: picard/const/locales.py:257 msgid "Kurdish" msgstr "" #: picard/const/locales.py:258 msgid "Kurdish (Arabic)" msgstr "" #: picard/const/locales.py:259 msgid "Kurdish (Arabic) (Iran)" msgstr "" #: picard/const/locales.py:260 msgid "Kurdish (Arabic) (Iraq)" msgstr "" #: picard/const/locales.py:261 msgid "Kurdish (Arabic) (Syria)" msgstr "" #: picard/const/locales.py:262 msgid "Kurdish (Iran)" msgstr "" #: picard/const/locales.py:263 msgid "Kurdish (Iraq)" msgstr "" #: picard/const/locales.py:264 msgid "Kurdish (Latin)" msgstr "" #: picard/const/locales.py:265 msgid "Kurdish (Latin) (Turkey)" msgstr "" #: picard/const/locales.py:266 msgid "Kurdish (Syria)" msgstr "" #: picard/const/locales.py:267 msgid "Kurdish (Turkey)" msgstr "" #: picard/const/locales.py:268 msgid "Lao" msgstr "" #: picard/const/locales.py:269 msgid "Lao (Laos)" msgstr "" #: picard/const/locales.py:270 msgid "Latvian" msgstr "" #: picard/const/locales.py:271 msgid "Latvian (Latvia)" msgstr "" #: picard/const/locales.py:272 msgid "Lingala" msgstr "" #: picard/const/locales.py:273 msgid "Lingala (Congo - Brazzaville)" msgstr "" #: picard/const/locales.py:274 msgid "Lingala (Congo - Kinshasa)" msgstr "" #: picard/const/locales.py:275 msgid "Lithuanian" msgstr "" #: picard/const/locales.py:276 msgid "Lithuanian (Lithuania)" msgstr "" #: picard/const/locales.py:277 msgid "Low German" msgstr "" #: picard/const/locales.py:278 msgid "Low German (Germany)" msgstr "" #: picard/const/locales.py:279 msgid "Macedonian" msgstr "" #: picard/const/locales.py:280 msgid "Macedonian (Macedonia)" msgstr "" #: picard/const/locales.py:281 msgid "Malay" msgstr "" #: picard/const/locales.py:282 msgid "Malay (Brunei)" msgstr "" #: picard/const/locales.py:284 msgid "Malayalam" msgstr "" #: picard/const/locales.py:285 msgid "Malayalam (India)" msgstr "" #: picard/const/locales.py:286 msgid "Maltese" msgstr "" #: picard/const/locales.py:287 msgid "Maltese (Malta)" msgstr "" #: picard/const/locales.py:288 msgid "Manx" msgstr "" #: picard/const/locales.py:289 msgid "Manx (United Kingdom)" msgstr "" #: picard/const/locales.py:290 msgid "Marathi" msgstr "" #: picard/const/locales.py:291 msgid "Marathi (India)" msgstr "" #: picard/const/locales.py:292 msgid "Moldavian" msgstr "" #: picard/const/locales.py:293 msgid "Mongolian" msgstr "" #: picard/const/locales.py:294 msgid "Mongolian (China)" msgstr "" #: picard/const/locales.py:295 msgid "Mongolian (Cyrillic)" msgstr "" #: picard/const/locales.py:296 msgid "Mongolian (Cyrillic) (Mongolia)" msgstr "" #: picard/const/locales.py:297 msgid "Mongolian (Mongolia)" msgstr "" #: picard/const/locales.py:298 msgid "Mongolian (Mongolian)" msgstr "" #: picard/const/locales.py:299 msgid "Mongolian (Mongolian) (China)" msgstr "" #: picard/const/locales.py:300 msgid "Nepali" msgstr "" #: picard/const/locales.py:301 msgid "Nepali (India)" msgstr "" #: picard/const/locales.py:302 msgid "Nepali (Nepal)" msgstr "" #: picard/const/locales.py:303 msgid "Northern Sami" msgstr "" #: picard/const/locales.py:304 msgid "Northern Sami (Finland)" msgstr "" #: picard/const/locales.py:305 msgid "Northern Sami (Norway)" msgstr "" #: picard/const/locales.py:306 msgid "Northern Sotho" msgstr "" #: picard/const/locales.py:307 msgid "Northern Sotho (South Africa)" msgstr "" #: picard/const/locales.py:308 msgid "Norwegian" msgstr "النرويجية" #: picard/const/locales.py:310 msgid "Norwegian Bokmål (Norway)" msgstr "" #: picard/const/locales.py:311 msgid "Norwegian Nynorsk" msgstr "" #: picard/const/locales.py:312 msgid "Norwegian Nynorsk (Norway)" msgstr "" #: picard/const/locales.py:313 msgid "Nyanja" msgstr "" #: picard/const/locales.py:314 msgid "Nyanja (Malawi)" msgstr "" #: picard/const/locales.py:316 msgid "Occitan (France)" msgstr "" #: picard/const/locales.py:317 msgid "Oriya" msgstr "" #: picard/const/locales.py:318 msgid "Oriya (India)" msgstr "" #: picard/const/locales.py:319 msgid "Oromo" msgstr "" #: picard/const/locales.py:320 msgid "Oromo (Ethiopia)" msgstr "" #: picard/const/locales.py:321 msgid "Oromo (Kenya)" msgstr "" #: picard/const/locales.py:322 msgid "Pashto" msgstr "" #: picard/const/locales.py:323 msgid "Pashto (Afghanistan)" msgstr "" #: picard/const/locales.py:324 msgid "Persian" msgstr "" #: picard/const/locales.py:325 msgid "Persian (Afghanistan)" msgstr "" #: picard/const/locales.py:326 msgid "Persian (Iran)" msgstr "" #: picard/const/locales.py:328 msgid "Polish (Poland)" msgstr "" #: picard/const/locales.py:330 msgid "Portuguese (Brazil)" msgstr "" #: picard/const/locales.py:331 msgid "Portuguese (Portugal)" msgstr "" #: picard/const/locales.py:332 msgid "Punjabi" msgstr "" #: picard/const/locales.py:333 msgid "Punjabi (Arabic)" msgstr "" #: picard/const/locales.py:334 msgid "Punjabi (Arabic) (Pakistan)" msgstr "" #: picard/const/locales.py:335 msgid "Punjabi (Gurmukhi)" msgstr "" #: picard/const/locales.py:336 msgid "Punjabi (Gurmukhi) (India)" msgstr "" #: picard/const/locales.py:337 msgid "Punjabi (India)" msgstr "" #: picard/const/locales.py:338 msgid "Punjabi (Pakistan)" msgstr "" #: picard/const/locales.py:340 msgid "Romanian (Moldova)" msgstr "" #: picard/const/locales.py:341 msgid "Romanian (Romania)" msgstr "" #: picard/const/locales.py:343 msgid "Russian (Russia)" msgstr "" #: picard/const/locales.py:344 msgid "Russian (Ukraine)" msgstr "" #: picard/const/locales.py:345 msgid "Sanskrit" msgstr "" #: picard/const/locales.py:346 msgid "Sanskrit (India)" msgstr "" #: picard/const/locales.py:347 picard/const/locales.py:348 msgid "Serbian" msgstr "" #: picard/const/locales.py:349 msgid "Serbian (Bosnia and Herzegovina)" msgstr "" #: picard/const/locales.py:350 picard/const/locales.py:351 msgid "Serbian (Cyrillic)" msgstr "" #: picard/const/locales.py:352 msgid "Serbian (Cyrillic) (Bosnia and Herzegovina)" msgstr "" #: picard/const/locales.py:353 msgid "Serbian (Cyrillic) (Montenegro)" msgstr "" #: picard/const/locales.py:354 msgid "Serbian (Cyrillic) (Serbia)" msgstr "" #: picard/const/locales.py:355 msgid "Serbian (Cyrillic) (Serbia and Montenegro)" msgstr "" #: picard/const/locales.py:356 picard/const/locales.py:357 msgid "Serbian (Latin)" msgstr "" #: picard/const/locales.py:358 msgid "Serbian (Latin) (Bosnia and Herzegovina)" msgstr "" #: picard/const/locales.py:359 msgid "Serbian (Latin) (Montenegro)" msgstr "" #: picard/const/locales.py:360 msgid "Serbian (Latin) (Serbia)" msgstr "" #: picard/const/locales.py:361 msgid "Serbian (Latin) (Serbia and Montenegro)" msgstr "" #: picard/const/locales.py:362 msgid "Serbian (Montenegro)" msgstr "" #: picard/const/locales.py:363 msgid "Serbian (Serbia)" msgstr "" #: picard/const/locales.py:364 msgid "Serbian (Serbia and Montenegro)" msgstr "" #: picard/const/locales.py:365 picard/const/locales.py:366 msgid "Serbo-Croatian" msgstr "" #: picard/const/locales.py:367 msgid "Serbo-Croatian (Bosnia and Herzegovina)" msgstr "" #: picard/const/locales.py:368 msgid "Serbo-Croatian (Serbia and Montenegro)" msgstr "" #: picard/const/locales.py:369 msgid "Sichuan Yi" msgstr "" #: picard/const/locales.py:370 msgid "Sichuan Yi (China)" msgstr "" #: picard/const/locales.py:371 msgid "Sidamo" msgstr "" #: picard/const/locales.py:372 msgid "Sidamo (Ethiopia)" msgstr "" #: picard/const/locales.py:373 msgid "Sinhala" msgstr "" #: picard/const/locales.py:374 msgid "Sinhala (Sri Lanka)" msgstr "" #: picard/const/locales.py:376 msgid "Slovak (Slovakia)" msgstr "" #: picard/const/locales.py:378 msgid "Slovenian (Slovenia)" msgstr "" #: picard/const/locales.py:379 msgid "Somali" msgstr "" #: picard/const/locales.py:380 msgid "Somali (Djibouti)" msgstr "" #: picard/const/locales.py:381 msgid "Somali (Ethiopia)" msgstr "" #: picard/const/locales.py:382 msgid "Somali (Kenya)" msgstr "" #: picard/const/locales.py:383 msgid "Somali (Somalia)" msgstr "" #: picard/const/locales.py:384 msgid "South Ndebele" msgstr "" #: picard/const/locales.py:385 msgid "South Ndebele (South Africa)" msgstr "" #: picard/const/locales.py:386 msgid "Southern Sotho" msgstr "" #: picard/const/locales.py:387 msgid "Southern Sotho (Lesotho)" msgstr "" #: picard/const/locales.py:388 msgid "Southern Sotho (South Africa)" msgstr "" #: picard/const/locales.py:390 msgid "Spanish (Argentina)" msgstr "" #: picard/const/locales.py:391 msgid "Spanish (Bolivia)" msgstr "" #: picard/const/locales.py:392 msgid "Spanish (Chile)" msgstr "" #: picard/const/locales.py:393 msgid "Spanish (Colombia)" msgstr "" #: picard/const/locales.py:394 msgid "Spanish (Costa Rica)" msgstr "" #: picard/const/locales.py:395 msgid "Spanish (Dominican Republic)" msgstr "" #: picard/const/locales.py:396 msgid "Spanish (Ecuador)" msgstr "" #: picard/const/locales.py:397 msgid "Spanish (El Salvador)" msgstr "" #: picard/const/locales.py:398 msgid "Spanish (Guatemala)" msgstr "" #: picard/const/locales.py:399 msgid "Spanish (Honduras)" msgstr "" #: picard/const/locales.py:400 msgid "Spanish (Mexico)" msgstr "" #: picard/const/locales.py:401 msgid "Spanish (Nicaragua)" msgstr "" #: picard/const/locales.py:402 msgid "Spanish (Panama)" msgstr "" #: picard/const/locales.py:403 msgid "Spanish (Paraguay)" msgstr "" #: picard/const/locales.py:404 msgid "Spanish (Peru)" msgstr "" #: picard/const/locales.py:405 msgid "Spanish (Puerto Rico)" msgstr "" #: picard/const/locales.py:406 msgid "Spanish (Spain)" msgstr "" #: picard/const/locales.py:407 msgid "Spanish (United States)" msgstr "" #: picard/const/locales.py:408 msgid "Spanish (Uruguay)" msgstr "" #: picard/const/locales.py:409 msgid "Spanish (Venezuela)" msgstr "" #: picard/const/locales.py:410 msgid "Swahili" msgstr "" #: picard/const/locales.py:411 msgid "Swahili (Kenya)" msgstr "" #: picard/const/locales.py:412 msgid "Swahili (Tanzania)" msgstr "" #: picard/const/locales.py:413 msgid "Swati" msgstr "" #: picard/const/locales.py:414 msgid "Swati (South Africa)" msgstr "" #: picard/const/locales.py:415 msgid "Swati (Swaziland)" msgstr "" #: picard/const/locales.py:417 msgid "Swedish (Finland)" msgstr "" #: picard/const/locales.py:418 msgid "Swedish (Sweden)" msgstr "" #: picard/const/locales.py:419 msgid "Swiss German" msgstr "" #: picard/const/locales.py:420 msgid "Swiss German (Switzerland)" msgstr "" #: picard/const/locales.py:421 msgid "Syriac" msgstr "" #: picard/const/locales.py:422 msgid "Syriac (Syria)" msgstr "" #: picard/const/locales.py:423 msgid "Tagalog" msgstr "" #: picard/const/locales.py:424 msgid "Tajik" msgstr "" #: picard/const/locales.py:425 msgid "Tajik (Cyrillic)" msgstr "" #: picard/const/locales.py:426 msgid "Tajik (Cyrillic) (Tajikistan)" msgstr "" #: picard/const/locales.py:427 msgid "Tajik (Tajikistan)" msgstr "" #: picard/const/locales.py:428 msgid "Tamil" msgstr "" #: picard/const/locales.py:429 msgid "Tamil (India)" msgstr "" #: picard/const/locales.py:430 msgid "Taroko" msgstr "" #: picard/const/locales.py:431 msgid "Taroko (Taiwan)" msgstr "" #: picard/const/locales.py:432 msgid "Tatar" msgstr "" #: picard/const/locales.py:433 msgid "Tatar (Russia)" msgstr "" #: picard/const/locales.py:434 msgid "Telugu" msgstr "" #: picard/const/locales.py:435 msgid "Telugu (India)" msgstr "" #: picard/const/locales.py:436 msgid "Thai" msgstr "" #: picard/const/locales.py:437 msgid "Thai (Thailand)" msgstr "" #: picard/const/locales.py:438 msgid "Tibetan" msgstr "" #: picard/const/locales.py:439 msgid "Tibetan (China)" msgstr "" #: picard/const/locales.py:440 msgid "Tibetan (India)" msgstr "" #: picard/const/locales.py:441 msgid "Tigre" msgstr "" #: picard/const/locales.py:442 msgid "Tigre (Eritrea)" msgstr "" #: picard/const/locales.py:443 msgid "Tigrinya" msgstr "" #: picard/const/locales.py:444 msgid "Tigrinya (Eritrea)" msgstr "" #: picard/const/locales.py:445 msgid "Tigrinya (Ethiopia)" msgstr "" #: picard/const/locales.py:446 msgid "Tonga" msgstr "تونجا" #: picard/const/locales.py:447 msgid "Tonga (Tonga)" msgstr "" #: picard/const/locales.py:448 msgid "Tsonga" msgstr "" #: picard/const/locales.py:449 msgid "Tsonga (South Africa)" msgstr "" #: picard/const/locales.py:450 msgid "Tswana" msgstr "" #: picard/const/locales.py:451 msgid "Tswana (South Africa)" msgstr "" #: picard/const/locales.py:453 msgid "Turkish (Turkey)" msgstr "" #: picard/const/locales.py:454 msgid "Tyap" msgstr "" #: picard/const/locales.py:455 msgid "Tyap (Nigeria)" msgstr "" #: picard/const/locales.py:456 msgid "Uighur" msgstr "" #: picard/const/locales.py:457 msgid "Uighur (Arabic)" msgstr "" #: picard/const/locales.py:458 msgid "Uighur (Arabic) (China)" msgstr "" #: picard/const/locales.py:459 msgid "Uighur (China)" msgstr "" #: picard/const/locales.py:461 msgid "Ukrainian (Ukraine)" msgstr "" #: picard/const/locales.py:462 msgid "Urdu" msgstr "" #: picard/const/locales.py:463 msgid "Urdu (India)" msgstr "" #: picard/const/locales.py:464 msgid "Urdu (Pakistan)" msgstr "" #: picard/const/locales.py:465 msgid "Uzbek" msgstr "" #: picard/const/locales.py:466 msgid "Uzbek (Afghanistan)" msgstr "" #: picard/const/locales.py:467 msgid "Uzbek (Arabic)" msgstr "" #: picard/const/locales.py:468 msgid "Uzbek (Arabic) (Afghanistan)" msgstr "" #: picard/const/locales.py:469 msgid "Uzbek (Cyrillic)" msgstr "" #: picard/const/locales.py:470 msgid "Uzbek (Cyrillic) (Uzbekistan)" msgstr "" #: picard/const/locales.py:471 msgid "Uzbek (Latin)" msgstr "" #: picard/const/locales.py:472 msgid "Uzbek (Latin) (Uzbekistan)" msgstr "" #: picard/const/locales.py:473 msgid "Uzbek (Uzbekistan)" msgstr "" #: picard/const/locales.py:474 msgid "Venda" msgstr "" #: picard/const/locales.py:475 msgid "Venda (South Africa)" msgstr "" #: picard/const/locales.py:476 msgid "Vietnamese" msgstr "" #: picard/const/locales.py:477 msgid "Vietnamese (Vietnam)" msgstr "" #: picard/const/locales.py:478 msgid "Walamo" msgstr "" #: picard/const/locales.py:479 msgid "Walamo (Ethiopia)" msgstr "" #: picard/const/locales.py:480 msgid "Welsh" msgstr "" #: picard/const/locales.py:481 msgid "Welsh (United Kingdom)" msgstr "" #: picard/const/locales.py:482 msgid "Wolof" msgstr "" #: picard/const/locales.py:483 msgid "Wolof (Latin)" msgstr "" #: picard/const/locales.py:484 msgid "Wolof (Latin) (Senegal)" msgstr "" #: picard/const/locales.py:485 msgid "Wolof (Senegal)" msgstr "" #: picard/const/locales.py:486 msgid "Xhosa" msgstr "" #: picard/const/locales.py:487 msgid "Xhosa (South Africa)" msgstr "" #: picard/const/locales.py:488 msgid "Yoruba" msgstr "" #: picard/const/locales.py:489 msgid "Yoruba (Nigeria)" msgstr "" #: picard/const/locales.py:490 msgid "Zulu" msgstr "" #: picard/const/locales.py:491 msgid "Zulu (South Africa)" msgstr "" #: picard/coverart/__init__.py:108 #, python-format msgid "Cover art of type '%(type)s' downloaded for %(albumid)s from %(host)s" msgstr "" #: picard/coverart/__init__.py:196 #, python-format msgid "" "Downloading cover art of type '%(type)s' for %(albumid)s from %(host)s ..." msgstr "" #: picard/coverart/utils.py:37 msgid "Unknown" msgstr "" #: picard/coverart/providers/caa.py:78 msgid "250 px" msgstr "250 بكسل" #: picard/coverart/providers/caa.py:79 msgid "500 px" msgstr "500 بكسل" #: picard/coverart/providers/caa.py:80 msgid "1200 px" msgstr "1200 بكسل" #: picard/coverart/providers/caa.py:81 msgid "Full size" msgstr "المقاس الكامل" #: picard/coverart/providers/caa.py:227 msgid "Cover art types" msgstr "" #: picard/coverart/providers/caa.py:247 msgid "" "Please select the contents of the image type 'Include' and 'Exclude' lists." msgstr "" #: picard/coverart/providers/caa.py:268 msgid "Include types list" msgstr "" #: picard/coverart/providers/caa.py:282 msgid "Exclude types list" msgstr "" #: picard/coverart/providers/caa.py:290 msgid "" "CAA images with an image type found in the 'Include' list will be downloaded" " and used UNLESS they also have an image type found in the 'Exclude' list. " "Images with types found in the 'Exclude' list will NEVER be used. Image " "types not appearing in the 'Include' or 'Exclude' lists will not be " "considered when determining whether or not to download and use a CAA " "image.\n" msgstr "" #: picard/coverart/providers/caa.py:311 msgid "I&nclude all" msgstr "" #: picard/coverart/providers/caa.py:312 msgid "E&xclude all" msgstr "" #: picard/coverart/providers/caa.py:313 msgid "C&lear all" msgstr "" #: picard/coverart/providers/caa.py:314 picard/ui/options/dialog.py:117 msgid "Restore &Defaults" msgstr "استعد المب&دئيات" #: picard/coverart/providers/caa.py:498 msgid "Cover Art Archive" msgstr "" #: picard/coverart/providers/caa_release_group.py:43 msgid "CAA Release Group" msgstr "" #: picard/coverart/providers/local.py:73 msgid "Local Files" msgstr "" #: picard/coverart/providers/whitelist.py:39 msgid "Whitelist" msgstr "" #: picard/ui/cdlookup.py:72 picard/ui/itemviews.py:155 #: picard/ui/mainwindow.py:792 picard/util/tags.py:38 msgid "Album" msgstr "الألبوم" #: picard/ui/cdlookup.py:72 picard/ui/itemviews.py:152 #: picard/ui/mainwindow.py:793 picard/ui/searchdialog/album.py:153 #: picard/ui/searchdialog/track.py:65 picard/util/tags.py:41 msgid "Artist" msgstr "الفنّان" #: picard/ui/cdlookup.py:72 picard/ui/searchdialog/album.py:156 #: picard/ui/searchdialog/track.py:67 picard/util/tags.py:54 msgid "Date" msgstr "التاريخ" #: picard/ui/cdlookup.py:73 picard/ui/searchdialog/album.py:158 msgid "Labels" msgstr "" #: picard/ui/cdlookup.py:73 picard/ui/searchdialog/album.py:159 msgid "Catalog #s" msgstr "" #: picard/ui/cdlookup.py:73 picard/ui/itemviews.py:160 #: picard/ui/searchdialog/album.py:160 picard/util/tags.py:45 msgid "Barcode" msgstr "" #: picard/ui/collectionmenu.py:61 msgid "Refresh List" msgstr "أنعِش القائمة" #: picard/ui/collectionmenu.py:174 #, python-format msgid "%s (%i release)" msgid_plural "%s (%i releases)" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/colors.py:36 msgid "Errored entity" msgstr "" #: picard/ui/colors.py:37 msgid "Pending entity" msgstr "" #: picard/ui/colors.py:38 msgid "Saved entity" msgstr "" #: picard/ui/colors.py:39 msgid "Log view text (debug)" msgstr "" #: picard/ui/colors.py:40 msgid "Log view text (error)" msgstr "" #: picard/ui/colors.py:41 msgid "Log view text (info)" msgstr "" #: picard/ui/colors.py:42 msgid "Log view text (warning)" msgstr "" #: picard/ui/colors.py:43 msgid "Tag added" msgstr "" #: picard/ui/colors.py:44 msgid "Tag changed" msgstr "" #: picard/ui/colors.py:45 msgid "Tag removed" msgstr "" #: picard/ui/coverartbox.py:277 msgid "View release on MusicBrainz" msgstr "اعرض الإصدار على MusicBrainz" #: picard/ui/coverartbox.py:283 msgid "Common images on all tracks" msgstr "" #: picard/ui/coverartbox.py:285 msgid "Tracks contain different images" msgstr "تحتوي المقطوعات صورا مختلفة" #: picard/ui/coverartbox.py:329 msgid "Show more details" msgstr "اعرض تفاصيل أكثر" #: picard/ui/coverartbox.py:366 msgid "New Cover Art" msgstr "" #: picard/ui/coverartbox.py:367 msgid "Original Cover Art" msgstr "" #: picard/ui/coverartbox.py:542 msgid "Show more details..." msgstr "اعرض تفاصيل أكثر..." #: picard/ui/coverartbox.py:548 msgid "Keep original cover art" msgstr "" #: picard/ui/coverartbox.py:557 msgid "Replace front cover art on drop" msgstr "" #: picard/ui/coverartbox.py:565 msgid "Append front cover art on drop" msgstr "" #: picard/ui/edittagdialog.py:67 msgid "YYYY-MM-DD" msgstr "" #: picard/ui/edittagdialog.py:69 msgid "YYYY" msgstr "" #: picard/ui/filebrowser.py:60 msgid "&Move Tagged Files Here" msgstr "ا&نقل الملفات الموسومة هنا" #: picard/ui/filebrowser.py:63 msgid "Show &Hidden Files" msgstr "اعرض الملفات الم&خفية" #: picard/ui/filebrowser.py:68 msgid "&Set as starting directory" msgstr "ا&ضبط كدليل البدء" #: picard/ui/infodialog.py:100 msgid "Existing Cover" msgstr "" #: picard/ui/infodialog.py:100 picard/ui/infodialog.py:105 #: picard/ui/searchdialog/album.py:162 picard/ui/searchdialog/artist.py:53 #: picard/ui/searchdialog/track.py:69 msgid "Type" msgstr "النوع" #: picard/ui/infodialog.py:101 msgid "New Cover" msgstr "" #: picard/ui/infodialog.py:105 picard/ui/searchdialog/album.py:164 msgid "Cover" msgstr "الغلاف" #: picard/ui/infodialog.py:151 picard/ui/infodialog.py:294 #: picard/ui/options/interface.py:96 msgid "Info" msgstr "معلومات" #: picard/ui/infodialog.py:195 #, python-format msgid "" "Double-click to open in external viewer\n" "Temporary file: %s\n" "Source: %s" msgstr "" #: picard/ui/infodialog.py:261 msgid "Filename:" msgstr "اسم الملف" #: picard/ui/infodialog.py:263 msgid "Format:" msgstr "النسق:" #: picard/ui/infodialog.py:267 msgid "Size:" msgstr "الحجم:" #: picard/ui/infodialog.py:271 msgid "Length:" msgstr "الطول:" #: picard/ui/infodialog.py:273 msgid "Bitrate:" msgstr "معدّل البت:" #: picard/ui/infodialog.py:275 msgid "Sample rate:" msgstr "" #: picard/ui/infodialog.py:277 msgid "Bits per sample:" msgstr "" #: picard/ui/infodialog.py:281 msgid "Mono" msgstr "" #: picard/ui/infodialog.py:283 msgid "Stereo" msgstr "" #: picard/ui/infodialog.py:284 msgid "Channels:" msgstr "القنوات:" #: picard/ui/infodialog.py:306 msgid "Album Info" msgstr "معلومات الألبو" #: picard/ui/infodialog.py:314 msgid "&Errors" msgstr "الأ&خطاء" #: picard/ui/infodialog.py:324 picard/ui/infodialog.py:340 #: picard/ui/infodialog.py:344 picard/ui/infodialog.py:363 #: picard/ui/ui_infodialog.py:59 msgid "&Info" msgstr "م&علوما" #: picard/ui/infodialog.py:332 msgid "Track Info" msgstr "معلومات الوسيط" #: picard/ui/infodialog.py:345 #, python-format msgid "%i file in this track" msgid_plural "%i files in this track" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/infodialog.py:356 msgid "Cluster Info" msgstr "" #: picard/ui/infodialog.py:365 msgid "Album:" msgstr "الألبوم:" #: picard/ui/infodialog.py:367 msgid "Artist:" msgstr "الفنان:" #: picard/ui/infodialog.py:390 msgid "Tracklist:" msgstr "قائمة المقطوعات:" #: picard/ui/infostatus.py:61 picard/ui/options/plugins.py:600 msgid "Files" msgstr "الملفات" #: picard/ui/infostatus.py:62 msgid "Albums" msgstr "الألبومات" #: picard/ui/infostatus.py:63 msgid "Pending files" msgstr "الملفات المرجأة" #: picard/ui/infostatus.py:64 msgid "Pending requests" msgstr "الطلبات المرجأة" #: picard/ui/itemviews.py:150 picard/util/tags.py:114 msgid "Title" msgstr "العنوان" #: picard/ui/itemviews.py:151 picard/ui/searchdialog/track.py:64 #: picard/util/tags.py:68 msgid "Length" msgstr "الطول" #: picard/ui/itemviews.py:153 picard/util/tags.py:36 msgid "Album Artist" msgstr "فنّان الألبوم" #: picard/ui/itemviews.py:154 picard/util/tags.py:50 msgid "Composer" msgstr "الملحّن" #: picard/ui/itemviews.py:156 picard/util/tags.py:57 msgid "Disc Subtitle" msgstr "" #: picard/ui/itemviews.py:157 msgid "Track No." msgstr "" #: picard/ui/itemviews.py:158 msgid "Disc No." msgstr "" #: picard/ui/itemviews.py:159 msgid "Catalog No." msgstr "" #: picard/ui/itemviews.py:161 picard/util/tags.py:72 msgid "Media" msgstr "الوسيط" #: picard/ui/itemviews.py:162 picard/util/tags.py:62 msgid "Genre" msgstr "النوع" #: picard/ui/itemviews.py:163 msgid "Fingerprint status" msgstr "" #: picard/ui/itemviews.py:236 msgid "Bad match" msgstr "مطابقة سيئة" #: picard/ui/itemviews.py:237 msgid "Poor match" msgstr "مطابقة ضعيفة" #: picard/ui/itemviews.py:238 msgid "Ok match" msgstr "مطابقة لا بأس بها" #: picard/ui/itemviews.py:239 msgid "Good match" msgstr "مطابقة جيد" #: picard/ui/itemviews.py:240 msgid "Great match" msgstr "مطابقة رائعة" #: picard/ui/itemviews.py:241 msgid "Excellent match" msgstr "مطابقة ممتازة" #: picard/ui/itemviews.py:374 msgid "Restore default columns" msgstr "" #: picard/ui/itemviews.py:417 msgid "&Expand all" msgstr "و&سّع الكل" #: picard/ui/itemviews.py:419 msgid "&Collapse all" msgstr "ا&طوِ الكل" #: picard/ui/itemviews.py:421 msgid "Select &all" msgstr "حدّد ال&كل" #: picard/ui/itemviews.py:423 msgid "Ctrl+A" msgstr "Ctrl+A" #: picard/ui/itemviews.py:496 msgid "&Other versions" msgstr "إصدارات أ&خرى" #: picard/ui/itemviews.py:499 msgid "Loading..." msgstr "يحمّل..." #: picard/ui/itemviews.py:551 #, python-format msgid "&Other versions (%d)" msgstr "" #: picard/ui/itemviews.py:575 msgid "Collections" msgstr "التجميعات" #: picard/ui/itemviews.py:583 msgid "P&lugins" msgstr "الملح&قات" #: picard/ui/itemviews.py:599 msgid "&Run scripts" msgstr "" #: picard/ui/itemviews.py:779 msgid "file view" msgstr "" #: picard/ui/itemviews.py:780 msgid "Contains unmatched files and clusters" msgstr "" #: picard/ui/itemviews.py:800 msgid "Clusters" msgstr "" #: picard/ui/itemviews.py:809 msgid "album view" msgstr "" #: picard/ui/itemviews.py:810 msgid "Contains albums and matched files" msgstr "" #: picard/ui/itemviews.py:928 picard/ui/options/renaming.py:219 msgid "Error" msgstr "" #: picard/ui/itemviews.py:932 msgid "Album modified and complete" msgstr "" #: picard/ui/itemviews.py:935 msgid "Album unchanged and complete" msgstr "" #: picard/ui/itemviews.py:939 msgid "Album modified" msgstr "تعدّل الألبوم" #: picard/ui/itemviews.py:942 msgid "Album unchanged" msgstr "لم يتغيّر الألبوم" #: picard/ui/itemviews.py:1081 msgid "Track saved" msgstr "حُفظت المقطوعة" #: picard/ui/itemviews.py:1083 picard/ui/itemviews.py:1087 msgid "Pending" msgstr "" #: picard/ui/itemviews.py:1093 msgid "Fingerprint has already been submitted" msgstr "" #: picard/ui/itemviews.py:1095 msgid "Unsubmitted fingerprint" msgstr "" #: picard/ui/itemviews.py:1097 msgid "" "No fingerprint was calculated for this file, use \"Scan\" or \"Generate " "AcoustID Fingerprints\" to calculate the fingerprint." msgstr "" #: picard/ui/logview.py:159 msgid "Log" msgstr "" #: picard/ui/logview.py:169 msgid "Verbosity" msgstr "" #: picard/ui/logview.py:179 msgid "String to highlight" msgstr "" #: picard/ui/logview.py:184 msgid "Highlight" msgstr "" #: picard/ui/logview.py:193 msgid "Clear Highlight" msgstr "" #: picard/ui/logview.py:199 picard/ui/logview.py:280 msgid "Clear Log" msgstr "" #: picard/ui/logview.py:204 msgid "Save As..." msgstr "" #: picard/ui/logview.py:249 picard/ui/logview.py:256 msgid "Save Log View to File" msgstr "" #: picard/ui/logview.py:257 msgid "File already exists, do you really want to save to this file?" msgstr "" #: picard/ui/logview.py:269 msgid "Failed to save Log View to file" msgstr "" #: picard/ui/logview.py:270 #, python-format msgid "Something prevented data to be written to '%s'" msgstr "" #: picard/ui/logview.py:281 msgid "Are you sure you want to clear the log?" msgstr "" #: picard/ui/logview.py:315 msgid "Activity History" msgstr "تأريخ النشاط" #: picard/ui/mainwindow.py:153 msgid "MusicBrainz Picard" msgstr "" #: picard/ui/mainwindow.py:261 msgid "Unsaved Changes" msgstr "تغييرات غير محفوظة" #: picard/ui/mainwindow.py:262 msgid "Are you sure you want to quit Picard?" msgstr "أمتأكّد من إنهاء Picard؟" #: picard/ui/mainwindow.py:263 #, python-format msgid "" "There is %d unsaved file. Closing Picard will lose all unsaved changes." msgid_plural "" "There are %d unsaved files. Closing Picard will lose all unsaved changes." msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/mainwindow.py:270 msgid "&Quit Picard" msgstr "أ&نهِ Picard" #: picard/ui/mainwindow.py:308 msgid "Ready" msgstr "جاهز" #: picard/ui/mainwindow.py:312 msgid "" "Picard listens on this port to integrate with your browser. When you " "\"Search\" or \"Open in Browser\" from Picard, clicking the \"Tagger\" " "button on the web page loads the release into Picard." msgstr "" #: picard/ui/mainwindow.py:339 #, python-format msgid " Listening on port %(port)d " msgstr "يستمع إلى المنفذ %(port)d" #: picard/ui/mainwindow.py:395 msgid "Submission Error" msgstr "عُطل في الإرسال" #: picard/ui/mainwindow.py:396 msgid "" "You need to configure your AcoustID API key before you can submit " "fingerprints." msgstr "" #: picard/ui/mainwindow.py:401 msgid "&Options..." msgstr "&خيارات..." #: picard/ui/mainwindow.py:405 msgid "&Cut" msgstr "&قص" #: picard/ui/mainwindow.py:410 msgid "&Paste" msgstr "أل&صِق" #: picard/ui/mainwindow.py:415 msgid "&Help..." msgstr "م&ساعدة..." #: picard/ui/mainwindow.py:419 msgid "&About..." msgstr "&عن..." #: picard/ui/mainwindow.py:423 msgid "&Donate..." msgstr "&تبرّع..." #: picard/ui/mainwindow.py:426 msgid "&Report a Bug..." msgstr "أبلِ&غ عن علة..." #: picard/ui/mainwindow.py:429 msgid "&Support Forum..." msgstr "منتدى ال&دعم..." #: picard/ui/mainwindow.py:432 msgid "&Add Files..." msgstr "أ&ضِف ملفات..." #: picard/ui/mainwindow.py:433 msgid "Add files to the tagger" msgstr "" #: picard/ui/mainwindow.py:438 msgid "Add Fold&er..." msgstr "أضِ&ف مجلدا..." #: picard/ui/mainwindow.py:439 msgid "Add a folder to the tagger" msgstr "" #: picard/ui/mainwindow.py:441 msgid "Ctrl+E" msgstr "Ctrl+E" #: picard/ui/mainwindow.py:445 msgid "Close Window" msgstr "" #: picard/ui/mainwindow.py:446 msgid "Ctrl+W" msgstr "Ctrl+W" #: picard/ui/mainwindow.py:449 msgid "&Save" msgstr "احف&ظ" #: picard/ui/mainwindow.py:450 msgid "Save selected files" msgstr "احفظ الملفات المحددة" #: picard/ui/mainwindow.py:456 msgid "S&ubmit AcoustIDs" msgstr "" #: picard/ui/mainwindow.py:457 msgid "Submit acoustic fingerprints" msgstr "" #: picard/ui/mainwindow.py:461 msgid "E&xit" msgstr "ا&خرج" #: picard/ui/mainwindow.py:464 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: picard/ui/mainwindow.py:467 msgid "&Remove" msgstr "أ&زِل" #: picard/ui/mainwindow.py:468 msgid "Remove selected files/albums" msgstr "أزِل الملفات/الألبومات المحددة" #: picard/ui/mainwindow.py:472 picard/ui/metadatabox.py:345 #: picard/ui/ui_cdlookup.py:90 msgid "Lookup in &Browser" msgstr "" #: picard/ui/mainwindow.py:473 msgid "Lookup selected item on MusicBrainz website" msgstr "ابحث عن العنصر المحدّد في موقع MusicBrainz" #: picard/ui/mainwindow.py:476 msgid "Ctrl+Shift+L" msgstr "Ctrl+Shift+L" #: picard/ui/mainwindow.py:479 msgid "Search for similar albums..." msgstr "ابحث عن ألبومات مشابهة..." #: picard/ui/mainwindow.py:480 msgid "View similar releases and optionally choose a different release" msgstr "اعرض الإصدارات المشابهة واختر إصدارا مختلفا إن أرد" #: picard/ui/mainwindow.py:483 msgid "Search for similar tracks..." msgstr "ابحث عن مقطوعات مشابهة..." #: picard/ui/mainwindow.py:484 msgid "View similar tracks and optionally choose a different release" msgstr "اعرض المقطوعات المشابهة واختر إصدارا مختلفا إن أرد" #: picard/ui/mainwindow.py:487 msgid "File &Browser" msgstr "مت&صفّح الملفات" #: picard/ui/mainwindow.py:491 msgid "Ctrl+B" msgstr "Ctrl+B" #: picard/ui/mainwindow.py:494 msgid "&Cover Art" msgstr "" #: picard/ui/mainwindow.py:500 msgid "&Actions" msgstr "الإجرا&ءات" #: picard/ui/mainwindow.py:506 picard/ui/mainwindow.py:786 #: picard/ui/searchdialog/__init__.py:88 msgid "Search" msgstr "" #: picard/ui/mainwindow.py:510 picard/ui/mainwindow.py:516 msgid "Lookup &CD..." msgstr "" #: picard/ui/mainwindow.py:511 msgid "Lookup the details of the CD in your drive" msgstr "" #: picard/ui/mainwindow.py:513 picard/ui/mainwindow.py:637 msgid "Ctrl+K" msgstr "Ctrl+K" #: picard/ui/mainwindow.py:524 msgid "&Scan" msgstr "ا&فحص" #: picard/ui/mainwindow.py:525 msgid "" "Use AcoustID audio fingerprint to identify the files by the actual music, " "even if they have no metadata" msgstr "" #: picard/ui/mainwindow.py:527 msgid "Identify the file using its AcoustID audio fingerprint" msgstr "" #: picard/ui/mainwindow.py:529 msgid "Ctrl+Y" msgstr "Ctrl+Y" #: picard/ui/mainwindow.py:532 msgid "&Generate AcoustID Fingerprints" msgstr "" #: picard/ui/mainwindow.py:533 picard/ui/options/interface.py:108 msgid "Generate Fingerprints" msgstr "" #: picard/ui/mainwindow.py:534 msgid "" "Generate the AcoustID audio fingerprints for the selected files without " "doing a lookup" msgstr "" #: picard/ui/mainwindow.py:536 msgid "Generate the AcoustID audio fingerprints for the selected files" msgstr "" #: picard/ui/mainwindow.py:537 msgid "Ctrl+Shift+Y" msgstr "Ctrl+Shift+Y" #: picard/ui/mainwindow.py:540 msgid "Cl&uster" msgstr "" #: picard/ui/mainwindow.py:541 msgid "Cluster files into album clusters" msgstr "" #: picard/ui/mainwindow.py:544 msgid "Ctrl+U" msgstr "Ctrl+U" #: picard/ui/mainwindow.py:547 msgid "&Lookup" msgstr "اب&حث" #: picard/ui/mainwindow.py:548 msgid "Lookup selected items in MusicBrainz" msgstr "ابحث عن العناصر المحدّدة في MusicBrainz" #: picard/ui/mainwindow.py:553 msgid "Ctrl+L" msgstr "Ctrl+L" #: picard/ui/mainwindow.py:556 msgid "&Info..." msgstr "م&علومات..." #: picard/ui/mainwindow.py:559 msgid "Ctrl+I" msgstr "Ctrl+I" #: picard/ui/mainwindow.py:562 msgid "&Refresh" msgstr "أن&عِش" #: picard/ui/mainwindow.py:563 msgid "Ctrl+R" msgstr "Ctrl+R" #: picard/ui/mainwindow.py:566 msgid "&Rename Files" msgstr "&غيّر أسماء الملفات" #: picard/ui/mainwindow.py:571 msgid "&Move Files" msgstr "" #: picard/ui/mainwindow.py:576 msgid "Save &Tags" msgstr "احفظ الو&سوم" #: picard/ui/mainwindow.py:581 msgid "Tags From &File Names..." msgstr "الوسوم من أسماء المل&فات..." #: picard/ui/mainwindow.py:585 msgid "&Open My Collections in Browser" msgstr "ا&فتح تجميعاتي في المتصفّح" #: picard/ui/mainwindow.py:589 msgid "View &Error/Debug Log" msgstr "" #: picard/ui/mainwindow.py:592 msgid "Ctrl+G" msgstr "Ctrl+G" #: picard/ui/mainwindow.py:594 msgid "View Activity &History" msgstr "اعرض &تأريخ النشاط" #: picard/ui/mainwindow.py:597 msgid "Ctrl+H" msgstr "Ctrl+H" #: picard/ui/mainwindow.py:603 msgid "Open in &Player" msgstr "افتح في المش&غّل" #: picard/ui/mainwindow.py:604 msgid "Play the file in your default media player" msgstr "شغّل الملف بمشغّل الوسائط المبدئي" #: picard/ui/mainwindow.py:608 msgid "Open Containing &Folder" msgstr "افتح المجل&د المحتوي" #: picard/ui/mainwindow.py:609 msgid "Open the containing folder in your file explorer" msgstr "افتح المجلد المحتوي في متصفّح الملفات" #: picard/ui/mainwindow.py:614 msgid "&Check for Update…" msgstr "" #: picard/ui/mainwindow.py:674 msgid "&File" msgstr "&ملف" #: picard/ui/mainwindow.py:687 msgid "&Edit" msgstr "ت&حرير" #: picard/ui/mainwindow.py:693 msgid "&View" msgstr "من&ظور" #: picard/ui/mainwindow.py:701 msgid "&Options" msgstr "&خيارات" #: picard/ui/mainwindow.py:707 msgid "&Tools" msgstr "أ&دوات" #: picard/ui/mainwindow.py:719 picard/ui/util.py:51 msgid "&Help" msgstr "م&ساعدة" #: picard/ui/mainwindow.py:754 picard/ui/ui_options_plugins.py:132 msgid "Actions" msgstr "الإجراءات" #: picard/ui/mainwindow.py:794 msgid "Track" msgstr "مقطوعة" #: picard/ui/mainwindow.py:811 msgid "&Advanced search" msgstr "" #: picard/ui/mainwindow.py:812 msgid "&Builtin search" msgstr "" #: picard/ui/mainwindow.py:901 msgid "All Supported Formats" msgstr "كل النسق المدعومة" #: picard/ui/mainwindow.py:927 #, python-format msgid "Adding multiple directories from '%(directory)s' ..." msgstr "يضيف عدة أدلة من ”%(directory)s“..." #: picard/ui/mainwindow.py:932 #, python-format msgid "Adding directory: '%(directory)s' ..." msgstr "يضيف الدليل: ”%(directory)s“..." #: picard/ui/mainwindow.py:1019 msgid "Configuration Required" msgstr "الضبط مطلوب" #: picard/ui/mainwindow.py:1020 msgid "" "Audio fingerprinting is not yet configured. Would you like to configure it " "now?" msgstr "" #: picard/ui/mainwindow.py:1135 #, python-format msgid "%(filename)s (error: %(error)s)" msgstr "" #: picard/ui/mainwindow.py:1141 #, python-format msgid "%(filename)s" msgstr "%(filename)s" #: picard/ui/mainwindow.py:1152 #, python-format msgid "%(filename)s (%(similarity)d%%) (error: %(error)s)" msgstr "" #: picard/ui/mainwindow.py:1159 #, python-format msgid "%(filename)s (%(similarity)d%%)" msgstr "" #: picard/ui/mainwindow.py:1205 msgid "Authentication Required" msgstr "الاستيثاق مطلوب" #: picard/ui/mainwindow.py:1206 msgid "" "Picard needs authorization to access your personal data on the MusicBrainz " "server. Would you like to log in now?" msgstr "يحتاج Picard استيثاقا للوصول إلى معلوماتك الشخصية في خادوم MusicBrainz. أتريد الولوج الآن؟" #: picard/ui/metadatabox.py:101 #, python-format msgid "(different across %d item)" msgid_plural "(different across %d items)" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/metadatabox.py:109 #, python-format msgid "(missing from %d item)" msgid_plural "(missing from %d items)" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #: picard/ui/metadatabox.py:197 msgid "metadata view" msgstr "" #: picard/ui/metadatabox.py:198 msgid "Displays original and new tags for the selected files" msgstr "يعرض الوسوم الأصلية والجديدة للملفات المحدد" #: picard/ui/metadatabox.py:200 msgid "Tag" msgstr "الوسم" #: picard/ui/metadatabox.py:200 msgid "Original Value" msgstr "القيمة الأصلية" #: picard/ui/metadatabox.py:200 msgid "New Value" msgstr "قيمة جديدة" #: picard/ui/metadatabox.py:220 msgid "Add New Tag..." msgstr "أضِف وسما جديدا..." #: picard/ui/metadatabox.py:222 msgid "Show Changes First" msgstr "اعرض التغييرات أولا" #: picard/ui/metadatabox.py:228 msgid "Alt+Shift+A" msgstr "Alt+Shift+A" #: picard/ui/metadatabox.py:231 msgid "Alt+Shift+E" msgstr "Alt+Shift+E" #: picard/ui/metadatabox.py:233 msgid "Alt+Shift+R" msgstr "Alt+Shift+R" #: picard/ui/metadatabox.py:321 msgid "Edit..." msgstr "حرّر..." #: picard/ui/metadatabox.py:326 msgid "Add to 'Preserve Tags' List" msgstr "أضِف إلى قائمة ”الوسوم المحجوزة“" #: picard/ui/metadatabox.py:330 msgid "Remove from 'Preserve Tags' List" msgstr "أزِل من قائمة ”الوسوم المحجوزة“" #: picard/ui/metadatabox.py:364 msgid "Use Original Value" msgid_plural "Use Original Values" msgstr[0] "استخدم القيمة الأصلية" msgstr[1] "استخدم القيمة الأصلية" msgstr[2] "استخدم القيمتين الأصليتين" msgstr[3] "استخدم القيم الأصلية" msgstr[4] "استخدم القيم الأصلية" msgstr[5] "استخدم القيم الأصلية" #: picard/ui/passworddialog.py:43 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "يطلب الخادوم %s منك الولوج. رجاءً أدخِل اسم المستخدم وكلمة السر." #: picard/ui/passworddialog.py:63 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and password." msgstr "يطلب الوسيط %s منك الولوج. رجاءً أدخِل اسم المستخدم وكلمة السر." #: picard/ui/playertoolbar.py:174 msgid "" "Internal player: The format of a media resource isn't (fully) supported" msgstr "" #: picard/ui/playertoolbar.py:176 msgid "" "Internal player: There are not the appropriate permissions to play a media " "resource" msgstr "" #: picard/ui/playertoolbar.py:178 msgid "" "Internal player: A valid playback service was not found, playback cannot " "proceed" msgstr "" #: picard/ui/playertoolbar.py:180 #, python-format msgid "Internal player: error, code=%d, msg=%s" msgstr "" #: picard/ui/playertoolbar.py:186 msgid "Player" msgstr "" #: picard/ui/playertoolbar.py:194 msgid "Play" msgstr "" #: picard/ui/playertoolbar.py:195 msgid "Play selected files" msgstr "" #: picard/ui/playertoolbar.py:201 msgid "Pause" msgstr "" #: picard/ui/playertoolbar.py:202 msgid "Pause or resume current playback" msgstr "" #: picard/ui/playertoolbar.py:339 #, python-format msgid "%1.1f ×" msgstr "" #: picard/ui/playertoolbar.py:345 msgid "Change playback speed" msgstr "" #: picard/ui/playertoolbar.py:352 msgid "Playback speed" msgstr "" #: picard/ui/playertoolbar.py:395 #, python-format msgid "%d%%" msgstr "" #: picard/ui/playertoolbar.py:401 msgid "Change audio volume" msgstr "" #: picard/ui/playertoolbar.py:407 msgid "Audio volume" msgstr "" #: picard/ui/scriptsmenu.py:62 #, python-format msgid "Script error in \"%(script)s\": %(message)s" msgstr "" #: picard/ui/tagsfromfilenames.py:75 picard/ui/tagsfromfilenames.py:122 msgid "File Name" msgstr "اسم الملف" #: picard/ui/options/cdlookup.py:49 picard/ui/ui_cdlookup.py:85 #: picard/ui/ui_options_cdlookup.py:38 #: picard/ui/ui_options_cdlookup_select.py:45 msgid "CD Lookup" msgstr "" #: picard/ui/ui_cdlookup.py:86 msgid "The following releases on MusicBrainz match the CD:" msgstr "الإصدارات الآتية في MusicBrainz تطابق الأسطوانة:" #: picard/ui/ui_cdlookup.py:87 msgid "No matching releases found for this disc." msgstr "" #: picard/ui/ui_cdlookup.py:88 msgid "Submit disc ID" msgstr "" #: picard/ui/ui_cdlookup.py:89 msgid "&Load into Picard" msgstr "" #: picard/ui/ui_cdlookup.py:91 picard/ui/util.py:50 msgid "&Cancel" msgstr "أل&غِ" #: picard/ui/ui_edittagdialog.py:114 msgid "Edit Tag" msgstr "حرّر الوسم" #: picard/ui/ui_edittagdialog.py:115 msgid "Edit value" msgstr "حرّر القيم" #: picard/ui/ui_edittagdialog.py:116 msgid "Add value" msgstr "أضِف قيم" #: picard/ui/ui_edittagdialog.py:117 msgid "Remove value" msgstr "أزِل القيمة" #: picard/ui/ui_edittagdialog.py:118 picard/ui/ui_edittagdialog.py:119 msgid "Move selected value up" msgstr "" #: picard/ui/ui_edittagdialog.py:120 picard/ui/ui_edittagdialog.py:121 msgid "Move selected value down" msgstr "" #: picard/ui/ui_infodialog.py:60 msgid "A&rtwork" msgstr "" #: picard/ui/ui_infostatus.py:91 picard/ui/ui_provider_options_caa.py:79 #: picard/ui/ui_provider_options_local.py:50 #: picard/ui/ui_widget_taglisteditor.py:68 msgid "Form" msgstr "" #: picard/ui/ui_options.py:44 msgid "Options" msgstr "خيارات" #: picard/ui/ui_options_advanced.py:115 msgid "Advanced options" msgstr "خيارات متقدم" #: picard/ui/ui_options_advanced.py:116 msgid "Include sub-folders when adding files from folder" msgstr "" #: picard/ui/ui_options_advanced.py:117 msgid "Ignore track duration difference under this number of seconds" msgstr "تجاهل اختلاف مدة المقطوعة إن كان أقل من كذا ثانية" #: picard/ui/ui_options_advanced.py:118 msgid "Ignore file paths matching the following regular expression:" msgstr "تجاهل مسارات الملفات التي تطابق التعبير النمطي الآتي:" #: picard/ui/ui_options_advanced.py:119 msgid "Ignore hidden files" msgstr "تجاهل الملفات المخفية" #: picard/ui/ui_options_advanced.py:120 msgid "" "Ignore the following tracks when determining whether a release is complete" msgstr "تجاهل المقطوعات الآتية عند تحديد فيما إذا كان الإصدار مكتملا" #: picard/ui/ui_options_advanced.py:121 msgid "Video tracks" msgstr "مقطوعات الفديو" #: picard/ui/ui_options_advanced.py:122 msgid "Pregap tracks" msgstr "" #: picard/ui/ui_options_advanced.py:123 msgid "Data tracks" msgstr "" #: picard/ui/ui_options_advanced.py:124 msgid "Silent tracks" msgstr "" #: picard/ui/ui_options_advanced.py:125 msgid "Tags to ignore for comparison:" msgstr "" #: picard/ui/ui_options_cdlookup.py:39 msgid "CD-ROM device to use for lookups:" msgstr "" #: picard/ui/ui_options_cdlookup_select.py:46 msgid "Default CD-ROM drive to use for lookups:" msgstr "" #: picard/ui/ui_options_cover.py:90 msgid "Location" msgstr "المكان" #: picard/ui/ui_options_cover.py:91 msgid "Embed cover images into tags" msgstr "" #: picard/ui/ui_options_cover.py:92 msgid "Only embed a front image" msgstr "" #: picard/ui/ui_options_cover.py:93 msgid "Save cover images as separate files" msgstr "" #: picard/ui/ui_options_cover.py:94 msgid "Use the following file name for images:" msgstr "" #: picard/ui/ui_options_cover.py:95 msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_cover.py:96 msgid "Cover Art Providers" msgstr "" #: picard/ui/ui_options_cover.py:97 msgid "Reorder Priority: " msgstr "" #: picard/ui/ui_options_cover.py:98 picard/ui/ui_options_interface.py:141 msgid "Move selected item up" msgstr "انقل العنصر المحدد لأعلى" #: picard/ui/ui_options_cover.py:99 picard/ui/ui_options_interface.py:142 msgid "Move selected item down" msgstr "انقل العنصر المحدد لأسفل" #: picard/ui/ui_options_fingerprinting.py:73 msgid "Audio Fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:74 msgid "Do not use audio fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:75 msgid "Use AcoustID" msgstr "" #: picard/ui/ui_options_fingerprinting.py:76 msgid "AcoustID Settings" msgstr "" #: picard/ui/ui_options_fingerprinting.py:77 msgid "Ignore existing AcoustID fingerprints" msgstr "" #: picard/ui/ui_options_fingerprinting.py:78 msgid "Fingerprint calculator:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:79 #: picard/ui/ui_options_interface.py:134 picard/ui/ui_options_renaming.py:146 msgid "Browse..." msgstr "تصفّح..." #: picard/ui/ui_options_fingerprinting.py:80 msgid "Download..." msgstr "نزّل..." #: picard/ui/ui_options_fingerprinting.py:81 msgid "API key:" msgstr "مفتاح API:" #: picard/ui/ui_options_fingerprinting.py:82 msgid "Get API key..." msgstr "اجلب مفتاح API..." #: picard/ui/ui_options_general.py:132 msgid "MusicBrainz Server" msgstr "خادوم MusicBrainz" #: picard/ui/ui_options_general.py:133 picard/ui/ui_options_network.py:110 msgid "Port:" msgstr "المنفذ" #: picard/ui/ui_options_general.py:134 picard/ui/ui_options_network.py:111 msgid "Server address:" msgstr "عنوان الخادوم:" #: picard/ui/ui_options_general.py:136 msgid "Log in" msgstr "لِج" #: picard/ui/ui_options_general.py:137 msgid "Log out" msgstr "اخرج" #: picard/ui/options/general.py:49 picard/ui/ui_options_general.py:138 msgid "General" msgstr "عام" #: picard/ui/ui_options_general.py:139 msgid "Automatically scan all new files" msgstr "" #: picard/ui/ui_options_general.py:140 msgid "Ignore MBIDs when loading new files" msgstr "" #: picard/ui/ui_options_general.py:141 msgid "Update Checking" msgstr "" #: picard/ui/ui_options_general.py:142 msgid "Check for updates during start-up" msgstr "" #: picard/ui/ui_options_general.py:143 msgid "Days between checks:" msgstr "" #: picard/ui/ui_options_general.py:144 msgid "Updates to check:" msgstr "" #: picard/ui/ui_options_genres.py:118 msgid "Use genres from MusicBrainz" msgstr "" #: picard/ui/ui_options_genres.py:119 msgid "Only use my genres" msgstr "" #: picard/ui/ui_options_genres.py:120 msgid "" "Fall back on album's artists genres if no genres are found for the release " "or release group" msgstr "" #: picard/ui/ui_options_genres.py:121 msgid "Use folksonomy tags as genre" msgstr "" #: picard/ui/ui_options_genres.py:122 msgid "Minimal genre usage:" msgstr "" #: picard/ui/ui_options_genres.py:123 picard/ui/ui_options_matching.py:71 #: picard/ui/ui_options_matching.py:72 picard/ui/ui_options_matching.py:73 msgid " %" msgstr " ٪" #: picard/ui/ui_options_genres.py:124 msgid "Maximum number of genres:" msgstr "" #: picard/ui/ui_options_genres.py:125 msgid "Join multiple genres with:" msgstr "" #: picard/ui/ui_options_genres.py:126 msgid " / " msgstr "" #: picard/ui/ui_options_genres.py:127 msgid ", " msgstr "" #: picard/ui/ui_options_genres.py:128 msgid "Genres or folksonomy tags to include or exclude, one per line:" msgstr "" #: picard/ui/ui_options_genres.py:129 msgid "Playground for genres or folksonomy tags filters (cleared on exit):" msgstr "" #: picard/ui/ui_options_interface.py:127 msgid "Miscellaneous" msgstr "متنوّع" #: picard/ui/ui_options_interface.py:128 msgid "Show text labels under icons" msgstr "" #: picard/ui/ui_options_interface.py:129 msgid "Allow selection of multiple directories" msgstr "" #: picard/ui/ui_options_interface.py:130 msgid "Use builtin search rather than looking in browser" msgstr "" #: picard/ui/searchdialog/__init__.py:128 #: picard/ui/ui_options_interface.py:131 msgid "Use advanced query syntax" msgstr "" #: picard/ui/ui_options_interface.py:132 msgid "Show a quit confirmation dialog for unsaved changes" msgstr "" #: picard/ui/ui_options_interface.py:133 msgid "Begin browsing in the following directory:" msgstr "" #: picard/ui/ui_options_interface.py:135 msgid "User interface language:" msgstr "لغة واجهة المستخدم:" #: picard/ui/ui_options_interface.py:136 msgid "Customize Action Toolbar" msgstr "خصّص شريط أدوات الإجراءات" #: picard/ui/ui_options_interface.py:137 msgid "Add a new button to Toolbar" msgstr "أضِف زرا جديدا إلى شريط الأدوات" #: picard/ui/ui_options_interface.py:138 msgid "Add Action" msgstr "أضِف إجراء" #: picard/ui/ui_options_interface.py:139 msgid "Insert a separator" msgstr "أدرج فاصلا" #: picard/ui/ui_options_interface.py:140 msgid "Add Separator" msgstr "أضِف فاصلا" #: picard/ui/ui_options_interface.py:143 msgid "Remove button from toolbar" msgstr "أزِل الزر من شريط الأدوات" #: picard/ui/options/interface_colors.py:85 #: picard/ui/ui_options_interface_colors.py:48 msgid "Colors" msgstr "" #: picard/ui/ui_options_interface_top_tags.py:37 msgid "Show the below tags above all other tags in the metadata view" msgstr "" #: picard/ui/ui_options_matching.py:69 msgid "Thresholds" msgstr "" #: picard/ui/ui_options_matching.py:70 msgid "Minimal similarity for matching files to tracks:" msgstr "" #: picard/ui/ui_options_matching.py:74 msgid "Minimal similarity for file lookups:" msgstr "" #: picard/ui/ui_options_matching.py:75 msgid "Minimal similarity for cluster lookups:" msgstr "" #: picard/ui/options/metadata.py:58 picard/ui/ui_options_metadata.py:96 msgid "Metadata" msgstr "" #: picard/ui/ui_options_metadata.py:97 msgid "Translate artist names to this locale where possible:" msgstr "ترجم أسماء الفنّانين إلى هذه اللغة إن أمكن:" #: picard/ui/ui_options_metadata.py:98 msgid "Use standardized artist names" msgstr "" #: picard/ui/ui_options_metadata.py:99 msgid "Use standardized instrument and vocal credits" msgstr "" #: picard/ui/ui_options_metadata.py:100 msgid "Convert Unicode punctuation characters to ASCII" msgstr "" #: picard/ui/ui_options_metadata.py:101 msgid "Use release relationships" msgstr "" #: picard/ui/ui_options_metadata.py:102 msgid "Use track relationships" msgstr "" #: picard/ui/ui_options_metadata.py:103 msgid "Custom Fields" msgstr "" #: picard/ui/ui_options_metadata.py:104 msgid "Various artists:" msgstr "" #: picard/ui/ui_options_metadata.py:105 msgid "Non-album tracks:" msgstr "" #: picard/ui/ui_options_metadata.py:106 picard/ui/ui_options_metadata.py:107 #: picard/ui/ui_options_renaming.py:153 #: picard/ui/ui_provider_options_local.py:52 msgid "Default" msgstr "" #: picard/ui/ui_options_network.py:107 msgid "Web Proxy" msgstr "" #: picard/ui/ui_options_network.py:108 picard/ui/ui_passworddialog.py:62 msgid "Password:" msgstr "كلمة السر:" #: picard/ui/ui_options_network.py:109 picard/ui/ui_passworddialog.py:61 msgid "Username:" msgstr "اسم المستخدم:" #: picard/ui/ui_options_network.py:112 msgid "Browser Integration" msgstr "التكامل مع المتصفّح" #: picard/ui/ui_options_network.py:113 msgid "Default listening port:" msgstr "منفذ الاستماع المبدئي:" #: picard/ui/ui_options_network.py:114 msgid "Listen only on localhost" msgstr "استمع إلى localhost فقط" #: picard/ui/options/plugins.py:216 picard/ui/ui_options_plugins.py:129 msgid "Plugins" msgstr "الملحقات" #: picard/ui/options/plugins.py:595 picard/ui/searchdialog/album.py:152 #: picard/ui/searchdialog/artist.py:52 picard/ui/searchdialog/track.py:63 #: picard/ui/ui_options_plugins.py:130 msgid "Name" msgstr "الاسم" #: picard/ui/ui_options_plugins.py:131 msgid "Version" msgstr "الإصدارة" #: picard/ui/ui_options_plugins.py:133 msgid "Install plugin..." msgstr "ثبّت ملحقة..." #: picard/ui/ui_options_plugins.py:134 msgid "Open plugin folder" msgstr "افتح مجلد الملحقات" #: picard/ui/ui_options_plugins.py:135 msgid "Reload List of Plugins" msgstr "أعِد تحميل قائمة الملحقات" #: picard/ui/ui_options_plugins.py:136 msgid "Details" msgstr "" #: picard/ui/ui_options_ratings.py:45 msgid "Enable track ratings" msgstr "فعّل إعدادات المقطوعة" #: picard/ui/ui_options_ratings.py:46 msgid "" "Picard saves the ratings together with an e-mail address identifying the " "user who did the rating. That way different ratings for different users can " "be stored in the files. Please specify the e-mail you want to use to save " "your ratings." msgstr "" #: picard/ui/ui_options_ratings.py:47 msgid "E-mail:" msgstr "البريد الإلكتروني" #: picard/ui/ui_options_ratings.py:48 msgid "Submit ratings to MusicBrainz" msgstr "أرسِل التقييمات إلى MusicBrainz" #: picard/ui/ui_options_releases.py:110 msgid "Preferred release types" msgstr "أنواع الإصدار المفضلة" #: picard/ui/ui_options_releases.py:111 msgid "Preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:112 picard/ui/ui_options_releases.py:113 msgid "Add to preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:114 picard/ui/ui_options_releases.py:115 msgid "Remove from preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:116 msgid "Preferred release formats" msgstr "" #: picard/ui/ui_options_releases.py:117 picard/ui/ui_options_releases.py:118 msgid "Add to preferred release formats" msgstr "" #: picard/ui/ui_options_releases.py:119 picard/ui/ui_options_releases.py:120 msgid "Remove from preferred release formats" msgstr "" #: picard/ui/ui_options_renaming.py:144 msgid "Move files when saving" msgstr "انقل الملفات عند الحفظ" #: picard/ui/ui_options_renaming.py:145 msgid "Destination directory:" msgstr "الدليل المقصد:" #: picard/ui/ui_options_renaming.py:147 msgid "Move additional files (case insensitive):" msgstr "" #: picard/ui/ui_options_renaming.py:148 msgid "Delete empty directories" msgstr "احذف الأدلة الفارغة" #: picard/ui/ui_options_renaming.py:149 msgid "Rename files when saving" msgstr "غيّر أسماء الملفات عند الحف" #: picard/ui/ui_options_renaming.py:150 msgid "Replace non-ASCII characters" msgstr "" #: picard/ui/ui_options_renaming.py:151 msgid "Windows compatibility" msgstr "التوافق مع وندوز" #: picard/ui/ui_options_renaming.py:152 msgid "Name files like this" msgstr "سمِّ الملفات بهذه الطريقة" #: picard/ui/ui_options_renaming.py:154 msgid "Examples" msgstr "أمثلة" #: picard/ui/ui_options_script.py:96 msgid "Tagger Script(s)" msgstr "" #: picard/ui/ui_options_script.py:97 picard/ui/ui_options_script.py:98 msgid "Add new script" msgstr "أضِف سكربتا جديدا" #: picard/ui/ui_options_script.py:99 msgid "Move script up" msgstr "انقل السكربت لأعلى" #: picard/ui/ui_options_script.py:100 msgid "Move script down" msgstr "انقل السكربت لأسفل" #: picard/ui/ui_options_script.py:101 picard/ui/widgets/scriptlistwidget.py:53 msgid "Remove script" msgstr "أزِل السكربت" #: picard/ui/ui_options_tags.py:62 msgid "Write tags to files" msgstr "" #: picard/ui/ui_options_tags.py:63 msgid "Preserve timestamps of tagged files" msgstr "" #: picard/ui/ui_options_tags.py:64 msgid "Before Tagging" msgstr "" #: picard/ui/ui_options_tags.py:65 msgid "Clear existing tags" msgstr "امسح الوسوم الموجودة" #: picard/ui/ui_options_tags.py:66 msgid "Remove ID3 tags from FLAC files" msgstr "أزِل وسوم ID3 من ملفات FLAC" #: picard/ui/ui_options_tags.py:67 msgid "Remove APEv2 tags from MP3 files" msgstr "أزِل وسوم APE الإصدارة الثانية من ملفات MP3" #: picard/ui/ui_options_tags.py:68 msgid "" "Preserve these tags from being cleared or overwritten with MusicBrainz data:" msgstr "" #: picard/ui/ui_options_tags.py:69 msgid "Tags are separated by commas and are case-insensitive." msgstr "" #: picard/ui/ui_options_tags_compatibility.py:144 msgid "ID3" msgstr "ID3" #: picard/ui/ui_options_tags_compatibility.py:145 msgid "ID3v2 Version" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:146 msgid "2.4" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:147 msgid "2.3" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:148 msgid "ID3v2 Text Encoding" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:149 msgid "UTF-8" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:150 msgid "UTF-16" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:151 msgid "ISO-8859-1" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:152 msgid "Join multiple ID3v2.3 tags with:" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:153 msgid "" "

Default is '/' to maintain compatibility with previous" " Picard releases.

New alternatives are ';_' or '_/_' or type your own." "

" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:154 msgid "Save iTunes compatible grouping and work" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:155 msgid "Also include ID3v1 tags in the files" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:156 msgid "AAC files" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:157 #: picard/ui/ui_options_tags_compatibility.py:161 msgid "Save APEv2 tags" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:158 #: picard/ui/ui_options_tags_compatibility.py:162 msgid "Do not save tags" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:159 msgid "Remove APEv2 tags from AAC files" msgstr "أزِل وسوم APE الإصدارة الثانية من ملفات AAC" #: picard/ui/ui_options_tags_compatibility.py:160 msgid "AC3 files" msgstr "" #: picard/ui/ui_options_tags_compatibility.py:163 msgid "Remove APEv2 tags from AC3 files" msgstr "أزِل وسوم APE الإصدارة الثانية من ملفات AC3" #: picard/ui/ui_passworddialog.py:60 msgid "Authentication required" msgstr "الاستيثاق مطلوب" #: picard/ui/ui_provider_options_caa.py:80 msgid "Download only cover art images matching selected types" msgstr "" #: picard/ui/ui_provider_options_caa.py:81 msgid "Select types..." msgstr "اختر الأنواع..." #: picard/ui/ui_provider_options_caa.py:82 msgid "Only use images of the following size:" msgstr "استخدم صورا بهذا المقاس فقط:" #: picard/ui/ui_provider_options_caa.py:83 msgid "Save only one front image as separate file" msgstr "" #: picard/ui/ui_provider_options_caa.py:84 msgid "Download only approved images" msgstr "نزّل الصور الموافق عليها فقط" #: picard/ui/ui_provider_options_caa.py:85 msgid "" "Use the first image type as the filename. This will not change the filename " "of front images." msgstr "" #: picard/ui/ui_provider_options_local.py:51 msgid "Local cover art files match the following regular expression:" msgstr "" #: picard/ui/ui_provider_options_local.py:53 msgid "" "First group in the regular expression, if any, will be used as type, ie. " "cover-back-spine.jpg will be set as types Back + Spine. If no type is found," " it will default to Front type." msgstr "" #: picard/ui/ui_tagsfromfilenames.py:53 msgid "Convert File Names to Tags" msgstr "حوّل أسماء الملفات إلى وسوم" #: picard/ui/ui_tagsfromfilenames.py:54 msgid "Replace underscores with spaces" msgstr "استبدل الشرطات السفلية بمسافات" #: picard/ui/ui_tagsfromfilenames.py:55 msgid "&Preview" msgstr "&عاين" #: picard/ui/ui_widget_taglisteditor.py:69 msgid "Add new tag" msgstr "" #: picard/ui/ui_widget_taglisteditor.py:70 #: picard/ui/ui_widget_taglisteditor.py:71 msgid "Move tag up" msgstr "" #: picard/ui/ui_widget_taglisteditor.py:72 #: picard/ui/ui_widget_taglisteditor.py:73 msgid "Move tag down" msgstr "" #: picard/ui/ui_widget_taglisteditor.py:74 #: picard/ui/ui_widget_taglisteditor.py:75 msgid "Remove selected tags" msgstr "" #: picard/ui/ui_widget_taglisteditor.py:76 msgid "Remove tags" msgstr "" #: picard/ui/util.py:49 msgid "&Ok" msgstr "&حسنا" #: picard/ui/util.py:52 msgid "Clos&e" msgstr "" #: picard/ui/options/__init__.py:103 msgid "Regex Error" msgstr "خطأ في التعبير النمطي" #: picard/ui/options/about.py:43 msgid "About" msgstr "ع" #: picard/ui/options/about.py:63 msgid "translator-credits" msgstr "صفا الفليج" #: picard/ui/options/about.py:66 #, python-format msgid "
Translated to LANG by %s" msgstr "
ترجم التطبيق إلى العربية: %s" #: picard/ui/options/about.py:82 msgid "" "Icons made by Sambhav Kothari \n" "and Madebyoliver,\n" "Pixel Buddha,\n" "Nikita Golubev,\n" "Maxim Basinski,\n" "Smashicons\n" "from www.flaticon.com" msgstr "" #: picard/ui/options/about.py:90 #, python-format msgid "" "

MusicBrainz Picard
\n" "Version %(version)s

\n" "

\n" "%(third_parties_versions)s\n" "

\n" "

Supported formats
%(formats)s

\n" "

Please donate
\n" "Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

\n" "

Donate now!

\n" "

Credits
\n" "Copyright © %(copyright_years)s %(authors_credits)s and others%(translator_credits)s

\n" "

%(icons_credits)s

\n" "

Official website
%(picard_doc_url)s

\n" msgstr "" #: picard/ui/options/advanced.py:37 msgid "Advanced" msgstr "متقدّم" #: picard/ui/options/cover.py:43 msgid "Cover Art" msgstr "" #: picard/ui/options/dialog.py:115 msgid "&Restore all Defaults" msgstr "ا&ستعد كل المبدئيات" #: picard/ui/options/dialog.py:116 msgid "Reset all of Picard's settings" msgstr "صفّر كل إعدادات Picard" #: picard/ui/options/dialog.py:118 msgid "Reset all settings for current option page" msgstr "صفّر كل إعدادات صفحة الخيارات الحالية" #: picard/ui/options/dialog.py:121 msgid "Make It So!" msgstr "طبّقها!" #: picard/ui/options/dialog.py:205 msgid "Unexpected error" msgstr "" #: picard/ui/options/dialog.py:225 msgid "You are about to reset your options for this page." msgstr "أنت على وشك تصفير كل الخيارات في هذه الصفحة." #: picard/ui/options/dialog.py:229 msgid "Warning! This will reset all of your settings." msgstr "تحذير! سيصفّر هذا كل إعداداتك." #: picard/ui/options/dialog.py:236 msgid "Confirm Reset" msgstr "أكّد التصفير" #: picard/ui/options/dialog.py:237 msgid "Are you sure?" msgstr "أمتأكد؟" #: picard/ui/options/fingerprinting.py:51 msgid "Fingerprinting" msgstr "" #: picard/ui/options/fingerprinting.py:154 #: picard/ui/options/fingerprinting.py:158 msgid "Please select a valid fpcalc executable." msgstr "" #: picard/ui/options/fingerprinting.py:158 msgid "Invalid fpcalc executable" msgstr "" #: picard/ui/options/general.py:109 #, python-format msgid "Logged in as %s." msgstr "والج كَ‍ %s." #: picard/ui/options/genres.py:41 msgid "" "\n" "

Lines not starting with - or + are ignored.

\n" "

One expression per line, case-insensitive

\n" "

Examples:

\n" "

\n" "#comment
\n" "!comment
\n" "comment\n" "

\n" "

Strict filtering:

\n" "

\n" "-word: exclude word
\n" "+word: include word\n" "

\n" "

Wildcard filtering:

\n" "

\n" "-*word: exclude all genres ending with word
\n" "+word*: include all genres starting with word
\n" "-w*rd: exclude all genres starting with w and ending with rd\n" "

\n" "

Regular expressions filtering (Python re syntax):

\n" "

-/^w.rd+/: exclude genres starting with w followed by any character, then r followed by at least one d\n" "

\n" "" msgstr "" #: picard/ui/options/genres.py:66 msgid "" "\n" "

You can add genres to test filters against, one per line.
\n" "This playground will not be preserved on Options exit.\n" "

\n" "

\n" "Red background means the tag will be skipped.
\n" "Green background means the tag will be kept.\n" "

\n" "" msgstr "" #: picard/ui/options/genres.py:80 msgid "Genres" msgstr "" #: picard/ui/options/genres.py:146 #, python-format msgid "Error line %d: %s" msgstr "" #: picard/ui/options/interface.py:61 msgid "User Interface" msgstr "واجهة المستخدم" #: picard/ui/options/interface.py:68 msgid "Add Folder" msgstr "أضِف مجلدا" #: picard/ui/options/interface.py:72 msgid "Add Files" msgstr "أضِف ملفات" #: picard/ui/options/interface.py:76 msgid "Cluster" msgstr "" #: picard/ui/options/interface.py:80 msgid "Lookup" msgstr "ابحث" #: picard/ui/options/interface.py:84 msgid "Scan" msgstr "افحص" #: picard/ui/options/interface.py:88 msgid "Lookup in Browser" msgstr "ابحث في المتصفّح" #: picard/ui/options/interface.py:92 msgid "Save" msgstr "احفظ" #: picard/ui/options/interface.py:104 msgid "Submit AcoustIDs" msgstr "" #: picard/ui/options/interface.py:112 msgid "Open in Player" msgstr "افتح في المشغّل" #: picard/ui/options/interface.py:116 msgid "Lookup CD..." msgstr "" #: picard/ui/options/interface.py:155 msgid "System default" msgstr "مبدئيات النظام" #: picard/ui/options/interface.py:212 msgid "Language changed" msgstr "تغيّرت اللغة" #: picard/ui/options/interface.py:213 msgid "" "You have changed the interface language. You have to restart Picard in order" " for the change to take effect." msgstr "لقد غيّرت لغة الواجهة. عليك إعادة تشغيل Picard ليأخذ التغيير مفعوله." #: picard/ui/options/interface.py:237 msgid "Drag and Drop to re-order" msgstr "اسحب وأفلِت لإعادة الترتيب" #: picard/ui/options/interface_colors.py:60 msgid "Choose a color" msgstr "" #: picard/ui/options/interface_colors.py:139 msgid "Colors changed" msgstr "" #: picard/ui/options/interface_colors.py:140 msgid "" "You have changed the interface colors. You may have to restart Picard in " "order for the changes to take effect." msgstr "" #: picard/ui/options/interface_top_tags.py:36 msgid "Top Tags" msgstr "" #: picard/ui/options/matching.py:37 msgid "Matching" msgstr "المطابقة" #: picard/ui/options/network.py:37 msgid "Network" msgstr "الشبكة" #: picard/ui/options/plugins.py:135 msgid "Download and install plugin" msgstr "" #: picard/ui/options/plugins.py:143 #, python-format msgid "Download and upgrade plugin to version %s" msgstr "" #: picard/ui/options/plugins.py:149 msgid "Enabled" msgstr "" #: picard/ui/options/plugins.py:153 msgid "Disabled" msgstr "" #: picard/ui/options/plugins.py:163 msgid "Uninstall plugin" msgstr "" #: picard/ui/options/plugins.py:396 msgid "Reloading list of available plugins..." msgstr "" #: picard/ui/options/plugins.py:404 picard/ui/options/plugins.py:413 #: picard/ui/options/plugins.py:434 #, python-format msgid "Plugin '%s'" msgstr "" #: picard/ui/options/plugins.py:405 #, python-format msgid "" "An error occurred while loading the plugin '%s':\n" "\n" "%s" msgstr "" #: picard/ui/options/plugins.py:414 #, python-format msgid "The plugin '%s' is not compatible with this version of Picard." msgstr "الملحقة ”%s“ غير متوافقة مع إصدارة Picard هذه." #: picard/ui/options/plugins.py:435 #, python-format msgid "The plugin '%s' will be upgraded to version %s on next run of Picard." msgstr "ستُرقّى الملحقة ”%s“ إلى الإصدارة %s في التشغيل التالي لِ‍ Picard." #: picard/ui/options/plugins.py:456 #, python-format msgid "Uninstall plugin '%s'?" msgstr "" #: picard/ui/options/plugins.py:457 #, python-format msgid "Do you really want to uninstall the plugin '%s' ?" msgstr "" #: picard/ui/options/plugins.py:588 msgid "Restart Picard to upgrade to new version" msgstr "أعِد تشغيل Picard للترقية إلى إصدارة أحدث" #: picard/ui/options/plugins.py:590 msgid "New version available" msgstr "تتوفر إصدارة جديد" #: picard/ui/options/plugins.py:597 msgid "Authors" msgstr "المؤلفو" #: picard/ui/options/plugins.py:599 picard/util/tags.py:69 msgid "License" msgstr "الرخصة" #: picard/ui/options/plugins.py:636 #, python-format msgid "The plugin '%s' could not be downloaded." msgstr "تعذّر تنزيل الملحقة ”%s“." #: picard/ui/options/plugins.py:637 msgid "Please try again later." msgstr "رجاء أعِد المحاولة لاحقا." #: picard/ui/options/ratings.py:36 msgid "Ratings" msgstr "التقييمات" #: picard/ui/options/releases.py:155 msgid "Preferred Releases" msgstr "" #: picard/ui/options/releases.py:191 msgid "Reset all" msgstr "صفّر الكل" #: picard/ui/options/renaming.py:76 msgid "File Naming" msgstr "تسمية الملفات" #: picard/ui/options/renaming.py:206 picard/ui/options/scripting.py:207 msgid "" "Open Scripting Documentation in " "your browser" msgstr "افتح توثيق السكربتات في المتصفّح" #: picard/ui/options/renaming.py:219 msgid "The location to move files to must not be empty." msgstr "المكان حيث ستُنقل إليه الملفات يجب ألا يكون فارغا." #: picard/ui/options/renaming.py:229 msgid "The file naming format must not be empty." msgstr "يجب ألا يكون تنسيق تسمية الملف فارغا" #: picard/ui/options/scripting.py:126 msgid "Scripting" msgstr "السكربتات" #: picard/ui/options/scripting.py:181 msgid "Script Error" msgstr "عطل في السكربت" #: picard/ui/options/tags.py:50 msgid "Tags" msgstr "الوسوم" #: picard/ui/options/tags_compatibility.py:39 msgid "Tag Compatibility" msgstr "توافقية الوسو" #: picard/ui/searchdialog/__init__.py:133 msgid "" " (Syntax " "Help)" msgstr "" #: picard/ui/searchdialog/__init__.py:254 msgid "Search in browser" msgstr "" #: picard/ui/searchdialog/__init__.py:290 msgid "Loading..." msgstr "يحمّل..." #: picard/ui/searchdialog/__init__.py:321 msgid "Retry" msgstr "أعِد المحاولة" #: picard/ui/searchdialog/__init__.py:359 #, python-format msgid "" "Following error occurred while fetching " "results:

Network request error for %s:
%s (QT code %d, " "HTTP code %s)
" msgstr "" #: picard/ui/searchdialog/__init__.py:370 msgid "" "No results found. Please try a different search query." msgstr "لم يُعثر على نتائج. رجاءً أعِد البحث باستعلام مختلف." #: picard/ui/searchdialog/album.py:147 picard/ui/searchdialog/track.py:58 msgid "Load into Picard" msgstr "حمّل في Picard" #: picard/ui/searchdialog/album.py:150 msgid "Album Search Results" msgstr "نتائج البحث عن الألبومات" #: picard/ui/searchdialog/album.py:161 picard/util/tags.py:67 msgid "Language" msgstr "اللغة" #: picard/ui/searchdialog/album.py:163 msgid "Status" msgstr "الحالة" #: picard/ui/searchdialog/album.py:165 picard/ui/searchdialog/artist.py:60 #: picard/ui/searchdialog/track.py:70 msgid "Score" msgstr "" #: picard/ui/searchdialog/artist.py:48 msgid "Show in browser" msgstr "اعرض في المتصفّح" #: picard/ui/searchdialog/artist.py:50 msgid "Artist Search Dialog" msgstr "" #: picard/ui/searchdialog/artist.py:54 msgid "Gender" msgstr "" #: picard/ui/searchdialog/artist.py:55 msgid "Area" msgstr "" #: picard/ui/searchdialog/artist.py:56 msgid "Begin" msgstr "" #: picard/ui/searchdialog/artist.py:57 msgid "Begin Area" msgstr "" #: picard/ui/searchdialog/artist.py:58 msgid "End" msgstr "" #: picard/ui/searchdialog/artist.py:59 msgid "End Area" msgstr "" #: picard/ui/searchdialog/track.py:61 msgid "Track Search Results" msgstr "نتائج البحث عن المقطوعات" #: picard/ui/searchdialog/track.py:66 msgid "Release" msgstr "الإصدار" #: picard/ui/searchdialog/track.py:177 msgid "Standalone Recording" msgstr "" #: picard/ui/widgets/scriptlistwidget.py:50 msgid "Rename script" msgstr "غيّر اسم السكربت" #: picard/ui/widgets/scriptlistwidget.py:74 msgid "Are you sure you want to remove this script?" msgstr "أمتأكد من إزالة هذا السكربت؟" #: picard/ui/widgets/scriptlistwidget.py:75 msgid "Confirm Remove" msgstr "أكّد الإزالة" #: picard/util/bytes2human.py:37 #, python-format msgid "%s B" msgstr "%s ب" #: picard/util/bytes2human.py:38 #, python-format msgid "%s kB" msgstr "" #: picard/util/bytes2human.py:39 #, python-format msgid "%s KiB" msgstr "" #: picard/util/bytes2human.py:40 #, python-format msgid "%s MB" msgstr "" #: picard/util/bytes2human.py:41 #, python-format msgid "%s MiB" msgstr "" #: picard/util/bytes2human.py:42 #, python-format msgid "%s GB" msgstr "" #: picard/util/bytes2human.py:43 #, python-format msgid "%s GiB" msgstr "" #: picard/util/bytes2human.py:44 #, python-format msgid "%s TB" msgstr "" #: picard/util/bytes2human.py:45 #, python-format msgid "%s TiB" msgstr "" #: picard/util/bytes2human.py:46 #, python-format msgid "%s PB" msgstr "" #: picard/util/bytes2human.py:47 #, python-format msgid "%s PiB" msgstr "" #: picard/util/bytes2human.py:89 #, python-format msgid "%s " msgstr "%s " #: picard/util/checkupdate.py:103 msgid "Error loading Picard releases list: {error_message}" msgstr "" #: picard/util/checkupdate.py:107 picard/util/checkupdate.py:143 #: picard/util/checkupdate.py:163 msgid "Picard Update" msgstr "" #: picard/util/checkupdate.py:108 msgid "" "Unable to retrieve the latest version information from the website.\n" "(https://{url}{endpoint})" msgstr "" #: picard/util/checkupdate.py:144 msgid "" "A new version of Picard is available.\n" "\n" "This version: {picard_old_version}\n" "New version: {picard_new_version}\n" "\n" "Would you like to download the new version?" msgstr "" #: picard/util/checkupdate.py:160 msgid "unknown" msgstr "" #: picard/util/checkupdate.py:164 msgid "" "There is no update currently available for your subscribed update level: {update_level}\n" "\n" "Your version: {picard_old_version}\n" msgstr "" #: picard/util/tags.py:34 msgid "AcoustID Fingerprint" msgstr "" #: picard/util/tags.py:35 msgid "AcoustID" msgstr "" #: picard/util/tags.py:37 msgid "Album Artist Sort Order" msgstr "" #: picard/util/tags.py:39 msgid "Album Sort Order" msgstr "" #: picard/util/tags.py:40 msgid "Arranger" msgstr "" #: picard/util/tags.py:42 msgid "Artists" msgstr "الفنّانون" #: picard/util/tags.py:43 msgid "Artist Sort Order" msgstr "" #: picard/util/tags.py:44 msgid "ASIN" msgstr "" #: picard/util/tags.py:46 msgid "BPM" msgstr "" #: picard/util/tags.py:47 msgid "Catalog Number" msgstr "رقم الكتالوج" #: picard/util/tags.py:48 msgid "Comment" msgstr "تعليق" #: picard/util/tags.py:49 msgid "Compilation (iTunes)" msgstr "" #: picard/util/tags.py:51 msgid "Composer Sort Order" msgstr "" #: picard/util/tags.py:52 msgid "Conductor" msgstr "" #: picard/util/tags.py:53 msgid "Copyright" msgstr "حقوق النسخ" #: picard/util/tags.py:55 msgid "Disc Id" msgstr "معرّف الأسطوان" #: picard/util/tags.py:56 msgid "Disc Number" msgstr "رقم الأسطوان" #: picard/util/tags.py:58 msgid "DJ-Mixer" msgstr "" #: picard/util/tags.py:59 msgid "Encoded By" msgstr "رمّزهُ" #: picard/util/tags.py:60 msgid "Encoder Settings" msgstr "إعدادات المرمّز" #: picard/util/tags.py:61 msgid "Engineer" msgstr "المهندس" #: picard/util/tags.py:63 msgid "Grouping" msgstr "" #: picard/util/tags.py:64 msgid "ISRC" msgstr "" #: picard/util/tags.py:65 msgid "Key" msgstr "" #: picard/util/tags.py:66 msgid "Record Label" msgstr "" #: picard/util/tags.py:70 msgid "Lyricist" msgstr "" #: picard/util/tags.py:71 msgid "Lyrics" msgstr "الكلمات" #: picard/util/tags.py:73 msgid "Mixer" msgstr "المازج" #: picard/util/tags.py:74 msgid "Mood" msgstr "" #: picard/util/tags.py:75 msgid "Movement" msgstr "" #: picard/util/tags.py:76 msgid "Movement Number" msgstr "" #: picard/util/tags.py:77 msgid "Movement Count" msgstr "" #: picard/util/tags.py:78 msgid "MusicBrainz Release Artist Id" msgstr "" #: picard/util/tags.py:79 msgid "MusicBrainz Release Id" msgstr "" #: picard/util/tags.py:80 msgid "MusicBrainz Artist Id" msgstr "" #: picard/util/tags.py:81 msgid "MusicBrainz Disc Id" msgstr "" #: picard/util/tags.py:82 msgid "MusicBrainz Original Release Id" msgstr "" #: picard/util/tags.py:83 msgid "MusicBrainz Original Artist Id" msgstr "" #: picard/util/tags.py:84 msgid "MusicBrainz Recording Id" msgstr "" #: picard/util/tags.py:85 msgid "MusicBrainz Release Group Id" msgstr "" #: picard/util/tags.py:86 msgid "MusicBrainz Track Id" msgstr "" #: picard/util/tags.py:87 msgid "MusicBrainz Work Id" msgstr "" #: picard/util/tags.py:88 msgid "MusicIP Fingerprint" msgstr "" #: picard/util/tags.py:89 msgid "MusicIP PUID" msgstr "" #: picard/util/tags.py:90 msgid "Original Album" msgstr "الألبوم الأصلي" #: picard/util/tags.py:91 msgid "Original Artist" msgstr "الفنّان الأصلي" #: picard/util/tags.py:92 msgid "Original Release Date" msgstr "تاريخ الإصدار الأصلي" #: picard/util/tags.py:93 msgid "Original Filename" msgstr "" #: picard/util/tags.py:94 msgid "Original Year" msgstr "السنة الأصلية" #: picard/util/tags.py:95 msgid "Performer" msgstr "المؤدي" #: picard/util/tags.py:96 msgid "Producer" msgstr "المنتج" #: picard/util/tags.py:97 msgid "R128 Album Gain" msgstr "" #: picard/util/tags.py:98 msgid "R128 Track Gain" msgstr "" #: picard/util/tags.py:99 msgid "Rating" msgstr "التقييم" #: picard/util/tags.py:100 msgid "Release Country" msgstr "بلد الإصدار" #: picard/util/tags.py:101 msgid "Release Status" msgstr "حالة الإصدار" #: picard/util/tags.py:102 msgid "Release Type" msgstr "نوع الإصدار" #: picard/util/tags.py:103 msgid "Remixer" msgstr "" #: picard/util/tags.py:104 msgid "ReplayGain Album Gain" msgstr "" #: picard/util/tags.py:105 msgid "ReplayGain Album Peak" msgstr "" #: picard/util/tags.py:106 msgid "ReplayGain Album Range" msgstr "" #: picard/util/tags.py:107 msgid "ReplayGain Reference Loudness" msgstr "" #: picard/util/tags.py:108 msgid "ReplayGain Track Gain" msgstr "" #: picard/util/tags.py:109 msgid "ReplayGain Track Peak" msgstr "" #: picard/util/tags.py:110 msgid "ReplayGain Track Range" msgstr "" #: picard/util/tags.py:111 msgid "Script" msgstr "" #: picard/util/tags.py:112 msgid "Show Work & Movement" msgstr "" #: picard/util/tags.py:113 msgid "Subtitle" msgstr "" #: picard/util/tags.py:115 msgid "Title Sort Order" msgstr "" #: picard/util/tags.py:116 msgid "Total Discs" msgstr "إجمالي الأسطوانات" #: picard/util/tags.py:117 msgid "Total Tracks" msgstr "إجمالي المقطوعات" #: picard/util/tags.py:118 msgid "Track Number" msgstr "رقم المقطوعة" #: picard/util/tags.py:119 msgid "Artist Website" msgstr "موقع الفنّان" #: picard/util/tags.py:120 msgid "Work" msgstr "" #: picard/util/tags.py:121 msgid "Writer" msgstr "الكاتب" #: picard/util/versions.py:66 msgid "is not installed" msgstr "" #: picard/util/webbrowser2.py:45 msgid "Web Browser Error" msgstr "عطل في متصفّح الوب" #: picard/util/webbrowser2.py:45 #, python-format msgid "" "Error while launching a web browser:\n" "\n" "%s" msgstr "عطل أثناء إطلاق متصفّح الوب:\n\n%s" picard-release-2.3.1/po/ast.po000066400000000000000000001172741362601763300161650ustar00rootroot00000000000000# Translations template for picard. # Copyright (C) 2014 ORGANIZATION # This file is distributed under the same license as the picard project. # # Translators: # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2014-03-20 11:12+0100\n" "PO-Revision-Date: 2014-03-21 08:44+0000\n" "Last-Translator: nikki\n" "Language-Team: Asturian (http://www.transifex.com/projects/p/musicbrainz/language/ast/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 1.3\n" "Language: ast\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: contrib/plugins/no_release.py:50 msgid "Enable plugin for all releases by default" msgstr "" #: contrib/plugins/no_release.py:51 msgid "Tags to strip (comma-separated)" msgstr "" #: contrib/plugins/no_release.py:63 msgid "Remove specific release information..." msgstr "" #: contrib/plugins/open_in_gui.py:32 msgid "Open Error" msgstr "" #: contrib/plugins/open_in_gui.py:32 #, python-format msgid "" "Error while opening file:\n" "\n" "%s" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:117 msgid "Last.fm" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:118 msgid "Use track tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:119 msgid "Use artist tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:120 #: picard/ui/options/tags.py:30 msgid "Tags" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:121 #: picard/ui/ui_options_folksonomy.py:116 msgid "Ignore tags:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:122 #: picard/ui/ui_options_folksonomy.py:121 msgid "Join multiple tags with:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:123 #: picard/ui/ui_options_folksonomy.py:122 msgid " / " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:124 #: picard/ui/ui_options_folksonomy.py:123 msgid ", " msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:125 #: picard/ui/ui_options_folksonomy.py:118 msgid "Minimal tag usage:" msgstr "" #: contrib/plugins/lastfm/ui_options_lastfm.py:126 #: picard/ui/ui_options_folksonomy.py:119 picard/ui/ui_options_matching.py:88 #: picard/ui/ui_options_matching.py:89 picard/ui/ui_options_matching.py:90 msgid " %" msgstr "" #: contrib/plugins/replaygain/__init__.py:50 msgid "Calculate replay &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:66 #, python-format msgid "Calculating replay gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:71 #, python-format msgid "Replay gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:73 #, python-format msgid "Could not calculate replay gain for \"%s\"." msgstr "" #: contrib/plugins/replaygain/__init__.py:76 msgid "Calculate album &gain..." msgstr "" #: contrib/plugins/replaygain/__init__.py:103 #: contrib/plugins/replaygain/__init__.py:111 #, python-format msgid "Calculating album gain for \"%s\"..." msgstr "" #: contrib/plugins/replaygain/__init__.py:119 #, python-format msgid "Album gain for \"%s\" successfully calculated." msgstr "" #: contrib/plugins/replaygain/__init__.py:121 #, python-format msgid "Could not calculate album gain for \"%s\"." msgstr "" #: picard/acoustid.py:102 #, python-format msgid "AcoustID lookup network error for '%s'!" msgstr "" #: picard/acoustid.py:117 #, python-format msgid "AcoustID lookup failed for '%s'!" msgstr "" #: picard/acoustid.py:128 #, python-format msgid "Acoustid lookup returned no result for file '%s'" msgstr "" #: picard/acoustid.py:132 #, python-format msgid "Looking up the fingerprint for file %s..." msgstr "" #: picard/acoustidmanager.py:78 msgid "Submitting AcoustIDs..." msgstr "" #: picard/acoustidmanager.py:83 #, python-format msgid "AcoustID submission failed with error '%s'" msgstr "" #: picard/acoustidmanager.py:85 msgid "AcoustIDs successfully submitted." msgstr "" #: picard/album.py:64 picard/cluster.py:234 msgid "Unmatched Files" msgstr "Ficheros que nun concasen" #: picard/album.py:187 #, python-format msgid "[could not load album %s]" msgstr "[nun se pudo cargar l'álbum %s]" #: picard/album.py:272 #, python-format msgid "Album %s loaded" msgstr "" #: picard/album.py:288 msgid "[loading album information]" msgstr "[cargando información del álbum]" #: picard/album.py:463 #, python-format msgid "; %i image" msgid_plural "; %i images" msgstr[0] "" msgstr[1] "" #: picard/cluster.py:150 picard/cluster.py:159 #, python-format msgid "No matching releases for cluster %s" msgstr "" #: picard/cluster.py:161 #, python-format msgid "Cluster %s identified!" msgstr "" #: picard/cluster.py:168 #, python-format msgid "Looking up the metadata for cluster %s..." msgstr "" #: picard/collection.py:60 #, python-format msgid "Added %i release to collection \"%s\"" msgid_plural "Added %i releases to collection \"%s\"" msgstr[0] "" msgstr[1] "" #: picard/collection.py:72 #, python-format msgid "Removed %i release from collection \"%s\"" msgid_plural "Removed %i releases from collection \"%s\"" msgstr[0] "" msgstr[1] "" #: picard/collection.py:81 #, python-format msgid "Error loading collections: %s" msgstr "" #: picard/config_upgrade.py:57 picard/config_upgrade.py:70 msgid "Various Artists file naming scheme removal" msgstr "" #: picard/config_upgrade.py:58 msgid "" "The separate file naming scheme for various artists albums has been removed in this version of Picard.\n" "Your file naming scheme has automatically been merged with that of single artist albums." msgstr "" #: picard/config_upgrade.py:71 msgid "" "The separate file naming scheme for various artists albums has been removed in this version of Picard.\n" "You currently do not use this option, but have a separate file naming scheme defined.\n" "Do you want to remove it or merge it with your file naming scheme for single artist albums?" msgstr "" #: picard/config_upgrade.py:77 msgid "Merge" msgstr "" #: picard/config_upgrade.py:77 picard/ui/metadatabox.py:254 msgid "Remove" msgstr "" #: picard/const.py:67 msgid "CD" msgstr "CD" #: picard/const.py:68 msgid "CD-R" msgstr "" #: picard/const.py:69 msgid "HDCD" msgstr "" #: picard/const.py:70 msgid "8cm CD" msgstr "" #: picard/const.py:71 msgid "Vinyl" msgstr "Vinilu" #: picard/const.py:72 msgid "7\" Vinyl" msgstr "" #: picard/const.py:73 msgid "10\" Vinyl" msgstr "" #: picard/const.py:74 msgid "12\" Vinyl" msgstr "" #: picard/const.py:75 msgid "Digital Media" msgstr "Mediu Dixital" #: picard/const.py:76 msgid "USB Flash Drive" msgstr "" #: picard/const.py:77 msgid "slotMusic" msgstr "" #: picard/const.py:78 msgid "Cassette" msgstr "Casé" #: picard/const.py:79 msgid "DVD" msgstr "DVD" #: picard/const.py:80 msgid "DVD-Audio" msgstr "" #: picard/const.py:81 msgid "DVD-Video" msgstr "" #: picard/const.py:82 msgid "SACD" msgstr "SACD" #: picard/const.py:83 msgid "DualDisc" msgstr "" #: picard/const.py:84 msgid "MiniDisc" msgstr "Mini Discu" #: picard/const.py:85 msgid "Blu-ray" msgstr "" #: picard/const.py:86 msgid "HD-DVD" msgstr "" #: picard/const.py:87 msgid "Videotape" msgstr "" #: picard/const.py:88 msgid "VHS" msgstr "" #: picard/const.py:89 msgid "Betamax" msgstr "" #: picard/const.py:90 msgid "VCD" msgstr "" #: picard/const.py:91 msgid "SVCD" msgstr "" #: picard/const.py:92 msgid "UMD" msgstr "" #: picard/const.py:93 picard/coverartarchive.py:33 #: picard/ui/ui_options_releases.py:226 msgid "Other" msgstr "Otru" #: picard/const.py:94 msgid "LaserDisc" msgstr "Discu laser" #: picard/const.py:95 msgid "Cartridge" msgstr "" #: picard/const.py:96 msgid "Reel-to-reel" msgstr "" #: picard/const.py:97 msgid "DAT" msgstr "DAT" #: picard/const.py:98 msgid "Wax Cylinder" msgstr "Cilindru Wax" #: picard/const.py:99 msgid "Piano Roll" msgstr "Pianola" #: picard/const.py:100 msgid "DCC" msgstr "" #: picard/const.py:115 msgid "Danish" msgstr "" #: picard/const.py:116 msgid "German" msgstr "Alemán" #: picard/const.py:118 msgid "English" msgstr "Inglés" #: picard/const.py:119 msgid "English (Canada)" msgstr "Inglés (Canadá)" #: picard/const.py:120 msgid "English (UK)" msgstr "Inglés (RX)" #: picard/const.py:122 msgid "Spanish" msgstr "Castellán" #: picard/const.py:123 msgid "Estonian" msgstr "Estoniu" #: picard/const.py:125 msgid "Finnish" msgstr "Finlandés" #: picard/const.py:127 msgid "French" msgstr "Francés" #: picard/const.py:136 msgid "Italian" msgstr "Italianu" #: picard/const.py:143 msgid "Dutch" msgstr "Holandés" #: picard/const.py:145 msgid "Polish" msgstr "Polacu" #: picard/const.py:147 msgid "Brazilian Portuguese" msgstr "Portugés BR" #: picard/const.py:154 msgid "Swedish" msgstr "Suecu" #: picard/coverart.py:84 #, python-format msgid "Coverart %s downloaded" msgstr "" #: picard/coverart.py:240 #, python-format msgid "Downloading http://%s:%i%s" msgstr "" #: picard/coverartarchive.py:24 msgid "Front" msgstr "" #: picard/coverartarchive.py:25 msgid "Back" msgstr "" #: picard/coverartarchive.py:26 msgid "Booklet" msgstr "" #: picard/coverartarchive.py:27 msgid "Medium" msgstr "" #: picard/coverartarchive.py:28 msgid "Tray" msgstr "" #: picard/coverartarchive.py:29 msgid "Obi" msgstr "" #: picard/coverartarchive.py:30 msgid "Spine" msgstr "" #: picard/coverartarchive.py:31 picard/ui/mainwindow.py:546 msgid "Track" msgstr "" #: picard/coverartarchive.py:32 msgid "Sticker" msgstr "" #: picard/coverartarchive.py:34 msgid "Unknown" msgstr "" #: picard/file.py:536 #, python-format msgid "No matching tracks for file %s" msgstr "Nun concasa pista denguna pal ficheru %s" #: picard/file.py:548 #, python-format msgid "No matching tracks above the threshold for file %s" msgstr "Nun concasa pista denguna perriba del umbral pal ficheru %s" #: picard/file.py:551 #, python-format msgid "File %s identified!" msgstr "¡Identificáu el ficheru %s!" #: picard/file.py:567 #, python-format msgid "Looking up the metadata for file %s..." msgstr "Guetando los metadatos del ficheru %s..." #: picard/releasegroup.py:53 msgid "Tracks" msgstr "" #: picard/releasegroup.py:54 msgid "Year" msgstr "" #: picard/releasegroup.py:55 picard/ui/cdlookup.py:34 msgid "Country" msgstr "" #: picard/releasegroup.py:56 picard/util/tags.py:81 msgid "Format" msgstr "" #: picard/releasegroup.py:57 msgid "Label" msgstr "" #: picard/releasegroup.py:58 msgid "Cat No" msgstr "" #: picard/releasegroup.py:88 msgid "[no barcode]" msgstr "" #: picard/releasegroup.py:108 msgid "[no release info]" msgstr "" #: picard/tagger.py:316 #, python-format msgid "Loading directory %s" msgstr "" #: picard/tagger.py:452 msgid "CD Lookup Error" msgstr "" #: picard/tagger.py:453 #, python-format msgid "" "Error while reading CD:\n" "\n" "%s" msgstr "" #: picard/ui/cdlookup.py:34 picard/ui/mainwindow.py:544 #: picard/ui/ui_options_releases.py:216 picard/util/tags.py:21 msgid "Album" msgstr "" #: picard/ui/cdlookup.py:34 picard/ui/itemviews.py:96 #: picard/ui/mainwindow.py:545 picard/util/tags.py:22 msgid "Artist" msgstr "" #: picard/ui/cdlookup.py:34 picard/util/tags.py:24 msgid "Date" msgstr "" #: picard/ui/cdlookup.py:35 msgid "Labels" msgstr "" #: picard/ui/cdlookup.py:35 msgid "Catalog #s" msgstr "" #: picard/ui/cdlookup.py:35 picard/util/tags.py:79 msgid "Barcode" msgstr "" #: picard/ui/collectionmenu.py:31 msgid "Refresh List" msgstr "" #: picard/ui/collectionmenu.py:92 #, python-format msgid "%s (%i release)" msgid_plural "%s (%i releases)" msgstr[0] "" msgstr[1] "" #: picard/ui/coverartbox.py:142 msgid "View release on MusicBrainz" msgstr "" #: picard/ui/filebrowser.py:40 msgid "&Move Tagged Files Here" msgstr "" #: picard/ui/filebrowser.py:43 msgid "Show &Hidden Files" msgstr "" #: picard/ui/filebrowser.py:48 msgid "&Set as starting directory" msgstr "" #: picard/ui/infodialog.py:36 picard/ui/infodialog.py:75 msgid "Info" msgstr "" #: picard/ui/infodialog.py:80 msgid "Filename:" msgstr "" #: picard/ui/infodialog.py:82 msgid "Format:" msgstr "" #: picard/ui/infodialog.py:86 msgid "Size:" msgstr "" #: picard/ui/infodialog.py:90 msgid "Length:" msgstr "" #: picard/ui/infodialog.py:92 msgid "Bitrate:" msgstr "" #: picard/ui/infodialog.py:94 msgid "Sample rate:" msgstr "" #: picard/ui/infodialog.py:96 msgid "Bits per sample:" msgstr "" #: picard/ui/infodialog.py:100 msgid "Mono" msgstr "" #: picard/ui/infodialog.py:102 msgid "Stereo" msgstr "" #: picard/ui/infodialog.py:105 msgid "Channels:" msgstr "" #: picard/ui/infodialog.py:116 msgid "Album Info" msgstr "" #: picard/ui/infodialog.py:124 msgid "&Errors" msgstr "" #: picard/ui/infodialog.py:134 picard/ui/ui_infodialog.py:77 msgid "&Info" msgstr "" #: picard/ui/infostatus.py:51 msgid "Files" msgstr "" #: picard/ui/infostatus.py:52 msgid "Albums" msgstr "" #: picard/ui/infostatus.py:53 msgid "Pending files" msgstr "" #: picard/ui/infostatus.py:54 msgid "Pending requests" msgstr "" #: picard/ui/itemviews.py:94 picard/util/tags.py:23 msgid "Title" msgstr "" #: picard/ui/itemviews.py:95 picard/util/tags.py:88 msgid "Length" msgstr "" #: picard/ui/itemviews.py:231 msgid "&Expand all" msgstr "" #: picard/ui/itemviews.py:233 msgid "&Collapse all" msgstr "" #: picard/ui/itemviews.py:294 msgid "&Other versions" msgstr "" #: picard/ui/itemviews.py:297 msgid "Loading..." msgstr "" #: picard/ui/itemviews.py:362 msgid "Collections" msgstr "" #: picard/ui/itemviews.py:365 msgid "&Plugins" msgstr "" #: picard/ui/itemviews.py:541 msgid "file view" msgstr "" #: picard/ui/itemviews.py:542 msgid "Contains unmatched files and clusters" msgstr "" #: picard/ui/itemviews.py:562 msgid "Clusters" msgstr "" #: picard/ui/itemviews.py:571 msgid "album view" msgstr "" #: picard/ui/itemviews.py:572 msgid "Contains albums and matched files" msgstr "" #: picard/ui/logview.py:91 msgid "Log" msgstr "" #: picard/ui/logview.py:99 msgid "Status History" msgstr "" #: picard/ui/mainwindow.py:74 msgid "MusicBrainz Picard" msgstr "" #: picard/ui/mainwindow.py:155 msgid "Unsaved Changes" msgstr "" #: picard/ui/mainwindow.py:156 msgid "Are you sure you want to quit Picard?" msgstr "" #: picard/ui/mainwindow.py:157 #, python-format msgid "" "There is %d unsaved file. Closing Picard will lose all unsaved changes." msgid_plural "" "There are %d unsaved files. Closing Picard will lose all unsaved changes." msgstr[0] "" msgstr[1] "" #: picard/ui/mainwindow.py:164 msgid "&Quit Picard" msgstr "" #: picard/ui/mainwindow.py:216 msgid "Ready" msgstr "" #: picard/ui/mainwindow.py:220 msgid "" "Picard listens on a port to integrate with your browser and downloads " "release information when you click the \"Tagger\" buttons on the MusicBrainz" " website" msgstr "" #: picard/ui/mainwindow.py:240 #, python-format msgid " Listening on port %(port)d " msgstr "" #: picard/ui/mainwindow.py:263 msgid "Submission Error" msgstr "" #: picard/ui/mainwindow.py:264 msgid "" "You need to configure your AcoustID API key before you can submit " "fingerprints." msgstr "" #: picard/ui/mainwindow.py:269 msgid "&Options..." msgstr "" #: picard/ui/mainwindow.py:273 msgid "&Cut" msgstr "" #: picard/ui/mainwindow.py:278 msgid "&Paste" msgstr "" #: picard/ui/mainwindow.py:283 msgid "&Help..." msgstr "" #: picard/ui/mainwindow.py:288 msgid "&About..." msgstr "" #: picard/ui/mainwindow.py:292 msgid "&Donate..." msgstr "" #: picard/ui/mainwindow.py:295 msgid "&Report a Bug..." msgstr "" #: picard/ui/mainwindow.py:298 msgid "&Support Forum..." msgstr "" #: picard/ui/mainwindow.py:301 msgid "&Add Files..." msgstr "" #: picard/ui/mainwindow.py:302 msgid "Add files to the tagger" msgstr "" #: picard/ui/mainwindow.py:307 msgid "A&dd Folder..." msgstr "" #: picard/ui/mainwindow.py:308 msgid "Add a folder to the tagger" msgstr "" #: picard/ui/mainwindow.py:310 msgid "Ctrl+D" msgstr "" #: picard/ui/mainwindow.py:313 msgid "&Save" msgstr "" #: picard/ui/mainwindow.py:314 msgid "Save selected files" msgstr "" #: picard/ui/mainwindow.py:320 msgid "S&ubmit" msgstr "" #: picard/ui/mainwindow.py:321 msgid "Submit fingerprints" msgstr "" #: picard/ui/mainwindow.py:325 msgid "E&xit" msgstr "" #: picard/ui/mainwindow.py:328 msgid "Ctrl+Q" msgstr "" #: picard/ui/mainwindow.py:331 msgid "&Remove" msgstr "" #: picard/ui/mainwindow.py:332 msgid "Remove selected files/albums" msgstr "" #: picard/ui/mainwindow.py:336 msgid "Lookup in &Browser" msgstr "" #: picard/ui/mainwindow.py:337 msgid "Lookup selected item on MusicBrainz website" msgstr "" #: picard/ui/mainwindow.py:341 msgid "File &Browser" msgstr "" #: picard/ui/mainwindow.py:345 msgid "Ctrl+B" msgstr "" #: picard/ui/mainwindow.py:348 msgid "&Cover Art" msgstr "" #: picard/ui/mainwindow.py:354 picard/ui/mainwindow.py:539 msgid "Search" msgstr "" #: picard/ui/mainwindow.py:357 msgid "&CD Lookup..." msgstr "" #: picard/ui/mainwindow.py:358 picard/ui/mainwindow.py:359 msgid "Lookup CD" msgstr "" #: picard/ui/mainwindow.py:361 msgid "Ctrl+K" msgstr "" #: picard/ui/mainwindow.py:364 msgid "&Scan" msgstr "" #: picard/ui/mainwindow.py:367 msgid "Ctrl+Y" msgstr "" #: picard/ui/mainwindow.py:370 msgid "Cl&uster" msgstr "" #: picard/ui/mainwindow.py:373 msgid "Ctrl+U" msgstr "" #: picard/ui/mainwindow.py:376 msgid "&Lookup" msgstr "" #: picard/ui/mainwindow.py:377 picard/ui/mainwindow.py:378 msgid "Lookup metadata" msgstr "" #: picard/ui/mainwindow.py:381 msgid "Ctrl+L" msgstr "" #: picard/ui/mainwindow.py:384 msgid "&Info..." msgstr "" #: picard/ui/mainwindow.py:387 msgid "Ctrl+I" msgstr "" #: picard/ui/mainwindow.py:390 msgid "&Refresh" msgstr "" #: picard/ui/mainwindow.py:391 msgid "Ctrl+R" msgstr "" #: picard/ui/mainwindow.py:394 msgid "&Rename Files" msgstr "" #: picard/ui/mainwindow.py:399 msgid "&Move Files" msgstr "" #: picard/ui/mainwindow.py:404 msgid "Save &Tags" msgstr "" #: picard/ui/mainwindow.py:409 msgid "Tags From &File Names..." msgstr "" #: picard/ui/mainwindow.py:412 msgid "View &Log..." msgstr "" #: picard/ui/mainwindow.py:415 msgid "View Status &History..." msgstr "" #: picard/ui/mainwindow.py:422 msgid "&Open..." msgstr "" #: picard/ui/mainwindow.py:423 msgid "Open the file" msgstr "" #: picard/ui/mainwindow.py:426 msgid "Open &Folder..." msgstr "" #: picard/ui/mainwindow.py:427 msgid "Open the containing folder" msgstr "" #: picard/ui/mainwindow.py:448 msgid "&File" msgstr "" #: picard/ui/mainwindow.py:456 msgid "&Edit" msgstr "" #: picard/ui/mainwindow.py:462 msgid "&View" msgstr "" #: picard/ui/mainwindow.py:470 msgid "&Options" msgstr "" #: picard/ui/mainwindow.py:476 msgid "&Tools" msgstr "" #: picard/ui/mainwindow.py:485 picard/ui/util.py:35 msgid "&Help" msgstr "" #: picard/ui/mainwindow.py:505 msgid "Actions" msgstr "" #: picard/ui/mainwindow.py:608 msgid "All Supported Formats" msgstr "" #: picard/ui/mainwindow.py:705 msgid "Configuration Required" msgstr "" #: picard/ui/mainwindow.py:706 msgid "" "Audio fingerprinting is not yet configured. Would you like to configure it " "now?" msgstr "" #: picard/ui/mainwindow.py:784 picard/ui/mainwindow.py:791 #, python-format msgid " (Error: %s)" msgstr "" #: picard/ui/metadatabox.py:82 #, python-format msgid "(different across %d item)" msgid_plural "(different across %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:90 #, python-format msgid "(missing from %d item)" msgid_plural "(missing from %d items)" msgstr[0] "" msgstr[1] "" #: picard/ui/metadatabox.py:154 msgid "metadata view" msgstr "" #: picard/ui/metadatabox.py:155 msgid "Displays original and new tags for the selected files" msgstr "" #: picard/ui/metadatabox.py:157 msgid "Tag" msgstr "" #: picard/ui/metadatabox.py:157 msgid "Original Value" msgstr "" #: picard/ui/metadatabox.py:157 msgid "New Value" msgstr "" #: picard/ui/metadatabox.py:180 msgid "Add New Tag..." msgstr "" #: picard/ui/metadatabox.py:182 msgid "Show Changes First" msgstr "" #: picard/ui/metadatabox.py:237 msgid "Edit..." msgstr "" #: picard/ui/metadatabox.py:258 msgid "Use Original Value" msgid_plural "Use Original Values" msgstr[0] "" msgstr[1] "" #: picard/ui/passworddialog.py:37 #, python-format msgid "" "The server %s requires you to login. Please enter your username and " "password." msgstr "" #: picard/ui/passworddialog.py:75 #, python-format msgid "" "The proxy %s requires you to login. Please enter your username and password." msgstr "" #: picard/ui/tagsfromfilenames.py:55 picard/ui/tagsfromfilenames.py:100 msgid "File Name" msgstr "" #: picard/ui/ui_cdlookup.py:66 picard/ui/ui_options_cdlookup.py:55 #: picard/ui/ui_options_cdlookup_select.py:62 picard/ui/options/cdlookup.py:38 msgid "CD Lookup" msgstr "" #: picard/ui/ui_cdlookup.py:67 msgid "The following releases on MusicBrainz match the CD:" msgstr "" #: picard/ui/ui_cdlookup.py:68 msgid "OK" msgstr "" #: picard/ui/ui_cdlookup.py:69 msgid "Lookup manually" msgstr "" #: picard/ui/ui_cdlookup.py:70 msgid "Cancel" msgstr "" #: picard/ui/ui_edittagdialog.py:101 msgid "Edit Tag" msgstr "" #: picard/ui/ui_edittagdialog.py:102 msgid "Edit value" msgstr "" #: picard/ui/ui_edittagdialog.py:103 msgid "Add value" msgstr "" #: picard/ui/ui_edittagdialog.py:104 msgid "Remove value" msgstr "" #: picard/ui/ui_infodialog.py:78 msgid "A&rtwork" msgstr "" #: picard/ui/ui_infostatus.py:100 msgid "Form" msgstr "" #: picard/ui/ui_options.py:51 msgid "Options" msgstr "" #: picard/ui/ui_options_advanced.py:46 msgid "Advanced options" msgstr "" #: picard/ui/ui_options_advanced.py:47 msgid "Ignore file paths matching the following regular expression:" msgstr "" #: picard/ui/ui_options_cdlookup.py:56 msgid "CD-ROM device to use for lookups:" msgstr "" #: picard/ui/ui_options_cdlookup_select.py:63 msgid "Default CD-ROM drive to use for lookups:" msgstr "" #: picard/ui/ui_options_cover.py:145 msgid "Location" msgstr "" #: picard/ui/ui_options_cover.py:146 msgid "Embed cover images into tags" msgstr "" #: picard/ui/ui_options_cover.py:147 msgid "Only embed a front image" msgstr "" #: picard/ui/ui_options_cover.py:148 msgid "Save cover images as separate files" msgstr "" #: picard/ui/ui_options_cover.py:149 msgid "Use the following file name for images:" msgstr "" #: picard/ui/ui_options_cover.py:150 msgid "Overwrite the file if it already exists" msgstr "" #: picard/ui/ui_options_cover.py:151 msgid "Coverart Providers" msgstr "" #: picard/ui/ui_options_cover.py:152 msgid "Amazon" msgstr "" #: picard/ui/ui_options_cover.py:153 picard/ui/ui_options_cover.py:155 msgid "Cover Art Archive" msgstr "" #: picard/ui/ui_options_cover.py:154 msgid "Sites on the whitelist" msgstr "" #: picard/ui/ui_options_cover.py:156 msgid "Only use images of the following size:" msgstr "" #: picard/ui/ui_options_cover.py:157 msgid "250 px" msgstr "" #: picard/ui/ui_options_cover.py:158 msgid "500 px" msgstr "" #: picard/ui/ui_options_cover.py:159 msgid "Full size" msgstr "" #: picard/ui/ui_options_cover.py:160 msgid "Download only images of the following types:" msgstr "" #: picard/ui/ui_options_cover.py:161 msgid "Download only approved images" msgstr "" #: picard/ui/ui_options_cover.py:162 msgid "" "Use the first image type as the filename. This will not change the filename " "of front images." msgstr "" #: picard/ui/ui_options_fingerprinting.py:83 msgid "Audio Fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:84 msgid "Do not use audio fingerprinting" msgstr "" #: picard/ui/ui_options_fingerprinting.py:85 msgid "Use AcoustID" msgstr "" #: picard/ui/ui_options_fingerprinting.py:86 msgid "AcoustID Settings" msgstr "" #: picard/ui/ui_options_fingerprinting.py:87 msgid "Fingerprint calculator:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:88 #: picard/ui/ui_options_interface.py:88 picard/ui/ui_options_renaming.py:138 msgid "Browse..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:89 msgid "Download..." msgstr "" #: picard/ui/ui_options_fingerprinting.py:90 msgid "API key:" msgstr "" #: picard/ui/ui_options_fingerprinting.py:91 msgid "Get API key..." msgstr "" #: picard/ui/ui_options_folksonomy.py:115 picard/ui/options/folksonomy.py:28 msgid "Folksonomy Tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:117 msgid "Only use my tags" msgstr "" #: picard/ui/ui_options_folksonomy.py:120 msgid "Maximum number of tags:" msgstr "" #: picard/ui/ui_options_general.py:92 msgid "MusicBrainz Server" msgstr "" #: picard/ui/ui_options_general.py:93 picard/ui/ui_options_network.py:123 msgid "Port:" msgstr "" #: picard/ui/ui_options_general.py:94 picard/ui/ui_options_network.py:124 msgid "Server address:" msgstr "" #: picard/ui/ui_options_general.py:95 msgid "Account Information" msgstr "" #: picard/ui/ui_options_general.py:96 picard/ui/ui_options_network.py:121 #: picard/ui/ui_passworddialog.py:74 msgid "Password:" msgstr "" #: picard/ui/ui_options_general.py:97 picard/ui/ui_options_network.py:122 #: picard/ui/ui_passworddialog.py:73 msgid "Username:" msgstr "" #: picard/ui/ui_options_general.py:98 picard/ui/options/general.py:31 msgid "General" msgstr "" #: picard/ui/ui_options_general.py:99 msgid "Automatically scan all new files" msgstr "" #: picard/ui/ui_options_general.py:100 msgid "Ignore MBIDs when loading new files" msgstr "" #: picard/ui/ui_options_interface.py:82 msgid "Miscellaneous" msgstr "" #: picard/ui/ui_options_interface.py:83 msgid "Show text labels under icons" msgstr "" #: picard/ui/ui_options_interface.py:84 msgid "Allow selection of multiple directories" msgstr "" #: picard/ui/ui_options_interface.py:85 msgid "Use advanced query syntax" msgstr "" #: picard/ui/ui_options_interface.py:86 msgid "Show a quit confirmation dialog for unsaved changes" msgstr "" #: picard/ui/ui_options_interface.py:87 msgid "Begin browsing in the following directory:" msgstr "" #: picard/ui/ui_options_interface.py:89 msgid "User interface language:" msgstr "" #: picard/ui/ui_options_matching.py:86 msgid "Thresholds" msgstr "" #: picard/ui/ui_options_matching.py:87 msgid "Minimal similarity for matching files to tracks:" msgstr "" #: picard/ui/ui_options_matching.py:91 msgid "Minimal similarity for file lookups:" msgstr "" #: picard/ui/ui_options_matching.py:92 msgid "Minimal similarity for cluster lookups:" msgstr "" #: picard/ui/ui_options_metadata.py:114 picard/ui/options/metadata.py:29 msgid "Metadata" msgstr "" #: picard/ui/ui_options_metadata.py:115 msgid "Translate artist names to this locale where possible:" msgstr "" #: picard/ui/ui_options_metadata.py:116 msgid "Use standardized artist names" msgstr "" #: picard/ui/ui_options_metadata.py:117 msgid "Convert Unicode punctuation characters to ASCII" msgstr "" #: picard/ui/ui_options_metadata.py:118 msgid "Use release relationships" msgstr "" #: picard/ui/ui_options_metadata.py:119 msgid "Use track relationships" msgstr "" #: picard/ui/ui_options_metadata.py:120 msgid "Use folksonomy tags as genre" msgstr "" #: picard/ui/ui_options_metadata.py:121 msgid "Custom Fields" msgstr "" #: picard/ui/ui_options_metadata.py:122 msgid "Various artists:" msgstr "" #: picard/ui/ui_options_metadata.py:123 msgid "Non-album tracks:" msgstr "" #: picard/ui/ui_options_metadata.py:124 picard/ui/ui_options_metadata.py:125 #: picard/ui/ui_options_renaming.py:147 msgid "Default" msgstr "" #: picard/ui/ui_options_network.py:120 msgid "Web Proxy" msgstr "" #: picard/ui/ui_options_network.py:125 msgid "Browser Integration" msgstr "" #: picard/ui/ui_options_network.py:126 msgid "Default listening port:" msgstr "" #: picard/ui/ui_options_network.py:127 msgid "Listen only on localhost" msgstr "" #: picard/ui/ui_options_plugins.py:131 picard/ui/options/plugins.py:38 msgid "Plugins" msgstr "" #: picard/ui/ui_options_plugins.py:132 picard/ui/options/plugins.py:122 msgid "Name" msgstr "" #: picard/ui/ui_options_plugins.py:133 picard/util/tags.py:39 msgid "Version" msgstr "" #: picard/ui/ui_options_plugins.py:134 picard/ui/options/plugins.py:125 msgid "Author" msgstr "" #: picard/ui/ui_options_plugins.py:135 msgid "Install plugin..." msgstr "" #: picard/ui/ui_options_plugins.py:136 msgid "Open plugin folder" msgstr "" #: picard/ui/ui_options_plugins.py:137 msgid "Download plugins" msgstr "" #: picard/ui/ui_options_plugins.py:138 msgid "Details" msgstr "" #: picard/ui/ui_options_ratings.py:53 msgid "Enable track ratings" msgstr "" #: picard/ui/ui_options_ratings.py:54 msgid "" "Picard saves the ratings together with an e-mail address identifying the " "user who did the rating. That way different ratings for different users can " "be stored in the files. Please specify the e-mail you want to use to save " "your ratings." msgstr "" #: picard/ui/ui_options_ratings.py:55 msgid "E-mail:" msgstr "" #: picard/ui/ui_options_ratings.py:56 msgid "Submit ratings to MusicBrainz" msgstr "" #: picard/ui/ui_options_releases.py:215 msgid "Preferred release types" msgstr "" #: picard/ui/ui_options_releases.py:217 msgid "Single" msgstr "" #: picard/ui/ui_options_releases.py:218 msgid "EP" msgstr "" #: picard/ui/ui_options_releases.py:219 msgid "Compilation" msgstr "" #: picard/ui/ui_options_releases.py:220 msgid "Soundtrack" msgstr "" #: picard/ui/ui_options_releases.py:221 msgid "Spokenword" msgstr "" #: picard/ui/ui_options_releases.py:222 msgid "Interview" msgstr "" #: picard/ui/ui_options_releases.py:223 msgid "Audiobook" msgstr "" #: picard/ui/ui_options_releases.py:224 msgid "Live" msgstr "" #: picard/ui/ui_options_releases.py:225 msgid "Remix" msgstr "" #: picard/ui/ui_options_releases.py:227 msgid "Reset all" msgstr "" #: picard/ui/ui_options_releases.py:228 msgid "Preferred release countries" msgstr "" #: picard/ui/ui_options_releases.py:229 picard/ui/ui_options_releases.py:232 msgid ">" msgstr "" #: picard/ui/ui_options_releases.py:230 picard/ui/ui_options_releases.py:233 msgid "<" msgstr "" #: picard/ui/ui_options_releases.py:231 msgid "Preferred release formats" msgstr "" #: picard/ui/ui_options_renaming.py:134 msgid "Rename files when saving" msgstr "" #: picard/ui/ui_options_renaming.py:135 msgid "Replace non-ASCII characters" msgstr "" #: picard/ui/ui_options_renaming.py:136 msgid "Windows compatibility" msgstr "" #: picard/ui/ui_options_renaming.py:137 msgid "Move files to this directory when saving:" msgstr "" #: picard/ui/ui_options_renaming.py:139 msgid "Delete empty directories" msgstr "" #: picard/ui/ui_options_renaming.py:140 msgid "Move additional files:" msgstr "" #: picard/ui/ui_options_renaming.py:141 msgid "Name files like this" msgstr "" #: picard/ui/ui_options_renaming.py:148 msgid "Examples" msgstr "" #: picard/ui/ui_options_script.py:49 msgid "Tagger Script" msgstr "" #: picard/ui/ui_options_tags.py:165 msgid "Write tags to files" msgstr "" #: picard/ui/ui_options_tags.py:166 msgid "Preserve timestamps of tagged files" msgstr "" #: picard/ui/ui_options_tags.py:167 msgid "Before Tagging" msgstr "" #: picard/ui/ui_options_tags.py:168 msgid "Clear existing tags" msgstr "" #: picard/ui/ui_options_tags.py:169 msgid "Remove ID3 tags from FLAC files" msgstr "" #: picard/ui/ui_options_tags.py:170 msgid "Remove APEv2 tags from MP3 files" msgstr "" #: picard/ui/ui_options_tags.py:171 msgid "" "Preserve these tags from being cleared or overwritten with MusicBrainz data:" msgstr "" #: picard/ui/ui_options_tags.py:172 msgid "Tags are separated by commas, and are case-sensitive." msgstr "" #: picard/ui/ui_options_tags.py:173 msgid "Tag Compatibility" msgstr "" #: picard/ui/ui_options_tags.py:174 msgid "ID3v2 Version" msgstr "" #: picard/ui/ui_options_tags.py:175 msgid "2.4" msgstr "" #: picard/ui/ui_options_tags.py:176 msgid "2.3" msgstr "" #: picard/ui/ui_options_tags.py:177 msgid "ID3v2 Text Encoding" msgstr "" #: picard/ui/ui_options_tags.py:178 msgid "UTF-8" msgstr "" #: picard/ui/ui_options_tags.py:179 msgid "UTF-16" msgstr "" #: picard/ui/ui_options_tags.py:180 msgid "ISO-8859-1" msgstr "" #: picard/ui/ui_options_tags.py:181 msgid "Join multiple ID3v2.3 tags with:" msgstr "" #: picard/ui/ui_options_tags.py:182 msgid "" "

Default is '/' to maintain compatibility with previous" " Picard releases.

New alternatives are ';_' or '_/_' or type your own." "

" msgstr "" #: picard/ui/ui_options_tags.py:183 msgid "Also include ID3v1 tags in the files" msgstr "" #: picard/ui/ui_passworddialog.py:72 msgid "Authentication required" msgstr "" #: picard/ui/ui_passworddialog.py:75 msgid "Save username and password" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:54 msgid "Convert File Names to Tags" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:55 msgid "Replace underscores with spaces" msgstr "" #: picard/ui/ui_tagsfromfilenames.py:56 msgid "&Preview" msgstr "" #: picard/ui/util.py:33 msgid "&Ok" msgstr "" #: picard/ui/util.py:34 msgid "&Cancel" msgstr "" #: picard/ui/options/about.py:33 msgid "About" msgstr "" #: picard/ui/options/about.py:48 msgid "is not installed" msgstr "" #: picard/ui/options/about.py:59 msgid "translator-credits" msgstr "Launchpad Contributions:\n ASTUR2000 https://launchpad.net/~astur2000\n Xuacu Saturio https://launchpad.net/~xuacusk8" #: picard/ui/options/about.py:62 #, python-format msgid "
Translated to LANG by %s" msgstr "" #: picard/ui/options/about.py:66 #, python-format msgid "" "

MusicBrainz Picard
\n" "Version %(version)s

\n" "

\n" "PyQt %(pyqt-version)s
\n" "Mutagen %(mutagen-version)s
\n" "Discid %(discid-version)s\n" "

\n" "

Supported formats
%(formats)s

\n" "

Please donate
\n" "Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.

\n" "

Donate now!

\n" "

Credits
\n" "Copyright © 2004-2014 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s

\n" "

%(picard-doc-url)s

\n" msgstr "" #: picard/ui/options/advanced.py:31 msgid "Advanced" msgstr "" #: picard/ui/options/advanced.py:66 msgid "Regex Error" msgstr "" #: picard/ui/options/cover.py:63 msgid "Cover Art" msgstr "" #: picard/ui/options/fingerprinting.py:32 msgid "Fingerprinting" msgstr "" #: picard/ui/options/interface.py:35 msgid "User Interface" msgstr "" #: picard/ui/options/interface.py:54 msgid "System default" msgstr "" #: picard/ui/options/interface.py:96 msgid "Language changed" msgstr "" #: picard/ui/options/interface.py:96 msgid "" "You have changed the interface language. You have to restart Picard in order" " for the change to take effect." msgstr "" #: picard/ui/options/matching.py:28 msgid "Matching" msgstr "" #: picard/ui/options/network.py:29 msgid "Network" msgstr "" #: picard/ui/options/plugins.py:126 msgid "File" msgstr "" #: picard/ui/options/ratings.py:28 msgid "Ratings" msgstr "" #: picard/ui/options/releases.py:33 msgid "Preferred Releases" msgstr "" #: picard/ui/options/renaming.py:37 msgid "File Naming" msgstr "" #: picard/ui/options/renaming.py:184 msgid "Error" msgstr "" #: picard/ui/options/renaming.py:184 msgid "The location to move files to must not be empty." msgstr "" #: picard/ui/options/renaming.py:194 msgid "The file naming format must not be empty." msgstr "" #: picard/ui/options/scripting.py:63 msgid "Scripting" msgstr "" #: picard/ui/options/scripting.py:95 msgid "Script Error" msgstr "" #: picard/util/bytes2human.py:33 #, python-format msgid "%s B" msgstr "" #: picard/util/bytes2human.py:34 #, python-format msgid "%s kB" msgstr "" #: picard/util/bytes2human.py:35 #, python-format msgid "%s KiB" msgstr "" #: picard/util/bytes2human.py:36 #, python-format msgid "%s MB" msgstr "" #: picard/util/bytes2human.py:37 #, python-format msgid "%s MiB" msgstr "" #: picard/util/bytes2human.py:38 #, python-format msgid "%s GB" msgstr "" #: picard/util/bytes2human.py:39 #, python-format msgid "%s GiB" msgstr "" #: picard/util/bytes2human.py:40 #, python-format msgid "%s TB" msgstr "" #: picard/util/bytes2human.py:41 #, python-format msgid "%s TiB" msgstr "" #: picard/util/bytes2human.py:42 #, python-format msgid "%s PB" msgstr "" #: picard/util/bytes2human.py:43 #, python-format msgid "%s PiB" msgstr "" #: picard/util/bytes2human.py:84 #, python-format msgid "%s " msgstr "" #: picard/util/tags.py:25 msgid "Original Release Date" msgstr "" #: picard/util/tags.py:26 msgid "Original Year" msgstr "" #: picard/util/tags.py:27 msgid "Album Artist" msgstr "" #: picard/util/tags.py:28 msgid "Track Number" msgstr "" #: picard/util/tags.py:29 msgid "Total Tracks" msgstr "" #: picard/util/tags.py:30 msgid "Disc Number" msgstr "" #: picard/util/tags.py:31 msgid "Total Discs" msgstr "" #: picard/util/tags.py:32 msgid "Album Artist Sort Order" msgstr "" #: picard/util/tags.py:33 msgid "Artist Sort Order" msgstr "" #: picard/util/tags.py:34 msgid "Title Sort Order" msgstr "" #: picard/util/tags.py:35 msgid "Album Sort Order" msgstr "" #: picard/util/tags.py:36 msgid "Composer Sort Order" msgstr "" #: picard/util/tags.py:37 msgid "ASIN" msgstr "" #: picard/util/tags.py:38 msgid "Grouping" msgstr "" #: picard/util/tags.py:40 msgid "ISRC" msgstr "" #: picard/util/tags.py:41 msgid "Mood" msgstr "" #: picard/util/tags.py:42 msgid "BPM" msgstr "" #: picard/util/tags.py:43 msgid "Copyright" msgstr "" #: picard/util/tags.py:44 msgid "License" msgstr "" #: picard/util/tags.py:45 msgid "Composer" msgstr "" #: picard/util/tags.py:46 msgid "Writer" msgstr "" #: picard/util/tags.py:47 msgid "Conductor" msgstr "" #: picard/util/tags.py:48 msgid "Lyricist" msgstr "" #: picard/util/tags.py:49 msgid "Arranger" msgstr "" #: picard/util/tags.py:50 msgid "Producer" msgstr "" #: picard/util/tags.py:51 msgid "Engineer" msgstr "" #: picard/util/tags.py:52 msgid "Subtitle" msgstr "" #: picard/util/tags.py:53 msgid "Disc Subtitle" msgstr "" #: picard/util/tags.py:54 msgid "Remixer" msgstr "" #: picard/util/tags.py:55 msgid "MusicBrainz Recording Id" msgstr "" #: picard/util/tags.py:56 msgid "MusicBrainz Track Id" msgstr "" #: picard/util/tags.py:57 msgid "MusicBrainz Release Id" msgstr "" #: picard/util/tags.py:58 msgid "MusicBrainz Artist Id" msgstr "" #: picard/util/tags.py:59 msgid "MusicBrainz Release Artist Id" msgstr "" #: picard/util/tags.py:60 msgid "MusicBrainz Work Id" msgstr "" #: picard/util/tags.py:61 msgid "MusicBrainz Release Group Id" msgstr "" #: picard/util/tags.py:62 msgid "MusicBrainz Disc Id" msgstr "" #: picard/util/tags.py:63 msgid "MusicBrainz Sort Name" msgstr "" #: picard/util/tags.py:64 msgid "MusicIP PUID" msgstr "" #: picard/util/tags.py:65 msgid "MusicIP Fingerprint" msgstr "" #: picard/util/tags.py:66 msgid "AcoustID" msgstr "" #: picard/util/tags.py:67 msgid "AcoustID Fingerprint" msgstr "" #: picard/util/tags.py:68 msgid "Disc Id" msgstr "" #: picard/util/tags.py:69 msgid "Website" msgstr "" #: picard/util/tags.py:70 msgid "Compilation (iTunes)" msgstr "" #: picard/util/tags.py:71 msgid "Comment" msgstr "" #: picard/util/tags.py:72 msgid "Genre" msgstr "" #: picard/util/tags.py:73 msgid "Encoded By" msgstr "" #: picard/util/tags.py:74 msgid "Performer" msgstr "" #: picard/util/tags.py:75 msgid "Release Type" msgstr "" #: picard/util/tags.py:76 msgid "Release Status" msgstr "" #: picard/util/tags.py:77 msgid "Release Country" msgstr "" #: picard/util/tags.py:78 msgid "Record Label" msgstr "" #: picard/util/tags.py:80 msgid "Catalog Number" msgstr "" #: picard/util/tags.py:82 msgid "DJ-Mixer" msgstr "" #: picard/util/tags.py:83 msgid "Media" msgstr "" #: picard/util/tags.py:84 msgid "Lyrics" msgstr "" #: picard/util/tags.py:85 msgid "Mixer" msgstr "" #: picard/util/tags.py:86 msgid "Language" msgstr "" #: picard/util/tags.py:87 msgid "Script" msgstr "" #: picard/util/tags.py:89 msgid "Rating" msgstr "" #: picard/util/tags.py:90 msgid "Artists" msgstr "" #: picard/util/tags.py:91 msgid "Work" msgstr "" #: picard/util/webbrowser2.py:90 msgid "Web Browser Error" msgstr "" #: picard/util/webbrowser2.py:90 #, python-format msgid "" "Error while launching a web browser:\n" "\n" "%s" msgstr "" picard-release-2.3.1/po/attributes/000077500000000000000000000000001362601763300172105ustar00rootroot00000000000000picard-release-2.3.1/po/attributes/.gitignore000066400000000000000000000000001362601763300211660ustar00rootroot00000000000000picard-release-2.3.1/po/attributes/da.po000066400000000000000000005320701362601763300201430ustar00rootroot00000000000000# # Translators: # Frederik “Freso” S. Olesen , 2012 # Frederik “Freso” S. Olesen , 2014-2015 msgid "" msgstr "" "Project-Id-Version: MusicBrainz\n" "PO-Revision-Date: 2019-10-21 23:42+0000\n" "Last-Translator: Michael Wiencek \n" "Language-Team: Danish (http://www.transifex.com/musicbrainz/musicbrainz/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: DB:work_type/description:9 msgctxt "work_type" msgid "" "\"Motet\" is a term that applies to different types of (usually " "unaccompanied) choral works. What exactly is a motet depends quite a bit on " "the period." msgstr "" #: DB:work_type/description:5 msgctxt "work_type" msgid "" "\"Sonata\" is a general term used to describe small scale (very often solo " "or solo + keyboard) instrumental works, initially in baroque music." msgstr "" #: DB:medium_format/name:54 msgctxt "medium_format" msgid "10\" Shellac" msgstr "" #: DB:medium_format/name:30 msgctxt "medium_format" msgid "10\" Vinyl" msgstr "10\" vinyl" #: DB:medium_format/name:72 msgctxt "medium_format" msgid "12\" LaserDisc" msgstr "" #: DB:medium_format/name:55 msgctxt "medium_format" msgid "12\" Shellac" msgstr "" #: DB:medium_format/name:31 msgctxt "medium_format" msgid "12\" Vinyl" msgstr "12\" vinyl" #: DB:medium_format/name:49 msgctxt "medium_format" msgid "3.5\" Floppy Disk" msgstr "" #: DB:medium_format/name:52 msgctxt "medium_format" msgid "7\" Flexi-disc" msgstr "" #: DB:medium_format/name:56 msgctxt "medium_format" msgid "7\" Shellac" msgstr "" #: DB:medium_format/name:29 msgctxt "medium_format" msgid "7\" Vinyl" msgstr "7\" vinyl" #: DB:medium_format/name:71 msgctxt "medium_format" msgid "8\" LaserDisc" msgstr "" #: DB:medium_format/name:78 msgctxt "medium_format" msgid "8-Track Cartridge" msgstr "" #: DB:medium_format/name:34 msgctxt "medium_format" msgid "8cm CD" msgstr "8cm CD" #: DB:medium_format/name:40 msgctxt "medium_format" msgid "8cm CD+G" msgstr "8cm CD+G" #: DB:medium_format/description:58 msgctxt "medium_format" msgid "" "90 rpm, vertical-cut shellac discs, produced by the Pathé label from 1906 to" " 1932." msgstr "" #: DB:work_attribute_type_allowed_value/value:794 msgctxt "work_attribute_type_allowed_value" msgid "A Dorian" msgstr "A‐dorisk" #: DB:work_attribute_type_allowed_value/value:806 msgctxt "work_attribute_type_allowed_value" msgid "A Mixolydian" msgstr "" #: DB:work_type/description:2 msgctxt "work_type" msgid "" "A ballet is music composed to be used, together with a choreography, for a " "ballet dance production." msgstr "" #: DB:work_type/description:3 msgctxt "work_type" msgid "" "A cantata is a vocal (often choral) composition with an instrumental " "(usually orchestral) accompaniment, typically in several movements." msgstr "" #: DB:work_type/description:4 msgctxt "work_type" msgid "" "A concerto is a musical work for soloist(s) accompanied by an orchestra." msgstr "" #: DB:event_type/description:4 msgctxt "event_type" msgid "" "A convention, expo or trade fair is an event which is not typically " "orientated around music performances, but can include them as side " "activities." msgstr "" #: DB:release_status/description:2 msgctxt "release_status" msgid "" "A give-away release or a release intended to promote an upcoming official " "release (e.g. pre-release versions, releases included with a magazine, " "versions supplied to radio DJs for air-play)." msgstr "" #: DB:instrument_type/description:7 msgctxt "instrument_type" msgid "" "A grouping of related but different instruments, like the different violin-" "like instruments" msgstr "" #: DB:work_attribute_type_allowed_value/value:28 msgctxt "work_attribute_type_allowed_value" msgid "A major" msgstr "A‐dur" #: DB:work_type/description:8 msgctxt "work_type" msgid "" "A mass is a choral composition that sets the invariable portions of the " "Christian Eucharistic liturgy (Kyrie - Gloria - Credo - Sanctus - Benedictus" " - Agnus Dei, with other portions sometimes added) to music." msgstr "" #: DB:event_type/description:5 msgctxt "event_type" msgid "" "A masterclass or clinic is an event where an artist meets with a small to " "medium-sized audience and instructs them individually and/or takes questions" " intended to improve the audience members' playing skills." msgstr "" #: DB:work_attribute_type_allowed_value/value:29 msgctxt "work_attribute_type_allowed_value" msgid "A minor" msgstr "A‐mol" #: DB:work_type/description:13 msgctxt "work_type" msgid "" "A partita is an instrumental piece composed of a series of variations, and " "it's by its current definition very similar to a suite." msgstr "" #: DB:event_type/description:3 msgctxt "event_type" msgid "" "A party, reception or other event held specifically for the launch of a " "release." msgstr "" #: DB:release_packaging/description:17 msgctxt "release_packaging" msgid "A perfect bound book with a sleeve at the end to hold a CD" msgstr "" #: DB:place_type/description:8 msgctxt "place_type" msgid "" "A place (generally a factory) at which physical media are manufactured." msgstr "" #: DB:place_type/description:5 msgctxt "place_type" msgid "" "A place consisting of a large enclosed area with a central event space " "surrounded by tiered seating for spectators, which can be used for indoor " "sports, concerts and other entertainment events." msgstr "" #: DB:place_type/description:1 msgctxt "place_type" msgid "" "A place designed for non-live production of music, typically a recording " "studio." msgstr "" #: DB:place_type/description:2 msgctxt "place_type" msgid "" "A place that has live artistic performances as one of its primary functions," " such as a concert hall." msgstr "" #: DB:place_type/description:6 msgctxt "place_type" msgid "" "A place that has worship or religious studies as its main function. " "Religious buildings often host concerts and serve as recording locations, " "especially for classical music." msgstr "" #: DB:place_type/description:4 msgctxt "place_type" msgid "" "A place whose main purpose is to host outdoor sport events, typically " "consisting of a pitch surrounded by a structure for spectators with no roof," " or a roof which can be retracted." msgstr "" #: DB:work_type/description:28 msgctxt "work_type" msgid "" "A play is a form of literature usually consisting of scripted dialogue " "between characters, and intended for theatrical performance rather than just" " reading." msgstr "" #: DB:work_type/description:21 msgctxt "work_type" msgid "" "A poem is a literary piece, generally short and in verse, where words are " "usually chosen for their sound and for the images and ideas they suggest." msgstr "" #: DB:work_type/description:14 msgctxt "work_type" msgid "" "A quartet is a musical composition scored for four voices or instruments." msgstr "" #: DB:series_type/description:8 msgctxt "series_type" msgid "A recurring festival, usually happening annually in the same location." msgstr "" #: DB:place_type/description:7 msgctxt "place_type" msgid "" "A school, university or other similar educational institution (especially, " "but not only, one where music is taught)" msgstr "" #: DB:series_type/description:6 msgctxt "series_type" msgid "A series of events." msgstr "" #: DB:series_type/description:9 msgctxt "series_type" msgid "A series of performances of the same show at the same venue." msgstr "" #: DB:series_type/description:3 msgctxt "series_type" msgid "A series of recordings." msgstr "" #: DB:series_type/description:7 msgctxt "series_type" msgid "A series of related concerts by an artist in different locations." msgstr "" #: DB:series_type/description:1 msgctxt "series_type" msgid "A series of release groups." msgstr "" #: DB:series_type/description:2 msgctxt "series_type" msgid "A series of releases." msgstr "" #: DB:series_type/description:5 msgctxt "series_type" msgid "A series of works which form a catalogue of classical compositions." msgstr "" #: DB:series_type/description:4 msgctxt "series_type" msgid "A series of works." msgstr "" #: DB:work_type/description:15 msgctxt "work_type" msgid "" "A song cycle is a group of songs designed to be performed in a sequence as a" " single entity. In most cases, all of the songs are by the same composer, " "and often use words from the same poet or lyricist." msgstr "" #: DB:work_type/description:17 msgctxt "work_type" msgid "" "A song is in its origin (and still in most cases) a composition for voice, " "with or without instruments, performed by singing. This is the most common " "form by far in folk and popular music, but also fairly common in a classical" " context (\"art songs\")." msgstr "" #: DB:work_type/description:22 msgctxt "work_type" msgid "" "A soundtrack is the music that accompanies a film, TV program, videogame, or" " even book." msgstr "" #: DB:instrument_type/description:6 msgctxt "instrument_type" msgid "" "A standard grouping of instruments often played together, like a string " "quartet" msgstr "" #: DB:work_type/description:6 msgctxt "work_type" msgid "" "A suite is an ordered set of instrumental or orchestral pieces normally " "performed in a concert setting. They may be extracts from a ballet or opera," " or entirely original movements." msgstr "" #: DB:work_type/description:18 msgctxt "work_type" msgid "" "A symphonic poem is a piece of programmatic orchestral music, usually in a " "single movement, that evokes a painting, a landscape, the content of a poem," " a story or novel, or other non-musical source." msgstr "" #: DB:work_type/description:16 msgctxt "work_type" msgid "" "A symphony is an extended composition, almost always scored for orchestra " "without soloists." msgstr "" #: DB:release_packaging/description:2 msgctxt "release_packaging" msgid "A thinner jewel case, commonly used for CD singles." msgstr "" #: DB:work_type/description:19 msgctxt "work_type" msgid "" "A zarzuela is a Spanish lyric-dramatic work that alternates between spoken " "and sung scenes, the latter incorporating operatic and popular song, as well" " as dance." msgstr "" #: DB:work_attribute_type_allowed_value/value:26 msgctxt "work_attribute_type_allowed_value" msgid "A-flat major" msgstr "Aes‐dur" #: DB:work_attribute_type_allowed_value/value:27 msgctxt "work_attribute_type_allowed_value" msgid "A-flat minor" msgstr "Aes‐mol" #: DB:work_attribute_type_allowed_value/value:817 msgctxt "work_attribute_type_allowed_value" msgid "A-sharp major" msgstr "" #: DB:work_attribute_type_allowed_value/value:30 msgctxt "work_attribute_type_allowed_value" msgid "A-sharp minor" msgstr "Ais‐mol" #: DB:work_attribute_type/name:23 msgctxt "work_attribute_type" msgid "AKM ID" msgstr "" #: DB:work_attribute_type/name:13 msgctxt "work_attribute_type" msgid "APRA ID" msgstr "APRA‐id" #: DB:work_attribute_type/name:6 msgctxt "work_attribute_type" msgid "ASCAP ID" msgstr "ASCAP‐id" #: DB:work_attribute_type_allowed_value/value:299 msgctxt "work_attribute_type_allowed_value" msgid "Acem" msgstr "Acem" #: DB:work_attribute_type_allowed_value/value:305 msgctxt "work_attribute_type_allowed_value" msgid "Acem Nevruz" msgstr "Acem Nevruz" #: DB:work_attribute_type_allowed_value/value:306 msgctxt "work_attribute_type_allowed_value" msgid "Acem Rast" msgstr "Acem Rast" #: DB:work_attribute_type_allowed_value/value:300 msgctxt "work_attribute_type_allowed_value" msgid "Acem Zemzeme" msgstr "Acem Zemzeme" #: DB:work_attribute_type_allowed_value/value:301 msgctxt "work_attribute_type_allowed_value" msgid "Acemaşiran" msgstr "Acemaşiran" #: DB:work_attribute_type_allowed_value/value:302 msgctxt "work_attribute_type_allowed_value" msgid "Acembuselik" msgstr "Acembuselik" #: DB:work_attribute_type_allowed_value/value:303 msgctxt "work_attribute_type_allowed_value" msgid "Acemkürdi" msgstr "Acemkürdi" #: DB:work_attribute_type_allowed_value/value:304 msgctxt "work_attribute_type_allowed_value" msgid "Acemli Yegah" msgstr "Acemli Yegah" #: DB:work_attribute_type_allowed_value/value:307 msgctxt "work_attribute_type_allowed_value" msgid "Acemtarab" msgstr "Acemtarab" #: DB:work_attribute_type_allowed_value/value:848 msgctxt "work_attribute_type_allowed_value" msgid "Adānā" msgstr "" #: DB:work_attribute_type_allowed_value/value:849 msgctxt "work_attribute_type_allowed_value" msgid "Adānā malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:308 msgctxt "work_attribute_type_allowed_value" msgid "Aheng-i Tarab" msgstr "Aheng-i Tarab" #: DB:work_attribute_type_allowed_value/value:850 msgctxt "work_attribute_type_allowed_value" msgid "Ahir lalit" msgstr "" #: DB:work_attribute_type_allowed_value/value:851 msgctxt "work_attribute_type_allowed_value" msgid "Ahira bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:852 msgctxt "work_attribute_type_allowed_value" msgid "Ahiri tōḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:309 msgctxt "work_attribute_type_allowed_value" msgid "Ak Dügah" msgstr "Ak Dügah" #: DB:work_attribute_type_allowed_value/value:690 msgctxt "work_attribute_type_allowed_value" msgid "Aksak" msgstr "Aksak" #: DB:work_attribute_type_allowed_value/value:691 msgctxt "work_attribute_type_allowed_value" msgid "Aksaksemai" msgstr "Aksaksemai" #: DB:work_attribute_type_allowed_value/value:692 msgctxt "work_attribute_type_allowed_value" msgid "Aksaksemai Evferi" msgstr "Aksaksemai Evferi" #: DB:work_attribute_type_allowed_value/value:853 msgctxt "work_attribute_type_allowed_value" msgid "Alahaiyā bilāval" msgstr "" #: DB:release_group_primary_type/name:1 msgctxt "release_group_primary_type" msgid "Album" msgstr "album" #: DB:series_ordering_type/description:2 msgctxt "series_ordering_type" msgid "Allows for manually setting the position of each item in the series." msgstr "Gør det muligt at sætte placeringen af hver genstand i serien manuelt." #: DB:work_attribute_type_allowed_value/value:854 msgctxt "work_attribute_type_allowed_value" msgid "Ambikā" msgstr "" #: DB:work_attribute_type_allowed_value/value:855 msgctxt "work_attribute_type_allowed_value" msgid "Amr̥t varṣiṇi" msgstr "" #: DB:work_attribute_type_allowed_value/value:40 msgctxt "work_attribute_type_allowed_value" msgid "Amṛtavarṣiṇi" msgstr "Amṛtavarṣiṇi" #: DB:work_attribute_type_allowed_value/value:39 msgctxt "work_attribute_type_allowed_value" msgid "Amṛtavāhiṇi" msgstr "Amṛtavāhiṇi" #: DB:release_status/description:4 msgctxt "release_status" msgid "" "An alternate version of a release where the titles have been changed. These " "don't correspond to any real release and should be linked to the original " "release using the transl(iter)ation relationship." msgstr "" #: DB:work_type/description:1 msgctxt "work_type" msgid "" "An aria is a self-contained piece for one voice usually with orchestral " "accompaniment. They are most common inside operas, but also appear in " "cantatas, oratorios and even on their own (concert arias)." msgstr "" #: DB:work_type/description:25 msgctxt "work_type" msgid "" "An audio drama is a dramatized, purely acoustic performance, broadcast on " "radio or published on an audio medium (tape, CD, etc.)." msgstr "" #: DB:event_type/description:2 msgctxt "event_type" msgid "" "An event where a number of different acts perform across the course of the " "day. Larger festivals may be spread across multiple days." msgstr "" #: DB:event_type/description:1 msgctxt "event_type" msgid "" "An individual concert by a single artist or collaboration, often with " "supporting artists who perform before the main act." msgstr "" #: DB:work_type/description:10 msgctxt "work_type" msgid "" "An opera is a dramatised work (text + musical score) for singers and " "orchestra/ensemble. In true operas all dialog is sung, through arias and " "recitatives, but some styles of opera include spoken dialogue." msgstr "" #: DB:work_type/description:11 msgctxt "work_type" msgid "" "An oratorio is a large (usually sacred) musical composition including an " "orchestra, a choir, and soloists. While it has characters and a plot, it is " "usually not performed theatrically (it lacks costumes, props and strong " "character interaction)." msgstr "" #: DB:work_type/description:12 msgctxt "work_type" msgid "" "An overture is, generally, the instrumental introduction to an opera. " "Independent (\"concert\") overtures also exist, which are generally " "programmatic works shorter than a symphonic poem." msgstr "" #: DB:release_status/description:3 msgctxt "release_status" msgid "" "An unofficial/underground release that was not sanctioned by the artist " "and/or the record company. This includes unofficial live recordings and " "pirated releases." msgstr "" #: DB:work_type/description:20 msgctxt "work_type" msgid "" "An étude is an instrumental musical composition, most commonly of " "considerable difficulty, usually designed to provide practice material for " "perfecting a particular technical skill." msgstr "" #: DB:work_attribute_type_allowed_value/value:310 msgctxt "work_attribute_type_allowed_value" msgid "Anberefşan" msgstr "" #: DB:release_status/description:1 msgctxt "release_status" msgid "" "Any release officially sanctioned by the artist and/or their record company." " Most releases will fit into this category." msgstr "" #: DB:work_attribute_type_allowed_value/value:311 msgctxt "work_attribute_type_allowed_value" msgid "Araban" msgstr "" #: DB:work_attribute_type_allowed_value/value:312 msgctxt "work_attribute_type_allowed_value" msgid "Arabanbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:313 msgctxt "work_attribute_type_allowed_value" msgid "Arabankurdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:314 msgctxt "work_attribute_type_allowed_value" msgid "Aram-ı Can" msgstr "" #: DB:work_attribute_type_allowed_value/value:315 msgctxt "work_attribute_type_allowed_value" msgid "Aram-ı Dil" msgstr "" #: DB:work_attribute_type_allowed_value/value:604 msgctxt "work_attribute_type_allowed_value" msgid "Aranağme" msgstr "" #: DB:work_attribute_type_allowed_value/value:316 msgctxt "work_attribute_type_allowed_value" msgid "Arazbar" msgstr "" #: DB:work_attribute_type_allowed_value/value:317 msgctxt "work_attribute_type_allowed_value" msgid "Arazbar Zemzeme" msgstr "" #: DB:work_attribute_type_allowed_value/value:318 msgctxt "work_attribute_type_allowed_value" msgid "Arazbarbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:319 msgctxt "work_attribute_type_allowed_value" msgid "Arazbarek" msgstr "" #: DB:editor_collection_type/name:7 msgctxt "collection_type" msgid "Area" msgstr "" #: DB:area_alias_type/name:1 msgctxt "alias_type" msgid "Area name" msgstr "områdenavn" #: DB:work_type/name:1 msgctxt "work_type" msgid "Aria" msgstr "arie" #: DB:editor_collection_type/name:8 msgctxt "collection_type" msgid "Artist" msgstr "" #: DB:artist_alias_type/name:1 msgctxt "alias_type" msgid "Artist name" msgstr "kunstnernavn" #: DB:work_attribute_type_allowed_value/value:693 msgctxt "work_attribute_type_allowed_value" msgid "Artık Aksaksemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:856 msgctxt "work_attribute_type_allowed_value" msgid "Asā māṇḍ" msgstr "" #: DB:work_attribute_type_allowed_value/value:44 msgctxt "work_attribute_type_allowed_value" msgid "Asāvēri" msgstr "Asāvēri" #: DB:editor_collection_type/name:5 msgctxt "collection_type" msgid "Attending" msgstr "" #: DB:release_group_secondary_type/name:11 msgctxt "release_group_secondary_type" msgid "Audio drama" msgstr "" #: DB:work_type/name:25 msgctxt "work_type" msgid "Audio drama" msgstr "" #: DB:release_group_secondary_type/name:5 msgctxt "release_group_secondary_type" msgid "Audiobook" msgstr "lydbog" #: DB:series_ordering_type/name:1 msgctxt "series_ordering_type" msgid "Automatic" msgstr "" #: DB:work_attribute_type_allowed_value/value:694 msgctxt "work_attribute_type_allowed_value" msgid "Aydın" msgstr "" #: DB:work_attribute_type_allowed_value/value:695 msgctxt "work_attribute_type_allowed_value" msgid "Ayin Devr-i Revanı" msgstr "" #: DB:work_attribute_type_allowed_value/value:605 msgctxt "work_attribute_type_allowed_value" msgid "Ayin-i Şerif" msgstr "" #: DB:work_attribute_type_allowed_value/value:696 msgctxt "work_attribute_type_allowed_value" msgid "Azeri Yürüksemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:682 msgctxt "work_attribute_type_allowed_value" msgid "Ağır Aksaksemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:683 msgctxt "work_attribute_type_allowed_value" msgid "Ağıraksak" msgstr "" #: DB:work_attribute_type_allowed_value/value:684 msgctxt "work_attribute_type_allowed_value" msgid "Ağıraydın" msgstr "" #: DB:work_attribute_type_allowed_value/value:686 msgctxt "work_attribute_type_allowed_value" msgid "Ağırdarbıfetih" msgstr "" #: DB:work_attribute_type_allowed_value/value:687 msgctxt "work_attribute_type_allowed_value" msgid "Ağırdüyek" msgstr "" #: DB:work_attribute_type_allowed_value/value:688 msgctxt "work_attribute_type_allowed_value" msgid "Ağırevfer" msgstr "" #: DB:work_attribute_type_allowed_value/value:603 msgctxt "work_attribute_type_allowed_value" msgid "Ağırsemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:689 msgctxt "work_attribute_type_allowed_value" msgid "Ağırsenginsemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:685 msgctxt "work_attribute_type_allowed_value" msgid "Ağırçenber" msgstr "" #: DB:work_attribute_type_allowed_value/value:321 msgctxt "work_attribute_type_allowed_value" msgid "Aşiran Maye" msgstr "" #: DB:work_attribute_type_allowed_value/value:320 msgctxt "work_attribute_type_allowed_value" msgid "Aşiran Zemzeme" msgstr "" #: DB:work_attribute_type_allowed_value/value:322 msgctxt "work_attribute_type_allowed_value" msgid "Aşkefza" msgstr "" #: DB:work_attribute_type_allowed_value/value:857 msgctxt "work_attribute_type_allowed_value" msgid "Aṣṭa rāg mālikā" msgstr "" #: DB:work_attribute_type_allowed_value/value:45 msgctxt "work_attribute_type_allowed_value" msgid "Aṭāna" msgstr "Aṭāna" #: DB:work_attribute_type_allowed_value/value:289 msgctxt "work_attribute_type_allowed_value" msgid "Aṭṭa" msgstr "" #: DB:work_attribute_type_allowed_value/value:795 msgctxt "work_attribute_type_allowed_value" msgid "B Dorian" msgstr "" #: DB:work_attribute_type_allowed_value/value:807 msgctxt "work_attribute_type_allowed_value" msgid "B Mixolydian" msgstr "" #: DB:work_attribute_type_allowed_value/value:33 msgctxt "work_attribute_type_allowed_value" msgid "B major" msgstr "H-dur" #: DB:work_attribute_type_allowed_value/value:34 msgctxt "work_attribute_type_allowed_value" msgid "B minor" msgstr "H-mol" #: DB:work_attribute_type_allowed_value/value:31 msgctxt "work_attribute_type_allowed_value" msgid "B-flat major" msgstr "" #: DB:work_attribute_type_allowed_value/value:32 msgctxt "work_attribute_type_allowed_value" msgid "B-flat minor" msgstr "" #: DB:work_attribute_type_allowed_value/value:818 msgctxt "work_attribute_type_allowed_value" msgid "B-sharp major" msgstr "" #: DB:work_attribute_type_allowed_value/value:819 msgctxt "work_attribute_type_allowed_value" msgid "B-sharp minor" msgstr "" #: DB:work_attribute_type/name:7 msgctxt "work_attribute_type" msgid "BMI ID" msgstr "BMI-id" #: DB:work_attribute_type/name:26 msgctxt "work_attribute_type" msgid "BUMA/STEMRA ID" msgstr "" #: DB:cover_art_archive.art_type/name:2 msgctxt "cover_art_type" msgid "Back" msgstr "bagside" #: DB:work_attribute_type_allowed_value/value:323 msgctxt "work_attribute_type_allowed_value" msgid "Bahr-ı Nazik" msgstr "" #: DB:work_attribute_type_allowed_value/value:47 msgctxt "work_attribute_type_allowed_value" msgid "Bahudāri" msgstr "Bahudāri" #: DB:work_attribute_type_allowed_value/value:862 msgctxt "work_attribute_type_allowed_value" msgid "Bahādurī tōḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:863 msgctxt "work_attribute_type_allowed_value" msgid "Bahār" msgstr "" #: DB:work_attribute_type_allowed_value/value:864 msgctxt "work_attribute_type_allowed_value" msgid "Bairāgi" msgstr "" #: DB:work_attribute_type_allowed_value/value:48 msgctxt "work_attribute_type_allowed_value" msgid "Balahaṁsa" msgstr "Balahaṁsa" #: DB:work_type/name:2 msgctxt "work_type" msgid "Ballet" msgstr "ballet" #: DB:work_attribute_type_allowed_value/value:866 msgctxt "work_attribute_type_allowed_value" msgid "Basant" msgstr "" #: DB:work_attribute_type_allowed_value/value:867 msgctxt "work_attribute_type_allowed_value" msgid "Basant bahār" msgstr "" #: DB:work_attribute_type_allowed_value/value:868 msgctxt "work_attribute_type_allowed_value" msgid "Basant mukhāri" msgstr "" #: DB:work_attribute_type_allowed_value/value:869 msgctxt "work_attribute_type_allowed_value" msgid "Basantī kēdār" msgstr "" #: DB:work_attribute_type_allowed_value/value:49 msgctxt "work_attribute_type_allowed_value" msgid "Bauḷi" msgstr "Bauḷi" #: DB:work_attribute_type_allowed_value/value:51 msgctxt "work_attribute_type_allowed_value" msgid "Behāg" msgstr "Behāg" #: DB:work_type/name:26 msgctxt "work_type" msgid "Beijing opera" msgstr "" #: DB:work_type/description:26 msgctxt "work_type" msgid "" "Beijing opera is a form of traditional Chinese theatre which combines music," " vocal performance, mime, dance, and acrobatics." msgstr "" #: DB:work_attribute_type_allowed_value/value:697 msgctxt "work_attribute_type_allowed_value" msgid "Bektaşi Devr-i Revanı" msgstr "" #: DB:work_attribute_type_allowed_value/value:698 msgctxt "work_attribute_type_allowed_value" msgid "Bektaşi Raksanı" msgstr "" #: DB:work_attribute_type_allowed_value/value:699 msgctxt "work_attribute_type_allowed_value" msgid "Bektaşi Raksı" msgstr "" #: DB:work_attribute_type_allowed_value/value:700 msgctxt "work_attribute_type_allowed_value" msgid "Bektaşi Raksı Evferi" msgstr "" #: DB:work_attribute_type_allowed_value/value:324 msgctxt "work_attribute_type_allowed_value" msgid "Bend-i Hisar" msgstr "" #: DB:work_attribute_type_allowed_value/value:701 msgctxt "work_attribute_type_allowed_value" msgid "Berefşan" msgstr "" #: DB:work_attribute_type_allowed_value/value:606 msgctxt "work_attribute_type_allowed_value" msgid "Beste" msgstr "" #: DB:work_attribute_type_allowed_value/value:702 msgctxt "work_attribute_type_allowed_value" msgid "Beste Devr-i Revanı" msgstr "" #: DB:work_attribute_type_allowed_value/value:325 msgctxt "work_attribute_type_allowed_value" msgid "Beste Hicaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:326 msgctxt "work_attribute_type_allowed_value" msgid "Beste Hisar" msgstr "" #: DB:work_attribute_type_allowed_value/value:327 msgctxt "work_attribute_type_allowed_value" msgid "Beste Isfahan" msgstr "" #: DB:work_attribute_type_allowed_value/value:328 msgctxt "work_attribute_type_allowed_value" msgid "Bestenigar" msgstr "" #: DB:medium_format/name:24 msgctxt "medium_format" msgid "Betamax" msgstr "Betamax" #: DB:work_attribute_type_allowed_value/value:329 msgctxt "work_attribute_type_allowed_value" msgid "Beyati" msgstr "" #: DB:work_attribute_type_allowed_value/value:331 msgctxt "work_attribute_type_allowed_value" msgid "Beyati Araban" msgstr "" #: DB:work_attribute_type_allowed_value/value:332 msgctxt "work_attribute_type_allowed_value" msgid "Beyati Arabanbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:333 msgctxt "work_attribute_type_allowed_value" msgid "Beyati Arabankurdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:330 msgctxt "work_attribute_type_allowed_value" msgid "Beyati Ruy-i Acem" msgstr "" #: DB:work_attribute_type_allowed_value/value:334 msgctxt "work_attribute_type_allowed_value" msgid "Beyatibuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:335 msgctxt "work_attribute_type_allowed_value" msgid "Bezm-i Tarab" msgstr "" #: DB:work_attribute_type_allowed_value/value:870 msgctxt "work_attribute_type_allowed_value" msgid "Bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:871 msgctxt "work_attribute_type_allowed_value" msgid "Bhairav bahār" msgstr "" #: DB:work_attribute_type_allowed_value/value:52 #: DB:work_attribute_type_allowed_value/value:872 msgctxt "work_attribute_type_allowed_value" msgid "Bhairavi" msgstr "Bhairavi" #: DB:work_attribute_type_allowed_value/value:874 msgctxt "work_attribute_type_allowed_value" msgid "Bhavamat bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:53 msgctxt "work_attribute_type_allowed_value" msgid "Bhavāni" msgstr "Bhavāni" #: DB:work_attribute_type_allowed_value/value:876 msgctxt "work_attribute_type_allowed_value" msgid "Bhimapalās" msgstr "" #: DB:work_attribute_type_allowed_value/value:877 msgctxt "work_attribute_type_allowed_value" msgid "Bhinna ṣaḍja" msgstr "" #: DB:work_attribute_type_allowed_value/value:54 msgctxt "work_attribute_type_allowed_value" msgid "Bhāvapriya" msgstr "Bhāvapriya" #: DB:work_attribute_type_allowed_value/value:873 msgctxt "work_attribute_type_allowed_value" msgid "Bhāṭiyār" msgstr "" #: DB:work_attribute_type_allowed_value/value:875 msgctxt "work_attribute_type_allowed_value" msgid "Bhīm" msgstr "" #: DB:work_attribute_type_allowed_value/value:55 msgctxt "work_attribute_type_allowed_value" msgid "Bhīmpalāsi" msgstr "Bhīmpalāsi" #: DB:work_attribute_type_allowed_value/value:56 msgctxt "work_attribute_type_allowed_value" msgid "Bhōga sāvēri" msgstr "Bhōga sāvēri" #: DB:work_attribute_type_allowed_value/value:878 msgctxt "work_attribute_type_allowed_value" msgid "Bhōpālī tōḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:879 msgctxt "work_attribute_type_allowed_value" msgid "Bhūp" msgstr "" #: DB:work_attribute_type_allowed_value/value:57 msgctxt "work_attribute_type_allowed_value" msgid "Bhūpāḷaṁ" msgstr "Bhūpāḷaṁ" #: DB:work_attribute_type_allowed_value/value:58 msgctxt "work_attribute_type_allowed_value" msgid "Bhūṣāvaḷi" msgstr "Bhūṣāvaḷi" #: DB:work_attribute_type_allowed_value/value:880 msgctxt "work_attribute_type_allowed_value" msgid "Bibhās" msgstr "" #: DB:work_attribute_type_allowed_value/value:882 msgctxt "work_attribute_type_allowed_value" msgid "Bihāg" msgstr "" #: DB:work_attribute_type_allowed_value/value:883 msgctxt "work_attribute_type_allowed_value" msgid "Bihāgdā" msgstr "" #: DB:work_attribute_type_allowed_value/value:59 msgctxt "work_attribute_type_allowed_value" msgid "Bilahari" msgstr "Bilahari" #: DB:work_attribute_type_allowed_value/value:884 msgctxt "work_attribute_type_allowed_value" msgid "Bilāsakhānī tōḍī" msgstr "" #: DB:medium_format/name:20 msgctxt "medium_format" msgid "Blu-ray" msgstr "Blu-ray" #: DB:medium_format/name:79 msgctxt "medium_format" msgid "Blu-ray-R" msgstr "" #: DB:medium_format/name:35 msgctxt "medium_format" msgid "Blu-spec CD" msgstr "Blu-spec CD" #: DB:release_packaging/name:9 msgctxt "release_packaging" msgid "Book" msgstr "bog" #: DB:cover_art_archive.art_type/name:3 msgctxt "cover_art_type" msgid "Booklet" msgstr "" #: DB:release_status/name:3 msgctxt "release_status" msgid "Bootleg" msgstr "" #: DB:label_type/name:5 msgctxt "label_type" msgid "Bootleg Production" msgstr "" #: DB:release_packaging/name:19 msgctxt "release_packaging" msgid "Box" msgstr "" #: DB:work_attribute_type_allowed_value/value:607 msgctxt "work_attribute_type_allowed_value" msgid "Bozlak" msgstr "" #: DB:instrument_alias_type/name:3 msgctxt "alias_type" msgid "Brand name" msgstr "" #: DB:release_group_primary_type/name:12 msgctxt "release_group_primary_type" msgid "Broadcast" msgstr "" #: DB:work_attribute_type_allowed_value/value:885 msgctxt "work_attribute_type_allowed_value" msgid "Br̥ndāvanī sāraṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:62 msgctxt "work_attribute_type_allowed_value" msgid "Budamanōhari" msgstr "Budamanōhari" #: DB:work_attribute_type_allowed_value/value:703 msgctxt "work_attribute_type_allowed_value" msgid "Bulgar Darbı" msgstr "" #: DB:work_attribute_type_allowed_value/value:336 msgctxt "work_attribute_type_allowed_value" msgid "Buselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:337 msgctxt "work_attribute_type_allowed_value" msgid "Buselikaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:338 msgctxt "work_attribute_type_allowed_value" msgid "Büzürk" msgstr "" #: DB:work_attribute_type_allowed_value/value:46 #: DB:work_attribute_type_allowed_value/value:861 msgctxt "work_attribute_type_allowed_value" msgid "Bāgēśrī" msgstr "Bāgēśrī" #: DB:work_attribute_type_allowed_value/value:865 msgctxt "work_attribute_type_allowed_value" msgid "Bārvā" msgstr "" #: DB:work_attribute_type_allowed_value/value:50 msgctxt "work_attribute_type_allowed_value" msgid "Bēgaḍa" msgstr "Bēgaḍa" #: DB:work_attribute_type_allowed_value/value:881 msgctxt "work_attribute_type_allowed_value" msgid "Bīhād bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:60 msgctxt "work_attribute_type_allowed_value" msgid "Bṛndāvana sāranga" msgstr "Bṛndāvana sāranga" #: DB:work_attribute_type_allowed_value/value:61 msgctxt "work_attribute_type_allowed_value" msgid "Bṛndāvani" msgstr "Bṛndāvani" #: DB:work_attribute_type_allowed_value/value:789 msgctxt "work_attribute_type_allowed_value" msgid "C Dorian" msgstr "" #: DB:work_attribute_type_allowed_value/value:801 msgctxt "work_attribute_type_allowed_value" msgid "C Mixolydian" msgstr "" #: DB:work_attribute_type_allowed_value/value:2 msgctxt "work_attribute_type_allowed_value" msgid "C major" msgstr "C-dur" #: DB:work_attribute_type_allowed_value/value:3 msgctxt "work_attribute_type_allowed_value" msgid "C minor" msgstr "C-mol" #: DB:work_attribute_type_allowed_value/value:1 msgctxt "work_attribute_type_allowed_value" msgid "C-flat major" msgstr "Ces-dur" #: DB:work_attribute_type_allowed_value/value:812 msgctxt "work_attribute_type_allowed_value" msgid "C-flat minor" msgstr "" #: DB:work_attribute_type_allowed_value/value:4 msgctxt "work_attribute_type_allowed_value" msgid "C-sharp major" msgstr "Cis-dur" #: DB:work_attribute_type_allowed_value/value:5 msgctxt "work_attribute_type_allowed_value" msgid "C-sharp minor" msgstr "Cis-mol" #: DB:work_attribute_type/name:19 msgctxt "work_attribute_type" msgid "CASH ID" msgstr "" #: DB:work_attribute_type/name:22 msgctxt "work_attribute_type" msgid "CCLI ID" msgstr "" #: DB:medium_format/name:1 msgctxt "medium_format" msgid "CD" msgstr "CD" #: DB:medium_format/name:39 msgctxt "medium_format" msgid "CD+G" msgstr "CD+G" #: DB:medium_format/name:33 msgctxt "medium_format" msgid "CD-R" msgstr "CD-R" #: DB:medium_format/name:41 msgctxt "medium_format" msgid "CDV" msgstr "" #: DB:medium_format/name:60 msgctxt "medium_format" msgid "CED" msgstr "" #: DB:work_attribute_type_allowed_value/value:63 msgctxt "work_attribute_type_allowed_value" msgid "Cakravākaṁ" msgstr "Cakravākaṁ" #: DB:work_attribute_type_allowed_value/value:886 msgctxt "work_attribute_type_allowed_value" msgid "Campak" msgstr "" #: DB:work_attribute_type_allowed_value/value:887 msgctxt "work_attribute_type_allowed_value" msgid "Campākali" msgstr "" #: DB:work_attribute_type_allowed_value/value:64 msgctxt "work_attribute_type_allowed_value" msgid "Candrajyōti" msgstr "Candrajyōti" #: DB:work_attribute_type_allowed_value/value:65 #: DB:work_attribute_type_allowed_value/value:888 msgctxt "work_attribute_type_allowed_value" msgid "Candrakauns" msgstr "Candrakauns" #: DB:work_attribute_type_allowed_value/value:889 msgctxt "work_attribute_type_allowed_value" msgid "Candramauli" msgstr "" #: DB:work_attribute_type_allowed_value/value:339 msgctxt "work_attribute_type_allowed_value" msgid "Canfeza" msgstr "" #: DB:work_type/name:3 msgctxt "work_type" msgid "Cantata" msgstr "kantate" #: DB:release_packaging/name:4 msgctxt "release_packaging" msgid "Cardboard/Paper Sleeve" msgstr "" #: DB:medium_format/name:9 msgctxt "medium_format" msgid "Cartridge" msgstr "" #: DB:work_attribute_type_allowed_value/value:66 msgctxt "work_attribute_type_allowed_value" msgid "Carturdaśa rāgamālika" msgstr "Carturdaśa rāgamālika" #: DB:medium_format/name:8 msgctxt "medium_format" msgid "Cassette" msgstr "kassette" #: DB:release_packaging/name:8 msgctxt "release_packaging" msgid "Cassette Case" msgstr "" #: DB:series_type/name:5 msgctxt "series_type" msgid "Catalogue" msgstr "" #: DB:work_attribute_type_allowed_value/value:291 msgctxt "work_attribute_type_allowed_value" msgid "Caturaśra-jāti jhaṁpe" msgstr "Caturaśra-jāti jhaṁpe" #: DB:work_attribute_type_allowed_value/value:827 msgctxt "work_attribute_type_allowed_value" msgid "Cautāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:70 msgctxt "work_attribute_type_allowed_value" msgid "Cencu kāmbhōji" msgstr "" #: DB:work_attribute_type_allowed_value/value:704 msgctxt "work_attribute_type_allowed_value" msgid "Cevher" msgstr "" #: DB:artist_type/name:4 msgctxt "artist_type" msgid "Character" msgstr "figur" #: DB:artist_type/name:6 msgctxt "artist_type" msgid "Choir" msgstr "kor" #: DB:work_attribute_type_allowed_value/value:892 msgctxt "work_attribute_type_allowed_value" msgid "Chāyā malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:893 msgctxt "work_attribute_type_allowed_value" msgid "Chāyānāt" msgstr "" #: DB:work_attribute_type_allowed_value/value:71 msgctxt "work_attribute_type_allowed_value" msgid "Cintāmaṇi" msgstr "" #: DB:work_attribute_type_allowed_value/value:72 msgctxt "work_attribute_type_allowed_value" msgid "Cittaranjani" msgstr "" #: DB:area_type/name:3 msgctxt "area_type" msgid "City" msgstr "by" #: DB:area_type/description:3 msgctxt "area_type" msgid "" "City is used for settlements of any size, including towns and villages." msgstr "" #: DB:release_group_secondary_type/name:1 msgctxt "release_group_secondary_type" msgid "Compilation" msgstr "opsamling" #: DB:event_type/name:1 msgctxt "event_type" msgid "Concert" msgstr "" #: DB:work_type/name:4 msgctxt "work_type" msgid "Concerto" msgstr "koncert" #: DB:event_type/name:4 msgctxt "event_type" msgid "Convention/Expo" msgstr "" #: DB:medium_format/name:61 msgctxt "medium_format" msgid "Copy Control CD" msgstr "" #: DB:medium_format/description:61 msgctxt "medium_format" msgid "" "Copy Control CD (CCCD) is an umbrella term for CDs released circa 2001-2006 " "containing software that is ostensibly designed to prevent the CD from being" " ripped. There are a number of software variants: the most well-known are " "Macrovision's Cactus Data Shield (CDS) and SunnComm's MediaMax." msgstr "" #: DB:area_type/name:1 msgctxt "area_type" msgid "Country" msgstr "land" #: DB:area_type/description:1 msgctxt "area_type" msgid "" "Country is used for areas included (or previously included) in ISO 3166-1, " "e.g. United States." msgstr "" #: DB:area_type/name:7 msgctxt "area_type" msgid "County" msgstr "" #: DB:area_type/description:7 msgctxt "area_type" msgid "" "County is used for smaller administrative divisions of a country which are " "not the main administrative divisions but are also not municipalities, e.g. " "counties in the USA. These are not considered when displaying the parent " "areas for a given area." msgstr "" #: DB:work_attribute_type_allowed_value/value:608 msgctxt "work_attribute_type_allowed_value" msgid "Cumhurilahi" msgstr "" #: DB:work_attribute_type_allowed_value/value:705 msgctxt "work_attribute_type_allowed_value" msgid "Curcuna" msgstr "" #: DB:work_attribute_type_allowed_value/value:890 msgctxt "work_attribute_type_allowed_value" msgid "Cāndanī kēdār" msgstr "" #: DB:work_attribute_type_allowed_value/value:825 msgctxt "work_attribute_type_allowed_value" msgid "Cār tāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:826 msgctxt "work_attribute_type_allowed_value" msgid "Cārtāl kī savārī" msgstr "" #: DB:work_attribute_type_allowed_value/value:67 #: DB:work_attribute_type_allowed_value/value:891 msgctxt "work_attribute_type_allowed_value" msgid "Cārukēśi" msgstr "" #: DB:work_attribute_type_allowed_value/value:68 msgctxt "work_attribute_type_allowed_value" msgid "Cāyānāṭa" msgstr "" #: DB:work_attribute_type_allowed_value/value:69 msgctxt "work_attribute_type_allowed_value" msgid "Cāyātarangiṇi" msgstr "Cāyātarangiṇi" #: DB:work_attribute_type_allowed_value/value:790 msgctxt "work_attribute_type_allowed_value" msgid "D Dorian" msgstr "" #: DB:work_attribute_type_allowed_value/value:802 msgctxt "work_attribute_type_allowed_value" msgid "D Mixolydian" msgstr "" #: DB:work_attribute_type_allowed_value/value:8 msgctxt "work_attribute_type_allowed_value" msgid "D major" msgstr "D-dur" #: DB:work_attribute_type_allowed_value/value:9 msgctxt "work_attribute_type_allowed_value" msgid "D minor" msgstr "D-mol" #: DB:work_attribute_type_allowed_value/value:6 msgctxt "work_attribute_type_allowed_value" msgid "D-flat major" msgstr "Dis-dur" #: DB:work_attribute_type_allowed_value/value:7 msgctxt "work_attribute_type_allowed_value" msgid "D-flat minor" msgstr "Des-mol" #: DB:work_attribute_type_allowed_value/value:813 msgctxt "work_attribute_type_allowed_value" msgid "D-sharp major" msgstr "" #: DB:work_attribute_type_allowed_value/value:10 msgctxt "work_attribute_type_allowed_value" msgid "D-sharp minor" msgstr "Dis-mol" #: DB:medium_format/name:11 msgctxt "medium_format" msgid "DAT" msgstr "DAT" #: DB:medium_format/name:16 msgctxt "medium_format" msgid "DCC" msgstr "DCC" #: DB:release_group_secondary_type/name:8 msgctxt "release_group_secondary_type" msgid "DJ-mix" msgstr "DJ-mix" #: DB:medium_format/name:44 msgctxt "medium_format" msgid "DTS CD" msgstr "" #: DB:medium_format/name:2 msgctxt "medium_format" msgid "DVD" msgstr "DVD" #: DB:medium_format/name:18 msgctxt "medium_format" msgid "DVD-Audio" msgstr "" #: DB:medium_format/name:19 msgctxt "medium_format" msgid "DVD-Video" msgstr "" #: DB:medium_format/name:47 msgctxt "medium_format" msgid "DVDplus" msgstr "" #: DB:medium_format/name:70 msgctxt "medium_format" msgid "DVDplus (CD side)" msgstr "" #: DB:medium_format/name:68 msgctxt "medium_format" msgid "DVDplus (DVD-Audio side)" msgstr "" #: DB:medium_format/name:69 msgctxt "medium_format" msgid "DVDplus (DVD-Video side)" msgstr "" #: DB:work_attribute_type_allowed_value/value:343 msgctxt "work_attribute_type_allowed_value" msgid "Danişveran" msgstr "" #: DB:work_attribute_type_allowed_value/value:711 msgctxt "work_attribute_type_allowed_value" msgid "Darb" msgstr "" #: DB:work_attribute_type_allowed_value/value:712 msgctxt "work_attribute_type_allowed_value" msgid "Darb-ı Fetih" msgstr "" #: DB:work_attribute_type_allowed_value/value:713 msgctxt "work_attribute_type_allowed_value" msgid "Darb-ı Hüner" msgstr "" #: DB:work_attribute_type_allowed_value/value:714 msgctxt "work_attribute_type_allowed_value" msgid "Darb-ı Kürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:715 msgctxt "work_attribute_type_allowed_value" msgid "Darb-ı Türki" msgstr "" #: DB:work_attribute_type_allowed_value/value:796 msgctxt "work_attribute_type_allowed_value" msgid "Darbeyn" msgstr "" #: DB:work_attribute_type_allowed_value/value:73 msgctxt "work_attribute_type_allowed_value" msgid "Darbār" msgstr "Darbār" #: DB:work_attribute_type_allowed_value/value:895 msgctxt "work_attribute_type_allowed_value" msgid "Darbāri" msgstr "" #: DB:work_attribute_type_allowed_value/value:74 msgctxt "work_attribute_type_allowed_value" msgid "Darbārī kānaḍa" msgstr "Darbārī kānaḍa" #: DB:work_attribute_type_allowed_value/value:896 msgctxt "work_attribute_type_allowed_value" msgid "Darbārī tōḍī" msgstr "" #: DB:medium_format/name:43 msgctxt "medium_format" msgid "Data CD" msgstr "" #: DB:release_group_secondary_type/name:10 msgctxt "release_group_secondary_type" msgid "Demo" msgstr "demo" #: DB:work_attribute_type_allowed_value/value:610 msgctxt "work_attribute_type_allowed_value" msgid "Destan" msgstr "" #: DB:work_attribute_type_allowed_value/value:716 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Aryan" msgstr "" #: DB:work_attribute_type_allowed_value/value:717 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Hindi" msgstr "" #: DB:work_attribute_type_allowed_value/value:718 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Hindi II" msgstr "" #: DB:work_attribute_type_allowed_value/value:719 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Kebir" msgstr "" #: DB:work_attribute_type_allowed_value/value:720 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Revan" msgstr "" #: DB:work_attribute_type_allowed_value/value:721 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Revan-ı Hindi" msgstr "" #: DB:work_attribute_type_allowed_value/value:722 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Süreyya" msgstr "" #: DB:work_attribute_type_allowed_value/value:723 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Süreyya Sofyanı" msgstr "" #: DB:work_attribute_type_allowed_value/value:724 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Turan" msgstr "" #: DB:work_attribute_type_allowed_value/value:797 msgctxt "work_attribute_type_allowed_value" msgid "Devr-i Turan II" msgstr "" #: DB:work_attribute_type_allowed_value/value:79 msgctxt "work_attribute_type_allowed_value" msgid "Devāmṛtavarṣiṇi" msgstr "Devāmṛtavarṣiṇi" #: DB:work_attribute_type_allowed_value/value:829 msgctxt "work_attribute_type_allowed_value" msgid "Dhamar" msgstr "" #: DB:work_attribute_type_allowed_value/value:80 #: DB:work_attribute_type_allowed_value/value:902 msgctxt "work_attribute_type_allowed_value" msgid "Dhanaśrī" msgstr "Dhanaśrī" #: DB:work_attribute_type_allowed_value/value:81 msgctxt "work_attribute_type_allowed_value" msgid "Dhanyāsi" msgstr "Dhanyāsi" #: DB:work_attribute_type_allowed_value/value:903 msgctxt "work_attribute_type_allowed_value" msgid "Dhanī" msgstr "" #: DB:work_attribute_type_allowed_value/value:82 msgctxt "work_attribute_type_allowed_value" msgid "Dharmāvati" msgstr "Dharmāvati" #: DB:work_attribute_type_allowed_value/value:285 msgctxt "work_attribute_type_allowed_value" msgid "Dhr̥va" msgstr "Dhr̥va" #: DB:work_attribute_type_allowed_value/value:83 msgctxt "work_attribute_type_allowed_value" msgid "Dhēnuka" msgstr "Dhēnuka" #: DB:release_packaging/name:17 msgctxt "release_packaging" msgid "Digibook" msgstr "" #: DB:release_packaging/name:3 msgctxt "release_packaging" msgid "Digipak" msgstr "" #: DB:medium_format/name:12 msgctxt "medium_format" msgid "Digital Media" msgstr "digitalt medie" #: DB:work_attribute_type_allowed_value/value:345 msgctxt "work_attribute_type_allowed_value" msgid "Dil Efruz" msgstr "" #: DB:work_attribute_type_allowed_value/value:344 msgctxt "work_attribute_type_allowed_value" msgid "Dildar" msgstr "" #: DB:work_attribute_type_allowed_value/value:348 msgctxt "work_attribute_type_allowed_value" msgid "Dilkeside" msgstr "" #: DB:work_attribute_type_allowed_value/value:346 msgctxt "work_attribute_type_allowed_value" msgid "Dilkeş" msgstr "" #: DB:work_attribute_type_allowed_value/value:347 msgctxt "work_attribute_type_allowed_value" msgid "Dilkeşhaveran" msgstr "" #: DB:work_attribute_type_allowed_value/value:349 msgctxt "work_attribute_type_allowed_value" msgid "Dilküşa" msgstr "" #: DB:work_attribute_type_allowed_value/value:350 msgctxt "work_attribute_type_allowed_value" msgid "Dilnevaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:351 msgctxt "work_attribute_type_allowed_value" msgid "Dilnişin" msgstr "" #: DB:work_attribute_type_allowed_value/value:904 msgctxt "work_attribute_type_allowed_value" msgid "Din kī puriyā" msgstr "" #: DB:release_packaging/name:13 msgctxt "release_packaging" msgid "Discbox Slider" msgstr "" #: DB:label_type/name:1 msgctxt "label_type" msgid "Distributor" msgstr "distributør" #: DB:area_type/name:5 msgctxt "area_type" msgid "District" msgstr "distrikt" #: DB:area_type/description:5 msgctxt "area_type" msgid "District is used for a division of a large city, e.g. Queens." msgstr "" #: DB:work_attribute_type_allowed_value/value:611 msgctxt "work_attribute_type_allowed_value" msgid "Divan" msgstr "" #: DB:work_attribute_type_allowed_value/value:725 msgctxt "work_attribute_type_allowed_value" msgid "Dolap" msgstr "" #: DB:medium_format/name:4 msgctxt "medium_format" msgid "DualDisc" msgstr "DualDisc" #: DB:medium_format/name:67 msgctxt "medium_format" msgid "DualDisc (CD side)" msgstr "" #: DB:medium_format/name:65 msgctxt "medium_format" msgid "DualDisc (DVD-Audio side)" msgstr "" #: DB:medium_format/name:66 msgctxt "medium_format" msgid "DualDisc (DVD-Video side)" msgstr "" #: DB:work_attribute_type_allowed_value/value:612 msgctxt "work_attribute_type_allowed_value" msgid "Durak" msgstr "" #: DB:work_attribute_type_allowed_value/value:726 msgctxt "work_attribute_type_allowed_value" msgid "Durak Evferi" msgstr "" #: DB:work_attribute_type_allowed_value/value:86 msgctxt "work_attribute_type_allowed_value" msgid "Durga" msgstr "Durga" #: DB:work_attribute_type_allowed_value/value:906 msgctxt "work_attribute_type_allowed_value" msgid "Durgā" msgstr "" #: DB:work_attribute_type_allowed_value/value:87 msgctxt "work_attribute_type_allowed_value" msgid "Dvijāvanti" msgstr "Dvijāvanti" #: DB:work_attribute_type_allowed_value/value:352 msgctxt "work_attribute_type_allowed_value" msgid "Dügah" msgstr "" #: DB:work_attribute_type_allowed_value/value:354 msgctxt "work_attribute_type_allowed_value" msgid "Dügah Maye" msgstr "" #: DB:work_attribute_type_allowed_value/value:353 msgctxt "work_attribute_type_allowed_value" msgid "Dügahbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:727 msgctxt "work_attribute_type_allowed_value" msgid "Dümen" msgstr "" #: DB:work_attribute_type_allowed_value/value:728 msgctxt "work_attribute_type_allowed_value" msgid "Düyek" msgstr "" #: DB:work_attribute_type_allowed_value/value:355 msgctxt "work_attribute_type_allowed_value" msgid "Düşems" msgstr "" #: DB:work_attribute_type_allowed_value/value:828 msgctxt "work_attribute_type_allowed_value" msgid "Dādrā" msgstr "" #: DB:work_attribute_type_allowed_value/value:899 msgctxt "work_attribute_type_allowed_value" msgid "Dēsi" msgstr "" #: DB:work_attribute_type_allowed_value/value:900 msgctxt "work_attribute_type_allowed_value" msgid "Dēv gāndhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:76 msgctxt "work_attribute_type_allowed_value" msgid "Dēvagāndhāri" msgstr "Dēvagāndhāri" #: DB:work_attribute_type_allowed_value/value:77 msgctxt "work_attribute_type_allowed_value" msgid "Dēvakriya" msgstr "Dēvakriya" #: DB:work_attribute_type_allowed_value/value:78 msgctxt "work_attribute_type_allowed_value" msgid "Dēvamanōhari" msgstr "Dēvamanōhari" #: DB:work_attribute_type_allowed_value/value:901 msgctxt "work_attribute_type_allowed_value" msgid "Dēvgirī bilāval" msgstr "" #: DB:work_attribute_type_allowed_value/value:75 #: DB:work_attribute_type_allowed_value/value:897 msgctxt "work_attribute_type_allowed_value" msgid "Dēś" msgstr "Dēś" #: DB:work_attribute_type_allowed_value/value:898 msgctxt "work_attribute_type_allowed_value" msgid "Dēśakār" msgstr "" #: DB:work_attribute_type_allowed_value/value:292 msgctxt "work_attribute_type_allowed_value" msgid "Dēśādi" msgstr "Dēśādi" #: DB:work_attribute_type_allowed_value/value:830 msgctxt "work_attribute_type_allowed_value" msgid "Dīpacaṇḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:84 msgctxt "work_attribute_type_allowed_value" msgid "Dīpakaṁ" msgstr "Dīpakaṁ" #: DB:work_attribute_type_allowed_value/value:905 msgctxt "work_attribute_type_allowed_value" msgid "Dīpāvali" msgstr "" #: DB:work_attribute_type_allowed_value/value:85 msgctxt "work_attribute_type_allowed_value" msgid "Dīpāḷi" msgstr "Dīpāḷi" #: DB:work_attribute_type_allowed_value/value:791 msgctxt "work_attribute_type_allowed_value" msgid "E Dorian" msgstr "" #: DB:work_attribute_type_allowed_value/value:803 msgctxt "work_attribute_type_allowed_value" msgid "E Mixolydian" msgstr "" #: DB:work_attribute_type_allowed_value/value:13 msgctxt "work_attribute_type_allowed_value" msgid "E major" msgstr "E-dur" #: DB:work_attribute_type_allowed_value/value:14 msgctxt "work_attribute_type_allowed_value" msgid "E minor" msgstr "E-mol" #: DB:work_attribute_type_allowed_value/value:11 msgctxt "work_attribute_type_allowed_value" msgid "E-flat major" msgstr "Es-dur" #: DB:work_attribute_type_allowed_value/value:12 #: DB:work_attribute_type_allowed_value/value:815 msgctxt "work_attribute_type_allowed_value" msgid "E-flat minor" msgstr "Es-mol" #: DB:work_attribute_type_allowed_value/value:814 msgctxt "work_attribute_type_allowed_value" msgid "E-sharp major" msgstr "" #: DB:work_attribute_type_allowed_value/value:15 msgctxt "work_attribute_type_allowed_value" msgid "E-sharp minor" msgstr "Eis-mol" #: DB:release_group_primary_type/name:3 msgctxt "release_group_primary_type" msgid "EP" msgstr "EP" #: DB:medium_format/name:50 msgctxt "medium_format" msgid "Edison Diamond Disc" msgstr "" #: DB:place_type/name:7 msgctxt "place_type" msgid "Educational institution" msgstr "" #: DB:instrument_type/name:4 msgctxt "instrument_type" msgid "Electronic instrument" msgstr "" #: DB:medium_format/name:42 msgctxt "medium_format" msgid "Enhanced CD" msgstr "" #: DB:instrument_type/name:6 msgctxt "instrument_type" msgid "Ensemble" msgstr "" #: DB:work_attribute_type_allowed_value/value:356 msgctxt "work_attribute_type_allowed_value" msgid "Eski Sipihr" msgstr "" #: DB:work_attribute_type_allowed_value/value:613 msgctxt "work_attribute_type_allowed_value" msgid "Etüd" msgstr "" #: DB:work_attribute_type_allowed_value/value:357 msgctxt "work_attribute_type_allowed_value" msgid "Evcara" msgstr "" #: DB:editor_collection_type/name:4 msgctxt "collection_type" msgid "Event" msgstr "" #: DB:event_alias_type/name:1 msgctxt "alias_type" msgid "Event name" msgstr "" #: DB:series_type/name:6 msgctxt "series_type" msgid "Event series" msgstr "" #: DB:work_attribute_type_allowed_value/value:729 msgctxt "work_attribute_type_allowed_value" msgid "Evfer" msgstr "" #: DB:work_attribute_type_allowed_value/value:358 msgctxt "work_attribute_type_allowed_value" msgid "Eviç" msgstr "" #: DB:work_attribute_type_allowed_value/value:359 msgctxt "work_attribute_type_allowed_value" msgid "Eviç Bahr-i Nazik" msgstr "" #: DB:work_attribute_type_allowed_value/value:360 msgctxt "work_attribute_type_allowed_value" msgid "Eviç Huzi" msgstr "" #: DB:work_attribute_type_allowed_value/value:364 msgctxt "work_attribute_type_allowed_value" msgid "Eviç Maye" msgstr "" #: DB:work_attribute_type_allowed_value/value:361 msgctxt "work_attribute_type_allowed_value" msgid "Eviç Ruy-i Neva" msgstr "" #: DB:work_attribute_type_allowed_value/value:365 msgctxt "work_attribute_type_allowed_value" msgid "Eviç Saba" msgstr "" #: DB:work_attribute_type_allowed_value/value:366 msgctxt "work_attribute_type_allowed_value" msgid "Eviç Şevk" msgstr "" #: DB:work_attribute_type_allowed_value/value:362 msgctxt "work_attribute_type_allowed_value" msgid "Eviçbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:363 msgctxt "work_attribute_type_allowed_value" msgid "Eviçkürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:730 msgctxt "work_attribute_type_allowed_value" msgid "Evsat" msgstr "" #: DB:work_attribute_type_allowed_value/value:614 msgctxt "work_attribute_type_allowed_value" msgid "Ezan" msgstr "" #: DB:work_attribute_type_allowed_value/value:792 msgctxt "work_attribute_type_allowed_value" msgid "F Dorian" msgstr "" #: DB:work_attribute_type_allowed_value/value:804 msgctxt "work_attribute_type_allowed_value" msgid "F Mixolydian" msgstr "" #: DB:work_attribute_type_allowed_value/value:17 msgctxt "work_attribute_type_allowed_value" msgid "F major" msgstr "F-dur" #: DB:work_attribute_type_allowed_value/value:18 msgctxt "work_attribute_type_allowed_value" msgid "F minor" msgstr "F-mol" #: DB:work_attribute_type_allowed_value/value:16 msgctxt "work_attribute_type_allowed_value" msgid "F-flat major" msgstr "Fes-dur" #: DB:work_attribute_type_allowed_value/value:19 msgctxt "work_attribute_type_allowed_value" msgid "F-sharp major" msgstr "Fis-dur" #: DB:work_attribute_type_allowed_value/value:20 msgctxt "work_attribute_type_allowed_value" msgid "F-sharp minor" msgstr "Fis-mol" #: DB:work_attribute_type_allowed_value/value:731 msgctxt "work_attribute_type_allowed_value" msgid "Fahte" msgstr "" #: DB:instrument_type/name:7 msgctxt "instrument_type" msgid "Family" msgstr "" #: DB:work_attribute_type_allowed_value/value:615 msgctxt "work_attribute_type_allowed_value" msgid "Fantezi" msgstr "" #: DB:release_packaging/name:10 msgctxt "release_packaging" msgid "Fatbox" msgstr "" #: DB:gender/name:2 msgctxt "gender" msgid "Female" msgstr "" #: DB:work_attribute_type_allowed_value/value:732 msgctxt "work_attribute_type_allowed_value" msgid "Fer" msgstr "" #: DB:work_attribute_type_allowed_value/value:733 msgctxt "work_attribute_type_allowed_value" msgid "Fer'i Muhammes" msgstr "" #: DB:work_attribute_type_allowed_value/value:367 msgctxt "work_attribute_type_allowed_value" msgid "Ferahfeza" msgstr "" #: DB:work_attribute_type_allowed_value/value:368 msgctxt "work_attribute_type_allowed_value" msgid "Ferahnak" msgstr "" #: DB:work_attribute_type_allowed_value/value:369 msgctxt "work_attribute_type_allowed_value" msgid "Ferahnakaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:370 msgctxt "work_attribute_type_allowed_value" msgid "Ferahnüma" msgstr "" #: DB:work_attribute_type_allowed_value/value:371 msgctxt "work_attribute_type_allowed_value" msgid "Ferahzad" msgstr "" #: DB:event_type/name:2 msgctxt "event_type" msgid "Festival" msgstr "" #: DB:series_type/name:8 msgctxt "series_type" msgid "Festival" msgstr "" #: DB:work_attribute_type_allowed_value/value:372 msgctxt "work_attribute_type_allowed_value" msgid "Feth-i Bağdad" msgstr "" #: DB:work_attribute_type_allowed_value/value:373 msgctxt "work_attribute_type_allowed_value" msgid "Feth-i Belgrad" msgstr "" #: DB:work_attribute_type_allowed_value/value:374 msgctxt "work_attribute_type_allowed_value" msgid "Feth-i Dil" msgstr "" #: DB:work_attribute_type_allowed_value/value:375 msgctxt "work_attribute_type_allowed_value" msgid "Feth-i Hicaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:734 msgctxt "work_attribute_type_allowed_value" msgid "Fireng-i Fer" msgstr "" #: DB:medium_format/description:73 msgctxt "medium_format" msgid "" "Flat discs with grooves used in phonographs/gramophones. For shellac and " "vinyl records, use that specifically" msgstr "" #: DB:medium_format/name:51 msgctxt "medium_format" msgid "Flexi-disc" msgstr "" #: DB:medium_format/description:51 msgctxt "medium_format" msgid "" "Flexi-discs are phonograph records made of a thin, flexible vinyl sheet with" " a molded-in groove, designed to be playable on a normal phonograph " "turntable." msgstr "" #: DB:medium_format/name:76 msgctxt "medium_format" msgid "Floppy Disk" msgstr "" #: DB:gender/description:4 msgctxt "gender" msgid "" "For cases where gender just doesn't apply at all (like companies entered as " "artists)." msgstr "" #: DB:work_attribute_type/name:16 msgctxt "work_attribute_type" msgid "Form (Ottoman, Turkish)" msgstr "" #: DB:area_alias_type/name:2 msgctxt "alias_type" msgid "Formal name" msgstr "formelt navn" #: DB:work_attribute_type_allowed_value/value:735 msgctxt "work_attribute_type_allowed_value" msgid "Frengçin" msgstr "" #: DB:cover_art_archive.art_type/name:1 msgctxt "cover_art_type" msgid "Front" msgstr "forside" #: DB:work_attribute_type_allowed_value/value:793 msgctxt "work_attribute_type_allowed_value" msgid "G Dorian" msgstr "" #: DB:work_attribute_type_allowed_value/value:805 msgctxt "work_attribute_type_allowed_value" msgid "G Mixolydian" msgstr "" #: DB:work_attribute_type_allowed_value/value:22 msgctxt "work_attribute_type_allowed_value" msgid "G major" msgstr "G-dur" #: DB:work_attribute_type_allowed_value/value:23 msgctxt "work_attribute_type_allowed_value" msgid "G minor" msgstr "G-mol" #: DB:work_attribute_type_allowed_value/value:21 msgctxt "work_attribute_type_allowed_value" msgid "G-flat major" msgstr "Ges-dur" #: DB:work_attribute_type_allowed_value/value:816 msgctxt "work_attribute_type_allowed_value" msgid "G-flat minor" msgstr "" #: DB:work_attribute_type_allowed_value/value:24 msgctxt "work_attribute_type_allowed_value" msgid "G-sharp major" msgstr "Gis-dur" #: DB:work_attribute_type_allowed_value/value:25 msgctxt "work_attribute_type_allowed_value" msgid "G-sharp minor" msgstr "Gis-mol" #: DB:work_attribute_type/name:9 msgctxt "work_attribute_type" msgid "GEMA ID" msgstr "GEMA-id" #: DB:work_attribute_type_allowed_value/value:88 msgctxt "work_attribute_type_allowed_value" msgid "Gamakakriya" msgstr "Gamakakriya" #: DB:work_attribute_type_allowed_value/value:89 msgctxt "work_attribute_type_allowed_value" msgid "Gamakakriya/Pūrvīkaḷyāṇi" msgstr "Gamakakriya/Pūrvīkaḷyāṇi" #: DB:work_attribute_type_allowed_value/value:95 msgctxt "work_attribute_type_allowed_value" msgid "Garuḍadhvani" msgstr "Garuḍadhvani" #: DB:release_packaging/name:12 msgctxt "release_packaging" msgid "Gatefold Cover" msgstr "" #: DB:work_attribute_type_allowed_value/value:911 msgctxt "work_attribute_type_allowed_value" msgid "Gaurī" msgstr "" #: DB:work_attribute_type_allowed_value/value:912 msgctxt "work_attribute_type_allowed_value" msgid "Gaurī basant" msgstr "" #: DB:work_attribute_type_allowed_value/value:99 msgctxt "work_attribute_type_allowed_value" msgid "Gaurīmanōhari" msgstr "Gaurīmanōhari" #: DB:work_attribute_type_allowed_value/value:909 msgctxt "work_attribute_type_allowed_value" msgid "Gauḍ malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:910 msgctxt "work_attribute_type_allowed_value" msgid "Gauḍ sāraṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:96 msgctxt "work_attribute_type_allowed_value" msgid "Gauḍa malhār" msgstr "Gauḍa malhār" #: DB:work_attribute_type_allowed_value/value:97 msgctxt "work_attribute_type_allowed_value" msgid "Gauḷa" msgstr "Gauḷa" #: DB:work_attribute_type_allowed_value/value:98 msgctxt "work_attribute_type_allowed_value" msgid "Gauḷipantu" msgstr "Gauḷipantu" #: DB:work_attribute_type_allowed_value/value:913 msgctxt "work_attribute_type_allowed_value" msgid "Gavti" msgstr "" #: DB:work_attribute_type_allowed_value/value:616 msgctxt "work_attribute_type_allowed_value" msgid "Gazel" msgstr "" #: DB:work_attribute_type_allowed_value/value:90 msgctxt "work_attribute_type_allowed_value" msgid "Gaṁbhīra nāṭa" msgstr "Gaṁbhīra nāṭa" #: DB:work_attribute_type_allowed_value/value:91 msgctxt "work_attribute_type_allowed_value" msgid "Gaṁbhīra vāṇi" msgstr "Gaṁbhīra vāṇi" #: DB:work_attribute_type_allowed_value/value:376 msgctxt "work_attribute_type_allowed_value" msgid "Gerdaniye" msgstr "" #: DB:work_attribute_type_allowed_value/value:377 msgctxt "work_attribute_type_allowed_value" msgid "Gerdaniyebuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:378 msgctxt "work_attribute_type_allowed_value" msgid "Gerdaniyekürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:380 msgctxt "work_attribute_type_allowed_value" msgid "Geveşt" msgstr "" #: DB:work_attribute_type_allowed_value/value:379 msgctxt "work_attribute_type_allowed_value" msgid "Geştü Güzar-ı Bahar" msgstr "" #: DB:work_attribute_type_allowed_value/value:100 msgctxt "work_attribute_type_allowed_value" msgid "Ghanṭa" msgstr "Ghanṭa" #: DB:work_attribute_type_allowed_value/value:381 msgctxt "work_attribute_type_allowed_value" msgid "Gonca-i Rana" msgstr "" #: DB:artist_type/name:2 msgctxt "artist_type" msgid "Group" msgstr "gruppe" #: DB:work_attribute_type_allowed_value/value:916 msgctxt "work_attribute_type_allowed_value" msgid "Gurjarī tōḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:102 msgctxt "work_attribute_type_allowed_value" msgid "Gurjāri" msgstr "Gurjāri" #: DB:work_attribute_type_allowed_value/value:915 msgctxt "work_attribute_type_allowed_value" msgid "Guṇakārī" msgstr "" #: DB:work_attribute_type_allowed_value/value:382 msgctxt "work_attribute_type_allowed_value" msgid "Güldeste" msgstr "" #: DB:work_attribute_type_allowed_value/value:384 msgctxt "work_attribute_type_allowed_value" msgid "Gülizar" msgstr "" #: DB:work_attribute_type_allowed_value/value:385 msgctxt "work_attribute_type_allowed_value" msgid "Gülizarbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:386 msgctxt "work_attribute_type_allowed_value" msgid "Gülnari" msgstr "" #: DB:work_attribute_type_allowed_value/value:387 msgctxt "work_attribute_type_allowed_value" msgid "Gülruh" msgstr "" #: DB:work_attribute_type_allowed_value/value:383 msgctxt "work_attribute_type_allowed_value" msgid "Gülzar" msgstr "" #: DB:work_attribute_type_allowed_value/value:388 msgctxt "work_attribute_type_allowed_value" msgid "Gülşen-i Vefa" msgstr "" #: DB:work_attribute_type_allowed_value/value:617 msgctxt "work_attribute_type_allowed_value" msgid "Güvende" msgstr "" #: DB:work_attribute_type_allowed_value/value:92 msgctxt "work_attribute_type_allowed_value" msgid "Gānamūrti" msgstr "Gānamūrti" #: DB:work_attribute_type_allowed_value/value:93 msgctxt "work_attribute_type_allowed_value" msgid "Gānavāridhi" msgstr "Gānavāridhi" #: DB:work_attribute_type_allowed_value/value:908 msgctxt "work_attribute_type_allowed_value" msgid "Gāndhī malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:94 msgctxt "work_attribute_type_allowed_value" msgid "Gāngēyabhūṣaṇi" msgstr "Gāngēyabhūṣaṇi" #: DB:work_attribute_type_allowed_value/value:101 msgctxt "work_attribute_type_allowed_value" msgid "Gōpikāvasantaṁ" msgstr "Gōpikāvasantaṁ" #: DB:work_attribute_type_allowed_value/value:914 msgctxt "work_attribute_type_allowed_value" msgid "Gōrākh kalyāṇ" msgstr "" #: DB:medium_format/name:17 msgctxt "medium_format" msgid "HD-DVD" msgstr "HD-DVD" #: DB:medium_format/name:25 msgctxt "medium_format" msgid "HDCD" msgstr "HDCD" #: DB:medium_format/name:37 msgctxt "medium_format" msgid "HQCD" msgstr "HQCD" #: DB:work_attribute_type_allowed_value/value:736 msgctxt "work_attribute_type_allowed_value" msgid "Hafif" msgstr "" #: DB:work_attribute_type_allowed_value/value:618 msgctxt "work_attribute_type_allowed_value" msgid "Halk Türküsü" msgstr "" #: DB:work_attribute_type_allowed_value/value:104 msgctxt "work_attribute_type_allowed_value" msgid "Hamsadhvani" msgstr "Hamsadhvani" #: DB:work_attribute_type_allowed_value/value:918 msgctxt "work_attribute_type_allowed_value" msgid "Hamsadhvāni" msgstr "" #: DB:work_attribute_type_allowed_value/value:919 msgctxt "work_attribute_type_allowed_value" msgid "Hamsanārāyaṇi" msgstr "" #: DB:work_attribute_type_allowed_value/value:107 msgctxt "work_attribute_type_allowed_value" msgid "Hamsavinōdini" msgstr "Hamsavinōdini" #: DB:work_attribute_type_allowed_value/value:917 msgctxt "work_attribute_type_allowed_value" msgid "Hamīr" msgstr "" #: DB:work_attribute_type_allowed_value/value:103 msgctxt "work_attribute_type_allowed_value" msgid "Hamīr kaḷyaṇi" msgstr "Hamīr kaḷyaṇi" #: DB:work_attribute_type_allowed_value/value:108 msgctxt "work_attribute_type_allowed_value" msgid "Harikāmbhōji" msgstr "Harikāmbhōji" #: DB:work_attribute_type_allowed_value/value:389 msgctxt "work_attribute_type_allowed_value" msgid "Haver" msgstr "" #: DB:work_attribute_type_allowed_value/value:737 msgctxt "work_attribute_type_allowed_value" msgid "Havi" msgstr "" #: DB:work_attribute_type_allowed_value/value:105 msgctxt "work_attribute_type_allowed_value" msgid "Haṁsanādaṁ" msgstr "Haṁsanādaṁ" #: DB:work_attribute_type_allowed_value/value:106 msgctxt "work_attribute_type_allowed_value" msgid "Haṁsānandi" msgstr "Haṁsānandi" #: DB:work_attribute_type_allowed_value/value:390 msgctxt "work_attribute_type_allowed_value" msgid "Heftgah" msgstr "" #: DB:work_attribute_type_allowed_value/value:738 msgctxt "work_attribute_type_allowed_value" msgid "Hezeç" msgstr "" #: DB:medium_format/name:75 msgctxt "medium_format" msgid "HiPac" msgstr "" #: DB:work_attribute_type_allowed_value/value:391 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:395 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz Büzürk" msgstr "" #: DB:work_attribute_type_allowed_value/value:396 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz Dilkeş" msgstr "" #: DB:work_attribute_type_allowed_value/value:398 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz Hümayun" msgstr "" #: DB:work_attribute_type_allowed_value/value:409 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz Uzzal" msgstr "" #: DB:work_attribute_type_allowed_value/value:392 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz Zemzeme" msgstr "" #: DB:work_attribute_type_allowed_value/value:410 msgctxt "work_attribute_type_allowed_value" msgid "Hicaz Zirgüle" msgstr "" #: DB:work_attribute_type_allowed_value/value:393 msgctxt "work_attribute_type_allowed_value" msgid "Hicazaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:394 msgctxt "work_attribute_type_allowed_value" msgid "Hicazbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:397 msgctxt "work_attribute_type_allowed_value" msgid "Hicazeyn" msgstr "" #: DB:work_attribute_type_allowed_value/value:399 msgctxt "work_attribute_type_allowed_value" msgid "Hicazi Acem" msgstr "" #: DB:work_attribute_type_allowed_value/value:400 msgctxt "work_attribute_type_allowed_value" msgid "Hicazi Irak" msgstr "" #: DB:work_attribute_type_allowed_value/value:401 msgctxt "work_attribute_type_allowed_value" msgid "Hicazi Muhalif" msgstr "" #: DB:work_attribute_type_allowed_value/value:402 msgctxt "work_attribute_type_allowed_value" msgid "Hicazi Rumi" msgstr "" #: DB:work_attribute_type_allowed_value/value:403 msgctxt "work_attribute_type_allowed_value" msgid "Hicazi Türki" msgstr "" #: DB:work_attribute_type_allowed_value/value:404 msgctxt "work_attribute_type_allowed_value" msgid "Hicazi Uşşak" msgstr "" #: DB:work_attribute_type_allowed_value/value:405 msgctxt "work_attribute_type_allowed_value" msgid "Hicazkar" msgstr "" #: DB:work_attribute_type_allowed_value/value:408 msgctxt "work_attribute_type_allowed_value" msgid "Hicazkar-Kürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:407 msgctxt "work_attribute_type_allowed_value" msgid "Hicazkar-ı Kadim" msgstr "" #: DB:work_attribute_type_allowed_value/value:406 msgctxt "work_attribute_type_allowed_value" msgid "Hicazkarbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:112 msgctxt "work_attribute_type_allowed_value" msgid "Hindustān gāndhāri" msgstr "Hindustān gāndhāri" #: DB:work_attribute_type_allowed_value/value:924 msgctxt "work_attribute_type_allowed_value" msgid "Hindōl" msgstr "" #: DB:work_attribute_type_allowed_value/value:925 msgctxt "work_attribute_type_allowed_value" msgid "Hindōl pañcam" msgstr "" #: DB:work_attribute_type_allowed_value/value:110 msgctxt "work_attribute_type_allowed_value" msgid "Hindōḷa vasantaṁ" msgstr "Hindōḷa vasantaṁ" #: DB:work_attribute_type_allowed_value/value:111 msgctxt "work_attribute_type_allowed_value" msgid "Hindōḷaṁ" msgstr "Hindōḷaṁ" #: DB:work_attribute_type_allowed_value/value:411 msgctxt "work_attribute_type_allowed_value" msgid "Hisar" msgstr "Hisar" #: DB:work_attribute_type_allowed_value/value:412 msgctxt "work_attribute_type_allowed_value" msgid "Hisar Vech-i Şehnaz" msgstr "Hisar Vech-i Şehnaz" #: DB:work_attribute_type_allowed_value/value:413 msgctxt "work_attribute_type_allowed_value" msgid "Hisarbuselik" msgstr "Hisarbuselik" #: DB:label_type/name:2 msgctxt "label_type" msgid "Holding" msgstr "" #: DB:work_attribute_type_allowed_value/value:414 msgctxt "work_attribute_type_allowed_value" msgid "Horasan" msgstr "Horasan" #: DB:work_attribute_type_allowed_value/value:415 msgctxt "work_attribute_type_allowed_value" msgid "Horosani Beyati" msgstr "Horosani Beyati" #: DB:work_attribute_type_allowed_value/value:416 msgctxt "work_attribute_type_allowed_value" msgid "Hoş Aver" msgstr "Hoş Aver" #: DB:work_attribute_type_allowed_value/value:926 msgctxt "work_attribute_type_allowed_value" msgid "Husaini" msgstr "" #: DB:work_attribute_type_allowed_value/value:113 msgctxt "work_attribute_type_allowed_value" msgid "Hussēnī" msgstr "Hussēnī" #: DB:work_attribute_type_allowed_value/value:619 msgctxt "work_attribute_type_allowed_value" msgid "Hutbe" msgstr "" #: DB:work_attribute_type_allowed_value/value:417 msgctxt "work_attribute_type_allowed_value" msgid "Huzi" msgstr "" #: DB:medium_format/name:38 msgctxt "medium_format" msgid "Hybrid SACD" msgstr "" #: DB:medium_format/name:63 msgctxt "medium_format" msgid "Hybrid SACD (CD layer)" msgstr "" #: DB:medium_format/name:64 msgctxt "medium_format" msgid "Hybrid SACD (SACD layer)" msgstr "" #: DB:work_attribute_type_allowed_value/value:418 msgctxt "work_attribute_type_allowed_value" msgid "Hüdavendigar" msgstr "" #: DB:work_attribute_type_allowed_value/value:419 msgctxt "work_attribute_type_allowed_value" msgid "Hüseyni" msgstr "" #: DB:work_attribute_type_allowed_value/value:422 msgctxt "work_attribute_type_allowed_value" msgid "Hüseyni Araban" msgstr "" #: DB:work_attribute_type_allowed_value/value:420 msgctxt "work_attribute_type_allowed_value" msgid "Hüseyni Gülizar" msgstr "" #: DB:work_attribute_type_allowed_value/value:421 msgctxt "work_attribute_type_allowed_value" msgid "Hüseyni Zemzeme" msgstr "" #: DB:work_attribute_type_allowed_value/value:423 msgctxt "work_attribute_type_allowed_value" msgid "Hüseyniaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:424 msgctxt "work_attribute_type_allowed_value" msgid "Hüseynibuselik" msgstr "Hüseynibuselik" #: DB:work_attribute_type_allowed_value/value:425 msgctxt "work_attribute_type_allowed_value" msgid "Hüzzam" msgstr "Hüzzam" #: DB:work_attribute_type_allowed_value/value:426 msgctxt "work_attribute_type_allowed_value" msgid "Hüzzam-ı Cedid" msgstr "Hüzzam-ı Cedid" #: DB:work_attribute_type_allowed_value/value:920 msgctxt "work_attribute_type_allowed_value" msgid "Hēm bihāg" msgstr "" #: DB:work_attribute_type_allowed_value/value:921 msgctxt "work_attribute_type_allowed_value" msgid "Hēm lalit" msgstr "" #: DB:work_attribute_type_allowed_value/value:922 msgctxt "work_attribute_type_allowed_value" msgid "Hēmant" msgstr "" #: DB:work_attribute_type_allowed_value/value:109 msgctxt "work_attribute_type_allowed_value" msgid "Hēmavati" msgstr "Hēmavati" #: DB:work_attribute_type_allowed_value/value:923 msgctxt "work_attribute_type_allowed_value" msgid "Hēmāvānti" msgstr "" #: DB:work_attribute_type/name:29 msgctxt "work_attribute_type" msgid "ICE ID" msgstr "" #: DB:work_attribute_type/description:28 msgctxt "work_attribute_type" msgid "ID for the Belgian rights society SABAM" msgstr "" #: DB:work_attribute_type/description:29 msgctxt "work_attribute_type" msgid "ID for the International Copyright Enterprise" msgstr "" #: DB:work_attribute_type/description:3 msgctxt "work_attribute_type" msgid "ID for the Japanese rights society JASRAC" msgstr "" #: DB:work_attribute_type/description:33 msgctxt "work_attribute_type" msgid "ID for the Japanese rights society NexTone" msgstr "" #: DB:work_attribute_type/description:27 msgctxt "work_attribute_type" msgid "ID for the Mexican rights society SACM" msgstr "" #: DB:work_attribute_type/description:30 msgctxt "work_attribute_type" msgid "ID for the Polish rights society ZAiKS" msgstr "" #: DB:work_attribute_type/name:14 msgctxt "work_attribute_type" msgid "Identifiers" msgstr "" #: DB:work_attribute_type_allowed_value/value:832 msgctxt "work_attribute_type_allowed_value" msgid "Ikvāi" msgstr "" #: DB:label_type/name:9 msgctxt "label_type" msgid "Imprint" msgstr "" #: DB:work_type/name:30 msgctxt "work_type" msgid "Incidental music" msgstr "" #: DB:work_type/description:30 msgctxt "work_type" msgid "" "Incidental music is music written as background for (usually) a theatre " "play." msgstr "" #: DB:place_type/name:5 msgctxt "place_type" msgid "Indoor arena" msgstr "Indendørs arena" #: DB:editor_collection_type/name:9 msgctxt "collection_type" msgid "Instrument" msgstr "" #: DB:instrument_alias_type/name:1 msgctxt "alias_type" msgid "Instrument name" msgstr "" #: DB:release_group_secondary_type/name:4 msgctxt "release_group_secondary_type" msgid "Interview" msgstr "Interview" #: DB:work_attribute_type_allowed_value/value:427 msgctxt "work_attribute_type_allowed_value" msgid "Irak" msgstr "" #: DB:work_attribute_type_allowed_value/value:428 msgctxt "work_attribute_type_allowed_value" msgid "Irakaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:739 msgctxt "work_attribute_type_allowed_value" msgid "Iraksak" msgstr "" #: DB:work_attribute_type_allowed_value/value:429 msgctxt "work_attribute_type_allowed_value" msgid "Isfahan" msgstr "" #: DB:work_attribute_type_allowed_value/value:430 msgctxt "work_attribute_type_allowed_value" msgid "Isfahan Ruy-i Neva" msgstr "" #: DB:work_attribute_type_allowed_value/value:431 msgctxt "work_attribute_type_allowed_value" msgid "Isfahan Zemzeme" msgstr "" #: DB:work_attribute_type_allowed_value/value:434 msgctxt "work_attribute_type_allowed_value" msgid "Isfahan-ı Cedid" msgstr "" #: DB:work_attribute_type_allowed_value/value:432 msgctxt "work_attribute_type_allowed_value" msgid "Isfahanbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:433 msgctxt "work_attribute_type_allowed_value" msgid "Isfahanek" msgstr "" #: DB:work_attribute_type_allowed_value/value:435 msgctxt "work_attribute_type_allowed_value" msgid "Isfahani" msgstr "" #: DB:area_type/name:6 msgctxt "area_type" msgid "Island" msgstr "" #: DB:area_type/description:6 msgctxt "area_type" msgid "" "Island is used for islands and atolls which don't form subdivisions of their" " own, e.g. Skye. These are not considered when displaying the parent areas " "for a given area." msgstr "" #: DB:work_attribute_type/name:3 msgctxt "work_attribute_type" msgid "JASRAC ID" msgstr "JASRAC-id" #: DB:work_attribute_type_allowed_value/value:114 msgctxt "work_attribute_type_allowed_value" msgid "Jaganmōhini" msgstr "Jaganmōhini" #: DB:work_attribute_type_allowed_value/value:927 msgctxt "work_attribute_type_allowed_value" msgid "Jaijaivanti" msgstr "" #: DB:work_attribute_type_allowed_value/value:928 msgctxt "work_attribute_type_allowed_value" msgid "Jait kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:115 msgctxt "work_attribute_type_allowed_value" msgid "Janaranjani" msgstr "Janaranjani" #: DB:work_attribute_type_allowed_value/value:929 msgctxt "work_attribute_type_allowed_value" msgid "Jaunpuri" msgstr "" #: DB:work_attribute_type_allowed_value/value:116 msgctxt "work_attribute_type_allowed_value" msgid "Jaya manōhari" msgstr "Jaya manōhari" #: DB:work_attribute_type_allowed_value/value:117 msgctxt "work_attribute_type_allowed_value" msgid "Jayantasēna" msgstr "Jayantasēna" #: DB:work_attribute_type_allowed_value/value:118 msgctxt "work_attribute_type_allowed_value" msgid "Jayantaśrī" msgstr "Jayantaśrī" #: DB:work_attribute_type_allowed_value/value:930 msgctxt "work_attribute_type_allowed_value" msgid "Jayavantī tōḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:833 msgctxt "work_attribute_type_allowed_value" msgid "Jaṭ" msgstr "" #: DB:release_packaging/name:1 msgctxt "release_packaging" msgid "Jewel Case" msgstr "" #: DB:work_attribute_type_allowed_value/value:119 msgctxt "work_attribute_type_allowed_value" msgid "Jhankāradhvani" msgstr "Jhankāradhvani" #: DB:work_attribute_type_allowed_value/value:834 msgctxt "work_attribute_type_allowed_value" msgid "Jhaptāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:931 msgctxt "work_attribute_type_allowed_value" msgid "Jhinjhaṭ mān̄j" msgstr "" #: DB:work_attribute_type_allowed_value/value:932 msgctxt "work_attribute_type_allowed_value" msgid "Jhinjhōṭi" msgstr "" #: DB:work_attribute_type_allowed_value/value:835 msgctxt "work_attribute_type_allowed_value" msgid "Jhūmrā" msgstr "" #: DB:work_attribute_type_allowed_value/value:120 msgctxt "work_attribute_type_allowed_value" msgid "Jingala" msgstr "Jingala" #: DB:work_attribute_type_allowed_value/value:124 msgctxt "work_attribute_type_allowed_value" msgid "Jyōti svarūpiṇi" msgstr "Jyōti svarūpiṇi" #: DB:work_attribute_type_allowed_value/value:121 #: DB:work_attribute_type_allowed_value/value:933 msgctxt "work_attribute_type_allowed_value" msgid "Jōg" msgstr "Jōg" #: DB:work_attribute_type_allowed_value/value:122 msgctxt "work_attribute_type_allowed_value" msgid "Jōgiya" msgstr "Jōgiya" #: DB:work_attribute_type_allowed_value/value:934 msgctxt "work_attribute_type_allowed_value" msgid "Jōgiyā" msgstr "" #: DB:work_attribute_type_allowed_value/value:935 msgctxt "work_attribute_type_allowed_value" msgid "Jōgiyā asavāri" msgstr "" #: DB:work_attribute_type_allowed_value/value:936 msgctxt "work_attribute_type_allowed_value" msgid "Jōgkauns" msgstr "" #: DB:work_attribute_type_allowed_value/value:123 msgctxt "work_attribute_type_allowed_value" msgid "Jōnpuri" msgstr "Jōnpuri" #: DB:work_attribute_type/name:11 msgctxt "work_attribute_type" msgid "KOMCA ID" msgstr "KOMCA-id" #: DB:work_attribute_type_allowed_value/value:621 msgctxt "work_attribute_type_allowed_value" msgid "Kalenderi" msgstr "" #: DB:work_attribute_type_allowed_value/value:128 msgctxt "work_attribute_type_allowed_value" msgid "Kalgaḍa" msgstr "Kalgaḍa" #: DB:work_attribute_type_allowed_value/value:939 msgctxt "work_attribute_type_allowed_value" msgid "Kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:130 #: DB:work_attribute_type_allowed_value/value:940 msgctxt "work_attribute_type_allowed_value" msgid "Kalyāṇi" msgstr "Kalyāṇi" #: DB:work_attribute_type_allowed_value/value:127 #: DB:work_attribute_type_allowed_value/value:937 msgctxt "work_attribute_type_allowed_value" msgid "Kalāvati" msgstr "Kalāvati" #: DB:work_attribute_type_allowed_value/value:938 msgctxt "work_attribute_type_allowed_value" msgid "Kalāśrī" msgstr "" #: DB:work_attribute_type_allowed_value/value:131 msgctxt "work_attribute_type_allowed_value" msgid "Kamalāmanōhari" msgstr "Kamalāmanōhari" #: DB:work_attribute_type_allowed_value/value:622 msgctxt "work_attribute_type_allowed_value" msgid "Kamet" msgstr "" #: DB:work_attribute_type_allowed_value/value:133 msgctxt "work_attribute_type_allowed_value" msgid "Kamās" msgstr "Kamās" #: DB:work_attribute_type_allowed_value/value:137 msgctxt "work_attribute_type_allowed_value" msgid "Kannaḍa gaula" msgstr "Kannaḍa gaula" #: DB:work_attribute_type_allowed_value/value:623 msgctxt "work_attribute_type_allowed_value" msgid "Kanto" msgstr "" #: DB:work_attribute_type_allowed_value/value:742 msgctxt "work_attribute_type_allowed_value" msgid "Kapalı Curcuna" msgstr "" #: DB:work_attribute_type_allowed_value/value:624 msgctxt "work_attribute_type_allowed_value" msgid "Kar" msgstr "" #: DB:work_attribute_type_allowed_value/value:626 msgctxt "work_attribute_type_allowed_value" msgid "Kar-ı Natık" msgstr "" #: DB:work_attribute_type_allowed_value/value:627 msgctxt "work_attribute_type_allowed_value" msgid "Kar-ı Nev" msgstr "" #: DB:work_attribute_type_allowed_value/value:437 msgctxt "work_attribute_type_allowed_value" msgid "Karabağı" msgstr "" #: DB:work_attribute_type_allowed_value/value:141 msgctxt "work_attribute_type_allowed_value" msgid "Karaharapriya" msgstr "Karaharapriya" #: DB:work_attribute_type_allowed_value/value:438 msgctxt "work_attribute_type_allowed_value" msgid "Karcığar" msgstr "" #: DB:work_attribute_type_allowed_value/value:625 msgctxt "work_attribute_type_allowed_value" msgid "Karçe" msgstr "" #: DB:work_attribute_type_allowed_value/value:628 msgctxt "work_attribute_type_allowed_value" msgid "Karşılama" msgstr "" #: DB:work_attribute_type_allowed_value/value:142 msgctxt "work_attribute_type_allowed_value" msgid "Karṇaranjani" msgstr "Karṇaranjani" #: DB:work_attribute_type_allowed_value/value:143 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka behāg" msgstr "Karṇāṭaka behāg" #: DB:work_attribute_type_allowed_value/value:144 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka dēvagāndhāri" msgstr "Karṇāṭaka dēvagāndhāri" #: DB:work_attribute_type_allowed_value/value:145 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka kāpi" msgstr "Karṇāṭaka kāpi" #: DB:work_attribute_type_allowed_value/value:146 msgctxt "work_attribute_type_allowed_value" msgid "Karṇāṭaka śudda sāvēri" msgstr "Karṇāṭaka śudda sāvēri" #: DB:work_attribute_type_allowed_value/value:629 msgctxt "work_attribute_type_allowed_value" msgid "Kasaphavası" msgstr "" #: DB:work_attribute_type_allowed_value/value:147 msgctxt "work_attribute_type_allowed_value" msgid "Kathanakutūhalaṁ" msgstr "Kathanakutūhalaṁ" #: DB:work_attribute_type_allowed_value/value:743 msgctxt "work_attribute_type_allowed_value" msgid "Katikofti" msgstr "" #: DB:work_attribute_type_allowed_value/value:945 msgctxt "work_attribute_type_allowed_value" msgid "Kaunsī kānaḍā" msgstr "" #: DB:work_attribute_type_allowed_value/value:946 msgctxt "work_attribute_type_allowed_value" msgid "Kauśik dhvani" msgstr "" #: DB:work_attribute_type_allowed_value/value:129 msgctxt "work_attribute_type_allowed_value" msgid "Kaḷyāṇa vasantaṁ" msgstr "Kaḷyāṇa vasantaṁ" #: DB:work_attribute_type_allowed_value/value:125 msgctxt "work_attribute_type_allowed_value" msgid "Kaḷā sāvēri" msgstr "Kaḷā sāvēri" #: DB:work_attribute_type_allowed_value/value:126 msgctxt "work_attribute_type_allowed_value" msgid "Kaḷānidhi" msgstr "Kaḷānidhi" #: DB:work_attribute_type_allowed_value/value:439 msgctxt "work_attribute_type_allowed_value" msgid "Kebüter" msgstr "" #: DB:work_attribute_type_allowed_value/value:150 msgctxt "work_attribute_type_allowed_value" msgid "Kedāraṁ" msgstr "Kedāraṁ" #: DB:release_packaging/name:6 msgctxt "release_packaging" msgid "Keep Case" msgstr "" #: DB:work_attribute_type/name:1 msgctxt "work_attribute_type" msgid "Key" msgstr "toneart" #: DB:work_attribute_type_allowed_value/value:950 msgctxt "work_attribute_type_allowed_value" msgid "Khambāvati" msgstr "" #: DB:work_attribute_type_allowed_value/value:948 msgctxt "work_attribute_type_allowed_value" msgid "Khamāj" msgstr "" #: DB:work_attribute_type_allowed_value/value:949 msgctxt "work_attribute_type_allowed_value" msgid "Khamāj bahār" msgstr "" #: DB:work_attribute_type_allowed_value/value:282 msgctxt "work_attribute_type_allowed_value" msgid "Khaṇḍa chāpu" msgstr "Khaṇḍa chāpu" #: DB:work_attribute_type_allowed_value/value:293 msgctxt "work_attribute_type_allowed_value" msgid "Khaṇḍa-jāti tripuṭa" msgstr "Khaṇḍa-jāti tripuṭa" #: DB:work_attribute_type_allowed_value/value:294 msgctxt "work_attribute_type_allowed_value" msgid "Khaṇḍa-jāti ēka" msgstr "Khaṇḍa-jāti ēka" #: DB:work_attribute_type_allowed_value/value:951 msgctxt "work_attribute_type_allowed_value" msgid "Khaṭa" msgstr "" #: DB:work_attribute_type_allowed_value/value:952 msgctxt "work_attribute_type_allowed_value" msgid "Khokar" msgstr "" #: DB:work_attribute_type_allowed_value/value:837 msgctxt "work_attribute_type_allowed_value" msgid "Khēmtāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:630 msgctxt "work_attribute_type_allowed_value" msgid "Koda" msgstr "" #: DB:work_attribute_type_allowed_value/value:631 msgctxt "work_attribute_type_allowed_value" msgid "Koşma" msgstr "" #: DB:work_attribute_type_allowed_value/value:155 msgctxt "work_attribute_type_allowed_value" msgid "Kuntalavarāḷi" msgstr "Kuntalavarāḷi" #: DB:work_attribute_type_allowed_value/value:955 msgctxt "work_attribute_type_allowed_value" msgid "Kuntavarāli" msgstr "" #: DB:work_attribute_type_allowed_value/value:633 msgctxt "work_attribute_type_allowed_value" msgid "Kur'an-ı Kerim" msgstr "" #: DB:work_attribute_type_allowed_value/value:156 msgctxt "work_attribute_type_allowed_value" msgid "Kurinji" msgstr "Kurinji" #: DB:work_attribute_type_allowed_value/value:632 msgctxt "work_attribute_type_allowed_value" msgid "Köçekçe" msgstr "" #: DB:work_attribute_type_allowed_value/value:634 msgctxt "work_attribute_type_allowed_value" msgid "Küpe" msgstr "" #: DB:work_attribute_type_allowed_value/value:442 msgctxt "work_attribute_type_allowed_value" msgid "Kürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:443 msgctxt "work_attribute_type_allowed_value" msgid "Kürdi Gerdaniye" msgstr "" #: DB:work_attribute_type_allowed_value/value:444 msgctxt "work_attribute_type_allowed_value" msgid "Kürdilihicazkar" msgstr "" #: DB:work_attribute_type_allowed_value/value:635 msgctxt "work_attribute_type_allowed_value" msgid "Kürthavası" msgstr "" #: DB:work_attribute_type_allowed_value/value:440 msgctxt "work_attribute_type_allowed_value" msgid "Küçek" msgstr "" #: DB:work_attribute_type_allowed_value/value:441 msgctxt "work_attribute_type_allowed_value" msgid "Küçekneva" msgstr "" #: DB:work_attribute_type_allowed_value/value:132 msgctxt "work_attribute_type_allowed_value" msgid "Kāmaranjani" msgstr "Kāmaranjani" #: DB:work_attribute_type_allowed_value/value:134 msgctxt "work_attribute_type_allowed_value" msgid "Kāmavardani/Pantuvarāḷi" msgstr "Kāmavardani/Pantuvarāḷi" #: DB:work_attribute_type_allowed_value/value:941 msgctxt "work_attribute_type_allowed_value" msgid "Kāmbhōji" msgstr "" #: DB:work_attribute_type_allowed_value/value:942 msgctxt "work_attribute_type_allowed_value" msgid "Kāmōdvanti" msgstr "" #: DB:work_attribute_type_allowed_value/value:136 msgctxt "work_attribute_type_allowed_value" msgid "Kānaḍa" msgstr "Kānaḍa" #: DB:work_attribute_type_allowed_value/value:943 msgctxt "work_attribute_type_allowed_value" msgid "Kānaḍā" msgstr "" #: DB:work_attribute_type_allowed_value/value:138 msgctxt "work_attribute_type_allowed_value" msgid "Kāntāmaṇi" msgstr "Kāntāmaṇi" #: DB:work_attribute_type_allowed_value/value:944 msgctxt "work_attribute_type_allowed_value" msgid "Kāphī" msgstr "" #: DB:work_attribute_type_allowed_value/value:139 msgctxt "work_attribute_type_allowed_value" msgid "Kāpi" msgstr "Kāpi" #: DB:work_attribute_type_allowed_value/value:140 msgctxt "work_attribute_type_allowed_value" msgid "Kāpi nārāyaṇi" msgstr "Kāpi nārāyaṇi" #: DB:work_attribute_type_allowed_value/value:148 msgctxt "work_attribute_type_allowed_value" msgid "Kāvaḍicindu" msgstr "Kāvaḍicindu" #: DB:work_attribute_type_allowed_value/value:135 msgctxt "work_attribute_type_allowed_value" msgid "Kāṁbhōji" msgstr "Kāṁbhōji" #: DB:work_attribute_type_allowed_value/value:947 msgctxt "work_attribute_type_allowed_value" msgid "Kēdār" msgstr "" #: DB:work_attribute_type_allowed_value/value:149 msgctxt "work_attribute_type_allowed_value" msgid "Kēdāragauḷa" msgstr "Kēdāragauḷa" #: DB:work_attribute_type_allowed_value/value:836 msgctxt "work_attribute_type_allowed_value" msgid "Kēharvā" msgstr "" #: DB:work_attribute_type_allowed_value/value:152 #: DB:work_attribute_type_allowed_value/value:953 msgctxt "work_attribute_type_allowed_value" msgid "Kīravāṇi" msgstr "Kīravāṇi" #: DB:work_attribute_type_allowed_value/value:151 msgctxt "work_attribute_type_allowed_value" msgid "Kīraṇāvaḷi" msgstr "Kīraṇāvaḷi" #: DB:work_attribute_type_allowed_value/value:153 msgctxt "work_attribute_type_allowed_value" msgid "Kōkiladhvani" msgstr "Kōkiladhvani" #: DB:work_attribute_type_allowed_value/value:154 msgctxt "work_attribute_type_allowed_value" msgid "Kōkilapriya" msgstr "Kōkilapriya" #: DB:work_attribute_type_allowed_value/value:954 msgctxt "work_attribute_type_allowed_value" msgid "Kōmal riṣabh asāvēri" msgstr "" #: DB:editor_collection_type/name:10 msgctxt "collection_type" msgid "Label" msgstr "Selskab" #: DB:label_alias_type/name:1 msgctxt "alias_type" msgid "Label name" msgstr "selskabsnavn" #: DB:work_attribute_type_allowed_value/value:956 msgctxt "work_attribute_type_allowed_value" msgid "Lagan gāndhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:445 msgctxt "work_attribute_type_allowed_value" msgid "Lalegül" msgstr "" #: DB:work_attribute_type_allowed_value/value:957 msgctxt "work_attribute_type_allowed_value" msgid "Lalit" msgstr "" #: DB:work_attribute_type_allowed_value/value:958 msgctxt "work_attribute_type_allowed_value" msgid "Lalit bhaṭiyār" msgstr "" #: DB:work_attribute_type_allowed_value/value:959 msgctxt "work_attribute_type_allowed_value" msgid "Lalit bibhās" msgstr "" #: DB:work_attribute_type_allowed_value/value:960 msgctxt "work_attribute_type_allowed_value" msgid "Lalit pañcam" msgstr "" #: DB:work_attribute_type_allowed_value/value:961 msgctxt "work_attribute_type_allowed_value" msgid "Lalit Śuddh Dhaivat" msgstr "" #: DB:work_attribute_type_allowed_value/value:157 msgctxt "work_attribute_type_allowed_value" msgid "Lalita" msgstr "Lalita" #: DB:work_attribute_type_allowed_value/value:158 msgctxt "work_attribute_type_allowed_value" msgid "Lalita pancamaṁ" msgstr "Lalita pancamaṁ" #: DB:medium_format/name:5 msgctxt "medium_format" msgid "LaserDisc" msgstr "LaserDisc" #: DB:work_attribute_type_allowed_value/value:159 msgctxt "work_attribute_type_allowed_value" msgid "Latāngi" msgstr "Latāngi" #: DB:event_type/name:3 msgctxt "event_type" msgid "Launch event" msgstr "" #: DB:work_attribute_type_allowed_value/value:160 msgctxt "work_attribute_type_allowed_value" msgid "Lavāngi" msgstr "Lavāngi" #: DB:work_attribute_type_allowed_value/value:962 msgctxt "work_attribute_type_allowed_value" msgid "Laṅkēśrī" msgstr "" #: DB:artist_alias_type/name:2 msgctxt "alias_type" msgid "Legal name" msgstr "juridisk navn" #: DB:work_attribute_type_allowed_value/value:744 msgctxt "work_attribute_type_allowed_value" msgid "Lenk Fahte" msgstr "" #: DB:cover_art_archive.art_type/name:12 msgctxt "cover_art_type" msgid "Liner" msgstr "" #: DB:release_group_secondary_type/name:6 msgctxt "release_group_secondary_type" msgid "Live" msgstr "live" #: DB:work_attribute_type_allowed_value/value:636 msgctxt "work_attribute_type_allowed_value" msgid "Longa" msgstr "" #: DB:work_attribute_type_allowed_value/value:963 msgctxt "work_attribute_type_allowed_value" msgid "Madhmad sāraṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:964 msgctxt "work_attribute_type_allowed_value" msgid "Madhukauns" msgstr "" #: DB:work_attribute_type_allowed_value/value:965 msgctxt "work_attribute_type_allowed_value" msgid "Madhuvanti" msgstr "" #: DB:work_attribute_type_allowed_value/value:161 msgctxt "work_attribute_type_allowed_value" msgid "Madhyamā varāḷi" msgstr "Madhyamā varāḷi" #: DB:work_attribute_type_allowed_value/value:162 msgctxt "work_attribute_type_allowed_value" msgid "Madhyamāvati" msgstr "Madhyamāvati" #: DB:work_attribute_type_allowed_value/value:295 msgctxt "work_attribute_type_allowed_value" msgid "Madhyādi" msgstr "Madhyādi" #: DB:work_type/name:7 msgctxt "work_type" msgid "Madrigal" msgstr "madrigal" #: DB:work_attribute_type_allowed_value/value:163 msgctxt "work_attribute_type_allowed_value" msgid "Maduvanti" msgstr "Maduvanti" #: DB:work_attribute_type_allowed_value/value:637 msgctxt "work_attribute_type_allowed_value" msgid "Mahfelsürmesi" msgstr "" #: DB:work_attribute_type_allowed_value/value:446 msgctxt "work_attribute_type_allowed_value" msgid "Mahur" msgstr "" #: DB:work_attribute_type_allowed_value/value:447 msgctxt "work_attribute_type_allowed_value" msgid "Mahurbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:448 msgctxt "work_attribute_type_allowed_value" msgid "Mahurhan" msgstr "" #: DB:work_attribute_type_allowed_value/value:296 msgctxt "work_attribute_type_allowed_value" msgid "Mahālakṣmi" msgstr "Mahālakṣmi" #: DB:work_attribute_type/name:15 msgctxt "work_attribute_type" msgid "Makam (Ottoman, Turkish)" msgstr "" #: DB:work_attribute_type_allowed_value/value:164 msgctxt "work_attribute_type_allowed_value" msgid "Malahari" msgstr "Malahari" #: DB:work_attribute_type_allowed_value/value:166 msgctxt "work_attribute_type_allowed_value" msgid "Malayamārutaṁ" msgstr "Malayamārutaṁ" #: DB:gender/name:1 msgctxt "gender" msgid "Male" msgstr "" #: DB:work_attribute_type_allowed_value/value:638 msgctxt "work_attribute_type_allowed_value" msgid "Mandra" msgstr "" #: DB:work_attribute_type_allowed_value/value:168 msgctxt "work_attribute_type_allowed_value" msgid "Mandāri" msgstr "Mandāri" #: DB:series_ordering_type/name:2 msgctxt "series_ordering_type" msgid "Manual" msgstr "" #: DB:label_type/name:10 msgctxt "label_type" msgid "Manufacturer" msgstr "" #: DB:work_attribute_type_allowed_value/value:172 msgctxt "work_attribute_type_allowed_value" msgid "Manōranjani" msgstr "Manōranjani" #: DB:work_attribute_type_allowed_value/value:639 msgctxt "work_attribute_type_allowed_value" msgid "Marş" msgstr "" #: DB:work_type/name:8 msgctxt "work_type" msgid "Mass" msgstr "messe" #: DB:event_type/name:5 msgctxt "event_type" msgid "Masterclass/Clinic" msgstr "" #: DB:work_attribute_type_allowed_value/value:449 msgctxt "work_attribute_type_allowed_value" msgid "Maver" msgstr "" #: DB:work_attribute_type_allowed_value/value:450 msgctxt "work_attribute_type_allowed_value" msgid "Mavera" msgstr "" #: DB:work_attribute_type_allowed_value/value:451 msgctxt "work_attribute_type_allowed_value" msgid "Maveraünnehir" msgstr "" #: DB:editor_collection_type/name:6 msgctxt "collection_type" msgid "Maybe attending" msgstr "" #: DB:work_attribute_type_allowed_value/value:452 msgctxt "work_attribute_type_allowed_value" msgid "Maye" msgstr "" #: DB:work_attribute_type_allowed_value/value:175 msgctxt "work_attribute_type_allowed_value" msgid "Mayūra sāvēri" msgstr "Mayūra sāvēri" #: DB:work_attribute_type_allowed_value/value:970 msgctxt "work_attribute_type_allowed_value" msgid "Maṅgal bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:170 msgctxt "work_attribute_type_allowed_value" msgid "Maṇirangu" msgstr "Maṇirangu" #: DB:work_attribute_type_allowed_value/value:286 msgctxt "work_attribute_type_allowed_value" msgid "Maṭhya" msgstr "Maṭhya" #: DB:work_attribute_type_allowed_value/value:838 msgctxt "work_attribute_type_allowed_value" msgid "Maṭṭā" msgstr "" #: DB:work_attribute_type_allowed_value/value:453 msgctxt "work_attribute_type_allowed_value" msgid "Meclis Efruz" msgstr "" #: DB:work_attribute_type_allowed_value/value:640 msgctxt "work_attribute_type_allowed_value" msgid "Medhal" msgstr "" #: DB:cover_art_archive.art_type/name:4 msgctxt "cover_art_type" msgid "Medium" msgstr "medie" #: DB:work_attribute_type_allowed_value/value:176 msgctxt "work_attribute_type_allowed_value" msgid "Meghamalhar" msgstr "Meghamalhar" #: DB:work_attribute_type_allowed_value/value:641 msgctxt "work_attribute_type_allowed_value" msgid "Mehter" msgstr "" #: DB:work_attribute_type_allowed_value/value:642 msgctxt "work_attribute_type_allowed_value" msgid "Mersiye" msgstr "" #: DB:work_attribute_type_allowed_value/value:745 msgctxt "work_attribute_type_allowed_value" msgid "Mevlevi Evferi" msgstr "" #: DB:work_attribute_type_allowed_value/value:643 msgctxt "work_attribute_type_allowed_value" msgid "Mevlidişerif" msgstr "" #: DB:medium_format/name:83 msgctxt "medium_format" msgid "Microcassette" msgstr "" #: DB:medium_format/name:6 msgctxt "medium_format" msgid "MiniDisc" msgstr "MiniDisc" #: DB:work_attribute_type_allowed_value/value:644 msgctxt "work_attribute_type_allowed_value" msgid "Miraciye" msgstr "" #: DB:release_group_secondary_type/name:9 msgctxt "release_group_secondary_type" msgid "Mixtape/Street" msgstr "" #: DB:work_attribute_type_allowed_value/value:981 msgctxt "work_attribute_type_allowed_value" msgid "Miyām̐ kī sāraṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:982 msgctxt "work_attribute_type_allowed_value" msgid "Miyām̐ malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:281 msgctxt "work_attribute_type_allowed_value" msgid "Miśra chāpu" msgstr "Miśra chāpu" #: DB:work_attribute_type_allowed_value/value:977 msgctxt "work_attribute_type_allowed_value" msgid "Miśra gārā" msgstr "" #: DB:work_attribute_type_allowed_value/value:978 msgctxt "work_attribute_type_allowed_value" msgid "Miśra kaliṅgaḍā" msgstr "" #: DB:work_attribute_type_allowed_value/value:177 msgctxt "work_attribute_type_allowed_value" msgid "Miśra khamāj" msgstr "Miśra khamāj" #: DB:work_attribute_type_allowed_value/value:979 msgctxt "work_attribute_type_allowed_value" msgid "Miśra māṇḍ" msgstr "" #: DB:work_attribute_type_allowed_value/value:178 msgctxt "work_attribute_type_allowed_value" msgid "Miśra pahāḍi" msgstr "Miśra pahāḍi" #: DB:work_attribute_type_allowed_value/value:980 msgctxt "work_attribute_type_allowed_value" msgid "Miśra pīlū" msgstr "" #: DB:work_attribute_type_allowed_value/value:180 msgctxt "work_attribute_type_allowed_value" msgid "Miśra yaman" msgstr "Miśra yaman" #: DB:work_attribute_type_allowed_value/value:179 msgctxt "work_attribute_type_allowed_value" msgid "Miśra śivaranjani" msgstr "Miśra śivaranjani" #: DB:work_attribute_type_allowed_value/value:287 msgctxt "work_attribute_type_allowed_value" msgid "Miśra-jāti jhaṁpe" msgstr "Miśra-jāti jhaṁpe" #: DB:work_attribute_type_allowed_value/value:297 msgctxt "work_attribute_type_allowed_value" msgid "Miśra-jāti rūpaka" msgstr "Miśra-jāti rūpaka" #: DB:work_type/name:9 msgctxt "work_type" msgid "Motet" msgstr "motet" #: DB:work_attribute_type_allowed_value/value:746 msgctxt "work_attribute_type_allowed_value" msgid "Muaşşer" msgstr "" #: DB:work_attribute_type_allowed_value/value:454 msgctxt "work_attribute_type_allowed_value" msgid "Muhalif" msgstr "" #: DB:work_attribute_type_allowed_value/value:455 msgctxt "work_attribute_type_allowed_value" msgid "Muhalif-i Irak" msgstr "" #: DB:work_attribute_type_allowed_value/value:456 msgctxt "work_attribute_type_allowed_value" msgid "Muhalif-i Rast" msgstr "" #: DB:work_attribute_type_allowed_value/value:457 msgctxt "work_attribute_type_allowed_value" msgid "Muhalif-i Uşşak" msgstr "" #: DB:work_attribute_type_allowed_value/value:747 msgctxt "work_attribute_type_allowed_value" msgid "Muhammes" msgstr "" #: DB:work_attribute_type_allowed_value/value:458 msgctxt "work_attribute_type_allowed_value" msgid "Muhayyer" msgstr "" #: DB:work_attribute_type_allowed_value/value:459 msgctxt "work_attribute_type_allowed_value" msgid "Muhayyer Sünbüle" msgstr "" #: DB:work_attribute_type_allowed_value/value:462 msgctxt "work_attribute_type_allowed_value" msgid "Muhayyer Zengüle" msgstr "" #: DB:work_attribute_type_allowed_value/value:460 msgctxt "work_attribute_type_allowed_value" msgid "Muhayyerbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:461 msgctxt "work_attribute_type_allowed_value" msgid "Muhayyerkürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:183 msgctxt "work_attribute_type_allowed_value" msgid "Mukhāri" msgstr "Mukhāri" #: DB:work_attribute_type_allowed_value/value:983 msgctxt "work_attribute_type_allowed_value" msgid "Multāni" msgstr "" #: DB:area_type/name:4 msgctxt "area_type" msgid "Municipality" msgstr "kommune" #: DB:area_type/description:4 msgctxt "area_type" msgid "" "Municipality is used for small administrative divisions which, for urban " "municipalities, often contain a single city and a few surrounding villages. " "Rural municipalities typically group several villages together." msgstr "" #: DB:work_attribute_type_allowed_value/value:645 msgctxt "work_attribute_type_allowed_value" msgid "Murabba" msgstr "" #: DB:work_attribute_type_allowed_value/value:811 msgctxt "work_attribute_type_allowed_value" msgid "Murabba Beste " msgstr "" #: DB:medium_format/name:46 msgctxt "medium_format" msgid "Music Card" msgstr "" #: DB:work_type/name:29 msgctxt "work_type" msgid "Musical" msgstr "" #: DB:work_type/description:29 msgctxt "work_type" msgid "" "Musical theatre is a form of theatrical performance that combines songs, " "spoken dialogue, acting, and dance." msgstr "" #: DB:work_attribute_type_allowed_value/value:748 msgctxt "work_attribute_type_allowed_value" msgid "Muzaaf Devr-i Kebir" msgstr "" #: DB:work_attribute_type/name:12 msgctxt "work_attribute_type" msgid "MÜST ID" msgstr "MÜST-id" #: DB:work_attribute_type_allowed_value/value:463 msgctxt "work_attribute_type_allowed_value" msgid "Müberka" msgstr "" #: DB:work_attribute_type_allowed_value/value:646 msgctxt "work_attribute_type_allowed_value" msgid "Münacaat" msgstr "" #: DB:work_attribute_type_allowed_value/value:464 msgctxt "work_attribute_type_allowed_value" msgid "Mürekkep Isfahan" msgstr "" #: DB:work_attribute_type_allowed_value/value:749 msgctxt "work_attribute_type_allowed_value" msgid "Mürekkep Nimsofyan" msgstr "" #: DB:work_attribute_type_allowed_value/value:750 msgctxt "work_attribute_type_allowed_value" msgid "Mürekkep Semai/Üçleme" msgstr "" #: DB:work_attribute_type_allowed_value/value:751 msgctxt "work_attribute_type_allowed_value" msgid "Mürekkep Sofyan" msgstr "" #: DB:work_attribute_type_allowed_value/value:465 msgctxt "work_attribute_type_allowed_value" msgid "Müselles" msgstr "" #: DB:work_attribute_type_allowed_value/value:752 msgctxt "work_attribute_type_allowed_value" msgid "Müsemmen" msgstr "" #: DB:work_attribute_type_allowed_value/value:753 msgctxt "work_attribute_type_allowed_value" msgid "Müsemmen II" msgstr "" #: DB:work_attribute_type_allowed_value/value:466 msgctxt "work_attribute_type_allowed_value" msgid "Müstear" msgstr "" #: DB:work_attribute_type_allowed_value/value:467 msgctxt "work_attribute_type_allowed_value" msgid "Müşküye" msgstr "" #: DB:work_attribute_type_allowed_value/value:966 msgctxt "work_attribute_type_allowed_value" msgid "Mājh khamāj" msgstr "" #: DB:work_attribute_type_allowed_value/value:967 msgctxt "work_attribute_type_allowed_value" msgid "Mālava" msgstr "" #: DB:work_attribute_type_allowed_value/value:968 msgctxt "work_attribute_type_allowed_value" msgid "Mālkauns" msgstr "" #: DB:work_attribute_type_allowed_value/value:969 msgctxt "work_attribute_type_allowed_value" msgid "Mālāvati" msgstr "" #: DB:work_attribute_type_allowed_value/value:167 msgctxt "work_attribute_type_allowed_value" msgid "Mānavati" msgstr "Mānavati" #: DB:work_attribute_type_allowed_value/value:171 msgctxt "work_attribute_type_allowed_value" msgid "Mānji" msgstr "Mānji" #: DB:work_attribute_type_allowed_value/value:169 msgctxt "work_attribute_type_allowed_value" msgid "Mānḍu" msgstr "Mānḍu" #: DB:work_attribute_type_allowed_value/value:173 msgctxt "work_attribute_type_allowed_value" msgid "Mārgahindōḷaṁ" msgstr "Mārgahindōḷaṁ" #: DB:work_attribute_type_allowed_value/value:971 msgctxt "work_attribute_type_allowed_value" msgid "Mārvā" msgstr "" #: DB:work_attribute_type_allowed_value/value:972 msgctxt "work_attribute_type_allowed_value" msgid "Mārvāśrī mārvā" msgstr "" #: DB:work_attribute_type_allowed_value/value:973 msgctxt "work_attribute_type_allowed_value" msgid "Mārūbihāg" msgstr "" #: DB:work_attribute_type_allowed_value/value:174 msgctxt "work_attribute_type_allowed_value" msgid "Māyāmāḷavagauḷa" msgstr "Māyāmāḷavagauḷa" #: DB:work_attribute_type_allowed_value/value:165 msgctxt "work_attribute_type_allowed_value" msgid "Māḷavi" msgstr "Māḷavi" #: DB:work_attribute_type_allowed_value/value:974 msgctxt "work_attribute_type_allowed_value" msgid "Mēgh" msgstr "" #: DB:work_attribute_type_allowed_value/value:975 msgctxt "work_attribute_type_allowed_value" msgid "Mēgh malahār" msgstr "" #: DB:work_attribute_type_allowed_value/value:976 msgctxt "work_attribute_type_allowed_value" msgid "Mīrā malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:181 msgctxt "work_attribute_type_allowed_value" msgid "Mōhan kaḷyāṇi" msgstr "Mōhan kaḷyāṇi" #: DB:work_attribute_type_allowed_value/value:182 msgctxt "work_attribute_type_allowed_value" msgid "Mōhanaṁ" msgstr "Mōhanaṁ" #: DB:work_attribute_type_allowed_value/value:647 msgctxt "work_attribute_type_allowed_value" msgid "Naat" msgstr "" #: DB:work_attribute_type_allowed_value/value:984 msgctxt "work_attribute_type_allowed_value" msgid "Nagaḍ" msgstr "" #: DB:work_attribute_type_allowed_value/value:648 msgctxt "work_attribute_type_allowed_value" msgid "Nakış" msgstr "" #: DB:work_attribute_type_allowed_value/value:809 msgctxt "work_attribute_type_allowed_value" msgid "Nakış Ağırsemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:808 msgctxt "work_attribute_type_allowed_value" msgid "Nakış Beste" msgstr "" #: DB:work_attribute_type_allowed_value/value:810 msgctxt "work_attribute_type_allowed_value" msgid "Nakış Yürüksemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:985 msgctxt "work_attribute_type_allowed_value" msgid "Nanād" msgstr "" #: DB:work_attribute_type_allowed_value/value:468 msgctxt "work_attribute_type_allowed_value" msgid "Narefte" msgstr "" #: DB:work_attribute_type_allowed_value/value:649 msgctxt "work_attribute_type_allowed_value" msgid "Natipeygamberi" msgstr "" #: DB:work_attribute_type_allowed_value/value:196 msgctxt "work_attribute_type_allowed_value" msgid "Navarasa kannaḍa" msgstr "Navarasa kannaḍa" #: DB:work_attribute_type_allowed_value/value:195 msgctxt "work_attribute_type_allowed_value" msgid "Navarāgamālika" msgstr "Navarāgamālika" #: DB:work_attribute_type_allowed_value/value:197 msgctxt "work_attribute_type_allowed_value" msgid "Navrōj" msgstr "Navrōj" #: DB:work_attribute_type_allowed_value/value:754 msgctxt "work_attribute_type_allowed_value" msgid "Nazlı Düyek" msgstr "" #: DB:work_attribute_type_allowed_value/value:187 msgctxt "work_attribute_type_allowed_value" msgid "Naḷinakānti" msgstr "Naḷinakānti" #: DB:work_attribute_type_allowed_value/value:986 msgctxt "work_attribute_type_allowed_value" msgid "Naṭ bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:987 msgctxt "work_attribute_type_allowed_value" msgid "Naṭ bihāg" msgstr "" #: DB:work_attribute_type_allowed_value/value:988 msgctxt "work_attribute_type_allowed_value" msgid "Naṭ kāmōd" msgstr "" #: DB:work_attribute_type_allowed_value/value:989 msgctxt "work_attribute_type_allowed_value" msgid "Naṭ malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:990 msgctxt "work_attribute_type_allowed_value" msgid "Naṭ nārāyaṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:191 msgctxt "work_attribute_type_allowed_value" msgid "Naṭabhairavi" msgstr "Naṭabhairavi" #: DB:work_attribute_type_allowed_value/value:194 msgctxt "work_attribute_type_allowed_value" msgid "Naṭanārāyaṇi" msgstr "Naṭanārāyaṇi" #: DB:work_attribute_type_allowed_value/value:469 msgctxt "work_attribute_type_allowed_value" msgid "Necd-i Hüseyni" msgstr "" #: DB:work_attribute_type_allowed_value/value:650 msgctxt "work_attribute_type_allowed_value" msgid "Nefes" msgstr "" #: DB:work_attribute_type_allowed_value/value:470 msgctxt "work_attribute_type_allowed_value" msgid "Neresin" msgstr "" #: DB:work_attribute_type_allowed_value/value:472 msgctxt "work_attribute_type_allowed_value" msgid "Neva" msgstr "" #: DB:work_attribute_type_allowed_value/value:473 msgctxt "work_attribute_type_allowed_value" msgid "Neva Bağdat" msgstr "" #: DB:work_attribute_type_allowed_value/value:474 msgctxt "work_attribute_type_allowed_value" msgid "Neva Dilkeş" msgstr "" #: DB:work_attribute_type_allowed_value/value:475 msgctxt "work_attribute_type_allowed_value" msgid "Nevabuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:476 msgctxt "work_attribute_type_allowed_value" msgid "Nevakürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:477 msgctxt "work_attribute_type_allowed_value" msgid "Nevaziş" msgstr "" #: DB:work_attribute_type_allowed_value/value:478 msgctxt "work_attribute_type_allowed_value" msgid "Neveda" msgstr "" #: DB:work_attribute_type_allowed_value/value:479 msgctxt "work_attribute_type_allowed_value" msgid "Neveser" msgstr "" #: DB:work_attribute_type_allowed_value/value:480 msgctxt "work_attribute_type_allowed_value" msgid "Nevkeş" msgstr "" #: DB:work_attribute_type_allowed_value/value:481 msgctxt "work_attribute_type_allowed_value" msgid "Nevruz" msgstr "" #: DB:work_attribute_type_allowed_value/value:482 msgctxt "work_attribute_type_allowed_value" msgid "Nevruzi Rumi" msgstr "" #: DB:work_attribute_type/name:33 msgctxt "work_attribute_type" msgid "NexTone ID" msgstr "" #: DB:work_attribute_type_allowed_value/value:471 msgctxt "work_attribute_type_allowed_value" msgid "Neşataver" msgstr "" #: DB:work_attribute_type_allowed_value/value:483 msgctxt "work_attribute_type_allowed_value" msgid "Nigar" msgstr "" #: DB:work_attribute_type_allowed_value/value:484 msgctxt "work_attribute_type_allowed_value" msgid "Nihavend-i Kebir" msgstr "" #: DB:work_attribute_type_allowed_value/value:485 msgctxt "work_attribute_type_allowed_value" msgid "Nihavend-i Rumi" msgstr "" #: DB:work_attribute_type_allowed_value/value:486 msgctxt "work_attribute_type_allowed_value" msgid "Nihavent" msgstr "" #: DB:work_attribute_type_allowed_value/value:487 msgctxt "work_attribute_type_allowed_value" msgid "Nikriz" msgstr "" #: DB:work_attribute_type_allowed_value/value:755 msgctxt "work_attribute_type_allowed_value" msgid "Nimberefşan" msgstr "" #: DB:work_attribute_type_allowed_value/value:757 msgctxt "work_attribute_type_allowed_value" msgid "Nimdevir" msgstr "" #: DB:work_attribute_type_allowed_value/value:758 msgctxt "work_attribute_type_allowed_value" msgid "Nimevsat" msgstr "" #: DB:work_attribute_type_allowed_value/value:759 msgctxt "work_attribute_type_allowed_value" msgid "Nimhafif" msgstr "" #: DB:work_attribute_type_allowed_value/value:760 msgctxt "work_attribute_type_allowed_value" msgid "Nimsakil" msgstr "" #: DB:work_attribute_type_allowed_value/value:761 msgctxt "work_attribute_type_allowed_value" msgid "Nimsofyan" msgstr "" #: DB:work_attribute_type_allowed_value/value:756 msgctxt "work_attribute_type_allowed_value" msgid "Nimçember" msgstr "" #: DB:work_attribute_type_allowed_value/value:651 msgctxt "work_attribute_type_allowed_value" msgid "Ninni" msgstr "" #: DB:work_attribute_type_allowed_value/value:200 msgctxt "work_attribute_type_allowed_value" msgid "Nirōṣita" msgstr "Nirōṣita" #: DB:work_attribute_type_allowed_value/value:488 msgctxt "work_attribute_type_allowed_value" msgid "Nişabur" msgstr "" #: DB:work_attribute_type_allowed_value/value:489 msgctxt "work_attribute_type_allowed_value" msgid "Nişaburek" msgstr "" #: DB:work_attribute_type_allowed_value/value:490 msgctxt "work_attribute_type_allowed_value" msgid "Nişabureyn" msgstr "" #: DB:release_packaging/name:7 msgctxt "release_packaging" msgid "None" msgstr "" #: DB:gender/name:4 msgctxt "gender" msgid "Not applicable" msgstr "" #: DB:work_attribute_type_allowed_value/value:491 msgctxt "work_attribute_type_allowed_value" msgid "Nuşingül" msgstr "" #: DB:work_attribute_type_allowed_value/value:492 msgctxt "work_attribute_type_allowed_value" msgid "Nühüft" msgstr "" #: DB:work_attribute_type_allowed_value/value:184 msgctxt "work_attribute_type_allowed_value" msgid "Nādanāmakriya" msgstr "Nādanāmakriya" #: DB:work_attribute_type_allowed_value/value:185 msgctxt "work_attribute_type_allowed_value" msgid "Nāga gāndhāri" msgstr "Nāga gāndhāri" #: DB:work_attribute_type_allowed_value/value:186 msgctxt "work_attribute_type_allowed_value" msgid "Nāgasvarāvaḷi" msgstr "Nāgasvarāvaḷi" #: DB:work_attribute_type_allowed_value/value:188 msgctxt "work_attribute_type_allowed_value" msgid "Nārāyaṇi" msgstr "Nārāyaṇi" #: DB:work_attribute_type_allowed_value/value:189 msgctxt "work_attribute_type_allowed_value" msgid "Nāsikabhūṣaṇi" msgstr "Nāsikabhūṣaṇi" #: DB:work_attribute_type_allowed_value/value:198 msgctxt "work_attribute_type_allowed_value" msgid "Nāyaki" msgstr "Nāyaki" #: DB:work_attribute_type_allowed_value/value:991 msgctxt "work_attribute_type_allowed_value" msgid "Nāyakī kānaḍā" msgstr "" #: DB:work_attribute_type_allowed_value/value:190 msgctxt "work_attribute_type_allowed_value" msgid "Nāṭa" msgstr "Nāṭa" #: DB:work_attribute_type_allowed_value/value:192 msgctxt "work_attribute_type_allowed_value" msgid "Nāṭakapriya" msgstr "Nāṭakapriya" #: DB:work_attribute_type_allowed_value/value:193 msgctxt "work_attribute_type_allowed_value" msgid "Nāṭakurinji" msgstr "Nāṭakurinji" #: DB:work_attribute_type_allowed_value/value:992 msgctxt "work_attribute_type_allowed_value" msgid "Nīlāmbari" msgstr "" #: DB:work_attribute_type_allowed_value/value:199 msgctxt "work_attribute_type_allowed_value" msgid "Nīlāṁbari" msgstr "Nīlāṁbari" #: DB:work_attribute_type/name:25 msgctxt "work_attribute_type" msgid "OSA ID" msgstr "" #: DB:cover_art_archive.art_type/name:5 msgctxt "cover_art_type" msgid "Obi" msgstr "obi" #: DB:release_status/name:1 msgctxt "release_status" msgid "Official" msgstr "Officiel" #: DB:work_type/name:10 msgctxt "work_type" msgid "Opera" msgstr "opera" #: DB:work_type/name:24 msgctxt "work_type" msgid "Operetta" msgstr "operette" #: DB:work_type/name:11 msgctxt "work_type" msgid "Oratorio" msgstr "oratorium" #: DB:artist_type/name:5 msgctxt "artist_type" msgid "Orchestra" msgstr "orkester" #: DB:label_type/name:4 msgctxt "label_type" msgid "Original Production" msgstr "" #: DB:artist_type/name:3 msgctxt "artist_type" msgid "Other" msgstr "andet" #: DB:cover_art_archive.art_type/name:8 msgctxt "cover_art_type" msgid "Other" msgstr "andet" #: DB:gender/name:3 msgctxt "gender" msgid "Other" msgstr "andet" #: DB:medium_format/name:13 msgctxt "medium_format" msgid "Other" msgstr "andet" #: DB:place_type/name:3 msgctxt "place_type" msgid "Other" msgstr "andet" #: DB:release_group_primary_type/name:11 msgctxt "release_group_primary_type" msgid "Other" msgstr "andet" #: DB:release_packaging/name:5 msgctxt "release_packaging" msgid "Other" msgstr "andet" #: DB:instrument_type/name:5 msgctxt "instrument_type" msgid "Other instrument" msgstr "" #: DB:work_type/name:12 msgctxt "work_type" msgid "Overture" msgstr "ouverture" #: DB:editor_collection_type/name:2 msgctxt "collection_type" msgid "Owned music" msgstr "" #: DB:work_attribute_type_allowed_value/value:762 msgctxt "work_attribute_type_allowed_value" msgid "Oynak" msgstr "" #: DB:work_attribute_type_allowed_value/value:652 msgctxt "work_attribute_type_allowed_value" msgid "Oyunhavası" msgstr "" #: DB:work_attribute_type_allowed_value/value:993 msgctxt "work_attribute_type_allowed_value" msgid "Pahāḍi" msgstr "" #: DB:work_attribute_type_allowed_value/value:839 msgctxt "work_attribute_type_allowed_value" msgid "Pan̄cam savārī" msgstr "" #: DB:work_attribute_type_allowed_value/value:840 msgctxt "work_attribute_type_allowed_value" msgid "Pan̄jābī " msgstr "" #: DB:work_attribute_type_allowed_value/value:994 msgctxt "work_attribute_type_allowed_value" msgid "Paraj" msgstr "" #: DB:work_attribute_type_allowed_value/value:203 msgctxt "work_attribute_type_allowed_value" msgid "Paras" msgstr "Paras" #: DB:work_type/name:13 msgctxt "work_type" msgid "Partita" msgstr "partita" #: DB:medium_format/name:58 msgctxt "medium_format" msgid "Pathé disc" msgstr "" #: DB:work_attribute_type_allowed_value/value:995 msgctxt "work_attribute_type_allowed_value" msgid "Pañcam" msgstr "" #: DB:work_attribute_type_allowed_value/value:996 msgctxt "work_attribute_type_allowed_value" msgid "Paṭaman̄jari" msgstr "" #: DB:work_attribute_type_allowed_value/value:204 #: DB:work_attribute_type_allowed_value/value:997 msgctxt "work_attribute_type_allowed_value" msgid "Paṭdīp" msgstr "Paṭdīp" #: DB:work_attribute_type_allowed_value/value:493 msgctxt "work_attribute_type_allowed_value" msgid "Pençgah" msgstr "" #: DB:work_attribute_type_allowed_value/value:494 msgctxt "work_attribute_type_allowed_value" msgid "Pençgah-ı Asl" msgstr "" #: DB:work_attribute_type_allowed_value/value:495 msgctxt "work_attribute_type_allowed_value" msgid "Pençgah-ı Zaid" msgstr "" #: DB:instrument_type/name:3 msgctxt "instrument_type" msgid "Percussion instrument" msgstr "" #: DB:work_attribute_type_allowed_value/value:496 msgctxt "work_attribute_type_allowed_value" msgid "Perr-i Zerrin" msgstr "" #: DB:artist_type/name:1 msgctxt "artist_type" msgid "Person" msgstr "person" #: DB:work_attribute_type_allowed_value/value:497 msgctxt "work_attribute_type_allowed_value" msgid "Pesendide" msgstr "" #: DB:work_attribute_type_allowed_value/value:498 msgctxt "work_attribute_type_allowed_value" msgid "Peyk-i Neşat" msgstr "" #: DB:work_attribute_type_allowed_value/value:499 msgctxt "work_attribute_type_allowed_value" msgid "Peyk-i Safa" msgstr "" #: DB:work_attribute_type_allowed_value/value:654 msgctxt "work_attribute_type_allowed_value" msgid "Peşrev" msgstr "" #: DB:medium_format/name:73 msgctxt "medium_format" msgid "Phonograph record" msgstr "" #: DB:medium_format/name:15 msgctxt "medium_format" msgid "Piano Roll" msgstr "" #: DB:editor_collection_type/name:11 msgctxt "collection_type" msgid "Place" msgstr "" #: DB:place_alias_type/name:1 msgctxt "alias_type" msgid "Place name" msgstr "stednavn" #: DB:release_packaging/description:20 msgctxt "release_packaging" msgid "Plastic CD tray inside a cardboard slipcover" msgstr "" #: DB:release_packaging/name:18 msgctxt "release_packaging" msgid "Plastic Sleeve" msgstr "" #: DB:work_type/name:28 msgctxt "work_type" msgid "Play" msgstr "" #: DB:medium_format/name:74 msgctxt "medium_format" msgid "PlayTape" msgstr "" #: DB:medium_format/name:45 msgctxt "medium_format" msgid "Playbutton" msgstr "" #: DB:work_type/name:21 msgctxt "work_type" msgid "Poem" msgstr "digt" #: DB:work_attribute_type_allowed_value/value:655 msgctxt "work_attribute_type_allowed_value" msgid "Pop şarkısı" msgstr "" #: DB:cover_art_archive.art_type/name:11 msgctxt "cover_art_type" msgid "Poster" msgstr "plakat" #: DB:work_attribute_type_allowed_value/value:998 msgctxt "work_attribute_type_allowed_value" msgid "Pratāpavarāli" msgstr "" #: DB:place_type/name:8 msgctxt "place_type" msgid "Pressing plant" msgstr "" #: DB:label_type/name:3 msgctxt "label_type" msgid "Production" msgstr "" #: DB:release_status/name:2 msgctxt "release_status" msgid "Promotion" msgstr "" #: DB:work_type/name:23 msgctxt "work_type" msgid "Prose" msgstr "prosa" #: DB:release_status/name:4 msgctxt "release_status" msgid "Pseudo-Release" msgstr "pseudo-udgivelse" #: DB:label_type/name:7 msgctxt "label_type" msgid "Publisher" msgstr "" #: DB:work_attribute_type_allowed_value/value:999 msgctxt "work_attribute_type_allowed_value" msgid "Puriyā" msgstr "" #: DB:work_attribute_type_allowed_value/value:1000 msgctxt "work_attribute_type_allowed_value" msgid "Puriyā dhanaśrī" msgstr "" #: DB:work_attribute_type_allowed_value/value:1001 msgctxt "work_attribute_type_allowed_value" msgid "Puriyā kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:205 msgctxt "work_attribute_type_allowed_value" msgid "Puṇṇāgavarāḷi" msgstr "Puṇṇāgavarāḷi" #: DB:work_attribute_type_allowed_value/value:209 msgctxt "work_attribute_type_allowed_value" msgid "Puṣpalatika" msgstr "Puṣpalatika" #: DB:work_attribute_type_allowed_value/value:202 msgctxt "work_attribute_type_allowed_value" msgid "Pālamanjari" msgstr "Pālamanjari" #: DB:work_attribute_type_allowed_value/value:201 msgctxt "work_attribute_type_allowed_value" msgid "Pāḍi" msgstr "Pāḍi" #: DB:work_attribute_type_allowed_value/value:208 #: DB:work_attribute_type_allowed_value/value:1002 msgctxt "work_attribute_type_allowed_value" msgid "Pūrvi" msgstr "Pūrvi" #: DB:work_attribute_type_allowed_value/value:206 msgctxt "work_attribute_type_allowed_value" msgid "Pūrṇa ṣaḍjaṁ" msgstr "Pūrṇa ṣaḍjaṁ" #: DB:work_attribute_type_allowed_value/value:207 msgctxt "work_attribute_type_allowed_value" msgid "Pūrṇacandrika" msgstr "Pūrṇacandrika" #: DB:work_type/name:14 msgctxt "work_type" msgid "Quartet" msgstr "kvartet" #: DB:work_attribute_type_allowed_value/value:500 msgctxt "work_attribute_type_allowed_value" msgid "Rahatfeza" msgstr "" #: DB:work_attribute_type_allowed_value/value:501 msgctxt "work_attribute_type_allowed_value" msgid "Rahatülervah" msgstr "" #: DB:work_attribute_type_allowed_value/value:763 msgctxt "work_attribute_type_allowed_value" msgid "Raksaksağı" msgstr "" #: DB:work_attribute_type_allowed_value/value:798 msgctxt "work_attribute_type_allowed_value" msgid "Raksaksağı II" msgstr "" #: DB:work_attribute_type_allowed_value/value:764 msgctxt "work_attribute_type_allowed_value" msgid "Raksan" msgstr "" #: DB:work_attribute_type_allowed_value/value:502 msgctxt "work_attribute_type_allowed_value" msgid "Ramiş-i Can" msgstr "" #: DB:work_attribute_type_allowed_value/value:215 msgctxt "work_attribute_type_allowed_value" msgid "Ranjani" msgstr "Ranjani" #: DB:work_attribute_type_allowed_value/value:216 msgctxt "work_attribute_type_allowed_value" msgid "Rasikapriya" msgstr "Rasikapriya" #: DB:work_attribute_type_allowed_value/value:503 msgctxt "work_attribute_type_allowed_value" msgid "Rast" msgstr "" #: DB:work_attribute_type_allowed_value/value:506 msgctxt "work_attribute_type_allowed_value" msgid "Rast Haveran" msgstr "" #: DB:work_attribute_type_allowed_value/value:513 msgctxt "work_attribute_type_allowed_value" msgid "Rast-Maye" msgstr "" #: DB:work_attribute_type_allowed_value/value:507 msgctxt "work_attribute_type_allowed_value" msgid "Rast-ı Atik" msgstr "" #: DB:work_attribute_type_allowed_value/value:508 msgctxt "work_attribute_type_allowed_value" msgid "Rast-ı Cedid" msgstr "" #: DB:work_attribute_type_allowed_value/value:509 msgctxt "work_attribute_type_allowed_value" msgid "Rast-ı Rumi" msgstr "" #: DB:work_attribute_type_allowed_value/value:510 msgctxt "work_attribute_type_allowed_value" msgid "Rast-ı Sağır" msgstr "" #: DB:work_attribute_type_allowed_value/value:511 msgctxt "work_attribute_type_allowed_value" msgid "Rast-ı Sultani" msgstr "" #: DB:work_attribute_type_allowed_value/value:504 msgctxt "work_attribute_type_allowed_value" msgid "Rastaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:505 msgctxt "work_attribute_type_allowed_value" msgid "Rastdilara" msgstr "" #: DB:work_attribute_type_allowed_value/value:512 msgctxt "work_attribute_type_allowed_value" msgid "Rastkürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:217 msgctxt "work_attribute_type_allowed_value" msgid "Ratipati priya" msgstr "Ratipati priya" #: DB:work_attribute_type_allowed_value/value:218 msgctxt "work_attribute_type_allowed_value" msgid "Ravicandrika" msgstr "Ravicandrika" #: DB:cover_art_archive.art_type/name:14 msgctxt "cover_art_type" msgid "Raw/Unedited" msgstr "" #: DB:editor_collection_type/name:12 msgctxt "collection_type" msgid "Recording" msgstr "" #: DB:recording_alias_type/name:1 msgctxt "alias_type" msgid "Recording name" msgstr "" #: DB:series_type/name:3 msgctxt "series_type" msgid "Recording series" msgstr "" #: DB:medium_format/name:10 msgctxt "medium_format" msgid "Reel-to-reel" msgstr "spolebånd" #: DB:work_attribute_type_allowed_value/value:514 msgctxt "work_attribute_type_allowed_value" msgid "Rehavi" msgstr "" #: DB:label_type/name:6 msgctxt "label_type" msgid "Reissue Production" msgstr "" #: DB:work_attribute_type_allowed_value/value:515 msgctxt "work_attribute_type_allowed_value" msgid "Rekb-i Zavil" msgstr "" #: DB:editor_collection_type/name:1 msgctxt "collection_type" msgid "Release" msgstr "" #: DB:editor_collection_type/name:13 msgctxt "collection_type" msgid "Release group" msgstr "" #: DB:release_group_alias_type/name:1 msgctxt "alias_type" msgid "Release group name" msgstr "" #: DB:series_type/name:1 msgctxt "series_type" msgid "Release group series" msgstr "" #: DB:release_alias_type/name:1 msgctxt "alias_type" msgid "Release name" msgstr "" #: DB:series_type/name:2 msgctxt "series_type" msgid "Release series" msgstr "" #: DB:place_type/name:6 msgctxt "place_type" msgid "Religious building" msgstr "" #: DB:work_attribute_type_allowed_value/value:765 msgctxt "work_attribute_type_allowed_value" msgid "Remel" msgstr "" #: DB:release_group_secondary_type/name:7 msgctxt "release_group_secondary_type" msgid "Remix" msgstr "remix" #: DB:work_attribute_type_allowed_value/value:516 msgctxt "work_attribute_type_allowed_value" msgid "Reng-i Dil" msgstr "" #: DB:work_attribute_type_allowed_value/value:517 msgctxt "work_attribute_type_allowed_value" msgid "Revnaknüma" msgstr "" #: DB:work_attribute_type_allowed_value/value:518 msgctxt "work_attribute_type_allowed_value" msgid "Reyya" msgstr "" #: DB:label_type/name:8 msgctxt "label_type" msgid "Rights Society" msgstr "" #: DB:work_attribute_type_allowed_value/value:222 msgctxt "work_attribute_type_allowed_value" msgid "Rudrapriya" msgstr "Rudrapriya" #: DB:work_attribute_type_allowed_value/value:519 msgctxt "work_attribute_type_allowed_value" msgid "Ruhnüvaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:656 msgctxt "work_attribute_type_allowed_value" msgid "Rumeli Türküsü" msgstr "" #: DB:series_type/name:9 msgctxt "series_type" msgid "Run" msgstr "" #: DB:work_attribute_type_allowed_value/value:521 msgctxt "work_attribute_type_allowed_value" msgid "Ruy-i Dilara" msgstr "" #: DB:work_attribute_type_allowed_value/value:520 msgctxt "work_attribute_type_allowed_value" msgid "Ruy-i Irak" msgstr "" #: DB:work_attribute_type_allowed_value/value:600 msgctxt "work_attribute_type_allowed_value" msgid "Ruy-i Neva" msgstr "" #: DB:work_attribute_type/name:4 msgctxt "work_attribute_type" msgid "Rāga (Carnatic)" msgstr "" #: DB:work_attribute_type/name:32 msgctxt "work_attribute_type" msgid "Rāga (Hindustani)" msgstr "" #: DB:work_attribute_type_allowed_value/value:1003 msgctxt "work_attribute_type_allowed_value" msgid "Rāgamalikā" msgstr "" #: DB:work_attribute_type_allowed_value/value:210 msgctxt "work_attribute_type_allowed_value" msgid "Rāgamālika" msgstr "Rāgamālika" #: DB:work_attribute_type_allowed_value/value:211 msgctxt "work_attribute_type_allowed_value" msgid "Rāgavinōdini" msgstr "Rāgavinōdini" #: DB:work_attribute_type_allowed_value/value:212 #: DB:work_attribute_type_allowed_value/value:1004 msgctxt "work_attribute_type_allowed_value" msgid "Rāgēśrī" msgstr "Rāgēśrī" #: DB:work_attribute_type_allowed_value/value:1005 msgctxt "work_attribute_type_allowed_value" msgid "Rāj kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:213 msgctxt "work_attribute_type_allowed_value" msgid "Rāma manōhari" msgstr "Rāma manōhari" #: DB:work_attribute_type_allowed_value/value:1006 msgctxt "work_attribute_type_allowed_value" msgid "Rāmakali" msgstr "" #: DB:work_attribute_type_allowed_value/value:214 msgctxt "work_attribute_type_allowed_value" msgid "Rāmapriya" msgstr "Rāmapriya" #: DB:work_attribute_type_allowed_value/value:1007 msgctxt "work_attribute_type_allowed_value" msgid "Rāmdāsī malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:219 msgctxt "work_attribute_type_allowed_value" msgid "Rēvagupti" msgstr "Rēvagupti" #: DB:work_attribute_type_allowed_value/value:220 msgctxt "work_attribute_type_allowed_value" msgid "Rēvati" msgstr "Rēvati" #: DB:work_attribute_type_allowed_value/value:221 msgctxt "work_attribute_type_allowed_value" msgid "Rītigauḷa" msgstr "Rītigauḷa" #: DB:work_attribute_type_allowed_value/value:841 msgctxt "work_attribute_type_allowed_value" msgid "Rūpak" msgstr "" #: DB:work_attribute_type_allowed_value/value:280 msgctxt "work_attribute_type_allowed_value" msgid "Rūpaka" msgstr "Rūpaka" #: DB:work_attribute_type/name:28 msgctxt "work_attribute_type" msgid "SABAM ID" msgstr "" #: DB:medium_format/name:3 msgctxt "medium_format" msgid "SACD" msgstr "SACD" #: DB:work_attribute_type/name:21 msgctxt "work_attribute_type" msgid "SACEM ID" msgstr "" #: DB:work_attribute_type/name:27 msgctxt "work_attribute_type" msgid "SACM ID" msgstr "" #: DB:work_attribute_type/name:24 msgctxt "work_attribute_type" msgid "SADAIC ID" msgstr "" #: DB:medium_format/name:62 msgctxt "medium_format" msgid "SD Card" msgstr "" #: DB:work_attribute_type/name:8 msgctxt "work_attribute_type" msgid "SESAC ID" msgstr "SESAC-id" #: DB:work_attribute_type/name:20 msgctxt "work_attribute_type" msgid "SGAE ID" msgstr "" #: DB:medium_format/name:36 msgctxt "medium_format" msgid "SHM-CD" msgstr "SHM-CD" #: DB:medium_format/name:57 msgctxt "medium_format" msgid "SHM-SACD" msgstr "" #: DB:work_attribute_type/name:10 msgctxt "work_attribute_type" msgid "SOCAN ID" msgstr "SOCAN-id" #: DB:work_attribute_type/name:18 msgctxt "work_attribute_type" msgid "SUISA ID" msgstr "" #: DB:medium_format/name:23 msgctxt "medium_format" msgid "SVCD" msgstr "SVCD" #: DB:work_attribute_type_allowed_value/value:522 msgctxt "work_attribute_type_allowed_value" msgid "Saba" msgstr "" #: DB:work_attribute_type_allowed_value/value:523 msgctxt "work_attribute_type_allowed_value" msgid "Saba Zemzeme" msgstr "" #: DB:work_attribute_type_allowed_value/value:524 msgctxt "work_attribute_type_allowed_value" msgid "Sabaaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:525 msgctxt "work_attribute_type_allowed_value" msgid "Sababuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:526 msgctxt "work_attribute_type_allowed_value" msgid "Sabakürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:1008 msgctxt "work_attribute_type_allowed_value" msgid "Sahanā" msgstr "" #: DB:work_attribute_type_allowed_value/value:223 msgctxt "work_attribute_type_allowed_value" msgid "Sahānā" msgstr "Sahānā" #: DB:work_attribute_type_allowed_value/value:1009 msgctxt "work_attribute_type_allowed_value" msgid "Sahēlī tōḍī" msgstr "" #: DB:work_attribute_type_allowed_value/value:767 msgctxt "work_attribute_type_allowed_value" msgid "Sakil" msgstr "" #: DB:work_attribute_type_allowed_value/value:658 msgctxt "work_attribute_type_allowed_value" msgid "Salatüselam" msgstr "" #: DB:work_attribute_type_allowed_value/value:657 msgctxt "work_attribute_type_allowed_value" msgid "Salatıümmiye" msgstr "" #: DB:work_attribute_type_allowed_value/value:1010 msgctxt "work_attribute_type_allowed_value" msgid "Sampūrṇa mālkauns" msgstr "" #: DB:work_attribute_type_allowed_value/value:1011 msgctxt "work_attribute_type_allowed_value" msgid "San̄jari" msgstr "" #: DB:work_attribute_type_allowed_value/value:231 #: DB:work_attribute_type_allowed_value/value:1014 msgctxt "work_attribute_type_allowed_value" msgid "Sarasvati" msgstr "Sarasvati" #: DB:work_attribute_type_allowed_value/value:232 msgctxt "work_attribute_type_allowed_value" msgid "Sarasvatī manōhari" msgstr "Sarasvatī manōhari" #: DB:work_attribute_type_allowed_value/value:230 msgctxt "work_attribute_type_allowed_value" msgid "Sarasāngi" msgstr "Sarasāngi" #: DB:work_attribute_type_allowed_value/value:233 msgctxt "work_attribute_type_allowed_value" msgid "Saurāṣtraṁ" msgstr "Saurāṣtraṁ" #: DB:work_attribute_type_allowed_value/value:1017 msgctxt "work_attribute_type_allowed_value" msgid "Saurāṣṭram" msgstr "" #: DB:work_attribute_type_allowed_value/value:659 msgctxt "work_attribute_type_allowed_value" msgid "Savt" msgstr "" #: DB:work_attribute_type_allowed_value/value:660 msgctxt "work_attribute_type_allowed_value" msgid "Sazeseri" msgstr "" #: DB:work_attribute_type_allowed_value/value:527 msgctxt "work_attribute_type_allowed_value" msgid "Sazkar" msgstr "" #: DB:work_attribute_type_allowed_value/value:661 msgctxt "work_attribute_type_allowed_value" msgid "Sazsemaisi" msgstr "" #: DB:artist_alias_type/name:3 DB:label_alias_type/name:2 #: DB:place_alias_type/name:2 DB:recording_alias_type/name:2 #: DB:release_alias_type/name:2 DB:release_group_alias_type/name:2 #: DB:work_alias_type/name:2 DB:area_alias_type/name:3 #: DB:instrument_alias_type/name:2 DB:series_alias_type/name:2 #: DB:event_alias_type/name:2 msgctxt "alias_type" msgid "Search hint" msgstr "søgetip" #: DB:work_attribute_type_allowed_value/value:528 msgctxt "work_attribute_type_allowed_value" msgid "Segah" msgstr "" #: DB:work_attribute_type_allowed_value/value:529 msgctxt "work_attribute_type_allowed_value" msgid "Segah Araban" msgstr "" #: DB:work_attribute_type_allowed_value/value:530 msgctxt "work_attribute_type_allowed_value" msgid "Segah Maye" msgstr "" #: DB:work_attribute_type_allowed_value/value:662 msgctxt "work_attribute_type_allowed_value" msgid "Selam" msgstr "" #: DB:work_attribute_type_allowed_value/value:531 msgctxt "work_attribute_type_allowed_value" msgid "Selmek" msgstr "" #: DB:work_attribute_type_allowed_value/value:768 msgctxt "work_attribute_type_allowed_value" msgid "Semai" msgstr "" #: DB:work_attribute_type_allowed_value/value:235 msgctxt "work_attribute_type_allowed_value" msgid "Sencuruṭṭi" msgstr "Sencuruṭṭi" #: DB:work_attribute_type_allowed_value/value:532 msgctxt "work_attribute_type_allowed_value" msgid "Sengendaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:766 msgctxt "work_attribute_type_allowed_value" msgid "Sengin Türkaksağı" msgstr "" #: DB:work_attribute_type_allowed_value/value:769 msgctxt "work_attribute_type_allowed_value" msgid "Senginsemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:770 msgctxt "work_attribute_type_allowed_value" msgid "Serbest" msgstr "" #: DB:editor_collection_type/name:14 msgctxt "collection_type" msgid "Series" msgstr "" #: DB:series_alias_type/name:1 msgctxt "alias_type" msgid "Series name" msgstr "" #: DB:work_attribute_type_allowed_value/value:663 msgctxt "work_attribute_type_allowed_value" msgid "Seyir" msgstr "" #: DB:medium_format/name:53 msgctxt "medium_format" msgid "Shellac" msgstr "" #: DB:medium_format/description:53 msgctxt "medium_format" msgid "" "Shellac records were the most predominant type of gramophone record during " "the first half of the 20th century." msgstr "" #: DB:work_attribute_type_allowed_value/value:236 msgctxt "work_attribute_type_allowed_value" msgid "Simhavāhini" msgstr "Simhavāhini" #: DB:work_attribute_type_allowed_value/value:237 #: DB:work_attribute_type_allowed_value/value:1018 msgctxt "work_attribute_type_allowed_value" msgid "Simhēndra madhyamaṁ" msgstr "Simhēndra madhyamaṁ" #: DB:work_attribute_type_allowed_value/value:1019 msgctxt "work_attribute_type_allowed_value" msgid "Sindhu bhairavi" msgstr "" #: DB:work_attribute_type_allowed_value/value:238 msgctxt "work_attribute_type_allowed_value" msgid "Sindhubhairavi" msgstr "Sindhubhairavi" #: DB:work_attribute_type_allowed_value/value:239 msgctxt "work_attribute_type_allowed_value" msgid "Sindhumandāri" msgstr "Sindhumandāri" #: DB:work_attribute_type_allowed_value/value:1020 msgctxt "work_attribute_type_allowed_value" msgid "Sindhūra" msgstr "" #: DB:release_group_primary_type/name:2 msgctxt "release_group_primary_type" msgid "Single" msgstr "single" #: DB:work_attribute_type_allowed_value/value:533 msgctxt "work_attribute_type_allowed_value" msgid "Sipihr" msgstr "" #: DB:work_attribute_type_allowed_value/value:664 msgctxt "work_attribute_type_allowed_value" msgid "Sirto" msgstr "" #: DB:work_attribute_type_allowed_value/value:843 msgctxt "work_attribute_type_allowed_value" msgid "Sitārkhānī" msgstr "" #: DB:release_packaging/name:20 msgctxt "release_packaging" msgid "Slidepack" msgstr "" #: DB:release_packaging/name:2 msgctxt "release_packaging" msgid "Slim Jewel Case" msgstr "" #: DB:release_packaging/name:11 msgctxt "release_packaging" msgid "Snap Case" msgstr "" #: DB:work_attribute_type_allowed_value/value:771 msgctxt "work_attribute_type_allowed_value" msgid "Sofyan" msgstr "" #: DB:work_type/name:5 msgctxt "work_type" msgid "Sonata" msgstr "sonate" #: DB:work_type/name:17 msgctxt "work_type" msgid "Song" msgstr "sang" #: DB:work_type/name:15 msgctxt "work_type" msgid "Song-cycle" msgstr "sangcyklus" #: DB:series_ordering_type/description:1 msgctxt "series_ordering_type" msgid "" "Sorts the items in the series automatically by their number attributes, " "using a natural sort order." msgstr "" #: DB:release_group_secondary_type/name:2 msgctxt "release_group_secondary_type" msgid "Soundtrack" msgstr "" #: DB:work_type/name:22 msgctxt "work_type" msgid "Soundtrack" msgstr "" #: DB:cover_art_archive.art_type/name:6 msgctxt "cover_art_type" msgid "Spine" msgstr "ryg" #: DB:release_group_secondary_type/name:3 msgctxt "release_group_secondary_type" msgid "Spokenword" msgstr "spokenword" #: DB:place_type/name:4 msgctxt "place_type" msgid "Stadium" msgstr "stadion" #: DB:cover_art_archive.art_type/name:10 msgctxt "cover_art_type" msgid "Sticker" msgstr "klistermærke" #: DB:instrument_type/name:2 msgctxt "instrument_type" msgid "String instrument" msgstr "" #: DB:place_type/name:1 msgctxt "place_type" msgid "Studio" msgstr "studie" #: DB:area_type/name:2 msgctxt "area_type" msgid "Subdivision" msgstr "underafdeling" #: DB:area_type/description:2 msgctxt "area_type" msgid "" "Subdivision is used for the main administrative divisions of a country, e.g." " California, Ontario, Okinawa. These are considered when displaying the " "parent areas for a given area." msgstr "" #: DB:work_attribute_type_allowed_value/value:244 msgctxt "work_attribute_type_allowed_value" msgid "Sucaritra" msgstr "Sucaritra" #: DB:work_attribute_type_allowed_value/value:1035 msgctxt "work_attribute_type_allowed_value" msgid "Sugharaī" msgstr "" #: DB:work_attribute_type_allowed_value/value:1036 msgctxt "work_attribute_type_allowed_value" msgid "Suhā" msgstr "" #: DB:work_type/name:6 msgctxt "work_type" msgid "Suite" msgstr "suite" #: DB:work_attribute_type_allowed_value/value:534 msgctxt "work_attribute_type_allowed_value" msgid "Sultani" msgstr "" #: DB:work_attribute_type_allowed_value/value:535 msgctxt "work_attribute_type_allowed_value" msgid "Sultani Irak" msgstr "" #: DB:work_attribute_type_allowed_value/value:536 msgctxt "work_attribute_type_allowed_value" msgid "Sultanıbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:537 msgctxt "work_attribute_type_allowed_value" msgid "Sultanıcedid" msgstr "" #: DB:work_attribute_type_allowed_value/value:538 msgctxt "work_attribute_type_allowed_value" msgid "Sultanıeviç" msgstr "" #: DB:work_attribute_type_allowed_value/value:539 msgctxt "work_attribute_type_allowed_value" msgid "Sultanıhüzzam" msgstr "" #: DB:work_attribute_type_allowed_value/value:540 msgctxt "work_attribute_type_allowed_value" msgid "Sultanısegah" msgstr "" #: DB:work_attribute_type_allowed_value/value:541 msgctxt "work_attribute_type_allowed_value" msgid "Sultanıyegah" msgstr "" #: DB:work_attribute_type_allowed_value/value:250 msgctxt "work_attribute_type_allowed_value" msgid "Sumanēśaranjani" msgstr "Sumanēśaranjani" #: DB:work_attribute_type_allowed_value/value:251 msgctxt "work_attribute_type_allowed_value" msgid "Sunādavinōdini" msgstr "Sunādavinōdini" #: DB:release_packaging/name:16 msgctxt "release_packaging" msgid "Super Jewel Box" msgstr "" #: DB:work_attribute_type_allowed_value/value:1037 msgctxt "work_attribute_type_allowed_value" msgid "Sur malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:1038 msgctxt "work_attribute_type_allowed_value" msgid "Sur sugharai" msgstr "" #: DB:work_attribute_type_allowed_value/value:252 msgctxt "work_attribute_type_allowed_value" msgid "Suraṭi" msgstr "Suraṭi" #: DB:work_attribute_type_allowed_value/value:542 msgctxt "work_attribute_type_allowed_value" msgid "Suzidil" msgstr "" #: DB:work_attribute_type_allowed_value/value:543 msgctxt "work_attribute_type_allowed_value" msgid "Suzidilara" msgstr "" #: DB:work_attribute_type_allowed_value/value:544 msgctxt "work_attribute_type_allowed_value" msgid "Suzinak" msgstr "" #: DB:work_attribute_type_allowed_value/value:546 msgctxt "work_attribute_type_allowed_value" msgid "Suzinak Zirgüle" msgstr "" #: DB:work_attribute_type_allowed_value/value:545 msgctxt "work_attribute_type_allowed_value" msgid "Suzinak-ı Nev" msgstr "" #: DB:work_attribute_type_allowed_value/value:253 msgctxt "work_attribute_type_allowed_value" msgid "Svararanjani" msgstr "Svararanjani" #: DB:work_type/name:18 msgctxt "work_type" msgid "Symphonic poem" msgstr "" #: DB:work_type/name:16 msgctxt "work_type" msgid "Symphony" msgstr "symfoni" #: DB:work_attribute_type_allowed_value/value:547 msgctxt "work_attribute_type_allowed_value" msgid "Sünbüle" msgstr "" #: DB:work_attribute_type_allowed_value/value:772 msgctxt "work_attribute_type_allowed_value" msgid "Süreyya" msgstr "" #: DB:work_attribute_type_allowed_value/value:548 msgctxt "work_attribute_type_allowed_value" msgid "Sürurefza" msgstr "" #: DB:work_attribute_type_allowed_value/value:224 msgctxt "work_attribute_type_allowed_value" msgid "Sālaga bhairavi" msgstr "Sālaga bhairavi" #: DB:work_attribute_type_allowed_value/value:225 msgctxt "work_attribute_type_allowed_value" msgid "Sāma" msgstr "Sāma" #: DB:work_attribute_type_allowed_value/value:229 msgctxt "work_attribute_type_allowed_value" msgid "Sāranga" msgstr "Sāranga" #: DB:work_attribute_type_allowed_value/value:1013 msgctxt "work_attribute_type_allowed_value" msgid "Sāraṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:228 msgctxt "work_attribute_type_allowed_value" msgid "Sārāmati" msgstr "Sārāmati" #: DB:work_attribute_type_allowed_value/value:1015 msgctxt "work_attribute_type_allowed_value" msgid "Sāvanī" msgstr "" #: DB:work_attribute_type_allowed_value/value:1016 msgctxt "work_attribute_type_allowed_value" msgid "Sāvanī bihāg" msgstr "" #: DB:work_attribute_type_allowed_value/value:234 msgctxt "work_attribute_type_allowed_value" msgid "Sāvēri" msgstr "Sāvēri" #: DB:work_attribute_type_allowed_value/value:1023 msgctxt "work_attribute_type_allowed_value" msgid "Sōhinī" msgstr "" #: DB:work_attribute_type_allowed_value/value:1024 msgctxt "work_attribute_type_allowed_value" msgid "Sōhinī bahār" msgstr "" #: DB:work_attribute_type_allowed_value/value:1025 msgctxt "work_attribute_type_allowed_value" msgid "Sōhōnī bhaṭiyār" msgstr "" #: DB:work_attribute_type_allowed_value/value:1026 msgctxt "work_attribute_type_allowed_value" msgid "Sōrath" msgstr "" #: DB:work_attribute_type_allowed_value/value:844 msgctxt "work_attribute_type_allowed_value" msgid "Sūltāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:573 msgctxt "work_attribute_type_allowed_value" msgid "Tahir" msgstr "" #: DB:work_attribute_type_allowed_value/value:574 msgctxt "work_attribute_type_allowed_value" msgid "Tahirbuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:667 msgctxt "work_attribute_type_allowed_value" msgid "Taksim" msgstr "" #: DB:work_attribute_type_allowed_value/value:255 msgctxt "work_attribute_type_allowed_value" msgid "Tanarūpi" msgstr "Tanarūpi" #: DB:work_attribute_type_allowed_value/value:668 msgctxt "work_attribute_type_allowed_value" msgid "Tango" msgstr "" #: DB:work_attribute_type_allowed_value/value:1040 msgctxt "work_attribute_type_allowed_value" msgid "Tankēśrī" msgstr "" #: DB:work_attribute_type_allowed_value/value:575 msgctxt "work_attribute_type_allowed_value" msgid "Tarz-ı Cedid" msgstr "" #: DB:work_attribute_type_allowed_value/value:576 msgctxt "work_attribute_type_allowed_value" msgid "Tarz-ı Cihan" msgstr "" #: DB:work_attribute_type_allowed_value/value:577 msgctxt "work_attribute_type_allowed_value" msgid "Tarz-ı Nevin" msgstr "" #: DB:work_attribute_type_allowed_value/value:669 msgctxt "work_attribute_type_allowed_value" msgid "Tavşanca" msgstr "" #: DB:work_attribute_type_allowed_value/value:578 msgctxt "work_attribute_type_allowed_value" msgid "Tebriz" msgstr "" #: DB:work_attribute_type_allowed_value/value:774 msgctxt "work_attribute_type_allowed_value" msgid "Tek Vuruş" msgstr "" #: DB:work_attribute_type_allowed_value/value:670 msgctxt "work_attribute_type_allowed_value" msgid "Tekbir" msgstr "" #: DB:work_attribute_type_allowed_value/value:671 msgctxt "work_attribute_type_allowed_value" msgid "Temcidmünacatı" msgstr "" #: DB:work_attribute_type_allowed_value/value:579 msgctxt "work_attribute_type_allowed_value" msgid "Tereşşüd" msgstr "" #: DB:work_attribute_type_allowed_value/value:672 msgctxt "work_attribute_type_allowed_value" msgid "Tesbih" msgstr "" #: DB:work_attribute_type_allowed_value/value:673 msgctxt "work_attribute_type_allowed_value" msgid "Tesbihilahi" msgstr "" #: DB:work_attribute_type_allowed_value/value:680 msgctxt "work_attribute_type_allowed_value" msgid "Tevhid" msgstr "" #: DB:work_attribute_type_allowed_value/value:674 msgctxt "work_attribute_type_allowed_value" msgid "Tevşihilahi" msgstr "" #: DB:medium_format/description:70 msgctxt "medium_format" msgid "" "The CD layer of a DVDplus. The DVD layer should be added as a separate " "medium." msgstr "" #: DB:medium_format/description:67 msgctxt "medium_format" msgid "" "The CD layer of a DualDisc. The DVD layer should be added as a separate " "medium." msgstr "" #: DB:medium_format/description:63 msgctxt "medium_format" msgid "" "The CD layer of a hybrid SACD. The SACD layer should be added as a separate " "medium." msgstr "" #: DB:medium_format/description:82 msgctxt "medium_format" msgid "" "The CD side of a vinyl + CD VinylDisc. The vinyl side should be added as a " "separate medium." msgstr "" #: DB:medium_format/description:60 msgctxt "medium_format" msgid "" "The Capacitance Electronic Disc (CED) is an analog video disc playback " "system developed by RCA, in which video and audio could be played back on a " "TV set using a special needle and high-density groove system similar to " "phonograph records." msgstr "" #: DB:medium_format/description:68 DB:medium_format/description:69 msgctxt "medium_format" msgid "" "The DVD (audio) layer of a DVDplus. The CD layer should be added as a " "separate medium." msgstr "" #: DB:medium_format/description:65 msgctxt "medium_format" msgid "" "The DVD (audio) layer of a DualDisc. The CD layer should be added as a " "separate medium." msgstr "" #: DB:medium_format/description:66 msgctxt "medium_format" msgid "" "The DVD (video) layer of a DualDisc. The CD layer should be added as a " "separate medium." msgstr "" #: DB:medium_format/description:80 msgctxt "medium_format" msgid "" "The DVD side of a vinyl + DVD VinylDisc. The vinyl side should be added as a" " separate medium." msgstr "" #: DB:medium_format/description:64 msgctxt "medium_format" msgid "" "The SACD layer of a hybrid SACD. The CD layer should be added as a separate " "medium." msgstr "" #: DB:work_type/description:7 msgctxt "work_type" msgid "" "The madrigal is a type of secular vocal music composition. In its original " "form, it had no instrumental accompaniment, although accompaniment is much " "more common in later madrigals." msgstr "" #: DB:work_type/description:24 msgctxt "work_type" msgid "" "The operetta is a genre of light opera, in terms both of music and subject " "matter. Operettas are generally short and include spoken parts." msgstr "" #: DB:release_packaging/description:1 msgctxt "release_packaging" msgid "The traditional CD case, made of hard, brittle plastic." msgstr "" #: DB:medium_format/description:81 msgctxt "medium_format" msgid "" "The vinyl side of a VinylDisc. The CD or DVD side should be added as a " "separate medium." msgstr "" #: DB:work_type/description:23 msgctxt "work_type" msgid "" "This represents literary works written in prose, that is, written in " "relatively ordinary language without metrical structure (e.g. novels, short " "stories, essays...)." msgstr "" #: DB:work_attribute_type_allowed_value/value:1041 msgctxt "work_attribute_type_allowed_value" msgid "Tilak bihārī" msgstr "" #: DB:work_attribute_type_allowed_value/value:1042 msgctxt "work_attribute_type_allowed_value" msgid "Tilak kāmōd" msgstr "" #: DB:work_attribute_type_allowed_value/value:1043 msgctxt "work_attribute_type_allowed_value" msgid "Tilak naṭ" msgstr "" #: DB:work_attribute_type_allowed_value/value:845 msgctxt "work_attribute_type_allowed_value" msgid "Tilavāḍā" msgstr "" #: DB:work_attribute_type_allowed_value/value:256 msgctxt "work_attribute_type_allowed_value" msgid "Tillāng" msgstr "Tillāng" #: DB:work_attribute_type_allowed_value/value:1044 msgctxt "work_attribute_type_allowed_value" msgid "Tilāṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:288 msgctxt "work_attribute_type_allowed_value" msgid "Tiśra-jāti tripuṭa" msgstr "Tiśra-jāti tripuṭa" #: DB:work_attribute_type_allowed_value/value:284 msgctxt "work_attribute_type_allowed_value" msgid "Tiśra-jāti ēka" msgstr "Tiśra-jāti ēka" #: DB:series_type/name:7 msgctxt "series_type" msgid "Tour" msgstr "" #: DB:cover_art_archive.art_type/name:7 msgctxt "cover_art_type" msgid "Track" msgstr "Skæring" #: DB:cover_art_archive.art_type/name:9 msgctxt "cover_art_type" msgid "Tray" msgstr "" #: DB:work_attribute_type_allowed_value/value:1046 msgctxt "work_attribute_type_allowed_value" msgid "Trivēṇī gauri" msgstr "" #: DB:work_attribute_type_allowed_value/value:775 msgctxt "work_attribute_type_allowed_value" msgid "Türk Darbı" msgstr "" #: DB:work_attribute_type_allowed_value/value:776 msgctxt "work_attribute_type_allowed_value" msgid "Türkaksağı" msgstr "" #: DB:work_attribute_type_allowed_value/value:580 msgctxt "work_attribute_type_allowed_value" msgid "Türki Hicaz" msgstr "" #: DB:work_attribute_type_allowed_value/value:799 msgctxt "work_attribute_type_allowed_value" msgid "Türkmen" msgstr "" #: DB:work_attribute_type_allowed_value/value:675 msgctxt "work_attribute_type_allowed_value" msgid "Türkü" msgstr "" #: DB:work_attribute_type_allowed_value/value:581 msgctxt "work_attribute_type_allowed_value" msgid "Tüvanger" msgstr "" #: DB:work_attribute_type/name:5 msgctxt "work_attribute_type" msgid "Tāla (Carnatic)" msgstr "" #: DB:work_attribute_type/name:31 msgctxt "work_attribute_type" msgid "Tāla (Hindustani)" msgstr "" #: DB:work_attribute_type_allowed_value/value:846 msgctxt "work_attribute_type_allowed_value" msgid "Tīntāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:847 msgctxt "work_attribute_type_allowed_value" msgid "Tīntāl-sitārkhānī" msgstr "" #: DB:work_attribute_type_allowed_value/value:257 msgctxt "work_attribute_type_allowed_value" msgid "Tōḍi" msgstr "Tōḍi" #: DB:work_attribute_type_allowed_value/value:1045 msgctxt "work_attribute_type_allowed_value" msgid "Tōḍī" msgstr "" #: DB:medium_format/name:28 msgctxt "medium_format" msgid "UMD" msgstr "UMD" #: DB:medium_format/name:26 msgctxt "medium_format" msgid "USB Flash Drive" msgstr "" #: DB:work_attribute_type_allowed_value/value:258 msgctxt "work_attribute_type_allowed_value" msgid "Udaya ravicandrika" msgstr "Udaya ravicandrika" #: DB:cover_art_archive.art_type/description:14 msgctxt "cover_art_type" msgid "" "Use for images that need work to be used for tagging (but can possibly " "already be used for reference)" msgstr "" #: DB:work_attribute_type/name:17 msgctxt "work_attribute_type" msgid "Usul (Ottoman, Turkish)" msgstr "" #: DB:work_attribute_type_allowed_value/value:676 msgctxt "work_attribute_type_allowed_value" msgid "Uzunhava" msgstr "" #: DB:work_attribute_type_allowed_value/value:601 msgctxt "work_attribute_type_allowed_value" msgid "Uzzal" msgstr "" #: DB:work_attribute_type_allowed_value/value:582 msgctxt "work_attribute_type_allowed_value" msgid "Uşşak" msgstr "" #: DB:work_attribute_type_allowed_value/value:583 msgctxt "work_attribute_type_allowed_value" msgid "Uşşak Ruy-i Nikriz" msgstr "" #: DB:work_attribute_type_allowed_value/value:584 msgctxt "work_attribute_type_allowed_value" msgid "Uşşakaşiran" msgstr "" #: DB:medium_format/name:22 msgctxt "medium_format" msgid "VCD" msgstr "VCD" #: DB:medium_format/name:59 msgctxt "medium_format" msgid "VHD" msgstr "" #: DB:medium_format/name:21 msgctxt "medium_format" msgid "VHS" msgstr "VHS" #: DB:work_attribute_type_allowed_value/value:261 msgctxt "work_attribute_type_allowed_value" msgid "Vakuḷābharaṇaṁ" msgstr "Vakuḷābharaṇaṁ" #: DB:work_attribute_type_allowed_value/value:262 msgctxt "work_attribute_type_allowed_value" msgid "Valaji" msgstr "Valaji" #: DB:work_attribute_type_allowed_value/value:263 msgctxt "work_attribute_type_allowed_value" msgid "Vandanadhāriṇi" msgstr "Vandanadhāriṇi" #: DB:work_attribute_type_allowed_value/value:265 msgctxt "work_attribute_type_allowed_value" msgid "Varamu" msgstr "Varamu" #: DB:work_attribute_type_allowed_value/value:264 msgctxt "work_attribute_type_allowed_value" msgid "Varāḷi" msgstr "Varāḷi" #: DB:work_attribute_type_allowed_value/value:266 msgctxt "work_attribute_type_allowed_value" msgid "Varṇarūpini" msgstr "Varṇarūpini" #: DB:work_attribute_type_allowed_value/value:267 msgctxt "work_attribute_type_allowed_value" msgid "Vasanta" msgstr "Vasanta" #: DB:work_attribute_type_allowed_value/value:268 msgctxt "work_attribute_type_allowed_value" msgid "Vasanta varāḷi" msgstr "Vasanta varāḷi" #: DB:work_attribute_type_allowed_value/value:269 msgctxt "work_attribute_type_allowed_value" msgid "Vasantabhairavi" msgstr "Vasantabhairavi" #: DB:work_attribute_type_allowed_value/value:585 msgctxt "work_attribute_type_allowed_value" msgid "Vecd-i Dil" msgstr "" #: DB:work_attribute_type_allowed_value/value:586 msgctxt "work_attribute_type_allowed_value" msgid "Vech-i Arazbar" msgstr "" #: DB:work_attribute_type_allowed_value/value:587 msgctxt "work_attribute_type_allowed_value" msgid "Vech-i Dil" msgstr "" #: DB:work_attribute_type_allowed_value/value:588 msgctxt "work_attribute_type_allowed_value" msgid "Vech-i Şehnaz" msgstr "" #: DB:place_type/name:2 msgctxt "place_type" msgid "Venue" msgstr "spillested" #: DB:medium_format/description:59 msgctxt "medium_format" msgid "" "Video High Density (VHD) was a videodisc format which was marketed " "predominantly in Japan by JVC." msgstr "" #: DB:work_attribute_type_allowed_value/value:273 msgctxt "work_attribute_type_allowed_value" msgid "Vijayanagari" msgstr "Vijayanagari" #: DB:work_attribute_type_allowed_value/value:274 msgctxt "work_attribute_type_allowed_value" msgid "Vijayasarasvati" msgstr "Vijayasarasvati" #: DB:work_attribute_type_allowed_value/value:275 msgctxt "work_attribute_type_allowed_value" msgid "Vijayaśrī" msgstr "Vijayaśrī" #: DB:medium_format/name:7 msgctxt "medium_format" msgid "Vinyl" msgstr "vinyl" #: DB:medium_format/name:48 msgctxt "medium_format" msgid "VinylDisc" msgstr "" #: DB:medium_format/name:82 msgctxt "medium_format" msgid "VinylDisc (CD side)" msgstr "" #: DB:medium_format/name:80 msgctxt "medium_format" msgid "VinylDisc (DVD side)" msgstr "" #: DB:medium_format/name:81 msgctxt "medium_format" msgid "VinylDisc (Vinyl side)" msgstr "" #: DB:work_attribute_type_allowed_value/value:259 #: DB:work_attribute_type_allowed_value/value:1047 msgctxt "work_attribute_type_allowed_value" msgid "Vācaspati" msgstr "Vācaspati" #: DB:work_attribute_type_allowed_value/value:260 msgctxt "work_attribute_type_allowed_value" msgid "Vāgadīśvari" msgstr "Vāgadīśvari" #: DB:work_attribute_type_allowed_value/value:270 msgctxt "work_attribute_type_allowed_value" msgid "Vāsanti" msgstr "Vāsanti" #: DB:work_attribute_type_allowed_value/value:271 msgctxt "work_attribute_type_allowed_value" msgid "Vēgavāhiṇi" msgstr "Vēgavāhiṇi" #: DB:work_attribute_type_allowed_value/value:272 msgctxt "work_attribute_type_allowed_value" msgid "Vēlāvali" msgstr "Vēlāvali" #: DB:work_attribute_type_allowed_value/value:276 msgctxt "work_attribute_type_allowed_value" msgid "Vīra vasantaṁ" msgstr "Vīra vasantaṁ" #: DB:cover_art_archive.art_type/name:13 msgctxt "cover_art_type" msgid "Watermark" msgstr "" #: DB:medium_format/name:14 msgctxt "medium_format" msgid "Wax Cylinder" msgstr "voksrulle" #: DB:instrument_type/name:1 msgctxt "instrument_type" msgid "Wind instrument" msgstr "" #: DB:editor_collection_type/name:3 msgctxt "collection_type" msgid "Wishlist" msgstr "" #: DB:editor_collection_type/name:15 msgctxt "collection_type" msgid "Work" msgstr "Værk" #: DB:work_alias_type/name:1 msgctxt "alias_type" msgid "Work name" msgstr "værknavn" #: DB:series_type/name:4 msgctxt "series_type" msgid "Work series" msgstr "" #: DB:work_attribute_type_allowed_value/value:277 msgctxt "work_attribute_type_allowed_value" msgid "Yadukula kāṁbōji" msgstr "Yadukula kāṁbōji" #: DB:work_attribute_type_allowed_value/value:1048 msgctxt "work_attribute_type_allowed_value" msgid "Yaman kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:1049 msgctxt "work_attribute_type_allowed_value" msgid "Yamanī bilāval" msgstr "" #: DB:work_attribute_type_allowed_value/value:278 msgctxt "work_attribute_type_allowed_value" msgid "Yamuna kalyāṇi" msgstr "Yamuna kalyāṇi" #: DB:work_attribute_type_allowed_value/value:589 msgctxt "work_attribute_type_allowed_value" msgid "Yegah" msgstr "" #: DB:work_attribute_type_allowed_value/value:590 msgctxt "work_attribute_type_allowed_value" msgid "Yegah-ı Acemi" msgstr "" #: DB:work_attribute_type_allowed_value/value:677 #: DB:work_attribute_type_allowed_value/value:777 msgctxt "work_attribute_type_allowed_value" msgid "Yürüksemai" msgstr "" #: DB:work_attribute_type_allowed_value/value:778 msgctxt "work_attribute_type_allowed_value" msgid "Yürüksemai II" msgstr "" #: DB:work_attribute_type_allowed_value/value:779 msgctxt "work_attribute_type_allowed_value" msgid "Yürüksofyan" msgstr "" #: DB:work_attribute_type/name:30 msgctxt "work_attribute_type" msgid "ZAiKS ID" msgstr "" #: DB:work_attribute_type_allowed_value/value:780 msgctxt "work_attribute_type_allowed_value" msgid "Zafer" msgstr "" #: DB:work_type/name:19 msgctxt "work_type" msgid "Zarzuela" msgstr "zarzuela" #: DB:work_attribute_type_allowed_value/value:591 msgctxt "work_attribute_type_allowed_value" msgid "Zavil" msgstr "" #: DB:work_attribute_type_allowed_value/value:592 msgctxt "work_attribute_type_allowed_value" msgid "Zavilaşiran" msgstr "" #: DB:work_attribute_type_allowed_value/value:781 msgctxt "work_attribute_type_allowed_value" msgid "Zencir" msgstr "" #: DB:work_attribute_type_allowed_value/value:593 msgctxt "work_attribute_type_allowed_value" msgid "Zengule" msgstr "" #: DB:work_attribute_type_allowed_value/value:594 msgctxt "work_attribute_type_allowed_value" msgid "Zengulebuselik" msgstr "" #: DB:work_attribute_type_allowed_value/value:595 msgctxt "work_attribute_type_allowed_value" msgid "Zenguleli Kürdi" msgstr "" #: DB:work_attribute_type_allowed_value/value:597 msgctxt "work_attribute_type_allowed_value" msgid "Zevk-ü Tarab" msgstr "" #: DB:work_attribute_type_allowed_value/value:596 msgctxt "work_attribute_type_allowed_value" msgid "Zevk-ı Dil" msgstr "" #: DB:work_attribute_type_allowed_value/value:678 msgctxt "work_attribute_type_allowed_value" msgid "Zeybek" msgstr "" #: DB:work_attribute_type_allowed_value/value:598 msgctxt "work_attribute_type_allowed_value" msgid "Zilkeş" msgstr "" #: DB:work_attribute_type_allowed_value/value:1050 msgctxt "work_attribute_type_allowed_value" msgid "Zilāph" msgstr "" #: DB:medium_format/name:77 msgctxt "medium_format" msgid "Zip Disk" msgstr "" #: DB:work_attribute_type_allowed_value/value:599 msgctxt "work_attribute_type_allowed_value" msgid "Zirefkend" msgstr "" #: DB:work_attribute_type_allowed_value/value:298 #: DB:work_attribute_type_allowed_value/value:602 #: DB:work_attribute_type_allowed_value/value:681 msgctxt "work_attribute_type_allowed_value" msgid "ambiguous" msgstr "" #: DB:medium_format/name:27 msgctxt "medium_format" msgid "slotMusic" msgstr "slotMusic" #: DB:work_attribute_type_allowed_value/value:340 msgctxt "work_attribute_type_allowed_value" msgid "Çargah" msgstr "" #: DB:work_attribute_type_allowed_value/value:341 msgctxt "work_attribute_type_allowed_value" msgid "Çargah (Yeni)" msgstr "" #: DB:work_attribute_type_allowed_value/value:342 msgctxt "work_attribute_type_allowed_value" msgid "Çehar Agazin" msgstr "" #: DB:work_attribute_type_allowed_value/value:706 msgctxt "work_attribute_type_allowed_value" msgid "Çenber" msgstr "" #: DB:work_attribute_type_allowed_value/value:707 msgctxt "work_attribute_type_allowed_value" msgid "Çeng-i Harbi" msgstr "" #: DB:work_attribute_type_allowed_value/value:708 msgctxt "work_attribute_type_allowed_value" msgid "Çifteaksak" msgstr "" #: DB:work_attribute_type_allowed_value/value:709 msgctxt "work_attribute_type_allowed_value" msgid "Çiftedüyek" msgstr "" #: DB:work_attribute_type_allowed_value/value:710 msgctxt "work_attribute_type_allowed_value" msgid "Çiftesofyan" msgstr "" #: DB:work_attribute_type_allowed_value/value:679 msgctxt "work_attribute_type_allowed_value" msgid "Çiftetelli" msgstr "" #: DB:work_attribute_type_allowed_value/value:609 msgctxt "work_attribute_type_allowed_value" msgid "Çocuk şarkısı" msgstr "" #: DB:work_type/name:20 msgctxt "work_type" msgid "Étude" msgstr "etude" #: DB:work_attribute_type_allowed_value/value:653 msgctxt "work_attribute_type_allowed_value" msgid "Örnek Öz" msgstr "" #: DB:work_attribute_type_allowed_value/value:35 msgctxt "work_attribute_type_allowed_value" msgid "Ābhēri" msgstr "Ābhēri" #: DB:work_attribute_type_allowed_value/value:36 msgctxt "work_attribute_type_allowed_value" msgid "Ābhōgi" msgstr "Ābhōgi" #: DB:work_attribute_type_allowed_value/value:858 msgctxt "work_attribute_type_allowed_value" msgid "Ābhōgī" msgstr "" #: DB:work_attribute_type_allowed_value/value:821 msgctxt "work_attribute_type_allowed_value" msgid "Ādhā" msgstr "" #: DB:work_attribute_type_allowed_value/value:822 msgctxt "work_attribute_type_allowed_value" msgid "Ādhā cautāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:823 msgctxt "work_attribute_type_allowed_value" msgid "Ādhā/jaṭ" msgstr "" #: DB:work_attribute_type_allowed_value/value:279 #: DB:work_attribute_type_allowed_value/value:824 msgctxt "work_attribute_type_allowed_value" msgid "Ādi" msgstr "Ādi" #: DB:work_attribute_type_allowed_value/value:290 msgctxt "work_attribute_type_allowed_value" msgid "Ādi (Tiśra naḍe)" msgstr "Ādi (Tiśra naḍe)" #: DB:work_attribute_type_allowed_value/value:37 msgctxt "work_attribute_type_allowed_value" msgid "Āhir bhairav" msgstr "Āhir bhairav" #: DB:work_attribute_type_allowed_value/value:38 msgctxt "work_attribute_type_allowed_value" msgid "Āhiri" msgstr "Āhiri" #: DB:work_attribute_type_allowed_value/value:859 msgctxt "work_attribute_type_allowed_value" msgid "Ānand malhār" msgstr "" #: DB:work_attribute_type_allowed_value/value:41 msgctxt "work_attribute_type_allowed_value" msgid "Ānandabhairavi" msgstr "Ānandabhairavi" #: DB:work_attribute_type_allowed_value/value:42 msgctxt "work_attribute_type_allowed_value" msgid "Āndōḷika" msgstr "Āndōḷika" #: DB:work_attribute_type_allowed_value/value:43 #: DB:work_attribute_type_allowed_value/value:860 msgctxt "work_attribute_type_allowed_value" msgid "Ārabhi" msgstr "Ārabhi" #: DB:work_attribute_type_allowed_value/value:907 msgctxt "work_attribute_type_allowed_value" msgid "Ēk niṣād bihāgḍā" msgstr "" #: DB:work_attribute_type_allowed_value/value:283 msgctxt "work_attribute_type_allowed_value" msgid "Ēka" msgstr "Ēka" #: DB:work_attribute_type_allowed_value/value:831 msgctxt "work_attribute_type_allowed_value" msgid "Ēktāl" msgstr "" #: DB:work_attribute_type_allowed_value/value:436 msgctxt "work_attribute_type_allowed_value" msgid "İbrahimi" msgstr "" #: DB:work_attribute_type_allowed_value/value:740 msgctxt "work_attribute_type_allowed_value" msgid "İki Bir" msgstr "" #: DB:work_attribute_type_allowed_value/value:741 msgctxt "work_attribute_type_allowed_value" msgid "İkiz Aksak" msgstr "" #: DB:work_attribute_type_allowed_value/value:620 msgctxt "work_attribute_type_allowed_value" msgid "İlahi" msgstr "" #: DB:work_attribute_type_allowed_value/value:226 msgctxt "work_attribute_type_allowed_value" msgid "Śankarābharaṇaṁ" msgstr "Śankarābharaṇaṁ" #: DB:work_attribute_type_allowed_value/value:1012 msgctxt "work_attribute_type_allowed_value" msgid "Śaṅkara" msgstr "" #: DB:work_attribute_type_allowed_value/value:842 msgctxt "work_attribute_type_allowed_value" msgid "Śikhar" msgstr "" #: DB:work_attribute_type_allowed_value/value:1021 msgctxt "work_attribute_type_allowed_value" msgid "Śivamat bhairav" msgstr "" #: DB:work_attribute_type_allowed_value/value:240 msgctxt "work_attribute_type_allowed_value" msgid "Śivaranjani" msgstr "Śivaranjani" #: DB:work_attribute_type_allowed_value/value:1022 msgctxt "work_attribute_type_allowed_value" msgid "Śivaran̄jani" msgstr "" #: DB:work_attribute_type_allowed_value/value:241 #: DB:work_attribute_type_allowed_value/value:1027 msgctxt "work_attribute_type_allowed_value" msgid "Śrī" msgstr "Śrī" #: DB:work_attribute_type_allowed_value/value:242 msgctxt "work_attribute_type_allowed_value" msgid "Śrīranjani" msgstr "Śrīranjani" #: DB:work_attribute_type_allowed_value/value:1028 msgctxt "work_attribute_type_allowed_value" msgid "Śubhalakṣmi" msgstr "" #: DB:work_attribute_type_allowed_value/value:243 msgctxt "work_attribute_type_allowed_value" msgid "Śubhapantuvarāḷi" msgstr "Śubhapantuvarāḷi" #: DB:work_attribute_type_allowed_value/value:245 msgctxt "work_attribute_type_allowed_value" msgid "Śudda sārang" msgstr "Śudda sārang" #: DB:work_attribute_type_allowed_value/value:246 msgctxt "work_attribute_type_allowed_value" msgid "Śudda sāvēri" msgstr "Śudda sāvēri" #: DB:work_attribute_type_allowed_value/value:247 msgctxt "work_attribute_type_allowed_value" msgid "Śuddadhanyāsi" msgstr "Śuddadhanyāsi" #: DB:work_attribute_type_allowed_value/value:248 msgctxt "work_attribute_type_allowed_value" msgid "Śuddasīmantini" msgstr "Śuddasīmantini" #: DB:work_attribute_type_allowed_value/value:1029 msgctxt "work_attribute_type_allowed_value" msgid "Śuddh baradi" msgstr "" #: DB:work_attribute_type_allowed_value/value:1030 msgctxt "work_attribute_type_allowed_value" msgid "Śuddh basant" msgstr "" #: DB:work_attribute_type_allowed_value/value:1031 msgctxt "work_attribute_type_allowed_value" msgid "Śuddh kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:1032 msgctxt "work_attribute_type_allowed_value" msgid "Śuddh mārū" msgstr "" #: DB:work_attribute_type_allowed_value/value:1033 msgctxt "work_attribute_type_allowed_value" msgid "Śuddh naṭa" msgstr "" #: DB:work_attribute_type_allowed_value/value:1034 msgctxt "work_attribute_type_allowed_value" msgid "Śuddh sāraṅg" msgstr "" #: DB:work_attribute_type_allowed_value/value:1039 msgctxt "work_attribute_type_allowed_value" msgid "Śyām kalyāṇ" msgstr "" #: DB:work_attribute_type_allowed_value/value:254 msgctxt "work_attribute_type_allowed_value" msgid "Śyāṁ kaḷyāṇ" msgstr "Śyāṁ kaḷyāṇ" #: DB:work_attribute_type_allowed_value/value:249 msgctxt "work_attribute_type_allowed_value" msgid "Śūḷiṇi" msgstr "Śūḷiṇi" #: DB:work_attribute_type_allowed_value/value:773 msgctxt "work_attribute_type_allowed_value" msgid "Şark Devr-i Revanı" msgstr "Şark Devr-i Revanı" #: DB:work_attribute_type_allowed_value/value:665 msgctxt "work_attribute_type_allowed_value" msgid "Şarkı" msgstr "Şarkı" #: DB:work_attribute_type_allowed_value/value:549 msgctxt "work_attribute_type_allowed_value" msgid "Şedaraban" msgstr "Şedaraban" #: DB:work_attribute_type_allowed_value/value:550 msgctxt "work_attribute_type_allowed_value" msgid "Şedd-i Saba" msgstr "Şedd-i Saba" #: DB:work_attribute_type_allowed_value/value:551 msgctxt "work_attribute_type_allowed_value" msgid "Şehnaz" msgstr "Şehnaz" #: DB:work_attribute_type_allowed_value/value:554 msgctxt "work_attribute_type_allowed_value" msgid "Şehnaz Nişaburek" msgstr "Şehnaz Nişaburek" #: DB:work_attribute_type_allowed_value/value:552 msgctxt "work_attribute_type_allowed_value" msgid "Şehnazbuselik" msgstr "Şehnazbuselik" #: DB:work_attribute_type_allowed_value/value:553 msgctxt "work_attribute_type_allowed_value" msgid "Şehnazhaveran" msgstr "Şehnazhaveran" #: DB:work_attribute_type_allowed_value/value:555 msgctxt "work_attribute_type_allowed_value" msgid "Şemsefruz" msgstr "Şemsefruz" #: DB:work_attribute_type_allowed_value/value:556 msgctxt "work_attribute_type_allowed_value" msgid "Şeref-i Hamidi" msgstr "Şeref-i Hamidi" #: DB:work_attribute_type_allowed_value/value:557 msgctxt "work_attribute_type_allowed_value" msgid "Şerefnuma" msgstr "Şerefnuma" #: DB:work_attribute_type_allowed_value/value:558 msgctxt "work_attribute_type_allowed_value" msgid "Şevk" msgstr "Şevk" #: DB:work_attribute_type_allowed_value/value:561 msgctxt "work_attribute_type_allowed_value" msgid "Şevk-i Cedid" msgstr "Şevk-i Cedid" #: DB:work_attribute_type_allowed_value/value:563 msgctxt "work_attribute_type_allowed_value" msgid "Şevk-i Cihan" msgstr "Şevk-i Cihan" #: DB:work_attribute_type_allowed_value/value:562 msgctxt "work_attribute_type_allowed_value" msgid "Şevk-i Dil" msgstr "Şevk-i Dil" #: DB:work_attribute_type_allowed_value/value:564 msgctxt "work_attribute_type_allowed_value" msgid "Şevk-i Serab" msgstr "Şevk-i Serab" #: DB:work_attribute_type_allowed_value/value:559 msgctxt "work_attribute_type_allowed_value" msgid "Şevkaver" msgstr "Şevkaver" #: DB:work_attribute_type_allowed_value/value:560 msgctxt "work_attribute_type_allowed_value" msgid "Şevkefza" msgstr "Şevkefza" #: DB:work_attribute_type_allowed_value/value:565 msgctxt "work_attribute_type_allowed_value" msgid "Şevknüma" msgstr "Şevknüma" #: DB:work_attribute_type_allowed_value/value:566 msgctxt "work_attribute_type_allowed_value" msgid "Şevkutarab" msgstr "Şevkutarab" #: DB:work_attribute_type_allowed_value/value:567 msgctxt "work_attribute_type_allowed_value" msgid "Şinaver" msgstr "Şinaver" #: DB:work_attribute_type_allowed_value/value:568 msgctxt "work_attribute_type_allowed_value" msgid "Şiraz" msgstr "Şiraz" #: DB:work_attribute_type_allowed_value/value:569 msgctxt "work_attribute_type_allowed_value" msgid "Şivekar" msgstr "Şivekar" #: DB:work_attribute_type_allowed_value/value:570 msgctxt "work_attribute_type_allowed_value" msgid "Şivekeş" msgstr "Şivekeş" #: DB:work_attribute_type_allowed_value/value:571 msgctxt "work_attribute_type_allowed_value" msgid "Şivenüma" msgstr "Şivenüma" #: DB:work_attribute_type_allowed_value/value:572 msgctxt "work_attribute_type_allowed_value" msgid "Şuri" msgstr "Şuri" #: DB:work_attribute_type_allowed_value/value:666 msgctxt "work_attribute_type_allowed_value" msgid "Şuğul" msgstr "Şuğul" #: DB:work_attribute_type_allowed_value/value:894 msgctxt "work_attribute_type_allowed_value" msgid "Ḍāgori" msgstr "" #: DB:work_attribute_type_allowed_value/value:227 msgctxt "work_attribute_type_allowed_value" msgid "Ṣanmukhapriya" msgstr "Ṣanmukhapriya" picard-release-2.3.1/po/attributes/de.po000066400000000000000000006041221362601763300201450ustar00rootroot00000000000000# # Translators: # nikki, 2014 # nikki2 , 2012 # Daniel Schury , 2011 # Daniel Schury